前言
子资源篡改是一种不太常见的攻击方式,想要进行这种攻击,攻击者要克服更多的技术障碍。这种攻击通常是针对那些被很多网站依赖的第三方库或插件的 CDN 进行的。简单来说,如果一个受欢迎的第三方资源被黑客篡改,那么所有使用这个资源的网站都可能受到影响。
子资源篡改简介
在现代 Web 应用开发中,我们通常需要引用第三方的资源来提升开发效率,比如从 CDN 加载 JavaScript 和 CSS,虽然这种做法为快速开发提供了极大的便利,但它同时带来了一定的安全风险,这就是本篇要讲的内容:子资源篡改。
1.什么是子资源篡改
简单来说,子资源篡改是指第三方资源在没有网站管理员许可的情况下被修改、替换或注入恶意代码的一种攻击手段。这种攻击可能会导致用户数据被窃取,甚至用户被重定向到恶意网站。
举个🌰,如果你的网站加载了一个流行的 JavaScript 库,而这个库在 CDN 上被人篡改成了含有恶意行为的代码。那么,每一个访问你网站的用户,都会在不知情的情况下运行这段恶意代码。
2.子资源篡改有哪些影响
这种攻击方式会直接影响到网站的安全和用户的隐私。被篡改的资源可能导致各种问题,例如向攻击者泄露敏感信息、导致会话被劫持以至于用户无法作出认证操作,甚至用户设备可能会成为攻击其他系统的工具。
1. 数据泄露
篡改后的脚本能够执行恶意操作,如从浏览器窃取用户的敏感信息(例如登录凭证、信用卡详情等)。这些数据可能会被发送到攻击者的服务器,造成隐私泄露和财产损失。
2. 会话劫持
攻击者可能会注入用来劫持用户会话的脚本,这允许他们以用户的身份执行操作,比如进行未经授权的交易或更改账户设置。
3. DDoS攻击
篡改的子资源可以被用作向其他网站或服务器发起 DDoS 攻击的工具。当用户访问包含恶意脚本的网站时,他们的设备可能会在不知不觉中被纳入"肉鸡网络",用于对目标网站进行大流量攻击。
4. 恶意软件传播
恶意篡改的资源可能会诱导用户下载恶意软件,如勒索软件或间谍软件,从而在用户的设备上造成更广泛的破坏。
5. 渗透内部网络
如果受到攻击的网站被公司内部网络访问,篡改的子资源可能会用来渗透更为敏感的内部系统,并获得进一步的网络访问权限。
3.子资源篡改的攻击方式
子资源篡改可能是由多种攻击手法造成的。从 CDN 被渗透到 DNS 缓存投毒;从中间人攻击到第三方库的安全漏洞;再到通过钓鱼邮件诱导,这些都是让子资源面临风险的常见手段。这些攻击手法共同点是,它们都企图操纵你网站的外部依赖,进而危害最终用户。
1. CDN 供应商被渗透
最直接的子资源篡改就是发生在 CDN 提供商。如果攻击者能够成功渗透 CDN 服务,那他们便可以直接在 CDN 上替换资源内容。如果该 CDN 被很多网站用来加载资源,那么这种攻击会影响到所有使用该资源的网站。
2. DNS 缓存投毒
DNS 缓存投毒(DNS Cache Poisoning)又称 DNS 缓存欺骗,是攻击者通过篡改 DNS 缓存来重定向用户到恶意服务器的一种技术。如果攻击者实施成功,则用户在尝试访问原本安全的资源 时会被重定向到被篡改资源的服务器。
3. 中间人攻击
攻击者会利用不安全的网络连接来拦截和篡改正在传输的数据。在中间人攻击中,攻击者将自己置于服务器和用户之间,从而可以在数据传输过程中悄无声息地替换资源。
4. 钓鱼攻击
通过伪装成可信的通信,攻击者引诱网站管理员下载或引用包含恶意代码的资源。一旦网站管理员被欺骗,这些恶意资源会被上传到网站上,进而影响访问网站的用户。
4.如何防御子资源篡改
1. 使用子资源完整性(Subresource Integrity, SRI)
子资源完整性是防止子资源篡改的主要手段。通过在<link>
和<script>
标签中使用integrity
属性来指定资源内容的哈希值,浏览器会在加载资源前验证该哈希值。如果资源被篡改,计算得出的哈希值不会与指定值相匹配,浏览器将不加载该资源。示例如下:
html
<script src="https://cdn.example.com/library.js"
integrity="sha384-哈希值"
crossorigin="anonymous"></script>
2. 实施内容安全策略(Content Security Policy, CSP)
CSP 是一个额外的安全层,用于检测并削弱某些特定类型的攻击,允许你设置哪些资源类型和来源地址可以在你的网站上加载。通过创建一个白名单,可以限制网站只允许加载自己服务器或已知安全的第三方服务器上的资源。例如:
html
Content-Security-Policy: default-src 'self'; script-src 'self' https://cdn.example.com;
3. 强制启用HTTPS
通过启用HTTPS,并采用HTTP严格传输安全(HSTS),可以进一步降低中间人攻击的风险。这确保了用户与你的网站之间的所有通信都是加密的,向用户证明他们正在与真实的服务器通信。
SRI 哈希原理
integrity
值是一个哈希字符串,整个字符串分为三部分,一个表示哈希算法哈希算法的前缀,然后是一个短横线,最后是 base64 编码的哈希,哈希算法目前支持的前缀是:sha256
、sha384
、sha512
。
生成方法
-
在线生成 SRI 哈希值的工具: SRI Hash Generator
-
openSSL 命令行生成
sh
openssl dgst -sha384 -binary FILENAME.js | openssl base64 -A
- shasum 命令行生成
shell
shasum -b -a 384 FILENAME.js | awk '{ print $1 }' | xxd -r -p | base64
JS 实现生成过程
通过 Node JS 实现一下生成哈希的生成过程,思路会更清晰。
js
/*
* @Author: zi.yang
* @Date: 2024-02-08 17:19:15
* @LastEditors: zi.yang
* @LastEditTime: 2024-02-08 17:29:51
* @Description: 生成文件hash
* @FilePath: /demo/index.js
*/
const crypto = require('crypto');
const fs = require('fs');
// 读取需要生成哈希的文件
const fileContent = fs.readFileSync('index.js');
// 根据文件内容使用 sha384 算法生成哈希值
const hash = crypto.createHash('sha384').update(fileContent).digest();
// 将生成好的哈希值用 base64 编码
const base64Hash = hash.toString('base64');
console.log(base64Hash);
通过 node index.js
运行该文件,输出结果如下:
arduino
kfTTHa5RUDHJD23jtPrW3Q//kD9qeEPoCwICIQFyYaCpSKLaVgZ1LoiMDZVC9jk7
我们现在知道哈希值是根据文件内容生成的,所以当文件内容发生修改后哈希值也会随之修改,而当浏览器发现加载的资源与配置的 integrity
值匹配不上,就会阻止该资源的加载。
结语
本章用很大的篇幅讲了子资源篡改后的影响以及篡改的攻击方式等等,实际网站的防范手段却很简单,通过设置 SRI + CSP + HTTPS
即可,但实际上,使用了 SRI
其实就已经能够解决子资源被篡改的问题,CSP
与 HTTPS
在这个漏洞防护上只是锦上添花而已。
因为如果是 DNS
被劫持/缓存投毒,或者是 CDN
本身被攻击篡改,那么 CSP
与 HTTPS
都无法感知以及提供拦截 加载被篡改子资源的能力,只有通过 SRI
才能检查资源是否被篡改同时进行拦截。
相关资料
- MDN 子资源完整性介绍: developer.mozilla.org/zh-CN/docs/...
- W3C 子资源完整性介绍:www.w3.org/TR/SRI/