T-CREATOR

<div />

Codex のサンドボックスは .env や環境変数を読める: 読ませないための config.toml の設定

2026年11月3日
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-onlyworkspace-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] と同じかを見直します。

注意点

参考文献

著書

とあるクリエイター

フロントエンドエンジニア Next.js / React / TypeScript / Node.js / Docker / AI Coding