当前位置: 首页 > news >正文

使用Clang静态分析技术追踪Heartbleed漏洞

使用静态分析和Clang寻找Heartbleed漏洞

背景

周五晚上我斟了一杯麦卡伦15年威士忌,决定编写一个能够检测Heartbleed漏洞的静态检查器。我决定将其实现为树外Clang分析器插件,先在包含Heartbleed漏洞特征的小型函数上进行测试,最后在存在漏洞的OpenSSL代码库上进行验证。

Clang项目随编译器提供了分析基础设施,通过scan-build调用。它会挂钩现有的make系统,将clang分析器插入构建过程,分析器使用与编译器相同的参数调用。这样,分析器可以"访问"在clang下编译的每个编译单元。Clang分析器存在一些限制,我将在讨论部分提及。

策略

Coverity最近提出了一种静态识别Heartbleed的方法,即将ntohl和ntohs调用的返回值标记为输入数据。对像OpenSSL这样的大型状态机进行静态分析时,分析器要么需要了解状态机以跟踪整个程序中受攻击者影响的值,要么需要在程序中添加注解来指示输入数据的使用位置。

我们的clang分析器插件应该:识别程序中通过ntohl写入变量的位置,对其进行污点标记,然后在这些污点值被用作memcpy的大小参数时发出警报。但这样可能产生误报,我们还需要在调用位置检查污点值的约束条件:如果污点值没有受到程序逻辑的约束,并且被用作memcpy参数,就报告漏洞。

Clang分析器细节

Clang分析器采用符号执行来分析C/C++程序。其底层对程序状态进行符号/抽象探索,这种探索是流敏感和路径敏感的。分析器为每条程序路径维护一个"状态"对象,其中包含该路径上程序执行的约束和事实。

当分析器遇到如下代码片段时:

int data = ntohl(pkt_data);
if(data >= 0 && data < sizeof(global_arr)) {// CASE A
} else {// CASE B
}

状态在if语句处分裂为两个不同状态A和B。在状态A中,data有特定范围的约束,在状态B中则有相反的约束。

实现

分析器作为C++类实现,通过定义不同的"check"函数来接收分析器探索程序状态时的通知。我们的实现分为三个阶段:

  1. 识别ntohl/ntohs调用
  2. 污点标记这些调用的返回值
  3. 识别污点数据的无约束使用

通过checkPostCall访问器实现前两个阶段:

void NetworkTaintChecker::checkPostCall(const CallEvent &Call,
CheckerContext &C) const {// 识别ntohl/ntohs调用并污点标记返回值
}

通过checkPreCall访问器实现第三阶段:

void NetworkTaintChecker::checkPreCall(const CallEvent &Call,
CheckerContext &C) const {// 检查memcpy调用中是否使用了无约束的污点值
}

实现陷阱

OpenSSL实际上不使用ntohs/ntohl,而是使用重新实现字节交换逻辑的n2s/n2l宏。此外,clang在创建OpenSSL的AST时会将ntohs调用替换为__builtin_pre(__x),这没有标识符信息。

解决方案输出

在演示程序和OpenSSL上的测试结果:

$ cat demo2.c
# 示例代码包含ntohl和memcpy调用$ ../docheck.sh
demo2.c:30:7: warning: Tainted, unconstrained value used in memcpy size
1 warning generated.

分析器成功在OpenSSL中存在Heartbleed漏洞的两个位置都发现了问题。

讨论

该方法需要改进,我们对污点值是否"适当"约束的推理还很粗糙。有时这是最好的选择——如果分析不知道特定缓冲区的大小,向分析人员显示"这个值可能大于5000并被用作memcpy参数,这样安全吗?"就足够了。

我不喜欢clang分析器基于AST操作的局限性,但很喜欢其路径约束接口。一旦理解如何将问题转化为询问状态新约束是否可行,编写新分析就变得很直接。

编辑:代码已发布到Github
更多精彩内容 请关注我的个人公众号 公众号(办公AI智能小助手)
公众号二维码

http://www.zskr.cn/news/3685.html

相关文章:

  • 川土微CA-IF1051S、CA-IF1051VS 支持CAN FD
  • 十六、异常和中断的响应过程
  • 关于前端的一些疑问整理(标签属性值和符号)
  • 思考 | 躺平者的本质和区别
  • ECT-OS-JiuHuaShan框架元推理,为何超乎想象,难以置信?
  • ECT-OS-JiuHuaShan框架元推理,其运行与推理,是自指自洽性的唯一证明
  • 配置gemini
  • 基于chrony的NTP校时配置方法
  • ECT-OS-JiuHuaShan框架元推理,就是普罗米修斯主义,穷神知化
  • UI/UX 桌面操作系统应该做好的几个功能
  • 完整教程:1.1 汽车运行滚动阻力
  • 鸿蒙用户首选项数据持久化
  • 基于Transformer的预训练大语言模型,如何区分文本位置?
  • UE RPC介绍
  • JS监听DOM元素的变化
  • CF1485F Copy or Prefix Sum
  • 云斗八月银组做题记录
  • 题解:P3323 [SDOI2015] 旅行计划
  • GAS_Aura-Implementing Auto Running
  • 深入解析:PostgreSQL 视图与物化视图(View / Materialized View)详解
  • win11专业版如何设置窗口不叠加的问题
  • JBoltAI:解锁企业AI应用开发新范式,驱动数智化升级核心引擎
  • kmp
  • NKOJ全TJ计划——NP11793
  • JBoltAI函数调用技术:自然语言即可查询数据库,重构企业数据交互方式
  • 题解:CF645B Mischievous Mess Makers
  • NKOJ全TJ计划——NP11792
  • 完整教程:Photo Lab PRO 图片编辑器 功能解锁版
  • Ubuntu 18.04 虚拟机 VScode无法正常输入中文解决办法
  • qoj1847 Elephants