
靜態(tài)分析SAST應用安全漏洞掃描代碼質(zhì)量【免費下載鏈接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security項目地址https://gitcode.com/gh_mirrors/co/codeql點擊查看免費下載導讀本文圍繞 CodeQL C 查詢集在 1.2.1 版本發(fā)布說明cpp/ql/src/change-notes/released/1.2.1.md中的一條關鍵改進展開cpp/uncontrolled-allocation-sizeUncontrolled allocation size不可控分配大小查詢現(xiàn)在會把可能縮減用戶輸入數(shù)值的算術運算視為污點傳播的屏障barrier從而顯著減少誤報。讀完本文你將理解該查詢檢測的漏洞本質(zhì)CWE-190 整數(shù)溢出 / CWE-789 不受控的內(nèi)存分配、1.2.1 變更背后的源碼實現(xiàn)bounded謂詞與屏障判定邏輯以及如何借助倉庫內(nèi)的測試用例驗證這些行為。查詢背景什么是不可控分配大小漏洞cpp/uncontrolled-allocation-size用于檢測一類高危內(nèi)存安全問題程序使用外部用戶可控的值作為malloc、realloc、new/new[]等內(nèi)存分配的大小從而可能讓攻擊者誘導程序一次性分配任意數(shù)量的內(nèi)存造成資源耗盡拒絕服務或整數(shù)溢出后的小塊分配進而引發(fā)后續(xù)越界寫。從查詢源文件 TaintedAllocationSize.ql 的元數(shù)據(jù)可以看到該查詢的定位元數(shù)據(jù)字段值含義nameUncontrolled allocation size查詢顯示名kindpath-problem輸出為污染源 → 匯聚點的完整污點路徑problem.severityerror默認告警級別為 errorsecurity-severity8.1GitHub Security Lab 安全嚴重度評分precisionmedium中等精度idcpp/uncontrolled-allocation-size查詢唯一標識tagsreliability、security、CWE-190、CWE-789分類標簽該查詢本質(zhì)是一個全局污點追蹤taint tracking查詢它繼承semmle.code.cpp.ir.dataflow.TaintTracking將外部輸入命令行參數(shù)、環(huán)境變量、文件內(nèi)容、網(wǎng)絡數(shù)據(jù)等來自 FlowSources.qll 定義的FlowSource作為污染源將分配表達式的整型子表達式作為匯聚點sink并通過TaintTracking::GlobalTaintedAllocationSizeConfig計算污染路徑。命中后報告This allocation size is derived from $ and could allocate arbitrary amounts of memory.該分配大小源自用戶輸入可能分配任意數(shù)量的內(nèi)存1.2.1 變更內(nèi)容解讀發(fā)布說明原文Thecpp/uncontrolled-allocation-sizequery now considers arithmetic operations that might reduce the size of user input as a barrier. The query therefore produces fewer false positive results.即凡是可能縮小用戶輸入數(shù)值范圍的算術運算現(xiàn)在都會被當作污點屏障污點流在該處被切斷查詢因此不再對看似來自用戶輸入、實則已被顯著約束的分配大小告警從而減少誤報。這里的關鍵判斷是很多程序會對用戶輸入先做取模、除法、右移、按位與等縮減型運算再交給分配函數(shù)。例如malloc(n % 100)、malloc(n 7)雖然仍與用戶輸入相關但結果被限制在一個很小的范圍內(nèi)不可能造成不受控的大塊分配。1.2.1 之前這類代碼可能被誤報1.2.1 之后則被正確識別為安全模式。源碼級實現(xiàn)bounded謂詞與屏障判定1.2.1 改進的落點集中在查詢配置的isBarrier謂詞中TaintedAllocationSize.ql。一個污點節(jié)點node滿足以下任一條件即成為屏障bounded(e)—— 表達式是不會溢出或可能大幅縮小取值范圍的算術運算指針減法PointerDiffExpr的操作數(shù) —— 兩個指針相減結果通常很小前提是程序保證了定義良好變量存在上界檢查hasUpperBoundsCheck變量在某基本塊內(nèi)被相等性檢查約束nodeIsBarrierEquality分配函數(shù)自身的形參節(jié)點阻止污點流進入分配函數(shù)內(nèi)部造成重復結果。其中第 1 條正是本次變更的核心其實現(xiàn)位于 Bounded.qll該文件同時被cpp/uncontrolled-arithmetic、cpp/tainted-arithmetic復用。bounded(e)的判定規(guī)則如下不會溢出的算術運算e是UnaryArithmeticOperation、BinaryArithmeticOperation或AssignArithmeticOperation且convertedExprMightOverflow(e)不成立通過 SimpleRangeAnalysis.qll 的區(qū)間分析證明其不可能溢出。源碼注釋特別提醒必須先排除不可分析的情況否則會把一切無法分析的表達式誤判為 bounded。樂觀假定結果遠小于輸入的操作RemExpr取模%—— 結果恒小于除數(shù)DivExpr除法/—— 結果不會大于被除數(shù)RShiftExpr右移—— 結果必然縮小BitwiseAndExpr按位與且其某個操作數(shù)的上界小于結果類型的最大值boundedBitwiseAnd即upperBound(operand) exprMaxVal(andExpr)。賦值變體對%、/、在左值getLValue()上放置屏障對則要求右值滿足boundedBitwiseAnd。注意查詢對于相加、相乘這類可能擴大數(shù)值的運算并不設屏障因此malloc(tainted * sizeof(T))這類模式仍會被報告——這與測試用例的表現(xiàn)一致。測試用例印證哪些代碼被放行哪些仍被報告?zhèn)}庫為該查詢維護了完整的測試集test.cpp 與對應期望輸出 TaintedAllocationSize.expected可以逐條印證 1.2.1 的屏障語義仍被報告BAD / Alert污點未被屏障切斷int tainted atoi(argv[1]); malloc(tainted); // BAD malloc(tainted * sizeof(T)); // BAD乘法不設屏障 malloc(sizeof(T) tainted); // BAD加法不設屏障 new char[tainted]; // BAD realloc(p, sizeof(T) * tainted); // BAD malloc(atol(getenv(USER)) * sizeof(int)); // BADlong 也可能溢出 MyMalloc1(tainted); // BAD自定義分配函數(shù)同樣被啟發(fā)式識別被屏障放行GOODmalloc(sizeof(T)); // 常量大小本就無污點 int size tainted % 100; malloc(size * sizeof(int)); // GOOD取模結果有界 int size2 tainted 7; malloc(size2 * sizeof(int)); // GOOD按位與截斷 malloc(bounded(size, MAX)); // GOOD顯式鉗制到 [1, MAX] if (size 0) malloc(size * sizeof(int)); // GOOD正數(shù)上界不會溢出 if (size 100) malloc(size * sizeof(int));// GOOD相等性檢查 new char[end - start]; // GOOD指針差特別值得關注的是測試文件中的兩組對比size的鉗制bounded函數(shù)把輸入限制在[1, MAX_SIZE]與if (size 100)這類只約束下限、未約束上限的判斷。前者被判定為 GOOD后者size 100時仍可能無限大在期望輸出中標記為MISSING: Alert——即已知的未被檢測案例這也解釋了為什么該查詢的精度標注為medium而非high。s 0 → s 0、s 100 → s 100的雙向鉗制同樣被正確放行。此外期望文件還展示了多類污染源路徑命令行參數(shù)**argv→atoi、環(huán)境變量getenv→atoi/atol、流輸入cin 、跨函數(shù)返回get_tainted_size、輸出參數(shù)回傳get_size(out)以及自定義包裝分配器MyMalloc1/MyMalloc2可作為理解污點傳播覆蓋面的完整樣例。屏障體系的其余部分上界檢查與相等性檢查除算術屏障外isBarrier還包含兩類基于守衛(wèi)條件guard的屏障共同構成 1.2.1 之后的完整判定體系上界檢查hasUpperBoundsCheckreadsVariable若變量參與過某個關系運算、、、且比較對象不是0則認為該變量存在上界約束后續(xù)以它為大小的分配被放行。if (size 0) malloc(size * sizeof(int))即由此類屏障豁免。相等性檢查variableEqualityCheckedInBlock/nodeIsBarrierEquality借助 IRGuards.qll 的ensuresEq判斷變量在當前基本塊內(nèi)是否被保證等于某個值如size 100、size ! 100 → return后的size 100。測試中的equality_cases與equality_barrier覆蓋了、!、短路/||、輸出參數(shù)等組合。這兩類屏障與 1.2.1 新增的算術屏障協(xié)同工作各自處理由守衛(wèi)約束和由運算本身約束兩種有界場景。分配函數(shù)的啟發(fā)式識別范圍更廣的匯聚點該查詢對匯聚點的識別并不局限于標準庫。它基于HeuristicAllocationExpr/HeuristicAllocationFunction定義于 Allocation.qll這類可能分配內(nèi)存的啟發(fā)式類除malloc、realloc、calloc、operator new等內(nèi)置模型外凡是函數(shù)名與形參形態(tài)符合分配語義的自定義函數(shù)如測試中的MyMalloc1、my_alloc也會被納入檢測范圍匯聚點即分配表達式中類型為整型的子表達式見allocSink謂詞。這一點源自 0.5.1 的變更change-notes/released/0.5.1.mdenhanced with heuristic detection of allocations而 0.0.12 則將該查詢從普通告警改造為path-problem污點路徑查詢change-notes/released/0.0.12.md。1.2.1 的算術屏障改進是在這兩次結構性升級之上的精度優(yōu)化三者在 CHANGELOG.md 中均有記錄。如何在本倉庫中運行與驗證該查詢位于 cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql屬codeql/cpp-queries查詢包的一部分。常規(guī)用法用codeql database create對目標 C/C 工程建庫用codeql database analyze db cpp/ql/src/Security/CWE/CWE-190/TaintedAllocationSize.ql單獨執(zhí)行該查詢或加入完整查詢套件運行全部安全查詢在 SARIF 或文本報告中查看cpp/uncontrolled-allocation-size的告警與污點路徑。若想復現(xiàn)本文引用的全部判定行為可直接運行倉庫自帶的 QL 測試測試入口為 TaintedAllocationSize.qlref指向被測查詢輸入為 test.cpp期望輸出為 TaintedAllocationSize.expected。在cpp/ql目錄下執(zhí)行codeql test run test/query-tests/Security/CWE/CWE-190/semmle/TaintedAllocationSize即可對比實際結果與期望值直觀觀察屏障邏輯的效果。小結1.2.1 對cpp/uncontrolled-allocation-size的改進是一項典型的降誤報、保召回精度優(yōu)化通過Bounded.qll中bounded謂詞對取模、除法、右移、按位與及可證明不會溢出的算術運算統(tǒng)一建模并在TaintedAllocationSize.ql的isBarrier中將其作為污點屏障查詢得以區(qū)分直接使用用戶輸入與用戶輸入經(jīng)有界化處理兩種形態(tài)。結合既有的上界檢查、相等性檢查、指針差與分配函數(shù)形參屏障該查詢在保持對 CWE-190/CWE-789 覆蓋的同時誤報率顯著下降其行為在倉庫測試集中有完整的可復現(xiàn)依據(jù)。贊分享靜態(tài)分析SAST應用安全漏洞掃描代碼質(zhì)量【免費下載鏈接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security項目地址https://gitcode.com/gh_mirrors/co/codeql點擊查看免費下載相關推薦CodeQL C/C 安全查詢解析用「柵欄」消減誤報的 Uncontrolled Allocation Sizecpp/uncontrolled-allocation-sizeCodeQL C/C 安全查詢解析用「柵欄」消減誤報的 Uncontrolled Allocation Sizecpp/uncontrolled all靜態(tài)分析SAST應用安全漏洞掃描代碼質(zhì)量Hindsight Obsidian 集成演進全覽從插件首發(fā)到無頭 CLI 同步引擎Hindsight Obsidian 集成演進全覽從插件首發(fā)到無頭 CLI 同步引擎 Hindsight 的 Obsidian 插件npm 包 vecto靜態(tài)分析SAST應用安全漏洞掃描代碼質(zhì)量Academic Research Skills 快速上手8 種研究模式怎么選30 分鐘出一份帶引用的研究簡報Academic Research Skills 快速上手8 種研究模式怎么選30 分鐘出一份帶引用的研究簡報 先說結論Academic Research靜態(tài)分析SAST應用安全漏洞掃描代碼質(zhì)量上一篇Translumo終極指南如何在5分鐘內(nèi)掌握Windows實時屏幕翻譯神器下一篇5分鐘快速掌握Windows和Office免費智能激活終極方案創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考