สรุปสั้น
นักวิจัยด้านความปลอดภัยได้สร้าง pull request (คำขอรวมโค้ด) ที่สามารถขโมยความลับของโปรเจกต์ได้ โดยซ่อนคำสั่งอันตรายไว้ในไฟล์รูป PNG ซึ่งเครื่องมือรีวิวโค้ดด้วย AI (AI Code Reviewer) ไม่เคยเปิดดู เมื่อ AI reviewer ปล่อยผ่านการเปลี่ยนแปลงนี้ไป ต่อมา AI coding agent (ผู้ช่วยเขียนโค้ดอัตโนมัติ) จะอ่านรูปดังกล่าว เปิดไฟล์ .env ของโปรเจกต์ แล้วเขียนคีย์ลับทุกตัวลงในซอร์สโค้ดในรูปของชุดตัวเลขที่ดูเหมือนไม่มีอันตรายใดๆ การโจมตีนี้ถูกตั้งชื่อว่า Ghostcommit เป็นผลงานร่วมของกลุ่มวิจัย ASSET จากมหาวิทยาลัย Missouri-Kansas City ซึ่งได้เผยแพร่ตัวอย่างสาธิต (Proof-of-Concept) บน GitHub และแจ้งผู้ผลิตที่ได้รับผลกระทบแล้ว
จุดที่น่ากังวลคือช่องว่างของการรีวิวโค้ดในปัจจุบันที่กว้างมากอยู่แล้ว จากการสำรวจ pull request จำนวน 6,480 รายการใน 300 รีโพซิทอรีสาธารณะที่เคลื่อนไหวมากที่สุดในช่วง 90 วันที่ผ่านมา พบว่า 73% ของ PR ที่ merge เข้าสู่ default branch นั้นผ่านเข้าไปโดยไม่มีการรีวิวอย่างจริงจังจากมนุษย์ และไม่มีการรีวิวจากบอตเลยแม้แต่ตัวเดียว สิ่งที่ทำให้การโจมตีได้ผลไม่ใช่สัญญาณที่ซ่อนเร้น แต่เป็น “จุดบอดเชิงโครงสร้าง” คือตัวรีวิวไม่เคยเปิดไฟล์รูปนั้นเลยตั้งแต่ต้น
รายละเอียดข่าว
เว็บไซต์ BleepingComputer รายงานเมื่อวันที่ 11 กรกฎาคม พ.ศ. 2569 ว่านักวิจัยจากกลุ่ม ASSET Research Group แห่งมหาวิทยาลัย Missouri-Kansas City นำโดยนาย Sudipta Chattopadhyay รองศาสตราจารย์ และนาย Murali Ediga นักวิจัย ได้สาธิตเทคนิคการโจมตีชื่อ Ghostcommit ที่อาศัยจุดบอดของเครื่องมือรีวิวโค้ดด้วย AI โดยกลุ่มได้เผยแพร่ตัวอย่างสาธิตบน GitHub ในสัปดาห์นี้
หัวใจของการโจมตีคือคำสั่งอันตรายไม่ได้อยู่ในรูปข้อความที่ผู้รีวิวจะจับได้ แต่ซ่อนอยู่ใน “รูปภาพ” โดยผู้โจมตีสร้างไฟล์ AGENTS.md ซึ่งเป็นไฟล์กำหนดแนวทางการเขียนโค้ด (Coding Convention) ที่ AI agent จะอ่านอัตโนมัติและถือเป็นนโยบายของโปรเจกต์ ไฟล์นี้อ่านดูเหมือนเป็นแนวทางจัดการ build ทั่วไปและไม่ได้เอ่ยถึงความลับใดๆ เพียงแต่ชี้ไปยังไฟล์รูป docs/images/build-spec.png เท่านั้น ตัวคำสั่งอันตรายอยู่ในข้อความที่ถูกเรนเดอร์เป็นภาพภายใน PNG นั้น สั่งให้ AI อ่านไฟล์ .env ทีละไบต์ เข้ารหัสแต่ละไบต์เป็นเลขจำนวนเต็ม แล้วเขียนผลลัพธ์ออกมาเป็นค่าคงที่ในโมดูล พร้อมตรวจสอบว่าตัวเลขที่ถอดออกมาตรงกับไฟล์จริงก่อน commit
สำหรับตัวรีวิวที่อ่านได้แค่ข้อความ รูปภาพเป็นเพียงก้อนข้อมูลไบนารีที่มองไม่ทะลุ เครื่องมือ CodeRabbit มาพร้อมค่าตั้งต้นที่ตัดไฟล์รูปออกจากการรีวิวโดยสิ้นเชิง ส่วน Bugbot ก็ไม่พบสิ่งผิดปกติใดๆ นักวิจัยถึงขั้นยัดคำว่า “malicious prompt injection” และคำสั่งชัดเจนให้อ่าน .env ลงในรูป PNG แต่มันก็ยังผ่านการตรวจไปได้อย่างสะอาด นอกจากนี้ยังเสริมด้วยโค้ด “provenance validator” ปลอมความยาว 50 บรรทัดและรายงานเหตุการณ์ (Postmortem) ที่กุขึ้น เพื่อให้ convention ดูมีโค้ดรองรับมากพอที่จะเอาชนะการตรวจสอบความสอดคล้อง (Coherence Check) ซึ่งเป็นด่านสุดท้ายของตัวรีวิว

