4

我正在開發一個腳本擴展,類似於Greasemonkey或Chrome的內容腳本引擎。這個擴展將允許腳本編寫者做非常危險的事情,比如訪問本地文件。javascript(或瀏覽器擴展)如何檢測受限功能的使用?

如果我向公衆發佈此擴展,我希望它能夠警告新手用戶,如果腳本將使用「危險」功能。我希望這個警告儘可能難以規避。

例如,擴展可以搜索字符串保護和GM_openSQL_Connection提醒用戶 - 也許是這樣的:
Bad script warning

假設基本網頁將永遠無法訪問GM_openSQL_Connection感謝沙盒機制。同樣,沒有<script>節點將能夠。

但是,劇本作家仍然可以規避簡單的搜索,從上面的東西,如:

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


所以,問題是什麼是種方式,其中一個邪惡的編劇可以欺騙檢查受限功能使用情況,以及如何防止這種惡作劇?


注意:錯誤的警告可以沒問題。例如,如果腳本作者在其他靜態字符串中使用文本「GM_openSQL_Connection」,那麼他將不得不忍受(錯誤)警告。

+2

完全無關,但我喜歡你的例子警告。 :) – fayerth 2012-03-06 07:26:07

+0

你不能說危險只會導致函數的名字。只能採取行動,而不能將名字列入黑名單。它使用的cookies和遠程訪問,以3-第三方主機直接接入功能最常認定爲危險的(並不意味着他們,但是這可能是他們是一個警告)。其他一些模式也可能被解釋爲不受歡迎。 – YuS 2012-03-06 07:37:47

+0

我會建議使用同樣的方法爲[JavaScript的Deobfuscator(https://addons.mozilla.org/addon/javascript-deobfuscator/)(使用調試接口來獲取所有的函數調用,不管他們是如何編譯),但這將無濟於事。考慮var foo = window [「GM_op」+「enSQL_Connection」]; foo(...)'。您不能按函數名稱前進,因爲函數名稱可能會更改太容易。 – 2012-03-06 07:42:26

回答

4

邪惡的劇本製作者可以欺騙我們[年齡]限制功能檢查的方式是什麼?

有成千上萬種組合,例如,與eval()new Function(),(在你的例子一樣)的String.fromCharCode()decodeURI()組合。

我該如何防止這種惡作劇?

你可能超載/陰影特定不好函數/對象/變量?

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

要設置一個標誌,如果擴展試圖訪問被禁止的函數或變量,簡單地具有被設置爲true如果禁函數稱爲var isDangerous = false或上的禁止屬性的get/set被訪問/改性。

如果isDangeroustrue,那麼您可以將該擴展標記爲可能具有危險的函數/屬性調用/訪問。

+0

嗯。這個影子有潛力。我可以要求開發人員自行報告它們在代碼中使用的危險函數。用戶將得到指示的安裝時警告,並且該腳本的運行時警告將被停用。任何未被聲明的函數都會觸發運行時警告,並且會更加狡猾或不小心編碼。 – 2012-03-06 07:41:37

+0

那麼,陰影具體的壞功能是黑名單,這是有點關注。賠率是你的黑名單將不完整。黑名單往往是脆弱的。 – 2012-03-07 06:52:58

+1

@ D.W。,我不跟着你。我正在完成這些功能並完全控制它們的運行時行爲(除了我不知道的安全漏洞之外)。腳本編寫者怎麼會繞過這個? – 2012-03-07 08:19:00

2

試圖掃描腳本以檢測它是否使用這些接口中的任何一個都是錯誤的方法。正如你似乎正在發現的那樣,通過模糊處理很容易逃避。它基本上是不安全的:沒有辦法讓它工作。

這是一個更好的方法。要求腳本編寫者包含一個聲明它需要訪問的特殊API的清單。然後,在安全的Javascript沙箱中運行該腳本,該沙箱僅公開所請求的允許的API和API,但僅此而已。如果腳本沒有在其清單請求GM_openSQL_Connection,不公開該API的腳本。

,因爲JavaScript是一種動態語言,讓猴子補丁和全局對象不受限制的訪問,它需要一些做構建限制哪些API腳本可以訪問的安全沙箱。因此,我建議您使用現有的沙盒解決方案。一種方法是在沙箱中運行的用戶腳本,並給沙盒代碼庫的完整存根敏感的API,其中存根只使用postMessage發送RPC請求,您的擴展代碼。這避免了跨沙箱邊界,這是很好的(取決於沙箱技術)的一種參考的通常攜帶安全漏洞的巨大潛力引用。

然後,你可以駕駛基於清單的內容,您的用戶警告。重要提示:請從用戶的角度仔細考慮這一點。普通用戶能夠理解警告嗎?他們能夠做出明智的決定嗎?用戶能否比你願意做出更好的決策?用戶是否會因不斷的警告而不知所措,並開始忽略它們並點擊「確定」(狼狼效應)?

爲JavaScript沙箱技術的信息,請閱讀IT安全以下問題:How to scan Javascript for malicious code?。將來,您可能會在IT安全網站上爲這類問題獲得答案。

+0

這無視我到目前爲止所經歷或閱讀的一切。請爲腳本代碼提供一個參考或示例,以便能夠訪問擴展可能提供的API之外的擴展代碼(** not **內容腳本代碼)。 – 2012-03-07 21:35:48

+0

這不完全是架構,也不是Greasemonkey的運作方式。用戶腳本只安裝一次,從不下載(無論如何,關閉更新)。這不僅僅是「評估」。它在應用了一些安全限制之後使用'evalInSandbox'運行。如果我理解正確,Chrome會使用類似的機制。您的評論可能仍然適用,但我還沒有看到文檔或示例。 – 2012-03-08 00:45:32

+0

@BrockAdams,好點!我的錯誤。我收回了關於需要特殊沙盒技術(如Caja)的聲明。我完全忘了'evalInSandbox',所以我顯然不像我想象的那麼瞭解。我對我的錯誤表示歉意。 – 2012-03-08 05:55:58