技术问询:是否存在CSP指令可阻止CacheStorage绕过CSP限制?
概述
在以下CSP(内容安全策略)配置下:
Content-Security-Policy: script-src 'self'
以下代码无法执行:
// Content-Security-Policy: script-src 'self' const dangerousStringToBeEvaluated= "console.log('HACKED!')" eval(dangerousStringToBeEvaluated) // EvalError: Refused to evaluate a string as JavaScript because 'unsafe-eval' is not an allowed source of script in the following Content Security Policy directive: "script-src 'self'
这确保了eval及类似操作会被阻止,除非unsafe-eval被明确允许。
利用CacheStorage绕过CSP
然而,若恶意攻击者知晓某个JavaScript文件已被缓存至CacheStorage并通过服务工作者(service-worker)提供服务,他们可通过修改缓存内容绕过该限制。具体实现方式如下:
// Content-Security-Policy: script-src 'self' const dangerousStringToBeEvaluated = "console.log('HACKED!')" const cache = await caches.open('some-cache') await cache.put( '/some-file.js', new Response( dangerousStringToBeEvaluated, // --> 后续`import`时会执行这段代码! {headers: {'Content-Type': 'application/javascript'}}, ), )
现在,当导入/some-file.js时,控制台将输出HACKED!!
技术问询
是否存在对应的CSP指令可阻止上述行为?例如,能否通过CSP限制对CacheStorage的写入权限,以确保缓存内容的完整性?
上下文说明
我们已对所有类型的脚本文件启用了CSP(配置为script-src 'self'; worker-src 'self'; script-src-elem 'self';),包括服务工作者本身及其缓存的所有文件。例如,若将dangerousStringToBeEvaluated设置为:
const dangerousStringToBeEvaluated = "console.log('HACKED!'); eval(`console.log('HACKED MORE!')`)"
则第一个log语句可正常执行,但eval内部的第二个log语句会被阻止。
内容的提问来源于stack exchange,提问作者Mir-Ismaili
相关产品推荐
相关产品推荐

