วิธีที่เรา root Copilot ได้
(research.eye.security)- ในเดือนเมษายน 2025 มีการอัปเดต Copilot Enterprise ให้มี Python sandbox แบบเรียลไทม์ (อิงกับ Jupyter Notebook) ทำให้สามารถ รันโค้ดฝั่งแบ็กเอนด์ ได้
- ผ่านไวยากรณ์ %command ของ Jupyter จึงสามารถรันโค้ดตามอำเภอใจบนระบบพื้นฐานได้ง่าย และยังรันคำสั่งลินุกซ์ได้ในสิทธิ์ของผู้ใช้ ubuntu (สภาพแวดล้อม miniconda)
- มีช่องโหว่ด้านความปลอดภัยที่ทำให้ พาธ /app/miniconda/bin สามารถเขียนได้โดยผู้ใช้ ubuntu และยังอยู่ก่อนใน $PATH ของ root ด้วย จึงสามารถเขียนทับคำสั่งสำคัญอย่าง
pgrepได้ - มีการใช้ประโยชน์จากช่องโหว่นี้เพื่อยกระดับเป็นสิทธิ์ root ได้ แต่ภายในคอนเทนเนอร์ถูกแยกอย่างเข้มงวด ทำให้ ไม่สามารถ escape ออกจากคอนเทนเนอร์ได้ และไม่มีข้อมูลเพิ่มเติมรั่วไหล
- ช่องโหว่นี้ถูกรายงานในเดือนเมษายน และถูก แพตช์ในเดือนกรกฎาคมโดยจัดเป็นความเสี่ยงระดับปานกลาง โดยไม่มีเงินรางวัล มีเพียงการใส่ชื่อไว้ในรายชื่อนักวิจัย
การวิเคราะห์ช่องโหว่ของ Microsoft Copilot Enterprise Jupyter Sandbox
ภาพรวมของสภาพแวดล้อม Copilot Enterprise Jupyter
- ตั้งแต่เดือนเมษายน 2025 เป็นต้นมา Copilot Enterprise ได้เพิ่ม Python sandbox ที่อิงกับ Jupyter Notebook
- ผู้ใช้สามารถรันคำสั่งระบบลินุกซ์ได้ผ่านไวยากรณ์ %command ของ Jupyter
- สภาพแวดล้อมทำงานบนสิทธิ์ผู้ใช้ ubuntu ที่อิงกับ miniconda และไม่มีไบนารี
sudo - สามารถสำรวจตัวแปรสภาพแวดล้อม เครือข่าย ระบบไฟล์ และข้อมูลโปรเซสได้อย่างหลากหลาย
การทำงานและโครงสร้างภายในคอนเทนเนอร์
- Copilot คล้ายกับ ChatGPT sandbox แต่ใช้ เคอร์เนลใหม่กว่าและ Python 3.12
- โปรเซสหลักได้แก่ Jupyter Notebook,
goclientappที่เขียนด้วย Go (รันบนพอร์ต 6000),httpproxyเป็นต้น - เครือข่ายเปิดใช้งานเฉพาะ loopback และอินเทอร์เฟซ link-local แบบจำกัด
- ระบบไฟล์ใช้ OverlayFS โดยอิงจากพาธ /legion และมีสคริปต์แบบคัสตอมอยู่ใน /app
การดาวน์โหลดและการจัดการไฟล์
- ไฟล์ข้อความ/ผลลัพธ์จากคำสั่งสามารถดาวน์โหลดได้ตามปกติ แต่ ไฟล์ไบนารีมีความเสี่ยงที่จะเสียหาย จึงจำเป็นต้องเข้ารหัสแบบ base64
- ไฟล์จะอยู่ที่ /mnt/data และมีการสร้างลิงก์ดาวน์โหลดภายนอกในรูปแบบ blob URL
โครงสร้างของ goclientapp/httpproxy
goclientapp: รับโค้ด (รูปแบบ JSON) จากภายนอกผ่านเอนด์พอยต์ /execute แล้วนำไปรันในสภาพแวดล้อม Jupyter ก่อนส่งผลลัพธ์กลับhttpproxy: พร็อกซีทราฟฟิก HTTP ขาออกจาก Jupyter (อยู่ในสถานะปิดการใช้งานด้วยENABLE_EGRESS=false)
ช่องโหว่ในสคริปต์ entrypoint.sh
- ใน
entrypoint.shซึ่งเป็นสคริปต์ entry point ของคอนเทนเนอร์ มีหลายบริการ (goclientapp,httpproxyapp) ที่รันด้วยสิทธิ์ผู้ใช้ ubuntu - มีเพียง
keepAliveJupyterSvc.shเท่านั้นที่ยังคงรันด้วยสิทธิ์ root อย่างต่อเนื่อง - บรรทัดที่ 28 มีคำสั่ง
pgrep -f "jupyter notebook --ip=0.0.0.0 --port=8888"ซึ่งทำงานตามลำดับความสำคัญของไดเรกทอรีใน $PATH /app/miniconda/binอยู่ก่อน/usr/binใน PATH ของทั้ง root และผู้ใช้ ubuntu → จึงสามารถแทนที่คำสั่งอย่างpgrepได้ตามต้องการ
ขั้นตอนการได้สิทธิ์ root และข้อจำกัด
- ผู้โจมตีสร้างสคริปต์
pgrepอันตรายไว้ใน/app/miniconda/binทำให้entrypoint.shเรียกใช้ไฟล์นี้เป็นระยะด้วยสิทธิ์ root - สคริปต์ดังกล่าวจะอ่านไฟล์ /mnt/data/in แล้วรันเป็นคำสั่งเชลล์ จากนั้นบันทึกผลลัพธ์ไว้ที่ /mnt/data/out
- วิธีนี้ทำให้ได้สิทธิ์ root ภายในคอนเทนเนอร์สำเร็จ แต่ยังไม่สามารถเข้าถึงข้อมูลอ่อนไหว เช่น ไฟล์ใน /root หรือ log ต่าง ๆ ได้ และไม่สามารถ escape ออกจากคอนเทนเนอร์ได้
- คอนเทนเนอร์นี้มีการแพตช์สถานการณ์ breakout ต่าง ๆ ไว้แล้วทั้งหมด
การตอบสนองของ Microsoft และผลลัพธ์
- 18 เมษายน 2025: Eye Security ส่งรายงานช่องโหว่ไปยัง MSRC
- 25 กรกฎาคม 2025: Microsoft จัดประเภทเป็น ความรุนแรงระดับปานกลาง (moderate severity) ทำการแพตช์ ปิดเคส และใส่ชื่อไว้ในรายชื่อนักวิจัย (ไม่มีการจ่าย bug bounty)
ข้อมูลอ้างอิงและภาคผนวก
-
Eye Security เป็นบริษัทความมั่นคงปลอดภัยไซเบอร์ในยุโรปที่ให้บริการเฝ้าระวังภัยคุกคามตลอด 24/7 การตอบสนองต่ออินซิเดนต์ ประกันภัยไซเบอร์ ฯลฯ
-
กรณีการเจาะบริการภายในของ Microsoft (เช่น Entra OAuth) รวมถึงช่องโหว่นี้ มีกำหนดนำเสนอในงาน BlackHat USA 2025
-
ไทม์ไลน์
- 18 เมษายน 2025 – รายงานต่อ MSRC
- 25 กรกฎาคม 2025 – แพตช์และปิดเคส พร้อมเผยแพร่บล็อกโพสต์
1 ความคิดเห็น
ความเห็นจาก Hacker News