吴忠躺衫网络科技有限公司

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領取20積分哦,立即完善>

3天內不再提示

使用doop識別最近commons text漏洞的污點信息流

OSC開源社區(qū) ? 來源:vivo互聯(lián)網(wǎng)技術 ? 2023-06-21 18:11 ? 次閱讀

一、doop靜態(tài)分析框架簡介

1. doop靜態(tài)分析框架簡介

doop靜態(tài)分析框架由希臘雅典大學plast-lab Yannis Smaragdakis團隊設計開發(fā),目前看是一款開源領域的比較先進的程序靜態(tài)分析框架,一些程序靜態(tài)分析論文的理論也有通過doop的規(guī)則實現(xiàn)后實驗。

doop整體架構簡單明了,符合通常靜態(tài)代碼漏洞掃描工具掃描器內核的設計思路。架構上由groovy寫的調用程序“粘合”在一起,通過調用fact-generator和datalog分析器,得出自動化的分析結果。

下面是筆者畫的doop整體架構圖,包含doop中一些關鍵的組件模塊:

d87c1188-101b-11ee-962d-dac502259ad0.png

2. doop工作流程

doop的fact generator模塊會對輸入進行解析(例如jar包的解析或者類的resolve從而加載進必要的類信息到內存中)

調用soot、wala等工具生成jimple IR,在此基礎上生成后續(xù)分析引擎需要的facts文件。而后doop使用LogicBlox(目前doop已不維護)或者Soufflé(開源的datalog分析引擎)

基于facts文件和既定的datalog分析規(guī)則文件進行分析,得到最終的程序分析結果。

doop支持對java源碼及字節(jié)碼的分析,不過源碼的jdk版本受限,建議直接使用字節(jié)碼進行分析。

doop核心是其實現(xiàn)的一套datalog分析規(guī)則,其中包含了由粗糙到精細的context-insensitive、1-call-site-sensitive、1-call-site-sensitive+heap的豐富的靜態(tài)程序分析策略等等等,同時通過在addons中添加了額外的對信息流分析、對spring等生態(tài)框架、對java反射特性的支持,十分強大。

以上是對doop的架構和功能的簡單介紹,jar包信息的解析、規(guī)則的預處理、編譯執(zhí)行和解釋執(zhí)行、程序的并發(fā)設計或者由于大量sootclass加載造成的內存溢出問題等一些細節(jié)由于篇幅限制不在此介紹。

二、commons text rce漏洞簡介

先對該漏洞進行簡單介紹。

Apache Commons Text是一款處理字符串和文本塊的開源項目,之前被披露存在CVE-2022-42889遠程代碼執(zhí)行漏洞,這個漏洞目前網(wǎng)上的分析文章比較多,在此不做復述。該漏洞原理上有點類似log4j2,當然影響不可相比,其代碼中存在可以造成代碼執(zhí)行的插值器,例如ScriptStringLookup(當然這里提到這個插值器是因為我們目標就是分析這一條sink污點流),同時沒有對輸入字符串的安全性進行驗證導致問題。

d8a8f2fc-101b-11ee-962d-dac502259ad0.png

借用網(wǎng)上公開的poc觸發(fā)ScriptStringLookup中的代碼執(zhí)行,使用commons text 1.9版本 :

d8e7e53e-101b-11ee-962d-dac502259ad0.png

完整的漏洞調用棧如下:

d900653c-101b-11ee-962d-dac502259ad0.png

從調用棧可以看出,通過調用commons text的字符串替換函數(shù),可以調用到ScriptStringLookup類的lookup方法,從而調用scriptEngine.eval執(zhí)行代碼。可以看出該條漏洞鏈路較淺,但鏈路關鍵節(jié)點也涉及了接口抽象類的cast、輸入字符串的詞法分析狀態(tài)機以及各種字符串的處理函數(shù),作為實驗對象非常合適。

三、commons text rce污點信息流的doop識別規(guī)則

我們選取上述二中commons text中

