Private Docs

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-Track4.14.2
เวลาของ portfolio metric09/09/2026 15:47 ICT
Active projects36
Components11,468
Projects ที่มีช่องโหว่28 (77.8%)
Vulnerable components295
Findings845
Critical16
High396
Medium373
Low60
Audited / unaudited0 / 845
Suppressed0
Portfolio risk score3,319
Policy violations1,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 / advisoryProjectsFindingsสิ่งที่ต้องทำ
System.Security.Cryptography.Xml 9.0.0 / 10.0.0 — CVE-2026-47304sentinel-gateway-service-uat, user-service-uat, workflow-service-uat3ยก 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-40372sentinel-gateway-service-uat, user-service-uat2ยก Microsoft.AspNetCore.DataProtection.StackExchangeRedis และ .NET patch line ให้พ้น 10.0.6 แล้วทดสอบ key ring, Redis persistence และการอ่าน cookie/token เดิม
shell-quote 1.8.3 — GHSA-w7jw-789q-3m8pFrontend ทั้ง 33เป็น 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-7fpwFrontend ทั้ง 33เป็น transitive dependency ผ่าน Angular CLI → pacote/node-gyp; ยก parent toolchain ให้ได้ tar สูงกว่า 7.5.18 และจำกัด archive ที่มาจากแหล่งไม่เชื่อถือระหว่างรอ
websocket-driver 0.7.4 — GHSA-xv26-6w52-cph6Frontend ทั้ง 33ยกเป็น 0.7.5 ขึ้นไปผ่าน sockjs/faye-websocket หรือใช้ pnpm.overrides ชั่วคราวพร้อมรัน dev-server และ HMR smoke test
vitest 4.0.18 — GHSA-5xrq-8626-4rwpsuperapp-library-ui-uat1เป็น direct dev dependency; ยกเป็น 4.1.0 ขึ้นไป ปิดการ bind Vitest UI ออกนอก localhost และรัน test suite ทั้ง workspace
handlebars 4.7.8 — GHSA-2w6w-674q-4c4qsuperapp-library-ui-uat1เป็น 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 dependency
  • vitest เป็น direct dependency เฉพาะ SuperApp Library UI จึงแยก PR ได้ทันที
  • handlebars ของ Host และ Admin ใน local lockfile เป็น 4.7.9 แล้ว แต่ UAT finding Critical เหลือที่ Library UI ซึ่งยังเป็น 4.7.8
  • Microsoft.AspNetCore.DataProtection.StackExchangeRedis 10.0.0 เป็น direct package ของ Sentinel Gateway และ User Service
  • System.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

ลำดับโครงการตามความเสี่ยง

กลุ่ม / projectFindingsCriticalHighMediumLowลำดับ
superapp-library-ui-uat256512611015P0
hostapp-superapp-uat236310411217P0
admin-superapp-uat2023919216P0
sentinel-gateway-service-uat1421020P0
user-service-uat102800P0
workflow-service-uat1511220P0
notification-service-uat1706110P1
backend-package — 12 active versions720243612P1 / cleanup ก่อน
filemanagement-service-uat50320P1
filter-service-uat50320P1
codex-service-uat30120P1
log-service-uat30120P1
orchestrator-service-uat, task-service-uat40400P1
centralized-service-uat, consent-service-uat, thirdparty-service-uat30300P1
8 projects ที่ metrics เป็นศูนย์00000Verify

