內(nèi)置支持清單解讀:各語(yǔ)言覆蓋范圍與如何擴(kuò)展分析)
靜態(tài)分析SAST應(yīng)用安全漏洞掃描代碼質(zhì)量【免費(fèi)下載鏈接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security項(xiàng)目地址https://gitcode.com/gh_mirrors/co/codeql點(diǎn)擊查看免費(fèi)下載導(dǎo)讀本文基于 CodeQL 倉(cāng)庫(kù)中 change-notes/1.19/support/framework-support.rst 這一發(fā)布說(shuō)明文檔系統(tǒng)梳理 CodeQL 1.19 版本對(duì)各語(yǔ)言主流框架與第三方庫(kù)的內(nèi)置建模支持哪些框架被官方顯式核對(duì)過(guò)、各語(yǔ)言支持清單與類(lèi)別分布以及當(dāng)目標(biāo)庫(kù)不在清單中時(shí)如何通過(guò)擴(kuò)展數(shù)據(jù)流庫(kù)自行補(bǔ)充支持。讀完本文你將能快速判斷自己的項(xiàng)目框架是否落在官方核對(duì)范圍內(nèi)并掌握“模型即數(shù)據(jù) / QL 庫(kù)擴(kuò)展”兩條通往自定義支持的路徑。這份清單是什么1.19 版本的框架核對(duì)范圍framework-support.rst是 CodeQL 1.19 發(fā)布說(shuō)明change-notes/1.19/中專(zhuān)門(mén)用于記錄框架與庫(kù)支持范圍的文檔。它的核心表述是本版本中的 QL 庫(kù)與查詢已顯式針對(duì)下列庫(kù)與框架逐一核對(duì)過(guò)explicitly checked against。也就是說(shuō)這份清單并非“當(dāng)前倉(cāng)庫(kù)支持的全部框架”而是在 1.19 版本周期內(nèi)經(jīng)過(guò)人工核對(duì)、有測(cè)試與查詢結(jié)果背書(shū)的子集。文檔同時(shí)以一段 Tip 明確說(shuō)明邊界如果你感興趣的是其他庫(kù)或框架可以自行擴(kuò)展分析——例如通過(guò)擴(kuò)展數(shù)據(jù)流庫(kù)為額外框架補(bǔ)充數(shù)據(jù)源sources與匯聚點(diǎn)sinks。從倉(cāng)庫(kù)結(jié)構(gòu)看這一承諾是真實(shí)可落地的每種語(yǔ)言都在 QL 庫(kù)中維護(hù)了獨(dú)立的frameworks目錄如 java/ql/lib/semmle/code/java/frameworks/、python/ql/lib/semmle/python/frameworks/、csharp/ql/lib/semmle/code/csharp/frameworks/、javascript/ql/lib/semmle/javascript/frameworks/每個(gè)受支持的庫(kù)對(duì)應(yīng)一個(gè) QL 模塊文件清單本身即由這些模塊支撐。語(yǔ)言級(jí)范圍與支持語(yǔ)言、編譯器清單配套閱讀框架支持清單是 CodeQL 語(yǔ)言支持的子集因此應(yīng)結(jié)合同目錄下的 language-support.rst 與 versions-compilers.csv 一起理解。后者給出了 1.19 版本的完整語(yǔ)言/編譯器矩陣節(jié)選關(guān)鍵項(xiàng)語(yǔ)言支持變體編譯器文件擴(kuò)展名C/CC89、C99、C11、C98/03/11/14/17Clang至 6.0、GNU至 GCC 7.3、Microsoft至 VS 2017.cpp.cxx.hpp.h等C#C# 至 7.2.NET 至 4.7.1Visual Studio 至 2017、.NET Core 至 2.1.cs.cshtml.xaml等COBOLANSI 85 或更新不適用.cbl.cpy.copy等JavaJava 11 或更低指語(yǔ)言特性構(gòu)建可在 Java 6 上執(zhí)行javacOpenJDK / Oracle JDK、ECJ.javaJavaScriptECMAScript 2018 或更低不適用.js.jsx.mjs.vue等Python2.7、3.5、3.6、3.7不適用.pyTypeScript2.6 ~ 3.1標(biāo)準(zhǔn) TypeScript 編譯器.ts.tsx值得注意的邊界文檔中明確注釋“目前對(duì) C/C 沒(méi)有針對(duì)庫(kù)或框架的內(nèi)置支持”There is currently no built-in support for libraries or frameworks for C/C因此在 1.19 的框架清單中不會(huì)出現(xiàn) C/C 條目COBOL 的支持則以 ANSI 85 標(biāo)準(zhǔn)為最佳適配目標(biāo)。TypeScript 的分析是通過(guò)在 JavaScript 提取器中開(kāi)啟 TypeScript 選項(xiàng)實(shí)現(xiàn)的。C# 內(nèi)置支持ASP.NET 家族全覆蓋1.19 中 C# 的框架支持清單集中于 ASP.NET 技術(shù)棧ASP.Net MVC 框架ASP.NET Web APIASP.NET Web FormsASP.NET CoreASP.NET Core MVCASP.Net Core RazorRazor 模板這套清單在 QL 庫(kù)中有直接的模塊對(duì)應(yīng)關(guān)系。從 csharp/ql/lib/semmle/code/csharp/frameworks/microsoft/AspNetCore.qll 可以看到對(duì) ASP.NET Core 的建模而 csharp/ql/lib/semmle/code/csharp/frameworks/Razor.qll 則負(fù)責(zé) Razor 模板的語(yǔ)義Razor 視圖、指令與 HTML 上下文它們是 XSS、路徑注入等安全查詢?cè)?Web 視圖層正確識(shí)別匯聚點(diǎn)的前提。此外frameworks目錄中還包含 EntityFramework、NHibernate、Dapper、Json.NET、ServiceStack 等庫(kù)的模塊說(shuō)明這些庫(kù)在后續(xù)版本或更細(xì)粒度中同樣有建模覆蓋清單僅代表 1.19 顯式核對(duì)的那一批。COBOL 內(nèi)置支持嵌入式 SQL 與 CICSCOBOL 在 1.19 中的內(nèi)置支持聚焦于兩種嵌入式環(huán)境嵌入式 SQLEmbedded SQL嵌入式 CICSEmbedded CICS這對(duì)應(yīng) COBOL 程序中最常見(jiàn)的兩種宿主接口通過(guò)EXEC SQL ... END-EXEC嵌入的數(shù)據(jù)庫(kù)訪問(wèn)以及通過(guò) CICS 命令嵌入的事務(wù)處理調(diào)用。對(duì)這些語(yǔ)法的建模讓數(shù)據(jù)流分析能夠穿越 COBOL 與外部數(shù)據(jù)源/匯聚點(diǎn)之間的邊界。結(jié)合 versions-compilers.csv 的注釋分析效果最佳的是接近 ANSI 85 標(biāo)準(zhǔn)的代碼。Java 內(nèi)置支持?jǐn)?shù)據(jù)庫(kù)與序列化兩大主線Java 的支持清單以表格形式存放于 java-frameworks.csv內(nèi)容如下名稱類(lèi)別HibernateDatabaseiBatis / MyBatisDatabaseJava Persistence API (JPA)DatabaseJDBCDatabaseSpring JDBCDatabaseSpring MVCWeb application frameworkKryo deserializationSerializationSnakeYamlSerializationXStreamSerialization可以看到兩大主線數(shù)據(jù)庫(kù)訪問(wèn)層Hibernate、MyBatis、JPA、JDBC、Spring JDBC與反序列化層Kryo、SnakeYaml、XStream。這并非偶然——它們恰好是 Java 安全查詢最關(guān)注的兩類(lèi)匯聚點(diǎn)SQL 注入與不安全反序列化。與查詢改進(jìn)的直接呼應(yīng)1.19 的 Java 分析發(fā)布說(shuō)明 analysis-java.md 記錄了兩個(gè)與清單直接相關(guān)的變更java/sql-injection由用戶控制的源構(gòu)造查詢現(xiàn)在會(huì)報(bào)告來(lái)自 Spring JDBC、MyBatis、Hibernate 框架的 SQL 注入?yún)R聚點(diǎn)java/concatenated-sql-query未中和特殊字符的查詢同樣新增了來(lái)自上述三個(gè)框架的匯聚點(diǎn)報(bào)告。這印證了“框架清單”并非靜態(tài)文本——清單中的框架正是 QL 庫(kù)中frameworks模塊被安全查詢實(shí)際消費(fèi)的對(duì)象。此外發(fā)布說(shuō)明還提到FlowSources庫(kù)的默認(rèn)污點(diǎn)源擴(kuò)展到了帶 Spring 注解標(biāo)識(shí) servlet 遠(yuǎn)程用戶輸入的參數(shù)凡使用 Spring Web 框架的項(xiàng)目都會(huì)因此獲得更多安全查詢結(jié)果。源碼側(cè)的框架模塊從 java/ql/lib/semmle/code/java/frameworks/ 目錄看Java 的框架建模比清單更廣泛包含spring/下數(shù)十個(gè)模塊Spring.qll 及其對(duì) Bean、組件掃描、HTTP 等的細(xì)分模塊、struts/下的 StrutsActions.qll、javaee/下的 JavaServerFaces.qll 等。這也再次說(shuō)明清單 官方顯式核對(duì)的子集而非能力上限。JavaScript / TypeScript 內(nèi)置支持六大類(lèi)別 22 個(gè)庫(kù)JS/TS 的清單最豐富存放于 javascript-typescript-frameworks.csv名稱類(lèi)別angularjsHTML frameworkreactHTML frameworkbrowserRuntime environmentelectronRuntime environmentnodeRuntime environmentexpressServerhapiServerkoaServerjqueryUtility librarylodashUtility libraryramdaUtility libraryunderscoreUtility libraryaxiosNetwork communicatorrequestNetwork communicatorsuperagentNetwork communicatormongodbDatabasemssqlDatabasemysqlDatabasepostgresDatabasesequelizeDatabasesqlite3Database類(lèi)別覆蓋 HTML 框架、運(yùn)行時(shí)環(huán)境、服務(wù)端、工具庫(kù)、網(wǎng)絡(luò)通信與數(shù)據(jù)庫(kù)六大類(lèi)基本對(duì)應(yīng)數(shù)據(jù)流分析中不同角色運(yùn)行時(shí)環(huán)境node/browser/electron決定“執(zhí)行語(yǔ)義”邊界服務(wù)器框架express/hapi/koa提供請(qǐng)求源與響應(yīng)匯聚點(diǎn)數(shù)據(jù)庫(kù)驅(qū)動(dòng)mysql/postgres/sequelize 等提供 SQL 注入?yún)R聚點(diǎn)工具庫(kù)lodash/underscore/ramda則常貢獻(xiàn)屬性訪問(wèn)與處理步驟。源碼側(cè)javascript/ql/lib/semmle/javascript/frameworks/ 目錄提供了對(duì)應(yīng)模塊例如 AngularJS.qll含依賴注入、表達(dá)式求值等子模塊、ConnectExpressShared.qllConnect/Express 共享的請(qǐng)求-響應(yīng)建模。這些模塊通過(guò)HTTP::Server::Request等概念接入數(shù)據(jù)流框架是反射型 XSS、SQL 注入、路徑注入等查詢識(shí)別 Web 邊界的基礎(chǔ)。Python 內(nèi)置支持Web 框架與網(wǎng)絡(luò)引擎Python 清單存放于 python-frameworks.csv名稱類(lèi)別DjangoWeb application frameworkFlaskMicroframeworkPyramidWeb application frameworkTornadoWeb application framework and asynchronous networking libraryTwistedNetworking engineWebObWSGI request library這些框架在 python/ql/lib/semmle/python/frameworks/ 中均有對(duì)應(yīng) QL 模塊Django.qll、Flask.qll、Pyramid.qll、Tornado.qll、Twisted.qll。以 Flask.qll 為例第 25 行起定義module Flask其內(nèi)部通過(guò)API::moduleImport(flask)定位導(dǎo)入點(diǎn)并對(duì)flask.views.View、MethodView及其子類(lèi)建模subclassRef()謂詞再據(jù)此推導(dǎo)請(qǐng)求處理入口。這類(lèi)“基于 API 圖 子類(lèi)遍歷”的建模方式正是框架支持能夠在不同版本間保持穩(wěn)定的原因。值得注意的是該目錄實(shí)際包含遠(yuǎn)超清單的模塊如 FastAPI、Sanic、Starlette、SQLAlchemy、Requests、aiohttp 等說(shuō)明清單代表的是 1.19 發(fā)布時(shí)顯式核對(duì)過(guò)的集合倉(cāng)庫(kù)本身的建模面已大幅擴(kuò)展。清單之外如何擴(kuò)展分析覆蓋你自己的框架清單文檔明確給出了擴(kuò)展路徑倉(cāng)庫(kù)中也存在兩條互補(bǔ)的實(shí)現(xiàn)路線1. 擴(kuò)展數(shù)據(jù)流庫(kù)的 Sources / Sinks正如文檔 Tip 所述最直接的擴(kuò)展方式是在數(shù)據(jù)流庫(kù)中為額外框架補(bǔ)充數(shù)據(jù)源與匯聚點(diǎn)。Java 側(cè)的入口是 java/ql/lib/semmle/code/java/dataflow/FlowSources.qll它集中定義了污點(diǎn)源集合且 1.19 中正是通過(guò)為 Spring 注解參數(shù)補(bǔ)充源來(lái)擴(kuò)大查詢覆蓋面見(jiàn) analysis-java.md 的說(shuō)明。對(duì) Python 而言python/ql/lib/semmle/python/dataflow/new/RemoteFlowSources.qll 扮演類(lèi)似角色。通過(guò)修改這些庫(kù)中的源/匯聚點(diǎn)謂詞可以讓現(xiàn)有安全查詢自動(dòng)覆蓋新框架。2. 按框架新增 QL 模塊模型即數(shù)據(jù)更規(guī)范的做法是參照既有框架模塊的模式為你的框架新建一個(gè)建模模塊。從源碼結(jié)構(gòu)看標(biāo)準(zhǔn)模式包括用API::moduleImport(包名)定位庫(kù)的導(dǎo)入點(diǎn)見(jiàn) Flask.qll 第 37 行對(duì)入口類(lèi)、請(qǐng)求對(duì)象、響應(yīng)對(duì)象建模并映射到Concepts.qll中定義的概念如HTTP::Server::Request、SqlInjectionSink將模塊接入數(shù)據(jù)流/污點(diǎn)追蹤管道使安全查詢無(wú)需改動(dòng)即可受益。Python 側(cè)還廣泛采用models-as-data數(shù)據(jù)驅(qū)動(dòng)的模型方式frameworks目錄中的.model.yml文件如 Django.model.yml以 YAML 描述庫(kù) API 的源、匯聚點(diǎn)與流轉(zhuǎn)步驟由ModelsAsData見(jiàn) Flask.qll 第 19 行的 import加載。這意味著擴(kuò)展支持有時(shí)只需要補(bǔ)充 YAML 條目而不必編寫(xiě) QL 謂詞門(mén)檻更低、也更便于與社區(qū)共享。小結(jié)清單的讀法與用法判斷項(xiàng)目是否被覆蓋將項(xiàng)目依賴與各語(yǔ)言 CSV 清單java-frameworks.csv、javascript-typescript-frameworks.csv、python-frameworks.csv比對(duì)即可確定 1.19 顯式核對(duì)的范圍。未被覆蓋不等于不支持倉(cāng)庫(kù)各語(yǔ)言的frameworks目錄規(guī)模遠(yuǎn)大于清單且框架模塊會(huì)隨版本持續(xù)擴(kuò)充查詢結(jié)果的變化如 SQL 注入 sink 的新增往往與清單擴(kuò)容同步。擴(kuò)展是官方鼓勵(lì)的一等路徑數(shù)據(jù)流源/匯聚點(diǎn)擴(kuò)展與模型即數(shù)據(jù)YAML 模型兩條路線可以讓自定義框架在現(xiàn)有查詢體系內(nèi)快速獲得分析能力這也是 CodeQL 框架支持體系的設(shè)計(jì)初衷。贊分享靜態(tài)分析SAST應(yīng)用安全漏洞掃描代碼質(zhì)量【免費(fèi)下載鏈接】codeqlCodeQL: the libraries and queries that power security researchers around the world, as well as code scanning in GitHub Advanced Security項(xiàng)目地址https://gitcode.com/gh_mirrors/co/codeql點(diǎn)擊查看免費(fèi)下載相關(guān)推薦Lidgren Network Gen3可靠傳輸實(shí)現(xiàn)深入理解NetReliableOrdered與消息重傳機(jī)制Lidgren Network Gen3可靠傳輸實(shí)現(xiàn)深入理解NetReliableOrdered與消息重傳機(jī)制 Lidgren Network Gen3是一款I(lǐng)nstructPix2Pix多語(yǔ)言支持如何擴(kuò)展指令語(yǔ)言范圍的完整指南InstructPix2Pix多語(yǔ)言支持如何擴(kuò)展指令語(yǔ)言范圍的完整指南 InstructPix2Pix是一個(gè)革命性的基于指令的圖像編輯模型它能夠根據(jù)文本指令計(jì)算機(jī)視覺(jué)媒體生成AI 應(yīng)用Deepsec 支持哪些技術(shù)棧覆蓋 15 語(yǔ)言框架的內(nèi)置漏洞掃描規(guī)則清單一覽Deepsec 支持哪些技術(shù)棧覆蓋 15 語(yǔ)言框架的內(nèi)置漏洞掃描規(guī)則清單一覽 如果你正在為項(xiàng)目挑選一款 漏洞掃描工具 最關(guān)心的問(wèn)題之一一定是Deepse應(yīng)用安全漏洞掃描人工智能AI Agent上一篇Material Dashboard 3 更新日志深度解讀從 Bootstrap 4 到 5.3 的版本演進(jìn)與關(guān)鍵修復(fù)下一篇終極指南如何使用免費(fèi)開(kāi)源工具快速搶到B站會(huì)員購(gòu)熱門(mén)票務(wù)創(chuàng)作聲明:本文部分內(nèi)容由AI輔助生成(AIGC),僅供參考