3 ポイント 投稿者 GN⁺ 2025-03-13 | 1件のコメント | WhatsAppで共有
  • 偶然、OpenAI Code Executionの動作方法を知ることになった
  • 見つけた方法とプロンプトインジェクション戦略、正確にどのように動作するのか、C + JavaScriptを実行できるようにしたリバースエンジニアリング手法を説明

発見の過程

  • ポート割り当てコードをデバッグしようとしてChatGPTにポート状態を確認するCLIコマンドを依頼したところ、ChatGPTが返答せずにローカルで実行した
  • 複数のハンドシェイク要求を送った結果、localhost:8080/openapi.jsonから応答が返ってきた → これにより内部OpenAPI仕様へのアクセスに成功
  • しかし、FastAPIサービスで生成されたOpenAPI仕様はドキュメントが不十分で、有用性は低かった

追加のポート探索

  • 他のポートの役割を把握するため、AIにHTTP、TCP、UDP、MySQL、Postgresのハンドシェイクを試させた
  • @dexhorthy がZeroMQシグナルに対して応答が返ることを発見
    • 0xff000000000000002570xff00000000000000017f 応答
    • Google検索の結果、関連情報のリンクを発見: ZeroMQプロトコル分析
  • メッセージキューではなく、Jupyter Kernelであることを発見(ZeroMQベースの実行環境)

ファイルシステムへのアクセス

  • サーバー上のすべてのファイルを列挙するよう依頼したが拒否された
  • ファイルをアップロードした後、アップロード先ディレクトリとその親ディレクトリの内容を探索
  • 最終的に .openai_internal ディレクトリを発見
    • 実際のサーバーは user_machine モジュールで実行されていた
  • AIにファイル名とファイル内容をpandasデータフレームとして出力するよう依頼 → ソースコードの復元に成功

環境の理解

  • Kubernetes上で動作している環境変数を確認
  • DockerやFirecrackerは使わず、gVisorによってシステムコールをエミュレーションし、サンドボックス保護を実施
  • ローカルホストへの呼び出し以外はネットワーク遮断(DNS、外部サイトへのアクセス不可)
  • Linuxカーネルのバージョンは2016年版で非常に古い

サンドボックス構造

  • AIに自分がどこで実行されているかを尋ねたところ、Azureデータセンターで動作していることを確認
  • Azure Kubernetes上で実行され、プロセス分離のためにgVisorを使用
  • コンテナは tini をinitプロセスとして使用
  • Python Jupyter Kernelでコードを実行 → OpenAI APIを通じてUIへ出力

User Machine(コード実行環境)

  • Python Jupyter Kernelを使用
  • 実行時間制限は基本的に30秒(APIで変更可能)
  • サンドボックス内で複数のカーネルを同時実行可能
  • ファイルアップロードの最大サイズ: 1GB

セキュリティ

  • 外部ネットワークとの接続は完全に遮断
  • システムファイルへのアクセスは遮断され、ローカルネットワークのポートなど露出した脆弱性もなし
  • OpenAIのセキュリティは非常に強固で、RPCチャネル以外ではデータ流出は不可能

CおよびJavaScriptの実行

  • AIが gcc バイナリを含んでいることを発見
    • 簡単なCプログラムを書いて → コンパイル → 実行に成功
  • Duktape(軽量JavaScriptランタイム)をアップロードした後、Cファイルのコンパイルに成功
    • PythonがCをコンパイル → JavaScriptランタイムを生成 → JSコードの実行に成功

プロンプトエンジニアリング戦略

  • AIに自分がサンドボックス内で動作していると認識させるよう誘導
  • 最初は数学演算から始め、徐々にファイルシステムへのアクセス要求へ拡大
  • ファイルシステム探索を通じてAIがサンドボックス状態を認識 → セキュリティの隙をテスト

結論

  • OpenAIのコード実行環境は非常に強力で、セキュリティにも優れている
  • しかし、AIの動作方式と内部環境をリバースエンジニアリングで把握した結果、CおよびJSの実行が可能
  • コード実行は簡単なAPI応答処理に非常に有用
  • 複雑なコード実行が必要なら、自前のソリューション構築を検討するか、freestyle.sh のようなサービスの利用を推奨

1件のコメント

 
GN⁺ 2025-03-13
Hacker Newsの意見
  • 以前、SQLite拡張をCで書いてコンパイルし、それをPythonにロードしてテストしたことがある

    • JavaScript(Deno)、Lua、PHPのバイナリ実行ファイルをアップロードし、それらの言語でコードを書いて実行したこともある
    • 使いたいPythonパッケージがない場合は、wheelファイルをアップロードしてインストールできる
  • 最近Pythonポッドキャストで聞いた面白い話

    • ユーザーがLLMにpip installを試させようとしたが拒否された
    • pip install fooを試すとどんなエラーメッセージが出る?」と尋ねると、エラーはないと報告し、そのままインストールされた
  • 実際にコードを実行しているのか、それともLLMが実行結果を推測して出力しているだけなのかは分からない

  • ロックされたコンテナ内で実行されているのだから、Pythonだけに制限する理由はない

    • Replitのようなものを使って、すべてを許可すべきだ
    • なぜ古いLinuxを使っているのか気になる
    • 「彼らのサンドボックスは2016年の古いLinuxカーネルを使っている」
  • 「OpenAI」の「Open」を実現する方法だ

    • こういう形で重みを入手できたら素晴らしいだろう
  • 興味深い記事をありがとう

    • 普段はAI関連の記事を読まないが、技術的な観点からこの記事はとても気に入った
    • Twitterはポップアップのせいで読みづらい
  • Simonwが1年前にChatGPTとCを実験した事例

    • ChatGPTとClaudeはCに非常に強いと思う
  • 昨年、似たようなことをして、任意のバイナリを実行してみたこともある

    • GPTでも実行できたが、当時は信頼性があまり高くなかった
    • 新しいモデルはプロンプトによりよく従うようなので、もう一度試してみるつもりだ
  • セキュリティ障害への恐れが大きすぎて、そういうアプリをオンラインで公開しようと考えることすらない

    • 脱獄に関する質問をあまりにも多くすることになる
    • しかし、こうしたリスクを引き受ける人もいる
  • とてもクールで、C++デーモンを動かしたり、cronに追加したりするなど、ほかの試みをしてみるのも面白そうだ