DroidBot:Android 的輕量級 UI 指導測試輸入生成器

摘要

就像許多用於 Android 的自動測試輸入生成工具需要插入系統或應用程序一樣,它們不能在某些情況下使用,例如兼容性測試和惡意軟件分析。我們引入了 DroidBot,這是一種輕量級的 UI 引導測試輸入生成器,它能夠在幾乎沒有儀器的情況下與幾乎任何設備上的 Android 應用進行交互。 DroidBot 背後的關鍵技術是,它可以基於即時生成的狀態轉換模型生成 UI 指導的測試輸入,並允許用戶集成自己的策略或算法。 DroidBot 是輕量級的,因為它不需要應用程序檢測,因此無需擔心測試版本和原始版本之間的不一致。它與大多數 Android 應用程序兼容,並且能夠在幾乎所有基於 Android 的系統上運行,包括定製的沙箱和商用設備。 Droidbot 作為開源工具在 GitHub 上發佈,演示視頻可以在https://youtu.be/3-aHG SazMY 上找到。

關鍵字——Android;動態分析;自動化測試;惡意軟件檢測;兼容性測試;

I 簡介

近年來,移動應用程序(簡稱應用程序)已得到廣泛應用,在 Google Play 和 Apple App Store 中都有超過 200 萬個應用程序可供下載,而下載量已累積了數十億。

由於存在許多應用程序和許多不同的設備的原因,自動化應用程序測試已成為重要的研究方向。 特別是,大量研究集中在 Android 應用程序的自動輸入生成技術上。 根據最近的一項調查顯示,大多數方法都利用應用程序工具或系統修改的方式來獲取足夠的信息以指導測試。

但是,在某些情況下對應用程序或系統進行檢測是不現實的。例如,在兼容性測試中,應按原樣在商用設備上測試應用程序,以找出可能導致崩潰的設備。另一個例子是惡意軟件分析。 由於許多惡意應用程序被混淆了,因此對其進行檢測可能很困難,甚至是不可能的。一些惡意應用程序還應用沙盒檢測,這可能導致在檢測的測試設備和真實設備上出現不同的行為。

本演示文稿介紹了 DroidBot,這是一種用於 Android 應用程序的輕量級 UI 引導的測試輸入生成器。DroidBot 的設計原則是以最小的額外要求支撐以模型為基礎的測試輸入生成。

DroidBot 提供基於狀態轉換模型的 UI 引導輸入生成,該狀態轉換模型是在運行時即時生成的。然後,它基於過渡模型生成 UI 指導的測試輸入。默認情況下,輸入是使用深度優先策略生成的,該策略在大多數情況下均有效。用戶還可以通過編寫腳本來自定義探索策略,或者通過擴展事件生成模塊來集成自己的算法,從而使 DroidBot 成為高度可擴展的工具。

DroidBot 更輕巧的主要原因是,它不需要提前瞭解未開發代碼的知識。與許多依靠靜態分析和檢測獲取未開發代碼知識的現有生成器不同,DroidBot 僅基於一組 Android 內置測試/調試實用程序對瀏覽狀態進行建模。儘管這樣做可能會使 DroidBot 更難去觸發某些特定狀態,但這種折衷使 DroidBot 可以與幾乎任何定製設備上的任何應用程序(包括無法檢測到的混淆/加密應用程序)一起使用(除非該設備有意從原始 Android 框架上刪除了內置的測試/調試模塊,但這種情況很少發生)。

DroidBot 還提供了一種新的方法來評估測試輸入的有效性。現有方法主要在開源應用程序或儀器應用程序上使用 EMMA 來計算測試覆蓋率。但是,對於反儀器應用程序(例如,在運行時驗證簽名或對代碼進行加密)來說,很難或基本不可能獲得其測試範圍。DroidBot 能夠為每個測試輸入生成調用堆棧跟蹤,其中包含測試輸入觸發的應用程序方法和系統方法。 我們可以使用調用堆棧作為近似指標來量化測試輸入的有效性。

DroidBot 的源代碼可以在 Github 上找到。

II 工具設計

DroidBot 的總體體系結構如圖 1 所示。要在設備上測試應用程序,DroidBot 要求設備通過 ADB 連接。 該設備可以是仿真器,商用設備或定製的沙箱,例如 TaintDroid 和 DroidBox。

我們引入了適配器模塊,以提供設備和被測應用程序(AUT)的抽象。它處理低級技術問題,例如與不同的 Android 版本和不同的屏幕尺寸的兼容性,與設備的連接,向設備發送命令以及處理命令輸出等。

適配器還會充當測試環境和測試算法之間的橋樑。 一方面,它監視設備和 AUT 的狀態,並將狀態信息轉換為結構化數據。另一方面,它接收算法生成的測試輸入並將其轉換為命令。 藉助適配器,DroidBot 能夠提供一組易於使用的高級 API,供用戶編寫算法,同時確保算法可在不同的測試環境中工作。

