Skip to content

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)

IDRepoCategoryคำอธิบายfile:lineSource
SEC-VTRC-API-01vtrc-apiSECCommand injection ผ่าน execSync ใน PDF pipeline (qpdf) 5 จุดvtrc-api/api/src/routes.js:73,120,227,277,355Vol 3
SEC-VTRC-API-02vtrc-apiSECDefault JWT_SECRET = 'secret'vtrc-api/api/src/config.js:12Vol 3
SEC-VTRC-API-03vtrc-apiSEC/webdeployment รัน shell binary โดยไม่มี authvtrc-api/api/src/routes.js:975-984Vol 3
SEC-VTRC-API-04vtrc-apiSEC/file/:id/download ไม่มี apiKey checkvtrc-api/api/src/routes.js:464Vol 3
SEC-CU-01cu-central-apiSECJWT_SECRET default เป็น empty stringcu-central-api/main-api/src/config.js, jwtToken.jsVol 3
SEC-CU-02cu-central-apiSECapiKeys hardcoded ในโค้ด 2 keyslib/auth/auth.controller.jsVol 3
SEC-CU-03cu-central-apiSEC.env.develop-test (UAT secrets) commit อยู่ในโค้ดrepo rootVol 3
LEG-CU-01cu-central-apiLEGaxois typosquat ของ axios — npm reserve 0.0.1-security สำหรับ typosquat นี้package.jsonVol 3
CORR-CU-01cu-central-apiCORRlib/httpRequest.js import axios จริงแต่ package.json มีแต่ axois — crash ถ้า code path ถึงlib/httpRequest.jsVol 3
SEC-CU-04cu-central-apiSEC/auth/signinbypass passwordless signin live ใน productionroutes.jsVol 3
SEC-CU-05cu-central-apiSECignoreAuth bypass — apiKey อย่างเดียวพอผ่าน authdirectives/auth.js, searchProfile.jsVol 3
SEC-CU-06cu-central-apiSECrejectUnauthorized: false ใน LDAP connectionactiveDirectory.connector.jsVol 3
C1vtrc-rc-backofficeSEC.env committed มี secret จริง (AES key, MSSQL conn string).envVol 4
C2vtrc-rc-backofficeSECREACT_APP_STIMUL_CONN_STRING ฝังใน bundle ที่ browser โหลดได้CRA env inliningVol 4
C3vtrc-rc-backofficeSECSSO bypass /pathLogin/:token/:refreshToken รับ token ใน URLcontainers/App/index.js:24Vol 4
SEC-BONEW-01vtrc-backoffice-newSECLogin ส่ง access+refresh token เป็น URL path segment ข้าม originsrc/pages/Login/index.js:93-103 (branch: uat)Vol 4
SEC-PMS-01pms-apiSECGET /budget/getEmployeeSalary เป็น @Public() คืนเงินเดือนพนักงานbudget.controller.ts:49-53 (branch: uat)Vol 6
SEC-PMS-02pms-apiSECCredential (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-01ai-recruitment-apiSECProduction credential + OpenAI/remove.bg/HCTI key ที่มีค่าใช้จ่ายจริง หลุดเข้า git.env:2,5,7,9-10,11 (branch: prod)Vol 6
SEC-AIRECRUIT-02ai-recruitment-apiSECไม่มี authorization ระดับ role/scopemiddleware/verifyJWT.js:7-40 (branch: prod)Vol 6
SEC-WORKFLOW-01workflow-apiSECไม่มี JWT guard ระดับ global/module ใดเลยmain.ts:9-82, jwt-actor.util.ts:1-4,33-47 (branch: uat)Vol 6
SEC-WORKFLOW-02workflow-apiSEC.env.example มีรหัสผ่านจริงฝังอยู่.env.example:11,31,44 (branch: uat)Vol 6
SEC-COMMON-01vtrc-commonSECทุก controller ที่มีจริงถูก mark @Public()file.controller.ts:18,24, address.controller.ts, bank.controller.tsVol 6
SEC-COMMON-03vtrc-commonSEC.env commit พร้อมรหัสผ่าน MSSQL sa จริง + SECRET_KEY ที่ share ข้าม repo.env:11,17Vol 6
SEC-JOBSCHED-01job-scheduler-apiSEC.env commit พร้อมรหัสผ่าน MSSQL sa จริง + shared secret.env:9-11,18Vol 6
SEC-CHAT-01chat-center-apiSECRaw SQL string interpolation จาก query param — SQL injectionchat.service.ts:103-157, tags.service.ts:55-61 (branch: prod)Vol 6
SEC-CHAT-04chat-center-apiSEC.env commit พร้อมรหัสผ่านจริง (MSSQL, MongoDB, LINE).env:10-11,26,28-29 (branch: prod)Vol 6
SEC-RCWEB-01recruitment-webSEC.env/.env.dev/.env.uat track ใน git มี AES key จริง.env:2,9, .env.uat:2,7 (branch: prod)Vol 9
SEC-REPORTLOG-01report-logSECไฟล์ request_*.log commit จริง 50 ไฟล์ มี PII plaintextrequest_2023-02-17.log และอื่น ๆVol 9
SEC-RECRUIT-01recruitment-apiSECProduction credential หลุดเข้า git (MSSQL, JWT×2, SMTP, reCAPTCHA, GCP key).env:11,18,25,32,44,45,52,55 (branch: prod)Vol 6
SEC-RECRUIT-02recruitment-apiSECSQL injection ผ่าน dynamic EXEC stored procedure stringcandidate.repositories.ts:1324-1338 (branch: prod)Vol 6
SEC-BENEFIT-01benefit-apiSECProduction credential หลุดเข้า git (MSSQL×3, JWT, SFTP).env:18,25,32,64 (branch: prod)Vol 6
SEC-BENEFIT-02benefit-apiSECRaw SQL string interpolation ข้าม 2 databasepayments.service.ts:415-573,640-720,1032-1183,1185-1435 (branch: prod)Vol 6
SEC-2WAYVTRC-012way-vtrc-apiSECMaster bypass token static string "testnaja"checkbypasstoken.ts:24 (branch: prod)Vol 5
SEC-2WAYVTRC-022way-vtrc-apiSECPOST /2way/getProfile ไม่มี middleware คืน PII จาก lineIDgetProfile.ts:34-63,79-134 (branch: prod)Vol 5
SEC-2WAYVTRC-032way-vtrc-apiSECCredential MongoDB production hardcode ในซอร์สmongo.config.ts:8 (branch: prod)Vol 5
SEC-2WAYLINE-012way-line-serviceSECทุก endpoint ของ LineController เป็น @Public()line.controller.ts:13,19,25,31Vol 5
SEC-2WAYAPI-012way-apiSECBackdoor login hardcode i3admin/aA123456! ออก JWT admin 48 ชม.auth.service.ts:184-240 (branch: prod)Vol 5
SEC-2WAYAPI-022way-apiSECSSO/JWT secret มี default fallback ฝังในซอร์สauth.service.ts:20-26 (branch: prod)Vol 5
SEC-2WAYAPI-032way-apiSECSQL injection จาก string interpolation หลายโมดูลannounces.service.ts:164-296,297-463 (branch: prod)Vol 5
SEC-2WAYAPI-042way-apiSECGlobal JwtAuthGuard ถูก bypass ด้วย @Public() บนแทบทุก endpoint เขียนข้อมูลannounces.controller.ts:45,56,79,85 (branch: prod)Vol 5
SEC-MOBILE-01vtrc-mobileSECRSA private key เต็ม hardcode ในซอร์ส compile เข้า JS bundlesrc/utils/login.js:16-42Vol 8
SEC-MOBILE-02vtrc-mobileSECAndroid release keystore path + password plaintext commit เข้า gitandroid/app/build.gradle:174-179Vol 8
SEC-NEW-01new-vtrc-mobileSECRSA private key เดียวกับ vtrc-mobile ถูก copy มา hardcode ซ้ำsrc/constants/RSAKey.ts:11-38Vol 8
SEC-MTVTRC-01meeting-vtrc-apiSEC.envdev/.envuat/.envprod commit plaintext มี secret จริง.envprod:1-9 (branch: prod-meeting-vtrc-api)Vol 7
SEC-MTVTRC-02meeting-vtrc-apiSEC/meeting/mockuser/one ไม่มี auth คืน PII hardcoderoutes/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)

