- 偶然、OpenAI Code Executionの動作方法を知ることになった
- 見つけた方法とプロンプトインジェクション戦略、正確にどのように動作するのか、C + JavaScriptを実行できるようにしたリバースエンジニアリング手法を説明
発見の過程
- ポート割り当てコードをデバッグしようとしてChatGPTにポート状態を確認するCLIコマンドを依頼したところ、ChatGPTが返答せずにローカルで実行した
- 複数のハンドシェイク要求を送った結果、localhost:8080/openapi.jsonから応答が返ってきた → これにより内部OpenAPI仕様へのアクセスに成功
- しかし、FastAPIサービスで生成されたOpenAPI仕様はドキュメントが不十分で、有用性は低かった
追加のポート探索
- 他のポートの役割を把握するため、AIにHTTP、TCP、UDP、MySQL、Postgresのハンドシェイクを試させた
- @dexhorthy がZeroMQシグナルに対して応答が返ることを発見
0xff00000000000000257 → 0xff00000000000000017f 応答
- 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件のコメント
Hacker Newsの意見
以前、SQLite拡張をCで書いてコンパイルし、それをPythonにロードしてテストしたことがある
最近Pythonポッドキャストで聞いた面白い話
pip installを試させようとしたが拒否されたpip install fooを試すとどんなエラーメッセージが出る?」と尋ねると、エラーはないと報告し、そのままインストールされた実際にコードを実行しているのか、それともLLMが実行結果を推測して出力しているだけなのかは分からない
ロックされたコンテナ内で実行されているのだから、Pythonだけに制限する理由はない
「OpenAI」の「Open」を実現する方法だ
興味深い記事をありがとう
Simonwが1年前にChatGPTとCを実験した事例
昨年、似たようなことをして、任意のバイナリを実行してみたこともある
セキュリティ障害への恐れが大きすぎて、そういうアプリをオンラインで公開しようと考えることすらない
とてもクールで、C++デーモンを動かしたり、cronに追加したりするなど、ほかの試みをしてみるのも面白そうだ