Upgrade to Pro — share decks privately, control downloads, hide ads and more …

【初心者向け・脆弱性のコード解説】PHP 8.1.0-dev RCE バックドア【セキュリティ】

Avatar for RayZeroV RayZeroV
January 11, 2026

【初心者向け・脆弱性のコード解説】PHP 8.1.0-dev RCE バックドア【セキュリティ】

こちらの動画で用いたスライドです。
https://www.youtube.com/watch?v=UrE8RblYmb4
コード
https://zenn.dev/rayzerov/articles/ec7865f3388b9a

Avatar for RayZeroV

RayZeroV

January 11, 2026

Other Decks in Technology

Transcript

  1. 脆弱性の一つ、バックドアとは
 コンピュータシステムまたはそのシステムに含まれるデータにアクセスするために、 
 認証手続き等を迂回する方法 
 例: ログインするためにはユーザー名とパスワードによる認証が必要だが、それを知らなくてもログインできるように する
 システムバックドア 


    システムレベルでデータおよびプロセスへのアクセスを許可する 
 初期アクセスを獲得するために脆弱性を利用し、その脆弱性が修正された場合でもシステムアクセスを保持できる ようにする。
 例: 「トロイの木馬」や「ボット」などのマルウェア 
 アプリケーションバックドア(今回のバックドア) 
 特定の条件下でセキュリティ機構を迂回するように修正された正規ソフトウェアのバージョン 
 例: ソースコードが保存されているシステム(GitHubなど)を侵害して、アプリケーションのソースコードを書き換える 
 Source: Static Detection of Application Backdoors (Chris Wysopal, Chris Eng. Veracode. 2014. LINK )
 RayZeroV @rayzerov
  2. 該当箇所のコード
 ext/zlib/zlib.cに挿入された
 コード
 一度コミットされ、 revert されたものが再度 revert によりコミットされている 
 解消すべき疑問


    • どういう処理をしているのか? 
 • そもそもはどういう処理をする 
 場所なのか?
 • 攻撃に成功する条件は? 
 • なぜここに書き込んだのか? 
 • 誰が、どうやって公式リポジトリに 
 書き込んだのか?
 Source: https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a (PHPの公式リポジトリ) 
 RayZeroV @rayzerov
  3. そもそもはどういう処理をする場所なのか?
 zlib
 サイトコンテンツをgzip圧縮するライブラリ 
 →重要な機能のため、(おそらく)多くのレンタルサーバーではデフォルトで有効 
 php_zlib_output_compression_start() 
 主にRINIT(PHPが1つのリクエストを受け取るたびに、一番最初に実行する初期化処理)で呼び出される、 圧縮の準備をする関数


    この関数の中の、zlib.output_compression が on かどうかを調べる前の段階で攻撃コードが挟まっている 
 →zlib.output_compression を On にしなくても攻撃は通るはず(実験を参照) 
 →攻撃の結果はレスポンスの前に帰ってくるはず(実験を参照) 
 Source: https://www.php.net/manual/ja/book.zlib.php (PHPの公式マニュアル) 
 https://github.com/php/php-src/blob/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a/ext/zlib/zlib.c (PHPの公式リポジトリ) 
 
 RayZeroV @rayzerov
  4. 再現とデバッガでの分析
 再現につかった環境 
 Docker version 28.2.2, build 28.2.2-0ubuntu1~24.04.1
 利用したデバッガ 


    GNU gdb (Debian 10.1-1.7) 10.1.90.20210103-git
 方法
 Docker イメージ内でコミット 2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a 時点のソー スコードを fetch したものをビルドし、コンテナ内で実行
 RayZeroV @rayzerov
  5. Dockerfile の重要な部分
 RUN ./buildconf --force && \  ./configure \ #ビルド設定 --enable-debug

    \ #デバッグをオンにする 
 --disable-all \
 --with-zlib \ #zlibをビルドに含める
 --prefix=/usr/local/php-backdoor 
 
 CMD ["php","-d","zlib.output_compression=Off","-S","0.0.0.0:8080"] 
 コンテンツの圧縮にZlibを使わないように設定しても 攻撃が成功することを確かめる RayZeroV @rayzerov
  6. 導き出される、攻撃に成功する条件
 実験では、
 • ビルド時に with-zlib をオン
 • リクエストヘッダーに「USER_AGENTT: zerodium(ここに命令を入れる)」を入れる
 で毎回攻撃に成功した。


    zlib.output_compression がデフォルト、もしくは Off でも攻撃は通った。
 
 
 
 Source: https://github.com/php/php-src/commit/2b0f239b211c7544ebc7a4cd2c977a5b7a11ed8a (PHPの公式リポジトリ) 
 RayZeroV @rayzerov
  7. 誰が、どうやって公式リポジトリに書き込んだのか?
 どのようにして挿入されたか 
 git.php.netサーバーの侵害(当時は GitHub がミラーで、こちらが大本だった)
 →この侵害の後、 git.php.net を廃止し、GitHub を大本とするようになった。


    
 誰が書き込んだのか 
 特定はされていないが、明らかに悪意のある人物
 Source: https://news-web.php.net/php.internals/113838 (PHPのメーリングリスト) 
 RayZeroV @rayzerov