GSS資安電子報0038期【最佳實踐:如何建立高安全的應用程式(下)】

alt

加強的防護機制alt

事實上,破解者的行為就像單細胞有機體運動一樣,不斷地在進行破解嘗試的動作,因此導致這樣的威脅一直存在。軟體業者也因此不斷地推出新的軟體保護機制與方法。高安全性的保護機制不斷地被導入來對抗這些新的破解威脅。在防護重播及驅動程式置換等破解手法方面,我們必須針對軟體應用程式與金鑰之間的溝通管道進行保護。保護強度會隨著溝通管道的複雜與所需要的安全等級而加強。為了保護這些溝通管道,許多硬體式權杖(Token)會使用加密演算法來保護其溝通的資料。其中一個較流行的加密演算法為 AES(Advanced Encryption Standard)。儘管 AES 是 NIST 在 2001 年十一月就發表的加密技術,但是到目前為止,仍然是現今較強力有效的加密方法之一。

ECC 加密演算法(Elliptic Curve Cryptography) 就數學現今理論來看,被認為幾乎是無法破解的演算法。非對稱性的金鑰,可以被產生用來做為公開的加密金鑰。當程式使用 AES 演算法時,使用這些金鑰,可以建立一個在硬體上的應用程式與安全權杖(Token)間的加密通訊通道。建立這些通訊管道可以使硬體鎖和應用程式在通道間溝通,所有的資料都是被加密保護的。使用加密演算法所建立的安全通道,可有效率地降低中間層的攻擊破解行為,例如錄製、重播與驅動程式模擬手法。主要是因為在每一個通訊時期所使用的金鑰都是唯一的,所以透過暴力破解的手法來破解此一金鑰是行不通的。

ECC 是一種防護軟體被破解的武器,在軟體廠商導入這樣的防護機制後,可以讓破解者破解軟體的成本高於合法購買產品的成本。因此,在進行軟體保護設計時可以考慮採用這種方法。透過內部的驗證機制,更可以進一步加強硬體鎖的安全強度,進而確保每一個硬體鎖都是原生的,而不是仿冒的。透過權杖所產生的驗證器、種子或者金鑰,主要可以採用下列幾個步驟:

  1. 產生隨機的訊息
  2. 要求權杖(Token)對此一訊息進行簽署動作
  3. 檢查使用權杖(Token)中已知的簽名來進行驗證

假如這個權杖(Token)是原生的版本,則可以取得這個公開金鑰所對應的私人金鑰。

擾亂式防護

反組譯工程是一個非常有效的破解方法,假使成功地破解的話,破解者可以輕易地移除所有軟體的保護機制,但是有很多工具可以去防止這樣的方法。如果是單獨使用某一個工具來進行保護,沒有辦法建立比較強力的防護機制。然而如果將他們組合起來,搭配應用程式與硬體鎖間的通訊保護,將可以建置一個高安全性的應用程式保護解決方案。

僅是簡單地壓縮程式碼就可以降低整體應用程式的大小,且也可以增加反組譯工程破解的難度。應用程式中採用多層次的設計架構同樣也有效率,如在每一層新增檢查碼的機制來驗證與檢查資料的同步。多管道的運行機制、虛擬巨集命令與多執行碼的機制也可以使反組譯的工作被導向到不正確的方向去,讓破解難度增加。這些保護機制可以透過硬體權杖(Token) 的軟體開發套件來進行自動化,也可以允許加入額外的防護機制。

測試環境

如果武器沒有正確的使用是沒有太大幫助的,硬體式的安全保護權杖(Token)如果沒有效率地建置,將沒有辦法提供最高可能安全的保護方式。就好像你把鋼盔帶反,卻影響到自己的視線。當時間很緊急或很少時,程式開發者通常僅使用簡單的封裝技術去把保護方式加入而已。雖然這種方式可以把呼叫授權檢查的程式加入,但這種方式也比較容易受到透過可執行的程式碼夾帶的破解攻擊。最佳的整合佈置方式應該是完全地透過 API 整合到應用程式。透過這種整合可以提供你於複雜的授權設計中取得最高的控制權。

鎖定與載入

