15.2 High security debt
บทนี้รวบรวม debt ด้านความปลอดภัยระดับ High — ความเสี่ยงที่อาจไม่ได้เกิดเหตุทันที แต่เพิ่มพื้นผิวการโจมตีและความรุนแรงเมื่อเกิด incident
รายการทั้งหมด
SEC-6 · trustServerCertificate: true บน MSSQL
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | centralize-api/src/app.module.ts:36-38,55-57 (trustServerCertificate: true บน TypeORM MSSQL). ไม่ใช่ vtrc-api/api/src/connector.js (MariaDB/Sequelize เท่านั้น — ไม่มี MSSQL/trustServerCertificate) |
| ปัญหา | MSSQL connection ตั้ง trustServerCertificate: true ซึ่งทำให้ไม่ตรวจสอบ TLS certificate ของ MSSQL server — การเชื่อมต่อระหว่าง service กับ MSSQL อาจถูก MITM โดยไม่มีการเตือน |
| Impact | ผู้ไม่ประสงค์ดีที่ควบคุม network ระหว่าง service กับ MSSQL สามารถอ่าน/แก้ DB traffic ได้ |
| Mitigation ระยะสั้น | ติดตั้ง TLS cert จาก internal CA แล้วตั้ง trustServerCertificate: false |
| แนวทางระยะยาว | ทุก DB connection ใช้ TLS ที่ตรวจสอบ certificate เสมอ |
SEC-7 · axois typosquat และ axios หายจาก node_modules
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | cu-central-api/main-api/package.json:20 — ประกาศ dependency axois (พิมพ์ผิด) |
| ปัญหา | package.json ประกาศ axois แต่ lib/httpRequest.js:1 import axios ซึ่งไม่ได้ประกาศใน dependencies — httpRequest.js รันไม่ได้ตามที่เขียน มีความเป็นไปได้สองทาง: (ก) เป็น dead code ที่ไม่เคยถูกเรียก (ข) มี build process ที่แก้ resolution เงียบ ๆ |
| Impact | ถ้ามี code path ใดเรียก httpRequest.js ในขณะที่ axios ไม่อยู่ใน node_modules service จะ crash |
| Mitigation ระยะสั้น | ลบ axois ออกจาก package.json แล้วเพิ่ม axios@^1.x ที่ถูกต้อง — ตรวจดูว่ามี caller จริงหรือไม่ |
| แนวทางระยะยาว | เปลี่ยนไปใช้ HTTP client ของภาษาที่เลือก (เช่น net/http ใน Go) เพื่อลด dependency |
SEC-8 · PII ใน URL path
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/src/routes.js:51 — :pid/:empcode/:device/:timestamp/:hash pattern ใน readfile/prs endpoints |
| ปัญหา | identityCard (เลขบัตรประชาชน) และ empCode อยู่ใน URL path ของ request — URL ถูกบันทึกใน nginx access log, browser history, CDN log, referrer header |
| Impact | PII รั่วไหลไปยัง log หลายแหล่ง ละเมิดหลักการ data minimization และอาจละเมิด PDPA |
| Mitigation ระยะสั้น | ใช้ short-lived opaque token (signed) แทนการส่ง PII ใน URL — ทำได้ภายใน 2-3 วัน |
| แนวทางระยะยาว | ตัวระบุทั้งหมดอยู่ใน POST body ที่เข้ารหัส log scrubbed ของ PII ผ่าน structured logger |
SEC-9 · typosquat และ placeholder packages ใน dependencies
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-rc-backoffice/package.json:46,49,67,71 — undefined-service-web, i, npm, save; cu-central-api/.../package.json:25 — error-ex เป็น git URL dependency |
| ปัญหา | dependency เหล่านี้เป็น typosquat หรือ placeholder ที่ไม่ควรอยู่ใน production — เพิ่มความเสี่ยง supply chain (แพ็กเกจเหล่านี้อาจถูกควบคุมโดยผู้ไม่ประสงค์ดีในอนาคต) |
| Impact | ผู้ไม่ประสงค์ดีที่ควบคุมแพ็กเกจเหล่านี้สามารถ inject โค้ดใน build ได้ |
| Mitigation ระยะสั้น | ลบ dependency เหล่านี้ออกจาก package.json regenerate lockfile รัน npm audit --production — ทำได้ภายใน 1 วัน |
| แนวทางระยะยาว | dependency review ใน CI (เช่น dependency-cruiser, socket.dev) |
SEC-10 · ไม่มี rate limiting ทุก endpoint
| ข้อมูล | รายละเอียด |
|---|---|
| Evidence | vtrc-api/api/src/index.js (ไม่มี express-rate-limit หรือ middleware ที่คล้ายกัน) |
| ปัญหา | login, OTP request, refresh token, time-attendance endpoint ไม่มีการจำกัดอัตราการเรียก — ผู้ไม่ประสงค์ดีสามารถ brute-force password หรือ OTP หรือ scrap ข้อมูลได้ |
| Impact | ความเสี่ยง credential stuffing, OTP brute-force (OTP 6 หลัก = 1 ล้านความเป็นได้ได้), การดึงข้อมูลจำนวนมาก |
| Mitigation ระยะสั้น | เพิ่ม express-rate-limit middleware สำหรับ login, OTP, refresh endpoint — กำหนด limit ต่อ IP + ต่อ token — ทำได้ภายใน 2-3 วัน |
| แนวทางระยะยาว | token-bucket rate limit ที่ Redis-backed แยกตาม endpoint type |
ผลกระทบรวมของ High security debt
ถ้าผู้ไม่ประสงค์ดีเข้าถึงระบบได้ผ่านช่องโหว่ใดช่องโหว่หนึ่งในบทนี้ ผลกระทบมักรุนแรงเพราะ:
- PII รั่วผ่าน log (SEC-8) ทำให้ incident บานปลาย
- ไม่มี rate limit (SEC-10) ทำให้ตรวจจับการโจมตีช้า
- DB traffic ไม่ตรวจ cert (SEC-6) ทำให้ lateral movement ง่าย
สรุป
| ID | รายการ | Effort ระยะสั้น |
|---|---|---|
| SEC-6 | trustServerCertificate: true | 1-2 วัน |
| SEC-7 | axois typosquat | 0.5 วัน |
| SEC-8 | PII ใน URL | 2-3 วัน |
| SEC-9 | typosquat/placeholder packages | 1 วัน |
| SEC-10 | ไม่มี rate limit | 2-3 วัน |
ทั้ง 5 รายการเป็นเป้าหมายของ Wave 1 (stabilize) ในบท 14.10 — แก้ภายใน 1-3 เดือน
บทถัดไปจะไปยัง debt ด้าน performance ที่กระทบความเร็วและความสามารถในการขยายตัวของระบบ