DroidBot:Android 的輕量級 UI 指導測試輸入生成器

圖 1 DroidBot 概覽

Brain 模塊在運行時接收適配器產生的設備和應用程序信息,並將生成的測試輸入發送到適配器。測試輸入的生成基於即時構建的狀態轉換圖。圖的每個節點代表設備狀態,而每對節點之間的邊則代表觸發狀態轉換的測試輸入。DroidBot 集成了一個簡單但有效的深度優先遍歷算法來生成測試輸入。它還允許用戶集成自己的算法或使用特定於應用程序的腳本來改進測試策略。

這樣的設計提高了 DroidBot 的可用性。表 I 顯示了 DroidBot 與其他公共可用的測試輸入生成工具之間的可用性比較。我們可以看到,DroidBot 對需求的要求與 Monkey 一樣低,同時提供了比其他需要檢測工具的功能更多的可擴展功能。

DroidBot:Android 的輕量級 UI 指導測試輸入生成器

表 1 現存公開的黑盒測試輸入生成器的可用性比較。注意有些數據來自 CHOUDHARY 等。

III 實現

A. 輕量級監控與輸入

DroidBot 從設備中獲取設備/應用程序信息,並通過 ADB 將測試輸入發送到設備上。監視和輸入階段都是輕量級的,因為它們主要基於現有的 Android 調試/測試實用程序,而大多數 Android 設備上都提供這些實用程序。

從設備上獲取的信息可以被分為三類:

1)GUI 信息。對於每個 UI,DroidBot 記錄使用 UI Automator(對於高於 16 的 SDK 版本)或 Hierarchy Viewer(對於較低的版本)轉儲的屏幕快照和 UI 層次樹。

2)過程信息。DroidBot 使用 ps 命令監視系統級進程狀態,並使用 Android 中的 dumpsys 工具監視應用程序級進程狀態。

3)日誌。日誌包括每個測試輸入觸發的路徑跟蹤以及應用程序生成的日誌。可以從 Android 分析工具和 logcat 中檢索它們。

DroidBot 支持的測試輸入類型包括 UI 輸入(例如觸摸,滾動等),意圖(BOOT COMPLETED 廣播等),要上傳的文檔(圖像,txt 等)和傳感器數據(GPS 信號等)。請注意,傳感器仿真僅受模擬器支持。

DroidBot 提供了一系列易於使用的 API,用於從設備中獲取信息並將輸入發送到設備。例如,開發人員只需調用 device.dump_views()即可獲取 UI 視圖列表,並調用 view.touch()將觸摸輸入發送至視圖。

B. 即時模型構建

DroidBot 根據運行時監視的信息生成 AUT 模型。該模型旨在幫助輸入生成算法做出更好的測試輸入選擇。

圖 2 顯示了狀態轉換模型的示例。從本質上來說,模型是有向圖,其中每個節點代表設備狀態,兩個節點之間的每個邊代表觸發狀態轉換的測試輸入事件。狀態節點通常包含 GUI 信息和運行中的進程信息,事件邊緣包含測試輸入的詳細信息以及由輸入觸發的方法/日誌。

狀態轉換圖會即時的建立。DroidBot 維護當前狀態的信息,並在向設備發送測試輸入後監視狀態變化。更改設備狀態後,它將測試輸入和新狀態添加到圖形中,作為新邊和新節點。

DroidBot:Android 的輕量級 UI 指導測試輸入生成器

圖 2 狀態轉換圖樣例。注意圖中的數據被簡化方便理解。

圖形的構建過程依賴於底層狀態比較算法。當前,DroidBot 使用基於內容的比較,其中具有不同 UI 內容的兩個狀態被視為不同的節點。

C. 量化測試輸入的有效性

研究人員和測試人員在進行黑盒測試時面臨的一個問題是評估測試有效性比較困難,因為現有的測試覆蓋方法要麼需要 AUT 的源代碼,要麼需要對 AUT 進行檢測。

DroidBot 集成了兩種方法來量化測試有效性,而無需使用源代碼或工具:

•方法跟蹤。DroidBot 可使用 Android 官方配置工具打印每個測試輸入的方法軌跡。方法跟蹤包含測試輸入觸發的應用程序方法和系統方法。通過方法跟蹤,如果方法總數可用,我們還可以計算方法覆蓋率。

•敏感行為監控。對於惡意軟件分析,敏感行為的數量可以反映測試的有效性。例如,DroidBot 可以與 DroidBox 一起使用,以監視每個輸入觸發的敏感行為。