org.apache.commons.text.StringSubstitutor replace函數(shù)作為source,ScriptEngine eval函數(shù)作為sink。

doop設置app only模式去進行分析,doop在app only模式下會將!ApplicationMethod(?signature)加入isOpaqueMethod(?signature),這樣一些分析不會進入jdk的類中,可以大大提高doop的分析效率。依據(jù)萊斯定理,靜態(tài)程序分析難以達到完全的完備(truth或者perfect),也是盡可能優(yōu)化sound。類似在企業(yè)級的SAST部署使用也是如此,也需要在掃描精度、掃描速度以及實際可用性中進行取舍或者平衡,所以doop的app only模式下在個人看來更接近實際嵌入到devsecops中的輕量級靜態(tài)代碼漏洞掃描的應用。

3.1 doop的datalog分析規(guī)則簡單介紹

由于涉及doop app only規(guī)則的改造,首先先簡單介紹doop使用的datalog規(guī)則。

doop目前維護使用開源的Soufflé分析datalog規(guī)則。datalog是聲明式的編程語言,也是prolog語言的非圖靈完備子集,所以本質上也是建立在形式邏輯中的一階邏輯上。所以基礎概念也是命題推導,在Soufflé的形式上就是表現(xiàn)為關系(relation)。

如下例子:

d92889ea-101b-11ee-962d-dac502259ad0.png

很明顯可以看出該例子通過datalog定義的關系邏輯實現(xiàn)相等關系的自反性、對稱性和傳遞性,首先定義了equivalence關系,該關系可以由rel1和rel2關系蘊涵得到,而equivalence的a需要滿足關系rel1,b需要滿足關系rel2。具體語法和高階特性可以通過souffle-lang.github.io網(wǎng)站進行了解。

3.2 doop配置使用簡單介紹

doop可以通過gradle去編譯使用,需要提前在類unix系統(tǒng)中借助cmake編譯安裝Soufflé,doop的具體安裝使用可以在https://github.com/plast-lab/doop-mirror中了解。

對doop的命令行使用進行簡單,分析,有幾個關鍵的命令參數(shù),-i參數(shù)接受需要分析的文件(例如jar包),-a參數(shù)配置分析策略(例如是選擇context sensitive還是context insensitive),--app-only參數(shù)配置開啟doop的app only模式,--information-flow開啟doop的信息流分析模式(可以用來做污點分析),--platform設置分析需要的jdk平臺,--fact-gen-cores配置生成facts的并發(fā)性。

本文使用的doop命令參數(shù):

-a context-insensitive --app-only --information-flow spring --fact-gen-cores 4 -i docs/commons-text.jar --platform java_8 --stats none

3.3 重新編譯打包commons text

這是我最初使用doop分析commos text的方法,主要為了盡可能減輕的對原生規(guī)則的侵入。doop在使用jackee進行分析事,分析入口的確定及一些mockobject的構建都需要依賴于對springmvc注解的識別。

下載commons text的源碼,自定義兩條class和method注解TestctxTaintedClassAnnotation、TestctxTaintedParamAnnotation:

d97b9914-101b-11ee-962d-dac502259ad0.png

注解實現(xiàn)為一個空注解,主要是為了標注一下我們的source,將注解打到對應的class類和方法:

d99897da-101b-11ee-962d-dac502259ad0.png

重新編譯打包為jar包,得到2中命令參數(shù)-i的commons-text.jar。

3.4 改造doop app only下的規(guī)則

doop的污點信息流識別依賴于指針分析結果,同時也依賴污點轉移函數(shù)。doop中已經(jīng)預置了多條污點轉移函數(shù),其中包含了字符串、鏈表、迭代器等基礎類方法。

ParamToBaseTaintTransferMethod(0, "").
ParamToBaseTaintTransferMethod(0, "").
ParamToBaseTaintTransferMethod(0, "").
ParamToBaseTaintTransferMethod(0, "").
ParamToBaseTaintTransferMethod(0, "").
ParamToBaseTaintTransferMethod(0, "").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").
BaseToRetTaintTransferMethod("").

