在整个会话中重用CSP脚本随机数?

时间:2019-05-03 07:51:57

标签: jsf content-security-policy nonce

这是https://github.com/w3c/webappsec-csp/issues/215的后续活动。 arturjanc建议将此讨论移至stackoverflow。

我们正在尝试为JSF中的脚本实现CSP,并且不知道在整个会话中重用脚本随机数是否安全。或者,如arturjanc所建议的那样,让原始文档将其当前随机数发送到服务器,该服务器会生成将来的响应。

假设在整个会话中重用随机数是不安全的,将初始随机数包括在当前执行的here之类的隐藏形式输入中就可以了。 (暂时忽略CSP标头/ XSS注入漏洞-只是一个原型)

@arturjanc:您想再次鸣叫吗?

编辑:有关arturjanc答案的其他想法:

您能否详细说明如何在当今的典型JSF应用程序中实现每响应随机数,即在开始和随后的仅XHR通信中仅加载一个完整的页面?

如果我对您的理解正确,那么您的建议是始终在每个XHR请求中重新发送最初生成的随机数。但是,实际上,这实际上与每个会话的随机数是完全相同的,不是吗?在实现方面更加复杂。

严格执行每个响应的随机数将意味着后续响应还必须包括该会话中较早创建的所有随机数,因此我们将以某种方式跟踪该会话的所有随机数。

为每个仅包含新创建的按响应随机数的XHR响应设置新的CSP标头可能无法正常工作,这是因为浏览器通过使用交集策略合并多个CSP标头来处理跨响应的多个CSP标头,即Content-Security-Policy: 'nonce-1'响应2中的响应1和Content-Security-Policy: 'nonce-2'会使响应2之后的两个随机数都无效。

1 个答案:

答案 0 :(得分:1)

遗憾的是,您的问题没有一个正确的答案:每个会话的随机数显然不是错误的,但是它带来了这样的风险,即只要一个随机数可以被攻击者泄露,它就可以在另一个页面加载时重用,从而使攻击者能够利用CSP可以缓解的XSS错误。

具体来说,当您在隐藏的输入字段中包含随机数时,它允许使用abusing CSS selectors来提取值;请注意,针对script#nonce属性的攻击不会有效,因为浏览器会从DOM中隐藏该属性的值以防止此类攻击。

我的建议有两个方面:

  • 尝试使每个响应数(而不是每个会话数)成为随机数。这样,即使可以窃取随机数,攻击者也很难重用它。
  • 如果您需要重新使用随机数以允许从服务器异步获取标记以包含具有正确随机数值的脚本,请执行此操作而无需将随机数复制到DOM。例如,如果您对带有nonce参数的URL使用XHR,请执行类似xhr.open("/my/url?nonce=" + document.currentScript.nonce)
  • 的操作