Private Docs

Dependency-Track Local — สรุปความเสี่ยงและแผนแก้ไข

ฉบับอ่านง่ายสำหรับเริ่มวางแผนแก้ dependency vulnerabilities จากการสแกน SuperApp 26 repositories

อัปเดต: 2026-09-10

Dependency-Track Local — สรุปความเสี่ยงและแผนแก้ไข

เอกสารนี้เขียนสำหรับผู้ที่ยังไม่คุ้นกับ security

เป้าหมายคืออธิบายว่า พบอะไร ต้องกังวลแค่ไหน และควรเริ่มแก้ตรงไหน

ถ้าอ่านเพียงส่วนเดียว ให้อ่านตรงนี้

เราเอา source code ของ SuperApp 26 repositories มาสร้างรายการ dependency แล้วตรวจด้วย Dependency-Track โดยใช้ policy ชุดเดียวกับ UAT

ผลที่ควรรู้มี 4 ข้อ:

  1. พบ Critical 16 รายการ ทั้งหมดอยู่ใน dependency ฝั่ง frontend
  2. Critical 16 รายการไม่ได้แปลว่าต้องเปิด 16 tickets เพราะเกิดจาก package หลักเพียง 7 ตัวที่ถูกใช้ซ้ำหลาย project
  3. Backend ไม่มี Critical แต่มี High ที่ควรแก้เป็น package กลาง 2 กลุ่ม ซึ่งกระทบหลาย services
  4. ตัวเลข Policy violations 4,740 ดูสูง แต่ 3,855 รายการเป็นเพียงคำเตือนว่า component มีอายุมากกว่า 3 ปี ไม่ใช่ Critical vulnerability

สิ่งที่ควรทำก่อนคือ:

  • ให้ทีม Frontend Platform อัปเกรด build toolchain ที่ทำให้เกิด Critical ใน 4 frontend repositories
  • ให้ทีม UI Library แก้ Critical เพิ่มอีก 4 packages และ lodash ที่มีโอกาสถูก exploit สูง
  • ให้ทีม Backend Package แก้ shared dependency 2 กลุ่ม แล้วให้ service ต่าง ๆ bump package ตาม
  • ยังไม่ต้องเปิด ticket แยกจากทุก finding หรือทุก Stale violation เพราะจะได้งานซ้ำจำนวนมาก

คำศัพท์ที่ต้องรู้

คำศัพท์ความหมายแบบง่าย
Dependencypackage หรือ library ที่ระบบนำมาใช้ เช่น NuGet และ npm
SBOMรายการว่า application ใช้ dependency อะไรและ version ไหนบ้าง
FindingDependency-Track พบว่า dependency หนึ่งตัวตรงกับ vulnerability advisory
Policy violationdependency ผิดกฎที่เราตั้งไว้ เช่นเป็น Critical หรือเก่ากว่า 3 ปี
Critical / Highระดับความรุนแรงของ vulnerability; Critical ต้องตรวจและแก้ก่อน
Transitive dependencypackage ที่เราไม่ได้ติดตั้งตรง ๆ แต่ถูกดึงมาจาก package ตัวอื่น
EPSSคะแนนคาดการณ์โอกาสที่ vulnerability จะถูกนำไป exploit จริง
Stale componentcomponent เก่าตามเงื่อนไขเวลา ไม่ได้แปลว่ามีช่องโหว่เสมอไป

ตัวอย่าง: ถ้า shell-quote@1.8.3 ถูกดึงผ่าน build tool และอยู่ใน 4 projects ระบบจะรายงานอย่างน้อย 4 findings แม้แนวทางแก้อาจเป็นการอัปเกรด parent package เพียงชุดเดียว

ผลสแกนโดยรวม

สิ่งที่วัดผลควรอ่านอย่างไร
Repositories ใน inventory27มี application 26 และ IaC 1
สแกน application สำเร็จ26ไม่มี scan failure
Skipped1Backend_Iac ต้องใช้ IaC scanner แทน
Dependency ที่พบ13,458 occurrencespackage เดิมอาจซ้ำข้ามหลาย projects
Dependency ที่ไม่ซ้ำ4,427 PURLsใกล้เคียงจำนวน package/version จริงที่ต้องพิจารณา
Vulnerability findings1,109ไม่ควรแปลงเป็น 1,109 tickets
Critical16ต้องเริ่มตรวจและแก้ก่อน
High517จัดกลุ่มตาม shared dependency แล้วแก้เป็น wave
Medium517ทำหลัง Critical/High ที่สำคัญ
Low59เก็บใน backlog และติดตาม
Policy violations4,740รวมทั้ง security และคำเตือนด้านอายุ component

