ผมสร้างเครื่องมือรักษาความปลอดภัยขึ้นมา และมันก็พบช่องโหว่ร้ายแรงในตัวเอง
ผมกำลังสร้างเครื่องมือวิเคราะห์ความปลอดภัยของโค้ด ผมเรียกมันว่า vibeanalyzer
เป้าหมายนั้นเรียบง่าย ปัจจุบันหลายคนใช้วิธี "vibe-code" พวกเขาปล่อยให้ AI agent เขียนโค้ดให้ โค้ดดูสะอาดตา การทดสอบผ่านฉลุย แต่ตัวนักพัฒนาเองกลับไม่รู้เลยว่าจริงๆ แล้วมีอะไรอยู่ในโปรเจกต์บ้าง
ก่อนที่ผมจะทุ่มเทให้กับมันอย่างเต็มตัว ผมได้ทำสิ่งที่ควรจะทำตั้งนานแล้ว นั่นคือการตรวจสอบว่ามีเครื่องมือที่มีอยู่แล้วแก้ปัญหานี้ได้หรือไม่ ซึ่งมันทำได้ เครื่องมืออย่าง Semgrep, CodeQL และ Snyk นั้นดีกว่าผมมาก
ผมลองรัน Semgrep กับโปรเจกต์ของตัวเอง ผลลัพธ์ที่ได้ทำให้ผมต้องกลับมามองความจริง
Semgrep พบปัญหา 6 อย่างใน dependencies ของผม:
• ปัญหาด้านความสวยงาม 1 อย่างเกี่ยวกับการเลือกใช้ hash • ปัญหาระดับความรุนแรงสูง (High severity) 2 อย่างใน esbuild และ vite • ปัญหาระดับความรุนแรงปานกลาง (Medium severity) 3 อย่างที่เกี่ยวข้องกับ path traversal • ปัญหาระดับวิกฤต (Critical) 1 อย่างใน vitest
ปัญหาใน vitest คือช่องโหว่แบบ path traversal ซึ่งอาจทำให้ใครบางคนสามารถอ่านหรือรันไฟล์ที่อยู่นอกโปรเจกต์ได้ และผมเองนี่แหละที่เป็นคนดึง dependency นั้นเข้ามาใช้
เครื่องมือรักษาความปลอดภัยจะมีช่องโหว่ร้ายแรงได้อย่างไร?
คำตอบคือ supply chain โค้ดของผมอาจจะซื่อสัตย์ แต่เครื่องมือที่ผมใช้สร้างมันขึ้นมาอาจไม่ได้ปลอดภัยเสมอไป หากผมยังพลาดเรื่องนี้ในขณะที่กำลังสร้างเครื่องมือรักษาความปลอดภัย นักพัฒนาทั่วไปก็แทบไม่มีโอกาสตรวจพบมันได้เลย
นี่คือเหตุผลที่ผมยังคงสร้างมันต่อไป
เครื่องมือที่มีอยู่ในปัจจุบันอย่าง Semgrep จะค้นหารูปแบบของอันตราย พวกเขาค้นหาช่องโหว่ที่รู้จักกันดี แต่พวกเขาไม่เข้าใจ "เจตนา" (intent) พวกเขาไม่รู้ว่าจริงๆ แล้วโค้ดของคุณถูกออกแบบมาเพื่อทำอะไร
พวกเขาไม่สามารถบอกได้ว่าฟังก์ชันหนึ่งๆ นั้นปลอดภัย แต่กลับแก้ปัญหาที่ไม่ควรจะมีอยู่ในโปรเจกต์ของคุณ
ผมเรียกสิ่งนี้ว่า intent gap หรือช่องว่างแห่งเจตนา มันคือระยะห่างระหว่างตัวโค้ดและจุดประสงค์ของมัน
Vibeanalyzer มุ่งเน้นไปที่ช่องว่างนี้ เครื่องมือจะถามคุณถึงเจตนาของโปรเจกต์และสิ่งที่ไม่ใช่เป้าหมาย (non-goals) เพื่อกำหนดขอบเขต (guardrails) เมื่อ AI ประเมินโค้ด มันจะรู้ถึงเป้าหมาย และรู้ว่าอะไรคือสิ่งที่อยู่นอกเหนือขอบเขต
ผมทำส่วนการโหลดเจตนา (intent loading) เสร็จแล้ว ตอนนี้มีทั้งการวิเคราะห์ TypeScript พื้นฐานและกราฟโครงสร้างโฟลเดอร์ ขั้นตอนต่อไปคือการสร้างเลเยอร์ AI ผมไม่รู้ว่า AI จะสามารถประเมินโค้ดเทียบกับเจตนาได้จริงๆ หรือไม่ มันอาจจะสร้างการแจ้งเตือนที่ผิดพลาด (false alarms) ก็ได้ ผมจะสร้างมันแบบเปิดเผย (in the open) เพื่อหาคำตอบ
ผมอัปเดต dependencies และแก้ไขบั๊กที่ทราบแล้วเรียบร้อย แต่ช่องโหว่ที่ไม่รู้จักและข้อผิดพลาดทางตรรกะ (logic errors) ยังคงมีอยู่ นั่นคือเหตุผลที่งานนี้ยังต้องดำเนินต่อไป
Optional learning community: https://t.me/GyaanSetuAi
