สรุปสั้น
บริษัท Datadog เปิดเผยช่องโหว่ระดับวิกฤตใน OpenCode ซึ่งเป็นเอเจนต์เขียนโค้ด AI แบบโอเพนซอร์ส โดยช่องทางโจมตีนี้เปิดทางให้เว็บไซต์อันตรายสามารถรันคำสั่งบนเครื่องคอมพิวเตอร์ของนักพัฒนาได้ ช่องโหว่ถูกติดตามในรหัส GHSA-632h-h47v-g4x4 เป็นการรวมกันของ content-type confusion ใน /global/upgrade API ของ OpenCode กับการจัดการ target สำหรับอัปเกรดที่ผู้โจมตีควบคุมได้อย่างไม่ปลอดภัย OpenCode เปิดตัวเมื่อเดือนมิถุนายน 2025 และผสานโมเดลภาษาเข้ากับ workflow ของนักพัฒนา เว็บไซต์ของโครงการระบุว่ามี GitHub star กว่า 208,000 ดวงและนักพัฒนาที่ใช้งานราว 16 ล้านคนต่อเดือน ทำให้ช่องโหว่นี้มีนัยสำคัญต่อความปลอดภัยของ software supply chain
องค์ประกอบที่ได้รับผลกระทบคือหน้าอินเทอร์เฟซเบราว์เซอร์ของ OpenCode ที่เริ่มด้วยคำสั่ง opencode serve หรือ opencode web ซึ่งโดยค่าเริ่มต้นจะรับฟังที่ 127.0.0.1:4096 โดยไม่มีการยืนยันตัวตน ตามงานวิจัยของ Datadog Security Labs เวอร์ชัน 1.14.30 ถึง 1.18.21 มีช่องโหว่เมื่อติดตั้งผ่าน npm, pnpm หรือ Bun และแก้ไขแล้วใน OpenCode 1.18.22 เงื่อนไขการถูกโจมตีมีเพียงแค่ผู้ใช้ที่ติดตั้งเวอร์ชันที่มีช่องโหว่เปิดหน้าเว็บที่ถูกดัดแปลงขณะที่เซิร์ฟเวอร์ OpenCode กำลังทำงานอยู่
รายละเอียดข่าว
เว็บไซต์ Cyber Security News รายงานโดยอ้างงานวิจัยของบริษัท Datadog ว่า ปลายทาง /global/upgrade ส่งค่า target ต่อไปยังคำสั่งของ package manager ที่ตั้งใจให้ติดตั้ง opencode-ai@VERSION แต่ข้อกำหนดของแพ็กเกจ npm ยังยอมรับ URL ที่ชี้ไปยัง remote tarball ได้ด้วย ผลคือผู้โจมตีสามารถแทนที่ด้วย archive ที่โฮสต์ไว้ซึ่งบรรจุไฟล์ package.json ที่มี preinstall lifecycle script มุ่งร้าย ทำให้คำสั่งของผู้โจมตีถูกรันด้วยสิทธิ์ของกระบวนการ OpenCode
แม้บริการจะผูกกับ localhost แต่นักวิจัยแสดงให้เห็นว่าเว็บเพจที่เป็นอันตรายสามารถทำให้เบราว์เซอร์ของเหยื่อเข้าถึง local API นี้ได้ ปกติแล้วคำขอ fetch() ของ JavaScript ที่ใช้ application/json จะกระตุ้น CORS preflight และถูกบล็อก แต่การโจมตีนี้กลับส่งฟอร์ม HTML แบบ top-level navigation ซึ่งเป็นเส้นทางที่ CORS และการป้องกัน Local Network Access หยุดไม่ได้ จุดอ่อนสำคัญคือ raw request handler ของ OpenCode ที่พยายาม parse เนื้อหาของทุกคำขอเป็น JSON โดยไม่ตรวจว่า content type ที่ประกาศมาเป็น application/json จริงหรือไม่ ด้วยการใช้ enctype=“text/plain” และจัดรูป name/value ของ hidden field ผู้โจมตีจึงทำให้เบราว์เซอร์สร้าง JSON ที่ถูกต้องซึ่งชี้ปลายทาง upgrade ไปยัง tarball ของผู้โจมตี แล้วการติดตั้งก็กระตุ้น lifecycle script ให้ทำงาน

