• 沒有找到結果。

4-2 測試案例執行(Test Case Execution)

4-2 測試案例執行(Test Case Execution)

本論文研究的測試案例執行是在以網頁為基礎的測試架構下進行,我們的目標程 式為 Java 的網頁應用程式,因此需要先架設好伺服器 Tomcat 來實際執行 Java 網頁應用程式。在解出路徑限制之後,我們將得到的測試案例包裝成 Http Request 的形式以 URL 的方式在作測試案例的執行,執行的過程中會驅動我們剖面導向 程式語言 AspectJ 以插碼的方式實作的汙染資料流追蹤去追蹤測試資料的流向,

動態地判斷此測試案例是否會產生弱點並將分析結果輸出。

回顧在第三章系統架構流程圖 Figure 3.5 中測試案例執行的階段分成的兩個 元件,汙染資料流追蹤器和程式執行器,因此本章節分成兩部分對此兩個元件進 行說明:第一部分是剖面導向程式語言 AspectJ 以插碼的方式實作汙染資料流的 追蹤,其中會對目標程式進行插碼,得到插碼後的程式碼後再進行第二部分,將 插碼後的程式碼進行測試案例的執行並產生弱點分析結果。

4-2-1 汙染資料流追蹤器(AspectJ Taint Tracker)

整體來說在此階段我們利用[2]工具中 Taint Tracker Aspect 的部分對目標程式進 行插碼 ,從 Figure 4.20 可以看到汙染資料流追蹤器的步驟,重點在於 Taint Tracker Aspect 實現了資料流追蹤的概念,接著剖面導向程式語言 AspectJ 的編譯器 (AepctJ Compiler)會將 Taint Tracker Aspect 的資訊織入原本的目標程式中以達成 程式的插碼(Instrumentation)。所以重點在於 Taint Tracker Aspect 如何實現資料流 的追蹤,Taint Tracker Aspect 是運用剖面導向程式語言設計 (Aspect-Oriented Programming , AOP)的概念,剖面導向程式語言中最重要概念為 Pointcut and Advice 的機制。簡單的來說 Pointcut 是對程式切入點的描述,可以根據 Pointcut 的描述找到程式中符合此描述的程式所在點,接著 Advice 就是在找到此所在點 後實現我們想要做的事情,所以剖面導向程式語言屬於一種動態分析,利用程式 動態執行中得到的動態資訊再作進一步想要達成的目標,在此我們只概念性的描 述,細節可以再參考[2]。

Taint Tracker Aspect 中設計了 Source Pointcuts、Propagation Pointcuts、Sink Pointcuts 主要去實現[10]提出的 dflow pointcut 的概念,也就是去實現資料流追蹤。

其中 Source Pointcut 是描述程式中所有使用者輸入的來源;Sink Pointcuts 則是描 Figure 4. 22 The Architecture of AspectJ Taint Tracker

Java Web Program

Instrumented Java Web

Program

Taint Tracker Aspect AspectJ Compiler

述程式中所有可能將弱點輸出的程式接收點;而 Propagation Pointcut 則是描述中 間資料傳遞的程式所在點,其中會利用一個 Tainted Set 輔助紀錄資料是否為汙染 資料(Tainted data),將從使用者輸入的資料都視為汙染資料。

所以符合 Source Pointcuts 的資料都會加入 Tainted Set 中,中間傳遞過程符 合 Propagation Pointcuts 的話就會作汙染資料的傳遞,到最後到達程式接收點,

也就是符合 Sink Pointcuts 時,檢查要輸出的資料是否被紀錄到 Tainted Set,若是 就代表找到一個弱點。而整個 Taint Tracker Aspect 就是包含上述 Pointcuts 和 Advices,其中 Advices 就是符合 Pointcuts 情況下作的追蹤紀錄動作,其中 Taint Tracker Aspect 使用到的這些 Pointcuts 和 Advices 可以參考[附錄三],其中有展示 AspectJ 實作的程式碼。

在了解 Taint Tracker Aspect 的內容之後,最後剖面導向程式語言的編譯器根 據 Taint Tracker Aspect 對原本的目標程式進行插碼後所得到的程式碼就能夠達成 上述追蹤弱點的目標。

4-2-2 程式執行器(Program Executor)

在得到插碼過的程式碼後,接下來程式執行器會負責半自動化地使用產生的測試 案例去實際執行這些插碼過程式,程式執行器是採用網頁基礎的測試架構 (Web-based Architecture),由於我們測試用的標竿程式都 Java Servlet 的網頁應用 程式,因此我們為了方便作測試案例的執行,我們將所有的標竿程式套用 [17]securibench micro 的網頁架構以產生完整的 Java Servlet 網頁應用程式,並配 合執行 Java 網頁應用程式的伺服器 Tomcat 來執行測試案例。

