abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · 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 に添付されます。
デフォルトのジャーを使用して複数のホストにまたがって Cake\Http\Client を使用するアプリは、パートナーセッション Cookie をサフィックス混同された兄弟ホストに漏洩させるか、攻撃者の URL を取得した後に内部ホストに Cookie を植え付ける可能性があります。 other.com は一致しません。これはブラウザの Cookie バグではありません。素の cakephp/app はそれ自体で2番目のホストを呼び出しません。
| ID | CVE はまだありません |
| クラス | Cookie リーク / 植え付け (正規表現サフィックスドメインマッチ) |
| 到達範囲 | リモート (アプリがホスト間で Http Client ジャーを使用) |
| 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 ジャーを使用して 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 ジャーはこのバグではありません。シェルはありません。スケルトンアプリに対する未認証 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 も一致すると主張すること。ホスト間でジャーを使用するアプリなしに Cookie ヘッダーオラクルを ATO に誇張すること。茶番: リバースシェル。
python3 cakephp-cookie-suffix-Abraxas-Labs.py
または
cd lab
./run.sh
PHP 8.3 で Git クローンタグ 5.4.2 (887b641de9f7aba06071f98f17edcbc573cbcf63)。127.0.0.1:19420 でループバックオラクル HTTP。追加の HTTP オリジンは不要です。オラクルはピンから 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 を参照。ループバックラボのみ。保証なし。