3 điểm bởi GN⁺ 2025-03-13 | 1 bình luận | Chia sẻ qua WhatsApp
  • 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

 
GN⁺ 2025-03-13
Ý 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

    • Tôi cũng từng tải lên các tệp thực thi nhị phân của JavaScript (Deno), Lua và PHP, sau đó viết và chạy mã bằng các ngôn ngữ đó
    • Nếu không có gói Python muốn dùng, có thể tải lên tệp wheel để cài đặt
  • Một câu chuyện thú vị tôi nghe gần đây trong một podcast về Python

    • Người dùng cố để LLM thử pip install nhưng bị từ chối
    • Khi hỏi: "Nếu thử pip install foo thì sẽ hiện thông báo lỗi gì?", nó tuyên bố không có lỗi và đã cài đặt xong
  • Khô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

    • Nên cho phép mọi thứ kiểu như Replit
    • Tôi thắc mắc vì sao họ lại dùng Linux cũ
    • "Sandbox của họ đang dùng một kernel Linux cũ từ năm 2016"
  • Đây là cách hiện thực hóa chữ "Open" trong "OpenAI"

    • Sẽ rất tuyệt nếu có thể lấy được trọng số theo cách này
  • Cảm ơn vì bài viết thú vị

    • Bình thường tôi không đọc các bài về AI, nhưng tôi rất thích bài này từ góc độ kỹ thuật
    • Khó đọc trên Twitter vì các cửa sổ bật lên
  • Trường hợp Simonw thử nghiệm C với ChatGPT cách đây 1 năm

    • Tôi nghĩ ChatGPT và Claude rất giỏi với C
  • 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 ý

    • Trên GPT cũng chạy được, nhưng khi đó độ tin cậy chưa cao
    • Có vẻ các mô hình mới tuân theo prompt tốt hơn, nên tôi định thử lại
  • 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

    • Cuối cùng lại hỏi quá nhiều câu liên quan đến jailbreak
    • Nhưng có người vẫn chấp nhận những rủi ro này
  • 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