Dependency-Track UAT — Baseline และแผนลดช่องโหว่ 09/09/2026
Baseline จาก UAT จำนวน 845 findings พร้อม Critical dependency clusters, ลำดับแก้ไข และเกณฑ์รับงานสำหรับการวางแผน remediation
อัปเดต: 2026-09-09
Dependency-Track UAT — Baseline และแผนลดช่องโหว่ 09/09/2026
เอกสารนี้เป็น planning baseline จาก Dependency-Track UAT ณ วันที่ 9 กันยายน 2026 ไม่ใช่ข้อสรุปว่า finding ทุกตัว exploit ได้จริง และไม่ใช่หลักฐานว่า production ได้รับผลกระทบ
ข้อสรุปสำหรับการตัดสินใจ
UAT มี 845 findings ใน 36 projects โดยยังไม่มี finding ใดผ่านการ audit ใน Dependency-Track และมี Critical 16 + High 396 = 412 findings (48.8%) ที่ต้องจัดลำดับก่อน
งานไม่ได้กระจายเท่ากันทั้งระบบ:
- Frontend 3 projects มี 694 findings หรือ 82.1% ของทั้งหมด และถือ Critical 11 จาก 16
- Backend services 21 projects มี 79 findings รวม Critical 5
backend-packageถูกเก็บเป็น active 12 versions ทำให้มี findings ซ้ำเชิง portfolio 72 รายการ- 8 projects ไม่มี finding แต่ 2 รายการในกลุ่มนี้ยังนับเป็นหลักฐาน clean ไม่ได้:
superapp-user-serviceไม่เคย import SBOM และfx-report-service-uatมี metrics เป็น 0 components
ข้อเสนอคือทำเป็น 3 workstreams คู่ขนาน: กำจัด Critical, ยก dependency ชุดกลางเพื่อลด High เป็นกลุ่ม และ แก้ hygiene ของ Dependency-Track เพื่อให้ตัวเลขรอบถัดไปใช้บริหารงานได้จริง
Snapshot ที่ใช้เป็น baseline
| รายการ | ค่า |
|---|---|
| Dependency-Track | 4.14.2 |
| เวลาของ portfolio metric | 09/09/2026 15:47 ICT |
| Active projects | 36 |
| Components | 11,468 |
| Projects ที่มีช่องโหว่ | 28 (77.8%) |
| Vulnerable components | 295 |
| Findings | 845 |
| Critical | 16 |
| High | 396 |
| Medium | 373 |
| Low | 60 |
| Audited / unaudited | 0 / 845 |
| Suppressed | 0 |
| Portfolio risk score | 3,319 |
| Policy violations | 1,181 — Fail 481, Warn 464 |
ข้อมูลมาจาก metrics และความสัมพันธ์ component-vulnerability ในฐานข้อมูลของ instance ที่เปิดผ่าน
http://localhost:8081 โดยใช้ read-only query สำหรับการทำรายงาน ไม่มี credential หรือ secret ถูกบันทึกในเอกสารนี้
ข้อจำกัดและสิ่งที่ต้องยืนยันก่อนเริ่มแก้
- Kubernetes context ที่ใช้ port-forward มีชื่อ
aks-SupperApp-devแต่ database identifier และ project names ระบุ UAT จึงต้องให้ Platform ยืนยันว่า instance นี้คือ UAT ที่ต้องการก่อนใช้เป็น release gate - ทุก project มี
isLatest = falseจึงยังเลือก “รุ่นปัจจุบัน” ด้วย flag ไม่ได้ รายงานนี้ใช้ทุก active project ตาม portfolio metric backend-packageมี 12 active versions ได้แก่ 10.13.0, 10.14.0, 10.15.0, 10.17.0, 10.24.0, 10.25.0, 10.27.0, 10.28.0, 10.29.0, 10.30.0, 10.31.0 และรายการที่ไม่มี version- Component-vulnerability match อาจมากกว่า official finding count เพราะ vulnerability เดียวอาจถูกผูกหลาย component หรือมี alias จากหลายแหล่ง รายงานจึงใช้ 845 จาก portfolio metric เป็นตัวตั้ง และใช้ match count เฉพาะเพื่อหา dependency cluster
- SBOM ของ frontend รวม build/dev tooling การให้ความสำคัญต้องแยก runtime exposure ออกจาก CI/developer exposure
- Snapshot เปลี่ยนได้ทุกครั้งที่ import SBOM หรือ vulnerability database อัปเดต ทุก ticket ต้องอ้าง baseline timestamp นี้
จุดที่ต้องแก้ก่อน: Critical 16
Critical 16 รายการรวมกันเป็น dependency clusters ที่แก้เป็นชุดได้ ตารางด้านล่างใช้จำนวน finding หลังรวม alias ของ vulnerability เดียวกันแล้ว
| Dependency / advisory | Projects | Findings | สิ่งที่ต้องทำ |
|---|---|---|---|
System.Security.Cryptography.Xml 9.0.0 / 10.0.0 — CVE-2026-47304 | sentinel-gateway-service-uat, user-service-uat, workflow-service-uat | 3 | ยก 10.x ให้สูงกว่า 10.0.9 และ 9.x ให้สูงกว่า 9.0.17 ผ่าน parent package/framework จากนั้นทดสอบ XML signature/encryption paths |
Microsoft.AspNetCore.DataProtection 10.0.0 — CVE-2026-40372 | sentinel-gateway-service-uat, user-service-uat | 2 | ยก Microsoft.AspNetCore.DataProtection.StackExchangeRedis และ .NET patch line ให้พ้น 10.0.6 แล้วทดสอบ key ring, Redis persistence และการอ่าน cookie/token เดิม |
shell-quote 1.8.3 — GHSA-w7jw-789q-3m8p | Frontend ทั้ง 3 | 3 | เป็น transitive dependency ผ่าน launch-editor → webpack/rspack dev server; ยก parent toolchain เมื่อมี non-vulnerable release ห้ามเดา override ไป version ที่ advisory ยังไม่รับรอง |
tar 7.5.9 / 7.5.13 — GHSA-23hp-3jrh-7fpw | Frontend ทั้ง 3 | 3 | เป็น transitive dependency ผ่าน Angular CLI → pacote/node-gyp; ยก parent toolchain ให้ได้ tar สูงกว่า 7.5.18 และจำกัด archive ที่มาจากแหล่งไม่เชื่อถือระหว่างรอ |
websocket-driver 0.7.4 — GHSA-xv26-6w52-cph6 | Frontend ทั้ง 3 | 3 | ยกเป็น 0.7.5 ขึ้นไปผ่าน sockjs/faye-websocket หรือใช้ pnpm.overrides ชั่วคราวพร้อมรัน dev-server และ HMR smoke test |
vitest 4.0.18 — GHSA-5xrq-8626-4rwp | superapp-library-ui-uat | 1 | เป็น direct dev dependency; ยกเป็น 4.1.0 ขึ้นไป ปิดการ bind Vitest UI ออกนอก localhost และรัน test suite ทั้ง workspace |
handlebars 4.7.8 — GHSA-2w6w-674q-4c4q | superapp-library-ui-uat | 1 | เป็น transitive dependency ผ่าน ts-jest/Nx/Verdaccio; ยก parent หรือ override เป็น 4.7.9 ขึ้นไป แล้วทดสอบ Jest, local registry และ code generation |
ข้อสังเกตจาก dependency path จริง
shell-quote,tarและwebsocket-driverอยู่ใน frontend build/dev toolchain ไม่ใช่ direct runtime dependencyvitestเป็น direct dependency เฉพาะ SuperApp Library UI จึงแยก PR ได้ทันทีhandlebarsของ Host และ Admin ใน local lockfile เป็น 4.7.9 แล้ว แต่ UAT finding Critical เหลือที่ Library UI ซึ่งยังเป็น 4.7.8Microsoft.AspNetCore.DataProtection.StackExchangeRedis10.0.0 เป็น direct package ของ Sentinel Gateway และ User ServiceSystem.Security.Cryptography.Xmlเป็น transitive package จึงควรยกจาก parent dependency หรือ .NET servicing line ไม่ควร pin แบบโดดเดี่ยวโดยไม่ตรวจ dependency graph- Dependency-Track ให้ CVE-2026-47304 เป็น Critical 9.8 ขณะที่ GitHub advisory จัดเป็น High จึงต้องบันทึกการตัดสิน severity หลัง triage
ลำดับโครงการตามความเสี่ยง
| กลุ่ม / project | Findings | Critical | High | Medium | Low | ลำดับ |
|---|---|---|---|---|---|---|
superapp-library-ui-uat | 256 | 5 | 126 | 110 | 15 | P0 |
hostapp-superapp-uat | 236 | 3 | 104 | 112 | 17 | P0 |
admin-superapp-uat | 202 | 3 | 91 | 92 | 16 | P0 |
sentinel-gateway-service-uat | 14 | 2 | 10 | 2 | 0 | P0 |
user-service-uat | 10 | 2 | 8 | 0 | 0 | P0 |
workflow-service-uat | 15 | 1 | 12 | 2 | 0 | P0 |
notification-service-uat | 17 | 0 | 6 | 11 | 0 | P1 |
backend-package — 12 active versions | 72 | 0 | 24 | 36 | 12 | P1 / cleanup ก่อน |
filemanagement-service-uat | 5 | 0 | 3 | 2 | 0 | P1 |
filter-service-uat | 5 | 0 | 3 | 2 | 0 | P1 |
codex-service-uat | 3 | 0 | 1 | 2 | 0 | P1 |
log-service-uat | 3 | 0 | 1 | 2 | 0 | P1 |
orchestrator-service-uat, task-service-uat | 4 | 0 | 4 | 0 | 0 | P1 |
centralized-service-uat, consent-service-uat, thirdparty-service-uat | 3 | 0 | 3 | 0 | 0 | P1 |
| 8 projects ที่ metrics เป็นศูนย์ | 0 | 0 | 0 | 0 | 0 | Verify |
โครงการที่ metrics เป็นศูนย์คือ fxcodex-service-uat, fxcontract-service-uat, fxfile-service-uat,
fxorchestrator-service-uat, fxrate-service-uat, fx-report-service-uat, superapp-user-service
และ thirdpartyfx-service-uat
High findings ที่ควรแก้เป็นชุด
หลังปิด Critical ให้รวม ticket ตาม dependency family แทนการเปิดหนึ่ง ticket ต่อ CVE:
| Cluster | การกระจายที่พบ | แนวทาง |
|---|---|---|
| Frontend toolchain | Frontend 3 projects ถือ High 321 จาก 396 | ยก Angular/Nx/build toolchain เป็นชุดเดียวในแต่ละ workspace, regenerate lockfile, แล้ว rescan ก่อนแตก ticket ราย package |
axios 1.13.5 / 1.15.0 | High component matches 32 ใน frontend 3 projects | ยก direct/parent version ให้พ้น advisory ranges และทดสอบ interceptor, upload/download, timeout และ proxy behavior |
System.Security.Cryptography.Xml | High matches จำนวนมากใน 3 backend projects | รวมกับ P0 .NET servicing PR ไม่เปิด PR ซ้ำตาม CVE |
System.Text.Json 8.0.0 | High matches 24 แต่ทั้งหมดอยู่ใน backend-package 12 versions | แก้รุ่นปัจจุบันก่อน แล้ว deactivate รุ่นเก่าเพื่อไม่ให้ backlog ถูกคูณ 12 |
Microsoft.Extensions.Caching.Memory 8.0.0 | 5 services | หา parent package ที่ลากเข้ามาและยกแบบ shared baseline; ทดสอบ expiration, eviction และ concurrent access |
Microsoft.OpenApi 2.4.1 | 4 services | ยก package กลางและ snapshot OpenAPI diff เพื่อกัน contract เปลี่ยนโดยไม่ตั้งใจ |
OpenTelemetry.Exporter.OpenTelemetryProtocol 1.9.0 | 7 services | ยกพร้อมกัน ตรวจ trace/metric export และ collector compatibility |
SQLitePCLRaw.lib.e_sqlite3 2.1.11 | 7 services | ยก parent package ที่ใช้ SQLite และยืนยันว่า native asset ของ runtime image ถูกต้อง |
แผนดำเนินงาน
Wave 0 — ทำ baseline ให้เชื่อถือได้
Owner แนะนำ: Platform + Security
- ยืนยันว่า port-forward นี้ชี้ UAT instance ที่ต้องการจริง
- กำหนด naming เป็น
{service}-{environment}และ version เป็น release/commit ที่ trace กลับ pipeline ได้ - Mark รุ่นปัจจุบันเป็น latest และ deactivate/archive
backend-packageรุ่นเก่า โดยเก็บ 10.31.0 เป็น candidate ปัจจุบันจนกว่า owner จะยืนยัน - แก้
backend-packageที่ไม่มี version และ import SBOM ของsuperapp-user-service - ตรวจ
fx-report-service-uatว่า SBOM มี 0 components จริงหรือ import ผิด - แยก tag อย่างน้อย
environment:uat,type:frontend|backend|package,owner:<team>
เกณฑ์ผ่าน: active portfolio สะท้อนเฉพาะ scope ที่ทีมตั้งใจบริหาร, ทุก project ระบุ version/owner และ projects ที่อ้างว่า clean ต้องมี SBOM ล่าสุดจริง
Wave 1 — ปิด Critical
Owner แนะนำ: Frontend Platform, Sentinel Gateway, User Service, Workflow Service
- เปิด ticket ตาม 7 dependency clusters ในตาราง Critical
- Frontend แก้ direct dependency ก่อน (
vitest) แล้วค่อยยก parent toolchain/override สำหรับ transitive dependencies - Backend ยก .NET servicing line และ Data Protection package โดยทดสอบ backward compatibility ของ key material
- Build, unit/integration test และ security smoke test ให้ผ่าน
- สร้าง SBOM ใหม่จาก commit ที่แก้แล้ว อัปโหลดเข้า project/version ที่ถูกต้อง และรอ vulnerability analysis จบ
- เปรียบเทียบกับ baseline นี้และ audit alias/false positive ใน Dependency-Track พร้อมเหตุผลและหลักฐาน
เกณฑ์ผ่าน: Critical = 0 ใน official project metrics, ไม่มี finding ถูก suppress เพื่อให้ตัวเลขสวยโดยไม่มีหลักฐาน และ UAT smoke test ผ่าน
Wave 2 — ลด High แบบ shared upgrade
Owner แนะนำ: Frontend Platform + Backend Package maintainers
- Frontend ทั้ง 3 workspaces ยก Angular/Nx/tooling ให้อยู่ใน compatible line เดียวกัน
- Backend สร้าง shared upgrade set สำหรับ caching, OpenAPI, OpenTelemetry และ SQLite native package
backend-packageแก้เฉพาะ current version ก่อน แล้วให้ consumer services ยก package ตามลำดับ- หลังแต่ละ batch ให้ rescan ก่อนเปิด batch ถัดไป เพื่อวัดว่า shared upgrade ปิด findings ได้กี่รายการจริง
เป้าหมายชั่วคราว: ลด High จาก 396 ให้ต่ำกว่า 100 ภายในรอบแรก เป้าหมายนี้ต้องปรับอีกครั้งหลัง Wave 0 เพราะ portfolio ปัจจุบันรวม package versions เก่า
Wave 3 — Triage Medium/Low และ policy violations
Owner แนะนำ: Security + service owners
- Audit findings ที่เหลือเป็น
Exploitable,In Triage,Not AffectedหรือResolvedพร้อม evidence - แยก runtime dependencies ออกจาก build/dev dependencies แต่ยังคงติดตาม supply-chain risk ของ CI tooling
- Review policy violations 1,181 รายการ โดยเริ่มจาก Fail 481 และปรับ policy ที่สร้าง noise ก่อนใช้เป็น release gate
- ตั้ง SLA: Critical 48 ชั่วโมง, High 1 sprint, Medium 30 วัน, Low ตาม maintenance window
- ทำ weekly snapshot โดยเก็บ trend: new, resolved, reopened, suppressed และ overdue แทนการดูยอดรวมอย่างเดียว
Definition of Done ต่อ remediation ticket
- ระบุ project, component, advisory, current version, dependency path และ target version/range
- ถ้าเป็น transitive dependency ต้องระบุ parent package ที่จะแก้ ห้ามแก้ lockfile อย่างเดียวโดยไม่มี manifest/override ที่ทำซ้ำได้
- Restore แบบ frozen lockfile ผ่าน และไม่มี unexpected dependency drift
- Build, unit test, integration test และ smoke test ที่เกี่ยวข้องผ่าน
- สร้าง SBOM ใหม่จาก commit เดียวกับ artifact ที่ deploy UAT
- Dependency-Track analysis เสร็จ และ finding เดิมหายหรือถูก triage พร้อม evidence
- Ticket บันทึก before/after metrics และ link ไปยัง SBOM/project version
ประเด็นที่ต้องตัดสินใจใน review
- ยืนยันว่า instance นี้คือ UAT แม้ชื่อ Kubernetes context เป็น
aks-SupperApp-dev - จะนับ dev/build dependencies เป็น release blocker ระดับเดียวกับ runtime dependency หรือใช้ SLA แยกกัน
backend-packageรุ่นใดคือ current และต้องเก็บ historical versions กี่รุ่นใน active portfolio- ใครเป็น owner ของ Frontend Platform upgrade และ Backend shared dependency upgrade
- ยอมรับเป้าหมาย Wave 1 ว่า Critical ต้องเป็นศูนย์ก่อน UAT sign-off หรือไม่
- จะเปิด policy Fail 481 เป็น release gate ตั้งแต่รอบนี้ หรือ clean policy noise ก่อนหนึ่งรอบ
Snapshot สำหรับเทียบรอบถัดไป
| Metric | Baseline 09/09/2026 | เป้าหมายหลัง Wave 1 | เป้าหมายหลัง Wave 2 |
|---|---|---|---|
| Critical | 16 | 0 | 0 |
| High | 396 | วัดใหม่หลัง Critical upgrade | < 100 (ชั่วคราว) |
| Unaudited | 845 | ลดลงตาม Critical triage | มี owner/SLA ครบ |
| Projects marked latest | 0 / 36 | 36 / 36 หรือ scope ที่อนุมัติ | คงไว้ |
| Projects without usable SBOM | 2 | 0 | 0 |
Active backend-package versions | 12 | ตาม retention ที่อนุมัติ | คงไว้ |