基於 JavaScript 進行符號執行測試

基於 JavaScript 進行符號執行測試

摘要

我們描述了一個名為 Jalangi 的工具框架,用於 JavaScript 程序的動態分析和符號執行測試。該框架是用 JavaScript 編寫的,允許對 JavaScript 進行各種重載動態分析。Jalangi 包含兩個關鍵技術:1)選擇性錄製回放,這是一種能夠錄製並準確地回放用戶選擇的程序部分的技術;2)陰影值和陰影執行,可以輕鬆實現重量級動態分析,例如,condicolic 測試和汙點跟蹤。Jalangi 通過對源代碼注入進行檢測,這使得它可以實現跨平臺移植。根據 Apache 2.0 許可,可以從https://github.com/SRA-SiliconValley/jalangi獲得Jalangi。我們在SunSpider基準套件和五個Web應用程序上對Jalangi的評估表明,Jalangi在錄製過程中的平均速度降低了26倍,在重放和分析過程中的速度平均降低了30倍。與類似工具(如PIN和針對x86二進制文件的Valgrind)報告的類似情況相比,速度的降低是可比的。

關鍵詞

JavaScript;動態分析;符號執行測試

一 導言

JavaScript 是編寫客戶端 web 應用程序的首選語言,並且在編寫移動應用程序(例如用於 Tizen OS 和 iOS)、桌面應用程序(如 Windows 8 和 Gnome 桌面應用程序)和服務器端應用程序(如 node.js)時越來越流行。但是,針對 JavaScript 應用程序的分析、測試和調試的工具較少。我們已經開發了一個簡單而強大的框架,稱為 Jalangi,用於為 JavaScript 編寫重載動態分析。本文簡要介紹了該框架及其使用場景。該框架提供了一些有用的抽象和 API,大大簡化了 JavaScript 動態分析的實現。關於 Jalangi 背後的技術的詳細描述可以在[6]中找到。

Jalangi 可以在任何瀏覽器或 node.js 上工作。我們通過選擇性的源代碼檢測來實現瀏覽器的獨立性。即使某些源文件沒有檢測,Jalangi 也可以運行。對 Jalangi 的分析分兩個階段進行。在第一階段中,在用戶選擇的平臺(如 Android 上運行的 mobile chrome)上執行並錄製一個插入指令的 JavaScript 應用程序。在第二階段中,錄製的數據用於在桌面環境中執行用戶指定的動態分析。

Jalangi 允許通過支持陰影值和陰影執行輕鬆實現動態分析。陰影值使我們能夠將陰影值與程序中使用的任何值相關聯。在 Jalangi 中,我們使用陰影值和執行實現了幾個動態分析:1)共同語言測試,2)純符號執行,3)跟蹤 null 和 undefined 的來源,4)檢測可能的類型不一致,5)簡單的對象分配分析器,6)簡單的動態汙染分析。

二 技術細節

我們提供了 Jalangi 的技術細節概要。有關更詳細的技術討論,請參閱[6]。用戶標識由 Jalangi 檢測的 web 應用程序的一個子集,以便錄製和回放。在錄製階段,將在用戶選擇的平臺上執行生成的檢測代碼。即使使用了用戶代碼的子集,整個應用程序也會在錄製階段執行,包括已插入和未插入 JavaScript 代碼以及本機代碼。但是,在回放階段,Jalangi 僅回放已檢測的代碼。Jalangi 具有在用戶平臺上完整執行 JavaScript 應用程序的功能,使錄製的執行可以在開發筆記本電腦/臺式機 JavaScript 引擎上進行調試,以進行調試,包括移動瀏覽器和基於 node.js 的系統,或具有嵌入式 JavaScript 引擎的集成開發系統。這種方法還支持使用支持陰影執行的底層陰影值實現動態分析。

