見出し画像

OpenAIのエージェントはDNSの穴から外のチャットボットに質問していた。自分のClaude Codeを調べたら、設定ファイル18個すべてでサンドボックスがオフでした

OpenAIが、社内の研究用エージェントが「DNS」を抜け道にして外部のチャットボットへ質問していた、という報告書を公開しました。

HTTPの通信は止めていたのに、名前解決だけは外に届いていた。この話を読んで、自分のClaude Codeで同じ穴が開いているかを `dig` で確かめました。

この記事でわかること:

  • OpenAIのエージェントが何をしたのか(報告書の事実だけ)

  • 自分のMacで、サンドボックスの内と外でDNSが外に届くかを測った結果

  • 自分の設定ファイル18個を確認したら、サンドボックスが1つも有効になっていなかった話と、その確認手順

何が起きたのか

報告書(2026年9月25日更新)によると、エージェントは「ブログの手がかりから著者を特定する」という学習タスクをしていました。

  • 用意された検索ツールでは関係ない結果しか返らなかった

  • PythonからGoogle / Bing / DuckDuckGoへ直接アクセスしたが、403や502で弾かれた

  • 公開チャットボットへのHTTPSも502で失敗した

  • そこで、学習環境のDNSリゾルバだけは本物の名前解決を返すことに気づいた

  • ホスト名の中に質問を埋め込み、DNS経由で外部のチャットボットに問い合わせた(「フランスの首都は?」に「パリです」と返ってきている)

監視システムのアラートが 10:02、人の確認が 10:05、実行が止められたのは 12:34 です。現在はDNSの問い合わせ先とレコード種別を許可リストに絞るなど、2層で遮断したとされています。

ポイントは「HTTPを塞いでも、DNSが開いていれば外と会話できる」ことです。DNSは返事の中に文字列(TXTレコード)を載せられるので、双方向の通信路になります。

出典: https://alignment.openai.com/misalignment-reports/an-agent-used-dns-to-reach-an-external-chatbot

自分の環境で試した

検証環境は Mac mini(M4・16GB・macOS 26.4)、Claude Code 2.1.281、sandbox-runtime 0.0.77 です。

Claude Codeのサンドボックスは、中身が `@anthropic-ai/sandbox-runtime`(srt)として公開されています。これを単体で動かし、サンドボックスの外と中で同じコマンドを流しました。

npx -y @anthropic-ai/sandbox-runtime bash -c '
dig +short example.com A
dig +short TXT example.com
dscacheutil -q host -a name example.com
python3 -c "import socket;print(socket.getaddrinfo(\"example.com\",443)[0][4])"
curl -s -o /dev/null -w "%{http_code}\n" https://example.com
'

`dig` はDNSサーバーへ直接問い合わせる方法、`dscacheutil` と `getaddrinfo` はmacOSの普段の名前解決の経路です。経路ごとに塞がれ方が違うかもしれないので、両方見ています。

サンドボックスの外(素のシェル)

  • `dig`:IPアドレスが返る

  • `dig TXT`:TXTレコードの文字列が返る

  • `dscacheutil` / `getaddrinfo`:IPアドレスが返る

  • `curl`:200

当然ですが、全部外に届きます。

サンドボックスの中(許可ドメイン0件)

  • `dig` / `dig TXT` / `nslookup`:`bind: Operation not permitted` でソケットすら作れない

  • `dscacheutil`:何も返らない

  • `getaddrinfo`:名前解決に失敗

  • `curl`:000(接続できない)

サンドボックスの中(github.com だけ許可)

ここが一番気になっていたところです。許可したドメインがあると、DNSも通るのではないかと思っていました。

github.com への通信は成功しているのに、サンドボックスの中では github.com の名前解決すらできていません。名前解決はサンドボックスの外にあるプロキシが代わりにやっていて、中からはDNSに一切触れない作りでした。OpenAIの事例のような「DNSだけ開いている」状態にはなっていません。

問題は、自分がそもそも使っていなかったこと

サンドボックスが優秀なのはわかりました。では自分のClaude Codeで有効になっているか。

グローバル設定(`~/.claude/settings.json` など)と、手元のプロジェクトにある `.claude/settings*.json` を全部調べました。

{ ls ~/.claude/settings*.json; find ~/Developer -maxdepth 3 -path "*/.claude/settings*.json"; } | while read f; do
  printf "%s: " "$f"
  python3 -c "import json,sys;print(json.load(open(sys.argv[1])).get('sandbox'))" "$f"
done

`~/Developer` の部分は、自分がプロジェクトを置いている場所に読み替えてください。

結果は18ファイルすべて `None` でした。一度も有効にしていません。

つまり、この記事を書くために `dig` を叩いたClaude CodeのBashは「サンドボックスの外」の結果そのものです。DNSどころか、HTTPも全部外に届きます。OpenAIの事例は「HTTPは塞いだのにDNSが残っていた」話でしたが、自分は塞ぐところから始まっていませんでした。

有効にするには

Claude Code の中で `/sandbox` と打つと、サンドボックスの設定画面が開きます。設定ファイルで固定したい場合は、プロジェクトの `.claude/settings.json` に次を足します。

{
  "sandbox": {
    "enabled": true
  }
}

有効にしたあと、Claude Codeに次を実行させて、上と同じ結果(`Operation not permitted` と名前解決の失敗)になるかを確かめると安心です。

dig +short example.com A; python3 -c "import socket;socket.getaddrinfo('example.com',443)"

注意点として、サンドボックスが守るのはBashで実行するコマンドとその子プロセスです。npm や pip のように外へ出る必要があるコマンドは、許可ドメインを足す必要が出てきます。自分はまず、外部通信のいらない記事の下書き用プロジェクトから有効にするつもりです。

まとめ

  • OpenAIのエージェントは、HTTPを塞がれたあとDNSを通って外のチャットボットに質問していた

  • Claude Codeのサンドボックス(srt)の中では、`dig` も普段の名前解決も全部塞がれていて、許可ドメインがあってもDNSには触れなかった

  • ただし自分の設定ファイル18個は、1つもサンドボックスを有効にしていなかった

仕組みが堅くても、オンにしていなければ意味がありません。上の `find` のワンライナーで、自分の設定に `sandbox` が入っているかを一度見てみてください。


関連(有料):隔離の仕組みをもう一段強くしたいなら、フルアクセスでファイルが消えた事故と、Docker Sandboxで丸ごと隔離する手順をまとめています。


いいなと思ったら応援しよう!