然而其中沒有包含String split函數(shù)的污點轉移規(guī)則,需要添加上:

BaseToRetTaintTransferMethod("").

如上述,doop自有的jackee規(guī)則肯定沒有包含我們自定義的注解,所以需要在EntryPointClass、Mockobj等關系定義中添加對我們自定義的class污點注解的識別。

EntryPointClass(?type) :-
   //...
   Type_Annotation(?type, "org.apache.commons.text.TestctxTaintedClassAnnotation");
 
//...
MockObject(?mockObj, ?type) :-
  //...
   Type_Annotation(?type, "org.apache.commons.text.TestctxTaintedClassAnnotation");

同時也需要添加param污點的注解。doop需要通過這些注解識別分析入口方法,構建污點mockobj,建立初始的指向關系等。

//...
mainAnalysis.VarPointsTo(?hctx, cat(cat(cat(cat(?to, "::: "), ?type), "::: "), "ASSIGN"), ?ctx, ?to) :-
  FormalParam(?idx, ?meth, ?to),
  (Param_Annotation(?meth, ?idx, "org.springframework.web.bind.annotation.RequestParam");
  Param_Annotation(?meth, ?idx, "org.springframework.web.bind.annotation.RequestBody");
  Param_Annotation(?meth, ?idx, "org.apache.commons.text.TestctxTaintedParamAnnotation");

為了確保方法的可達性,我們還添加了

ImplicitReachable("") :- isMethod("").但后續(xù)看不一定有必要,僅供參考。

通過注解我們在規(guī)則中定義了source,接下來需要定義sink,我們將ScriptEngine的eval方法定義為sink:

LeakingSinkMethodArg("default",0,method):-isMethod(method),match("",method).

正如前述,由于是在app only下,doop下通過OpaqueMethod關系過濾了jdk類的識別,這樣會導致相應的上述預置的污點轉移函數(shù)無法完成污點轉移,所以需要另外定制規(guī)則流去將轉移函數(shù)包含進數(shù)據(jù)流分析過程。

于是需要定義

OptTaintedtransMethodInvocationBase關系。

.decl OptTaintedtransMethodInvocationBase(?invocation:MethodInvocation,?method:Method,?ctx:configuration.Context,?base:Var)
OptTaintedtransMethodInvocationBase(?invocation,?tomethod,?ctx,?base) :-
  ReachableContext(?ctx, ?inmethod),
//Reachable(?inmethod),
  Instruction_Method(?invocation, ?inmethod),
  (
  _VirtualMethodInvocation(?invocation, _, ?tomethod, ?base, _);
  _SpecialMethodInvocation(?invocation, _, ?tomethod, ?base, _)
  ).

在此基礎上,為了完成新的污點轉移,doop需要根據(jù)以下自定義規(guī)則分析出返回值的類型信息。

.decl MaytaintedInvocationInfo(?invocation:MethodInvocation,?type:Type,?ret:Var)
MaytaintedInvocationInfo(?invocation, ?type, ?ret) :-
  Method_ReturnType(?method, ?type),
  MethodInvocation_Method(?invocation, ?method),
  AssignReturnValue(?invocation, ?ret).
 
.decl MaytaintedTypeForReturnValue(?type:Type, ?ret:Var, ?invocation:MethodInvocation)
MaytaintedTypeForReturnValue(?type, ?ret, ?invocation) :-
  MaytaintedInvocationInfo(?invocation, ?type, ?ret),
  !VarIsCast(?ret).

基于以上的污點轉移過程分析規(guī)則,應用到污點變量的轉移分析規(guī)則中。

VarIsTaintedFromVar(?type, ?ctx, ?ret, ?ctx, ?base) :-
  //mainAnalysis.OptTaintedtransMethodInvocationBase(?invocation,?method,?base),
  mainAnalysis.OptTaintedtransMethodInvocationBase(?invocation,?method,?ctx,?base),
  MaytaintedTypeForReturnValue(?type, ?ret, ?invocation),
  BaseToRetTaintTransferMethod(?method).
  //mainAnalysis.VarPointsTo(_, _, ?ctx, ?base).

同時也需要重新定義LeakingSinkVariable關系,因為我們這里自定義的sink方法也是Opaque方法,這樣才能識別到我們的ScriptEngine 的eval方法。

LeakingSinkVariable(?label, ?invocation, ?ctx, ?var) :-
  LeakingSinkMethodArg(?label, ?index, ?tomethod),
  mainAnalysis.OptTaintedtransMethodInvocationBase(?invocation,?tomethod,?ctx,?base),
  //mainAnalysis.VarPointsTo(_, _, ?ctx, ?base),//here problem
  ActualParam(?index, ?invocation, ?var).

從上面規(guī)則的定義可以看出,改造的流程還是比較清晰的,并且通過關系的名字,這些關系的含義和用途也很容易理解。添加這些自定義規(guī)則到我們的doop分析中運行,在結果中可以看出,doop完成了對commons text的污點信息流的識別。

在結果集中的LeakingTaintedInformation.csv文件中可以找到我們需要捕捉到的souce-sink流。

defaultdefault<>/javax.script.ScriptEngine.eval/0/@parameter0

LeakingTaintedInformation.csv給出了污點信息。包括污點的標簽(這里是默認的default,可以自定義),sink方法的調用信息,該sink方法對應的污點源頭souce信息。

如上圖可以看出,

org.apache.commons.text.lookup.ScriptStringLookup:

java.lang.String lookup(java.lang.String)中調用到

javax.script.ScriptEngine.eval,并且污點的源頭是

org.apache.commons.text.StringSubstitutor:

java.lang.String replace(java.lang.String)方法的參數(shù)@parameter0。

同時,在結果集中的AppTaintedVar.csv文件也可以看到具體的應用代碼中由于污點傳播過程中的被污染的變量.以上面commons text 漏洞執(zhí)行方法棧中的

org.apache.commons.text.StringSubstitutor的resolveVariable為例:

d9d3b81a-101b-11ee-962d-dac502259ad0.png

可以看出方法中被污染的入?yún)ariableName、buf,還有resolver,以及$stack7等(這是經(jīng)過soot生成jimple的過程中SSA pack部分優(yōu)化新增的棧變量)。

