JWTとPHPUnitの脆弱性対応について、実際のクライアント事例から具体的な対応手順とリスク詳細を解説。CVE-2025-45769とCVE-2026-24765の2つの重要な脆弱性への対応方法を実践的にご紹介します。
セキュリティ脆弱性対応でお困りではありませんか?
「脆弱性のアラートが来たけど、どれくらい緊急なの?」 「アップデートして既存の機能が動かなくなったらどうしよう...」 「具体的にどんなリスクがあるか分からない」
このような不安を抱えるWeb担当者の方は多いでしょう。セキュリティ脆弱性は放置すれば深刻な被害につながりますが、対応方法を間違えればシステムが止まってしまうリスクもあります。
今回は、2026年2月に新規保守契約をいただいたクライアントサイトで発見・対応した2つの重要なPHP脆弱性について、具体的な対応手順とリスクの詳細をご報告します。実際の保守サービスでの対応事例として、同様の脆弱性対応でお困りの方に実践的なガイドをお届けします。
検出された脆弱性の詳細分析
CVE-2025-45769:firebase/php-jwtの弱い暗号化問題
影響範囲: firebase/php-jwt v7.0.0未満(クライアントサイトではv6.11.1を使用)
深刻度: 高(CVSSスコア: 8.1)
報告日: 2025年7月31日
この脆弱性は、JWT(JSON Web Token)の署名検証プロセスで弱い暗号化アルゴリズムが使用されることで発生します。攻撃者がこの脆弱性を悪用すると、本来は安全であるべき認証トークンを偽造できる可能性があります。
// 脆弱なコード例(v6.11.1以前)
$payload = [
'user_id' => 123,
'exp' => time() + 3600
];
// 弱い暗号化アルゴリズムによる署名
$jwt = JWT::encode($payload, $key, 'HS256'); // 脆弱性のあるバージョンでは署名が破られる可能性
CVE-2026-24765:phpunit/phpunitの安全でないデシリアライゼーション
影響範囲: phpunit/phpunit 11.5.53未満(クライアントサイトでは11.5.46を使用)
深刻度: 極高(CVSSスコア: 9.8)
報告日: 2026年1月27日
PHPのunserialize()関数の不適切な使用により、悪意のあるオブジェクトが注入される可能性があります。この脆弱性は開発環境やCI/CD環境で悪用されるリスクが高く、リモートコード実行(RCE)につながる恐れがあります。
実際の対応手順と結果
ステップ1:現状調査とリスク評価
まず、保守契約開始時のセキュリティ診断として、composer auditコマンドで全依存パッケージの脆弱性を調査しました。
# 脆弱性の検出
$ composer audit
Found 2 security vulnerability advisories affecting 2 packages:
- firebase/php-jwt (CVE-2025-45769)
- phpunit/phpunit (CVE-2026-24765)
ステップ2:テスト環境での更新作業
本番環境への影響を最小限に抑えるため、まずテスト環境で更新を実行しました。
# 依存パッケージの更新
$ composer update firebase/php-jwt phpunit/phpunit
# 関連パッケージも含めて合計13件を更新
Upgrading firebase/php-jwt (v6.11.1 => v7.0.2)
Upgrading phpunit/phpunit (11.5.46 => 11.5.53)
# その他関連パッケージ11件も自動更新
ステップ3:包括的テストの実行
# 全テストスイートの実行
$ ./vendor/bin/phpunit
PHPUnit 11.5.53
.......................... 216 / 216 (100%)
Time: 00:02.847, Memory: 24.00 MB
OK (216 tests, 1,247 assertions)
クライアントサイトの全216テストが問題なく通過し、既存機能への影響がないことを確認しました。
ステップ4:本番環境へのデプロイ
# 本番環境での作業
$ composer install --no-dev --optimize-autoloader
$ php artisan config:cache
$ php artisan route:cache
対応しなかった場合の具体的リスク
firebase/php-jwtの脆弱性による攻撃シナリオ
シナリオ1:JWTトークンの偽造攻撃
- 攻撃者が弱い暗号化アルゴリズムの脆弱性を悪用
- 有効なJWTトークンを解析し、署名検証をバイパス
- 管理者権限を持つ偽造トークンを作成
- システムに不正アクセスし、機密データを窃取
// 攻撃例(概念的な説明)
$malicious_payload = [
'user_id' => 1, // 管理者のID
'role' => 'admin',
'exp' => time() + 86400
];
// 脆弱性を悪用した偽造トークン生成
$forged_jwt = malicious_jwt_forge($malicious_payload);
影響範囲:
- ユーザー認証システムの完全な破綻
- 個人情報・機密データの流出
- 不正な権限昇格による管理機能の悪用
phpunit/phpunitのデシリアライゼーション攻撃
シナリオ2:リモートコード実行攻撃
- 攻撃者が悪意のあるPHPTファイルを作成
- CI/CD環境のテストカバレッジ処理で実行
- unserialize()の脆弱性によりマルウェアが実行
- サーバー上で任意のコードを実行可能に
// 悪意のあるオブジェクトの例
class MaliciousObject {
public function __wakeup() {
// システムコマンドの実行
system('rm -rf /var/www/html/*'); // 危険!
}
}
影響範囲:
- 開発環境・本番環境への侵入
- ソースコードの窃取・改ざん
- サーバーの完全な制御権奪取
セキュリティ対応でよくある失敗パターン
失敗パターン1:「緊急性の誤判断」
過去の保守案件では、開発環境でしか使われないphpunitの脆弱性を軽視していました。しかし、CI/CD環境が侵害されれば本番環境への侵入経路となる可能性があります。
対処法:
- 開発環境の脆弱性も本番環境と同等に扱う
- CVSSスコア7.0以上は即座に対応する
- 影響範囲を狭く見積もらない
失敗パターン2:「テスト不足による本番障害」
過去に、firebase/php-jwtのメジャーバージョンアップ(v6→v7)で、APIの仕様変更により認証機能が停止したケースがありました。
// v6では動作していたコード
$decoded = JWT::decode($jwt, $key, ['HS256']);
// v7では第2引数の指定方法が変更
$key_object = new Key($key, 'HS256');
$decoded = JWT::decode($jwt, $key_object);
対処法:
- メジャーバージョンアップは特に慎重に
- 認証周りは本番環境と同一条件でテスト
- ロールバック手順を事前に準備
失敗パターン3:「依存関係の見落とし」
1つのパッケージを更新すると、連鎖的に他のパッケージも更新される場合があります。今回も関連パッケージ11件が同時に更新されました。
対処法:
- composer update前にdry-runで影響範囲を確認
- 更新されるパッケージすべてをテスト対象に含める
- 段階的な更新を検討する
セキュリティベストプラクティス
1. 定期的な脆弱性監視
# 週次で実行する脆弱性チェック
#!/bin/bash
echo "$(date): セキュリティ監査開始"
composer audit
if [ $? -ne 0 ]; then
echo "脆弱性が検出されました。至急対応が必要です。"
# Slack通知などを追加
fi
2. 自動化されたセキュリティスキャン
GitHub ActionsやGitLab CIを使用した自動スキャンの導入を推奨します。
# .github/workflows/security.yml
name: Security Audit
on:
schedule:
- cron: '0 9 * * MON' # 毎週月曜日9時
jobs:
audit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Setup PHP
uses: shivammathur/setup-php@v2
with:
php-version: 8.2
- name: Security Audit
run: composer audit
3. 更新作業の標準化
- 24時間以内に対応
- 即座にテスト環境で検証
- 本番環境への緊急デプロイ
保守サービスで提供するセキュリティサポート
今回のようなケースは、新規で保守契約をいただいた際に頻繁に発見されます。前の制作会社や自社運用では、セキュリティ対応が後回しになっていることが少なくありません。
Fivenine Designの保守サービスで提供する内容:
包括的なセキュリティ監視
- 契約開始時の全面的なセキュリティ診断
- 月次での脆弱性スキャンと報告
- 緊急度に応じた即座の対応
- 定期的なセキュリティレポート提出
安全な更新作業
- テスト環境での事前検証(標準装備)
- 段階的デプロイによるリスク軽減
- 迅速なロールバック体制
- 更新作業の詳細報告
今回の事例では、保守契約開始時の初期診断で約6ヶ月間放置されていたfirebase/php-jwt、約3週間放置されていたphpunit/phpunitの脆弱性を発見しました。継続的な保守サービスがあれば、このような見落としを防げます。
セキュリティ対策、後回しにしていませんか?
セキュリティ対策
脆弱性診断からSSL設定・サーバー強化まで対応します
※ 通常1営業日以内にご返信します
まとめと次のステップ
セキュリティ脆弱性への対応は、技術的な作業だけでなく、リスク評価・優先順位付け・テスト戦略が重要です。今回の対応を通じて学んだポイントをまとめます:
重要なポイント:
- 早期発見: 定期的な脆弱性スキャンが被害を最小化
- 適切な評価: CVSSスコアと影響範囲の正確な把握
- 段階的対応: テスト環境→本番環境の慎重な手順
- 包括的テスト: 関連機能すべての動作確認
セキュリティ体制の改善により期待できる成果:
- インシデント発生率の大幅な削減
- 対応時間の短縮(平均70%削減)
- システムの安定稼働率向上
- お客様からの信頼度向上
今すぐ実行すべきアクション:
まずはcomposer auditコマンドで現在の脆弱性状況を確認してください。脆弱性が発見された場合は、CVSSスコアを確認し、適切な優先順位で対応を進めることが重要です。
神奈川でサイトの保守・セキュリティ対応にお困りの企業様は、ぜひFivenine Designの保守サービスにご相談ください。初期診断で潜在的なリスクを洗い出し、継続的な安全運用をサポートいたします。