2 · Debt ID index
ดัชนีแบบ flat ของทุก debt ID ทั้ง 275 รายการ เรียงตามลำดับตัวอักษร/เลขของ ID string เอง (ไม่ใช่ตาม category/severity แบบ Vol 17) — คอลัมน์ Wave อ้างอิงจาก Vol 19 · Modernization Roadmap (time-horizon plan; deep ROI) รายละเอียดเต็มของทุกแถวอยู่ที่ master register เสมอ
Wave: 1 = Security เร่งด่วน, 2 = Correctness, 3 = Dependency/EOL, 4 = Performance/Observability/Quality + SEC เบา
C1 – C3 (vtrc-rc-backoffice, SEC)
| ID | One-line | Wave |
|---|---|---|
| C1 | .env committed มี secret จริง | 1 |
| C2 | MSSQL conn string ฝังใน bundle | 1 |
| C3 | SSO bypass รับ token ใน URL | 1 |
CORR-*
| ID | One-line | Wave |
|---|---|---|
| CORR-2WAYVTRC-01 | Multi-table insert ไม่มี transaction | 2 |
| CORR-2WAYVTRC-02 | MongoDB comment ปิดแต่ feature ยังพึ่งพา | 2 |
| CORR-AIRECRUIT-01 | Sync mechanism ระหว่าง 2 ตารางไม่ปรากฏในโค้ด | 2 |
| CORR-BENEFIT-01 | ข้อมูลซ้ำ 2 schema ไม่มี sync mechanism | 2 |
| CORR-BO-01 | unreachable code คืน endpoint ผิด | 2 |
| CORR-BO-02 | isRemember hardcode = 1 เสมอ | 2 |
| CORR-BONEW-01 | isRemember hardcode = 1 เสมอ (สืบทอด) | 2 |
| CORR-CHAT-01 | Cron in-memory หายเมื่อ restart | 2 |
| CORR-CHAT-02 | synchronize: true บน production | 2 |
| CORR-CU-01 | axios import จริงแต่ package.json typo — crash risk | 2 |
| CORR-CU-02 | OTP inconsistency ระหว่าง 2 resolver | 2 |
| CORR-MOBILE-01 | MEETING_API hardcode ชี้ UAT เสมอ | 2 |
| CORR-MTBO-01 | BASE_PATH env ไม่มีผลจริง | 2 |
| CORR-MTBO-02 | SSG ไม่มี revalidate | 2 |
| CORR-MTBONEW-01 | อ่าน env vars แต่ไม่มี .env ไฟล์ใดเลย | 2 |
| CORR-MTVTRC-01 | refreshtoken route ไม่ mount + ไม่ persist | 2 |
| CORR-MTVTRC-02 | Multi-insert ไม่มี transaction | 2 |
| CORR-MTVTRC-03 | แจ้งเตือนตัวแทน comment ปิด | 2 |
| CORR-MTVTRC-04 | Cron พลาด backlog ข้ามวัน | 2 |
| CORR-PMS-01 | Cron ทุก 1 นาทีไม่ป้องกัน overlap | 2 |
| CORR-RCWEB-01 | ENV ประกาศผิด stage ไม่มีผลจริง | 2 |
| CORR-RECRUIT-01 | Race condition ลด remainingManpower | 2 |
| CORR-SSO-01 | signIn ไม่ออก JWT ของตัวเอง | 2 |
| CORR-SSO-02 | catch block ไม่เช็ค null ก่อนอ่าน | 2 |
| CORR-VTRC-API-01 | Transaction pattern ทั่วระบบไม่ทำงานจริง | 2 |
| CORR-VTRC-API-02 | signature mismatch drop device argument | 2 |
| CORR-VTRC-API-03 | limit cap ไม่ทำงาน เปิดช่อง DoS | 2 |
| CORR-VTRC-API-04 | Session fallback ข้าม user | 2 |
| CORR-WORKFLOW-01 | ต่อฐานข้อมูล service อื่นตรง (distributed-monolith) | 2 |
| CORR-WORKFLOW-02 | Enum ผสมเข้า raw SQL | 2 |
H1 – H4 (vtrc-rc-backoffice, SEC)
| ID | One-line | Wave |
|---|---|---|
| H1 | dangerouslySetInnerHTML 30 ไฟล์ | 1 |
| H2 | AES key expose ใน bundle | 1 |
| H3 | Token เก็บใน web storage ทั้งหมด | 1 |
| H4 | apiKeyNews hardcode UUID | 1 |
LEG-*
| ID | One-line | Wave |
|---|---|---|
| LEG-2WAYBATCH-01 | Node 16-alpine EOL | 3 |
| LEG-2WAYMTBO-01 | Next.js 12 + React 17 EOL | 3 |
| LEG-2WAYVTRC-01 | ts-node ตรงใน production | 3 |
| LEG-AIRECRUIT-01 | Node 18 ไม่ตรงกับ Node 20 ของกลุ่ม | 3 |
| LEG-BENEFIT-01 | Package ซ้ำ 2 ตัวทำหน้าที่เดียวกัน | 3 |
| LEG-BO-01 | Dockerfile ไม่ build จาก source | 3 |
| LEG-BO-02 | react-scripts 3.4.3 เก่ามาก | 3 |
| LEG-BO-03 | AntD v4.15.4 EOL | 3 |
| LEG-BONEW-01 | react-scripts 3.4.3 | 3 |
| LEG-BONEW-02 | AntD v4.15.4 EOL | 3 |
| LEG-CU-01 | axois typosquat ของ axios | 3 |
| LEG-CU-02 | error-ex pin git URL | 3 |
| LEG-CU-03 | ldapjs archived | 3 |
| LEG-CU-04 | jsonwebtoken@8.5.1 EOL/CVE | 3 |
| LEG-CU-05 | Node 12 + esm shim EOL | 3 |
| LEG-CU-06 | xlsx prototype pollution history | 3 |
| LEG-FRONT-01 | .ipa binary commit เข้า git | 3 |
| LEG-MOBILE-01 | RN 0.63.2 + React 16.13.1 เก่ากว่า 5 ปี | 3 |
| LEG-MOBILE-02 | ไม่มี runtime endpoint resolver | 3 |
| LEG-OCRAPI-01 | ไม่มี test suite | 3 |
| LEG-RCWEB-01 | Base64 upload + validate client-only | 3 |
| LEG-VTRC-API-01 | Playground+introspection เปิดใน prod | 3 |
M1 – M5 (vtrc-rc-backoffice, SEC)
| ID | One-line | Wave |
|---|---|---|
| M1 | checkLinkURL ใช้ includes ไม่ parse origin | 4 |
| M2 | ไม่มี queue สำหรับ token refresh | 4 |
| M3 | ไม่มี CSP | 4 |
| M4 | ไม่มี CSRF token | 4 |
| M5 | ไม่มี SRI สำหรับ CDN | 4 |
OBS-*
| ID | One-line | Wave |
|---|---|---|
| OBS-2WAYMTBO-01 | ชื่อ env var ไม่สื่อความหมาย | 4 |
| OBS-AIRECRUIT-01 | ไม่มี test suite เลย | 4 |
| OBS-AIRECRUIT-02 | console.log แทน logger ที่มีอยู่ | 4 |
| OBS-BENEFIT-01 | PII หลุดเข้า production stdout | 4 |
| OBS-BENEFIT-02 | ไม่มี health check endpoint | 4 |
| OBS-BO-01 | console override เป็น no-op | 4 |
| OBS-BONEW-01 | console override เป็น no-op | 4 |
| OBS-CHAT-01 | ไม่มี deployment manifest | 4 |
| OBS-COMMON-01 | เอกสาร workspace อธิบายผิด | 4 |
| OBS-CU-01 | Dead connection เปิด pool ค้าง | 4 |
| OBS-JOBSCHED-01 | EXPOSE port ไม่ตรงพอร์ตจริง | 4 |
| OBS-MOBILE-01 | ไม่มี crash reporting SDK | 4 |
| OBS-MTBONEW-01 | Commit history บางเกินไป | 4 |
| OBS-MTVTRC-01 | Sentry DSN hardcode | 4 |
| OBS-OCRAPI-01 | Health check ไม่ตรวจ dependency จริง | 4 |
| OBS-PMS-01 | Cron error handling แบบ silent | 4 |
| OBS-PMS-02 | console.log มากที่สุดในกลุ่ม | 4 |
| OBS-RECRUIT-01 | console.log ปน logger 71 จุด | 4 |
| OBS-RECRUIT-02 | Test coverage กระจุกบางโมดูล | 4 |
| OBS-REPORTLOG-01 | ไม่มี error handling | 4 |
| OBS-SSO-01 | ไม่มีไฟล์ deploy manifest ใดเลย | 4 |
| OBS-VTRC-API-01 | PII logging เต็มรูปแบบ | 4 |
| OBS-VTRC-API-02 | Redis caching layer ตายทั้งระบบ | 4 |
| OBS-VTRC-API-03 | ไม่มี structured logging/tracing/health check | 4 |
P-1 – P-7 (vtrc-web, PERF)
| ID | One-line | Wave |
|---|---|---|
| P-1 | Bundle ~12MB ไม่มี code splitting | 4 |
| P-2 | fetchPolicy: no-cache default | 4 |
| P-3 | Query profile ทุกครั้งที่ reload | 4 |
| P-4 | ไม่มี lazy loading รูปภาพ | 4 |
| P-5 | Webpack 4 | 4 |
| P-6 | console.log กระจายเพิ่มขนาดบันเดิล | 4 |
| P-7 | PDF.js worker แยกเพิ่ม request | 4 |
PERF-*
| ID | One-line | Wave |
|---|---|---|
| PERF-2WAYBATCH-01 | Cron 10 วินาที ทำงานจริงแค่ log เปล่า | 4 |
| PERF-BO-01 | ไม่มี code splitting | 4 |
| PERF-CU-01 | ไม่มี timeout/retry/circuit breaker | 4 |
| PERF-VTRC-API-01 | execSync block event loop | 4 |
QUAL-*
| ID | One-line | Wave |
|---|---|---|
| QUAL-2WAYAPI-01 | โมดูลซ้ำไม่ต่อสาย | 4 |
| QUAL-2WAYAPI-02 | AppModule import ตัวเอง | 4 |
| QUAL-2WAYAPI-03 | console.log ปน logger รวม PII | 4 |
| QUAL-2WAYAPI-04 | Node version ไม่ตรงกัน | 4 |
| QUAL-2WAYAPI-05 | Package manager ไม่สอดคล้อง | 4 |
| QUAL-2WAYAPI-06 | Hardcoded IP แทน config | 4 |
| QUAL-2WAYBATCH-01 | โมดูลไม่ import เข้า AppModule | 4 |
| QUAL-2WAYBATCH-02 | ไม่มี .env.example | 4 |
| QUAL-2WAYLINE-01 | TypeORM ไม่ได้ใช้งานจริง | 4 |
| QUAL-2WAYLINE-02 | env var ไม่ได้ใช้ | 4 |
| QUAL-2WAYLINE-03 | scratch files commit | 4 |
| QUAL-2WAYMTBO-01 | ชื่อ repo ทำให้เข้าใจผิด | 4 |
| QUAL-2WAYMTBO-02 | Error swallow ด้วย console.log | 4 |
| QUAL-2WAYMTBO-03 | roomEmpCode hardcode | 4 |
| QUAL-2WAYMTBO-04 | MUI v4/v5 ปนกัน | 4 |
| QUAL-2WAYVTRC-01 | Mock tutorial mount ที่ path จริง | 4 |
| QUAL-2WAYVTRC-02 | ชื่อ package ไม่เคยแก้ | 4 |
| QUAL-AIRECRUIT-01 | Dead code ไม่ถูก mount | 4 |
| QUAL-AIRECRUIT-02 | Hardcode สมมติฐานประชากรใน prompt | 4 |
| QUAL-AIRECRUIT-03 | ไฟล์ภาพ 300+ ไฟล์ commit | 4 |
| QUAL-BENEFIT-01 | Logic ซ้ำหลายร้อยบรรทัด | 4 |
| QUAL-BENEFIT-02 | validateData stub คืน true เสมอ | 4 |
| QUAL-BENEFIT-03 | docType magic number | 4 |
| QUAL-BENEFIT-04 | ไฟล์ผู้ใช้จริง commit ใน uploads/ | 4 |
| QUAL-BENEFIT-05 | Base entity ซ้ำ 2 ตัว | 4 |
| QUAL-BO-01 | Route block comment ค้าง | 4 |
| QUAL-BO-02 | checkLinkURL ซ้ำ 2 ตัว | 4 |
| QUAL-BO-03 | 41+ ไฟล์ backup | 4 |
| QUAL-BONEW-01 | Dockerfile ไม่ตรงกับ compose | 4 |
| QUAL-BONEW-02 | ชื่อ network สลับกับที่คาด | 4 |
| QUAL-BONEW-03 | ไฟล์ backup เปล่า | 4 |
| QUAL-BONEW-04 | เมนูปิดไม่มีคำอธิบาย | 4 |
| QUAL-CHAT-01 | libs copy-paste ข้าม repo | 4 |
| QUAL-CHAT-02 | console.log debug + dead code | 4 |
| QUAL-COMMON-01 | ชื่อ endpoint ทำให้เข้าใจผิด | 4 |
| QUAL-COMMON-02 | libs copy-paste ข้าม repo | 4 |
| QUAL-CU-01 | RBAC directive comment ออก | 4 |
| QUAL-CU-02 | clockTolerance misuse | 4 |
| QUAL-CU-03 | signInDomains hardcode | 4 |
| QUAL-FRONT-01 | เวอร์ชัน hardcode ในหน้าเว็บ | 4 |
| QUAL-FRONT-02 | QR code asset ค้าง | 4 |
| QUAL-JOBSCHED-01 | TypeOrmModule import ไม่ใช้ | 4 |
| QUAL-JOBSCHED-02 | .env copy จาก repo อื่นไม่แก้ | 4 |
| QUAL-JOBSCHED-03 | dev log commit เข้า git | 4 |
| QUAL-MOBILE-01 | Typo ชื่อไฟล์/route 20+ จุด | 4 |
| QUAL-MOBILE-02 | Test มีแค่ default smoke test | 4 |
| QUAL-MOBILE-03 | Navigation library ไม่มี release ใหม่ | 4 |
| QUAL-MOBILE-04 | ชื่อ package ไม่เคยเปลี่ยน | 4 |
| QUAL-MOBILE-05 | สอง async pattern สับสน | 4 |
| QUAL-MTBO-01 | package name ไม่สัมพันธ์กับแอป | 4 |
| QUAL-MTBO-02 | ignoreBuildErrors: true | 4 |
| QUAL-MTBO-03 | รัน dev server ใน production | 4 |
| QUAL-MTBO-04 | Sidebar ไม่ครบเมนู | 4 |
| QUAL-MTBO-05 | Locale เยอรมันไม่ได้ใช้ | 4 |
| QUAL-MTBONEW-01 | build/ commit เข้า git | 4 |
| QUAL-MTBONEW-02 | ไม่มี error tracking | 4 |
| QUAL-MTBONEW-03 | compose ไม่ตรงวิธี deploy จริง | 4 |
| QUAL-MTVTRC-01 | mongoose dependency ไม่ได้ใช้ | 4 |
| QUAL-MTVTRC-02 | ตาราง login ไม่มี route อ้างถึง | 4 |
| QUAL-MTVTRC-03 | ชื่อไฟล์ case-sensitive risk | 4 |
| QUAL-MTVTRC-04 | cron สะกดผิดเป็น corn ทั่ว repo | 4 |
| QUAL-MTVTRC-05 | ไม่มี Dockerfile แต่ compose build | 4 |
| QUAL-NEW-01 | refreshToken ยิง boilerplate URL | 4 |
| QUAL-NEW-02 | Default host UAT ไม่ใช่ prod | 4 |
| QUAL-NEW-03 | รหัสผ่านเก็บใน persisted state | 4 |
| QUAL-NEW-04 | ชื่อ package scaffold เดิม | 4 |
| QUAL-NEW-05 | Screen ไฟล์ครบแต่ comment ปิด | 4 |
| QUAL-OCRAPI-01 | OCR endpoint เป็น mock ทั้งหมด | 4 |
| QUAL-OCRAPI-02 | ผลลัพธ์เก็บ in-memory เท่านั้น | 4 |
| QUAL-OCRAPI-03 | error handler ซ้ำ 2 ชุด | 4 |
| QUAL-OCRAPI-04 | response helper ไม่ถูกใช้ | 4 |
| QUAL-OCRAPI-05 | ไม่มี .env.example | 4 |
| QUAL-PMS-01 | เอกสารไม่ตรงกับโค้ดจริง | 4 |
| QUAL-PMS-02 | Dockerfile ไม่ล็อค lockfile | 4 |
| QUAL-PMS-03 | 5 module ชื่อคล้ายกันมาก | 4 |
| QUAL-PMS-04 | AI service domain ภายนอกไม่ยืนยัน | 4 |
| QUAL-PMS-05 | TODO ค้าง | 4 |
| QUAL-PMS-06 | Typo ชื่อ entity ถาวร | 4 |
| QUAL-RCWEB-01 | dead code api/login.js | 4 |
| QUAL-RCWEB-02 | axios.js dead code + misnamed param | 4 |
| QUAL-RCWEB-03 | typo env var สอดคล้องกัน 3 จุด | 4 |
| QUAL-RCWEB-04 | Decrypt logic ซ้ำ 2 ที่ | 4 |
| QUAL-RECRUIT-01 | Connection ไม่ใช้งานยังเปิดค้าง | 4 |
| QUAL-RECRUIT-02 | dev URL ใน prod env | 4 |
| QUAL-RECRUIT-03 | Business rule ไม่มี enum | 4 |
| QUAL-RECRUIT-04 | Template สำรองปนไฟล์จริง | 4 |
| QUAL-REPORTLOG-01 | users.json ไม่มี context | 4 |
| QUAL-REPORTLOG-02 | Script เฉพาะกิจ hardcode ค่า | 4 |
| QUAL-SSO-01 | verifySession เป็น stub | 4 |
| QUAL-SSO-02 | env อ่านไม่สม่ำเสมอ | 4 |
| QUAL-VTRC-API-01 | Op.like บน JSON/TEXT column | 4 |
| QUAL-VTRC-API-02 | Dynamic model access | 4 |
| QUAL-VTRC-API-03 | Fire-and-forget cron | 4 |
| QUAL-VTRC-API-04 | await map ไม่ Promise.all | 4 |
| QUAL-VTRC-API-05 | Debug artifact ค้าง | 4 |
| QUAL-WORKFLOW-01 | Fallback query จาก schema drift | 4 |
| QUAL-WORKFLOW-02 | ชื่อ repo/package ไม่ตรงกัน | 4 |
| QUAL-WORKFLOW-03 | schema.sql ไม่ตรง entity จริง | 4 |
| QUAL-WORKFLOW-04 | ไฟล์ service ใหญ่เกินจัดการ | 4 |
S-1 – S-8 (vtrc-web, SEC)
| ID | One-line | Wave |
|---|---|---|
| S-1 | Token เก็บใน web storage | 1 |
| S-2 | apiKey base64 ในบันเดิล | 4 |
| S-3 | AES key+IV hardcoded remember password | 1 |
| S-4 | dangerouslySetInnerHTML ไม่มี sanitizer | 1 |
| S-5 | isShow เป็น UI flag ไม่ใช่ auth gate | 4 |
| S-6 | Console override ปิด debug | 4 |
| S-7 | Google Analytics ID เปิดเผย | 4 |
| S-8 | ไม่มี CSP | 4 |
SEC-*
| ID | One-line | Wave |
|---|---|---|
| SEC-2WAYAPI-01 | Backdoor login hardcode ออก JWT admin | 1 |
| SEC-2WAYAPI-02 | JWT secret มี default fallback ในซอร์ส | 1 |
| SEC-2WAYAPI-03 | SQL injection หลายโมดูล | 1 |
| SEC-2WAYAPI-04 | Global guard bypass ด้วย @Public() แทบทุก endpoint | 1 |
| SEC-2WAYAPI-05 | ignoreExpiration: true เสมอ | 1 |
| SEC-2WAYAPI-06 | MSSQL encrypt: false | 1 |
| SEC-2WAYLINE-01 | ทุก endpoint เป็น @Public() | 1 |
| SEC-2WAYLINE-02 | เรียกกันเองผ่าน hardcoded IP | 1 |
| SEC-2WAYMTBO-01 | JWT ใน localStorage ไม่ใช่ httpOnly | 1 |
| SEC-2WAYMTBO-02 | Route guard client-side เท่านั้น | 1 |
| SEC-2WAYVTRC-01 | Master bypass token static string | 1 |
| SEC-2WAYVTRC-02 | getProfile ไม่มี middleware คืน PII | 1 |
| SEC-2WAYVTRC-03 | MongoDB credential hardcode | 1 |
| SEC-2WAYVTRC-04 | JWT secret hardcoded 2 ตัวไม่ตรงกัน | 1 |
| SEC-2WAYVTRC-05 | MSSQL encrypt: false | 1 |
| SEC-2WAYVTRC-06 | CORS wildcard + credentials ขัดแย้งกัน | 4 |
| SEC-AIRECRUIT-01 | Production credential + OpenAI key หลุดเข้า git | 1 |
| SEC-AIRECRUIT-02 | ไม่มี authorization ระดับ role/scope | 1 |
| SEC-BENEFIT-01 | Production credential หลุดเข้า git | 1 |
| SEC-BENEFIT-02 | Raw SQL interpolation ข้าม 2 database | 1 |
| SEC-BENEFIT-03 | Endpoint เบิกค่ารักษาพยาบาลเป็น @Public() | 1 |
| SEC-BO-01 | Token ไม่มีวันหมดอายุ + XSS surface 20 ไฟล์ | 1 |
| SEC-BONEW-01 | Login ส่ง token เป็น URL path segment ข้าม origin | 1 |
| SEC-CHAT-01 | Raw SQL string interpolation — SQL injection | 1 |
| SEC-CHAT-02 | WebSocket chat ไม่มี guard | 1 |
| SEC-CHAT-03 | LINE webhook ไม่ verify signature | 1 |
| SEC-CHAT-04 | .env commit พร้อมรหัสผ่านจริงหลายระบบ | 1 |
| SEC-COMMON-01 | ทุก controller เป็น @Public() | 1 |
| SEC-COMMON-02 | SQL injection ใน AddressRepository | 1 |
| SEC-COMMON-03 | .env commit พร้อม MSSQL sa password + shared secret | 1 |
| SEC-CU-01 | JWT_SECRET default เป็น empty string | 1 |
| SEC-CU-02 | apiKeys hardcoded ในโค้ด 2 keys | 1 |
| SEC-CU-03 | .env.develop-test commit อยู่ในโค้ด | 1 |
| SEC-CU-04 | /auth/signinbypass passwordless signin live ใน production | 1 |
| SEC-CU-05 | ignoreAuth bypass — apiKey อย่างเดียวพอ | 1 |
| SEC-CU-06 | rejectUnauthorized: false ใน LDAP connection | 1 |
| SEC-JOBSCHED-01 | .env commit พร้อม MSSQL sa password + shared secret | 1 |
| SEC-MOBILE-01 | RSA private key hardcode compile เข้า bundle | 1 |
| SEC-MOBILE-02 | Android keystore + password commit plaintext | 1 |
| SEC-MOBILE-03 | apiKey hardcode ซ้ำ 3 จุด | 1 |
| SEC-MTBO-01 | API key hardcode ในซอร์ส frontend | 1 |
| SEC-MTBO-02 | .env URL จริงของ UAT commit | 1 |
| SEC-MTVTRC-01 | .env×3 commit plaintext | 1 |
| SEC-MTVTRC-02 | mockuser endpoint ไม่มี auth คืน PII | 1 |
| SEC-MTVTRC-03 | Path "secure" ไม่มี auth จริง | 1 |
| SEC-MTVTRC-04 | Tinify API key hardcode | 4 |
| SEC-NEW-01 | RSA private key เดียวกับ vtrc-mobile copy ซ้ำ | 1 |
| SEC-NEW-02 | Token plain ใน AsyncStorage (regression) | 1 |
| SEC-OCRAPI-01 | CORS เปิดกว้าง config ไม่ถูกใช้ | 4 |
| SEC-PMS-01 | Endpoint คืนเงินเดือนพนักงานเป็น @Public() | 1 |
| SEC-PMS-02 | Credential + JWT secret share กับ 3 service หลุดเข้า git | 1 |
| SEC-RCWEB-01 | .env×3 track ใน git มี AES key จริง | 1 |
| SEC-RCWEB-02 | PII ใน localStorage ไม่มีวันหมดอายุ | 1 |
| SEC-RCWEB-03 | OTP bypass ด้วยค่าคงที่ในโค้ด prod | 1 |
| SEC-RCWEB-04 | Email/OTP ผ่าน query string GET | 4 |
| SEC-RECRUIT-01 | Production credential หลุดเข้า git | 1 |
| SEC-RECRUIT-02 | SQL injection ผ่าน dynamic EXEC string | 1 |
| SEC-REPORTLOG-01 | Log ไฟล์ commit มี PII plaintext | 1 |
| SEC-REPORTLOG-02 | .gitignore ปิดกฎ log ไว้โดยตั้งใจ | 1 |
| SEC-VTRC-API-01 | Command injection ผ่าน execSync ใน PDF pipeline | 1 |
| SEC-VTRC-API-02 | Default JWT_SECRET = 'secret' | 1 |
| SEC-VTRC-API-03 | /webdeployment รัน shell binary โดยไม่มี auth | 1 |
| SEC-VTRC-API-04 | /file/:id/download ไม่มี apiKey check | 1 |
| SEC-VTRC-API-05 | checkMenuAuth อ่าน role ผิดตัว | 1 |
| SEC-VTRC-API-06 | CORS typo ทำให้ allowlist ไม่ทำงาน | 1 |
| SEC-VTRC-API-07 | SQL injection ใน statLog cron | 1 |
| SEC-VTRC-API-08 | JWT verify ไม่ระบุ algorithms | 4 |
| SEC-WORKFLOW-01 | ไม่มี JWT guard ที่ไหนเลย role อนุมานจาก payload | 1 |
| SEC-WORKFLOW-02 | .env.example มีรหัสผ่านจริง | 1 |
รวม 275 รายการ — ดูรายละเอียดเต็มของแต่ละแถวที่ Vol 17 · master register, แผนแก้ไขตามขอบฟ้าเวลาที่ Vol 19 · Modernization