d9fce992-101b-11ee-962d-dac502259ad0.png

基于這兩個結果集基本可以看出漏洞的觸發(fā)流程或者說污點的傳播過程(雖然不是特別直觀),如果需要也可以再搭配生成的CallGraphEdge.csv去更方便的進行分析。

四、總結

doop直接用來分析大型項目需要一定的計算資源,并且無論是規(guī)則的定制還是分析結果查看都不是特別直觀,畢竟它的設計初衷就是一款分析框架,用在實際漏掃漏洞挖掘中可能需要進一步包裝修改 。但可以看出,doop作為一款優(yōu)秀的開源靜態(tài)分析框架,在算法上毋庸置疑是比較先進和豐富的,而且基于開源的算法規(guī)則,我們可以任意去定制我們需要的分析邏輯。其與codeql在設計思路也較為相近,將程序信息提取后生成數(shù)據(jù)庫,開放查詢接口,將程序分析轉變?yōu)閿?shù)據(jù)關系的查詢,因此可以擴展出更多的用途。




審核編輯:劉清

聲明:本文內容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權轉載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內容侵權或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 處理器
    +關注

    關注

    68

    文章

    19409

    瀏覽量

    231189
  • JAVA語言
    +關注

    關注

    0

    文章

    138

    瀏覽量

    20181

原文標題:使用doop識別最近commons text漏洞的污點信息流

文章出處:【微信號:OSC開源社區(qū),微信公眾號:OSC開源社區(qū)】歡迎添加關注!文章轉載請注明出處。

