我如何知道我的子资源完整性标签 (SRI) 不是从恶意 CDN 生成的?

Posted

技术标签:

【中文标题】我如何知道我的子资源完整性标签 (SRI) 不是从恶意 CDN 生成的?【英文标题】:How do I know my Subresource Integrity Tags (SRI) was not generated from a malicious CDN? 【发布时间】:2021-05-13 12:53:09 【问题描述】:

例如,我在 Angular 中了解,在构建项目时,您可以使用以下命令自动添加子资源完整性 (SRI) 标签:

ng build --subresource-integrity

我的问题是,在运行该命令时,我如何知道创建的哈希不是来自恶意 CDN?

我觉得这就像我可能永远不会知道的鸡与蛋的问题?

【问题讨论】:

【参考方案1】:

SRI 保护页面中加载资源的完整性。它可以防止此类资源的受损存储,但前提是页面本身不在该受损存储中。加载资源的页面是特殊的,因为它有机会检查 SRI,就像这些资源的来源不受信任一样,但您需要能够从受信任的来源提供页面。

请注意,除了检测恶意 CDN 之外,这还有其他好处。 SRI 提供的是保证加载的资源与您在创建页面时打算加载的资源相同。在部署到某个地方之前,资源可能会在 CI 管道之类的东西上发生很多事情,它们将在构建期间存储在中间服务器上,复制到 CDN 等等,SRI 确保所有这些到客户端浏览器的完整性.但同样,只要包含这些资源的页面不受影响。

换句话说,如果页面与资源一起存储在同一个 CDN 中,SRI 将无法防止 CDN 受到损害 - 当您信任它来提供您的所有内容时,它怎么可能呢?但它仍然可以防止这些文件进入 CDN 的管道受到损害。

编辑:我可能误解了这个问题。

NPM 包使用 PGP 签名,因此只要您只有受信任的密钥,获取依赖项是安全的。

【讨论】:

所以我想我是正确的,当你为说 jQuery 生成 SRI 标记时,我可以从受损的 CDN 获得它。 这取决于你如何从cdn获取它。如果你只是下载它,是的,你信任它的来源,但如果你使用 https,它在下载时是安全的(但它可能已经在源头受到损害)。如果你通过 npm 获取它,签名将根据签名密钥进行检查,从那里它是一个复杂的问题,它对什么是安全的,让我们说它比简单地手动下载更安全。

以上是关于我如何知道我的子资源完整性标签 (SRI) 不是从恶意 CDN 生成的?的主要内容,如果未能解决你的问题,请参考以下文章

如何获得 aspnetcdn.com 的 SRI(子资源完整性)哈希?

检查请求是不是是 Chrome 扩展程序中的子资源完整性

使用 Require JS 的 angularJS 应用程序中的子资源完整性

SRI 哈希不是预期的

PHP 中的子资源完整性和缓存破坏技术

子资源完整性 Opera 浏览器支持?