2013-12-15 79 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

好吧,那聽起來不錯。 –