2013-12-15 43 views
13

所以,这是问题所在。JavaScript完全“篡改安全”变量

我有类似:

// Dangerous __hostObject that makes requests bypassing 
// the same-origin policy exposed from other code. 
(function(){ 
    var danger = __hostObject; 
})(); 
delete __hostOBject; 

我是绝对安全的认识没有脚本可以篡改或访问__hostObject

(如果可以的话,我有一个CSRF vulnerability或更糟)。

注1:这是一个浏览器扩展。我比页面上运行的其他脚本拥有更好的钩子。我在他们面前执行,并且在他们装载之前完成。

注2:我知道这已被多次询问脚本的一般情况。我想知道是否有可能,如果我知道我在之前加载任何其他脚本。

+0

我写了一个[示例代码](http://jsfiddle.net/35G8e/2/),它会覆盖'Function.prototype的.call'。 (如果你真的认为我在帮助恶意开发者,请随时举报此帖,在我看来,最终的攻击者无论如何都会知道这些技术。) – ComFreek

+1

@ComFreek你已经忘记'返回''oldCall'的结果。但的确,这是用于修补(内置)JavaScript方法的一般原则。 –

回答

5

假设__hostObject是可删除的,您问题中的代码是安全的。

但是,我认为你的真实代码稍微复杂一些。在这种情况下,需要非常小心的编码,因为页面可以更改内置方法(例如Function.prototype.call)以进入您的关闭并执行任何他们想要的恶事。当我进行这样的测试时,我已经通过这种方法成功地滥用了Kango和Crossrider等扩展框架的功能。

+0

今天你非常敏锐(或者幸运,但我想锐利)。这是Crossrider现在遇到的问题。我现在正在为Internet Explorer测试一个BHO,并且我需要让JavaScript提出绕过跨域策略和/或在注册表中存储跨站点数据的请求。这两个问题都很有问题。我想不出更好的办法。 (另外,如果你可以用'.call'添加这样一个漏洞的示例代码 - 那真的很好)。如果'.call'之类的东西被篡改,是否有可靠的方法来杀死该应用? (事后考虑 - 他们可以做到这一点 - 我也加载后)。 –

+1

@BenjaminGruenbaum滥用功能的代码是微不足道的,我不会发布示例代码,以避免喂恶意的开发人员。我只是写你的其他问题的答案,敬请关注;) –

+0

我很抱歉家伙。我试图了解问题和解决方案,但不能。你们能请你解释一下吗? – thefourtheye

0

不会简单地增加一个断点,并重新加载脚本暴露你的__hostObject

+0

相同的执行上下文中,实际上没有办法问题不是实际用户,而是其他脚本我不能信任它搞砸了。据我所知,另一个脚本不能做到这一点。 –

+0

好吧,那听起来不错。 –