IDRepoCategoryคำอธิบาย
SEC-VTRC-API-05vtrc-apiSECcheckMenuAuth อ่าน role ผิดตัว
SEC-VTRC-API-06vtrc-apiSECCORS typo ทำให้ allowlist ไม่ทำงาน
SEC-VTRC-API-07vtrc-apiSECSQL injection ใน statLog cron
CORR-VTRC-API-01vtrc-apiCORRTransaction pattern ทั่วระบบไม่ทำงานจริง
CORR-VTRC-API-02vtrc-apiCORRsignature mismatch drop device argument
CORR-VTRC-API-03vtrc-apiCORRlimit cap ไม่ทำงาน เปิดช่อง DoS
OBS-VTRC-API-01vtrc-apiOBSPII logging เต็มรูปแบบ
LEG-CU-02cu-central-apiLEGerror-ex pin git URL
LEG-CU-03cu-central-apiLEGldapjs archived
LEG-CU-04cu-central-apiLEGjsonwebtoken@8.5.1 EOL/CVE
LEG-CU-05cu-central-apiLEGNode 12 + esm shim EOL
LEG-CU-06cu-central-apiLEGxlsx prototype pollution history
CORR-CU-02cu-central-apiCORROTP inconsistency ระหว่าง 2 resolver
QUAL-CU-01cu-central-apiQUALRBAC directive comment ออก
SEC-BO-01vtrc-backofficeSECToken ไม่มีวันหมดอายุ + XSS surface
CORR-BO-02vtrc-backofficeCORRisRemember hardcode = 1 เสมอ
H1vtrc-rc-backofficeSECdangerouslySetInnerHTML 30 ไฟล์
H2vtrc-rc-backofficeSECAES key expose ใน bundle
H3vtrc-rc-backofficeSECToken เก็บใน web storage ทั้งหมด
H4vtrc-rc-backofficeSECapiKeyNews hardcode UUID
CORR-BONEW-01vtrc-backoffice-newCORRisRemember hardcode = 1 เสมอ (สืบทอด)
S-1vtrc-webSECToken เก็บใน web storage
S-3vtrc-webSECAES key+IV hardcoded remember password
S-4vtrc-webSECdangerouslySetInnerHTML ไม่มี sanitizer
CORR-PMS-01pms-apiCORRCron ทุก 1 นาทีไม่ป้องกัน overlap
QUAL-PMS-01pms-apiQUALเอกสารไม่ตรงกับโค้ดจริง
OBS-PMS-01pms-apiOBSCron error handling แบบ silent
CORR-AIRECRUIT-01ai-recruitment-apiCORRSync mechanism ระหว่าง 2 ตารางไม่ปรากฏในโค้ด
QUAL-AIRECRUIT-01ai-recruitment-apiQUALDead code ไม่ถูก mount
CORR-WORKFLOW-01workflow-apiCORRต่อฐานข้อมูล service อื่นตรง
SEC-COMMON-02vtrc-commonSECSQL injection ใน AddressRepository
CORR-SSO-01sso-apiCORRsignIn ไม่ออก JWT ของตัวเอง
SEC-CHAT-02chat-center-apiSECWebSocket chat ไม่มี guard
SEC-CHAT-03chat-center-apiSECLINE webhook ไม่ verify signature
CORR-CHAT-01chat-center-apiCORRCron in-memory หายเมื่อ restart
CORR-CHAT-02chat-center-apiCORRsynchronize: true บน production
QUAL-OCRAPI-01vtrc-ocr-apiQUALOCR endpoint เป็น mock ทั้งหมด
QUAL-OCRAPI-02vtrc-ocr-apiQUALผลลัพธ์เก็บ in-memory เท่านั้น
SEC-RCWEB-02recruitment-webSECPII ใน localStorage ไม่มีวันหมดอายุ
SEC-RCWEB-03recruitment-webSECOTP bypass ด้วยค่าคงที่ในโค้ด prod
SEC-REPORTLOG-02report-logSEC.gitignore ปิดกฎ log ไว้โดยตั้งใจ
SEC-RECRUIT-02 (ดู Critical)
CORR-RECRUIT-01recruitment-apiCORRRace condition ลด remainingManpower
QUAL-RECRUIT-01recruitment-apiQUALConnection ไม่ใช้งานยังเปิดค้าง
SEC-BENEFIT-03benefit-apiSECEndpoint เบิกค่ารักษาพยาบาลเป็น @Public()
CORR-BENEFIT-01benefit-apiCORRข้อมูลซ้ำ 2 schema ไม่มี sync mechanism
QUAL-BENEFIT-01benefit-apiQUALLogic ซ้ำหลายร้อยบรรทัด
SEC-2WAYVTRC-042way-vtrc-apiSECJWT secret hardcoded 2 ตัวไม่ตรงกัน
SEC-2WAYVTRC-052way-vtrc-apiSECMSSQL encrypt: false
CORR-2WAYVTRC-012way-vtrc-apiCORRMulti-table insert ไม่มี transaction
CORR-2WAYVTRC-022way-vtrc-apiCORRMongoDB comment ปิดแต่ feature ยังพึ่งพา
SEC-2WAYMTBO-012way-meeting-backofficeSECJWT ใน localStorage ไม่ใช่ httpOnly
SEC-2WAYMTBO-022way-meeting-backofficeSECRoute guard client-side เท่านั้น
SEC-2WAYLINE-022way-line-serviceSECเรียกกันเองผ่าน hardcoded IP
PERF-2WAYBATCH-012way-batchPERFCron 10 วินาที ทำงานจริงแค่ log เปล่า
SEC-2WAYAPI-052way-apiSECignoreExpiration: true เสมอ
SEC-2WAYAPI-062way-apiSECMSSQL encrypt: false
SEC-MOBILE-03vtrc-mobileSECapiKey hardcode ซ้ำ 3 จุด
LEG-MOBILE-01vtrc-mobileLEGRN 0.63.2 + React 16.13.1 เก่ากว่า 5 ปี
LEG-MOBILE-02vtrc-mobileLEGไม่มี runtime endpoint resolver
CORR-MOBILE-01vtrc-mobileCORRMEETING_API hardcode ชี้ UAT เสมอ
SEC-NEW-02new-vtrc-mobileSECToken plain ใน AsyncStorage (regression)
QUAL-NEW-01new-vtrc-mobileQUALrefreshToken ยิง boilerplate URL
LEG-FRONT-01vtrc-application-frontLEG.ipa binary commit เข้า git
SEC-MTVTRC-03meeting-vtrc-apiSECPath "secure" ไม่มี auth จริง
CORR-MTVTRC-01meeting-vtrc-apiCORRrefreshtoken route ไม่ mount + ไม่ persist
SEC-MTBO-01meeting-backofficeSECAPI key hardcode ในซอร์ส frontend
SEC-MTBO-02meeting-backofficeSEC.env URL จริงของ UAT commit
CORR-MTBO-01meeting-backofficeCORRBASE_PATH env ไม่มีผลจริง
CORR-MTBONEW-01meeting-backoffice-newCORRอ่าน 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)

