- พบ ช่องโหว่ Remote Code Execution ร้ายแรง ใน OpenCode เวอร์ชันเก่า ที่ทำให้สามารถรันโค้ดตามอำเภอใจได้โดยไม่ต้องยืนยันตัวตน
- เวอร์ชันก่อน v1.1.10 จะ รัน HTTP server อัตโนมัติ และเซิร์ฟเวอร์นี้อนุญาตให้ รันคำสั่งตามอำเภอใจ อ่านไฟล์ และสร้าง terminal session ได้โดยไม่มีขั้นตอนยืนยันตัวตน
- ก่อน v1.0.216 มีความเป็นไปได้ที่ เพียงแค่เข้าชมเว็บไซต์ ก็ทำให้โค้ดถูกรันบนสภาพแวดล้อมโลคัลของผู้ใช้ได้
- ในเวอร์ชันล่าสุด (v1.1.10) เซิร์ฟเวอร์ถูกปิดใช้งานโดยค่าเริ่มต้นแล้ว แต่ หากเปิดใช้งานก็ยังไม่มีการยืนยันตัวตนอยู่ดี
- ช่องโหว่นี้ถูกลงทะเบียนเป็น CVE-2026-22812 และนักพัฒนากับผู้ใช้ควรอัปเดตและตรวจสอบการตั้งค่าโดยทันที
ภาพรวมของช่องโหว่
- OpenCode เป็น AI coding assistant แบบโอเพนซอร์ส โดยก่อน v1.1.10 เมื่อตอนรันจะเริ่ม HTTP server (พอร์ตเริ่มต้น 4096+) โดยอัตโนมัติ
- เซิร์ฟเวอร์มี endpoint เช่น
POST /session/:id/shell, POST /pty, GET /file/content
- เนื่องจากไม่มีขั้นตอนยืนยันตัวตน ไคลเอนต์ทุกตัวที่เชื่อมต่อได้จึงสามารถ รันโค้ดด้วยสิทธิ์ของผู้ใช้ ได้
- เมื่อเซิร์ฟเวอร์ทำงาน จะ ไม่มีตัวบ่งชี้ทางภาพ ให้ผู้ใช้เห็น ทำให้รับรู้ได้ยากว่ากำลังเปิดเผยอยู่หรือไม่
- นโยบาย CORS ถูก hardcode เป็น
*.opencode.ai ทำให้หน้าเว็บที่ให้บริการจาก opencode.ai หรือซับโดเมน สามารถเข้าถึง API ของเซิร์ฟเวอร์ได้
- หากโดเมนนั้นถูกเจาะหรือมีช่องโหว่ XSS ผู้ใช้ทั้งหมดที่เปิดเซิร์ฟเวอร์อยู่ก็อาจตกเป็นเป้าหมายการโจมตีได้
เวกเตอร์การโจมตี
- ก่อน v1.0.216: เว็บไซต์ใดก็ได้ สามารถรันโค้ดบนเครื่องโลคัลของผู้ใช้ที่กำลังเปิด OpenCode อยู่ได้
- ก่อน v1.1.10: local process หรือหน้า localhost สามารถรันโค้ดได้โดยไม่ต้องยืนยันตัวตน
- ในทุกเวอร์ชันหากเปิดใช้งานเซิร์ฟเวอร์:
- local process และ หน้า localhost สามารถรันโค้ดได้โดยไม่ต้องยืนยันตัวตน
- หากใช้แฟลก
--mdns จะทำให้ อุปกรณ์ทั้งหมดในเครือข่ายโลคัล เข้าถึงได้
- ไม่มีตัวบ่งชี้ว่าเซิร์ฟเวอร์กำลังทำงานอยู่ ทำให้ผู้ใช้ไม่รู้ว่าตัวเองกำลังเปิดเผยอยู่
- สามารถรันโค้ดได้จาก โดเมน opencode.ai หรือซับโดเมน
ตัวอย่างการโจมตี (Proof of Concept)
- การโจมตีแบบโลคัล: เมื่อเซิร์ฟเวอร์กำลังทำงาน local process สามารถใช้คำสั่ง
curl เพื่อสร้างเซสชัน แล้วรันคำสั่ง id > /tmp/pwned.txt ได้
- การโจมตีผ่านเบราว์เซอร์ (ก่อน v1.0.216): หน้าเว็บสามารถส่งคำขอ
fetch ไปยังเซิร์ฟเวอร์โลคัลเพื่อส่งคำสั่ง และดาวน์โหลดกับรันสคริปต์ระยะไกลได้
- ยืนยันการทำงานบน Firefox แล้ว ส่วน Chrome อาจแสดงหน้าต่างยืนยันผู้ใช้เนื่องจากมีการป้องกันการเข้าถึงเครือข่ายโลคัล
แนวทางรับมือสำหรับผู้ใช้
- ตรวจสอบเวอร์ชันด้วย
opencode --version แล้ว อัปเดตเป็น v1.1.10 ขึ้นไป
- ตรวจสอบในไฟล์ตั้งค่าว่ามีการเปิดใช้งาน
server.port หรือ server.hostname หรือไม่
- หลีกเลี่ยงการใช้แฟลก
--mdns (จะ bind กับ 0.0.0.0 และเปิดเผยทั้งเครือข่าย)
- หากจำเป็นต้องใช้เซิร์ฟเวอร์ ห้ามเข้า opencode.ai และซับโดเมน
- ควรตระหนักว่าเมื่อเปิดเซิร์ฟเวอร์แล้ว local process สามารถเข้าถึงได้โดยไม่ต้องยืนยันตัวตน
ไทม์ไลน์การเปิดเผย
- 2025-11-17: รายงานครั้งแรกทางอีเมล, ไม่มีการตอบกลับ
- 2025-12-27: ส่ง GitHub Security Advisory, ไม่มีการตอบกลับ
- 2025-12-29: ผู้ใช้อีกคนเผยแพร่รายงานสู่สาธารณะ
- 2025-12-30: ใช้ ข้อจำกัด CORS ใน v1.0.216
- 2026-01-09: ใน v1.1.10 มีการ ปิดเซิร์ฟเวอร์โดยค่าเริ่มต้น
- 2026-01-11: เปิดเผยข้อมูลทั้งหมด
มาตรการที่แนะนำ
- จำกัด CORS ให้เหลือเฉพาะโดเมนเท่าที่จำเป็น (ใช้แล้วใน v1.0.216)
- ปิดการทำงานของเซิร์ฟเวอร์โดยค่าเริ่มต้น (ใช้แล้วใน v1.1.10)
- เพิ่ม ขั้นตอนยืนยันตัวตน ให้กับทุกคำขอที่ส่งมายังเซิร์ฟเวอร์
- เมื่อเซิร์ฟเวอร์ทำงาน ควร แสดงตัวบ่งชี้ที่ชัดเจน ให้ผู้ใช้เห็น
- ระบุในเอกสารให้ชัดว่าออปชัน
--mdns จะ bind กับ 0.0.0.0
- ใช้ TLS กับการสื่อสารผ่านเครือข่าย
- เผยแพร่ GitHub Security Advisory และ CVE-2026-22812 อย่างเป็นทางการ
- เพิ่มการ เฝ้าติดตาม อีเมลสำหรับรายงานด้านความปลอดภัยและการแจ้งเตือน GHSA
- ทำให้ ความสัมพันธ์ด้านความเชื่อถือ ระหว่างผู้ดูแล OpenCode, opencode.ai และผู้ใช้ มีความชัดเจน
อ้างอิง
- CVE: CVE-2026-22812
- แพ็กเกจที่ได้รับผลกระทบ: npm
opencode-ai
- ข้อมูลล่าสุดและช่องทางติดต่อ: cy.md
1 ความคิดเห็น
ความเห็นจาก Hacker News
ในฐานะผู้ดูแล ยอมรับว่ารับมือกับ การตอบสนองต่อรายงานด้านความปลอดภัย ครั้งนี้ได้ไม่ดีพอ
การใช้งานเพิ่มขึ้นอย่างรวดเร็วจนมี issue ถาโถมเข้ามา และสัปดาห์นี้มีแผนจะพบผู้เชี่ยวชาญเพื่อเดินหน้า โปรแกรม bug bounty และการตรวจสอบความปลอดภัย
สิ่งสำคัญกว่าคือให้ทุกคนในทีมเข้าใจและนำ OWASP Insecure Design Guide ไปปฏิบัติ
เนื่องจาก OpenCode เป็นโอเพนซอร์ส coding agent ที่มีชื่อเสียง จึงเป็นไปได้ว่าอาจถูกนำไปใช้โจมตีแล้ว
คิดว่าตอนนี้อย่างน้อยก็ควรรันโมเดลใน สภาพแวดล้อม sandbox อย่าง gVisor
ถ้าไม่ตอบสนองให้เร็วพอ ก็อาจมีผู้โจมตีที่มุ่งหาช่องโหว่ RCE เพิ่มขึ้น
เลยสงสัยว่าอ้างอิง หลักการบริหารองค์กรแบบอนาธิปไตย อะไรอยู่ด้วยหรือเปล่า
หลายคนรันเครื่องมืออย่าง OpenCode ในเครื่องตัวเองแบบไม่มีการแยกสิทธิ์
ตัวปลั๊กอินเองก็ออกแบบมาโดยตั้งต้นว่ามีสิทธิ์เข้าถึงได้ไม่จำกัด และยังใช้ทรัพยากรสูงด้วย
อย่างน้อยควรรันใน dev-container หรือ VM และเชื่อมเฉพาะไฟล์ที่ต้องใช้ผ่าน SSHFS หรือ Samba
ถ้าขี้เกียจ ก็ใช้ VPS เดือนละ 5 ดอลลาร์ก็ได้
ถ้าจะรันเซิร์ฟเวอร์ด้วย qemu แนะนำ quickemu
ฟีเจอร์ SSH remote ของ zed ก็มีประโยชน์ เลยใช้ร่วมกับ Claude Code หรือ OpenCode ได้
แม้การแก้ CORS จะป้องกันการโจมตีจากเว็บไซต์ภายนอกได้ แต่ปัญหาพื้นฐานคือ โครงสร้างที่ทำให้รันโค้ดบน localhost ได้
Neovim ใช้ domain socket เป็นค่าเริ่มต้น และ SSH daemon ของ VS Code ก็มีขั้นตอนยืนยันตัวตน
local server ที่รันอินพุตจากไคลเอนต์โดยไม่มีการยืนยันตัวตนคือช่องโหว่ LCE (Local Code Execution) และ
ถ้าเปิดให้เข้าถึงได้ผ่านคำขอจากเบราว์เซอร์ ก็จะขยายเป็น RCE (Remote Code Execution)
น่าตกใจมากที่ใส่ HTTP endpoint ที่ทำ RCE ได้โดยไม่ต้องยืนยันตัวตนไว้ในเครื่องมือ CLI แถมยังเพิ่ม การ bypass CORS เข้าไปอีก
กำหนดการเปิดเผยช่องโหว่ ก็เป็นปัญหา
มีการรายงานตั้งแต่ 2025-11-17 แต่แม้ติดต่อหลายครั้งก็ไม่ได้รับการตอบกลับ
ดู คอมเมนต์ใน GitHub issue
ต่อให้เซิร์ฟเวอร์จะปิดอยู่เป็นค่าเริ่มต้น ถ้าเปิดขึ้นมาก็ยังร้ายแรงอยู่ดี
หน้าเว็บอะไรก็ได้บน localhost สามารถ รันโค้ดได้ และยังรัน local process ได้โดยไม่ต้องยืนยันตัวตน
ไม่มีตัวบ่งชี้ให้ผู้ใช้รู้ด้วยว่าเซิร์ฟเวอร์กำลังทำงานอยู่หรือไม่
ปกติแอป TUI ได้รับความไว้วางใจเพราะไม่ทำเรื่องแบบนี้ แต่เหตุการณ์นี้ บั่นทอนความไว้วางใจอย่างหนัก
น่าแปลกใจที่ OpenCode ได้รับการสนับสนุนจาก YC (Y Combinator)
นึกว่า YC จะส่งเสริมวัฒนธรรมด้านความปลอดภัยที่ดีกว่านี้
ดูรายละเอียดในคอมเมนต์นี้
ตอนแรกนึกว่า OpenCode เป็นโปรเจกต์อาสาสมัคร แต่จริง ๆ แล้วเป็น โปรเจกต์เชิงธุรกิจที่ได้รับการสนับสนุนจากนักลงทุนรายใหญ่
เลิกใช้ไปแล้วเพราะมัวแต่เพิ่มฟีเจอร์แต่ ละเลยการบำรุงรักษาแกนหลัก
จุดประสงค์เดิมคืออยากใช้หลายโมเดลพร้อมกัน แต่ การแชร์คอนเท็กซ์ไม่มีประสิทธิภาพ จึงไม่ค่อยใช้งานได้จริง
ตอนนี้ใช้ Claude Code กับ Codex ควบคู่กันอยู่
ถึงอย่างนั้น ความต้องการ แพลตฟอร์มเปิดสำหรับรวมหลายโมเดล ก็ยังมีสูงมาก
ampcode ใช้ทำสคริปต์ง่าย ๆ ได้ฟรี และ Crush+GLM ก็ทำตามแผนของ Claude หรือ Codex ได้ดี
ตอนแรกชอบ Aider มาก แต่แทบไม่มีการดูแลรักษาแล้ว เลยเจอปัญหาบ่อย
กำลังจะติดตั้ง OpenCode แต่พอเห็นเรื่องครั้งนี้ก็เริ่มลังเล
น่าแปลกใจที่ โอเพนซอร์ส CLI LLM assistant ที่ไม่ผูกกับโมเดลใดโมเดลหนึ่ง มีตัวเลือกน้อยขนาดนี้