撰文|叡揚資訊 資訊安全事業處 專案支援經理 鄭鈞元
自2007年iphone問世後,新科技應用帶來了便利的生活品質,包含了金融科技、物聯網世代、行動支付、人工智慧、居家照顧機器人、電動車等應用,越來越多廠商投入應用系統開發,相對的應用系統更需要完整防護,以保障企業智慧財產權以及使用者的資訊安全。
SDLC未被注意事項
報告長官!競爭對手已開發出一個和我們功能外觀一模一樣類似的產品,此時此刻撼動了所有管理以及研發階層人員。商業競爭能在最短時間內打擊對手方式就是抄襲,一旦商品設備未受到應有的保護,競爭對手可透過逆向工程達到目的,在開發過程以及產品發表時,企業都會遵循著SDLC開發週期,但是卻往往忘了最重要事情,上架的產品是落入了一般消費者還是競爭對手(惡意攻擊者)手上。
尤其當產品設備物聯化後,攻擊者可利用網路針對系統缺陷、逆向工程反組譯、重新包裝系統、注入式更換惡意Library實現多種攻擊手法,甚至可進行勒索,如同網路犯罪影集般,醫療設備聯網後遭到惡意的攻擊,如:攻擊者不在指定時間內付贖金,則會危及病人、醫療人員性命,一旦設備本身未進行安全防護,基本上攻擊方很容易掌控整體局勢。

↑ SDLC未被注意事項
App應用系統與網頁系統差異
App應用系統與網站應用系統主要差別在於最後佈署安裝所在位置,網站系統屬集中化受信任式的環境下運行,並且皆有相關硬體設備保護,對於攻擊者來說要入侵存取系統程式有一定的難度,但App應用系統由於是佈署在行動裝置上/IoT,攻擊者可以輕易取得系統核心庫以及應用系統執行程式並策動攻擊以及弱點偵測,因此企業在不同形態下的應用系統防護上必需要有不同的思維來防範。

↑ App應用系統與網頁系統差異
未受保護App上架=免費贈送原始碼=提供駭客弱點偵測及攻擊
今日行動裝置市場已成iOS以及Android兩大派別,兩種不同的作業系統App開發模式以原生的Objective-C、SWIFT以及Java甚至Hybrid Html/JS開發模式,若未受適當保護前提下以Hybrid開發模式安全議題甚大,透過反組譯或透過中間人手法MITM(提取裝置檔案/封包側錄)即可取得Source Code內容,由於是執行階段因此幾乎無一倖免,對於特別強調安全APP開發模式則會採用Native Code方式開發,甚至將重要的功能轉成C語言開發,如必須採用Hybrid開發模式,筆者強烈建議將重要邏輯程式盡量寫在Server端來運行,並綁定憑證傳輸及JS程式碼混淆方式,避免暴露重要邏輯-(Hybrid開發下未告知的安全議題)。
↑ Hybrid開發錄製封包查看原始碼
其次Android系統一般只需透過反組譯工具進行逆向工程即可取得Source Code內容,iOS系統則相對於逆向工程後取得是低階組合語言機器碼,因此對於理解閱讀上較為困難,但不意味著安全,一旦攻擊者能閱讀理解或是被轉換成C語言的虛擬程式碼仍是有相對的風險。

↑ Android反組譯

↑ iOS反組譯
除了上述的靜態分析外還有動態攻擊的分析手法,如使用模擬器進行偵錯Debug方式以及更換OS Library模組執行惡意Library或是更換惡意的函式(Method Swizzling)。
對於攻擊者的破解應用系統的價值
-
盜版未經授權發佈使用:免費提供破解版本,通常內含惡意的蒐集各資程式。
-
竊取智慧財產權及重要資訊:遊戲/IoT設備的演算引擎程式、機敏性加密金鑰、保單計算公式等。
-
避開授權控制:避開登入驗證、License、取得更高權限等。
-
惡意執行:交易竄改、遊戲作弊、執行惡意程式等。
偵測提示JB/Root不進行任何反應機制更不安全
一般國內銀行App都已有撰寫偵測JB/Root機制,但都因不敢得罪使用者即便偵測後出現提示訊息,未進行阻擋使用,使得攻擊端可完全操控App,連同偵測時機點(提示訊息)也都暴露出,因此建議一旦偵測到不安全裝置,將此裝置識別回傳至後台Server紀錄,一旦發現被偵測次數過於頻繁時則必要進行鎖定重要功能,當然最好的作法是直接阻擋使用。
在一定會被攻擊前提下,思維防護之道Apperian 版圖─專為大型企業設計
最根本的防護機制仍在於程式碼以及邏輯流程混淆,因我們想保護的是程式碼,即便反組譯後攻擊者是無法看懂混淆後的程式碼,再加上防止動態攻擊(Debug/Hook/Swizzling/Root/Checksum等…),大幅提升被破解的難度使得攻擊者不願意花更多成本及時間進行研究進而放棄攻擊,在資安領域觀念上沒有完全無法破解的軟體,因此我們必須假定前提一定會被攻擊破解,由於單點防護不足以應對惡意攻擊,所以要透過縱深防禦以及交遞式多層次的防護機制盡力阻擋並提升攻擊門檻,最後提供一些必要檢查安全項目供讀者參考。
APP 發佈時安全檢查項目
-
發佈版本時,請將Debug模式關閉。
-
非必要時別將敏感資訊寫出log。
-
偵測到不安全環境(root/JB/debug/模擬器等..)時須採取必要的反應機制。
-
重要功能程式碼以及流程邏輯需進行混淆。
-
Server端需驗證APP特徵以及使用服務的合法性。
-
Hybrid開發時,不要將重要邏輯寫在js檔案中。
-
Hybrid開發時,程式碼內不必要註解請移除。
-
金鑰保護須採取白箱加密機制。
-
避免撰寫Hard code key或是Hard code password於程式碼中。
-
動態調用library method功能時,需驗證library checksum值合法性。
-
檢查應用程式App完整性。
-
以最小存取權限為原則,App所需要使用手機功能才開啟。
-
重要資訊必須進行加密。
立即訂閱以收到最新資安文章