為了加強硬體權杖(Token)的安全防護強度,你可以針對你的應用程式去進行最佳化,強制性地把金鑰相關程式獨立出來,因此可以增加反組譯破解的難度。在增加反組譯破解的難度的方面,有幾種方法可以達到這樣的效果。其中,部分的應用程式資料可以利用這個權杖來進行加密。程式中的資料可以是設定值或者是應用程式的設定,再寫入系統登錄檔(Registry)前先進行加密,使用時再進行解密。甚至部分應用程式資料可以寫入授權的唯讀資料區。這些資料可以透過一般的讀取介面進行讀取。權杖的部分資料也可以被當成應用系統資料來使用。可以透過程式來把權杖(Token)的記憶體內容當成應用程式的參數或變數來進行讀取與寫入。

偽裝保護

有時候最好的方法就是最簡單的方法。一個簡單取得免費軟體的方法就是永久地使用軟體的試用版。軟體業者通常會用 ”當你要買前先試用” 的授權來吸引潛在客戶來使用他們的軟體。開發者必須降低使用者透過竄改時間的方式來破解軟體的風險。

“這個軟體將於兩週後過期無法使用” 並不是一個非常明確而且可行的方案。除了企業中負責這些軟體的人會覺得不方便外,甚至會導致一些試用金鑰濫用等相關情形。一個比較簡單可以去保護試用版的方法就是提供額外的限制或者不完整的軟體給使用者。然而如果你為了讓使用訂閱你所銷售的軟體,而去建立一個根據時間所產生的授權,或者提供時間限制的試用版,竄改時間的攻擊對你而言,會是一個非常嚴重的風險,將導致你的軟體被無限制地使用。

另外一個方法去保護這些以時間為基準的軟體授權,是把真實時間建立到硬體鎖內。如此一來,駭客必須破解硬體內金鑰來修改時間,在這個程序中,這樣的動作將會摧毀整個金鑰而導致無法使用。很不幸地,如果在硬體鎖內加了時鐘,則必須持續透過機板上的電池來提供電量,否則時間將會被被清除或重置。何況如果你採用這種方式來發行試用版,所有多出來的額外成本必須自己吸收。

有很多簡單且聰明的方法可以來防護時間竄改的攻擊破解手法。假如一個硬體式的權杖被使用在系統上,將有能力可以去存取系統的時間。開發者可以使用這樣的資訊去防止時間被竄改。如果權杖(Token)偵測到系統時間有明顯變化時,應用系統可以被停用或者在一個限制的條件下去執行,使用者將無法使用正常功能。這個解決方案可以使你去提供時間限制的授權跟安全的試用期限選項。如此一來,可以有效防止免費無時間限制的試用版被大量使用,也不會有多餘的成本支出並且不會有處理時鐘準確度相關麻煩問題。

友善的伙伴

軟體必須考量他們軟體銷售的供應鏈的安全性。假如你要控制你的經銷商所產生的授權時,在製造的過程中可以指定其加密的金鑰。這樣的經銷商金鑰可以用來控制軟體製造中所能產生的授權最大數量或者進行試用版本的製造。利用這樣的金鑰可以在你的供應鏈中,隨時提供高安全性的軟體保護。

經銷商有能力去根據 ISV 廠商所提供的授權樣本去建立新的授權。這個程序需要用特殊的金鑰來簽署。簽署所使用的金鑰將會儲存在硬體式的權杖(Token)。ISV 和經銷商的權杖都能去簽署這一個授權。然而這樣的簽署金鑰是有次數限制的,可以用來控制授權所產生的數量。特製軟體所使用的授權只能被建立和被 ISV 簽署。

結論

科技日新月異,很不幸的,資訊安全方面的威脅也是日漸增多。軟體保護的解決方案應該要讓使用者覺得破解軟體的成本比購買的費用高。外接的硬體鎖解決方案提供現今最高等級的安全強度。這樣的武器如果沒有效率地使用它,使用起來並不會有效率。硬體鎖如果要提供最高可能的安全性等級,必須由有經驗的開發者來完成。因此,選擇一個硬體式權杖(Token)並且熟練地整合到應用系統之後,可以提供最高等級的防護,這樣的成本至少會比雇用一整隊的警衛來得划算吧!