通過錄制執行期間從內存加載的每個值,並在回放期間在相關內存加載期間重新使用它們,可以有效地提供錄製和回放。這種方法雖然聽起來不錯,但也存在一些挑戰,例如:(1)如何有效地錄製函數和對象?(2) 如何在未檢測本機函數(例如,JavaScript 事件 dispather)調用檢測函數時提供回放?通過提供間接記錄(其中唯一的數字標識符與每個對象和功能相關聯)以及記錄這些標識符的值來解決第一個問題。第二個問題通過顯式錄製和調用已檢測功能來解決,這些功能又從未插入代碼中調用,或者由於 JavaScript 事件處理程序調度而執行。

此外,我們還觀察到,回放期間的內存負載值可以通過執行檢測代碼來計算,而無需錄製所有內存負載的值。通過僅記錄必要的內存負載,這用於提高 Jalangi 的效率。為了確定是否必須記錄內存負載的值,Jalangi 在記錄階段跟蹤影子內存,該影子內存將在執行實際代碼時隨實際內存一起更新。 執行本機和未執行的代碼不會對影子內存進行更新。為了確保在重放階段可以使用正確的值,只有在記錄階段在內存位置存儲的值存在差異時(例如,如果在內存位置的值之間存在差異),Jalangi 才會存儲內存負載的值。 實際加載的內存及其關聯值存儲在影子內存中)。

在 Jalangi 中,在回放階段執行中使用的任何值都可以替換為帶註釋的值,該值可以為實際使用的值提供附加信息。例如,支持汙染分析所需的額外汙染信息,或者可能是與符號執行中的實際值相關的信息,這些信息可以以符號表達式的形式提供。Jalangi 使用 concolvalue 類型的對象來表示帶註釋的值。

三 動態分析

在 Jalangi,我們進行了以下動態分析:

  • 符號執行測試:符號執行測試沿著具體的執行路徑執行符號執行,生成表示輸入值約束的邏輯公式,並求解約束以生成新的測試輸入,這些新的測試輸入將沿著以前未探索的路徑執行程序。Jalangi 中的符號執行測試支持對整數,字符串和對象類型的約束以及新穎的類型約束。我們引入類型約束來處理 JavaScript 的動態特性,對於程序的不同可行執行路徑,輸入變量的類型可以不同。
  • 純符號執行:純符號執行象徵性地執行程序,從不為了回溯而重新啟動程序。它在執行分支語句之前檢查狀態,執行一個分支,然後使用檢查點狀態回溯以探索另一個分支。對於小程序,純符號執行避免了由於重複重新啟動而造成的時間浪費。
  • 跟蹤空值和未定義值的來源:此分析錄製空值和未定義值來源的源代碼位置,並在由於空值或未定義值而發生錯誤時報告位置。每當由於這些文本(例如訪問空值的字段)而出現錯誤時,就會向用戶報告文本的陰影值。這樣的報告有助於程序員輕鬆識別空值的來源。
  • 檢測可能的類型不一致:動態分析檢查在給定程序位置創建的對象是否可以採用多個不一致的類型。它計算在程序中的每個定義位置創建的對象和函數值的類型。如果在程序位置定義的對象或函數值在執行期間被觀察到具有多個類型,則分析報告程序位置和觀察到的類型。有時,這種類型的不一致可能會指向程序中的潛在錯誤。我們已經在兩個 SunSpider 基準測試程序中注意到了這樣的問題。
  • 簡單對象分配探查器:此動態分析錄製在給定分配站點創建的對象數量以及訪問對象的頻率。它報告在給定分配站點創建的對象是隻讀的還是常量。它還報告對象創建時間和對象的最新訪問時間之間的最大和平均差異。如果分配站點創建的常量對象太多,則可能導致內存效率低下。我們在基準測試套件中的一個 web 應用程序中發現了這樣一個問題。
  • 動態汙染分析:動態汙染分析是一種信息流分析形式,它檢查信息是否可以從一組特定的內存位置(稱為源)流向另一組內存位置(稱為匯)。我們在 Jalangi 中實現了一種簡單的動態汙染分析形式。在分析中,我們將任何對象的任何字段的讀取(以前未由檢測源編寫)視為汙染源。我們將任何可能改變程序控制流的內存位置的讀取都視為接收器。我們附加汙染信息與實際值的陰影值。

