นักวิจัยสามารถ Escape ออกจาก Sandbox ของ OpenAI Codex ทำให้รันคำสั่งบนเครื่อง Host ได้

นักวิจัยด้านความปลอดภัยค้นพบช่องทางในการ Escape ออกจาก Sandbox ของ OpenAI Codex ถึงสองช่องทาง โดยหนึ่งในนั้นสามารถรันคำสั่งบนเครื่องของนักพัฒนาได้จากโหมดที่ถูกจำกัดสิทธิ์มากที่สุดของ Codex โดยไม่มีหน้าต่างขออนุมัติ และไม่มีการแสดงผลใด ๆ บนหน้าจอ

ช่องโหว่ทั้งสองรายการถูกรายงานให้ OpenAI ทราบเมื่อวันที่ 12 สิงหาคม และได้รับการแก้ไขภายในแปดวัน ตามรายงานของ Oren Yomtov จาก Accomplish AI

ช่องโหว่ที่ร้ายแรงกว่าซึ่งนักวิจัยเรียกว่า Heapjack ทำให้การใช้งานตามปกติกลายเป็นการรันโค้ดที่เป็นอันตรายจากระยะไกล (Remote Code Execution) ได้ เพียงเปิด Repository ของผู้อื่นใน Codex แล้วถามคำถามเกี่ยวกับโค้ดนั้น ผู้ที่เขียน Repository ดังกล่าวก็จะสามารถรันคำสั่งบนเครื่องของผู้ใช้ได้โดยอยู่นอก Sandbox

Codex เป็น Coding Agent ของ OpenAI ที่ให้บริการทั้งในรูปแบบเครื่องมือ Command-line และแอปพลิเคชันบนเดสก์ท็อป เช่นเดียวกับ Agent รายอื่นในตลาด Codex จะรันการทำงานของโมเดลอยู่ภายใน Sandbox เพื่อไม่ให้โค้ดที่ไม่น่าเชื่อถือเข้าถึงระบบส่วนอื่นได้ โดยการ Escape ทั้งสองรูปแบบนี้อาศัยการทำลายขอบเขตดังกล่าวจากภายใน

Heapjack

เทคนิค Heapjack ตามที่ระบุไว้ในรายงานของ Yomtov มุ่งเป้าไปที่คอมโพเนนต์ที่ชื่อว่า node_repl ซึ่ง Codex Desktop จะเขียนลงในไฟล์ '~/.codex/config.toml' อันเป็นไฟล์ตั้งค่าส่วนกลาง ตั้งแต่ขั้นตอนการติดตั้ง

โดยไม่มีขั้นตอนให้ผู้ใช้เลือกเปิดใช้งาน และไม่มีการตั้งค่าใดที่จะปิดการทำงานได้ อีกทั้งเนื่องจากรายการดังกล่าวอยู่ในไฟล์ตั้งค่าที่ใช้ร่วมกัน ผู้ใช้งาน Codex CLI ทั่วไปจึงได้รับเครื่องมือตัวเดียวกันนี้ไปด้วย โดยไม่เคยถูกสอบถามความยินยอมแต่อย่างใด

node_repl จะรัน Node.js เพียง Process เดียว แต่ภายในมี Execution Context ของ JavaScript แยกกันอยู่สองชุด ชุดแรกเป็นชุด trusted และบรรจุโค้ดของ OpenAI เอง ส่วนอีกชุดหนึ่งเป็นชุด untrusted และใช้รันโค้ดของ Agent โดย Context ที่เชื่อถือได้จะพิสูจน์ตัวตนด้วยการแสดง Token แบบสุ่มที่ถูกสร้างขึ้นใหม่ทุกครั้งที่มีการรัน

ปัญหาคือ Context ทั้งสองชุดอยู่ใน Node Process เดียวกัน และใช้หน่วยความจำ Heap ร่วมกัน ทำให้ Token ดังกล่าวเป็นเพียงสตริงที่วางอยู่ในหน่วยความจำ ซึ่งฝั่ง untrusted สามารถอ่านได้

 

