
CVE-2021-20323の概念実証と分析であり、Keycloakのclients-registrationsエンドポイントにおける反射型XSS脆弱性について、悪用条件、緩和策の推奨事項、および公式アドバイザリへのリンクを含んでいます。
Keycloak 18.0.0 未満かつ 10.0.0 以降には、clients-registrations エンドポイントに反映型 XSS が存在します。このバグは、エンドポイントでサポートされていないパラメータ名をキーとする JSON 構造を POST で送信することでトリガーされます。レスポンスは、エラーメッセージ内に JSON キーを反映し、ヘッダーが Content-Type: text/html に設定されます。ブラウザで実行されると、JSON キー内の HTML コードが解釈され、JavaScript コードがトリガーされます。認証は不要で、バグは利用可能なすべてのレルムに影響します。
現在、このバグは Content-Type: application/json を必要とし、POST で送信されるため、ユーザーに影響を与える一般的な悪用手順はありません。
このリポジトリは、CVE-2021-20323 の POC と、修正/緩和の推奨事項を提供します。
このバグは非常に簡単にトリガーできます。
curl -v -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/json" -d "{\"\":1}"
openid-connect プロバイダーを使用してもトリガー可能です。
curl -v -X POST {BaseURL}/realms/master/clients-registrations/openid-connect -H "Content-type: application/json" -d "{\"\":1}"
注: 古い Keycloak バージョン(quarkus ではなく wildfly で動作しているもの)では、ベースパスは /realms/* ではなく /auth/realms/* になります。
複数の情報源(こちら や こちら)で確認できるように、Content-Type: application/json を必要とする反映型 POST XSS を一般的に悪用することはできません。悪用が可能となる唯一のケースは、CORS ポリシーがデフォルトから手動で緩和され、クロスオリジンリクエストが許可されている場合です。このシナリオは、アプリケーション所有者が機能上の理由から特別なユースケースでのみ想定するのが妥当です。このような場合に悪用可能とするには、攻撃者は CORS ポリシーで許可されているドメイン/サーバーを制御しているか、リレーとして使用できる第二のドメインに XSS がある必要があります。
CVE-2021-20323 では、Keycloak は基本的な form 送信で許可される唯一のタイプである multipart/form-data または application/x-www-form-urlencoded の POST を受け付けません。このため、CVE-2021-20323 は CORS が明示的に許可している場合にのみ悪用可能です。
# curl -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: multipart/form-data" -d "{\"\":1}"
{"error":"RESTEASY003065: Cannot consume content type"}
# curl -X POST {BaseURL}/realms/master/clients-registrations/default -H "Content-type: application/x-www-form-urlencoded" -d "{\"\":1}"
{"error":"RESTEASY003065: Cannot consume content type"}
Keycloak 18.0.0 以降にアップデートしてください。
RedHat Single Sign-On(Keycloak を RedHat が再パッケージしたもの)については、既知の修正バージョンはありません。
clients-registrations への呼び出しを禁止するリバースプロキシを設置する。clients-registrations へのアクセスを制限する(この Keycloak ブログ記事 と同様)。MIT ライセンス © [ndmalc]