Frontend 5 repositories มี findings รวม 1,028 รายการ หรือ 92.7% ของทั้งหมด และถือ Critical ทั้ง 16 รายการ แต่ไม่ได้แปลว่ามีเพียง HostApp ที่มีปัญหา:

  • Frontend_SuperAppLibraryUi: 268 findings
  • Frontend_HostAppSuperApp: 248 findings
  • Frontend_AdminSuperApp: 212 findings
  • Frontend_RemoteAppFX: 197 findings
  • Frontend_LINE_Connectivity: 103 findings
  • Backend, QA และ console รวมกันยังมีอีก 81 findings

ต้องแก้อะไรก่อน

P0 — Critical frontend

Critical ทั้ง 16 มาจาก 7 dependency clusters ต่อไปนี้:

Package ที่พบVersion ปัจจุบันVersion เป้าหมายขั้นต่ำจำนวน findingsพบที่ไหน
shell-quote1.8.31.8.44HostApp, Admin, UI Library, Remote FX
websocket-driver0.7.40.7.54HostApp, Admin, UI Library, Remote FX
tar7.5.9–7.5.157.5.194HostApp, Admin, UI Library, Remote FX
handlebars4.7.84.7.91UI Library
vitest4.0.184.1.01UI Library
rollup4.57.14.59.01UI Library
flatted3.3.33.4.21UI Library

Packages เหล่านี้เป็น transitive dependency ใน build/test/dev-server toolchain ตัวอย่างเส้นทางที่พบ:

  • Nx → rspack/webpack-dev-server → launch-editor → shell-quote
  • Nx → dev-server → sockjs → faye-websocket → websocket-driver
  • Angular CLI → pacote → node-gyp → tar
  • Angular build → vitest/vite → rollup

จึงควรอัปเกรด Angular/Nx/dev-server หรือ parent package ก่อน ถ้า parent package ยังไม่มี version ที่แก้แล้วจึงใช้ pnpm.overrides เป็นมาตรการชั่วคราวพร้อมสร้าง ticket เพื่อนำ override ออกภายหลัง

แม้ package กลุ่มนี้ส่วนใหญ่ไม่ถูก bundle ไป production แต่ยังทำงานในเครื่อง developer หรือ CI จึงยังเป็น supply-chain risk และไม่ควรปิด finding โดยอ้างว่าเป็น dev dependency อย่างเดียว

P0 — High ที่มีโอกาสถูก exploit สูง

Frontend_SuperAppLibraryUi มี lodash@4.17.21 และ lodash@4.17.23 ที่ชน policy High Exploit Probability:

  • Advisory: GHSA-r5fr-rjxr-66jc
  • EPSS: 0.21333 หรือประมาณโอกาส 21.3% ตามโมเดล EPSS
  • Percentile: 97.45 หมายถึงสูงกว่า vulnerability ส่วนใหญ่ในชุดข้อมูล
  • เป้าหมาย: lodash >=4.18.0

รายการนี้ควรทำพร้อม Critical ของ UI Library ไม่ควรรอ Wave ของ High ทั่วไป

P1 — Shared High ฝั่ง backend

Dependencyกระทบทำไมควรแก้เป็นชุดแนวทาง
Microsoft.Extensions.Caching.Memory@8.0.06 servicesหลาย service ได้ package ผ่าน EF หรือ SupApp_util_libแก้ parent/shared package ก่อน แล้ว bump consumer
Microsoft.OpenApi@2.4.16 servicesถูกดึงผ่าน Microsoft.AspNetCore.OpenApi หรือ Swashbuckleอัปเกรด parent แล้วทดสอบ Swagger/OpenAPI

หลังแก้ shared packages ให้ใช้ Backend_WorkflowService และ Backend_NotificationService เป็น pilot เพราะมี High 10 และ findings รวม 16 ตามลำดับ ก่อนกระจายไป services อื่น

P2 — Medium และ component เก่า

