Javascript CSP:如何调试违规行为:eval:";脚本示例:var KERNEL=…”;

Javascript CSP:如何调试违规行为:eval:";脚本示例:var KERNEL=…”;,javascript,debugging,google-chrome-extension,firefox-addon,content-security-policy,Javascript,Debugging,Google Chrome Extension,Firefox Addon,Content Security Policy,我们有一个web服务,它有一个非常严格的CSP头,阻止eval以及其他内容。我们收到许多CSP违规报告,包括以下信息: { "csp-report": { "blocked-uri": "eval", "column-number": 61, "document-uri": "https://example.com/path/to/something"

我们有一个web服务,它有一个非常严格的CSP头,阻止
eval
以及其他内容。我们收到许多CSP违规报告,包括以下信息:

{
  "csp-report": {
    "blocked-uri": "eval",
    "column-number": 61,
    "document-uri": "https://example.com/path/to/something",
    "line-number": 56,
    "original-policy": "default-src 'self'; connect-src 'self' https://www.google-analytics.com; script-src 'self' 'report-sample' https://www.google-analytics.com; sandbox allow-downloads allow-popups allow-scripts allow-same-origin allow-top-navigation allow-forms allow-modals allow-popups-to-escape-sandbox allow-presentation; img-src * data:; style-src * 'unsafe-inline'; font-src * data: about:; media-src *; frame-src * data:; report-uri https://example.com/:reportcspviolation",
    "referrer": "",
    "script-sample": "var KERNEL = $2C6A44CB_AD42_4731_A544_3F…",
    "source-file": "blob:https://example.com/b402b32e-ebf5-4103-b8e8-4cd3c1f56e2a",
    "violated-directive": "script-src"
  }
}
文档uri
处的文档没有任何内联JavaScript。而且整个服务源代码不包含大写字母
KERNEL
,因此我们的服务无法发出它。
documenturi
处的文档也不使用任何
元素,因此任何嵌套文档也不会导致此错误

所有报告似乎都包含完全相同的字母
var KERNEL=$2C6A44CB_AD42_4731_A544_3F
(Firefox添加了省略号,Chrome按原样结束了示例)

我从以下UA字符串中看到了类似的CSP报告(按发生频率的顺序排列):

  • Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:85.0)Gecko/20100101 Firefox/85.0
  • Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/88.0.4324.104 Safari/537.36
  • Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,类似Gecko)Chrome/87.0.4280.66 Safari/537.36
  • Mozilla/5.0(Windows NT 10.0;Win64;x64;rv:84.0)Gecko/20100101 Firefox/84.0
所以很明显,这与浏览器兼容性无关。我无法通过使用任何浏览器并加载
文档uri
所指向的地址来重现错误

在报告的
var KERNEL=
错误中,至少95%是由Firefox 85.0发出的

为什么
源文件
blob:
方案中?这是通过浏览器扩展运行JavaScript代码的著名黑客吗

我最好的猜测是,这是由一些制作糟糕的浏览器扩展造成的,但有没有办法找出真正的原因?

所有报告似乎都包含完全相同的字母var KERNEL=$2C6A44CB\U AD42\U 4731\U A544\U 3F

这种签名属于病毒及其附属病毒

为什么源文件是blob:scheme?这是通过浏览器扩展运行JavaScript代码的著名黑客吗

我不知道这是否是一个众所周知的黑客行为,但在浏览器行为中观察到一些奇怪的事情。
您的CSP不允许
blob:
因此
blob:https://example.com/b402b32e-ebf5-4103-b8e8-4cd3c1f56e2a
必须被阻止,我们应该观察
被阻止的uri:“blob”
。但是我们看到
“blocked uri”:“eval”
,这意味着
blob:https://example.com/b402b32e-ebf5-4103-b8e8-4cd3c1f56e2a执行
,第56行的eval被阻塞

注意:上面的浏览器插件脚本
eval()
func调用并在代码中使用。

是的,这些应该被您的CSP阻止,但是阻止
eval
内部
blob
对于CSP来说是无稽之谈,比如
脚本src'self'报告示例'https://www.google-analytics.com

+50个好答案!关于“eval”和“blob”的胡说八道,这是一个很好的说法。对于CSP违规报告经常有点不正常,我并不完全感到惊讶,因为这些报告似乎仍然为需要修复的东西提供了指针。如果报告中包含诸如
dom-modified by-extension:1
之类的内容(如果正在使用浏览器插件或扩展),那就太好了。我认为隐私可以防止泄露哪个扩展触及了DOM。对于“eval”与“blob”的区别,我只有一个解释——浏览器扩展找到了注入
blob:-url
绕过CSP的方法。这并不是一个特殊的浏览器错误,因为Chrome和Firefox的行为类似。非常感谢您与社区分享的非常有趣的观察结果。