4

我正在开发一个脚本扩展,类似于 Greasemonkey 或 Chrome 的内容脚本引擎。此扩展将允许脚本编写者执行非常危险的操作,例如访问本地文件。

如果我向公众发布这个扩展,我希望它能够警告新手用户,如果脚本将使用“危险”功能。我希望这个警告尽可能难以规避。

例如,扩展程序可以搜索受保护的字符串GM_openSQL_Connection并警告用户——可能是这样的:
错误的脚本警告

GM_openSQL_Connection假设由于沙盒机制,基本网页将永远无法访问。同样,没有<script>节点能够做到。

但是,脚本编写者仍然可以从上面绕过简单的搜索,例如:

eval (decodeURI ("GM_op%65nSQL_Connection (...);") )


所以问题是,一个邪恶的脚本编写者可以通过哪些方式来欺骗检查受限功能使用,我该如何防止这种恶作剧?


注意:错误警告是可以的。例如,如果脚本作者在其他静态字符串中使用文本“GM_openSQL_Connection”,那么他将不得不忍受(错误)警告。

4

2 回答 2

4

邪恶的脚本编写者可以通过哪些方式来欺骗检查受限功能 us[age]?

有数千种组合,例如 with eval(), new Function(), String.fromCharCode()and的组合decodeURI()(如您的示例中)。

我怎样才能防止这种恶作剧?

你能重载/隐藏特定的坏函数/对象/变量吗?

GM_openSQL_Connection = function() {
   warnUser();
};

如果扩展试图访问一个被禁止的函数或变量,要设置一个标志,只需将一个标志var isDangerous = false设置为true如果一个被禁止的函数被调用或者一个被禁止的属性上的get/set被访问/修改。

如果isDangeroustrue,那么您可以将该扩展标记为可能具有危险的函数/属性调用/访问。

于 2012-03-06T07:30:25.850 回答
2

试图扫描脚本以检测它是否使用这些接口是错误的方法。正如您似乎发现的那样,通过混淆来逃避太容易了。它从根本上是不安全的:没有办法让它工作。

这是一个更好的方法。要求脚本编写者包含一个清单,声明它需要访问哪些特殊 API。然后,在安全的 Javascript 沙箱中运行脚本,该沙箱仅公开允许的 API 和它请求的 API,仅此而已。如果脚本未GM_openSQL_Connection在其清单中请求,请不要将该 API 公开给脚本。

因为 Javascript 是一种动态语言,它允许猴子修补和不受限制地访问全局对象,所以需要做一些工作来构建一个安全的沙箱来限制脚本可以访问的 API。因此,我建议您使用现有的沙盒解决方案。一种方法是在沙箱中运行用户脚本,并为沙箱代码提供一个库,其中包含敏感 API 的存根,存根仅用于postMessage向您的扩展代码发送 RPC 请求。这避免了跨越沙盒边界的引用,这很好(取决于沙盒技术)这些类型的引用通常具有潜在的安全漏洞。

然后,您可以根据清单的内容向用户发出警告。重要提示:请从用户的角度仔细考虑这一点。普通用户能否理解这些警告?他们能做出明智的决定吗?用户会比你更容易做出正确的决定吗?用户是否会被不断的警告淹没,然后开始忽略它们并单击“确定”(哭狼效应)?

有关 Javascript 沙盒技术的信息,请阅读以下关于 IT 安全的问题:如何扫描 Javascript 中的恶意代码?. 将来,您可能会在 IT 安全网站上获得此类问题的答案。

于 2012-03-07T06:51:33.317 回答