JASIG CAS CORS 当 Origin == "null" 时会发生啥?
Posted
技术标签:
【中文标题】JASIG CAS CORS 当 Origin == "null" 时会发生啥?【英文标题】:JASIG CAS CORS what should happen when Origin == "null"?JASIG CAS CORS 当 Origin == "null" 时会发生什么? 【发布时间】:2016-09-05 05:33:42 【问题描述】:我正在使用 CAS 服务器来保护我的 Spring 应用程序,其中包括 REST 和 HttpInvoker API。
当应用程序重定向到不同域中的 CAS 服务器时,我们会得到 CORS '问题'。我已将 eBay Cors-Filter https://github.com/eBay/cors-filter 添加到应用程序和 CAS 服务器。
不过……
当应用程序重定向到 CAS 服务器进行身份验证时,Origin 标头更改为“null”。这是由于 CORS 规范(第 14 页,第 7.3 节)中提到的“隐私敏感”上下文。
...而且,现在终于...问题了!
如果服务器收到 'null' 的 Origin 标头,它是否可以正常进行,只在 Access-Control-Allow-Origin 标头中返回 'null'?
这会破坏什么吗?
不安全吗?
干杯
【问题讨论】:
【参考方案1】:允许null
起源是不安全的。 This blog post 很好地分解了原因。简短的版本是,它启用了一种 CSRF 形式。 null
的允许来源意味着“任何重定向到我的页面”(或从 file:///
URL 运行的任何代码,但这是另一个主题)。
假设您在app.example.com
上的应用使用service.example.com
上的服务,并在auth.example.com
上受CAS 保护。此外,假设您使用Access-Control-Allow-Origin: null
设置service
,以便您可以从指向auth
的app
获取并重定向到service
。明白了吗?好的,你获取auth.example.com/cas/login?service=service.example.com
,登录发生(auth.example.com
上设置的会话 cookie),重定向发生(service.example.com
上设置的会话 cookie),app
从service
获取数据。由于您的 Access-Control
标头,浏览器允许您的应用读取响应。
现在,假设您访问了一个知道您的服务的恶意页面 (evil.com/hello
)。他们在evil.com/redir
上运行一个指向service.example.com
的302 页面。现在,这个恶意代码可以使用credentials="include"
获取evil.com/redir
。浏览器将请求重定向页面,获得一个302
,其中 ACA-Origin=https://evil.com
和 ACA-Credentials=true,Location
的 service.example.com
。浏览器跟随 302,请求 service.example.com
并包含相关的会话 cookie。在此请求中,Origin
设置为 null
,但您已将该值列入白名单,因此您的服务会发送一个 ACA-Origin 值 null
,并且浏览器允许(恶意)请求代码查看响应。您刚刚将经过身份验证的数据从您的服务泄漏到注入的脚本中,这可以将其发送给攻击者。
【讨论】:
【参考方案2】:是的,我相信您可以返回 null
或通配符 *
以允许任何来源。
这会破坏什么吗?
如果您只在收到Origin: null
时返回null
,那么它应该不会影响其他任何事情。
不安全吗?
我不熟悉 CAS,但是只要您不发送Access-Control-Allow-Credentials
,并且您的 CAS 不受 IP 限制或仅在本地网络上,那么这不会打开您的系统与匿名访问一样。有关技术详情,请参阅this answer。
如果是,那么设置 Access-Control-Allow-Origin
将允许其他域和来源从用户访问的 CORS 中读取数据,使用他们的 CAS cookie。
【讨论】:
以上是关于JASIG CAS CORS 当 Origin == "null" 时会发生啥?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 Spring MVC & Security、Jasig CAS 和 JSP 视图在 Spring Boot 2 中配置 UTF-8?