2018 年 5 月

第 33 卷,第 5 期

本文章是由機器翻譯。

安全性 - 從 Xamarin 應用程式偵測及回應已破解的 Android 裝置

Joe Sewell

在最後一年 11 月的問題,我說明如何使用執行階段會檢查的程式碼資料隱碼隨附於 Visual Studio 2017,來保護免於未經授權使用的偵錯工具,以及從竄改的.NET Framework 應用程式的功能 (msdn.com/magazine/ mt845626)。從那時起,新類型的核取變成可用。根檢查偵測到 「 根 」 裝置上執行的 Xamarin.Android 應用程式時,可讓一般應用程式與系統管理員權限 (根存取) 所做的其中一個。

在本文後續我說明為什麼 root 破解的裝置會造成所有的 Android 開發人員必須了解; 風險詳細說明如何 Xamarin.Android 開發人員可以使用根檢查偵測和回應的風險。並示範的範例案例的最佳做法。

為什麼您需要防止為根建立

Xamarin 平台可讓您有效率地為 Android、 iOS 和 Windows 裝置建立行動應用程式。熟悉 C# 等.NET 語言的開發人員可以使用該知識,並將它套用到行動裝置的空間。Xamarin.Forms 這類技術抽象離開多平台,降低成本的複雜度和風險來開發跨平台應用程式之間的差異。保留最新的 Xamarin 工具,您可以繼續支援新的版本和每個平台的功能。

不過,平台專屬的某些層面行動應用程式開發進行可以擁有開發人員的注意。這類的其中一個層面是安全性。每個平台都有唯一的安全性風險和唯一的安全性模型,來解決這些風險。例如,權限系統各有不同的平台之間,有時候甚至相同平台的版本。

針對 Android 應用程式,root 破解的裝置都有特別重要的安全性考量。這類裝置可讓應用程式中斷作業系統會加諸的一般安全性沙箱已修改。這可以公開許多危險,例如惡意程式碼和密碼竊取鍵盤記錄程式裝置。使用者通常根他們的裝置,若要解決某些問題 — 例如需要不是一般適用於其裝置的應用程式的版本 — 不知情這些威脅的嚴重性。在其他情況下,使用者即使可能不知道裝置已進行 root 破解,因此容易遭受。

最後一年 9 月,付款卡產業安全性標準委員會 (PCI SSC) 發出行動裝置版付款接受安全性指導方針,開發人員的 2.0 的版。為了打擊 root 破解的裝置相關聯的安全性風險,建議行動裝置應用程式開發人員實作根偵測和回應機制來隔離應用程式的指導方針 (bit.ly/2H5ymge)。以下是從 4.3 (加入強調) 一節的相關文字:

[T] 他裝置應該監視擊敗作業系統安全性 controls—e.g。、 jailbreaking 或為根建立的活動,並偵測到,裝置應該已隔離的一種解決方案,將它從網路移除,移除付款接受應用程式從該裝置,或停用付款應用程式。離線破解和根的偵測與自動隔離是索引鍵,因為某些攻擊者可能會嘗試將裝置處於離線狀態,無法進一步規避偵測。

除了合法使用者操作 root 破解的環境中的應用程式相關聯的風險,這類環境也可能表示惡意使用者嘗試進行反向工程應用程式。攻擊者經常會使用 root 破解的裝置檢查和建立的應用程式,然後惡意程式碼填入遭竄改的版本。開啟 Web 應用程式安全性專案 (OWASP) 列出的程式碼做為其中一個 Top 10 Mobile 風險竄改 (bit.ly/2GNbd4o) 和特別出根偵測和回應,用來抵禦這項風險的呼叫。不這麼做,根據 OWASP,可能會導致 reputational 損毀和利潤的損失。

根檢查

偵測 root 破解的裝置會有點困難。可以使用許多不同的技術,為裝置的根目錄,並可用的技術一組變更一段時間後跨各 Android 版本。如此一來,根偵測程式碼必須不斷發展和調整。這是複合性的一些惡意將根技術嘗試隱藏其使用情形,因此良好根偵測程式碼也必須解決這些因應對策的事實。維護最新的根偵測程式碼是很難解釋,以及可能要花有限的資源。

