3 · จัดกลุ่มตาม Severity
รวม 275 รายการ — Critical 46, High 69, Medium 149, Low 11
Critical ทุกรายการแสดงรายละเอียดเต็ม (repo, file:line, source) เพราะเป็นกลุ่มที่ต้องแก้ก่อนอย่างอื่นทั้งหมด ("drop everything" list) — High/Medium/Low แสดงแบบตารางย่อ อ้าง citation เต็มได้จาก master register
Critical (46 รายการ — 44 SEC, 1 CORR, 1 LEG)
| ID | Repo | Category | คำอธิบาย | file:line | Source |
|---|---|---|---|---|---|
| SEC-VTRC-API-01 | vtrc-api | SEC | Command injection ผ่าน execSync ใน PDF pipeline (qpdf) 5 จุด | vtrc-api/api/src/routes.js:73,120,227,277,355 | Vol 3 |
| SEC-VTRC-API-02 | vtrc-api | SEC | Default JWT_SECRET = 'secret' | vtrc-api/api/src/config.js:12 | Vol 3 |
| SEC-VTRC-API-03 | vtrc-api | SEC | /webdeployment รัน shell binary โดยไม่มี auth | vtrc-api/api/src/routes.js:975-984 | Vol 3 |
| SEC-VTRC-API-04 | vtrc-api | SEC | /file/:id/download ไม่มี apiKey check | vtrc-api/api/src/routes.js:464 | Vol 3 |
| SEC-CU-01 | cu-central-api | SEC | JWT_SECRET default เป็น empty string | cu-central-api/main-api/src/config.js, jwtToken.js | Vol 3 |
| SEC-CU-02 | cu-central-api | SEC | apiKeys hardcoded ในโค้ด 2 keys | lib/auth/auth.controller.js | Vol 3 |
| SEC-CU-03 | cu-central-api | SEC | .env.develop-test (UAT secrets) commit อยู่ในโค้ด | repo root | Vol 3 |
| LEG-CU-01 | cu-central-api | LEG | axois typosquat ของ axios — npm reserve 0.0.1-security สำหรับ typosquat นี้ | package.json | Vol 3 |
| CORR-CU-01 | cu-central-api | CORR | lib/httpRequest.js import axios จริงแต่ package.json มีแต่ axois — crash ถ้า code path ถึง | lib/httpRequest.js | Vol 3 |
| SEC-CU-04 | cu-central-api | SEC | /auth/signinbypass passwordless signin live ใน production | routes.js | Vol 3 |
| SEC-CU-05 | cu-central-api | SEC | ignoreAuth bypass — apiKey อย่างเดียวพอผ่าน auth | directives/auth.js, searchProfile.js | Vol 3 |
| SEC-CU-06 | cu-central-api | SEC | rejectUnauthorized: false ใน LDAP connection | activeDirectory.connector.js | Vol 3 |
| C1 | vtrc-rc-backoffice | SEC | .env committed มี secret จริง (AES key, MSSQL conn string) | .env | Vol 4 |
| C2 | vtrc-rc-backoffice | SEC | REACT_APP_STIMUL_CONN_STRING ฝังใน bundle ที่ browser โหลดได้ | CRA env inlining | Vol 4 |
| C3 | vtrc-rc-backoffice | SEC | SSO bypass /pathLogin/:token/:refreshToken รับ token ใน URL | containers/App/index.js:24 | Vol 4 |
| SEC-BONEW-01 | vtrc-backoffice-new | SEC | Login ส่ง access+refresh token เป็น URL path segment ข้าม origin | src/pages/Login/index.js:93-103 (branch: uat) | Vol 4 |
| SEC-PMS-01 | pms-api | SEC | GET /budget/getEmployeeSalary เป็น @Public() คืนเงินเดือนพนักงาน | budget.controller.ts:49-53 (branch: uat) | Vol 6 |
| SEC-PMS-02 | pms-api | SEC | Credential (UAT) + JWT secret share กับ prod ของ 3 service หลุดเข้า git | .env:12,19,26,33,41,45, vtrc-gcp-sa-key.json (branch: uat) | Vol 6 |
| SEC-AIRECRUIT-01 | ai-recruitment-api | SEC | Production credential + OpenAI/remove.bg/HCTI key ที่มีค่าใช้จ่ายจริง หลุดเข้า git | .env:2,5,7,9-10,11 (branch: prod) | Vol 6 |
| SEC-AIRECRUIT-02 | ai-recruitment-api | SEC | ไม่มี authorization ระดับ role/scope | middleware/verifyJWT.js:7-40 (branch: prod) | Vol 6 |
| SEC-WORKFLOW-01 | workflow-api | SEC | ไม่มี JWT guard ระดับ global/module ใดเลย | main.ts:9-82, jwt-actor.util.ts:1-4,33-47 (branch: uat) | Vol 6 |
| SEC-WORKFLOW-02 | workflow-api | SEC | .env.example มีรหัสผ่านจริงฝังอยู่ | .env.example:11,31,44 (branch: uat) | Vol 6 |
| SEC-COMMON-01 | vtrc-common | SEC | ทุก controller ที่มีจริงถูก mark @Public() | file.controller.ts:18,24, address.controller.ts, bank.controller.ts | Vol 6 |
| SEC-COMMON-03 | vtrc-common | SEC | .env commit พร้อมรหัสผ่าน MSSQL sa จริง + SECRET_KEY ที่ share ข้าม repo | .env:11,17 | Vol 6 |
| SEC-JOBSCHED-01 | job-scheduler-api | SEC | .env commit พร้อมรหัสผ่าน MSSQL sa จริง + shared secret | .env:9-11,18 | Vol 6 |
| SEC-CHAT-01 | chat-center-api | SEC | Raw SQL string interpolation จาก query param — SQL injection | chat.service.ts:103-157, tags.service.ts:55-61 (branch: prod) | Vol 6 |
| SEC-CHAT-04 | chat-center-api | SEC | .env commit พร้อมรหัสผ่านจริง (MSSQL, MongoDB, LINE) | .env:10-11,26,28-29 (branch: prod) | Vol 6 |
| SEC-RCWEB-01 | recruitment-web | SEC | .env/.env.dev/.env.uat track ใน git มี AES key จริง | .env:2,9, .env.uat:2,7 (branch: prod) | Vol 9 |
| SEC-REPORTLOG-01 | report-log | SEC | ไฟล์ request_*.log commit จริง 50 ไฟล์ มี PII plaintext | request_2023-02-17.log และอื่น ๆ | Vol 9 |
| SEC-RECRUIT-01 | recruitment-api | SEC | Production credential หลุดเข้า git (MSSQL, JWT×2, SMTP, reCAPTCHA, GCP key) | .env:11,18,25,32,44,45,52,55 (branch: prod) | Vol 6 |
| SEC-RECRUIT-02 | recruitment-api | SEC | SQL injection ผ่าน dynamic EXEC stored procedure string | candidate.repositories.ts:1324-1338 (branch: prod) | Vol 6 |
| SEC-BENEFIT-01 | benefit-api | SEC | Production credential หลุดเข้า git (MSSQL×3, JWT, SFTP) | .env:18,25,32,64 (branch: prod) | Vol 6 |
| SEC-BENEFIT-02 | benefit-api | SEC | Raw SQL string interpolation ข้าม 2 database | payments.service.ts:415-573,640-720,1032-1183,1185-1435 (branch: prod) | Vol 6 |
| SEC-2WAYVTRC-01 | 2way-vtrc-api | SEC | Master bypass token static string "testnaja" | checkbypasstoken.ts:24 (branch: prod) | Vol 5 |
| SEC-2WAYVTRC-02 | 2way-vtrc-api | SEC | POST /2way/getProfile ไม่มี middleware คืน PII จาก lineID | getProfile.ts:34-63,79-134 (branch: prod) | Vol 5 |
| SEC-2WAYVTRC-03 | 2way-vtrc-api | SEC | Credential MongoDB production hardcode ในซอร์ส | mongo.config.ts:8 (branch: prod) | Vol 5 |
| SEC-2WAYLINE-01 | 2way-line-service | SEC | ทุก endpoint ของ LineController เป็น @Public() | line.controller.ts:13,19,25,31 | Vol 5 |
| SEC-2WAYAPI-01 | 2way-api | SEC | Backdoor login hardcode i3admin/aA123456! ออก JWT admin 48 ชม. | auth.service.ts:184-240 (branch: prod) | Vol 5 |
| SEC-2WAYAPI-02 | 2way-api | SEC | SSO/JWT secret มี default fallback ฝังในซอร์ส | auth.service.ts:20-26 (branch: prod) | Vol 5 |
| SEC-2WAYAPI-03 | 2way-api | SEC | SQL injection จาก string interpolation หลายโมดูล | announces.service.ts:164-296,297-463 (branch: prod) | Vol 5 |
| SEC-2WAYAPI-04 | 2way-api | SEC | Global JwtAuthGuard ถูก bypass ด้วย @Public() บนแทบทุก endpoint เขียนข้อมูล | announces.controller.ts:45,56,79,85 (branch: prod) | Vol 5 |
| SEC-MOBILE-01 | vtrc-mobile | SEC | RSA private key เต็ม hardcode ในซอร์ส compile เข้า JS bundle | src/utils/login.js:16-42 | Vol 8 |
| SEC-MOBILE-02 | vtrc-mobile | SEC | Android release keystore path + password plaintext commit เข้า git | android/app/build.gradle:174-179 | Vol 8 |
| SEC-NEW-01 | new-vtrc-mobile | SEC | RSA private key เดียวกับ vtrc-mobile ถูก copy มา hardcode ซ้ำ | src/constants/RSAKey.ts:11-38 | Vol 8 |
| SEC-MTVTRC-01 | meeting-vtrc-api | SEC | .envdev/.envuat/.envprod commit plaintext มี secret จริง | .envprod:1-9 (branch: prod-meeting-vtrc-api) | Vol 7 |
| SEC-MTVTRC-02 | meeting-vtrc-api | SEC | /meeting/mockuser/one ไม่มี auth คืน PII hardcode | routes/mockdelatlast/mockuser.ts:29-60 (branch: prod-meeting-vtrc-api) | Vol 7 |
สังเกต — 44 จาก 46 Critical เป็น SEC (secret รั่วเข้า git 21 รายการ, auth bypass/missing-guard 15 รายการ, SQL injection 5 รายการ) ที่เหลือ 2 รายการเป็น dependency/correctness bug ใน cu-central-api ตัวเดียว (axois typosquat + import mismatch ที่ทำให้ crash) — ดูรายละเอียดเชิงลึกทั้งหมดที่ Volume 18 · Security Review
High (69 รายการ — 30 SEC, 20 CORR, 8 LEG, 8 QUAL, 2 OBS, 1 PERF)
| ID | Repo | Category | คำอธิบาย |
|---|---|---|---|
| SEC-VTRC-API-05 | vtrc-api | SEC | checkMenuAuth อ่าน role ผิดตัว |
| SEC-VTRC-API-06 | vtrc-api | SEC | CORS typo ทำให้ allowlist ไม่ทำงาน |
| SEC-VTRC-API-07 | vtrc-api | SEC | SQL injection ใน statLog cron |
| CORR-VTRC-API-01 | vtrc-api | CORR | Transaction pattern ทั่วระบบไม่ทำงานจริง |
| CORR-VTRC-API-02 | vtrc-api | CORR | signature mismatch drop device argument |
| CORR-VTRC-API-03 | vtrc-api | CORR | limit cap ไม่ทำงาน เปิดช่อง DoS |
| OBS-VTRC-API-01 | vtrc-api | OBS | PII logging เต็มรูปแบบ |
| LEG-CU-02 | cu-central-api | LEG | error-ex pin git URL |
| LEG-CU-03 | cu-central-api | LEG | ldapjs archived |
| LEG-CU-04 | cu-central-api | LEG | jsonwebtoken@8.5.1 EOL/CVE |
| LEG-CU-05 | cu-central-api | LEG | Node 12 + esm shim EOL |
| LEG-CU-06 | cu-central-api | LEG | xlsx prototype pollution history |
| CORR-CU-02 | cu-central-api | CORR | OTP inconsistency ระหว่าง 2 resolver |
| QUAL-CU-01 | cu-central-api | QUAL | RBAC directive comment ออก |
| SEC-BO-01 | vtrc-backoffice | SEC | Token ไม่มีวันหมดอายุ + XSS surface |
| CORR-BO-02 | vtrc-backoffice | CORR | isRemember hardcode = 1 เสมอ |
| H1 | vtrc-rc-backoffice | SEC | dangerouslySetInnerHTML 30 ไฟล์ |
| H2 | vtrc-rc-backoffice | SEC | AES key expose ใน bundle |
| H3 | vtrc-rc-backoffice | SEC | Token เก็บใน web storage ทั้งหมด |
| H4 | vtrc-rc-backoffice | SEC | apiKeyNews hardcode UUID |
| CORR-BONEW-01 | vtrc-backoffice-new | CORR | isRemember hardcode = 1 เสมอ (สืบทอด) |
| S-1 | vtrc-web | SEC | Token เก็บใน web storage |
| S-3 | vtrc-web | SEC | AES key+IV hardcoded remember password |
| S-4 | vtrc-web | SEC | dangerouslySetInnerHTML ไม่มี sanitizer |
| CORR-PMS-01 | pms-api | CORR | Cron ทุก 1 นาทีไม่ป้องกัน overlap |
| QUAL-PMS-01 | pms-api | QUAL | เอกสารไม่ตรงกับโค้ดจริง |
| OBS-PMS-01 | pms-api | OBS | Cron error handling แบบ silent |
| CORR-AIRECRUIT-01 | ai-recruitment-api | CORR | Sync mechanism ระหว่าง 2 ตารางไม่ปรากฏในโค้ด |
| QUAL-AIRECRUIT-01 | ai-recruitment-api | QUAL | Dead code ไม่ถูก mount |
| CORR-WORKFLOW-01 | workflow-api | CORR | ต่อฐานข้อมูล service อื่นตรง |
| SEC-COMMON-02 | vtrc-common | SEC | SQL injection ใน AddressRepository |
| CORR-SSO-01 | sso-api | CORR | signIn ไม่ออก JWT ของตัวเอง |
| SEC-CHAT-02 | chat-center-api | SEC | WebSocket chat ไม่มี guard |
| SEC-CHAT-03 | chat-center-api | SEC | LINE webhook ไม่ verify signature |
| CORR-CHAT-01 | chat-center-api | CORR | Cron in-memory หายเมื่อ restart |
| CORR-CHAT-02 | chat-center-api | CORR | synchronize: true บน production |
| QUAL-OCRAPI-01 | vtrc-ocr-api | QUAL | OCR endpoint เป็น mock ทั้งหมด |
| QUAL-OCRAPI-02 | vtrc-ocr-api | QUAL | ผลลัพธ์เก็บ in-memory เท่านั้น |
| SEC-RCWEB-02 | recruitment-web | SEC | PII ใน localStorage ไม่มีวันหมดอายุ |
| SEC-RCWEB-03 | recruitment-web | SEC | OTP bypass ด้วยค่าคงที่ในโค้ด prod |
| SEC-REPORTLOG-02 | report-log | SEC | .gitignore ปิดกฎ log ไว้โดยตั้งใจ |
| SEC-RECRUIT-02 (ดู Critical) | |||
| CORR-RECRUIT-01 | recruitment-api | CORR | Race condition ลด remainingManpower |
| QUAL-RECRUIT-01 | recruitment-api | QUAL | Connection ไม่ใช้งานยังเปิดค้าง |
| SEC-BENEFIT-03 | benefit-api | SEC | Endpoint เบิกค่ารักษาพยาบาลเป็น @Public() |
| CORR-BENEFIT-01 | benefit-api | CORR | ข้อมูลซ้ำ 2 schema ไม่มี sync mechanism |
| QUAL-BENEFIT-01 | benefit-api | QUAL | Logic ซ้ำหลายร้อยบรรทัด |
| SEC-2WAYVTRC-04 | 2way-vtrc-api | SEC | JWT secret hardcoded 2 ตัวไม่ตรงกัน |
| SEC-2WAYVTRC-05 | 2way-vtrc-api | SEC | MSSQL encrypt: false |
| CORR-2WAYVTRC-01 | 2way-vtrc-api | CORR | Multi-table insert ไม่มี transaction |
| CORR-2WAYVTRC-02 | 2way-vtrc-api | CORR | MongoDB comment ปิดแต่ feature ยังพึ่งพา |
| SEC-2WAYMTBO-01 | 2way-meeting-backoffice | SEC | JWT ใน localStorage ไม่ใช่ httpOnly |
| SEC-2WAYMTBO-02 | 2way-meeting-backoffice | SEC | Route guard client-side เท่านั้น |
| SEC-2WAYLINE-02 | 2way-line-service | SEC | เรียกกันเองผ่าน hardcoded IP |
| PERF-2WAYBATCH-01 | 2way-batch | PERF | Cron 10 วินาที ทำงานจริงแค่ log เปล่า |
| SEC-2WAYAPI-05 | 2way-api | SEC | ignoreExpiration: true เสมอ |
| SEC-2WAYAPI-06 | 2way-api | SEC | MSSQL encrypt: false |
| SEC-MOBILE-03 | vtrc-mobile | SEC | apiKey hardcode ซ้ำ 3 จุด |
| LEG-MOBILE-01 | vtrc-mobile | LEG | RN 0.63.2 + React 16.13.1 เก่ากว่า 5 ปี |
| LEG-MOBILE-02 | vtrc-mobile | LEG | ไม่มี runtime endpoint resolver |
| CORR-MOBILE-01 | vtrc-mobile | CORR | MEETING_API hardcode ชี้ UAT เสมอ |
| SEC-NEW-02 | new-vtrc-mobile | SEC | Token plain ใน AsyncStorage (regression) |
| QUAL-NEW-01 | new-vtrc-mobile | QUAL | refreshToken ยิง boilerplate URL |
| LEG-FRONT-01 | vtrc-application-front | LEG | .ipa binary commit เข้า git |
| SEC-MTVTRC-03 | meeting-vtrc-api | SEC | Path "secure" ไม่มี auth จริง |
| CORR-MTVTRC-01 | meeting-vtrc-api | CORR | refreshtoken route ไม่ mount + ไม่ persist |
| SEC-MTBO-01 | meeting-backoffice | SEC | API key hardcode ในซอร์ส frontend |
| SEC-MTBO-02 | meeting-backoffice | SEC | .env URL จริงของ UAT commit |
| CORR-MTBO-01 | meeting-backoffice | CORR | BASE_PATH env ไม่มีผลจริง |
| CORR-MTBONEW-01 | meeting-backoffice-new | CORR | อ่าน env vars แต่ไม่มี .env ไฟล์ใดเลย |
Medium (149 รายการ — 84 QUAL, 21 OBS, 14 SEC, 12 LEG, 10 PERF, 8 CORR)
จำนวนตาม repo (10 อันดับแรก): vtrc-web 11, vtrc-rc-backoffice 5, vtrc-api 8, vtrc-backoffice 9, meeting-vtrc-api 9, 2way-api 6, vtrc-mobile 6, 2way-meeting-backoffice 6, benefit-api 5, vtrc-backoffice-new 6
รายการทั้งหมดพร้อม citation อยู่ใน master register — ส่วนใหญ่เป็น QUAL (code hygiene, dead code, ชื่อไม่สื่อความหมาย, ไฟล์ backup) และ OBS (logging/health check/deployment manifest ที่ขาดหรือไม่สมบูรณ์) ไม่มีรายการ Medium ใดที่เป็น active exploit ในตัวเอง แต่สะสมกันแล้วเพิ่ม cognitive load และความเสี่ยง regression สูง — ดูสรุปเชิงหมวดที่ 02-by-category
Low (11 รายการ — 7 QUAL, 1 SEC, 1 CORR, 1 LEG, 1 OBS)
| ID | Repo | Category | คำอธิบาย |
|---|---|---|---|
| S-7 | vtrc-web | SEC | Google Analytics ID เปิดเผยใน public HTML |
| CORR-WORKFLOW-02 | workflow-api | CORR | Enum ค่าคงที่ผสมเข้า raw SQL |
| LEG-AIRECRUIT-01 | ai-recruitment-api | LEG | Node 18 ไม่ตรงกับ Node 20 ของกลุ่ม |
| QUAL-BONEW-04 | vtrc-backoffice-new | QUAL | เมนู 2 รายการถูก comment ปิดไม่มีคำอธิบาย |
| QUAL-PMS-05 | pms-api | QUAL | TODO ค้างอยู่ 1 จุด |
| QUAL-PMS-06 | pms-api | QUAL | Typo ชื่อ entity กลายเป็นชื่อตารางถาวร |
| QUAL-AIRECRUIT-03 | ai-recruitment-api | QUAL | ไฟล์ภาพ 300+ ไฟล์ commit แทน object storage |
| QUAL-RECRUIT-04 | recruitment-api | QUAL | Template สำรอง/เก่าปนไฟล์ที่ใช้จริง |
| QUAL-BENEFIT-04 | benefit-api | QUAL | ไฟล์ผู้ใช้จริง commit อยู่ใน uploads/ |
| QUAL-BENEFIT-05 | benefit-api | QUAL | Base entity สองตัวซ้ำกันเกือบหมด |
| OBS-RECRUIT-02 | recruitment-api | OBS | Test coverage กระจุกอยู่เฉพาะบางโมดูล |
ไป master register หรือ จัดกลุ่มตาม Category