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 ข้อ:
- พบ Critical 16 รายการ ทั้งหมดอยู่ใน dependency ฝั่ง frontend
- Critical 16 รายการไม่ได้แปลว่าต้องเปิด 16 tickets เพราะเกิดจาก package หลักเพียง 7 ตัวที่ถูกใช้ซ้ำหลาย project
- Backend ไม่มี Critical แต่มี High ที่ควรแก้เป็น package กลาง 2 กลุ่ม ซึ่งกระทบหลาย services
- ตัวเลข 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 เพราะจะได้งานซ้ำจำนวนมาก
คำศัพท์ที่ต้องรู้
| คำศัพท์ | ความหมายแบบง่าย |
|---|---|
| Dependency | package หรือ library ที่ระบบนำมาใช้ เช่น NuGet และ npm |
| SBOM | รายการว่า application ใช้ dependency อะไรและ version ไหนบ้าง |
| Finding | Dependency-Track พบว่า dependency หนึ่งตัวตรงกับ vulnerability advisory |
| Policy violation | dependency ผิดกฎที่เราตั้งไว้ เช่นเป็น Critical หรือเก่ากว่า 3 ปี |
| Critical / High | ระดับความรุนแรงของ vulnerability; Critical ต้องตรวจและแก้ก่อน |
| Transitive dependency | package ที่เราไม่ได้ติดตั้งตรง ๆ แต่ถูกดึงมาจาก package ตัวอื่น |
| EPSS | คะแนนคาดการณ์โอกาสที่ vulnerability จะถูกนำไป exploit จริง |
| Stale component | component เก่าตามเงื่อนไขเวลา ไม่ได้แปลว่ามีช่องโหว่เสมอไป |
ตัวอย่าง: ถ้า shell-quote@1.8.3 ถูกดึงผ่าน build tool และอยู่ใน 4 projects ระบบจะรายงานอย่างน้อย 4 findings แม้แนวทางแก้อาจเป็นการอัปเกรด parent package เพียงชุดเดียว
ผลสแกนโดยรวม
| สิ่งที่วัด | ผล | ควรอ่านอย่างไร |
|---|---|---|
| Repositories ใน inventory | 27 | มี application 26 และ IaC 1 |
| สแกน application สำเร็จ | 26 | ไม่มี scan failure |
| Skipped | 1 | Backend_Iac ต้องใช้ IaC scanner แทน |
| Dependency ที่พบ | 13,458 occurrences | package เดิมอาจซ้ำข้ามหลาย projects |
| Dependency ที่ไม่ซ้ำ | 4,427 PURLs | ใกล้เคียงจำนวน package/version จริงที่ต้องพิจารณา |
| Vulnerability findings | 1,109 | ไม่ควรแปลงเป็น 1,109 tickets |
| Critical | 16 | ต้องเริ่มตรวจและแก้ก่อน |
| High | 517 | จัดกลุ่มตาม shared dependency แล้วแก้เป็น wave |
| Medium | 517 | ทำหลัง Critical/High ที่สำคัญ |
| Low | 59 | เก็บใน backlog และติดตาม |
| Policy violations | 4,740 | รวมทั้ง security และคำเตือนด้านอายุ component |
Frontend 5 repositories มี findings รวม 1,028 รายการ หรือ 92.7% ของทั้งหมด และถือ Critical ทั้ง 16 รายการ แต่ไม่ได้แปลว่ามีเพียง HostApp ที่มีปัญหา:
Frontend_SuperAppLibraryUi: 268 findingsFrontend_HostAppSuperApp: 248 findingsFrontend_AdminSuperApp: 212 findingsFrontend_RemoteAppFX: 197 findingsFrontend_LINE_Connectivity: 103 findings- Backend, QA และ console รวมกันยังมีอีก 81 findings
ต้องแก้อะไรก่อน
P0 — Critical frontend
Critical ทั้ง 16 มาจาก 7 dependency clusters ต่อไปนี้:
| Package ที่พบ | Version ปัจจุบัน | Version เป้าหมายขั้นต่ำ | จำนวน findings | พบที่ไหน |
|---|---|---|---|---|
shell-quote | 1.8.3 | 1.8.4 | 4 | HostApp, Admin, UI Library, Remote FX |
websocket-driver | 0.7.4 | 0.7.5 | 4 | HostApp, Admin, UI Library, Remote FX |
tar | 7.5.9–7.5.15 | 7.5.19 | 4 | HostApp, Admin, UI Library, Remote FX |
handlebars | 4.7.8 | 4.7.9 | 1 | UI Library |
vitest | 4.0.18 | 4.1.0 | 1 | UI Library |
rollup | 4.57.1 | 4.59.0 | 1 | UI Library |
flatted | 3.3.3 | 3.4.2 | 1 | UI Library |
Packages เหล่านี้เป็น transitive dependency ใน build/test/dev-server toolchain ตัวอย่างเส้นทางที่พบ:
Nx → rspack/webpack-dev-server → launch-editor → shell-quoteNx → dev-server → sockjs → faye-websocket → websocket-driverAngular CLI → pacote → node-gyp → tarAngular 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.0 | 6 services | หลาย service ได้ package ผ่าน EF หรือ SupApp_util_lib | แก้ parent/shared package ก่อน แล้ว bump consumer |
Microsoft.OpenApi@2.4.1 | 6 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 รายการควรเรียงตาม:
- service เปิดรับ traffic จากภายนอกหรือไม่
- vulnerable code ถูกเรียกใน runtime จริงหรือไม่
- EPSS และ Known Exploited Vulnerability สูงหรือไม่
- package เดียวกระทบกี่ projects
Stale violations 3,855 รายการให้รวมตาม package family และ parent dependency ห้ามเปิด ticket ทีละ violation
แผนงานสัปดาห์แรก
| ช่วงเวลา | ทีมหลัก | งาน | ผลที่ต้องได้ |
|---|---|---|---|
| วัน 1 | DevSecOps + Tech Leads | Freeze commit ในรายงานและเปิด ticket ตาม dependency cluster | ไม่มี ticket ซ้ำตามจำนวน finding |
| วัน 1–3 | Frontend Platform | อัปเกรด Nx/Angular/dev-server chain ใน 4 repos | shell-quote, websocket-driver, tar หาย |
| วัน 1–3 | UI Library | แก้ handlebars, vitest, rollup, flatted, lodash | UI Library ไม่มี Critical/High-EPSS |
| วัน 2–5 | Backend Package | แก้ Caching.Memory และ OpenApi parent chains | shared package version ใหม่พร้อมใช้ |
| วัน 3–5 | Service teams | bump shared package และทดสอบ service pilot | findings กลุ่มร่วมลดลงใน 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-Track | 5.1.0 |
| SBOM format | CycloneDX 1.6 |
| Policy จาก UAT | 16 policies / 19 conditions |
| License groups | 4 |
| NVD | Mirror completed |
| OSV | Mirror completed สำหรับ NuGet/npm; initial mirror 230,795 advisories |
| Component occurrences | 13,458 |
| Unique PURLs | 4,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 แยกตามความหมาย
| Policy | Violations | State | ความหมาย |
|---|---|---|---|
| Stale Components (>3y) | 3,855 | WARN | อายุ component เกินเกณฑ์ |
| Critical-High Vulnerabilities | 267 | FAIL | component ชน Critical หรือ High condition |
| Medium Vulnerabilities | 223 | WARN | component ชน Medium condition |
| OWASP A01 | 106 | FAIL | advisory มี CWE ที่ map กับ A01 |
| OWASP A03 | 105 | FAIL | advisory มี CWE ที่ map กับ A03 |
| OWASP A04 | 53 | FAIL | advisory มี CWE ที่ map กับ A04 |
| Outdated Components | 46 | INFO | มี version ใหม่กว่า |
| OWASP A07 | 23 | FAIL | advisory มี CWE ที่ map กับ A07 |
| OWASP A10 | 21 | FAIL | advisory มี CWE ที่ map กับ A10 |
| OWASP A08 | 15 | FAIL | advisory มี CWE ที่ map กับ A08 |
| OWASP A05 | 13 | FAIL | advisory มี CWE ที่ map กับ A05 |
| OWASP A02 | 11 | FAIL | advisory มี CWE ที่ map กับ A02 |
| High Exploit Probability | 2 | FAIL | EPSS มากกว่า 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
| Repository | Components | C | H | M | L | Policy F/W/I |
|---|---|---|---|---|---|---|
QA_E2eTests | 240 | 0 | 8 | 2 | 0 | 6/150/0 |
QA_E2eTests_Admin_Portal | 86 | 0 | 0 | 0 | 0 | 0/40/0 |
Backend_Template | 191 | 0 | 2 | 3 | 0 | 2/26/2 |
Backend_Package | 140 | 0 | 2 | 3 | 1 | 3/45/9 |
Backend_CodexService | 194 | 0 | 0 | 3 | 0 | 0/28/2 |
Backend_ConsentService | 164 | 0 | 1 | 0 | 0 | 1/19/2 |
Backend_Centralized | 181 | 0 | 0 | 0 | 0 | 0/19/2 |
Backend_FilterService | 191 | 0 | 1 | 3 | 0 | 1/26/2 |
Backend_NotificationService | 195 | 0 | 4 | 12 | 0 | 5/28/2 |
Backend_SentinelGatewayService | 211 | 0 | 2 | 3 | 0 | 2/26/1 |
Backend_ThirdPartyService | 189 | 0 | 1 | 0 | 0 | 1/19/2 |
Backend_ThirdPartyFXService | 34 | 0 | 0 | 0 | 0 | 0/3/2 |
Backend_FileManagementService | 178 | 0 | 1 | 3 | 0 | 1/26/0 |
Backend_UserService | 187 | 0 | 0 | 0 | 0 | 0/15/0 |
Backend_LogService | 188 | 0 | 0 | 3 | 0 | 0/26/2 |
Backend_WorkflowService | 181 | 0 | 10 | 3 | 0 | 8/31/5 |
Backend_TaskService | 181 | 0 | 2 | 0 | 0 | 2/19/4 |
Backend_OrchestratorService | 175 | 0 | 1 | 0 | 0 | 1/15/2 |
Frontend_HostAppSuperApp | 1,870 | 3 | 109 | 122 | 14 | 137/604/0 |
Frontend_AdminSuperApp | 1,695 | 3 | 96 | 99 | 14 | 117/543/0 |
Frontend_SuperAppLibraryUi | 1,988 | 7 | 129 | 120 | 12 | 149/750/1 |
Frontend_RemoteAppFX | 1,675 | 3 | 91 | 90 | 13 | 114/529/0 |
Frontend_LINE_Connectivity | 1,692 | 0 | 54 | 45 | 4 | 65/523/0 |
Console_SyncEmployee | 90 | 0 | 0 | 3 | 0 | 0/24/0 |
Backend_Package_Node_JS | 412 | 0 | 0 | 0 | 0 | 0/201/0 |
Backend_ReportService | 930 | 0 | 3 | 0 | 1 | 1/343/6 |
Backend_Iac | 0 | 0 | 0 | 0 | 0 | skipped |
ทำไมตัวเลข 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