abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · cakephp-cookie-suffix
解説記事: https://abraxaslabs.tech/research/cakephp-cookie-suffix
分類: Cookie リーク / 植え付け 到達範囲: リモート
CakePHP 5.4.2 (887b641) - Cake Software Foundation
CookieCollection::findMatchingCookies は preg_match('/' . preg_quote($domain) . '$/', $host) を使用しています。これは文字列のサフィックス一致であり、RFC 6265 のドメインマッチではありません。api.partner.com 用の Cookie が evilapi.partner.com に送信されます。bank.com 用の Cookie が notbank.com に送信されます。
Cookie::createFromHeaderString() もまた、レスポンスのホストに対するチェックなしで Set-Cookie の Domain= をコピーします。attacker.test からの addFromResponse で Domain=victim.internal を指定すると、その Cookie が保存され、後に victim.internal に付与されます。
複数のホストにまたがってデフォルトの jar と共に Cake\Http\Client を使用するアプリは、パートナーのセッション Cookie をサフィックス混同した兄弟ホストにリークしたり、攻撃者の URL を取得した後に内部ホストへ Cookie を植え付けたりする可能性があります。 other.com はマッチしません。これはブラウザの Cookie のバグではありません。素の cakephp/app はそれ自体で別のホストを呼び出すことはありません。
| ID | CVE 未割当 |
| 分類 | Cookie リーク / 植え付け (正規表現サフィックスによるドメインマッチ) |
| 到達範囲 | リモート (アプリがホストをまたいで Http Client の jar を使用) |
| CWE | CWE-565, CWE-201 |
| CVSS | High: 8.2 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N |
| 製品 | CakePHP |
| 影響を受けるバージョン | 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63) |
| 認証 | アプリがホストをまたいでデフォルトの Cookie jar と共に Cake\Http\Client を使用 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1 のみ |
複数のホストにまたがって Cake\Http\Client の Cookie を保持するアプリケーションが必要です (OAuth、Webhook、ユーザー指定の URL、2 つ目の API など)。
| 権限 | メソッド / シンク | ラボで実証済みか推測か |
|---|---|---|
| 保存された Cookie をサフィックス混同した兄弟ホストへリークする | ドメイン api.partner.com の Cookie の後、https://evilapi.partner.com/ に対して CookieCollection::addToRequest | ラボで実証済み。リクエストの Cookie は sid=SECRET。RFC 6265 ではマッチしない |
| 登録可能なサフィックスに対する同様のリーク | Cookie ドメイン bank.com、リクエストホスト notbank.com | ラボで実証済み。リクエストの Cookie は sid=SECRET |
| ネガティブコントロール | リクエストホスト other.com | ラボで実証済み。Cookie ヘッダーなし |
| 内部ホスト用の Cookie を植え付ける | https://attacker.test/ からの Set-Cookie: sid=x; Domain=victim.internal に対する addFromResponse | ラボで実証済み。保存されるドメインは victim.internal。そのホストへの次のリクエストで sid=x が送信される |
| 次回の Client 呼び出しでのセッション固定 / 盗まれたパートナーセッション | 植え付けられた、またはリークされた sid を API セッションとして使用 | 推測。ラボは Cookie ヘッダーのオラクルまでで停止 |
| 同一ホストへの送信は引き続き機能する | Cookie ドメイン api.partner.com からホスト api.partner.com へ | ラボで実証済み。想定どおりであり、バグではない |
この残存項目についてはクローズ済み: other.com はマッチしません。ブラウザの Cookie jar はこのバグではありません。シェルはありません。スケルトンアプリに対する未認証 RCE ではありません。
GHSA-2qh5、GHSA-fxf7、GHSA-vjqc、および 5.4.2 の filename= に関する注記の後、cakephp/cakephp 5.4.2 を固定しました。Http Client の Cookie マッチングは正規表現サフィックスです:
$pattern = '/' . preg_quote($domain, '/') . '$/';
if (!preg_match($pattern, $host)) {
continue;
}
addFromResponse はリクエストのホストをデフォルトとしてのみ渡します。Set-Cookie の Domain= 属性はそれを上書きして保存されます。
すでに記録済みの誤った方向性: これをブラウザの Cookie バグとして扱うこと; other.com も一致すると主張すること; ホストをまたいで jar を使用するアプリがないのに Cookie ヘッダーオラクルを ATO に誇張すること。見せかけ: リバースシェル。
python3 cakephp-cookie-suffix-Abraxas-Labs.py
または
cd lab
./run.sh
Git clone タグ 5.4.2(887b641de9f7aba06071f98f17edcbc573cbcf63)を PHP 8.3 で実行。ループバック oracle HTTP は 127.0.0.1:19420。追加の HTTP オリジンは不要。oracle はピンから CookieCollection を実行する。
sid=SECRET ドメイン api.partner.com を追加。addToRequest https://evilapi.partner.com/ -> Cookie: sid=SECRET。https://other.com/ -> Cookie ヘッダーなし。https://api.partner.com/ は依然として sid=SECRET を送信。bank.com -> https://notbank.com/ は sid=SECRET を送信。https://attacker.test/ からの addFromResponse で Set-Cookie: sid=x; Domain=victim.internal; Path=/。次の https://victim.internal/ は sid=x を送信。SUCCESS cakephp-cookie-suffix suffix-leak=yes control-other=yes plant-domain=yes how=cakephp-5.4.2 CAKEPHP-COOKIE-SUFFIX-WITNESS
RFC 6265 のドメインマッチ(host === domain || str_ends_with($host, '.' . $domain))。Domain が省略された場合はホストオンリー Cookie とする。リクエストホストにドメインマッチしない Domain は拒否する。パブリックサフィックスは拒否する。
887b641de9f7aba06071f98f17edcbc573cbcf63)src/Http/Cookie/CookieCollection.php · src/Http/Cookie/Cookie.phpGNU Affero GPL v3.0。LICENSE を参照。ループバックラボ専用。保証なし。