幸運的是,您不必自行撰寫程式碼來偵測為根建立。先佔式保護-Dotfuscator Community Edition (CE),隨附於 Visual Studio 2017 適用於 Windows,可以插入根檢查 Xamarin.Android 應用程式。根檢查偵測到 root 破解的環境中,即使裝置已離線。除了標準的 「 結束應用程式 」 動作,您可以設定檢查,以回應為根建立藉由呼叫自訂應用程式程式碼。

就像 Xamarin 本身,根檢查降低複雜性、 成本和風險相較於復原自己的實作。將 Dotfuscator 保持最新,並讓它處理根偵測 — 回去上您更快速的應用程式有興趣的部分工作。

範例案例

若要示範根檢查,我提供了稱為受保護 TodoAzureAuth 範例應用程式。它以現有的 Xamarin.Forms 樣本,TodoAzureAuth (bit.ly/2InvU48)、 由 David Britch 原本寫入。

這篇文章的其餘部分將說明應用程式時,我給它,而且我要如何套用該策略具有根檢查套用的保護策略。您可以使用此案例研究,以及包含範例 GitHub 儲存機制中的其他案例 (bit.ly/2GQutOv),若要了解根會檢查您接著可以套用到您自己的 Xamarin.Android 應用程式的方法。

原始的範例: TodoAzureAuth 會連接到 Microsoft Azure 行動應用程式執行個體,讓使用者檢視及修改共用的待辦事項清單。若要示範如何驗證執行中的 Xamarin 應用程式,此範例會要求使用者登入 Google 帳戶,才能存取待辦事項清單。

應用程式開始在登入頁面上,具有任何欄位,只要登入按鈕。當使用者選取此按鈕時,應用程式會委派至 Google OAuth 系統,這可能需要使用者輸入認證,包括密碼登入程序。如此一來,應用程式本身不會處理憑證。一旦使用者已登入,應用程式會顯示 Todo 清單頁面上,讓使用者能夠存取共用的待辦事項清單。使用者可以登出,並藉由選取 [登出] 按鈕回到登入頁面。

保護策略:這個發行項,我視為 TodoAzureAuth Android 專案,TodoAzure.Droid,其已處理敏感性資料,如 PCI 相容的應用程式。我實作適當的保護策略將根檢查插入應用程式時,使用 Dotfuscator CE 產生受保護的應用程式時,受保護 TodoAzureAuth 版本。

在受保護的應用程式,當使用者選取 [登入] 按鈕,根檢查就會啟動。如果 root 破解的裝置上執行應用程式,突然,它會結束,即使該裝置不再為根目錄所有嘗試執行應用程式也會在簡短的錯誤訊息之後, 都結束。圖 1顯示這項策略所保護的應用程式的概觀。

受保護的 TodoAzureAuth 範例應用程式的概觀
圖 1 保護 TodoAzureAuth 範例應用程式概觀

這項策略對齊前面加上引號的 PCI 指導方針所提出的建議:

  • 應用程式監視的裝置為根建立。
  • 應用程式會停用本身,如果偵測到為根建立隔離的裝置。
  • 此安全性控制的運作方式即使當裝置已離線。

當應用程式停用,錯誤訊息通知使用者的裝置是不安全。雖然未使用此範例中,使用此案例的應用程式可能也 」 的電話號碼首頁 」 分析平台,例如 Visual Studio 應用程式中心 (bit.ly/2pYMuk5)。

