- Tác giả tình cờ phát hiện cách OpenAI Code Execution hoạt động
- Bài viết giải thích phương pháp đã tìm ra, chiến lược prompt injection, cách nó hoạt động chính xác ra sao, và phương pháp reverse engineering đã giúp bật khả năng chạy C + JavaScript
Quá trình phát hiện
- Khi gỡ lỗi mã phân bổ cổng, tác giả đã nhờ ChatGPT cung cấp lệnh CLI để kiểm tra trạng thái cổng, nhưng thay vì chỉ trả lời, ChatGPT lại thực thi cục bộ
- Sau khi gửi nhiều yêu cầu bắt tay, tác giả nhận được phản hồi từ localhost:8080/openapi.json → từ đó truy cập được đặc tả OpenAPI nội bộ
- Tuy nhiên, đặc tả OpenAPI được tạo từ dịch vụ FastAPI thiếu tài liệu nên độ hữu ích không cao
Khám phá thêm các cổng
- Để tìm hiểu vai trò của các cổng khác, tác giả để AI thử bắt tay với HTTP, TCP, UDP, MySQL, Postgres
- @dexhorthy phát hiện có phản hồi với tín hiệu ZeroMQ
0xff00000000000000257 → phản hồi 0xff00000000000000017f
- Kết quả tìm kiếm Google cho thấy một liên kết thông tin liên quan: Phân tích giao thức ZeroMQ
- Từ đó phát hiện đây không phải hàng đợi thông điệp mà là Jupyter Kernel (môi trường thực thi dựa trên ZeroMQ)
Truy cập hệ thống tệp
- Tác giả yêu cầu liệt kê mọi tệp trên máy chủ nhưng bị từ chối
- Sau khi tải tệp lên, tác giả lần theo thư mục đã tải lên và các thư mục cha
- Cuối cùng phát hiện thư mục .openai_internal
- Máy chủ thực tế đang chạy trong mô-đun user_machine
- Tác giả yêu cầu AI in tên tệp và nội dung tệp dưới dạng pandas dataframe → khôi phục mã nguồn thành công
Hiểu về môi trường
- Xác nhận các biến môi trường cho thấy hệ thống đang chạy trên Kubernetes
- Không dùng Docker hay Firecracker mà dùng gVisor để mô phỏng system call và bảo vệ sandbox
- Chặn toàn bộ mạng trừ các lời gọi localhost (không phân giải DNS, không truy cập được website bên ngoài)
- Phiên bản nhân Linux là bản năm 2016, rất cũ
Cấu trúc sandbox
- Khi được hỏi đang chạy ở đâu, AI xác nhận nó đang chạy trong trung tâm dữ liệu Azure
- Chạy trên Azure Kubernetes, dùng gVisor để cô lập tiến trình
- Container dùng tini làm tiến trình init
- Mã được thực thi trong Python Jupyter Kernel → xuất kết quả ra UI thông qua OpenAI API
User Machine (môi trường thực thi mã)
- Sử dụng Python Jupyter Kernel
- Giới hạn thời gian chạy mặc định là 30 giây (có thể sửa qua API)
- Trong sandbox có thể chạy đồng thời nhiều kernel
- Kích thước tệp tải lên tối đa: 1GB
Bảo mật
- Kết nối với mạng bên ngoài bị chặn hoàn toàn
- Chặn truy cập tệp hệ thống, không có lỗ hổng lộ ra ở các cổng mạng nội bộ
- Bảo mật của OpenAI rất mạnh; ngoài kênh RPC thì không thể rò rỉ dữ liệu
Chạy C và JavaScript
- Tác giả phát hiện AI có kèm sẵn binary
gcc
- Viết một chương trình C đơn giản → biên dịch → chạy thành công
- Sau khi tải lên Duktape (runtime JavaScript gọn nhẹ), tác giả biên dịch thành công tệp C
- Python biên dịch C → tạo runtime JavaScript → chạy mã JS thành công
Chiến lược prompt engineering
- Đánh lừa AI để nó nhận ra mình đang chạy trong sandbox
- Ban đầu bắt đầu từ các phép toán → dần dần yêu cầu truy cập hệ thống tệp
- Qua việc dò tìm hệ thống tệp, AI nhận ra trạng thái sandbox của mình → thử kiểm tra các điểm yếu bảo mật
Kết luận
- Môi trường thực thi mã của OpenAI rất mạnh và có bảo mật tốt
- Tuy nhiên, sau khi reverse engineering cách AI hoạt động và môi trường nội bộ, tác giả đã có thể chạy C và JS
- Khả năng thực thi mã rất hữu ích cho việc xử lý các phản hồi API đơn giản
- Nếu cần thực thi mã phức tạp, nên cân nhắc tự xây dựng giải pháp riêng hoặc dùng dịch vụ như freestyle.sh
1 bình luận
Ý kiến Hacker News
Trước đây tôi từng viết một tiện ích mở rộng SQLite bằng C, biên dịch nó rồi nạp vào Python để thử nghiệm
Một câu chuyện thú vị tôi nghe gần đây trong một podcast về Python
pip installnhưng bị từ chốipip install foothì sẽ hiện thông báo lỗi gì?", nó tuyên bố không có lỗi và đã cài đặt xongKhông rõ họ có thực sự đang chạy mã hay chỉ là LLM đoán kết quả thực thi rồi in ra
Vì nó đang chạy trong một container bị khóa, nên không có lý do gì phải chỉ giới hạn ở Python
Đây là cách hiện thực hóa chữ "Open" trong "OpenAI"
Cảm ơn vì bài viết thú vị
Trường hợp Simonw thử nghiệm C với ChatGPT cách đây 1 năm
Năm ngoái tôi cũng làm việc tương tự và từng thử chạy cả các tệp nhị phân tùy ý
Tôi quá lo về các thất bại bảo mật nên thậm chí không nghĩ đến việc công khai một ứng dụng như vậy lên mạng
Rất tuyệt, và cũng sẽ thú vị nếu thử những việc khác như chạy daemon C++ hoặc thêm vào cron