Keycloak 18.0.0 之前和 10.0.0 之后的版本在 clients-registrations 端点存在反射型 XSS 漏洞。该漏洞通过 POST 提交一个 JSON 结构触发,该结构的键是端点不支持的参数名。响应会在错误信息中回显该 JSON 键,并将头部设置为 Content-Type: text/html。在浏览器中执行时,JSON 键中的 HTML 代码会被解析,从而触发 JavaScript 代码。无需认证,漏洞影响所有可用的 realm。
当前,由于该漏洞需要 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(使用 wildfly 而非 quarkus 运行的版本)中,基础路径使用 /auth/realms/* 而不是 /realms/*
正如我们在多个来源中看到的那样这里或这里,通常无法利用需要 Content-Type: application/json 的反射型 POST XSS 漏洞。唯一可能发生的情况是 CORS 策略被手动放宽,允许跨域请求。这种情况仅在应用程序所有者出于功能原因而设定的非常特定的用例中才合理。为了在这种情况下利用,攻击者要么需要控制 CORS 策略中允许的域/服务器,要么需要在该第二域上有一个 XSS 漏洞作为中继。
对于 CVE-2021-20323,Keycloak 不接受 Content-Type 为 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(RedHat 重新打包的 Keycloak 版本)没有已知的修复版本。
clients-registrations 的调用。clients-registrations 的访问,类似于这篇 Keycloak 博客文章。MIT License © [ndmalc]