除了遵循 PCI 指導方針,這項策略也排列與 OWASP 建議關閉 [應用程式根目錄的環境,以避免反向工程。我設定根檢查,啟動程式碼,而不只是登入程序,其他部分,讓攻擊者就會產生與移除登入程序的根偵測竄改的版本的應用程式,應用程式的其他部分仍然可以回應為根建立。Dotfuscator 也混淆的程式碼加入應用程式和根檢查的另一層保護。

並非所有應用程式相同的安全性需求,而且因此並非所有應用程式應該回應相同的方式為根建立。選擇 [此範例中,有嚴格的方法,但較寬鬆的策略可能會允許在某些情況下 root 破解的裝置上執行的應用程式。如需範例,請參閱 「 替代保護策略。 」

受保護的範例:您可以檢視受保護 TodoAzureAuth 範例使用稍早提供的 GitHub 連結。上預設的主要分支,我已經設定 Dotfuscator CE,保護 TodoAzure.Droid 與根檢查,讓應用程式符合稍早所說明的策略。您可以遵循的 Git 記錄開頭之前檢查分支,若要得知我這篇文章中的步驟套用到此範例。

請如何設定、 建置及執行範例,參閱範例的讀我檔案,如需詳細資訊。讀我檔案也包含其他分支上的儲存機制中有示範不同的保護策略比本文中,例如 「 替代保護策略中。 」 的詳細的策略的詳細資料

Dotfuscator 整合 Xamarin 組建

Dotfuscator 對.NET 組件 (.dll 和.exe 檔案),因為不適用於行動平台格式,例如 Android 套件 (.apk 檔案),複選 Dotfuscator 整合 Xamarin 建置程序。設定整合需要安裝和註冊 Dotfuscator CE、 下載特製化的 MSBuild 目標檔案及修改專案檔,以包含這些目標。編寫如何執行這些整合步驟 Xamarin 部落格,因此在這些指示,請參閱bit.ly/2w9em6c

重要事項:根檢查需要 Visual Studio 2017 Dotfuscator CE 5.35 或更新版本。您可以自動取得最新版本,在bit.ly/2fuUeow

遵循 Xamarin 部落格指示,以保護 TodoAzure.Droid 專案檔版本 |AnyCPU 組建組態。這篇文章僅有關這個 Android 專案,因為根檢查是 Android 特定功能,但您也可以遵循 Xamarin 部落格指示,以保護 iOS 和通用 Windows 平台 (UWP) 專案的程式碼混淆。

設定 Dotfuscator 保護

一旦我 Dotfuscator 整合 TodoAzure.Droid 專案的建置程序時,設定透過 Dotfuscator CE UI 的保護。專案的保護設定會儲存在特殊 Dotfuscator 組態檔,build 整合將加入至您的專案建置的第一次。

正在建立 Dotfuscator 組態檔:使用 Visual Studio 2017,內建 TodoAzure.Droid 版本中的專案建置 AnyCPU 平台,這是要使用 Dotfuscator 已設定的組態設定。這會產生新 Dotfuscator 組態檔,DotfuscatorConfig.xml,專案的目錄中。我稍後無法自訂,並重新套用該自訂為基礎的保護,原始檔控制加入這個新的檔案。

組建也會建立 DotfuscatorReports 目錄在我的專案目錄中,這是整合的一部分執行時 Dotfuscator 寫入各種報表檔案的位置。因為此目錄的內容更新每個組建,我必須忽略這個目錄我原始檔控制。

開啟 Dotfuscator:若要自訂 Dotfuscator 組態檔,開啟 Dotfuscator CE UI 從 Visual Studio 2017 藉由選擇 [工具 |先佔式保護-Dotfuscator。在 Dotfuscator UI 中出現,選擇 [檔案 |開啟專案時,巡覽至 TodoAzure.Droid 專案的目錄,且選取 DotfuscatorConfig.xml,Dotfuscator 組態檔。Dotfuscator UI 更新以顯示兩個可保護此 Dotfuscator 組態檔的組件:TodoAzure.Droid.dll 本身,可攜式類別庫 (PCL) 組件 TodoAzure.dll。

請記住 Dotfuscator UI 中的建置專案選項不會執行 Xamarin 封裝步驟。若要確保 Android 套件包含受保護的組件,請從 Visual Studio 或 MSBuild 改為建置專案。

啟用程式碼資料隱碼:檢查屬於 Dotfuscator 程式碼資料隱碼功能。若要啟用程式碼資料隱碼,我 Dotfuscator 導覽列中的資料隱碼節點上按一下滑鼠右鍵,並選取 [啟用] 選項。從灰色變更為黑色,指出已啟用資料隱碼資料隱碼節點的文字色彩。

檢視設定檢查:Dotfuscator 檢查頁面會顯示一份所有設定檢查載入的組態檔,在此情況下 DotfuscatorConfig.xml TodoAzure.Droid 專案中。若要檢視此頁面,已選取 [插入] 節點,並切換到 [檢查] 索引標籤。

當我第一次瀏覽此清單時,它是空的。一旦設定新的根檢查,我下一節所說明,更新清單以該檢查,包含一個資料列中所見圖 2。我無法檢視核取的組態,連按兩下該資料列。

Dotfuscator 檢查顯示根檢查的頁面
圖 2 Dotfuscator 檢查顯示根檢查的頁面

請注意,您可以設定多部根檢查有單一的 Dotfuscator 組態檔,但我沒有這麼做這個發行項。多個檢查受保護的應用程式的範例,請參閱我撰寫有關過去年 11 月的 AdventureWorksSalesClient.NET Framework 應用程式。

新增根檢查

從 [檢查] 頁面中,我加入根檢查依序按一下 [新增根檢查] 按鈕。當我一樣 Dotfuscator 會顯示新的視窗來設定新的檢查。圖 3顯示完成的組態; 本章節將說明每個設定及為什麼我選擇這些設定的意義。

設定根檢查的 — 隱藏摺疊的 TodoAzure.dll 節點的其他位置
圖 3 設定根檢查的 — 隱藏摺疊的 TodoAzure.dll 節點的其他位置

位置:每個核取的應用程式,稱為 「 位置中的一或多個方法都會關聯。當應用程式呼叫這種方法時,根檢查就會啟動,偵測在該時間點,如果裝置似乎根目錄。執行所有設定報告和回應的功能,假設這些量值沒有結束應用程式之後,檢查會將控制權還給方法頂端。

此案例的檢查,我可以選取多個位置。第一次使用應用程式中的位置是 TodoAzure.Droid.MainActivity.AuthenticateAsync,而該控制項會協調登入要求。使用此位置表示根檢查將其偵測和回應每次執行登入程序開始。

每個保護策略中,先到達 AuthenticateAsync 方法時,會結束 root 破解的裝置上執行的應用程式。因此為什麼未加入其他方法就會發生的應用程式的生命週期的更新版本中做為額外的位置?這是為了協助防範反向工程應用程式。如果攻擊者建立的應用程式,會略過或移除根檢查程式碼,在 AuthenticateAsync 遭竄改的版本,這些其他位置將仍然能夠回應 root 破解的環境。

這些其他位置的某些 TodoAzure.dll 中定義。這可能會令人意外,因為該組件包含邏輯通用於所有 Xamarin 平台,不只 Android。如何可以 Dotfuscator 插入根檢查 — 這會偵測根目錄 Android 裝置 — 無從驗證平台組件?請記住,這個 Dotfuscator 組態檔是 TodoAzure.Droid 專案,即在參考 TodoAzure 專案特有的。當 Dotfuscator 修改 TodoAzure.dll 時,它會修改 Visual Studio 或 MSBuild 複製使用目前專案 TodoAzure.Droid 中的組件。原始 TodoAzure 專案的組件會維持不變。

應用程式通知:檢查可以報告其偵測到應用程式程式碼的結果。這可讓您偵測工作 Dotfuscator 控制代碼所需檢查插入時,已自訂報告和回應行為。接收偵測結果的應用程式程式碼會呼叫應用程式通知接收。

為了符合保護策略,在此案例中,我需要應用程式停用,因此未來執行應用程式結束,並出現錯誤訊息。我選擇用來加入這個停用的方法,TodoAzure.App.DisableIfCompromised 中的邏輯和做為它的核取接收器設定下列檢查屬性:

  • ApplicationNotificationSinkElement:一種程式碼項目。在此案例中的方法。
  • ApplicationNotificationSinkName:簡單名稱的程式碼項目。在此情況下,DisableIfCompromised。
  • ApplicationNotificationSinkOwner:包含程式碼項目; 的型別在此情況下,TodoAzure.App。

任何核取的位置可以呼叫這個接收器方法,因為它 public 和 static。若要檢查相容,方法是同步的 (非非同步)、 接受單一 bool 引數,而且具有 void 傳回型別。

啟動時,檢查呼叫的方法,如果裝置已進行 root 破解,傳入的引數為 true 和 false 否則。這個引數為 true 時,也就是當檢查偵測到為根建立 — 方法會將值儲存至本機存放裝置,指出應用程式現已停用。隨附的屬性,IsDisabled,會公開儲存的值:

// Definitions in TodoAzure.App
private const string DisabledPropertyKey = "AppStatus";
public static void DisableIfCompromised(bool wasCompromised)
{
  if (!wasCompromised) { return; }
  Current.Properties[DisabledPropertyKey] = new Random().Next();
  SavePropertiesNow();
}
public static bool IsDisabled =>
  Current.Properties.ContainsKey(DisabledPropertyKey);

應用程式已停用之後,日後要執行需要顯示錯誤訊息並結束。若要這樣做,我已覆寫 TodoAzure.LoginPage.OnAppearing,登入頁面會顯示應用程式啟動之前呼叫。已停用應用程式,這個方法會隱藏登入頁面,會顯示錯誤對話方塊,然後結束。

// Definition in TodoAzure.LoginPage
protected override async void OnAppearing()
{
  if (App.IsDisabled)
  {
    IsVisible = false;
    var message = "The security of this device has been compromised. "
      + " The app will exit.";
    await DisplayAlert("App deactivated", message, "Exit App");
    App.Exit(); // Delegates to platform-specific exit logic
  }
  base.OnAppearing();
}

因為我也想要防止反向工程,我會採取其他措施以確保應用程式會更有彈性,這類攻擊。我使用了微積分名稱的已儲存的值,AppStatus,並將值設定為使值的意義含糊不清的隨機數字。我也設定 Dotfuscator 模糊化應用程式時,其重新命名 DisableIfCompromised,類似的識別項,讓攻擊者檢視反編譯的程式碼不會輕易地識別為感興趣的這個方法中。如需如何設定重新命名模糊化的詳細資訊,請參閱範例的讀我檔案。

動作:接收 (DisableIfCompromised 方法) 設定屬性,以確保之後執行的應用程式結束,而它不本身結束應用程式時為根建立第一次偵測到。相反地,我設定的核取自動動作檢查屬性設定為結束執行此動作。

當檢查偵測到 root 破解的裝置時,它會通知接收,並立即結束應用程式。需要進行檢查,而不是這個接收器執行這個初始結束,我散佈透過應用程式的結束邏輯的多個複本。就像使用多個位置,結束邏輯的多個複本會允許以進一步保護自己,當攻擊者移除根檢查的某些應用程式。

建置和測試應用程式

設定根檢查之後, 我必須結束的核取視窗選取 [確定],然後儲存我的變更到 Dotfuscator 組態檔選擇檔案 |儲存專案。我建置 TodoAzure.Droid Visual Studio 來測試,受保護的應用程式,以便確認我正確設定根檢查來強制執行的預定的保護策略中。

我測試非 root 破解的裝置上,root 破解的裝置和模擬器上的應用程式。在非 root 破解的裝置上的應用程式的作用一般來說,讓我登入來檢視待辦事項清單。不過,root 破解的裝置和模擬器中,選取 [登入] 按鈕之後上應用程式突然關閉。之後重新啟動應用程式,應用程式會顯示錯誤對話方塊所示圖 4; 在關閉對話方塊時,應用程式一次結束之後。若要檢視登入頁面,我必須解除安裝,然後再重新安裝應用程式。

在模擬器中執行的受保護的 TodoAzure.Droid
圖 4 在模擬器中執行的受保護的 TodoAzure.Droid

總結

我希望這篇文章有幫助照亮有效地偵測及回應至根項目使用可用工具的 Android 裝置隨附的 Visual Studio 的方式。我使用已知的範例應用程式做為參考時,您可以套用各種 Xamarin.Android 應用程式以及各種其他保護策略,在本文中導入的想法。

如果您想要了解更多關於檢查,建議您閱讀我先前的 MSDN Magazine 文件。中,我將討論其他種類的檢查,您可以套用至.NET Framework 應用程式,以及如何檢查可以避免資料缺口。

您可能也會想要的進階的核取和模糊化功能的 Dotfuscator Professional Edition (bit.ly/2xgEZcs) 或用於 Java 和傳統 Android 應用程式,請先佔式保護-DashO 的隨附工具 (bit.ly/2ffHTrN)。您可以保持在使用中檢查和先佔式保護的所有發展 Twitter 上遵循 PreEmptive Solutions (twitter.com/preemptive) 和瀏覽我們的部落格 (preemptive.com/blog).

替代保護策略

此文章提供一個策略來偵測和回應 root 破解的裝置,但也可能其他策略。您所選擇策略應該要適用於您的應用程式,使用您的應用程式並安全性風險,您的內容要位址。然後,您可以套用根檢查實作所選擇的策略。比方說,如果您的應用程式必須在任何情況下結束,您可以設定根檢查偵測到為根建立時,某些功能,而不是結束應用程式停用。

單一應用程式甚至可能需要採取回應動作為根建立以不同的方式,根據在執行階段知道的資訊。請考慮應用程式可在多個地理區域。若要為根建立應用程式的回應可能需要因地區而以符合用戶所在地法律及法規,特別是當該回應包含傳送事件報告給開發人員 ("打電話 home")。

在開發保護策略時,您也必須考慮您的策略會對應用程式具有刻意根項目誠信在其裝置的使用者造成的影響。這些 「 power users 」 可能是您的客戶群,重要的部分和不允許 root 破解的裝置無法驅動它們離開您的應用程式。您必須權衡 root 破解的裝置,避免 alienating 合法這類裝置的使用者相關聯的商業風險與相關聯的安全性風險。

這個發行項,我會假設 TodoAzure.Droid 處理敏感性資料,並因此,若要避免資料遭竊並反向工程,root 破解的裝置應該完全禁止。如果我改為必須視為非機密資料,我可能有實作保護策略,可讓 root 破解的裝置,在某些情況下,讓應用程式更容易存取進階使用者。在這個替代策略中,而不是應用程式本身,停用應用程式會偵測到 root 破解的裝置時警告使用者。這項警告可確保使用者所知的裝置與相關聯的風險的不安全的狀態是否認證竊取。使用者可以選擇來取消的登入嘗試,或接受風險並繼續登入。

在受保護 TodoAzureAuth GitHub 儲存機制時警告使用者分支,我已設定來保護與根檢查可實作此替代保護策略 TodoAzure.Droid Dotfuscator CE。在該分支上的讀我檔案說明的設定進行更細微的點。

請注意此替代策略會取捨至進階使用者的存取範圍及反向工程的威脅。在此策略,不良執行者仍然可以安裝應用程式的反向工程; 進行 root 破解的裝置上[警告] 對話方塊不會停止它們。我仍會使用 Dotfuscator 模糊化應用程式時,提供某種程度的保護進行反向工程。實際的應用程式可以實作其他控制項,例如要求特殊 root 破解的裝置上使用的應用程式的驗證。

圖 A顯示應用程式根目錄的裝置上執行時所顯示的警告。

TodoAzure.Droid,受此替代的策略,使用者選取 [登入] 按鈕之後,在模擬器中,執行
圖 TodoAzure.Droid,受此替代的策略,使用者選取 [登入] 按鈕之後,在模擬器中,執行


Joe Sewell是軟體工程和技術撰寫 PreEmptive solutions Dotfuscator 小組。他先前已寫入 MSDN Magazine 和官方 Xamarin 部落格。

非常感謝下列 Microsoft 技術專家檢閱這篇文章:David Britch
David Britch 適用於 microsoft Xamarin 文件群組。他已寫入某一範圍的軟體開發發行集,包括書籍、 指引文件、 參考實作、 白皮書、 影片和教學課程的課程