【问题标题】:Subresource Integrity and cross-origin data leaks子资源完整性和跨域数据泄露
【发布时间】:2022-01-11 22:37:18
【问题描述】:

我正在阅读有关 Mozilla [1] 的子源完整性的信息。他们分析了下面的代码 sn-p 并写了以下内容:

匿名值意味着浏览器应该忽略用户可能与域相关联的任何 cookie 或身份验证。 这可以防止跨域数据泄漏,并且还可以使请求更小。

<script src="https://code.jquery.com/jquery-2.1.4.min.js"
integrity="sha384-R4/ztc4ZlRqWjqIuvf6RX5yb/v90qNGx6fS48N0tRxiGkqveZETq72KgDVJCp2TC"
crossorigin="anonymous"></script>

我很感兴趣为什么这可以防止跨域数据泄漏[2]。 Mozilla 写道:

攻击者会尝试加载具有已知摘要的资源,并注意加载失败。如果加载失败,攻击者可以推测响应与哈希不匹配,从而获得一些洞察其内容。例如,这可能会显示用户是否登录到特定服务。

我了解如何使用integrity 属性来显示资源的内容。如果内容依赖于客户端,这似乎很有趣。但是,我不明白两件事:

  1. 如果在特定客户端加载资源时,黑客对资源的内容感兴趣,并且黑客可以控制该页面上的 HTML 和 Javascript。那为什么黑客会尝试通过完整性哈希来泄露该资源的内容,为什么不直接在客户端获取资源并将responseText发送到恶意网站呢?
  2. Mozilla 似乎描述了网站所有者需要将crossorigin 设置为anonymous 以便黑客无法通过暴力破解哈希来“暴力破解”页面信息?如果黑客可以控制页面上的integrity属性,那么在大多数情况下他们也可以控制crossorigin属性,那么这有什么关系呢?

【问题讨论】:

    标签: javascript html http cross-domain


    【解决方案1】:

    您描述的情况与该文档的作者所想的不同。攻击者可能对子资源加载触发的经过身份验证的请求的响应的确切内容不感兴趣;相反,攻击者可能只是想从恶意来源确定受害者是否登录到目标。

    想象这样一种情况,对GETting https://example.com/1.js 的响应取决于请求是否携带一些身份验证cookie(为简单起见,此处标记为SameSite=None; Secure):

    alert('authenticated');
    

    alert('anonymous');
    

    alert('anonymous');(后跟换行符)的 SHA-256 是 a7c873e2f388c05f57d1245cfa0c20e4bf5b064677ba4f959c5dd53668590339。攻击者可以设置以下恶意页面,作为登录预言机

    <script integrity="sha256-a7c873e2f388c05f57d1245cfa0c20e4bf5b064677ba4f959c5dd53668590339" 
            src="https://example.com/1.js"
            crossorigin="use-credentials"
            onerror="notifyAttackerVisitorIsLoggedInToExampleDotCom();">
    

    当受害者访问攻击者的恶意页面时,可能有两种情况:

    • 如果受害者没有登录https://example.com,则对子资源加载的响应包含alert('anonymous');,其哈希值与攻击者的integrity 属性中指定的哈希值匹配。不会发生错误。
    • 如果受害者登录https://example.com,则对子资源加载的响应包含alert('authenticated');,其哈希值与攻击者的integrity 属性中指定的值不匹配。因此,会发生错误并触发 onerror 事件侦听器,通知攻击者。

    【讨论】:

    • 嗯,我现在意识到我不是在回答这个问题...等我有空再回来讨论这个问题。
    • 感谢您的回复。我理解你的回答,肯定是我感兴趣的方向,但它确实还不是我问题的答案。无论如何,谢谢,我期待着您的回复。干杯!
    猜你喜欢
    • 2020-10-23
    • 2016-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    • 2016-11-02
    • 2019-02-14
    • 1970-01-01
    相关资源
    最近更新 更多