IDRepoCategoryคำอธิบาย
S-7vtrc-webSECGoogle Analytics ID เปิดเผยใน public HTML
CORR-WORKFLOW-02workflow-apiCORREnum ค่าคงที่ผสมเข้า raw SQL
LEG-AIRECRUIT-01ai-recruitment-apiLEGNode 18 ไม่ตรงกับ Node 20 ของกลุ่ม
QUAL-BONEW-04vtrc-backoffice-newQUALเมนู 2 รายการถูก comment ปิดไม่มีคำอธิบาย
QUAL-PMS-05pms-apiQUALTODO ค้างอยู่ 1 จุด
QUAL-PMS-06pms-apiQUALTypo ชื่อ entity กลายเป็นชื่อตารางถาวร
QUAL-AIRECRUIT-03ai-recruitment-apiQUALไฟล์ภาพ 300+ ไฟล์ commit แทน object storage
QUAL-RECRUIT-04recruitment-apiQUALTemplate สำรอง/เก่าปนไฟล์ที่ใช้จริง
QUAL-BENEFIT-04benefit-apiQUALไฟล์ผู้ใช้จริง commit อยู่ใน uploads/
QUAL-BENEFIT-05benefit-apiQUALBase entity สองตัวซ้ำกันเกือบหมด
OBS-RECRUIT-02recruitment-apiOBSTest coverage กระจุกอยู่เฉพาะบางโมดูล

ไป master register หรือ จัดกลุ่มตาม Category