Medium 517 รายการควรเรียงตาม:

  1. service เปิดรับ traffic จากภายนอกหรือไม่
  2. vulnerable code ถูกเรียกใน runtime จริงหรือไม่
  3. EPSS และ Known Exploited Vulnerability สูงหรือไม่
  4. package เดียวกระทบกี่ projects

Stale violations 3,855 รายการให้รวมตาม package family และ parent dependency ห้ามเปิด ticket ทีละ violation

แผนงานสัปดาห์แรก

ช่วงเวลาทีมหลักงานผลที่ต้องได้
วัน 1DevSecOps + Tech LeadsFreeze commit ในรายงานและเปิด ticket ตาม dependency clusterไม่มี ticket ซ้ำตามจำนวน finding
วัน 1–3Frontend Platformอัปเกรด Nx/Angular/dev-server chain ใน 4 reposshell-quote, websocket-driver, tar หาย
วัน 1–3UI Libraryแก้ handlebars, vitest, rollup, flatted, lodashUI Library ไม่มี Critical/High-EPSS
วัน 2–5Backend Packageแก้ Caching.Memory และ OpenApi parent chainsshared package version ใหม่พร้อมใช้
วัน 3–5Service teamsbump shared package และทดสอบ service pilotfindings กลุ่มร่วมลดลงใน SBOM ใหม่

หลังแต่ละ PR ต้องสร้าง SBOM ใหม่และ import เป็น project version ใหม่ ห้ามดูเฉพาะว่า npm install หรือ dotnet restore ผ่าน

เมื่อไรจึงถือว่าแก้เสร็จ

  • Critical ใน SBOM version ใหม่เป็น 0
  • High Exploit Probability violation เป็น 0 หรือมี exception ที่ Security อนุมัติพร้อมวันหมดอายุ
  • Dependency path ก่อนและหลังแก้ถูกแนบใน ticket
  • lockfile และ manifest เปลี่ยนเฉพาะที่ตั้งใจ
  • lint, unit test, integration test และ build ที่เกี่ยวข้องผ่าน
  • finding หายหลังสแกนใหม่ หรือถูกระบุ NOT_AFFECTED/FALSE_POSITIVE พร้อมหลักฐาน
  • ห้าม suppress ทั้ง policy เพื่อปิด finding เพียงรายการเดียว
  • project version เก่าถูก mark inactive หลังยอมรับ baseline ใหม่

สิ่งที่ผลสแกนนี้ไม่ได้หมายความ

  • “พบ Critical” ไม่ได้แปลว่าระบบถูกโจมตีแล้ว แต่แปลว่าต้องตรวจและลดความเสี่ยงทันที
  • “ไม่มี finding” ไม่ได้แปลว่า application ปลอดภัยทุกด้าน
  • Dependency-Track ตรวจ dependency หรือ SCA; ไม่ได้ตรวจ business logic, authorization ใน code, secret, cloud configuration หรือ runtime attack path
  • OWASP policies ในระบบใช้ CWE metadata จาก dependency advisory ไม่ใช่ใบรับรองว่า application ผ่าน OWASP Top 10
  • Backend_Iac ไม่มี application dependency manifest จึงไม่ควรเรียกว่า clean; ต้องสแกนด้วย Checkov/Trivy หรือเครื่องมือ IaC โดยเฉพาะ
  • CISA/ENISA KEV feed ของรอบ local ถูก remote ปิด TLS handshake แม้ NVD และ OSV สำเร็จ จึงต้อง cross-check KEV แยกก่อนอนุมัติรับความเสี่ยง

รายละเอียดทางเทคนิคสำหรับผู้ตรวจสอบ

Baseline ที่ใช้

รายการค่า
เวลาสร้างผล10/09/2026 10:19 ICT
Dependency-Track5.1.0
SBOM formatCycloneDX 1.6
Policy จาก UAT16 policies / 19 conditions
License groups4
NVDMirror completed
OSVMirror completed สำหรับ NuGet/npm; initial mirror 230,795 advisories
Component occurrences13,458
Unique PURLs4,427

ทุก application project มี components มากกว่า 0 และไม่มี scan failure Project version ใช้รูปแบบ local-<git-sha> พบ dirty worktrees 21 repositories แต่ไม่มี dependency manifest หรือ lockfile ที่แก้ค้างในเวลาสแกน

Local Dependency-Track bind เฉพาะ localhost, credential/API key อยู่ในไฟล์ gitignored และ corporate CA ถูกเพิ่มเข้า Java truststore โดยไม่ได้ปิด TLS verification

