《論文筆記》DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing
論文資訊
- 標題:DeepHunter: Hunting Deep Neural Network Defects via Coverage-Guided Fuzzing
- 作者:Xiaofei Xie, Lei Ma, Felix Juefei-Xu, Hongxu Chen, Minhui Xue, Bo Li, Yang Liu, Jianjun Zhao, Jianxiong Yin, Simon See
- 機構:Nanyang Technological University、Harbin Institute of Technology、Carnegie Mellon University、University of Illinois at Urbana–Champaign、Kyushu University、NVIDIA AI Technology Center
- 會議/期刊:None 連結:https://arxiv.org/abs/1809.01266
在傳統軟體測試領域,我們很常用一些自動化測試來產生測資並進行測試,進而找出漏洞,最後產生報告供測試人員分析。其中有一種測試方式叫做 Fuzz Testing(Fuzzing),意思就是模糊測試。這篇論文便是以同樣的概念對深度神經網路進行測試,由於作者同時也是 DeepGauge 的研究群,他們引用了自己在 DeepGauge 中提出的神經網路覆蓋率指標,在這邊論文提出了 Coverage-Guided Fuzzing,以程式碼覆蓋率為 feedback 去有效率地產生大量模糊測試的測資。這在傳統軟體測試領域是很常見的策略,像是 AFL、libFuzxer 及 VUzzer 就是 coverage based 的 Fuzzer。
基本上,一個 CGF 應該要進行有以下的 Loop:
- 從 Seed pool 裡面選擇 seed
- 利用特定修改策略(像是bitwise/bytewise flip),多次修改種子去產測資
- 用產出來的測資去跑目標程式,紀錄執行路徑
- 回報產生錯誤的種子,把那些覆蓋到不同路徑的種子存進 seed pool(提升覆蓋率的種子)
重點有兩個:修改策略、覆蓋率,前者注重是如何產生新的、有效率的種子,後者則是評斷種子優劣的標準。
這是這篇論文提出的 DeepHunter 的流程圖。
文中定義一個 atomic 輸入為一個種子,一個 batch 指的則是一堆圖片。為什麼是用 Batch Pool,是因為作者認為一次修改一定數量的種子,然後讓 DNN 一次去做辨識會比較有效率。另外,為了把有「潛力」 的種子往前推,會進行一個 Power scheduling 的動作;為了避免製作出沒有意義的種子,會在修改後進行 Sanity checking。最後進行完 Coverage Analysis 後,會做一個 Batch Prioritization 的動作讓很少被選到修改的 Batch 優先權往前提升。
3.2 轉換與修改(Transformation and Mutation)
傳統 fuzzer 像是 AFL 用的策略產出的測資,對於 DNN 來說會是沒有意義的;而在改動大小和產出有意義測資之間要取得平衡是很難。 所以作者想出了一種圖像變換的策略,稱為 metamorphic mutation strategy,意思就是說,我改動你這個種子,但產生出來的測資的 semantic(語意)必須和原來是一樣的。 對於影像進行變化的方法被分為兩種:
- Pixel Value transformation P
- 對比度
- 量度
- 模糊
- 雜訊
- Affine transformation G
- 影像翻譯
- 影像縮放
- 影像斜變
- 影像旋轉
為了避免產出無意義的測資,Affine transformation 只能做一次;Pixel Value transformation 則可以做多次,但會計算 L0 和 L∞ 來限制改變大小。
假定 I 透過 pixel value transformation 被改成 I’,那我們說在 f(I,I’) 成立時 I’ 是 有意義的。
L0 指的是 pixel 最大改變量,size(I) 則是圖片的 pixel 數量。作者假定如果改動的 pixel 很小,小於 a x size(I) 時語意不受影響。萬一超過了,那只要不要改超過 b x 255 就好了。
Algorithm 2 是修改的過程,I 是 Input 而 I’ 是 output。state 是一個 bool,用來記錄 Affine Transformation 是否被使用過了。作者表示他們想在產生有意義的測資時,盡可能最大化修改的次數,也就是 TRY_NUM。如果 state 目前是 0,就隨機挑選一種修改方式,如果是 1,那就挑 Pixel Value Transformation,參數則是隨機。
3.3 Power Scheduling
用mutation potential來計算可以修改的空間。公式是 B x 255 x size(I) - sum(abs(I-I’0)) mutation potential 越大,代表越接近種子,而且會被更優先修改。
3.4 Plugable Coverage-Guided Fuzzing
DeepHunter 用了六種不同的 coverage criteria 去看哪一個 batch 要被留著。但是如果一直收 coverage,程式會不堪負荷,為了加速,會把一些得到差不多輸出的 seed 忽略掉,不必特別保留 coverage 的值。並用了 bucket 的機制來避免 trace exploitation issue,跟傳統 fuzzing framework 很像。