四 實施

Jalangi 可在https://github.com/SRA SiliconValley/Jalangi 上獲得。我們已經用 JavaScript 實現了 Jalangi。

Jalangi 通過檢測 JavaScript 代碼進行操作。表 3 顯示了在表 1 中插入代碼後獲得的代碼。在檢測期間,Jalangi 從 Jalangi 庫插入各種回調函數。回調函數列在表 2 中。這些函數在 JavaScript 中包裝了各種操作。Jalangi 的選擇性錄製重放引擎是通過定義這些回調函數來實現的。

Jalangi 將工具庫公開為函數工具代碼。這也使我們能夠動態地測試在運行時創建和計算的任何代碼。例如,我們將對 eval(s)的任何調用修改為 eval(instrumentCode(s))。

基於 JavaScript 進行符號執行測試

基於 JavaScript 進行符號執行測試

基於 JavaScript 進行符號執行測試

五 Jalangi 的表現

我們在 JavaScript-SunSpider(http://www.webkit.org/perf/SunSpider/SunSpider.html)基準套件中的26個程序和使用HTML5/JavaScript為Tizen操作系統編寫的5個web應用程序上運行了Jalangi的錄製回放。(https://developer.tizen.org/下載/示例web應用程序)。表4顯示了與錄製階段和三個動態分析相關的開銷:無分析(用null表示)、跟蹤空和未定義的來源(用track表示)和汙染分析(用taint表示)。我們還報告為每個基準程序錄制的值的數量。實驗是在配備2.3 GHz Intel Core i7 和 8 GB RAM 的筆記本電腦上進行的,並在 Chrome 25 上運行了網絡應用,並在 node.js 0.8.14 上執行了重放。

我們沒有衡量 web 應用程序的增長速度,因為它們大多是交互式應用程序。對於 SunSpider 基準套件,在記錄階段,我們觀察到平均速度降低了 26 倍,最低為 1.5 倍,最高為 93 倍。 在重播階段進行空分析時,我們觀察到平均速度降低了 30 倍,最小值為 1.5 倍,最大值為 93 倍。 跟蹤分析顯示,平均速度降低了 32.75 倍,最小值為 1.5 倍,最大值為 96 倍。

5.1 JALANGI 動態分析檢測到的問題

Jalangi 可能的類型不一致檢查器發現,SunSpider 基準測試套件的 3d-cube.js 中的 CreateP 函數主要用作構造函數,但在某個位置它被稱為函數。作為函數調用的結果,程序在全局對象中創建一個不必要的 V 字段。我們認為此調用可能是編程錯誤。

Jalangi 的對象分配分析器注意到附件遊戲 webapp 中的 getValue(place,_board)方法創建了一個常量對象數千次。我們相信,通過在方法之外提升常數對象,可以避免這種不必要的常數對象的創建。

六 相關工作

據我們所知,Jalangi 是第一個 JavaScript 動態分析框架。很少有工具可以執行 JavaScript 程序的錄製回放。JSBench 使用錄製回放機制創建 JavaScript 基準。Mugshot 捕獲所有事件,以確定地重放 web 應用程序的執行。Ripley 在服務器端副本上覆制客戶端 JavaScript 程序的執行。

七 結論

Jalangi 已經處理了 JavaScript 的各種具有挑戰性的細節。由於可以處理 JavaScript 的所有令人擔憂的問題,因此可以輕鬆地在 Jalangi 框架中實施動態分析。我們期望 Jalangi 將有助於未來 JavaScript 動態分析的研究。

致謝

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


分享到:


相關文章: