Cách chúng tôi root Copilot
(research.eye.security)- Vào tháng 4/2025, Copilot Enterprise được cập nhật thêm sandbox Python thời gian thực (dựa trên Jupyter Notebook), cho phép thực thi mã backend
- Thông qua cú pháp %command của Jupyter Notebook, việc thực thi mã tùy ý trên hệ thống nền khá dễ dàng, và các lệnh Linux cũng có thể chạy dưới người dùng ubuntu (môi trường miniconda)
- Có một lỗ hổng bảo mật khi đường dẫn /app/miniconda/bin cho phép người dùng ubuntu ghi và còn được ưu tiên trong $PATH của root, nên có thể ghi đè các lệnh quan trọng như
pgrep - Bằng cách khai thác điều này, nhóm nghiên cứu đã giành được quyền root, nhưng bên trong container được cô lập rất chặt nên không thể thoát container, cũng không có rò rỉ thêm thông tin nào
- Lỗ hổng này được báo cáo vào tháng 4 và đến tháng 7 thì được vá với mức rủi ro trung bình, không có tiền thưởng mà chỉ được ghi tên trong danh sách researcher
Phân tích lỗ hổng của Microsoft Copilot Enterprise Jupyter Sandbox
Tổng quan về môi trường Jupyter của Copilot Enterprise
- Từ tháng 4/2025, Copilot Enterprise đã triển khai sandbox Python dựa trên Jupyter Notebook
- Người dùng có thể thực thi lệnh hệ thống Linux thông qua cú pháp %command của Jupyter
- Môi trường chạy với quyền người dùng ubuntu trên nền miniconda, không có binary
sudo - Có thể khám phá nhiều thành phần như biến môi trường, mạng, hệ thống tệp, thông tin tiến trình, v.v.
Cách vận hành và cấu trúc bên trong container
- Copilot tương tự sandbox của ChatGPT nhưng dùng kernel mới hơn và Python 3.12
- Các tiến trình chính: Jupyter Notebook,
goclientappviết bằng Go (chạy trên cổng 6000),httpproxyv.v. - Mạng chỉ bật loopback và một số giao diện link-local bị hạn chế
- Hệ thống tệp dùng OverlayFS dựa trên đường dẫn
/legion, với các script tùy biến nằm trong/app
Tải xuống và thao tác tệp
- Có thể tải xuống bình thường các tệp văn bản / đầu ra lệnh, nhưng tệp nhị phân có nguy cơ bị hỏng, nên cần mã hóa base64
- Tệp nằm trong
/mnt/datavà tạo liên kết tải xuống bên ngoài dưới dạng blob URL
Cấu trúc goclientapp/httpproxy
goclientapp: nhận mã từ bên ngoài qua endpoint/execute(định dạng JSON), thực thi trong môi trường Jupyter rồi trả kết quảhttpproxy: proxy lưu lượng HTTP đi ra ngoài từ Jupyter (đang bị vô hiệu hóa vớiENABLE_EGRESS=false)
Lỗ hổng trong script entrypoint.sh
- Trong
entrypoint.sh, là script entrypoint của container, nhiều dịch vụ (goclientapp,httpproxyapp) chạy với quyền người dùng ubuntu - Chỉ có
keepAliveJupyterSvc.shtiếp tục chạy với quyền root - Ở dòng 28 có lệnh
pgrep -f "jupyter notebook --ip=0.0.0.0 --port=8888", hoạt động theo thứ tự ưu tiên thư mục trong$PATH /app/miniconda/binđứng trước/usr/bintrong PATH của cả root lẫn người dùng ubuntu → có thể thay thế tùy ý các lệnh nhưpgrep
Quá trình giành quyền root và các giới hạn
- Kẻ tấn công tạo một script
pgrepđộc hại trong/app/miniconda/bin, khiếnentrypoint.shđịnh kỳ thực thi tệp này với quyền root - Script đó đọc tệp
/mnt/data/in, thực thi nội dung như lệnh shell, rồi lưu kết quả vào/mnt/data/out - Bằng cách này, họ đã giành được quyền root bên trong container, nhưng vẫn không thể truy cập thông tin nhạy cảm như tệp trong
/root, log, v.v., cũng như không thể thoát container - Container đã được vá để chặn mọi kịch bản breakout khác nhau
Phản hồi của Microsoft và kết quả
- 18/4/2025: Eye Security gửi báo cáo lỗ hổng cho MSRC
- 25/7/2025: Microsoft phân loại là mức độ nghiêm trọng trung bình (moderate severity), vá xong thì đóng issue và ghi tên nhà nghiên cứu vào danh sách (không trả bug bounty)
Tham khảo và phụ lục
-
Eye Security là một công ty an ninh mạng có trụ sở tại châu Âu, cung cấp giám sát mối đe dọa 24/7, ứng phó sự cố, bảo hiểm mạng, v.v.
-
Các trường hợp xâm nhập dịch vụ Microsoft nội bộ (Entra OAuth, v.v.) bao gồm cả lỗ hổng này dự kiến sẽ được trình bày tại BlackHat USA 2025
-
Dòng thời gian
- 18/4/2025 – Báo cáo lên MSRC
- 25/7/2025 – Vá lỗi và đóng case, đăng bài blog
1 bình luận
Ý kiến trên Hacker News
sudoở dạng base64 rồi dùng nó/rootcũng không có file gì, và cũng không còn log hữu ích nào. Mọi kỹ thuật escape đã biết đều đã được vá. Nếu Microsoft phải thưởng cho từng cách lách luật kiểu này thì sẽ không có điểm dừng, nên ở mức không có rủi ro thực tế thì việc họ không trả thưởng riêng cũng phần nào dễ hiểu