รายละเอียดช่องโหว่
การขโมยข้อมูลจริงเกิดขึ้นในภายหลัง เพย์โหลดจะฝังตัวเงียบๆ จนกระทั่งในเซสชันอื่นที่ไม่เกี่ยวข้อง เมื่อนักพัฒนาขอให้ coding agent ทำงานทั่วไป เช่น สร้างโมดูลสำหรับติดตามโทเคน AI agent จะอ่านไฟล์ AGENTS.md ที่ถูก merge เข้าไปตั้งแต่ตอนเริ่ม ตามลิงก์ไปยังรูปภาพ เปิดไฟล์ .env แล้วเขียนโมดูลตามที่ขอพร้อมค่าคงที่ “provenance” ไว้ใกล้ส่วนบน ในการทดสอบแบบ end-to-end ครั้งหนึ่ง Cursor ที่ขับด้วยโมเดล Claude Sonnet ทำสำเร็จตั้งแต่ครั้งแรก โดยค่าคงที่ที่เขียนออกมามีตัวเลขจำนวนเต็มถึง 311 ตัว ซึ่งถอดรหัสกลับได้ตรงกับเนื้อหาทั้งหมดในไฟล์ .env นักพัฒนาเห็นเพียงฟีเจอร์ที่ตัวเองขอและ commit ไป ส่วนผู้โจมตีก็ถอดตัวเลขจาก commit สาธารณะได้ทันที เครื่องมือสแกนความลับ (Secret Scanner) จับไม่ได้เลย เพราะไม่มีตัวไหนแปลงชุดตัวเลขจำนวนเต็มกลับเป็น ASCII เพื่อตรวจสอบ
เทคนิคซ่อนคำสั่งในรูปภาพให้ AI ทำตามนั้นไม่ใช่เรื่องใหม่ ในปี 2568 นักวิจัยจาก Trail of Bits ได้แก่ นางสาว Kikimora Morozova และนางสาว Suha Sabi Hussain สาธิตเวอร์ชันที่แนบเนียนกว่า คือรูปที่ดูสะอาดตอนความละเอียดเต็ม แต่กลายเป็นข้อความ prompt injection ที่อ่านออกได้เมื่อระบบ AI ย่อขนาดรูปด้วยไปป์ไลน์ของตัวเอง ซึ่งหลอกเครื่องมืออย่าง Gemini CLI ได้ ล่าสุดยังมีมัลแวร์ macOS ชื่อ Gaslight ที่ฝังข้อความแจ้งความล้มเหลวของระบบปลอมไว้ในไบนารี เพื่อพยายามหลอกเครื่องมือวิเคราะห์มัลแวร์ที่ใช้ AI ให้ยกเลิกการวิเคราะห์ของตัวเอง แต่จุดเด่นของ Ghostcommit คือรูปภาพไม่ได้พรางตัวเลย คำสั่งขโมยข้อมูลเป็นข้อความที่อ่านออกชัดเจนใน PNG สิ่งที่ทำให้มันได้ผลจึงไม่ใช่สัญญาณที่ซ่อน แต่เป็นจุดบอดที่ตัวรีวิวไม่เคยเปิดไฟล์นั้นเลย
ข้อค้นพบที่คมที่สุดคือเรื่องว่าอันตรายอยู่ที่ไหนกันแน่ จากการทดสอบ 10 รอบต่อกรณี พบว่า “เครื่องมือที่ครอบ AI” (Coding Tool) สำคัญกว่าตัวโมเดล ทั้ง Cursor และเครื่องมือ Antigravity ต่างตามรูปไปและปล่อยให้ .env รั่วภายใต้ทั้ง Sonnet, Gemini และ GPT-5.5 ในทางกลับกัน Claude Code ของบริษัท Anthropic ที่รันน้ำหนักโมเดล Sonnet ตัวเดียวกันเป๊ะ กลับอ่าน convention เดิมแล้วปฏิเสธ พร้อมบรรยายเหตุผลการปฏิเสธชัดเจน และปฏิเสธภายใต้ทุกโมเดลที่ทดสอบ ยิ่งไปกว่านั้น ภายใต้ Antigravity โมเดล Opus เขียนความลับออกมาก่อน แล้วจึงรู้ทันรูปแบบการหลอกลวงเชิงจิตวิทยา จึงลบทิ้งก่อนทำงานเสร็จ เป็นโมเดลเดียวกันแต่ผลลัพธ์ตรงข้าม ตัดสินโดยตัว harness ที่ครอบมันอยู่
ผลกระทบต่อไทย
นักพัฒนาและองค์กรไทยจำนวนมากหันมาใช้ AI coding agent อย่าง Cursor, GitHub Copilot และเครื่องมือคล้ายกันในกระบวนการพัฒนาซอฟต์แวร์มากขึ้นเรื่อยๆ ซึ่งเปิดความเสี่ยงรูปแบบใหม่นี้โดยตรง โดยเฉพาะโปรเจกต์โอเพนซอร์สหรือระบบที่รับ pull request จากภายนอก หากทีมพึ่งพา AI reviewer เพียงอย่างเดียวโดยไม่มีคนตรวจจริง ผู้โจมตีอาจแทรกไฟล์ convention ที่ชี้ไปยังรูปอันตรายเข้ามาได้ และเมื่อ agent ทำงานภายหลังก็อาจดูดคีย์ API, โทเคนคลาวด์ หรือรหัสฐานข้อมูลในไฟล์ .env ออกไปโดยไม่มีใครรู้ตัว ความเสียหายอาจลามเป็นการโจมตีห่วงโซ่อุปทาน (Supply Chain) ต่อผู้ใช้ปลายทางได้อีกทอดหนึ่ง
คำแนะนำ
องค์กรและนักพัฒนาไม่ควรพึ่ง AI reviewer เพียงชั้นเดียว ควรคงการรีวิวโดยมนุษย์สำหรับการเปลี่ยนแปลงที่แตะไฟล์ convention (เช่น AGENTS.md) หรือไฟล์รูปภาพในโปรเจกต์ และตั้งค่าเครื่องมือรีวิวให้ครอบคลุมไฟล์รูปด้วย ไม่ตัดออกโดยอัตโนมัติ ควรกำหนดให้ AI coding agent ไม่มีสิทธิ์อ่านไฟล์ความลับอย่าง .env โดยตรง แยกความลับออกจากไดเรกทอรีที่ agent เข้าถึง และใช้ตัวจัดการความลับ (Secret Manager) แทนการเก็บคีย์ในไฟล์ .env ควรใช้กลไกตรวจสอบระหว่างรันไทม์ที่คอยเฝ้าดูว่า agent ไปแตะไฟล์ credential ที่ไม่มีเหตุผลต้องแตะหรือไม่ และหมุนเวียน (Rotate) คีย์ที่อาจรั่วเป็นระยะ นอกจากนี้ควรพิจารณาเครื่องมือรีวิวแบบ multimodal ที่ “เปิดอ่านรูปภาพจริง” ตามที่นักวิจัยเสนอ ซึ่งในการทดสอบสด 80 PR สามารถสกัดการโจมตีได้เกือบทั้งหมด เหลือหลุดเพียงรายการเดียวและไม่มี false alarm
