1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

API キーをコマンド引数に書くと別ユーザーの ps から丸見え:curl -H は隠れず -u だけ隠れる(実機確認)

1
Posted at

結論

  • API キーを コマンドの引数に直接書くと、同じマシンの別ユーザーからも ps で丸見えになります(2026-11-08、Debian 13・procps-ng 4.0.4・ダミー値で実機確認)。curl -H "Authorization: Bearer ..." も --api-key=... も、そのまま出ました。
  • 一方、環境変数に入れた値は、別ユーザーからは /proc/PID/environ が Permission denied で読めませんでした(同じユーザーなら読めます)。
  • curl -u user:pass は ps 上で ***** に隠されました。ただし curl 公式マニュアルは「隠れるまでの一瞬は見える」と書いています。-H は隠されません。
  • curl -H @ファイル にすると、ps に出るのはファイル名だけでした。

この記事は「AIエージェントと秘密情報」の検証シリーズです。新しい検証は X(@supportapp3_lab)でもお知らせしています。

試してみる(鍵を引数に書いていないか)

いま動いているプロセスの引数に、鍵らしい文字列が入っていないかを見ます(値は自分の画面にだけ出ます)。

ps -eo user,pid,args | grep -iE 'bearer|api[-_]?key|token|password|secret' | grep -v grep

スクリプトや AI に書かせたコマンドに残っていないかは、こちらで探せます。

grep -rnE --include='*.sh' --include='*.bash' --include='Makefile' --include='*.yml' \
  -- '-H[[:space:]]+["'"'"']?Authorization:[[:space:]]*Bearer[[:space:]]+[A-Za-z0-9]|--(api[-_]?key|token|password)=' .

.env 系のファイル名だけ先に見たい場合は、読み取り専用の CLI もあります。

npx github:supportapp3-lab/ai-secret-check scan

リポジトリ: https://github.com/supportapp3-lab/ai-secret-check

実機で確かめたこと

値はすべてダミーです。ローカルに6秒かけて返事をするだけの HTTP サーバーを立て、その間に box ユーザーで次の4つを動かし、別ユーザー nobody から ps と /proc を見ました。

export DUMMY_API_KEY=sk-dummy-ENV-0000
curl -s -H "Authorization: Bearer sk-dummy-ARG-1111" http://127.0.0.1:18080/ &
curl -s -u "user:sk-dummy-USER-2222" http://127.0.0.1:18080/ &
curl -s -H @hdr.txt http://127.0.0.1:18080/ &      # hdr.txt は chmod 600
python3 -c 'import time; time.sleep(6)' --api-key=sk-dummy-PY-3333 &

1. 別ユーザーの ps

sudo -u nobody ps -eo user,args
box      curl -s -H Authorization: Bearer sk-dummy-ARG-1111 http://127.0.0.1:18080/
box      curl -s -u *********************** http://127.0.0.1:18080/
box      curl -s -H @hdr.txt http://127.0.0.1:18080/
box      python3 -c import time; time.sleep(6) --api-key=sk-dummy-PY-3333
  • -H で渡した Bearer トークンと --api-key= は、別ユーザーからそのまま読めました。
  • -u の値は * に置き換わっていました。
  • -H @hdr.txt は、ファイル名しか出ません。

2. 別ユーザーの /proc/PID/cmdline と environ

$ sudo -u nobody cat /proc/<PID>/cmdline
python3 -c import time; time.sleep(6) --api-key=sk-dummy-PY-3333

$ sudo -u nobody cat /proc/<PID>/environ
cat: /proc/<PID>/environ: Permission denied

同じ box ユーザーからは environ に DUMMY_API_KEY=sk-dummy-ENV-0000 が見えました(/proc/PID/environ の記事と同じ結果)。

つまりこの環境では、引数は別ユーザーにも見え、環境変数は同じユーザーにしか見えないという差がありました。

公式の説明

  • Linux man-pages の proc_pid_cmdline(5):/proc/pid/cmdline は「プロセスの完全なコマンドライン」を持つ読み取り専用ファイル、と書かれています。
  • proc(5) の hidepid=n(Linux 3.3 以降):/proc/pid ディレクトリの情報に誰がアクセスできるかを決めるマウントオプションです。今回の環境は /proc に hidepid が付いていない状態(mount で確認)でした。
  • curl 公式マニュアルの -u, --user と -U, --proxy-user:「On systems where it works, curl hides the given option argument from process listings. This is not enough to protect credentials ... as they still are visible for a moment before being cleared.」と書かれ、ファイルなどから読むよう勧めています。この説明は -u と -U の項目にあり、-H の項目にはありません。今回の実機でも -H は隠れませんでした。

AIエージェントとの関係(ここからは推測を含みます)

  • AI に「この API を curl で叩いて」と頼むと、-H "Authorization: Bearer <キー>" の形でキーを直接書いたコマンドが作られることがあります(推測。今回はエージェント経由では試していません)。
  • 共用の VPS や、ほかのユーザーやサービスアカウントが動いているサーバーでは、その数秒〜数分の間に ps から読まれる可能性があります(推測。1人で使うマシンなら影響は小さいと考えられます)。
  • 引数に書いたキーは、シェル履歴にも残ります(シェル履歴の記事で実機確認済み)。

対策

  1. curl のヘッダーは -H @ファイル(ファイルは chmod 600)で渡す。ファイル名しか ps に出ませんでした。
  2. 自作スクリプトは、キーを引数ではなく環境変数やファイルから読む。別ユーザーからの environ は読めませんでした(同じユーザーからは読めるので万能ではありません)。
  3. curl -u の * 隠しは、公式どおり「一瞬は見える」前提で扱う。
  4. 共用サーバーでは、/proc の hidepid=2 などで他ユーザーのプロセス情報を隠す方法があります(proc(5)。今回は共有環境のため設定変更は試していません)。
  5. AI にコマンドを作らせるときは「キーは引数に書かず、ファイルか環境変数から読む形で」と条件を付ける。

ai-secret-check について

ai-secret-check scan は、AIが読めそうな場所にある .env 系のファイル名を探します(中身は表示しません)。引数に書かれたキーまでは見ないので、上の ps / grep とセットで使ってください。

npx github:supportapp3-lab/ai-secret-check scan

リポジトリ: https://github.com/supportapp3-lab/ai-secret-check (Node.js 20以上、MIT)

参考

※ 2026-11-08 に、Debian 13(カーネル 6.12)・curl 8.14.1・procps-ng 4.0.4・Python 3.13.5、ダミー値で確かめました。

更新情報やちょっとしたTipsは X(@supportapp3_lab)で発信しています。

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?