Skip to content

Volume 9 · OCR & Auxiliary

"OCR & Auxiliary" คือกลุ่ม repo เล็กที่ไม่ได้เป็นบริการแกนกลางของแพลตฟอร์ม VTRC แต่ยังอยู่ใน workspace ขององค์กร — บริการ OCR ที่ยังอยู่ระหว่างตั้งต้น, สคริปต์วิเคราะห์ log แบบ offline, เว็บสมัครงานสาธารณะ, และ sandbox ฝึกฝนของทีม i3dev

จากการตรวจสอบโค้ดจริงของ 4 repo พบว่าความเสี่ยงสูงสุดของกลุ่มนี้ไม่ได้อยู่ที่ความซับซ้อนทางเทคนิค แต่อยู่ที่การจัดการข้อมูลส่วนบุคคล (PII) และ secret — ทั้ง report-log และ recruitment-web มีรายการระดับ Critical ที่เกี่ยวกับ PII/secret รั่วไหลผ่าน git repository โดยตรง

Repository ในกลุ่ม

RepoBranchStack จริงหน้าที่
vtrc-ocr-apimainExpress.js + Swaggerบริการ OCR ที่ตั้งใจไว้ — แต่ปัจจุบันเป็น mock ทั้งหมด ไม่มี OCR engine จริง
report-logmasterNode.js script (moment)สคริปต์วิเคราะห์ log คำขอ GraphQL ของ vtrc-api แบบ offline — ไม่ใช่ HTTP service
recruitment-webprod (default: master)React 18 (CRA) + Ant Design 5เว็บสมัครงานสาธารณะของสภากาชาดไทย — เชื่อมต่อ recruitment-api
interns_playgroundmainExpress + TypeScript + PostgreSQLsandbox ฝึกฝนของทีม i3dev — ไม่ใช่ระบบ production (ดูหลักฐานที่ interns_playground/index)

ข้อค้นพบสำคัญ — ภาพรวมกลุ่มนี้

  1. vtrc-ocr-api ไม่มี OCR logic จริงแม้แต่บรรทัดเดียว — endpoint POST /api/ocr/process คืนข้อความคงที่ 'Sample OCR result text' เสมอ (vtrc-ocr-api/services/ocr.service.js:26-34) และเก็บผลลัพธ์ใน in-memory Map ที่หายทุกครั้งที่ process restart — repo อยู่ในสถานะ scaffold ช่วงตั้งต้น (3 commit ทั้งหมด) ดูรายละเอียดที่ vtrc-ocr-api/02-core-pipeline
  2. report-log มีเลขบัตรประชาชนไทยจริงของผู้ใช้ระบบฝังอยู่ใน git repository แบบ plaintext — ไฟล์ request_*.log ที่ export มาจาก vtrc-api และถูก commit เข้า repo นี้ทั้ง 50 ไฟล์ มี citizenId/birthDate/empCode ปนอยู่ใน query sendVerifyCode โดยไม่ mask (report-log/request_2023-02-17.log) และ .gitignore ของ repo เปิดให้ commit ไฟล์ .log ได้ตั้งใจ (บรรทัด *.log ถูก comment ปิด) ดูรายละเอียดที่ report-log/03-scorecard
  3. recruitment-web เก็บ production secret key ไว้ใน git และ inline เข้า client bundleREACT_APP_SECRET_KEY/REACT_APP_PRIVATE_KEY ที่ใช้เข้ารหัส PII ของผู้สมัครงานทั้งระบบ ถูก commit ไว้ใน .env/.env.uat/.env.dev และเพราะเป็น CRA ค่านี้จะถูก inline เข้า JS bundle ที่ทุกคนดาวน์โหลดได้จากเบราว์เซอร์อยู่แล้ว — การ "เข้ารหัส" PII ฝั่ง client ในสถาปัตยกรรมปัจจุบันจึงไม่ได้ป้องกันความลับของข้อมูลจริง ดูรายละเอียดที่ recruitment-web/03-scorecard
  4. recruitment-web มี dev-mode OTP bypass ฝังอยู่ใน production bundle — ถ้า build ด้วย REACT_APP_NODE_ENV=dev ระบบจะข้าม backend OTP ทั้งหมดและใช้ค่าคงที่ 111111 เสมอ (recruitment-web/src/components/header/index.js:230-231) เป็น runtime check ที่ไม่ได้ถูก strip ออกจาก bundle โดย build tool
  5. report-log และ recruitment-web เป็นหลักฐานยืนยัน (ไม่ใช่แค่สันนิษฐาน) ว่า vtrc-api เขียน request log แบบ request_{yyyy-mm-dd}.log ที่มี header apikey/authorization/from.userId ครบ — ตรงกับที่ debugging order ของ v1 archive ระบุไว้ (docs-v1-archive/volume-03-vtrc-api/10-scorecard.md:334-338) แต่ยังไม่มีนโยบาย mask PII ก่อน export ไฟล์เหล่านี้ออกมาใช้งานนอก container
  6. interns_playground ไม่มีความเกี่ยวข้องกับ production ของแพลตฟอร์ม — ยืนยันจาก README, ชื่อ feature branch, commit message, และการไม่มี reference ถึงระบบ VTRC ใดในโค้ดเลย (ดู interns_playground/index) — ไม่รวมอยู่ใน scorecard ของกลุ่มนี้

Scorecard summary (รวมทั้งกลุ่ม)

Repo🔴 Critical🟡 High🟢 Mediumดูรายละเอียด
vtrc-ocr-api02603-scorecard
report-log11303-scorecard
recruitment-web12703-scorecard
interns_playgroundไม่มี scorecard (ไม่ใช่ production — ดู index)
รวม2516

รายการ 🔴 Critical ทั้ง 2 รายการของกลุ่มนี้เกี่ยวกับ PII/secret ที่รั่วไหลผ่าน git repository โดยตรง (report-log มีเลขบัตรประชาชนจริง, recruitment-web มี encryption key จริง) — ทั้งสองควรได้รับการ remediate ก่อนรายการอื่นทั้งหมดในกลุ่มนี้ เพราะเป็นความเสี่ยงที่ "เกิดขึ้นแล้ว" ไม่ใช่ความเสี่ยงเชิงทฤษฎี ต่างจาก vtrc-ocr-api ที่ยังไม่มีข้อมูลจริงให้รั่วเพราะยังเป็น mock ทั้งหมด