脆弱性・CVE速報深刻度: 中

PHPUnit 13.4.0〜13.4.3 に脆弱性(CVE-2026-119193): PHPT テストをカバレッジ付きで実行すると、共有の一時ディレクトリ経由で別のローカルユーザーにコードを実行される恐れ

目次(5)

CVE-2026-119193

PHP のテストフレームワーク PHPUnit に、2026 年 10 月 30 日(UTC)に脆弱性 CVE-2026-119193 が公開されました。GitHub Advisory の深刻度は Medium、CVSS v4.0 は 5.4(CVSS:4.0/AV:L/AC:L/AT:P/PR:L/UI:P/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N)、CWE-379 です。GitHub の勧告に CVSS v3 の値は付いていません。CISA の KEV には載っていません。EPSS は 0.11%(10/30 時点)です。

何が起きるか

  • PHPUnit 13.4.0 以降は、PHPT テストをコードカバレッジ付きで実行するとき、OS の一時ファイル用パス(Linux なら /tmp)の下の固定名のディレクトリ phpunit-phpt に、テストのコード(.php)とカバレッジのデータ(.coverage)を書き出して実行します。
  • このディレクトリが他のユーザーによってすでに作られていても、所有者や権限を確かめずにそのまま使います。新しく作る場合の権限は 0777(umask 適用前)で、sticky ビットもありません。
  • 同じマシンのほかのローカルユーザーが先にこのディレクトリを作っておくと、開発者が PHPUnit を動かしたときにテストのコードを自分のコードに差し替えられ、開発者の権限で任意のコードを実行できます。元のコードも実行させられるため、テストは成功し、カバレッジのレポートも欠けません。気づきにくい攻撃です。
  • .coverage ファイルも差し替えられますが、こちらは PHPUnit 自身のクラスのオブジェクトしか復元しないため、カバレッジ値の改ざんにとどまります。

悪用の条件

勧告が挙げる条件は次の 4 つで、すべて満たす場合に限られます。

  1. PHPT テストを、PCOV や Xdebug などのカバレッジ取得ドライバー付きで実行している。
  2. 一時ファイル用パスがユーザー間で共有されている。Linux などで /tmp を共有している場合が該当します。systemd の PrivateTmp、pam_namespace、ユーザーごとの TMPDIR を使っていれば当てはまりません。macOS と Windows は、既定ではユーザーごとの一時ディレクトリなので対象外です。
  3. 攻撃者が同じマシンのアカウントを持つか、別アカウントで動くプロセス(サービスなど)を操作できる。
  4. 一時ファイル用パスを最後に掃除してから、開発者が初めてカバレッジ付きで PHPT テストを動かすより前に、攻撃者がディレクトリを作る。

1 人のユーザーしか使わないコンテナや使い捨ての CI 実行環境のように、ほかのユーザー(サービス用アカウントを含む)が一時ファイル用パスに書き込めない環境は対象外です。勧告は可能性を低いと評価しています。成功した場合の影響は大きく、開発者がアクセスできるソースコード、認証情報、SSH 鍵などに及びます。

影響を受ける版と修正

  • 勧告の影響範囲は 13.4.0 以上 13.4.4 未満、修正版は 13.4.4 です。PHPUnit 12.5 以前は、一時ファイルを PHPT テストファイルの隣に書くため影響を受けません。
  • 13.4.4 では、一時ファイル用のディレクトリを予測できない名前で、現在のユーザーだけがアクセスできる権限で作ります。すでに存在するディレクトリは使いません。
  • 修正のコミットは 10 月 27 日 02:54(UTC)、13.4.4 のリリースは同日 03:17(UTC)で、修正はリリースの前に入っています。リリースノートにも同じ内容が書かれています。12.5 系にも同日にリリースがありますが、この問題の影響は受けません。
  • 13.4.4 のリリースノートには、静的解析キャッシュ用ディレクトリが他のユーザーによって作られていても使われる問題の修正も含まれています。

対応

  1. composer show phpunit/phpunit で、使っている版を確認します。
  2. 13.4.0〜13.4.3 なら、13.4.4 以降へ更新します(10 月 27 日には 13.4.5 も出ています)。
  3. すぐ更新できない場合は、PHPT テストをカバレッジ付きで動かす環境で、ユーザーごとの TMPDIR や PrivateTmp を使う、または /tmp/phpunit-phpt が自分の所有であることを確かめてから実行します。
  4. 共有サーバーで該当する構成を使っていた場合は、/tmp/phpunit-phpt の所有者を確かめます。

未確認の点

  • NVD の記載は確認できていません(公開直後)。
  • 悪用の報告は見つかっていません(KEV 掲載なし、EPSS は低い水準)。

この記事について

出典

この記事を共有