方法跟蹤機制可與幾乎所有設備和任何應用程序一起使用,因此可更好地擴展,而敏感的行為監視機制則需要能在特定沙箱中運行的應用程序。但是,在惡意軟件分析中,敏感行為的數量可能更直觀。兩種方法都無法給出測試用例到底有多有效的標準化值,但是當在同一應用程序上比較不同的測試用例時,它們可以提供有意義的統計信息。

DroidBot:Android 的輕量級 UI 指導測試輸入生成器

圖 3 比較使用 Monkey 和 DroidBot 測試惡意軟件時觸發敏感行為的有效性

IV 使用場景

A. 兼容性分析

DroidBot 的有用場景之一是兼容性測試,該測試旨在評估應用程序在不同設備上運行時的正確性和魯棒性。兼容性測試應該在許多不同的商用設備上執行,因此係統檢測是不現實的。同時,應用程序檢測也可能是不需要的,因為檢測後的應用程序的行為可能與原始應用程序不同。

使用 DroidBot,開發人員可以在沒有儀器的情況下在不同設備上測試他/她的應用程序,與 Monkey 相比,可以在更短的時間內達到更多的 UI 狀態。此外,藉助 DroidBot 提供的腳本功能,開發人員可以自定義要生成的測試輸入。

B. 惡意軟件分析

惡意軟件分析也是 DroidBot 的一種有用方案。由於許多惡意軟件在執行惡意操作之前都會對其代碼進行加密或檢查其簽名,因此可能無法對其進行檢測或保證所檢測的應用程序與原始應用程序之間的一致性。

Monkey 無需工具即可測試惡意軟件,但是 Monkey 的隨機策略可能無法有效地發現惡意行為。DroidBot 與 Monkey 一樣易於使用,但由於它使用基於模型的策略,因此在應用程序探索中效果更好。例如,如果惡意軟件在用戶單擊某些按鈕之前沒有執行惡意行為,則隨機測試輸入生成器可能難以找到正確的按鈕,而基於模型的生成器會在運行時從設備中獲取有關 AUT 的信息 ,因此更容易觸發敏感行為。

圖 3 顯示了在惡意軟件分析中使用 DroidBot 的概念證明示例與 Monkey 進行比較。我們選擇了一種將其代碼加密的惡意軟件作為被測試的應用程序,並使用 DroidBox 作為測試設備以監視敏感行為,例如文件訪問,網絡訪問,數據洩漏等。

我們使用 Monkey 和 DroidBot 分別生成測試輸入。結果表明,DroidBot 觸發的敏感行為的數量比 Monkey 高得多,而 Monkey 生成的輸入幾乎沒有觸發任何額外的敏感行為。我們檢查了 Monkey 和 DroidBot 的測試過程。 Monkey 無效的原因是,該應用要求用戶依次觸摸彈出對話框中的兩個按鈕才能進入惡意狀態。DroidBot 成功找到了按鈕並在大約 80 秒鐘內對其進行了觸摸,而 Monkey 生成的隨機測試輸入未能通過彈出對話框。

V 相關工作

長期以來,用於 Android 的測試輸入生成一直吸引著研究人員的興趣。

Monkey 是執行黑盒測試的最流行工具,也是最輕量的工具。但是,Monkey 生成的輸入是完全隨機的,這是不可擴展的,並且容易被有意繞過。 DynoDroid 也會生成隨機輸入,但是在選擇測試輸入時更智能。

AndroidRipper,SwiftHand,A3E 和 GUICC 是基於模型的自動測試生成器,同時使用不同的方法來構建模型並基於模型生成輸入。PUMA 是基於模型的測試框架,可以使用 PUMAScript 進行編程。 SmartDroid 和 Brahmastra 專注於旨在觸發某些代碼段的目標測試。

Andlantis 設計用於惡意軟件分析。它專注於大規模虛擬機管理,並且能夠同時在多個仿真器上執行惡意軟件。

DroidMate 與 DroidBot 類似,因為它還強調了魯棒性和可擴展的策略,但是它仍然需要一些工具來啟用 API 監視。

與這些工具相比,DroidBot 與 Monkey 一樣易於使用,同時提供與大多數其他工具一樣的高級功能,包括基於模型的輸入生成和可擴展腳本等。

VI 結論

此演示介紹了 DroidBot,這是 Android 應用程序的輕量級測試輸入生成器。DroidBot 能夠通過很少的環境配置在幾乎任何設備上測試 Android 應用程序。它易於使用,因為一方面它可以基於一組高級 API 和即時構建的狀態轉換模型進行擴展,另一方面,它提供了一組實用程序來評估測試的有效性。除了常規的測試任務外,DroidBot 還可以用於包括兼容性測試,惡意軟件分析和其他不需要檢測的情況。

致謝

本文由南京大學軟件學院 2020 級碩士生王旭翻譯轉述。 感謝國家重點研發計劃(2018YFB1003900)和國家自然科學基金(61832009,61932012)支持!


分享到:


相關文章: