G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

admin 2024年8月17日13:38:10评论5 views字数 2721阅读9分4秒阅读模式

八月的最后一天为大家推荐的论文是来自宾州州立大学胡宏研究组投稿并完成的的最新成果 VIPER: Spotting Syscall-Guard Variables for Data-Only Attacks,该工作已经发表在USENIX Security 2023。

G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

【背景介绍】

作为传统的程序攻击方法,控制流劫持在一系列针对性的防御措施下变得愈发困难。而新兴的 data-only attack 展现出了成为下一代通用攻击类型的巨大潜力。

G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

上图展示了一个针对 OpenSSH 的 data-only attack。该代码片段用于验证用户名和密码:若正确则将变量 authenticated 设为 1,退出循环并允许用户登录;否则将接收并验证新的用户登录尝试。然而攻击者可以利用第六行 packet_read() 中的一个堆溢出漏洞将 authenticated 强制修改为 1 – 这样即使提供错误的密码也可以成功登录。栈上的局部变量 authenticated 是此攻击中最为关键的一环,其值决定了攻击成功与否,因此作者将其称为 critical data。此前的 data-only attack 相关工作均忽视了自动化识别 critical data 这一关键步骤。在这篇论文中,作者提出并实现了一个名为 VIPER 的框架,用来自动化地查找程序中的一种特殊的 critical data,syscall-guard variable。

【工作概述】

作者首先对当前已知的 17 个 data-only attack 进行分析调查并总结出两个规律。

  • 规律1: 由于无法操纵程序控制流,data-only attack 通常需要依赖安全相关的系统调用(例如execve, unlink, chmod)来提升权限;

  • 规律2: 开发人员往往利用检查语句来守护这些安全相关的系统调用,如上面例子中的 if (authenticated)。

作者将这类检查语句称为 syscall-guard branch,语句中涉及的变量则称为 syscall-guard variable。由于 syscall-guard variable 的值决定了是否要调用安全相关的系统调用,因此属于 data-only attack 中的 critical data。

作者通过遍历分支语句中的变量来搜寻可能的 syscall-guard variable,同时为了准确定位分支语句中变量与系统调用之间的关系,作者提出了名为 Branch Force 的方法并开发了 BranchForcer 来实现这一方法。

G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

如上图所示,给定一个程序输入 I,待测程序首先运行该输入。BranchForcer 会记录下所有执行过的分支语句和系统调用 S。然后 BranchForcer 再次运行该输入 I: 当程序运行到第一条分支语句时,BranchForcer 强制性地翻转该分支语句的结果(true→false 或者 false→true), 并观察是否触发了新的系统调用 S1。如果有新的系统调用 (S1 != S), 则新系统调用是由之前的分支语句反转导致的。BranchForcer 视该分支语句为 syscall-guard branch,其中的变量为 syscall-guard variable。

以此类推,BranchForcer 逐个翻转当前输入能触发的所有分支语句,并将能触发新的系统调用的分支语句及其使用的变量收集起来。在实际使用的时候,通常需要一个高质量的测试用例集合来触发并测试更多的分支语句。在本论文中作者通过收集现有测试用例或使用 fuzzing 的方法来达到较高的分支覆盖率。如何获取高质量的测试用例不在本论文的贡献范围。

在真实的攻击场景中,攻击者无法强制翻转 syscall-guard branch 的目标而只能通过修改 syscall-guard variable 的值来操纵其结果。作者开发了一个名叫 VariableRator 的数据流分析工具来评估每个 syscall-guard variable 能被常见内存漏洞修改的可能性。VariableRator 首先在 LLVM IR 层面上对 syscall-guard variable 进行反向数据流分析并生成数据流图。对于数据流图中的每一个内存节点,VariableRator 会标注该节点在内存中的位置(用来评估修改的难易程度)以及该节点从上一次被赋值到本次被使用之间内存写相关指令的数量(用来评估生命周期中存在内存错误的概率)。

除此之外,作者还通过 unique branch flipping 和 forkserver 来提高 VIPER 的工作效率。

【工具评估】

文章作者使用 VIPER 对 20 个程序进行了测试并从 14 个程序中检测到 36 个 syscall-guard variable,其中34个是此前未知的,属于首次发现。下图给出了发现的详细信息。

G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

作者还对这 36 个 syscall-guard variable 进行了可利用性分析。

  1. 通过GDB中模拟任意内存写的行为来修改这 36个 syscall-guard variable,作者确认均有新的安全相关系统调用被触发;

  2. 通过对这 14 个程序历史上的 CVE 进行调查,作者发现其中 16 个syscall-guard variable的生命周期中存在能提供任意内存写权限的漏洞;

  3. 作者进一步在 SQLite 和 V8 中构造了 4 个真实的 data-only attack,实现了任意命令执行和任意文件删除。

作者还对VIPER的效率进行了评估,下图所示,对于大部分程序,VIPER 能在五分钟内完成测试。

G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

文章地址:https://huhong789.github.io/papers/ye:viper.pdf
代码地址:https://github.com/psu-security-universe/viper
结果复现:https://github.com/PSU-Security-Universe/viper-artifact
真实攻击代码:https://github.com/PSU-Security-Universe/data-only-attacks

V8 攻击演示:https://www.bilibili.com/video/BV1Qp4y1P7fP

【投稿团队介绍】

本文作者均来自于宾夕法尼亚州立大学信息科学与技术学院 (The Pennsylvania State University, College of Information Sciences and Technology) 系统安全实验室 https://ps3lab.github.io/)。在完成本论文时, Hengkai Ye为该院系一年级 PhD 学生, Hong Hu 为该院系助理教授。

原文始发于微信公众号(安全研究GoSSIP):G.O.S.S.I.P 阅读推荐 2023-08-31 VIPER

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年8月17日13:38:10
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   G.O.S.S.I.P 阅读推荐 2023-08-31 VIPERhttp://cn-sec.com/archives/1998495.html

发表评论

匿名网友 填写信息