รายละเอียดช่องโหว่
ตัวเลขสาธารณะจาก npm ที่ Datadog อ้างถึงแสดงว่า 82 เวอร์ชันที่มีช่องโหว่มียอดดาวน์โหลดกว่า 647,000 ครั้งระหว่างวันที่ 17–23 กันยายน 2569 คิดเป็น 38.9% ของยอดดาวน์โหลด OpenCode ในช่วงเวลานั้น แม้ตัวเลขนี้จะไม่ได้บอกจำนวนการติดตั้งที่ไม่ซ้ำหรือจำนวนผู้ใช้ที่เปิดบริการเว็บก็ตาม เส้นทางโค้ดที่เป็นปัญหาเข้ามาในโครงการเมื่อวันที่ 29 เมษายน และเวอร์ชัน 1.14.30 ที่ปล่อยในวันถัดมาก็ได้รับผลกระทบ Datadog ค้นพบและแจ้งแบบปิดเมื่อวันที่ 11 สิงหาคม โดยไม่มีการขอออกเลข CVE ผู้ป้องกันจึงต้องติดตามด้วยรหัส GitHub advisory แทน
แพตช์ที่ปล่อยเมื่อวันที่ 24 สิงหาคมใช้แนวทางป้องกันเชิงลึก โดยตรวจสอบว่า target ของการอัปเกรดเป็น semantic version ที่ถูกต้อง เพื่อป้องกันการชี้ไปยัง URL ของแพ็กเกจตามอำเภอใจ และแทนที่ raw handler ด้วย content-aware handler ที่ปฏิเสธการส่งแบบ text/plain โดย OpenCode 1.18.22 จะตอบกลับ HTTP 415 “Unsupported Media Type” สำหรับคำขอในรูปแบบที่ใช้สาธิตการโจมตี ทั้งนี้การตั้งรหัสผ่านช่วยลดความเสี่ยงได้ แต่ไม่สามารถทดแทนการแพตช์ เพราะ credential แบบ basic authentication ที่ถูกแคชไว้ในเบราว์เซอร์อาจถูกแนบไปกับคำขอมุ่งร้ายได้อยู่ดี
ผลกระทบ
ช่องโหว่นี้อันตรายเพราะเปลี่ยนการเปิดหน้าเว็บธรรมดาให้กลายเป็นการรันโค้ดบนเครื่องนักพัฒนา ซึ่งมักเป็นเครื่องที่มี credential, source code, คีย์คลาวด์ และสิทธิ์เข้าถึงระบบสำคัญจำนวนมาก การที่ OpenCode มีฐานผู้ใช้ระดับหลายล้านคนต่อเดือนทำให้ผลกระทบต่อ software supply chain กว้างเป็นพิเศษ เพราะเครื่องนักพัฒนาที่ถูกยึดสามารถกลายเป็นจุดเริ่มของการโจมตีที่ลามไปยัง repository, pipeline CI/CD และระบบภายในองค์กร จุดที่น่ากังวลคือเงื่อนไขการโจมตีต่ำมาก เพียงเปิดหน้าเว็บขณะรันบริการเว็บของ OpenCode ก็เพียงพอ และการที่ไม่มีการขอเลข CVE อาจทำให้บางองค์กรที่พึ่งการติดตามด้วย CVE เพียงอย่างเดียวมองข้ามช่องโหว่นี้ไป กรณีนี้ยังตอกย้ำความเสี่ยงเฉพาะของเครื่องมือ AI สำหรับนักพัฒนาที่มักเปิดบริการ local โดยไม่มีการยืนยันตัวตนเป็นค่าเริ่มต้น
คำแนะนำ
- อัปเกรด OpenCode เป็นเวอร์ชัน 1.18.22 หรือใหม่กว่าทันที แล้วรีสตาร์ตกระบวนการ OpenCode ที่กำลังทำงานอยู่ พร้อมตรวจสอบเวอร์ชันและวิธีการติดตั้งที่ใช้จริง
- ตั้งค่า OPENCODE_SERVER_PASSWORD ทุกครั้งที่ใช้อินเทอร์เฟซเว็บ และหลีกเลี่ยงการเปิดบริการออกนอกขอบเขต localhost แต่ต้องถือว่าการตั้งรหัสผ่านเป็นมาตรการเสริม ไม่ใช่สิ่งทดแทนการแพตช์
- เฝ้าระวังกิจกรรมของ package manager ที่ไม่คาดคิด การรัน lifecycle script และการดาวน์โหลดออกนอกเครือข่าย เป็นสัญญาณที่อาจบ่งชี้การถูกโจมตี
- เนื่องจากช่องโหว่นี้ไม่มีเลข CVE ทีมความปลอดภัยควรติดตามด้วยรหัส GitHub advisory (GHSA-632h-h47v-g4x4) และปรับ workflow การจัดการช่องโหว่ให้ครอบคลุม advisory ที่ไม่ได้ออกเป็น CVE ด้วย
