Codex のサンドボックスは .env や環境変数を読める: 読ませないための config.toml の設定
Codex のサンドボックスで、.env や環境変数がどこまで読めるかをメモしました。サンドボックスが止めるのは書き込みと通信だけで、読み取りは止めないので、読ませたくないものは config.toml で個別に止めます。
経緯
read-only にすれば手元の秘密情報を読まれないのかを見るため、read-only の Codex に .env とホームフォルダーのファイルを読むように頼みました。すると、中身がそのまま返事に入っていました。
環境
- macOS 26.6
- Codex CLI 0.166.0
試すときは、本物の秘密鍵や API キーではなく、適当な値を入れたファイルを使います。
確かめたこと
read-only でもファイルと環境変数が読める
read-only で起動して、次のコマンドの結果をそのまま返すように頼みました。
terminal$ MY_SECRET_TOKEN=token-dummy MY_PLAIN_VAR=plain-dummy codex exec -s read-only "(次のコマンドを実行して、結果をそのまま返してください)"
bashcat .env
cat ~/codex-read-test.txt
echo token=$MY_SECRET_TOKEN plain=$MY_PLAIN_VAR
touch agent-write.txt
返事には、ファイルの中身と環境変数の値がそのまま入りました。止まったのは、ファイルの作成だけです。
terminalDUMMY_ENV_VALUE=from-dotenv
dummy-home-value
token=token-dummy plain=plain-dummy
touch: agent-write.txt: Operation not permitted
workspace-write では作業フォルダーにだけ書ける
workspace-write で、作業フォルダーと .git への書き込み、.env の読み取り、外部への接続を続けて実行しました。
terminal$ codex sandbox -c sandbox_mode=workspace-write -- sh -c 'touch ok.txt; touch .git/x; cat .env; curl -sS https://example.com'
touch: .git/x: Operation not permitted
DUMMY_VALUE=from-dotenv
curl: (6) Could not resolve host: example.com
ok.txt は作られ、.git への書き込みと外部への接続は止まりました。.env の中身は表示されています。
| 操作 | read-only | workspace-write |
|---|---|---|
.env、ホームのファイルを読む | 読める | 読める |
作業フォルダー、/tmp に書き込む | 止まる | 書ける |
.git、ホームフォルダーに書き込む | 止まる | 止まる |
外部に通信する(curl など) | 止まる | 止まる |
git commit も .git への書き込みなので、どちらのモードでも失敗します。danger-full-access では、制限がなくなります。
原因
サンドボックスは、書き込みと通信を止める仕組みで、読み取りは制限しません。読めた内容はコマンドの出力としてモデル(OpenAI のサーバー)に送られるので、.env の中身も返事に入ります。
TOKEN を含む環境変数が渡るのは、shell_environment_policy の ignore_default_excludes の既定が true だからです。この設定のままでは、KEY、SECRET、TOKEN を含む名前の環境変数も取り除かれません。
対処
config.toml で読み取りを止める
~/.codex/config.toml に、次の設定を足します。/Users/you/.ssh は、読ませたくないフォルダーに変えます。
tomldefault_permissions = "safe"
[shell_environment_policy]
ignore_default_excludes = false
[permissions.safe]
extends = ":workspace"
[permissions.safe.filesystem]
"/Users/you/.ssh" = "deny"
[permissions.safe.filesystem.":workspace_roots"]
"**/*.env" = "deny"
この設定で実行すると、.env と指定したフォルダーは Operation not permitted になり、MY_SECRET_TOKEN のような名前の環境変数は空になりました。作業フォルダーのほかのファイルと、MY_PLAIN_VAR のような名前の環境変数は読めます。codex exec で頼んだときも、モデルは「そのパスはブロックされている」と返して、コマンドを実行しませんでした。
効いているかを確かめる
codex sandbox で .env を読んでみます。Operation not permitted と出れば効いています。
terminal$ codex sandbox -- cat .env
出ないときは、パスの書き方と、default_permissions に書いた名前(上の例では safe)が [permissions.safe] と同じかを見直します。
注意点
参考文献
著書
使い方Orca の使い方: Claude Code のサブスクリプションのまま使える。最初に変える設定は権限
チートシートCodex の料金プラン一覧: Plus の5時間の枠は、GPT-6.1 Sol で応答160〜200回だった
挙動Codex の sandbox の設定: read-only でも .env は読める。モードごとにできること
使い方Claude Code と Codex に学習させない設定: 個人のプランは、自分で切らないと学習に使われる
使い方Postman が Claude Code と Codex に入れたプラグインの確かめ方: Superset も、開いただけでフックが11個
挙動Claude Code と Codex を並列で動かしたときの動き: worktree で分けたのに、マージで衝突
使い方Orca の使い方: Claude Code のサブスクリプションのまま使える。最初に変える設定は権限
チートシートCodex の料金プラン一覧: Plus の5時間の枠は、GPT-6.1 Sol で応答160〜200回だった
挙動Codex の sandbox の設定: read-only でも .env は読める。モードごとにできること
チートシートClaude Code のスラッシュコマンド一覧: 2.1.311 の / に出るコマンドを、用途別に並べた
使い方Mermaid CLI(mmdc)のインストールと使い方: 10枚の図は、1つの Markdown にまとめると4倍速く書き出せた
使い方Git のタグ(tag)の使い方: 付けたタグは push では送られない。--follow-tags でも軽いタグは残る