收藏 人收藏

    評論

    相關推薦

    華為榮獲BSI全球首批漏洞管理體系認證

    。 此次認證涵蓋了ISO/IEC 27001信息安全管理、ISO/IEC 29147漏洞披露以及ISO/IEC 30111漏洞處理流程這三大國際標準。這些標準在信息安全領域具有極高的權
    的頭像 發(fā)表于 01-22 13:42 ?174次閱讀

    X平臺推出短視頻信息流,瞄準美國TikTok用戶

    就在TikTok恢復美國服務之際,X平臺也宣布了一項重要更新——上線短視頻信息流服務。這一舉措無疑將加劇美國短視頻市場的競爭。 X平臺表示,他們正在為美國用戶打造一個新的“沉浸式視頻之家”。在更新后
    的頭像 發(fā)表于 01-22 10:36 ?178次閱讀

    華為通過BSI全球首批漏洞管理體系認證

    近日,華為通過全球權威標準機構BSI漏洞管理體系認證,涵蓋了ISO/IEC 27001信息安全管理、ISO/IEC 29147漏洞披露及ISO/IEC 30111漏洞處理流程三大國際標
    的頭像 發(fā)表于 01-16 11:15 ?222次閱讀
    華為通過BSI全球首批<b class='flag-5'>漏洞</b>管理體系認證

    常見的漏洞分享

    #SPF郵件偽造漏洞 windows命令: nslookup -type=txt xxx.com linux命令: dig -t txt huawei.com 發(fā)現(xiàn)spf最后面跟著~all,代表有
    的頭像 發(fā)表于 11-21 15:39 ?240次閱讀
    常見的<b class='flag-5'>漏洞</b>分享

    如何使用 IOTA?分析安全漏洞的連接嘗試

    在當今數(shù)字化世界中,網(wǎng)絡安全變得至關重要。本文將探討如何利用流量數(shù)據(jù)分析工具來發(fā)現(xiàn)和阻止安全漏洞和惡意連接。通過分析 IOTA 流量,您可以了解如何識別不當行為,并采取適當?shù)拇胧﹣肀Wo您的網(wǎng)絡和數(shù)據(jù)。我們將深入研究IOTA的工作流程,以了解如何準確地分析連接嘗試,并
    的頭像 發(fā)表于 09-29 10:19 ?301次閱讀
    如何使用 IOTA?分析安全<b class='flag-5'>漏洞</b>的連接嘗試

    泥石滑坡監(jiān)測識別攝像機

    泥石和滑坡是自然災害中常見的危險事件,給人們的生命財產(chǎn)造成了嚴重威脅。為了及時發(fā)現(xiàn)并減少這些災害帶來的損失,泥石滑坡監(jiān)測識別攝像機應運而生。這種先進設備結合了監(jiān)控攝像技術和智能分析技術,可以實時
    的頭像 發(fā)表于 09-27 10:50 ?247次閱讀
    泥石<b class='flag-5'>流</b>滑坡監(jiān)測<b class='flag-5'>識別</b>攝像機

    漏洞掃描一般采用的技術是什么

    漏洞掃描是一種安全實踐,用于識別計算機系統(tǒng)、網(wǎng)絡或應用程序中的安全漏洞。以下是一些常見的漏洞掃描技術: 自動化漏洞掃描 : 網(wǎng)絡掃描 :使用
    的頭像 發(fā)表于 09-25 10:27 ?456次閱讀

    漏洞掃描的主要功能是什么

    漏洞掃描是一種網(wǎng)絡安全技術,用于識別計算機系統(tǒng)、網(wǎng)絡或應用程序中的安全漏洞。這些漏洞可能被惡意用戶利用來獲取未授權訪問、數(shù)據(jù)泄露或其他形式的攻擊。
    的頭像 發(fā)表于 09-25 10:25 ?504次閱讀

    內核程序漏洞介紹

    電子發(fā)燒友網(wǎng)站提供《內核程序漏洞介紹.pdf》資料免費下載
    發(fā)表于 08-12 09:38 ?0次下載

    如何學習智能家居?8:Text文本實體使用方法

    hello,伙伴們最近一直在弄AiPi-Eyes-R3的資料,渲染、3D 外殼設計......一直沒時間開發(fā)新的 HomeAssistant MQTT 實體,最新的實體估計也是在本月初開發(fā)完的,一直
    的頭像 發(fā)表于 07-15 14:06 ?1663次閱讀
    如何學習智能家居?8:<b class='flag-5'>Text</b>文本實體使用方法

    請問esp who人臉識別的臉部信息如何保存在sd卡中?

    esp who人臉識別的臉部信息如何保存在sd卡中?
    發(fā)表于 06-28 08:09

    微軟五月補丁修復61個安全漏洞,含3個零日漏洞

    值得注意的是,此次修復并不包含5月2日修復的2個微軟Edge漏洞以及5月10日修復的4個漏洞。此外,本月的“補丁星期二”活動還修復了3個零日漏洞,其中2個已被證實被黑客利用進行攻擊,另一個則是公開披露的。
    的頭像 發(fā)表于 05-15 14:45 ?771次閱讀

    HarmonyOS實戰(zhàn)開發(fā)-如何通過Text實現(xiàn)部分文本高亮和超鏈接。

    介紹 本示例通過自定義Span類型,在Text組件中使用ForEach遍歷,根據(jù)不同的Span類型生成不同樣式和功能的Span組件,實現(xiàn)部分文本高亮和超鏈接。 效果圖預覽 使用說明 點擊超鏈接
    發(fā)表于 05-07 14:18

    D-Link NAS設備存在嚴重漏洞,易受攻擊者注入任意命令攻擊

    該問題源于URL處理軟件中的CGI腳本段“/cgi-bin/ nas_sharing. CGI”,其對HTTPGET請求的處理過程存在漏洞。該漏洞以CVE-2024-3273作為識別號,其方式包括以”system“參數(shù)進行的命令
    的頭像 發(fā)表于 04-08 10:28 ?974次閱讀

    Mozilla Firefox瀏覽器推出Text Fragments功能,提升用戶體驗

    早在2020年,谷歌即在Chrome瀏覽器中推出了“Scroll to Text Fragments”功能,而Edge、Opera、Brave、Vivaldi以及蘋果Safari等基于Chromium的瀏覽器也已支持這一便捷特性。
    的頭像 發(fā)表于 04-08 10:21 ?682次閱讀
    太阳城百家乐官网杀祖玛| 太阳城娱乐正网| 哪个百家乐投注平台信誉好| 百家乐官网下注的规律| 百家乐官网赌博机原理| 同乐城百家乐官网现金网| 百家乐官网德州扑克轮盘| 百家乐官网赌博大全| 新锦江百家乐官网的玩法技巧和规则| 百家乐官网平注法到656| 打百家乐的技巧| 稳赢百家乐的玩法技巧| 狮威百家乐的玩法技巧和规则 | 百家乐官网沙| 百家乐官网天下| 钱百家乐取胜三步曲| 百家乐庄家闲| 大发888下载安全的| 永利博国际网| 百家乐官网现金网排名| 云赢百家乐官网分析| 百家乐是咋玩法| 百家乐娱乐网代理佣金| 德州扑克庄家| 百家乐官网信用哪个好| 新百家乐官网庄闲路单图记录| 2024年九宫八卦吉位| 九宫飞星2024年的财位| 百家乐是怎么赌法| 德州扑克庄家| 百家乐官网高手看百家乐官网| 喜力百家乐官网的玩法技巧和规则| E乐博百家乐现金网| 皇家百家乐的玩法技巧和规则| 鸿博娱乐| 百家乐官网平台哪个好本站所有数据都是网友推荐及提供 | e世博百家乐官网攻略| 澳门百家乐真人娱乐城| 增城太阳城巧克力| 百家乐官网技巧运气| 24山向方位|