ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CodeQL C++ 查询 `cpp/non-https-url` 详解:在源码级拦截以 HTTP 协议构造的 URL

CodeQL C++ 查询 `cpp/non-https-url` 详解:在源码级拦截以 HTTP 协议构造的 URL 静态分析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点击查看免费下载cpp/non-https-urlFailure to use HTTPS URLs是 CodeQL C/C 查询包在 0.0.4 版本中新增的污点追踪查询专门用于标记源码中使用http://URL 但很可能应改用https://的代码位置。本文以 0.0.4 变更说明 为骨架结合该查询的 完整实现、qhelp 文档、示例代码 与 回归测试预期结果系统讲解其检测原理、污点源/汇聚点设计、误报控制策略、运行方式与后续精度演进帮助读者理解并正确使用这条安全查询。查询来源0.0.4 版本变更说明在 cpp/ql/src/change-notes/released/0.0.4.md 中官方变更说明记录了该版本唯一新增的查询A new querycpp/non-https-urlhas been added for C/C. The query flags uses ofhttpURLs that might be better replaced withhttps.同一条目也收录于 CHANGELOG.mdcpp/non-https-url新增记录。这短短一句话背后是仓库中一整套完整的查询实现与测试体系查询本体位于cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql配套的说明文档与示例位于同目录回归测试位于cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/。查询概览元数据与告警语义从 UseOfHttp.ql 的头部元数据可以看出这条查询的完整定位元数据项值说明nameFailure to use HTTPS URLs查询展示名称descriptionNon-HTTPS connections can be intercepted by third parties.触发告警的核心安全理由kindpath-problem路径问题查询告警附带完整的 source→sink 数据流路径problem.severitywarning问题严重级别security-severity8.1安全严重度评分对应 CVSS 风格打分体系precisionhigh高精度0.0.11 版本起由中精度提升而来见下文idcpp/non-https-url查询唯一标识用于命令行与 SARIF 结果引用tagssecurity、external/cwe/cwe-319、external/cwe/cwe-345关联安全分类CWE-319敏感信息明文传输、CWE-345来源可信度校验不足查询命中时输出的告警消息为This URL may be constructed with the HTTP protocol.该 URL 可能是以 HTTP 协议构造的。由于查询类型是path-problemCodeQL 会在结果中同时呈现污点从源HTTP 字符串字面量传播到汇聚点URL 消费函数的完整路径便于开发者定位问题源头。检测原理从 HTTP 字符串到网络调用点的污点追踪该查询基于 CodeQL 的全局污点追踪库实现。从 实现代码 可以看到它导入了semmle.code.cpp.ir.dataflow.TaintTrackingIR 数据流的污点追踪与semmle.code.cpp.valuenumbering.GlobalValueNumbering全局值编号用于消除等价表达式的干扰并最终以TaintTracking::GlobalHttpStringToUrlOpenConfig实例化全局污点追踪配置。其整体思路是以包含 HTTP URL 的字符串字面量为污点源以真正会把字符串当作 URL 使用的网络/进程调用为汇聚点追踪污点沿数据流传播的全过程。只有字符串最终流入了URL 消费函数才构成一次完整的告警——单纯把 URL 用于展示或数据处理并不会触发。污点源SourceHTTP 字符串字面量查询定义了HttpStringLiteral类来筛选符合条件的字符串字面量class HttpStringLiteral extends StringLiteral { HttpStringLiteral() { exists(string s | this.getValue() s | s http or exists(string tail | tail s.regexpCapture(http://(.*), 1) and not tail instanceof PrivateHostName ) ) and not privateHostNameFlowsToExpr(this.getParent*()) } }从 源码 可以看出源筛选的规则字符串字面量恰好等于http裸协议名或匹配http://(.*)模式且捕获到的主机部分不属于私有主机名或字面量祖先表达式中不存在私有主机名污点流入not privateHostNameFlowsToExpr(this.getParent*())。此外源判定中还设置了一道重要豁免如果污点起始于strstr/strcasestr的调用结果则阻断见 源码 L61-L65。原因是这类调用通常是在已有 URL 字符串中查找子串的测试逻辑而不是在构造一个新的 HTTP URL不应误报。污点汇聚点SinkURL 消费函数查询将字符串确实被当作 URL 访问的函数调用定义为汇聚点。从 isSink 谓词 看按参数位置分为四类参数位置目标函数典型用途第 0 个参数system、gethostbyname、gethostbyname2、gethostbyname_r、getaddrinfo、X509_load_http、X509_CRL_load_http命令执行、DNS 解析、X.509 证书的 HTTP 加载第 1 个参数send、URLDownloadToFile、URLDownloadToCacheFile套接字发送、URL 下载Windows第 2 个参数curl_easy_setopt、getnameinfolibcurl 选项设置、地址转换第 3 个参数ShellExecute、ShellExecuteA、ShellExecuteWWindows Shell 执行函数名匹配采用hasGlobalOrStdName即要求函数具有全局或标准库名称避免与用户自定义的同名函数混淆。误报控制私有主机名豁免机制http://并非在所有场景下都是问题访问 localhost、内网保留地址等私有主机时流量不经过公网明文传输风险显著降低。查询通过PrivateHostName类见 源码 L26-L31对此做了专门豁免其匹配正则如下(?i)localhost(?:[:/?#].*)? |127\.0\.0\.1(?:[:/?#].*)? |10(?:\.[0-9]){3}(?:[:/?#].*)? |172\.16(?:\.[0-9]){2}(?:[:/?#].*)? |192.168(?:\.[0-9]){2}(?:[:/?#].*)? |\[?0:0:0:0:0:0:0:1\]?(?:[:/?#].*)? |\[?::1\]?(?:[:/?#].*)?该正则以大小写不敏感(?i)方式匹配主机名localhostIPv4 保留地址127.0.0.1回环、10.x.x.x、172.16.x.x、192.168.x.x私有网段IPv6 保留地址0:0:0:0:0:0:0:1与::1回环地址。正则只匹配 URL 的主机部分允许紧跟:端口、/路径、?查询、#片段因此无需额外判断端口。属于这些私有主机名的http://URL 不作为污点源从而显著降低内网/本机场景的误报。实战示例正确与错误的写法仓库中的 UseOfHttp.cpp 给出了最直接的对比示例void openUrl(char *url) { // ... } openUrl(http://example.com); // BAD openUrl(https://example.com); // GOOD: Opening a connection to a URL using HTTPS enforces SSL.同一段代码展示了两种打开连接的方式使用http://example.com构造 URL 时连接未加密属于不安全写法BAD改用https://example.com后连接为 SSL 加密GOOD。对应的 qhelp 文档 在 recommendation 一节明确指出构造 URL 时应确保使用 HTTPS 而非 HTTP从而保证基于该 URL 建立的连接是安全的 SSL 连接。在安全背景上该查询关联 CWE-319Cleartext Transmission of Sensitive Information与 CWE-345Insufficient Verification of Data Authenticity并对应 OWASP Top 10 中与软件与数据完整性相关的分类qhelp 的 references 一节给出了 OWASP Transport Layer Protection Cheat Sheet 等参考。如何运行该查询该查询位于 C 查询包的Security/CWE/CWE-319/目录下可通过 CodeQL CLI 单独运行或随查询包分析# 方式一对已建好的数据库直接运行单条查询 codeql query run cpp/ql/src/Security/CWE/CWE-319/UseOfHttp.ql --databasedb # 方式二随 cpp 查询包分析按查询 ID 过滤结果 codeql database analyze db --formatsarif-latest --outputresults.sarif \ codeql/cpp-queries --search-path查询包路径运行后可在 SARIF 结果中按规则 IDcpp/non-https-url检索告警由于查询是path-problem类型SARIF 中会附带完整的污点传播路径edges/nodes便于人工确认问题是否真实存在。测试验证仓库中的回归用例查询并非仅停留在实现层面仓库为其配备了完整的回归测试。测试目录cpp/ql/test/query-tests/Security/CWE/CWE-319/UseOfHttp/下包含UseOfHttp.qlref指向被测查询的引用文件UseOfHttp.expectedqltest 的预期输出。从 expected 文件 可以看到测试覆盖了大量真实传播场景跨函数传播http://example.com经参数传入openUrl后到达send调用如test.cpp:11的url变量流向test.cpp:15的汇聚点经全局变量/局部变量/数组成员传播污点经url_g全局指针、url_l局部指针、数组访问等中间载体层层传递经函数返回与结构体字段传播DataFlowFunction、TaintFunction等 provenance 标注显示污点可穿过函数边界如test.cpp:46的http://拼入缓冲区再流向url字符串字面量直接作为汇聚点参数如test.cpp:24、test.cpp:28、test.cpp:35、test.cpp:36、test.cpp:110处的http://example.com直接出现在 URL 消费调用中。该 expected 文件共记录了 6 条 select 结果全部以This URL may be constructed with the HTTP protocol.作为告警消息结尾与查询实现完全一致。后续演进0.0.11 的精度提升这条查询在后续版本中持续改进。根据 0.0.11 变更说明 与 CHANGELOG.md 中的对应条目The Failure to use HTTPS URLs (cpp/non-https-url) has been improved reducing false positive results, and its precision has been increased to high.即 0.0.11 版本显著降低了该查询的误报率并将precision从原先的精度提升为high。这解释了为何当前 UseOfHttp.ql 元数据中的 precision 已是high——变更说明、CHANGELOG 与查询源码三者互相印证形成了完整的版本演进证据链。小结cpp/non-https-url是 CodeQL C/C 查询包中一条典型的污点追踪 路径问题安全查询它以 HTTP 字符串字面量为源、以真实消费 URL 的网络与进程调用为汇聚点配合私有主机名豁免与strstr阻断等误报控制手段精准定位本应使用 HTTPS 却使用 HTTP 的代码位置。理解其源/汇聚点设计与演进历史有助于开发者在使用这条查询时正确解读告警并以此为模板理解 CodeQL 中其他同类污点追踪查询的实现范式。赞分享静态分析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点击查看免费下载相关推荐电视遥控器与网页浏览的冲突为什么传统浏览器在电视上总是让你失望电视遥控器与网页浏览的冲突为什么传统浏览器在电视上总是让你失望 当你尝试在智能电视上打开浏览器准备查找菜谱或浏览新闻时却发现光标像被困在迷宫里——方向键移移动开发AWX Named URL 详解从标识符格式协议到 API V2 的源码级实现AWX Named URL 详解从标识符格式协议到 API V2 的源码级实现 Named URL 是 AWXRed Hat Ansible Automat后端运维任务调度CodeQL 的 C/C 弱加密算法查询 cpp/weak-cryptographic-algorithm启发式增强与误报治理详解CodeQL 的 C/C 弱加密算法查询 cpp/weak cryptographic algorithm启发式增强与误报治理详解 本文围绕 CodeQL静态分析SAST应用安全漏洞扫描代码质量上一篇TPFanCtrl2终极指南ThinkPad风扇控制工具教你彻底玩转笔记本散热调节下一篇AssetStudio FBX导出动画与骨骼的完整指南3个核心机制与实战避坑创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表