1 คะแนน โดย GN⁺ 2025-07-27 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ในเดือนเมษายน 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 ความคิดเห็น

 
GN⁺ 2025-07-27
ความเห็นจาก Hacker News
  • ประเด็นสำคัญของช่องโหว่นี้คือ เข้าใจได้ว่าเป็นการใช้ลูกเล่นเพื่อให้รันโค้ดด้วยสิทธิ์ root ได้ ทั้งที่เดิมออกแบบมาให้มีเพียงสิทธิ์ผู้ใช้ทั่วไปภายในคอนเทเนอร์เท่านั้น แต่ในทางปฏิบัติคอนเทเนอร์นี้ถูกแยกอย่างเข้มงวดมาก จนเข้าถึงเครือข่ายไม่ได้และหนีออกไปไม่ได้ ดังนั้นสิ่งที่ทำได้ด้วยสิทธิ์ root ก็มีแค่ทำคอนเทเนอร์ของตัวเองพัง
    • ต้องยอมรับว่า Microsoft ตั้งค่าความปลอดภัยได้รัดกุมมาก บริษัทส่วนใหญ่ไม่ได้แยกได้สมบูรณ์ขนาดนี้
    • ไม่แน่ใจว่าคอนเทเนอร์นี้ถูกทำขึ้นอย่างไรแน่ Microsoft ใช้วิธีมาตรฐานในการแยก Python sandbox (Azure container-apps session) และหวังว่าฟีเจอร์นี้ก็น่าจะใช้แบบนั้นหรืออย่างน้อยก็คล้ายกัน
    • รู้สึกแปลกนิดหน่อยที่ Copilot บางครั้งปฏิเสธการรันโค้ด แต่บางครั้งก็ยอมให้รัน เลยสงสัยว่าจริง ๆ แล้วตั้งเป้าไว้ถึงระดับไหน
    • ทุกวันนี้ช่องโหว่มักซ้อนกันเป็นสแต็ก คำว่า “คอนเทเนอร์ปลอดภัย” จึงหมายถึงแค่ว่าผู้โจมตียังหาช่องโหว่ไม่เจอ การหนีออกจากคอนเทเนอร์หรือ VM ก็เป็นวิธีโจมตีที่รู้จักกันอยู่แล้ว และแค่พลาดเล็ก ๆ เรื่องการตั้งค่าหรือบั๊กในไดรเวอร์ virtio ก็อาจถูกเจาะได้ กรณีนี้จึงถือว่าเป็นผลลัพธ์ที่สำคัญจริง
  • เห็นชื่ออย่าง “How We Rooted Copilot” แล้วนึกว่าเจาะ VM หลักของ Copilot ได้จริง แต่ความจริงคือแค่ได้สิทธิ์ root ในคอนเทเนอร์ Python sandbox ที่ถูกจำกัดอย่างหนักเท่านั้น ชื่อที่แม่นกว่าคือ “How We Rooted the Copilot Python Sandbox”
    • สรุปได้ประมาณว่า “ยกระดับสิทธิ์จากผู้ใช้ทั่วไปเป็น root ได้ภายใน sandbox ที่แยกโดยสมบูรณ์” ผลลัพธ์จริง ๆ แทบไม่มีความหมาย แต่กลับเป็นตัวอย่างที่แสดงว่า sandbox ช่วยป้องกันได้มีประสิทธิภาพแค่ไหน
  • ดูกระบวนการแฮ็กทั้งหมดได้จากที่นี่
  • ฉันเข้าใจเหตุการณ์นี้ว่าเป็นการหนีออกจาก Python sandbox แล้วทะลุถึงคอนเทเนอร์ได้ ดูเหมือนว่านี่คงเป็นเหตุผลที่ Microsoft จัดระดับความร้ายแรงของช่องโหว่ไว้ที่ปานกลาง (moderate)
  • ไม่แน่ใจว่าฉันพลาดอะไรไปหรือเปล่า แต่ไม่น่าจะยังพอลองเชื่อมต่อออกภายนอกผ่านเครือข่ายภายในได้หรือ? สงสัยว่า Microsoft มั่นใจจริงหรือว่าการปล่อยให้ลูกค้าได้สิทธิ์ root ในคอนเทเนอร์แบบนี้จะไม่มีความเสี่ยงเรื่องข้อมูลรั่วไหลหรือการโจมตีต่อเนื่อง
    • ตอนที่ openai เปิดฟีเจอร์ Python interpreter มาก่อน สถานการณ์ก็คล้ายกันมาก การเข้าถึงเครือข่ายภายนอกถูกปิดไว้ และสิ่งที่น่าสนใจก็มีแค่ไฟล์คอนฟิกภายในไม่กี่ไฟล์กับข้อมูลบางอย่างเกี่ยวกับวิธีที่นักพัฒนาเขียนโค้ด กรณีนี้ก็แทบเหมือนกันทุกอย่าง
  • จะรู้ได้อย่างไรว่าคำตอบที่ Copilot บอกมานั้นจริงหรือเป็นเรื่องเพ้อ (hallucination)? ฉันทำงานอยู่ที่นั่นและไม่เคยเห็นโปรเซสแบบนั้นเลย อ้างอิงไว้ว่าเจอสคริปต์ชื่อ keepAliveJupyterSvc.sh ในรีโพสาธารณะ
    • รีโพนั้นกับผู้ร่วมพัฒนาดูเหมือนจะเป็นคนของ MS/Azure จริง ๆ ที่กำลังพัฒนาบริการรันโค้ด Python ในคอนเทเนอร์ ไม่รู้ว่าทำไมถึงไปอยู่ในบัญชีส่วนตัว เขาว่าเป็นฟอร์กของโปรเจกต์ Office แต่หาต้นทางไม่เจอ
    • อาจไม่ใช่เรื่องเพ้อก็ได้ โค้ดของ Copilot อาจถูกสร้างมาจากชุดข้อมูลฝึกของ GitHub
    • อันนี้ให้ความรู้สึกว่าเป็นเรื่องเพ้อจริง ๆ แชตบอตส่วนใหญ่ก็เป็นแค่ตัวสร้างโทเค็นเท่านั้น ไม่ได้รันโปรแกรมจริงเพื่อตอบ แต่สร้างโทเค็นด้วย GPU แล้วแปลงเป็นภาษาอังกฤษส่งออกมา
  • เคยมีคนพูดกันว่า LLM รุ่นก่อน ๆ เรียนรู้จากเอกสารภายในบริษัทที่ไม่เปิดเผยและเปิดเผยความลับบริษัทออกมาได้ดี ตอนนี้ดูเหมือนข้อมูลส่วนใหญ่จะถูกคัดกรองแล้ว
    • ผมไม่เคยเห็นกรณีที่มีการฝึกด้วยข้อมูลลับจำนวนมากจริง ๆ และ LLM ก็ไม่ได้จดจำข้อมูลที่โผล่มาแบบครั้งเดียวโดยบังเอิญ เลยคิดว่าเป็นเรื่องไม่ค่อยสมจริง สิ่งที่เกิดขึ้นได้มีแค่การเพ้อของ LLM ทำให้ดูเหมือนเป็นการรั่วไหลของความลับจริงเท่านั้น
    • จากประสบการณ์ของผม ความลับของบริษัทหนึ่งมักไม่มีความหมายอะไรนักสำหรับบริษัทอื่น
    • สงสัยว่ามีตัวอย่างเฉพาะเจาะจงของกรณีแบบนี้ไหม เพราะผมไม่เคยเห็น
    • เมื่อก่อนแม้แต่บริษัททั่วไปที่ไม่ใช่สายเทคนิคก็เอาไปใช้โดยไม่มีแนวทาง จนสร้างคอนเทนต์นอกวัตถุประสงค์ได้เหมือนกัน เช่น บริษัทโบบา (ชานมไข่มุก) แห่งหนึ่งเคยปล่อย LLM ฟรีแบบไม่ต้องสมัคร และผมเคยใช้มันสร้าง bash script อยู่สองสามตัวก่อนที่ ChatGPT รุ่นฟรีจะออก
    • อยากรู้แหล่งที่มา
  • ดูแทบจะไม่ใช่ช่องโหว่เลย เพราะจุดประสงค์ของระบบนี้ก็คือการทำให้รันโค้ดในคอนเทเนอร์อยู่แล้ว
    • แน่นอนว่าจะมีความหมายก็ต่อเมื่อคอนเทเนอร์ยังถูกแยกอยู่จริง
  • ดูเหมือนว่าน่าจะเลี่ยงได้ง่ายกว่านี้ด้วยการให้ไบนารี sudo กับ Copilot ในรูปแบบ base64 แล้วค่อยใช้งาน
    • ถ้าจะทำแบบนั้น ก็คงต้องเปลี่ยนเจ้าของไฟล์เป็น root ด้วย
  • มีการรายงานช่องโหว่นี้ให้ Microsoft แล้ว และถูกจัดเป็น moderate เลยไม่ได้บั๊กบาวน์ตี มีแค่การกล่าวขอบคุณเท่านั้น ไม่ค่อยเข้าใจว่าบริษัทใหญ่ขนาดนี้ถึงไม่ให้รางวัลแม้แต่นิดเดียว ในสถานการณ์แบบนี้ก็อดสงสัยไม่ได้ว่าจะป้องกันไม่ให้เกิดเรื่องไม่ดีได้จริงหรือ
    • โดยเนื้อแท้แล้วไม่ได้อะไรมาเลย ต่อให้ได้สิทธิ์ root ก็แค่สำรวจบางส่วนของคอนเทเนอร์ที่เดิมเข้าไม่ถึง แต่ใน /root ก็ไม่มีไฟล์ และก็ไม่มีล็อกที่มีประโยชน์หลงเหลืออยู่ เทคนิคการหลบหนีที่รู้จักทั้งหมดก็ถูกแพตช์ไปแล้ว ถ้า Microsoft ต้องให้รางวัลกับวิธีอ้อมแบบนี้ทีละอย่างก็คงไม่มีวันจบ ดังนั้นถ้าไม่มีความเสี่ยงจริงจะไม่จ่ายเพิ่มก็พอเข้าใจได้ระดับหนึ่ง
    • ผมไม่เข้าใจจริง ๆ ว่าทำไมคนถึงส่งบั๊กรายงานให้บริษัทยักษ์ใหญ่มูลค่าหลายล้านล้านดอลลาร์ฟรี ๆ
    • ถ้า Microsoft ไม่จ่ายเงิน อย่างน้อยน่าจะให้ของที่ระลึกบ้าง ถ้าแจกของเจ๋ง ๆ ให้แฮ็กเกอร์ก็จะกลายเป็นโฆษณาไปในตัว และอาจทำให้อยากเข้าทำงานด้วย ควรใช้ประโยชน์จากวัฒนธรรมชุมชนแฮ็กเกอร์
    • ถึงจะได้ “root” มาก็ไม่ได้อะไรอยู่ดี ลองหลายวิธีก็ไม่พบอะไรเป็นชิ้นเป็นอัน