โค้ดฝั่ง untrusted จะสร้าง Snapshot ของ Heap ด้วย 'v8.getHeapSnapshot()' จากนั้นจะทดลองใช้สตริงทุกตัวที่มีรูปแบบเป็น UUID หากเดาผิด ระบบจะตอบกลับว่า "not authorized" แต่หากเป็น Token ที่ถูกต้อง แต่ส่ง Arguments ที่ไม่ถูกต้องไป ระบบจะตอบกลับเป็นข้อผิดพลาดจากการตรวจสอบความถูกต้องจริง ๆ ซึ่งเป็นการบอกผู้โจมตีว่า Token นั้นถูกต้องแล้ว

เมื่อได้ Token มาแล้ว โค้ดฝั่งที่ไม่น่าเชื่อถือจะเขียนคำสั่งของตนเองลงบน Pipe เส้นเดียวกันกับที่ Context ที่เชื่อถือได้ใช้ติดต่อกับ Process แม่ที่เป็น Native และอยู่นอก Sandbox

Process หลักจะตรวจสอบ Token เห็นว่าเป็น Token ที่ถูกต้อง จึงดำเนินการตามคำสั่งนั้น โดย Proof-of-Concept (PoC) ได้ใช้คำสั่ง 'open' ของระบบในการเปิดแอปพลิเคชันขึ้นมานอก Process Tree ของ Codex ทั้งหมด ทั้งนี้สิทธิ์การเข้าถึงระดับเดียวกันนี้ยังครอบคลุมไปถึง Unix Socket ใด ๆ ก็ตาม ซึ่งเป้าหมายที่ชัดเจนที่สุดคือ Socket ของ Docker daemon รวมถึงเครื่องมือสำหรับแก้ไขไฟล์ตั้งค่าส่วนกลางด้วย

ทั้งหมดนี้เกิดขึ้นในโหมด Read-only ซึ่งเป็นโหมด Sandbox ที่เข้มงวดที่สุด และเป็นโหมดที่ Agent ไม่ควรจะเขียนข้อมูลใด ๆ ได้เลย

Overpatch

ช่องโหว่ที่สองที่ชื่อว่า Overpatch อยู่ใน Codex CLI ที่เป็น Open-source โดยในโหมด workspace-write นั้น Agent จะสามารถเขียนข้อมูลได้เฉพาะภายในโฟลเดอร์ของโปรเจกต์เท่านั้น และคำสั่ง Shell ที่มุ่งเป้าไปยัง Home Directory จะถูกปฏิเสธ

แต่นักวิจัยสามารถทำให้ apply_patch ซึ่งเป็นเครื่องมือสำหรับแก้ไขไฟล์ของ Codex เอง เขียนข้อมูลลงในตำแหน่งดังกล่าวได้

เครื่องมือดังกล่าวจะให้สิทธิ์ในการเขียนแก่โฟลเดอร์หลักของทุกพาธที่ถูกระบุไว้ใน Patch ดังนั้นหากระบุ '/tmp' เข้าไป ก็จะเท่ากับเป็นการให้สิทธิ์ในการเขียนถึงระดับ root ของดิสก์

Exploit ที่ใช้งานได้จริงจะใช้ Patch ที่มีการแก้ไขสองรายการ ได้แก่

  • รายการแรกที่ระบุ '/tmp' ซึ่งไม่ได้ทำสิ่งใดที่เป็นประโยชน์ นอกจากขยายขอบเขตของสิทธิ์
  • รายการที่สองที่เพิ่มบรรทัดคำสั่งต่อท้ายลงในไฟล์ '.zshrc' ผ่าน Symlink ที่ชี้เข้าไปยัง Home Directory

หากนำการแก้ไขรายการแรกออกไป การเขียนไฟล์จะถูกปฏิเสธ แต่หากมีรายการดังกล่าวอยู่ Terminal หน้าต่างถัดไปที่นักพัฒนาเปิดขึ้นมา ก็จะรันบรรทัดคำสั่งของผู้โจมตีโดยอยู่นอก Sandbox