所以我們要執行的測試案例是以 URL 的方式呈現的 Http Request,延續上面 函式 doGet 為範例,跨程序路徑分析結果回得到 5 條路徑限制,在經過路徑限制

http://localhost:8080/MyServletTestcases/Interprocedural_0?id=D@P0@&name=@@@@@

http://localhost:8080/MyServletTestcases/Interprocedural_0?name=@@@@@&id=_

http://localhost:8080/MyServletTestcases/Interprocedural_0?id=@@@@@@@@@@@0@@&name=_

分析工具 Kaluza 去解路徑限制後,最後得到 3 組路徑限制解,代表 3 條可執行 路徑,在我們包裝成 URL 的形式後得到最後測試案例的結果如上。

其中 URL 前面的 http://localhost:8080/MyServletTestcases/為固定的標頭,也 就是我們套用 securibench micro 產生的網頁應用程式我們稱為 MyServletTC,而 URL 後面的 Interprocedural_0?id=P4444&name=@0@@@才是產生的測試資料。

其中 Interprocedural_0 代表函式 doGet 所屬的類別,而網頁上使用者輸入的所在 為 HTML 中的表單(form),其中 id 和 name 為表單的欄位變數名稱。我們假設欄 位變數名稱已知,所以 id=P4444&name=@0@@@就是將路徑限制解對應到各自 符合的欄位變數,其中看到對應值是’_’代表此欄位變數不影響測試結果,我們 將此情況是為 don’t care,接著用這 3 組 URL 的測試案例去執行程式之後,目標 程式最後執行產生的弱點分析結果如 Table 4.1 。

從裡面我們可以知道目標程式的基本資訊,像是屬於甚麼類別名稱,程式的 入口函式名稱為何,其中 The Number of Jimple Paths 代表由跨程序路徑分析得到 的路徑限制,因為是根據 Jimple 程式碼蒐集的路徑限制,因此我們稱為 Jimple Path,在此範例為 5 條路徑限制的意思,而下面的 The Number of Executable Paths 代表路徑限制的解,就是最後產生測試案例的個數也代表程式中的可執行路徑。

Class Name: plsm.testcases.myservlet.inter.Interprocedural_0 Method Name: doGet

The Number of Jimple Paths: 5 The Number of Executable Paths: 3

Path No. Test Case Vulnerability

Path-1 id= D@P0@ name=@@@@@ Vulnerability at

Interprocedural_0.java:33 Path-2 id=don’t care name=@@@@@

Path-3

id=@@@@@@@@

@@@0@@ name=don’t care Vulnerability at Interprocedural_0.java:43

Table 4.1 Analysis Results of Test Case Execution

而另外 2 條路徑限制沒有解代表不符合程式邏輯的路徑,也就是實際執行不可能 走到的程式路徑。接著下面展示出三組可執行路徑的相關資訊,其中包括路徑限 制分析工具解出來的測試案例,以及測試後弱點資訊的展示,其中可執行路徑 Path-1 和 3 會產生弱點,而 Path-2 是我們判別出來的一種誤報情況,因為最後在 接收點輸出的 id 值為常數值,因此在此處我們改善了一個弱點誤報的情況。

第五章

Intra-procedural Description

1 Multiple branches 多個獨立 if-else statements 的情況。

2 Nested Branches 巢狀 if-else statement 的情況。

3 Non-nested constant-time loop 非巢狀迴圈且迴圈執行次數為常數值的

情況。

4 Non-nested user input variable dependent loop 非巢狀迴圈且迴圈執行次數與使用者輸 入相關的情況。

5 Nested Loop 巢狀迴圈,其中包含常數迴圈和與使用

者輸入相關的迴圈情況。

6 Combination of Branch and loop 1 : Branch with non-nested loop inside

if-else statement 裡面包含非巢狀迴圈的 情況。

7 Combination of Branch and loop 2 : Branch with nested loop inside

if-else statement 裡面包含巢狀迴圈的情 況。

8 Combination of Branch and loop 3 : Non-nested loop with branch inside

非巢狀迴圈裡面包含 if-else statement 的 情況。

9 Combination of Branch and loop 4 : Nested loop with Branch inside

巢狀迴圈裡面包含 if-else statement 的情 況。

10 Combination of Branch and loop 5 : Nested Loop with branches and break statement handling

非巢狀迴圈裡面包含 if-else statement 以 及 break statement 的處理。

11 Combination of Branch and loop 6 : Nested loop with branch and break statement inside

巢狀迴圈裡面包含 if-else statement 以及 break statement 處理的情況。

相關文件