KameleonFuzz:黑盒XSS檢測的進化模糊測試(半機翻有刪增)
模糊測試包括自動生成惡意輸入並將其傳送到應用程式,以便有可能觸發漏洞。 模糊測試需要這樣的問題:在哪裡模糊?模糊哪個引數?在哪裡觀察它的影響?等等
在本文中, 我們特別針對以下問題:如何模糊引數?如何觀察其影響? 為了解決這些問題,我們提出了KameleonFuzz,一個用於Web應用程式的blackbox Cross Site Scripting(XSS)fuzzer(模糊器)。
KameleonFuzz不僅可以生成利用XSS的惡意輸入,還可以檢測它揭示漏洞的接近程度。惡意輸入的產生和演變是通過一種由攻擊語法引導的遺傳演算法實現的 。雙重汙點推斷 ,直到瀏覽器解析樹能夠精確檢測利用程式碼是否成功執行。我們的評估顯示沒有誤報並且有著很好的 XSS 漏洞檢測功能:KameleonFuzz檢測到其他黑盒掃描器遺漏下來的漏洞。
介紹
現狀
在過去幾年中,XSS臭名昭著地保持其在最大漏洞中的地位。犯罪分子使用XSS在Paypal,Facebook和eBay等網站上執行惡意活動,例如垃圾郵件,惡意軟體運營商或使用者模仿。由於此類網站的複雜性和程式碼大小,XSS的自動檢測是一個非常重要的問題。在訪問原始碼的情況下, 白盒技術的範圍從靜態分析到儀表化程式碼的動態監控 。如果 二進位制或程式碼不可訪問,則黑盒方法會生成輸入並觀察響應 。此類方法獨立於用於建立應用程式的語言,並避免了線束設定。由於它們模仿外部攻擊者的行為,因此它們對於安全目的非常有用,並且可以測試諸如Web應用程式防火牆之類的防禦。用於Web應用程式的自動黑盒安全測試工具早已存在。然而,即使在2012年,這類工具的故障檢測能力也很低:最好的只能檢測到40%的 儲存型XSS,而1/3 完全沒有檢測到。這是由學習知識不精確,近似判斷和有限的攻擊值集
Web漏洞的自動黑盒檢測通常包括:第一個 “爬行”以推斷應用程式的控制流 (以下稱為巨集狀態感知),然後 “Fuzz”以生成可能表現出漏洞的惡意輸入 。與不具有巨集觀狀態意識的掃描器相比,Doup等人。 通過推斷控制流模型來增加漏洞檢測能力 。在LigRE,Duch 等人 使用汙點流量推理擴充套件此類模型 ,並引導fuzzer 更進一步提高檢測能力。
XSS是一個涉及 控制+汙點流和輸入過濾的問題。即使是基本的過濾器,許多掃描器也難以創造適當的輸入,從而產生誤報。為了解決上述問題,我們提出了KameleonFuzz,這是一種LigREextension, 它通過對最有希望的惡意輸入和汙染流進行演化和優先排序來模仿人類攻擊者 。我們在KameleonFuzz中加入了一個精確的測試結果,它依賴於現有的瀏覽器解析和雙重汙染推理。
我們的方法
KameleonFuzz是一款針對反射型和儲存型 XSS的黑盒fuzzer,可以生成完整的開發序列。如下圖所示,它包括學習應用程式模型和生成惡意輸入。我們重用了其中的元件A,B,C。本文的主要貢獻是塊D1和D2。
XSS涉及從HTTP請求Isrc上的模糊值xsrc到易受攻擊的語句Odst(HTML頁面)的汙點流。在反射型 XSS中,xsrc直接在當前輸出中出現,而在儲存型 XSS中,xsrc儲存在中間儲存庫中並在稍後反射。
步驟A,控制流程推斷學習如何在應用程式中導航。
給定介面和連線引數(例如,認證憑證),以具有例項化引數值的擴充套件有限狀態機的形式學習模型,以及兩級層次結構(節點和巨集狀態)。推斷的模型可能不完整。
步驟B,近似汙點流量推斷檢測到可能性
通過觀察在請求Isrc中傳送的值xsrc的反射到輸出Odst(HTML頁面)中的XSS。它在模型上生成步跡,並近似地推斷出汙點。 子字串匹配演算法與啟發式一起使用以避免漏報 。下圖顯示了一個對照+汙染流模型。
- 為清楚起見,我們僅表示轉換上的輸入,輸出對應於彩色節點。
- 每種顏色對應一個巨集觀狀態。輸入由HTTP方法(例如,POST),URL的一部分(例如,/?)和POST引數(例如,{‘message2’:’2_e_g_a_s_sem’})組成,形式化控制+汙點模型。
步驟C,通過應用一種稱為斬波的特殊形式的切片來修剪對照+汙染流模型。這減少了搜尋空間。
塊D.1(惡意輸入生成)和D.2(精確汙染推論)是本文的重點
通過攻擊語法引數化的遺傳演算法(GA)演變惡意輸入。攻擊語法通過約束生成下一代輸入的變異和交叉運算子來減少搜尋空間並模仿人類攻擊者的行為。
我們定義了一種有利於XSS攻擊的最合適輸入的功能。
由於伺服器過濾器可能會改變反射點Odst處的觀察值,因此單純的子串匹配可能無法準確地推斷出汙點,這可能導致漏報。 為了克服這些限制,我們進行雙重汙染推理。 我們在第3節中詳細介紹了這些子元件。
貢獻
本文的貢獻是:
- 第一個基於黑盒模型的GA驅動fuzzer,可檢測反射型和儲存型XSS;
- 模型推理和模糊測試的結合;
- 該方法的實施及其評估。
說明示例
P0wnMe是一個易受攻擊的應用程式。登入後,使用者可以儲存新筆記,檢視已儲存的筆記或登出。
P0wnMe上的KameleonFuzz執行在圖1的步驟A和B中,LigREin一個控制元件+汙點
一個簡化的extract1的模型如圖2所示。控制流由普通箭頭(過渡)和節點表示。汙點流源自在Isrc中傳送的粗體文字xsrc,以及反射在Odst中的(虛線箭頭)。例如,輸入引數msg的值egassem_ 被髮送到 7->17 的轉化中 並在輸出轉化 18->21 中被反射
圖2包含了一個在轉換7中傳送的引數message2的值2_e_g_a_s sem 33.輸出Odst的摘錄是
<input name ="message2" value ='2_e_g_a_s_sem'/>
其中我們突出顯示反射。在這裡,反射上下文位於標記屬性值內。上下文中 瞭解攻擊者如何生成fuzzer。清單1顯示了此伺服器的伺服器清理程式資訊。它阻止了簡單的攻擊
1 <?php function webapp_filter($str) { 2 if(eregi(’"|‘|>|<|;|/’,$str)) { 3 $filtered_str = "XSS attempt!"; 4 } else { 5 $filtered_str = str_replace(" ","",$str); 6 } 7 return $filtered_str; 8 } ?>
攻擊者搜尋模糊值s.t. 如果通過過濾器,然後它的反射在語境中沒有語法上的含義,即它跨越瞭解析樹中的不同層次
表1顯示了測試WebApp時由黑盒開源掃描程式w3af傳送的模糊值。W3af迭代一組模糊值。它沒有從以前的請求中學習,也沒有考慮到反射的內容。
在步驟D中,KameleonFuzz生成個體,即正常輸入序列,其中它使反射值模糊。 斬波(LigRE的步驟C)產生輸入序列。 攻擊語法產生模糊值。 對於每個人,精確地推斷出汙點。 它是測試結果的輸入(這個人是否觸發了XSS?)和適當評分(這個人觸發XSS的距離有多近?)。 最好的個體根據攻擊語法相互重組以建立下一代:例如,第1代的個體3和4產生第2代中的個體1。該過程被迭代直到測試者定義停止條件滿足( 例如,找到一個XSS)。 表2說明了這種演變。
最後一個人的輸出Odst的摘錄是
<input name ="message2" value ='WUkp'nt onload ='alert(94478)'/>
由於清單1中的清理程式刪除了空格,而不是\t,\r或\n,因此這是是一個成功的XSS漏洞,作為反射的語法連線違反了xsrc的行為。這個例子說明了進化輸入生成如何適應過濾器。在下一節中,我們將詳細介紹我們的模糊測量技術的進化特性。
進化 Fuzz
模糊測試(圖1中的步驟D)生成一群個體(GA術語)。個體是由LigREin生成的輸入序列,KameleonFuzz根據反射的攻擊語法生成模糊值xsrc引數。如演算法1中所述,該群體是通過突變和交叉運算元 w.r.t進化而來的
差異
個體是針對特定反射的輸入序列。 它包含從切片模型中提取的非惡意輸入序列,以及模糊值xsrc。
該序列包括始發過渡Isrc,以及觀察反射Odst的過渡。
攻擊語法
為了約束搜尋空間(的A* 子集,A是目標編碼的字母表),我們使用攻擊語法來生成模糊值。該語法還約束了變異和交叉運算元(演算法1的第3,14,16行)。攻擊者會嘗試嚮應用程式傳送此類模糊值。與w3af和skipfish中的有效載荷列表相比,攻擊語法可以生成更多值,並且由於其層次結構而更易於維護。
用於構建攻擊語法的知識包括HTML語法,在上下文改變的情況下的字串轉換,已知的攻擊向量。
我們嘗試瞭如何構建攻擊語法,因為它是手動編寫的,它的自動生成是一個研究方向。圖3說明了它的結構。
第一個生產規則包括表示和上下文資訊。在屬性值( <input value =“reflection”/>
)內部和標籤外部( <h1>
反射)是反射的示例行為背景。該表示由編碼,字符集和特殊字串轉換函式組成,我們將其命名為anti-lter(例如,PHP addslashes)
為了建立攻擊語法,我們假設S的可用性,一組有代表性的易受攻擊的Web應用程式(與測試的應用程式不同)和相應的XSS漏洞。對於每一個反射內容,分析師以終端和非終端的生產規則的形式寫出了XSS漏洞的概括。
如果生產規則包括OR或REPEAT操作符,她根據S的利用頻率分配選擇權重。如果沒有分配權重,則所有選擇權重相等。一旦建立,我們使用此攻擊語法對測試的應用程式進行模糊測試。
我們用擴充套件的Backus-Naur形式代表語法,重複次數有限。通過構造,攻擊語法是非迴圈的。因此,它展現了很多可能性。附錄C的清單3包含攻擊語法的摘錄。
生成模糊值包括遍歷其生產規則,並在適用的情況下執行選擇。從模糊值生成相應的字串包括連線通過深入探索上下文子樹獲得的字串,在給定的字符集中表示此字串,應用防過濾器函式,以及應用編碼函式。例如,由圖4的模糊值產生的字串是WUkp’nt onload =’alert(94478),在UTF-8字符集中,身份函式作為反字元應用,並且沒有最終編碼改變(節點平原)
精確汙染流量推斷(D.2)
精確的汙點流量推斷允許獲得關於反射背景的資訊,這稍後用於計算精確的測試判定,並且是適合函式的輸入
用於產生汙點感知的解析樹Tdst如圖5所示。
首先,在模糊值xsrc和反射它的輸出Odst之間應用字串到串的汙點推理演算法(例如,用Levenshtein編輯距離)。 並行地,解析器(例如,來自谷歌瀏覽器)評估應用程式輸出Odst併產生解析樹Pdst(例如,文件物件模型(DOM))。 然後在xsrc和Pdst的每個節點之間推斷出汙點以產生Tdst,一個汙染感知的解析樹(見圖6),如下所示。
對於輸出解析樹Pdst的每個節點,我們計算每個受汙染的子串與節點文字值之間的字串距離。然後我們只保持最低的距離得分。
如果此分數低於測試人員定義的閾值,則此節點將標記為受汙染。在鄰居節點群具有接近閾值的距離\的情況下,這種汙點條件可以略微放鬆。推斷的汙點感知解析樹Tdst是用於適合函式和測試判定的輸入。
重要的是要注意,我們依賴於真實的解析器,而不是編寫我們自己的解析器。這有兩個好處。首先,我們是
關於解析器是靈活的(例如,對於XSS:Chrome,Firefox,IE;對於其他漏洞,例如SQL注入,我們可以依賴於SQL解析器)。其次,我們確定檢測到的漏洞的實際適用性。
測試結論
測試判決回答了問題,這是否觸發了XSS漏洞?。汙點感知解析樹Tdst(圖6)與一組汙點感知樹模式匹配(例如,圖7)。如果至少 一個模式匹配,然後是XSS漏洞利用(即,測試判定將輸出yes,檢測到漏洞)。
汙點樹模式是在其節點上包含正則表示式的樹。這些正則表示式可能包含字串(例如,指令碼),汙點標記,重複運算子(+,*)或匹配所有字元(。)。 測試人員可以提供自己的模式。
我們在KameleonFuzz中加入了XSS漏洞的預設模式。 這些都違反了汙點價值的句法連線。圖7中所示的第二個模式與圖6中表示的解析樹相匹配。
適應性
適應度函式評估單項發現XSS漏洞的“接近程度”。值越高,GA進化過程就更有可能選擇這個個體的基因來創造下一代。 函式的輸入是個體I,具體輸出Odst,其中反映了在轉換Isrc中傳送的模糊值xsrc,Tdst = taint(parse(Odst); xsrc)taintaware解析樹,以及應用模型M.在成功的XSS攻擊的情況下,完整性維度與我們在模糊值和反射之間觀察到的屬性有關。這些尺寸列於表3中,我們繪製了當前使用的適應性函式的草圖。
這些維度模擬了人類滲透測試員可能具有的幾種直覺。最重要的是:
1.成功注入的特徵類的百分比。
組成單個模糊值樹的葉子的字元(參見圖4)根據它們在語法中的含義被分類為類。該度量表示所考慮的反射的“注入功率”。
2.解析樹中受汙染節點的數量。
儘管注入幾個字元類很重要,但攻擊者對多個解析樹節點施加控制並不是一個充分條件。 成功的XSS注入通常以至少兩個鄰居被汙染的節點為特徵(一個被認為是連線反射,另一個包含有效載荷和一個有效載荷的觸發器)。 因此,如果攻擊者能夠反映幾個節點,我們預計它會增加利用潛在漏洞的機會。
3.個人的奇點w.r.t.它的當代。 ???
遺傳演算法的一個問題是過度專業化會限制探索的空間並不斷髮現相同的缺陷。 為了避免這個陷阱,我們計算一個人與當代人的“how singular”。該維度使用源轉換Isrc,模糊值xsrc和反射上下文(即,目標轉換Odst和解析樹Tdst中的受汙染節點)
4.Isrc與其Reflection Odst之間的轉換次數
源轉換Isrc與其Reflection Odst之間的轉換次數越高,檢測該漏洞的難度就越大,因為它會擴充套件搜尋樹。
5.發現新頁面或巨集狀態:
增加應用程式覆蓋率。
6.變異和交叉運算子
概率分佈決定個體是否會發生變異。當發生突變時,可以在模糊值或輸入序列上應用運算子。模糊值變異操作符在模糊值xsrc的生成樹上工作(參見圖4)。我們實現了幾種策略來選擇要變異的節點以及如何變異(例如,均勻分佈,最近最少使用,……)。
突變的幅度是適應性得分的遞減函式:如果個體具有高適應性得分,則突變將針對生產樹中接近葉子的節點 類似地,在低適應性得分的情況下,操作員更可能改變靠近根的節點。應用於圖4的模糊值變異的一個例子在於對HANDLER非終端執行不同的選擇(例如,onmousover而不是onload)。輸入序列變異運算元在整個序列I上工作。它包括從源Isrcto到目標Odst的模型中的另一條路徑,或者針對不同的反射交叉運算子在模糊值級別工作,即在生產樹上工作。它的輸入是兩個高分數的人。它產生兩個孩子。
實施
KameleonFuzz是一個針對反射型和儲存型XSS的python3程式。它由4500行程式碼組成。如圖8所示,我們使用Selenium庫對Google Chrome 進行測試。我們使用LigRE,一個控制元件+汙點流模型推理工具和切片器。
討論
方法限制
重置:
我們假設能夠在初始狀態下重置應用程式,這可能並不總是實用的(例如,在測試使用者連線的實時應用程式時;我們會處理副本)或者可能需要時間。然而,這並沒有打破黑盒線束的假設:我們不需要知道如何儲存巨集狀態(例如,資料庫)。
生成攻擊語法:
生成攻擊語法:編寫攻擊語法需要了解之前中提到的引數。 這項工作還是手動的。該語法生成的語言大小與故障檢測能力之間的權衡還有待研究。
過於狹窄的生成語言(例如,很少產生針對給定上下文的模糊值或非常少的上下文)可能限制故障檢測能力,而過於重要的語言可能具有有限的效率。此外,攻擊語法與目標註入子系列(例如,XSS,SQL注入等)相關聯,因此對人類輸入的需求是當前限制。 在自動化這一代過程中有研究的空間。
XSS模型假設:
我們假設XSS只是一個模糊值的結果。我們目前的方法可能在XSS上有誤報,涉及一次至少兩個模糊值的模糊測試。據我們所知,沒有掃描器可以處理這種情況。
使用LigRE的限制:
如果客戶端不解釋JavaScript時,KameleonFuzz支援Ajax應用程式,則它們具有相似的功能。 LigREreRequires在應用程式中識別非確定性值。
編碼:
汙點的精確度和效率 推斷取決於所考慮的編碼轉換。實現了Plain,url和base64編碼。LigRE和KameleonFuzz可以擴充套件到支援更多。
相關工作
黑盒方法中的XSS測試判定
基於連線的方法:
假設惡意輸入在給定級別(詞法或語法)中破壞結構。正如Sekar的工作,我們依賴於非語法連線,我們使用既有語法又有汙點的檢測策略。一個關鍵的區別是Sekar編寫了自己的解析器來傳播汙點,而我們使用瀏覽器的解析器(例如Google Chrome)。因此我們兩次推斷汙染(見圖5)。通過這樣做,我們確信已發現的XSS攻擊的實際適用性,並且我們的實現是明智的w.r.t.瀏覽器。依賴於非詞彙連線作為一種充分的故障檢測措施,它更有效,但需要正確形成的輸出(這在HTML網頁上並不總是有效的假設)和很容易出現漏報。
基於正則表示式的方法:
假設模糊值在應用程式輸出中“as such ”反映,即,過濾器是身份功能。在過濾器的情況下,這可能導致誤報。而且,大多數人不考慮反射背景,這可能導致誤報。 IE8 和NoScript 依賴於模糊值的正則表示式。 XSSAuditor(Chrome XSS lter)與JavaScript DOM節點執行精確的字串匹配。
基於字串距離的方法:
Sun 通過計算DOM節點與瀏覽器在執行時執行的請求之間的字串距離來檢測自我複製的XSS蠕蟲。 IE8和Chrome XSSAuditor只能使用反射型XSS。 NoScript能夠阻止某些儲存型XSS,但只能作為Firefox外掛使用。
學習和安全測試
在其基本形式中,模糊測試是一種無向的黑盒主動測試技術。 主要針對記憶體損壞漏洞。 Stocketal。最近的工作模糊並檢測白盒線束中的Type-0 XSS Heiderich等。檢測由瀏覽器解析器怪癖引起的基於黑盒突變的XSS 。 LigRE + KameleonFuzz是一款黑盒式模糊遊戲,針對反射和儲存型XSS。
用於黑盒安全測試的GA
已用於演變惡意軟體和攻擊者指令碼。KameleonFuzz是GA對黑盒XSS搜尋問題的第一個應用。它的適應性維度模擬了人類安全滲透測試人員的直覺。
攻擊語法:
為XSS生成模糊值作為標記的組合在他們最近的工作中,Tripp等人。修剪基於測試歷史的語法,以有效地確定反射的有效XSS攻擊向量。將KameleonFuzz與他們的方法進行比較並將兩者結合起來會很有趣。王等人。使用隱馬爾可夫模型從XSS向量構建語法。
安全測試的模型推斷:
Radamsa針對記憶體損壞漏洞:它從已知輸入推斷出語法,然後用模糊來建立新輸入。舒等人從網路跟蹤中被動推斷模型,並主動模糊輸入推斷出觸發失敗的特定輸入部分的可能性。對於命令注入漏洞(XSS,SQL注入,…),Dessiatniko等。根據SQL注入的特製距離進行叢集頁面。
Sotirov在XSS過濾器的逆向工程,區域性模糊測試和遠端模糊測試之間進行迭代。Doup等人。表明推斷巨集觀狀態感知控制流模型增加了漏洞檢測能力。有了LigRE,Duchene等人。研究表明,增強這種具有汙染流的模型可以進一步提高其能力。 KameleonFuzz擴充套件了LigRE,是一種黑盒完全主動的測試方法。它使用攻擊語法和控制+汙點流模型生成並演化獲得的反射上的模糊輸入。
結論和未來的工作
在本文中,我們介紹了KameleonFuzz,這是第一款針對反射型和儲存型XSS的黑盒GA驅動模糊器。與之前的工作相比,我們精確的雙重汙染推理可以重複使用真實世界的解析器,我們的演化符合測試人員定義的攻擊語法,而適應性函式通過關注最有希望的潛在漏洞來推動這一過程。我們的方法在檢測XSS方面具有實際用途,並且優於最先進的開源黑盒掃描器。它發現了以前未知的XSS。
我們認為以下方向對未來的工作很有意義:
如何自動建立攻擊語法?
如何結合我們的方法和來提高XSS檢測的效率?
如何使用模糊測試期間收集的其他知識來改進推斷模型?
如何將這種模型推理和模糊測試的組合應用於其他類別的漏洞?
個人總結
這篇文章由於專業術語較多,工具流程比較複雜,故給我我機器翻譯和人工校驗帶來了巨大的困難,我暫時也無法一下子理解其中的思想,文章中的很多不是很通順的機器翻譯我也不知道該怎麼修改成正常的表述,但是因為這篇文章技術還是比較新,所以暫時先放在我的部落格裡,如果讀者覺得有興趣可以對其進行更好的翻譯,如果沒有興趣的話,就等我日後對一些概念理解更深了以後再來重新翻譯這篇文章