ต้นตอของปัญหาที่เหมือนกัน

Bug ทั้งสองรายการมีรูปแบบเดียวกัน คือกลไกที่ทำหน้าที่บังคับใช้ข้อจำกัด กลับไปอยู่ภายในสิ่งที่ตนเองต้องบังคับใช้ โดย apply_patch คำนวณสิทธิ์ของตัวเองจากข้อมูลที่ผู้โจมตีเป็นผู้ป้อนเข้ามา ส่วน node_repl เก็บ secret ที่ใช้แบ่งแยกโค้ด trusted ออกจากโค้ดที่ untrusted ไว้ในหน่วยความจำเดียวกันกับโค้ดที่ untrusted นั้นเอง

ในทั้งสองกรณี Sandbox ถูกสั่งจากภายในให้ปล่อยคำสั่งผ่านออกไป

ช่องโหว่ประเภทนี้ไม่ใช่เรื่องใหม่ โดยเมื่อเดือนกรกฎาคม 2026 นักวิจัยจาก Pillar Security ได้สาธิตแนวคิดเดียวกันนี้บน Cursor, Codex, Gemini CLI และ Antigravity ของ Google ซึ่ง Agent ที่ยังคงอยู่ภายใน Sandbox ของตนเองจะเขียนไฟล์ขึ้นมา แล้วเครื่องมือที่ trusted ซึ่งอยู่นอก Sandbox จะนำไฟล์นั้นไปรันในภายหลัง

จากการตอบสนองต่อโพสต์ของ Yomtov บน X ผู้ใช้งานรายหนึ่งให้ความเห็นว่า "V8 contexts แยกเฉพาะ Globals ออกจากกัน ไม่ได้แยกหน่วยความจำ ดังนั้น Sandbox นี้จึงเป็นเพียงสิ่งที่ระบุไว้แต่ตัว heap ไม่ได้รองรับการทำงานดังกล่าวจริง" ขณะที่อีกรายหนึ่งเรียก Trust Boundary นี้ว่าเป็นเพียงฉากกั้นห้อง ส่วนพฤติกรรมที่เปิดใช้งานเป็นค่าเริ่มต้นก็ถูกตั้งข้อสังเกตเช่นกัน โดยมีผู้ตั้งคำถามว่า เหตุใด Token ที่มีสิทธิ์สูงจึงสามารถเข้าถึงได้จาก JavaScript ที่ไม่น่าเชื่อถือตั้งแต่แรก

แนวทางรับมือ

OpenAI ได้แก้ไขช่องโหว่ Heapjack ใน Codex Desktop build 26.818.21641 และแก้ไข Overpatch ใน Codex CLI 0.149.0 ตามข้อมูลจาก Accomplish

ผู้ใช้งานควรอัปเดตไปยังเวอร์ชันดังกล่าว หรือเวอร์ชันที่ใหม่กว่า โดย Yomtov ได้ชื่นชม OpenAI ที่สามารถแก้ไขปัญหาทั้งสองรายการได้ภายในแปดวันนับจากวันที่รายงานเข้าไป

โดยโฆษกของ OpenAI ได้กล่าวขอบคุณนักวิจัยว่า "เราขอขอบคุณนักวิจัยที่ติดต่อเข้ามา และแบ่งปันสิ่งที่ค้นพบ เราได้แก้ไขช่องโหว่ทั้งสองรายการไปแล้วเมื่อเดือนสิงหาคม แต่บริษัทยังคงเสริมความแข็งแกร่งให้กับ Sandbox ของเราอย่างต่อเนื่อง ด้วยการอัปเดตล่าสุดที่เพิ่มความเข้มงวดในการควบคุมตำแหน่งที่ Agent สามารถเขียนไฟล์ได้ และขยายขอบเขตการทดสอบมาตรการป้องกันเหล่านั้นให้ครอบคลุมทุกแพลตฟอร์ม"

ที่มา : bleepingcomputer