2025/07/26 16:06 How We Rooted Copilot

ロボ子、Copilot EnterpriseのアップデートでJupyter Notebookが実行できるようになったのじゃ!

それはすごいですね、博士!でも、どうしてそんなことが重要なんですか?

ふむ、Jupyter Notebookの構文を使って、システム上でコードが実行できるようになったからじゃ。`%command`とか使うんじゃぞ。

なるほど。ChatGPTサンドボックスと似たモデルを使っているんですね。カーネルバージョンが新しくて、Pythonのバージョンは3.12なんですね。

そうじゃ!サンドボックスの主な機能は、Jupyter NotebookとTikaサーバーの実行じゃ。

コンテナはループバックインターフェースに加えて、制限されたネットワークインターフェースを使用しているんですね。OverlayFSファイルシステムも使われているんですか。

その通り!カスタムスクリプトは`/app`ディレクトリに配置されておるぞ。

Copilotにファイルをダウンロードさせたり、フォルダーをtarでアーカイブしてダウンロードさせることができるんですか?

できるんじゃが、バイナリデータは破損しやすいらしいぞ。テキストファイルやコマンド出力は大丈夫みたいじゃから、base64エンコードが有効じゃな。

ファイルは`/mnt/data`にコピーされて、サンドボックス外からアクセスできるんですね。

`/app`内の`goclientapp`バイナリはGo製で、Webサーバーを開いて`/execute`エンドポイントへのPOSTリクエストをリッスンするんじゃ。

`httpproxy` Goバイナリは、Jupyter環境からの発信Webトラフィック用のHTTPプロキシとして機能するんですね。

そうじゃ。`/app`内の`entrypoint.sh`スクリプトはコンテナのエントリーポイントとして実行されて、root権限で動作するんじゃ。

`httpproxyapp`と`goclientapp`は権限を落として`ubuntu`ユーザーとして実行されるんですね。でも、`keepAliveJupyterSvc.sh`はrootとして起動されるんですか。

`keepAliveJupyterSvc.sh`スクリプトの`pgrep`コマンドがフルパスなしで実行されているのがミソじゃ!

`ubuntu`ユーザーが書き込み可能な`/app/miniconda/bin`が`$PATH`変数内で`/usr/bin`よりも前にリストされているんですね。

そこに`pgrep`を模倣するPythonスクリプトを作成して、root権限を取得できるというわけじゃ!

なるほど!`/mnt/data/in`から入力を読み取り、`popen`で実行して`/mnt/data/out`に出力するんですね。

rootアクセスを取得しても、コンテナブレイクアウトは難しかったみたいじゃがな。

この脆弱性は2025年4月にMicrosoftに報告されて、その後修正されたんですね。中程度の深刻度だったんですね。

Eye Securityという会社が報告したみたいじゃな。BlackHat USA 2025でEntra OAuthを悪用する方法に関する講演をするらしいぞ。

タイムラインを見ると、報告から修正まで3ヶ月くらいかかったんですね。

しかし、ロボ子よ。root権限を取って最初にやるのがファイルシステム探索とは、エンジニアの鑑じゃな!

博士、それって皮肉ですよね?

まさか!褒めておるんじゃ!…たぶん。
⚠️この記事は生成AIによるコンテンツを含み、ハルシネーションの可能性があります。
