題:
代碼混淆會帶來任何可衡量的安全性好處嗎?
MechMK1
2019-10-09 19:44:37 UTC
view on stackexchange narkive permalink

我一直堅信混淆本質上是無用的。混淆後的代碼並非不可能閱讀,只會更難閱讀。我相信,熟練的攻擊者能夠將混淆後的代碼重新帶入可讀性更高的狀態。

但是, OWASP建議對移動客戶端使用混淆,

因此,我的問題是:混淆是否能帶來可衡量的安全性收益?具體來說,它的好處超過了增加的成本,複雜性和降低的性能。


注意:當我說“混淆”時,我是在談論為防止反向工程而採取的有意識步驟。編譯器優化儘管使程序集不那麼容易閱讀,但其目的是提高性能,而不是防止反向工程。

以我的經驗,在安全領域中並沒有收集到很多衡量指標和經驗證據。它主要是很多“應該這樣工作”,軼事經歷和外推法。就我個人而言,我認為代碼混淆不只是安全性,更在於它試圖保護業務利益和代碼秘密。
@SteveSether我也有同樣的想法,但是鑑於我認為OWASP是可靠的消息來源,所以我想看看我的斷言是否錯誤。
混淆的一個小好處是信息破壞。諸如口頭語言,編碼習慣等之類的東西。該過程(最終是代碼)可以重新理解,但是標識符會丟失。雖然,我無法想到一個合理的理由。此外,某些混淆處理(例如,時光倒流的Java)可能會在輸出中引入無法使用當前技術/反編譯器輕鬆重建的功能。這使得Java極難進行反編譯。因此,甚至可以阻止有經驗的用戶推斷代碼。這是一個比競爭對手更好的困惑。
我發現令人著迷的是,去混淆的可能性在很大程度上取決於代碼樣式。就像變量名的重要性一樣。該代碼可以用較低級別的語言編寫,並使用非常高級的模式。像面向對象的類大致在Java級別上一樣,所有類都根據需要部分實現。同樣,使用設計模式,甚至跨越更長的代碼區域。所有這些結構主要用變量名表示。相同類型的兩個值可以屬於不同的類別,以名稱表示。不同的類甚至可以是相同的。
“ OWASP建議對移動客戶端使用混淆處理”-可能僅是因為,例如,使JavaScript混淆最小化,但是真正的目的只是使其變得更小,傳遞更少的信息並加快Internet流量和網頁加載時間
@Mawg但是OWASP並不特別建議混淆JavaScript
這個問題實際上是為了什麼?鏈接的OWASP頁面從字面上給出了這樣一種威脅,即混淆應該有助於防止對該威脅和解決方案進行詳細描述。
可以將其視為您前門的鎖。它決不能阻止某人闖入,但如果隔壁的房子沒有鎖或沒有鎖,那該人為什麼要弄亂你的門?如果他們有足夠的動力來瞄准你,那麼即使是電子圍欄也不會阻止他們。鎖也可以辯護-可以在法庭上辯護,因為它證明了該人有動機去獲得它,而不是能夠聲稱自己被邀請進入內部。
@Mawg該建議位於標題為“如何防止'逆向工程'?”的框中。該頁面全部關於逆向工程,而不是性能。
我認為是否提供安全利益與是否提供可衡量的安全利益是分開的。我相信它可以帶來安全利益,但是我不知道如何衡量利益。
真正的Javascript混淆:將其全部翻譯為[JSFuck](http://www.jsfuck.com/)。
@Gloweye除了有些自動化工具,例如[JSUnFuck](http://codertab.com/jsunfuck)完全將其反向
就像您將兩輛相同的汽車停放在一起,但其中一個將(明顯地)安裝了警報而其他沒有安裝了警報一樣。如果一個壞人會來並想要偷走其中一個,您認為他會選擇哪個?當然,如果他想要具體的東西,他還是會接受。這只是一個好習慣,通常不花任何錢就這樣做;)與JS有關,我通常將其視為縮小而不是迷戀。而且,如果可以將來源縮小為原始內容的一半,那麼這樣做是一個好主意。
_“ ...超過增加的成本,複雜性和降低的性能的好處。” _-解決您的問題的錯誤方面,但我會補充(或提醒您,它已包含在“成本”中,除了“降低性能”方面),當混淆本身將錯誤引入代碼時,用戶遇到的困難。這是旨在執行版權保護的技術措施的最大問題之一:它們總是使用戶體驗變差。合法用戶,那就是。亂砍並繞過複製保護的人不會受到這種不良影響。
令我震驚的是,有人會*有意*混淆代碼!
五 答案:
gowenfawr
2019-10-09 20:18:18 UTC
view on stackexchange narkive permalink

編碼混淆有兩個好處:

  1. 它清除了攻擊者池的淺端。難以理解您的代碼的腳本小子會去其他地方。
  2. 這會增加熟練的攻擊者的工作量。不管混淆技術多麼熟練,混淆處理都比消除混淆處理便宜,並且結果通常比原始混淆的含義少(例如,在原始名稱具有描述性的情況下,變量名稱將保持通用)。
  3. ol>

    @SteveSether在他的評論中加倍正確-幾乎找不到實際的測量,並且許多代碼庫是出於專有原因*而不是出於安全性原因而被混淆。

    但是出於安全和專有的原因,代碼混淆的價值與其不對稱質量相關聯-混淆的價格要比反混淆的價格便宜。


    *通過“專有理由”,我的意思是“為了保持市場競爭優勢而希望使自己的代碼和算法更私密或更難以復制的願望。”公司和個人都容易出現這種趨勢。

評論不作進一步討論;此對話已[移至聊天](https://chat.stackexchange.com/rooms/99892/discussion-on-answer-by-gowenfawr-does-code-obfuscation-give-any-measurable-secu)。
F. Hauri
2019-10-09 20:15:16 UTC
view on stackexchange narkive permalink
  • 在我看到的混淆代碼(主要是在病毒 rootkits 中)上,只要有可能就可以從Internet接收到的所有內容(郵件, ftp,web,dns等(在請求,日誌,文件傳輸中),反混淆代碼所需的時間足以找到服務器地址等基本信息,殭屍網絡的管理員ID 散列的密碼,或病毒的敏感字符串庫調用大部分都計入分鐘。

    因此,就防止奇怪代碼而言,這並不是一項艱鉅的工作(如果不瑣碎的話)。

  • 另一方面,構建這類代碼的可編輯源可能會花費很多時間(如果代碼很大,則需要幾天,幾週甚至更多的時間才能計算出來。無論如何,模糊化過程的進行越多,它們的效率就越高。

  • 關於OWASP的建議,我同意:混淆意味著人力資源,因此它們代表了一些成本,從而使盜版行為對吸引力降低了。

  • 關於 可衡量性 安全利益 的code> ...抱歉,但是我不能!根據 可能會對您的代碼感興趣, 的哪一部分以及您的代碼 為什麼

總的來說,我自己的建議是:使用混淆本質上不是一個壞主意,但

要更加清楚:不要混淆代碼以隱藏秘密鍵/函數,以使其比未混淆時更安全!

對於惡意軟件來說可能確實如此,但是對於整個應用程序或遊戲,代碼變得更加難以逆向工程。當然不是幾分鐘的事。
@HugoZink我認為他的意思是可以清晰地發現感興趣的價值。例如,必須將IP地址存儲為值。基本上`gzip -d obfuscatedfile |字符串|更少`
@VolkerSiegel我不同意。它可以通過算法生成,也可以從加密的字符串中解密,從而迫使攻擊者找出解密算法的機制以及密鑰的存儲位置等。
@HugoZink我的意思是“肯定不是幾分鐘的事”,這還不清楚。我的意思是說:存在一種可以在“數分鐘”內完成的方法,並且通常可以帶來結果。不反對你。
@HugoZink我的意思是:*建立混淆代碼(主要是惡意軟件)的目標*是微不足道的*,但是從大型*混淆應用程序*構建*可編輯的源代碼*可能需要*大量時間。*(*對面`*)...對不起,我的英語不太好。
@VolkerSiegel我經常使用`smjs <(sed s / exec / print / ...)> deobfuscated.raw` ...將`print`替換為`cat`或`echo`的shell,php,perl等。(當然,在包含的沙箱中)
@JonBentley使用沙盒(`qemu`,`lxc`)非常有效。看到我以前的評論。
@JonBentley您可能擁有世界上最令人困惑的/加密/生成的IP地址,可能需要100位工程師的團隊30年才能對其進行解密,但是最終軟件必須將其未加密地提供給諸如connect()的系統調用`。至少在Linux上,這些系統調用很容易使用strace記錄並使用gdb捕獲。
@IwillnotexistIdonotexist至少對於惡意軟件而言,目標主要是像殺毒軟件一樣對程序進行靜態分析隱藏ip地址。當他們調用`connect()`時,它提供了最小的附加值來知道他們連接到哪裡。實際上,通過監視網絡數據包可以很容易地在受影響的計算機外部觀察到此情況。
@trognanders在使用strace,gdb,tcpdump跟踪操作時,運行混淆代碼的簡單方法將獲得很多* light *。由於幾乎所有的字符串,地址,端口等都將變得可讀。
@VolkerSiegel大多數人會考慮將值2144929806作為IP地址進行搜索嗎?您可以ping通此地址,並從google.com取回數據包。
@doneal24編號。除非上下文另有說明,否則除外。但是我說的是一種快速黑客技術,有機會在短時間內給出有用的結果。也許我有點傳統,但是在我的世界中,如果IP地址是IPv4,則以點十進製表示。在代碼級別上,這是一個字符串常量,通常不會被混淆。當然,您可以告訴混淆器排除特定的long int值。還是在考慮代表十進制地址的字符串常量?(再次,所有這些都沒有真正的意義)
如果您只是在尋找隱藏的字符串,那麼“幾分鐘”可能是正確的,但是對於反向工程複雜的算法或軟件絕對不是。作為一個著名的例子,《我的世界》被混淆了。大批才華橫溢的逆向工程師團隊花了幾個月的時間才對代碼進行完全模糊處理。並且[直到一個月前](https://www.reddit.com/r/programming/comments/cznq2s/minecraft_now_releases_obfuscation_maps_for/)花了[[每個發布後重新創建混淆圖]]花費了數小時的時間。/minecraft.gamepedia.com/Programs_and_editors/Mod_Coder_Pack)
我寫的@BlueRaja-DannyPflughoeft:*`從這種代碼構建可編輯源可能要花費很多時間。*!
我寫的@Aaron:*`...從這種代碼構建可編輯源可能要花費很多時間...`*
我以前的評論似乎已被刪除。不知道為什麼,因為沒有什麼不好的。我只是再次補充說,這個答案非常容易引起誤解,並且大大低估了執行這些活動所需的精力。
@Aaron足夠公平,刪除的評論是具有攻擊性和錯誤的!我的回答是正確的。我已經在許多黑客環境中發揮了很多作用。在數分鐘內了解混淆代碼的目標,並在數週或更長時間內製作可編輯的源代碼。這是真實且經驗豐富的!
-1
-1
Dmitry Grigoryev
2019-10-11 13:57:22 UTC
view on stackexchange narkive permalink

混淆的另一點是,使攻擊者更難拒絕其逆向工程活動。

如果您擁有一台服務器,該服務器允許任何向其發送“ Hello foobar”字符串的客戶端,並且有人利用了它,可能很難在法庭上證明犯罪者確實有攻擊意圖,而不僅僅是誤解了您的許可協議並假定允許這樣做。如果您的客戶端使用混淆後的密鑰(包含在客戶端自身中)向服務器進行身份驗證,則在安全性方面將得不到什麼好處,但是利用服務器的人將很難證明他們是偶然獲得了該密鑰,而不是通過有意的逆向工程。

trognanders
2019-10-11 13:04:11 UTC
view on stackexchange narkive permalink

混淆使反向工程程序的時間成本大大增加。儘管從混淆程序中提取一些小秘密可能很快,但是製作該程序的非混淆版本的工作僅是重寫它的競爭對手。提取一種新穎的算法是可能的,但並非不重要。

本質上令人困惑的代碼是可以推理的,但不能重用。

代碼令人困惑的是大量CS研究的主題...您的公理是,本質上毫無價值的迷惑em>將引起爭議。

我建議克里斯蒂安·柯伯格(Christian Collberg)和納格拉·賈斯維爾(Nagra Jasvir)推薦的書機密軟件:模糊處理,水印和防篡改軟件保護

有時,即使使用編寫得不好的**源代碼**也很糟糕,您最好重寫它。有時在原始源代碼中理解某人的算法可能並非易事。使它變得更糟10或100倍(或更多)……OP最好將他們的房屋和車門解鎖,並大開它們的視線,因為鎖不會使人們放慢代碼混淆的速度。
R.. GitHub STOP HELPING ICE
2019-10-12 19:00:02 UTC
view on stackexchange narkive permalink

當發現並利用您的軟件中的可利用錯誤時,它將更有可能是由積極主動且資金雄厚的攻擊者專門針對您(或正在使用您軟件的人)而不是skript進行攻擊的小伙子,勒索軟件等。

在大多數情況下,我認為您寧願由whitehat或grayhat研究人員發現軟件中的錯誤,將skript小子和勒索軟件作為第二選擇,並說明級別的攻擊者,例如最壞的情況。但是您需要撥打電話。



該問答將自動從英語翻譯而來。原始內容可在stackexchange上找到,我們感謝它分發的cc by-sa 4.0許可。
Loading...