ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

CodeQL C++ 查询实战:`cpp/external-entity-expansion`(XML 外部实体 XXE 检测)及其 0.1.2 版库覆盖扩展

CodeQL C++ 查询实战:`cpp/external-entity-expansion`(XML 外部实体 XXE 检测)及其 0.1.2 版库覆盖扩展 静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】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 查询包 0.1.2 版变更说明cpp/ql/src/change-notes/released/0.1.2.md为核心线索深入讲解 C 语言包中的 XXE 检测查询cpp/external-entity-expansion其漏洞模型、基于流状态flow state的数据流分析实现、0.1.2 中扩展支持的 XML 库与解析接口以及如何参照仓库内的 QL 源码、样例与测试用例来验证告警行为。读完本文你将能够读懂该查询的建模思路并掌握修复 XXE 漏洞的安全配置写法与回归测试方法。变更背景从新增到扩展0.1.2 版的变更说明内容非常聚焦属于Minor Analysis ImprovementsThe XML external entity expansion (cpp/external-entity-expansion) query has been extended to support a broader selection of XML libraries and interfaces.而回溯 0.1.1 版cpp/ql/src/change-notes/released/0.1.1.md可以看到该查询正是在上一版才被引入An new querycpp/external-entity-expansionhas been added. The query detects XML objects that are vulnerable to external entity expansion (XXE) attacks.也就是说0.1.1 完成查询的从无到有0.1.2 则完成了从单点支持到更广泛 XML 库/接口覆盖的扩展。结合当前仓库快照的源码XXE.ql、XML.qll、Xerces.qll、Libxml2.qll可见扩展后的建模面覆盖了 Xerces-C 与 libxml2 两大 C/C XML 解析库及其多种解析入口。查询元数据与告警形态查询本体位于 cpp/ql/src/Security/CWE/CWE-611/XXE.ql其头注释定义了完整的元数据元数据项值说明nameXML external entity expansion查询显示名kindpath-problem输出源 → 汇的完整数据流路径idcpp/external-entity-expansion稳定查询 ID被 suite 与 SARIF 引用problem.severitywarning告警级别security-severity9.1安全严重度对应 CVSS 风格评分区间precisionhigh低误报承诺tagssecurity, external/cwe/cwe-611对应 CWE-611对 XML 外部实体的不当限制告警文案为This $ is not configured to prevent an XML external entity (XXE) attack.其中$指向源节点即 XML 解析器对象的创建/解析调用并以 XML parser 作为链接标签。由于是path-problem结果会以路径图形式呈现从解析器创建到解析调用的完整流向便于开发者定位是哪个对象、在哪一步进入了不安全配置状态。XXE 漏洞检测目标查询要回答的问题XXE.qhelp 对该查询的检测目标做了权威说明用弱配置的 XML 解析器解析不可信 XML 文件可能触发 XML 外部实体XXE攻击攻击者利用外部实体引用可达读取系统上的任意文件信息泄露实施拒绝服务DoS发起服务端请求伪造SSRF。即使解析结果不会返回给用户DoS 与带外out-of-band数据检索技术仍可能窃取敏感数据因此该问题即便在结果不外泄的场景下依然成立。查询的description同样强调了两类后果机密数据泄露与拒绝服务见 XXE.ql。实现原理用流状态跟踪解析器配置该查询的独到之处在于它跟踪的不是普通的污点数据而是XML 解析器对象的配置状态。这一设计体现在 XML.qll 的抽象层中流状态类型TXxeFlowStatenewtype TXxeFlowState定义了两种配置状态TXercesFlowState(int disabledDefaultEntityResolution, int createEntityReferenceNodes)两个布尔位分别记录AbstractDOMParser/SAXParser上setDisableDefaultEntityResolution与setCreateEntityReferenceNodes的取值TLibXml2FlowState()libxml2 库的状态无内部维度其安全性由解析函数传入的xmlParserOption决定。抽象库接口XmlLibraryabstract class XmlLibrary extends string定义了两种谓词configurationSource识别可能不安全的配置对象的创建点并给出初始流状态configurationSink识别用该配置对象解析 XML的调用点。XercesFlowStateXerces.qll将TXercesFlowState包装成可读写的状态类并通过encodeXercesFlowState谓词完成状态与两个布尔位的编解码。状态转换与数据流配置XxeConfig见 XXE.ql实现了DataFlow::StateConfigSigisSource/isSink分别委托给各XmlLibrary的configurationSource/configurationSinkisAdditionalFlowStep让XxeFlowStateTransformer如setDisableDefaultEntityResolution(...)调用在数据流传播过程中改写流状态isBarrier在状态发生转换的调用节点阻断旧状态继续传播从而精确区分调用前与调用后的配置。最终由DataFlow::GlobalWithStateXxeConfig构建全局带状态数据流XXE.qlflowPath(source, sink)产出完整路径。值得留意的是XML.qll 注释明确要求转换谓词必须是幂等的transform(transform(x)) transform(x)这是该实现方式下状态转换的必要约束。0.1.2 扩展的 XML 库与接口覆盖Broader selection of XML libraries and interfaces 的具体内容可以从当前仓库的建模文件中还原Xerces-C 侧Xerces.qll模型以AbstractDOMParser/SAXParser对象及其配置方法为核心。测试目录cpp/ql/test/query-tests/Security/CWE/CWE-611中对应的用例文件印证了覆盖面tests.cppXercesDOMParser及其setDisableDefaultEntityResolution、setCreateEntityReferenceNodes组合tests2.cppSAXParser变体tests3.cppcreateXMLReaderSAX2 XMLReader接口tests5.cppcreateLSParserDOM Level 3 LSParser接口。也就是说0.1.2 的扩展不只是多认一个类而是把 Xerces 家族中 DOMXercesDOMParser、createLSParser与 SAXSAXParser、createXMLReader两条接口线都纳入了同一套状态建模。libxml2 侧Libxml2.qllLibxml2ParseCall类按函数名登记了解析入口及其xmlParserOption参数位置函数options 参数位置xmlCtxtUseOptions1xmlReadFile2xmlCtxtReadFile、xmlParseInNodeContext、xmlReadDoc、xmlReadFd3xmlCtxtReadDoc、xmlCtxtReadFd、xmlReadMemory4xmlCtxtReadMemory、xmlReadIO5xmlCtxtReadIO6覆盖了文档读取file/doc/memory/fd/IO与上下文解析两大入口族。测试文件 tests4.cpp 展示了判别逻辑传入XML_PARSE_NOENT、XML_PARSE_DTDLOAD或两者按位或组合时告警BAD而传入0或XML_PARSE_OPTION_HARMLESS时不告警GOOD。修复建议按库关闭外部实体处理XXE.qhelp 给出的通用建议是解析不可信数据时应禁用外部实体处理具体做法取决于所用库。同时提醒部分库如较新版本的 libxml默认即禁用实体展开除非显式开启否则无需额外操作——这也解释了为何xmlReadFile(..., 0)与XML_PARSE_OPTION_HARMLESS在测试中被判定为安全。仓库内置的成对样例给出了最直观的修复对照不安全写法XXEBad.cpp——解析器以默认状态构造setDisableDefaultEntityResolution为false可能展开外部实体引用XercesDOMParser *parser new XercesDOMParser(); parser-parse(data); // BAD (parser is not correctly configured, may expand external entity references)安全写法XXEGood.cpp——显式关闭默认实体解析XercesDOMParser *parser new XercesDOMParser(); parser-setDisableDefaultEntityResolution(true); parser-parse(data);测试用例进一步揭示了 Xerces 配置的两个维度必须同时满足仅设setDisableDefaultEntityResolution(true)而setCreateEntityReferenceNodes为false仍会告警tests.cpp两者均为true才判定安全tests.cpp。同一测试文件还覆盖了配置在运行中途被反复切换的场景tests.cpp验证流状态机对状态改写点的处理。回归测试与预期结果验证扩展是否生效该查询配备了完整的 QL 测试套件位于 cpp/ql/test/query-tests/Security/CWE/CWE-611包含多组 C 测试输入与对应的 XXE.expected 期望输出。期望文件中的#select段列出所有路径结果例如| tests.cpp:17:2:17:2 | *p | ... | call to XercesDOMParser | ... | This $ is not configured to prevent an XML external entity (XXE) attack. | ... | XML parser | | tests4.cpp:26:34:26:48 | XML_PARSE_NOENT | ... | XML_PARSE_NOENT | ... | This $ is not configured to prevent an XML external entity (XXE) attack. | ... | XML parser |从期望输出可以看到告警同时覆盖了 XercesXercesDOMParser、SAXParser、createXMLReader、createLSParser与 libxml2XML_PARSE_NOENT、XML_PARSE_DTDLOAD及其组合、透传的flags变量这正是 0.1.2扩展支持更广泛 XML 库与接口在测试层面的落点。开发者可参照该目录结构为自己的库扩展补充用例用codeql test run运行后比对.expected文件即可验证建模行为。关联文档与演进变更记录入口cpp/ql/src/change-notes/released/0.1.2.md新增记录0.1.1cpp/ql/src/change-notes/released/0.1.1.md后续版本在 cpp/ql/src/CHANGELOG.md 中持续记录。从当前仓库整体结构看该查询与 CWE-611 条目cpp/ql/src/Security/CWE/CWE-611下的XML.qll抽象层、Xerces.qll/Libxml2.qll库模型、XXE.qhelp说明及XXEBad.cpp/XXEGood.cpp样例共同构成一个自洽的检测单元。若要为新的 XML 库如 pugixml、tinyxml扩展覆盖推荐路径是在XML.qll的XmlLibrary抽象类下新增子类实现configurationSource/configurationSink定义对应的TXxeFlowState分支与幂等的XxeFlowStateTransformer并在 cpp/ql/test/query-tests/Security/CWE/CWE-611 下补充测试与期望输出。赞分享静态分析SAST应用安全漏洞扫描代码质量【免费下载链接】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 安全查询解析cpp/external-entity-expansion 如何检测 XXE 攻击CodeQL C 安全查询解析 cpp/external entity expansion 如何检测 XXE 攻击 导读 cpp/ql/src/chang静态分析SAST应用安全漏洞扫描代码质量CodeQL C 安全查询实战cpp/toctou-race-condition 时间检查与使用竞态检测及其改进CodeQL C 安全查询实战 cpp/toctou race condition 时间检查与使用竞态检测及其改进 本文围绕 CodeQL C 查询库静态分析SAST应用安全漏洞扫描代码质量Carbon ERP功能全解析从库存管理到生产执行的完整流程Carbon ERP功能全解析从库存管理到生产执行的完整流程 Carbon是一款专为制造业打造的开源ERP企业资源计划系统集成了MES制造执行系统和企业应用工业制造后端前端上一篇高德地图API深度集成DistrictSearch与DistrictExplorer使用详解下一篇FontForge 原生脚本语言内置函数全解析从命令注册表到 300 内置过程的完整实战指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表