โครงการที่ 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 toolchainFrontend 3 projects ถือ High 321 จาก 396ยก Angular/Nx/build toolchain เป็นชุดเดียวในแต่ละ workspace, regenerate lockfile, แล้ว rescan ก่อนแตก ticket ราย package
axios 1.13.5 / 1.15.0High component matches 32 ใน frontend 3 projectsยก direct/parent version ให้พ้น advisory ranges และทดสอบ interceptor, upload/download, timeout และ proxy behavior
System.Security.Cryptography.XmlHigh matches จำนวนมากใน 3 backend projectsรวมกับ P0 .NET servicing PR ไม่เปิด PR ซ้ำตาม CVE
System.Text.Json 8.0.0High matches 24 แต่ทั้งหมดอยู่ใน backend-package 12 versionsแก้รุ่นปัจจุบันก่อน แล้ว deactivate รุ่นเก่าเพื่อไม่ให้ backlog ถูกคูณ 12
Microsoft.Extensions.Caching.Memory 8.0.05 servicesหา parent package ที่ลากเข้ามาและยกแบบ shared baseline; ทดสอบ expiration, eviction และ concurrent access
Microsoft.OpenApi 2.4.14 servicesยก package กลางและ snapshot OpenAPI diff เพื่อกัน contract เปลี่ยนโดยไม่ตั้งใจ
OpenTelemetry.Exporter.OpenTelemetryProtocol 1.9.07 servicesยกพร้อมกัน ตรวจ trace/metric export และ collector compatibility
SQLitePCLRaw.lib.e_sqlite3 2.1.117 servicesยก parent package ที่ใช้ SQLite และยืนยันว่า native asset ของ runtime image ถูกต้อง

แผนดำเนินงาน

Wave 0 — ทำ baseline ให้เชื่อถือได้

Owner แนะนำ: Platform + Security

  1. ยืนยันว่า port-forward นี้ชี้ UAT instance ที่ต้องการจริง
  2. กำหนด naming เป็น {service}-{environment} และ version เป็น release/commit ที่ trace กลับ pipeline ได้
  3. Mark รุ่นปัจจุบันเป็น latest และ deactivate/archive backend-package รุ่นเก่า โดยเก็บ 10.31.0 เป็น candidate ปัจจุบันจนกว่า owner จะยืนยัน
  4. แก้ backend-package ที่ไม่มี version และ import SBOM ของ superapp-user-service
  5. ตรวจ fx-report-service-uat ว่า SBOM มี 0 components จริงหรือ import ผิด
  6. แยก 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

  1. เปิด ticket ตาม 7 dependency clusters ในตาราง Critical
  2. Frontend แก้ direct dependency ก่อน (vitest) แล้วค่อยยก parent toolchain/override สำหรับ transitive dependencies
  3. Backend ยก .NET servicing line และ Data Protection package โดยทดสอบ backward compatibility ของ key material
  4. Build, unit/integration test และ security smoke test ให้ผ่าน
  5. สร้าง SBOM ใหม่จาก commit ที่แก้แล้ว อัปโหลดเข้า project/version ที่ถูกต้อง และรอ vulnerability analysis จบ
  6. เปรียบเทียบกับ 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

  1. Frontend ทั้ง 3 workspaces ยก Angular/Nx/tooling ให้อยู่ใน compatible line เดียวกัน
  2. Backend สร้าง shared upgrade set สำหรับ caching, OpenAPI, OpenTelemetry และ SQLite native package
  3. backend-package แก้เฉพาะ current version ก่อน แล้วให้ consumer services ยก package ตามลำดับ
  4. หลังแต่ละ 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

  1. ยืนยันว่า instance นี้คือ UAT แม้ชื่อ Kubernetes context เป็น aks-SupperApp-dev
  2. จะนับ dev/build dependencies เป็น release blocker ระดับเดียวกับ runtime dependency หรือใช้ SLA แยกกัน
  3. backend-package รุ่นใดคือ current และต้องเก็บ historical versions กี่รุ่นใน active portfolio
  4. ใครเป็น owner ของ Frontend Platform upgrade และ Backend shared dependency upgrade
  5. ยอมรับเป้าหมาย Wave 1 ว่า Critical ต้องเป็นศูนย์ก่อน UAT sign-off หรือไม่
  6. จะเปิด policy Fail 481 เป็น release gate ตั้งแต่รอบนี้ หรือ clean policy noise ก่อนหนึ่งรอบ

Snapshot สำหรับเทียบรอบถัดไป

MetricBaseline 09/09/2026เป้าหมายหลัง Wave 1เป้าหมายหลัง Wave 2
Critical1600
High396วัดใหม่หลัง Critical upgrade< 100 (ชั่วคราว)
Unaudited845ลดลงตาม Critical triageมี owner/SLA ครบ
Projects marked latest0 / 3636 / 36 หรือ scope ที่อนุมัติคงไว้
Projects without usable SBOM200
Active backend-package versions12ตาม retention ที่อนุมัติคงไว้