Policy violations แยกตามความหมาย

PolicyViolationsStateความหมาย
Stale Components (>3y)3,855WARNอายุ component เกินเกณฑ์
Critical-High Vulnerabilities267FAILcomponent ชน Critical หรือ High condition
Medium Vulnerabilities223WARNcomponent ชน Medium condition
OWASP A01106FAILadvisory มี CWE ที่ map กับ A01
OWASP A03105FAILadvisory มี CWE ที่ map กับ A03
OWASP A0453FAILadvisory มี CWE ที่ map กับ A04
Outdated Components46INFOมี version ใหม่กว่า
OWASP A0723FAILadvisory มี CWE ที่ map กับ A07
OWASP A1021FAILadvisory มี CWE ที่ map กับ A10
OWASP A0815FAILadvisory มี CWE ที่ map กับ A08
OWASP A0513FAILadvisory มี CWE ที่ map กับ A05
OWASP A0211FAILadvisory มี CWE ที่ map กับ A02
High Exploit Probability2FAILEPSS มากกว่า policy threshold

ไม่มี violation สำหรับ Copyleft License, OWASP A06 และ OWASP A09 ใน snapshot นี้ แต่ไม่ได้แปลว่า source code ผ่านข้อกำหนดเหล่านั้น

จำนวน findings กับ policy violations ไม่จำเป็นต้องเท่ากัน เพราะ finding นับ vulnerability ต่อ component/project ส่วน policy violation นับผลที่ชนแต่ละ condition

ผลราย repository

Policy F/W/I คือ Fail/Warn/Info และไม่ใช่จำนวน CVE

RepositoryComponentsCHMLPolicy F/W/I
QA_E2eTests24008206/150/0
QA_E2eTests_Admin_Portal8600000/40/0
Backend_Template19102302/26/2
Backend_Package14002313/45/9
Backend_CodexService19400300/28/2
Backend_ConsentService16401001/19/2
Backend_Centralized18100000/19/2
Backend_FilterService19101301/26/2
Backend_NotificationService195041205/28/2
Backend_SentinelGatewayService21102302/26/1
Backend_ThirdPartyService18901001/19/2
Backend_ThirdPartyFXService3400000/3/2
Backend_FileManagementService17801301/26/0
Backend_UserService18700000/15/0
Backend_LogService18800300/26/2
Backend_WorkflowService181010308/31/5
Backend_TaskService18102002/19/4
Backend_OrchestratorService17501001/15/2
Frontend_HostAppSuperApp1,870310912214137/604/0
Frontend_AdminSuperApp1,6953969914117/543/0
Frontend_SuperAppLibraryUi1,988712912012149/750/1
Frontend_RemoteAppFX1,6753919013114/529/0
Frontend_LINE_Connectivity1,69205445465/523/0
Console_SyncEmployee9000300/24/0
Backend_Package_Node_JS41200000/201/0
Backend_ReportService93003011/343/6
Backend_Iac00000skipped

ทำไมตัวเลข local กับ UAT ไม่เท่ากัน

UAT เดิมมี 845 findings จาก 36 project records ส่วน local มี 1,109 findings จาก application repositories 26 รายการ ตัวเลขนี้ห้ามใช้สรุปว่าเพิ่มขึ้น 264 เพราะ:

  • UAT ใช้ Dependency-Track 4.14.2 แต่ local ใช้ 5.1.0
  • feed และเวลาที่ดึงข้อมูลต่างกัน
  • UAT มีหลาย project versions และบาง project ไม่มีหรือมี SBOM ว่าง
  • local ใช้ source workspace และหนึ่ง commit-based version ต่อ repository

การวัดว่าดีขึ้นหรือแย่ลงต้องเทียบรอบที่ใช้ pipeline, feed และขอบเขตเดียวกันเท่านั้น

คำสั่งสร้างผลรอบถัดไป

powershell.exe -NoProfile -ExecutionPolicy Bypass -File .security\scripts\prepare-dependency-track-trust.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .security\scripts\bootstrap-dependency-track.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .security\scripts\scan-superapp-portfolio.ps1
powershell.exe -NoProfile -ExecutionPolicy Bypass -File .security\scripts\refresh-superapp-results.ps1

Local UI: http://localhost:8082

UAT port-forward: http://localhost:8081