四個頂級軟體開發攻防技巧

劉曉日發表於2011-10-30

作者:Christian Collberg, Shawna McAlearney, Jasvir Nagra 2009 12 7

譯者:劉曉日

Christian Collberg與Jasvir Nagra一同討論軟體開發中各種防護措施的優缺點,來幫助大家選擇最適合的方式來保護智慧財產權不被侵犯。

作為程式碼極客應該知道保護智慧財產權(IP)-這樣不好吧,簡稱為IP,差點兒就翻譯成IP地址了-的重要性,保護他們不被非法複製、修改,或者被反編譯。但是在同等的效能和努力下,哪種方法才是最適合特定專案的呢?Christian Collberg和Jasvir Nagra在Surreptitious Software: Obfuscation, Watermarking, and Tamperproofing for Software Protection一書中分享了工具和技術幫助你打敗那些幹壞事兒的傢伙。Shawna McAlearney還讓他們分享一些他們的心得,這樣大家就不用一個人在痛苦中學習了。保護程式碼安全已經變成了攻擊者攻破程式碼保護和開發人員捍衛自己勞動成果之間“鬥爭”的代名詞。你能做的就是不讓你的程式變成攻擊者感興趣的目標。當然還不能降低使用者體驗,也不能讓程式備份變的很困難。正如作者所說的那樣:如果開發人員遮蔽使用者認為合理的操作,他們反而更願意去破解程式或者使用非法版本的程式。

很多開發人員將全部精力投入在效率和儘可能少bug的程式碼上,卻很少去保護他們。然而,個人的智慧財產權是非常值得花精力去保護的。內部威脅是保護措施首要考慮的一項,它的動機可能來自於商業目的,陰謀破壞或者報復等。局內人通常可以合法的訪問到程式碼,並且可以長期進行破壞。

瞭解攻防最佳實踐有助於在專案中做出正確的抉擇。表單加密,水印,模糊演算法,哪個才會是最適合的呢?下面是Christian Collberg和Jasvir Nagra對他們認為最健壯的4個方法優缺點的介紹:

靜態水印演算法(Static watermarking algorithms )是將作者的名字會嵌入到組成程式的位元組中,這種方式很高效,而且也不影響程式的執行。但是水印很容易就可以通過在程式中插入Nop指令(No Operation Performed)來刪除,進行語義保留指令重排,甚至通過對程式加密,在記憶體中解密程式執行前加入樁(Stub)。

在硬體中嵌入解密金鑰,可以很好的抵禦軟體方面的攻擊,但是如果金鑰需要從儲存它的位置傳到CPU中進行解密,那麼就無法躲過硬體攻擊。一旦這個金鑰被破解,金鑰就可以隨便地共享出來,以用來破解軟體。

通過校驗程式載入到記憶體中部分的篡改校驗方式可以有效地防止攻擊者修改在指定硬體上執行的程式。但是如果硬體允許攻擊者陷阱訪問載入程式的記憶體區域,他就可以有效地並且不知不覺地修改程式,同時可以重定向任何自檢程式碼去讀取本身的原始副本。

使用指紋識別程式碼(fingerprint code)或者為程式的不同拷貝使用不同的模糊演算法來增加難度,不讓攻擊者使用一種攻擊方法就可破解程式的全部拷貝。然而,攻擊者會發現任何兩個程式的副本都是使用兩種不同的方式進行加密,也會知道關於底層解密程式相關的東西。所有必要的識別必須通過指紋識別,並且減少攻擊者可見程式碼數量,不讓他們知道應該去攻擊什麼。

Christian Collberg與Jasvir Nagra告訴我們,當開始對程式碼採取保護措施時,時刻將如下幾條銘記於心,這樣基本上你就可以通往成功的道路。

  • 仔細權衡選擇那種保護程式碼的方式,因為他們會影響效率。
  • 選擇隱式的軟體保護程式碼。保護程式碼應該儘量融合到其他程式碼中,而不應該凸顯出來,告訴攻擊者,可以攻擊這裡。
  • 選擇多種防護演算法。這樣攻擊者攻破一個程式,不至於對另外受保護的程式產生影響。不過要注意,使用多種防護演算法同樣會影響效能。
  • 記住,只要攻擊者堅持不懈,並擁有超群的技術,那麼所有保護措施都是徒勞。

原文連結:http://www.informit.com/articles/article.aspx?p=1411505

本文參加 Translate Geeks to Chinese 翻譯活動

相關文章