PHP脆弱性
概要
PHPは世界中のウェブサイトの相当部分を動かすサーバーサイドスクリプト言語だが、動的型付けと自動型変換、ファイルインクルード(include)ベースのテンプレート処理、長期間維持されたレガシー関数など、言語設計上の柔軟性がさまざまなセキュリティ欠陥の原因となってきた。「PHP脆弱性」は、PHPアプリケーションで繰り返し現れる脆弱性の類型とその根本原因、および防御手法を包括する概念である。
主な内容
代表的な脆弱性の類型
- SQLインジェクション: ユーザー入力を文字列連結でクエリに埋め込むときに発生する。PDO・mysqliのプリペアドステートメントで大半は防御できる。
- XSS(クロスサイトスクリプティング):
echoでユーザー入力をそのまま出力するときに発生し、htmlspecialchars($s, ENT_QUOTES, 'UTF-8')による出力エスケープが基本対応である。 - ファイルインクルード(LFI/RFI):
include、requireにユーザー入力が入り、ローカル・リモートファイルの実行につながる。ホワイトリストとrealpath()検証が必要である。 - OSコマンドインジェクション:
system、exec、shell_exec、passthru、popen、proc_openなどに入力が渡されるときに発生し、escapeshellarg()の使用が推奨される。 - PHPオブジェクトインジェクション(逆シリアル化):
unserialize()が信頼できないデータに適用されると、マジックメソッド(__wakeup、__destruct)を悪用した攻撃が可能になる。allowed_classesオプションやjson_decode()への置き換えが必要である。 - 型ジャグリング:
==比較の緩い型変換によって認証バイパスが発生し得るため、===の使用が推奨される。 - ファイルアップロード脆弱性: 拡張子・MIME検証の不備によりウェブシェルがアップロードされる事例が代表的である。
- セッション固定・奪取: セッションIDの再生成(
session_regenerate_id)とCookie属性(HttpOnly、Secure、SameSite)の設定が鍵となる。
言語・ランタイム次元の原因
過去のregister_globalsとmagic_quotes_gpcは入力検証を歪め、大規模な脆弱性を生んだが、それぞれPHP 5.4で削除された。preg_replaceの/e修飾子はPHP 7.0で削除され、create_function()は7.2で非推奨化後に8.0で削除された。assert()は8.0から文字列をコードとして評価しない。それでもeval()、動的変数($var)、extract()のような機能は依然として危険である。また、phar://ストリームラッパーを介した逆シリアル化、display_errors有効化によるパス・設定情報の露出も頻繁に指摘される。
バージョン別のセキュリティ変化
PHP 5.4はグローバル変数・マジッククォートを削除し、PHP 7.0は実行演算子と/e修飾子を整理しつつ性能とともに安全性を改善した。PHP 8.0はJIT導入とともにcreate_function削除、型システム強化を実現し、8.1は列挙型、8.2は動的プロパティの廃止予告、8.3・8.4は型付けとセキュリティ関連の整理を続けた。古い5.x・7.x系はサポート終了(EOL)によりパッチが提供されず、構造的リスクが大きい。
防御手法
入力検証と出力エスケープを分離することが原則である。データベースはプリペアドステートメント、HTMLはコンテキスト別のエスケープ、シェルは引数エスケープを使用する。ファイルパスはホワイトリストとbasename()・realpath()で正規化し、逆シリアル化はできる限り署名付きトークンやJSONに置き換える。open_basedir設定、display_errors=Off、最小権限の実行アカウント、PHP-FPMプール分離、コンテナベースのサンドボックス化も有効である。依存関係はcomposer auditで点検し、フレームワーク(Laravel、Symfony)が提供するCSRF・ORM・検証機能を活用するのが安全である。
実際の事例
WordPressプラグインとテーマで繰り返し報告されるファイルインクルード・SQLインジェクション脆弱性、phpMyAdminの多数のCVE、PHPUnitのeval-stdin.phpリモートコード実行(CVE-2017-9841)、Laravel Ignitionの逆シリアル化脆弱性(CVE-2021-3129)などが代表的である。2024年にはWindows環境のPHP-CGIで引数インジェクションにより任意コード実行が可能なCVE-2024-4577が大きな問題となった。
最新動向
2024~2025年時点でPHP 8.1のサポート終了が近づき、8.2以上への移行がセキュリティ勧告として定着し、PHP 8.4が2024年11月に正式リリースされた。CVE-2024-4577以降、PHP-CGIおよびWindowsディストリビューション構成の点検が強調されており、Composerエコシステムを狙ったサプライチェーン攻撃(悪性パッケージ、タイポスクワッティング)が増加する傾向にある。静的解析(SAST)・依存関係スキャン・ランタイムアプリケーション自己防御(RASP)ツールの導入が増えており、レガシーCMS・プラグインの自動化された脆弱性スキャンとパッチ管理が実務の中心的課題として浮上した。
関連トピック
- [[SQLインジェクション]]
- [[クロスサイトスクリプティング]]
- [[逆シリアル化脆弱性]]
- [[ウェブアプリケーションセキュリティ]]
- [[CVE]]