没有合适的资源?快使用搜索试试~ 我知道了~
3135本作品采用知识共享署名-非商业性使用-禁止演绎国际4.0许可协议进行许可。PalAnTíR:利用硬件增强的系统可观测性优化攻击预防曾军新加坡国立大学junzeng@comp.nus.edu.sg张楚琪新加坡国立大学chuqiz@comp.nus.edu.sg梁振凯新加坡国立大学liangzk@comp.nus.edu.sg摘要系统审计是攻击起源的基础,可以调查网络攻击的根本原因和后果。然而,在粗粒度的审计日志上进行出处跟踪会受到依赖爆炸造成的虚假因果关系的最近的方法通过使用执行分区或记录和重放技术来增加起源粒度来解决这个问题。不幸的是,它们需要程序插装和/或施加负担不起的开销,这在部署中是不实际的。在本文中,我们提出了PalanTír,一个基于出处的系统,增强了系统的可观测性,使精确和可扩展的at-tack调查 利用硬件辅助处理器跟踪(PT),PalanTír通过基于PT跟踪的污点分析来恢复攻击级别的因果关系,从而优化系统调用级别审计日志中的攻击起源。为了减少污点分析的范围并简化污点传播的复杂性,PalanTír静态地配置程序二进制文件,以识别因果相关的指令以基本块的粗粒度我们对现实生活中的网络攻击的评估战术场景重建我们还证明,帕兰蒂尔可以扩展到大型应用(例如,Nginx和Sendmail)编译从463,510行以上的C/C++代码。CCS概念• 安全和隐私→系统安全。关键词攻击源;系统审计;处理器跟踪ACM参考格式:Jun Zeng,Chuqi Zhang,Zhenkai Liang. 2022. PalanTír:利用硬件增强的系统可观测性优化攻击来源。在2022年ACM SIGSAC计算机和通信安全会议(CCS '22)的支持下,2022年11月7日至11日,美国加利福尼亚州洛杉矶 。ACM ,纽约州纽约市 ,美国,15页。https://doi.org/10.1145/3548606.35605701介绍大型企业(例如,Equifax [3]和Twitter [4])经常是高级网络攻击的目标,导致个人信息泄露或欺诈性地获得金融服务。攻击者已经共 同主要作者。CCS©2022版权归所有者/作者所有。ACM ISBN978-1-4503-9450-5/22/11。https://doi.org/10.1145/3548606.3560570通过在更长的时间跨度内进行攻击,也变得更加隐蔽。例如,Solarwinds黑客攻击在九个多月的时间里没有被发现,并泄露了政府机构和技术公司的敏感数据[8]。为了理解网络攻击背后的动机,一种有前途的方法是重建攻击起源[16,34,42],其中起源图是基于系统调用级审计日志构建的,以调查攻击者如何访问系统以及造成了什么损害。具体地,起源图对系统实体之间的依赖性进行编码,即,进程、文件和网络套接字。一旦检测到受损的系统实体,安全分析师就可以遍历该图以发现攻击的根本原因及其后果[52,53]。然而,基于系统调用日志的起源分析只能跟踪系统中粗粒度的信息流,保守地假设流程的输出依赖于所有先前的输入。因此,基于来源的攻击调查通常会遇到依赖性爆炸问题[55],特别是对于长时间运行的进程。例如,Nginx是一种广泛使用的Web服务器,其中网络请求由工作进程处理假设一个nginx进程收到多个index.html和secret.txt请求。分析师很难区分哪些请求对应于secret.txt,因为它依赖于所有前面的请求。为了解决这个问题,先前的工作将流程中的信息流,例如,通过将一个过程划分为自治的执行单元[55,64,65]。因此,只有一个单位内的审计日志被认为是因果相关的。然而,大多数执行分区的解决方案都需要应用程序插装来标记单元边界,假定修改软件程序的权限,这对于在生产环境中部署是不切实际的[63]。除了调用插装,最近的研究[41,89,90]利用开发人员内置的应用程序日志来识别执行单元。尽管如此,由于缺乏具体的日志规范和指南,应用程序日志的质量并不总是可靠的[31,59],这可能导致误报和漏报执行单元。另一条研究路线采用记录和重放系统[46,47]来记录非确定性程序执行,这些程序执行随后被重放以进行预防级别的动态信息流跟踪(即,污点分析[72])。不幸的是,记录和重放系统也需要仪器,并且通常会对在多核上运行的多线程程序施加无法承受的减速[24]。优化攻击起源的根本问题是如何增强系统的可观测性[82]-一种从外部输出的知识推断系统内部状态的度量。高可观察性的关键是区分流程中的数据流,以实现对CCSJun Zeng,Chuqi Zhang,Zhenkai Liang3136…recvfrom写/home/admin/secret.txt读依赖爆炸通过nginx.install.sh读cp写入Dependency Explosion by wget克隆克隆secret.txtpread…RM取消链接(a)一个简化的起源图。z.z.z.zwritev…bashnginxwgetY.Y.Y.Yrecvfrom…写install.shsecret.txtpread…writevz.z.z.z(b)细颗粒物源。nginxnginxwgetwget图1:水坑攻击。审计日志。然而,收集用于数据流分离的进程的必要运行时信息可能会导致沉重的性能开销。一个实用的解决方案需要产生低开销,不需要修改程序,并与商品系统一起工作。在这项工作中,我们提出了PalanTír,第一个攻击调查系统,利用硬件辅助处理器跟踪(PT),优化攻击起源,有效记录进程的执行跟踪并有效恢复防御级数据流。通过结合系统调用级别的审计日志和防御级别的PT跟踪,PalanTír能够以较低的开销实现精确的攻击取证此外,PT是现代CPU中启用的硬件功能[1,5]它不需要任何软件工具。虽然PT可以提高系统的可观测性攻击证明,南,在设计一个实用的起源跟踪器存在一些挑战。首先,尽管PT允许在指令级完全重构程序执行,但需要优化以避免在指令级污染分析中的过高开销其次,跨进程的PT跟踪定期交错,并且它们的顺序将基于动态程序执行而变化,使得难以将审计日志与PT跟踪相关联。为了克服第一个挑战,我们的关键直觉是识别可以预先计算的任务,降低预防级别出处跟踪的计算复杂性。为此,PalanTír对应用程序二进制文件执行静态分析,以确定可能污染系统调用或被系统调用污染的指令。因此,PalanTír可以选择性地污染PT跟踪中仅与系统调用的审计日志有关的 为了进一步提高效率,PalanTír以基本块的较粗粒度为指令预总结污点传播逻辑。 至于第二个挑战,我们开发了一个内核模块来拦截PT硬件,并将执行跟踪与相应的进程ID(PID)相关联。 为了弥补PT跟踪和审计日志之间的差距,PalanTír从PT跟踪中提取syscall指令,并按顺序将审计日志与它们对齐。此后,通过在系统调用指令之间传播污点,PalanTír能够用预防级别的出处标记审计日志。我们实施PalanTír,并评估其在优化攻击来源方面的有效性,对四个现实世界的网络攻击进行模拟。在测试环境中此外,我们采用了15个常用的Linux应用程序来研究PalanTír 的静态二进制分析的可扩展性。实 验结果表 明,PalanTír有效地捕获细粒度的起源,重建foren-sically准确的攻击场景。此外,PalanTír463,510行C/C++源代码。我们还证明了PalanTír在SPECCPU 2006基准测试中的平均运行时开销为4.5%,在流行的Linux应用程序中为3.7%总之,我们做出了以下贡献:提出了一种基于硬件辅助处理器跟踪(PT)的系统可观测性优化攻击起源的新思想。我们设计了一个可扩展的二进制分析器来静态地识别与审计日志有因果关系的指令,并总结它们的污点传播逻辑,以及一个实用的起源跟踪器,有效地收集PT跟踪并执行细粒度的起源跟踪的选择性污点分析。我们实现了PalanTír,并针对现实世界的网络攻击和常用的Linux应用程序进行了评估 实验结果表明,PalanTír在攻击调查和扩展到复杂应用方面具有很高的有效性和效率。2背景动机在本节中,我们使用真实世界的网络攻击、水坑攻击[70]来说明基于来源的攻击调查中的依赖性爆炸问题然后,我们提出了我们的见解,使用硬件增强的可观测性来解决这个问题。2.1运行实例水坑攻击是一种针对大型企业的广泛网络攻击[2]。它不是直接闯入保护良好的企业网络,而是危及企业员工经常访问的攻击场景。 考虑一个企业中的服务器管理员,他有一天收到了软件安装请求。为了便于软件管理,企业维护一个内部镜像,用于归档软件包的源列表浏览完镜像后,管理员使用wget批量下载所请求的软件。不幸的是,其中一个源已被攻击者破坏,其中原始安装脚本install.sh被替换为恶意脚本。在没有意识到攻击的情况下,她运行恶意的install.sh,将/home/admin/secret. txt复制到文件夹中/usr/share/nginx/html由Nginx托管。此文件夹用作处理日常网络请求的公共Web服务器的内容源因此,攻击者可以通过访问服务器来访问敏感文件为了隐藏攻击足迹,install.sh将删除/usr/share/nginx/html/secret.txt后的数据泄露.2.2攻击调查在收集最新的网络威胁情报报告后,管理员在服务器中发现了一个妥协指标(连接到z.z.z.z),表明潜在入侵的取证证据。为了了解攻击范围,管理员将系统审计框架(Linux Au-dit[10])生成的审计日志解析为起源图。 通过向前和向后遍历图,她可以识别攻击的根本原因及其···PalanTír:利用硬件增强的系统可观测性优化攻击来源CCS3137表1:依赖性扩展解决方案的比较。物源体系数据粒度应用程序工具应用程序日志训练运行[55]第五十五话单元✓✗✓ProTracer [65]单元✓✗✓MPI [64]任务✓✗✗[46]第四十六话 指令✓✗✗RTAG [47]指令✓✗✗MCI [54]任务✗✗✓UISCOPE [89]任务✗✓✗OmegaLog [41]任务✗✓✗ALchemist [90]任务✗✓✗帕兰蒂尔指令✗✗✗后果直观地,起源分析用于连接单独的攻击步骤,重建整个攻击场景以进行调查[52]。图1(a)示出了基于z.z.z.z的向后跟踪产生的简化起源图,其中节点表示系统实体,而矩形、椭圆形和菱形分别表示进程、文件和套接字。边指示依赖性(即,系统调用)与信息流的方向在系统Dependency Explosion.不幸的是,由于系统调用级别的粗粒度日志记录,审计日志上的起源跟踪必须假设流程的输出取决于所有先前的输入[55],即使不存在实际的因果关系。 这会导致依赖性爆炸问题,特别是对于长期运行的流程,这些流程会随着时间的 推 移 积 累 依 赖 性 。 例 如 , 通 过 回 溯 图 1 ( a ) 中 的install.shx.x.x.x和y.y.y.y),使得无法确定恶意软件包来自何处。更糟糕的是,管理员会在z.z.z.z的祖先中发现数百个本地文件,从而无法确定是否或哪些敏感文件被泄露。现有解决方案的局限性 为了缓解依赖性爆炸,最近的工作致力于将流程划分为更细粒度的执行单元[41,55,64]。例如,nginx可以基于其网络请求处理循环的迭代或者,MCI [54]基于具有真实出处的审计日志训练因果模型,并采用它来预测传入日志的真实因果关系在文献的其他地方,记录和重放系统[26]已经被扩展到跟踪细粒度的起源-记录和重放非确定性程序执行并检测程序以将污染从源传播到接收器(即,审计日志的系统调用)[46,47]。然而,我们发现了现有解决方案中的几个缺点,这些缺点总结在表1中。首先,大多数基于执行单元(或任务)划分的方法需要专家知识来识别单元边界,并使用程序配置来标记它们这表明软件供应商必须将其应用程序与仪器一起运送,不幸的是,任何供应商都没有考虑这一点[68]。最近的研究建议用开发人员制作的内置应用程序日志来取代插装[41,89,90]。不幸的是,应用程序日志的质量可能会由于各种因素而高度变化,例如,开发人员 更重要的是,开发人员通常以试错的方式维护应用程序日志,限制了安全解决方案的可靠性。其次,虽然基于模型的方法不需要工具或应用程序日志,它们会受到并发/协作应用程序生成的无序审计日志的 最后,记录和重放系统理论上带来了最显著的好处,因为可以通过在应用程序重放期间执行污点分析来恢复防御级别的起源。然而,由于时间和存储方面的高开销,它们没有被广泛部署此外,它们还需要用于记录非确定性输入和跟踪污点传播的仪器。2.3具有硬件增强的细粒度系统起源考虑到上述局限性,一个理想的解决方案是将细粒度的起源合并到系统审计中,而无需应用程序检测/日志记录。 为此,我们从硬件辅助处理器跟踪(PT),使收集程序执行过程中的控制转移的最新发展的灵感。直观地说,PT构成了非入侵地发现应用程序的执行历史和跟踪指令级数据流的基础因此,我们建议丰富审计日志与预防级别的细节从PT解决细粒度的出处。通过将这种直觉应用到我们的运行示例中,我们的目标是生成图1(b)中的起源图。 它简洁地捕获了www.example.com的祖先(wget连接到y.y.y.y)install.sh和secret.txt的后代(nginx连接到z.z.z.z)。由于大量虚假的因果关系(例如,wget连接到x.x.x.x),我们帮助分析人员快速了解攻击者如何获得对服务器的访问权限并泄漏敏感文件。虽然前景看好,但存在两个主要的技术挑战:(1)使用PT跟踪的有效污点跟踪;(2)审计日志和PT跟踪的有效关联 我们通过两项设计创新来解决这些挑战。为了有效的污点跟踪(第4节),我们首先静态分析应用程序二进制文件,以识别可能到达两个输入的指令(例如,读取)和输出系统调用(例如,写)。 通过这种方式,我们可以选择性地只传播感兴趣的指令的污染,其中审计日志之间的细粒度起源将被解决。此外,我们以较粗的粒度(即,我们设计中的基本块),以便可以预先计算和简化PT迹线上的污点分析 注意,本文可互换地使用污点传播逻辑和污点逻辑。为了关联审计日志和PT跟踪(第5节),我们在运行时将PT跟踪与相应的进程ID(PID)相关联。然后,我们恢复进程执行路径,并确定组成syscall指令。此后,每个进程的系统调用级日志和审计级跟踪可以通过系统调用序列对齐,并且系统调用指令之间的污点传播跟踪系统调用的审计日志之间的细粒度证明。总之,我们的方法背后的核心思想是利用硬件辅助PT来恢复防御级信息流,旨在增强系统对攻击来源的可观察性3设计概述3.1威胁模型在这项工作中,我们认为攻击者的主要目标是操纵或泄露系统中存在的敏感信息。为了实现这一目标,攻击者可能会安装恶意软件,CCSJun Zeng,Chuqi Zhang,Zhenkai Liang3138后门,或利用运行应用程序的漏洞与以前关于攻击起源重建的研究类似[39,40,43,91,92],我们将操作系统内核视为可信计算基础的一部分。硬件木马和侧通道攻击超出了我们的范围,因为它们在系统审计日志中是不可见的。 我们还假设网络攻击是在我们的方法部署之后发起的-系统监控在最初的妥协之前就已经开始了。虽然攻击者可以升级特权以损坏操作系统,但我们假设他/她无法操纵记录特权升级证据的先前日志。3.2PaL anTír Architecture图2展示了我们的方法PalanTír的高级概述。它接收来自LinuxAudit [25]的审计日志以及来自Intel PT [5]的PT跟踪,并生成用于攻击调查的可观察性增强的起源图PalanTír由三个主要的阶段:静态二进制分析(第4节),运行时监控(第4节),第5节)和攻击起源分析(第6节)。在静态分析中,PalanTír首先将应用程序二进制文件提升为中间表示,并构建其控制流图(CFG)和调用图(CG)。然后,它遍历CG以识别在运行时可能到达syscall指令的函数。为了最小化污点分析的范围,PalanTír进一步排除了超越syscall指令通过这种方式,我们可以安全地从分析中删除与系统调用的审计日志无关的指令最后,PalanTír总结了CFG中每个基本块的污染逻辑,这些基本块稍后会被查询以进行污染传播。我们的污点总结基于抽象解释[23],这是一种广泛使用的技术,静态二进制分析[21,51,76],其中具体的程序状态被归入抽象域,程序语义用抽象语义分析。在运行时,PalanTír将应用程序执行的指令捕获为PT跟踪,并通过Linux内核模块将它们与PID相同时,PalanTír还收集内核空间审计框架产生的相应审计日志。我们的攻击调查背后的关键思想是使用指令级PT跟踪来解析系统调用级审计日志的细粒度起源,以便在因果分析之前细化粗粒度依赖关系。具体来说,PalanTír从PT跟踪中恢复程序执行路径,将系统调用指令识别为污点,源和接收器,并通过查询从静态分析导出的污点摘要来选择性地执行污点传播。一旦污染传播完成,PalanTír通过系统调用序列将PT跟踪和审计日志关联起来,从审计日志构建一个全系统起源图,并使用被污染的系统调用指令之后,给定攻击的症状,分析人员可以通过遍历细粒度的起源图来精确地连接攻击步骤4静态二元分析PalanTír的静态分析用于分析应用程序的二进制文件。在高级别上,PalanTír遍历二进制文件以识别污点分析的范围,并生成每个基本块的污点传播逻辑的摘要。具体来说,PalanTír采用angr [78]作为前端,将应用程序的二进制文件提升到VEX IR[77]并构造图2:PaL anTír架构概述。CG和CG。从CG中,PalanTír首先识别与审计日志的系统调用有因果关系的函数,以细化用于污点总结的CFG(第4.1节)。然后,它执行上下文,路径和字段敏感的数据流分析,以基本块的粒度总结污点传播逻辑(第4.2节)。最后,PalanTír将污点摘要存储到内存数据库(Redis [12])中以供快速访问。然而,静态二进制分析通常会受到开销和误报的影响[35,93],这使得它难以同时具有可扩展性和精确性。在下文中,我们将描述PalanTír如何改进其静态分析,以实现高可扩展性和高精度。为了清楚起见,我们使用源代码来解释我们的分析程序,虽然真正的分析是基于二进制的。我们在二进制级别而不是源代码级别执行分析,原因有两个:(1)PT记录CPU执行的二进制指令不幸的是,由于开放性问题,将分析结果从源代码转换回二进制需要不小的努力,例如,编译器优化(2)二进制分析对编程语言和编译器是不可知的,并且可以应用于源代码通常不可用的专有软件。4.1CFG精炼PalanTír通过对PT硬件收集的程序执行跟踪执行污点分析来恢复细粒度的起源一种简单的方法是在完整的PT跟踪上传播污点然而,PT跟踪的量通常很大,在污点分析中强加Chen等人观察到,只有程序的一个片段通过引入污点源、传播污点或到达污点汇来对污点分析做出贡献[20]。受此观察的启发,我们建议通过过滤不影响系统调用之间的污点传播的函数来细化PT跟踪上的污点分析的范围。为了说明这一点,考虑跟踪Web服务器的细粒度起源显然,只应包括与处理网络和文件操作相关的功能。其余功能(例如,网络调度)可以被安全地跳过而不牺牲起源精度。为此,PalanTír试图遍历程序的CG来定位与审计日志的系统调用有因果关系的我们将这些函数称为对数据敏感的函数。 值得注意的是,并非所有审计日志的系统调用都与出处跟踪有关(详细信息请参见[9])。例如,进程初始化不断地加载只读资源,但这些资源是起源图标记系统因果关系跟踪威胁报警攻击步骤被污染的SYSCALL用户空间内核空间英特尔处理器跟踪(PT)PT跟踪App过程Linux内核审计审核日志运行时监控执行路径重构选择性污染攻击来源分析污点分析物源分析静态二进制分析前端CFG精炼污点总结二进制污染逻辑总结PalanTír:利用硬件增强的系统可观测性优化攻击来源CCS3139F()下一页FP1ngx_output_chain(ngx_output_chain_ctx_t*ctx,.){2ngx_chain_t*cl,*out,**last_out;3return NULL;4return out;5//调用pread(fd,ctx->buf->pos,.)6ngx_output_chain_copy_buf(ctx);7//将堆缓冲区分配给cl8cl = ngx_alloc_chain_link(ctx->pool);9cl->buf = ctx->buf;10*last_out = cl;11// out:= *last_out:= cl12ngx_linux_sendfile_chain(out,.);13}1ngx_linux_sendfile_chain(ngx_chain_t*in,...){2ngx_iovec_theader;3struct iovecheader [SIZE];4header.iovs = header;5ngx_output_chain_to_iovec(header,in,.);6//调用writev(fd,header->iovs,.)sort(sort,...);}781ngx_output_chain_to_iovec(ngx_iovec_t*vec,ngx_chain_t*in..){2iov =(iovec*)vec->iovs[n++];iov->iov_base =(void*)in->buf->pos;}34(a) Code Snippets(b)图3:一个正在运行的污点逻辑总结示例。(a)简化的代码片段表示nginx-1.20.2如何dles HTTP(S)请求。(b)调用Graph的代码片段。A:ngx_output_chain; B:ngx_output_chain_copy_buf; C:ngx_alloc_chain_link; D:ngx_linux_sendfile_chain;E:ngx_output_chain_to_iovec; F:ngx_writev。节点n ∈ nNoden ∈ C$.nodes用于污染传播。为了解释污点摘要,我们使用以下x86-64代码片段(采用Intel语法)进行说明。;input rbp:rbp0,rsi:rsi0,rcx:rcx0Noden ∈ C$A.nodes节点n∈$le#$节点n ∈ #movrbx,rbplearax,[rbx +rsi]mov rsi,[rbp+0x80]add rbx,rcxT(rax):= T(rbp0)|T(rsi0)T(rsi):= T([rbp0 + 0x80])T(rbx):= T(rbp0)|T(rcx0)图4:CFG Refinement的运行示例攻击取证的视角[79]。因此,我们在遍历CG之前将它们过滤掉。从我们的前端给定一个CG,PalanTír首先通过在CG上构建一个深度优先搜索树并删除所有后边缘来将其转换为有向无环图之后,PalanTír为输入系统调用的函数计算两个传递闭包(i.e.、读取,接收)和输出系统调用(即,写,发送)。传递闭包中的节点表示可以到达输入或输出系统调用的函数,称为系统调用可达函数。识别发出系统调用的函数的一种直观方法是在CFG中搜索syscall指令。然而,我们观察到,程序通常不进行直接的系统调用,而是利用标准库,等同功能。因此,PalanTír还提取所有对libc的函数调用,并分析它们可能的系统调用。可以调用。通过进一步计算两个transi的交集的闭包,我们得到了一个敏感的调用图CGA,其中节点到达输入和输出系统调用。下一个,帕兰提尔T reд表示reд的污点标记,reд0表示reд的初始污点状态。直观地说,污点摘要表示污点如何基于其输入状态在基本块内在详细讨论之前,我们首先介绍实现可扩展和精确的污点摘要的挑战如下:(1)识别未初始化变量的内存别名。由于CFG精炼已经删除了污点分析范围之外的函数,因此我们的摘要通常从全局结构和/或函数参数未知的未初始化状态开始;(2)嵌套结构的内存引用。 数据依赖性可能嵌套在结构指针中,需要跨指针丰富的结构跟踪数据流;(3)减少计算开销。已知静态分析过度近似程序行为,导致计算期间变量值数量的爆炸;(4)跟踪范围外函数的依赖关系污染作用域仅包括到达CG中的系统调用的函数,但是作用域外的函数也可能有助于污染分析(例如,传播污染源)。为了说明这些挑战,我们在图3中提供了一个来自Nginx的运行示例。假设函数A(ngx_output_chain)从CGA中提取所有叶节点N叶,并识别它们的最低是污染作用域的起点,其参数ctx是结构指针对PalanTír未知。如果帕兰提尔不能确定-公共祖先作为污染作用域的起始函数最后,我们建立了一个污染的范围与一个开始的功能和它的后续syscall-reachable功能。图4展示了CFG细化过程的一个示例,我们在[9]中将4.2污染逻辑概述完成CFG细化后,PalanTír执行数据流分析以生成污点摘要。在这里,污染逻辑可以在不同的粒度上进行总结:指令、基本块或功能 由于PT在运行时记录控制流传输,因此PT跟踪可以被视为基本块的序列。因此,我们采用基本块作为污点摘要的原始粒度,以便PalanTír可以将污点摘要无缝映射到PT跟踪如 果 ctx 引 用 的 内 存 被 格 式 化 , 则 当 函 数 A 调 用 函 数 B(ngx_output_chain_copy_buf)时,数据依赖将此外,由于函数B调用扩展系统调用来将请求的HTTP资源存储在ctx->buf->pos中,因此PalanTír必须能够跟踪从ctx到pos的嵌套指针中的数据流。否则,PalanTír会错过扩展的依赖性。此外,函数C(ngx_alloc_chain_link)超出了污点分析的范围,因为它无法到达任何系统调用。但是,函数C将堆缓冲区分配给cl,稍后系统调用writev将使用该缓冲区发送数据。因此,在污点分析中跳过此函数将丢失pread和writev之间的依赖性。为了应对这些挑战,我们的解决方案是初始化未知变量的符号值,并启用多级指针dereference,他们在嵌套结构的分析对于范围外一143BCD2567PreadEFWritev一BHCDJEFG我读写NNNNNCCSJun Zeng,Chuqi Zhang,Zhenkai Liang3140{h2,q,q i}否则⇢ÿ⇢(–∈∈(⊆ ⟨⟩∈⊆∈[客户端][客户端]()下一页H()[客户端]G()→∈()下一页⊆⊆⊆⊆(∈)⟨⟩(∈)∈()下一页【】【】【】[客户端]()下一页[]()[]–.F40:符号Y=B~< 1>;|21122|[Y](21,22是整数)抽象变量I=Y|>>|什么?G((,CONST(2))=n{h2,{Global(2)},qi}如果2230C0_B42C8>=(22Z)抽象区域A为.堆(Z)(Z:整数集)全局(Z)G((,BinOP(41,42))=OP((,41,42))当OP2{AD,AD,... 个文件夹([0](A46)如果A46 2([0]污点标签堆栈(Z)符号(Z)G((,GET(A46))=ABB86=+0;B((,)>(~1>;(A46),A46) 其他U=)(A46 B)|)(B~B20;;B)|)(A)抽象值V=I2A2UG((,LOAD(4))=E2G((,4){L>03M4<((,0)|02E[1]}寄存器映射R=A46B!2V内存映射M=A!2VL>03M4((,0)=([1](0)如果02( [1]ABB86=+0;B((,[)>( ~1>;(0) ],0)反之亦然执行上下文C为[2B0,.,2B8]|......这是什么?(2B8:第i个调用位置)抽象状态S=RMC图6:抽象域。函数,我们在有限的调用深度内跟踪它们的数据流依赖关系ABB86=+0;B((,~,C)={h~,{SymLoc(~,0)},{)(C) }i}(a) 表达式求值:G(S,e)→ V。H((,PUT(A46,4))=([0]›([0][A46!G((,4) ]H((,S TORE(41,42))=([1]›*p30 C4(([1],{E[1]|E2G((,41)},{E|E2G((,42) })M[0BCA>=6 +],如果A={0}M[01-! +].. . 【0=--!+号]如果A={01, . . . ,0=}[23][24][25][ 26][27][28][29][*[A!- -一种-{ h E [ 0 ],E [ 1 ],{)(A)} i } ], +上下文和字段敏感。I=8C(C0C4((,,M,)=(›A2RE 2R(A)M[0!02ME 2M(0){hE [0],E[1],{)(0)}i}],4.2.1抽象域。 图6显示了静态分析中使用的抽象域。我们将抽象变量(iI)表示为符号(yY),它表示符号或具体变量。遵循欠约束符号表达式[29,74,75]中使用的策略,我们为未知函数参数和/或全局结构创建符号变量。我们还可以对它们进行线性和dereference操作,以生成新的符号。例如,图3中的结构指针ctx及其第一成员ctx->buf->pos表示为符号ctx_s和[[ctx_s]](即,例如,[[ctx_s+ 0x0] + 0x0])。我们的抽象值(v V)由一个抽象变量i组成I),一组抽象区域(AA)和一组污点标记(UU).形式上,我们将其定义为三元组v:=i,A,U:首先,抽象变量i表示一个寄存器或⇠H(调用((,5,2B))=(D<0A 8I4(I=8C(C0C4((,([0],([1],([2]),5,([2])(2B:调用点)(b)评价报表:S,stmt。图7:抽象语义。tupleX的元素例如,抽象值v的v1返回其抽象区域集A。首先,我们定义S,eV来计算给定抽象状态S的表达式e,并返回抽象值集V,如图7a 所示。 对于常量表达式CONST c,其返回值V仅包含单个抽象值v,其污点标记集v 2为空。因此,计算常量表达式很简单:我们检查常量c是否在数据段中如果是,则v1被分配为一个全局地址的集合,否则为空集。存储单元包含。注意,i可以表示具体变量,当i=y(y∈Y,y=c2)时,也可以表示符号变量。第二、我们的设计评估寄存器读取(GET)和内存负载(LOAD)表达式是实现多级指针deref的关键每一抽象区域(A)表示存储器单元的类型(例如,堆栈和堆)以及抽象值V可以指向其位置具体地,Stack(o)表示偏移量o处的栈帧,Heap(o)表示偏移量o处的堆对象,Global(o)表示地址o处的全局单元,并且SymLoc(y,o)表示符号基地址y的偏移量o处的符号存储器地址。第三,污点标记(u U)表示抽象值v内的数据流依赖性。具体地说,标记T re <$re <$s表示来自寄存器re<$s的v回想一下,我们的静态分析总结了基本块粒度上的污点传播逻辑。因此,每个抽象状态(SS)表示在特定执行上下文下的基本块的程序状态。S维护包含抽象值的寄存器映射(RR)和存储器映射(MM)上下文(C C)描述静态分析期间的执行上下文。形式上,我们将抽象状态定义为三元组S:=R,M,C。请注意,PalanTír的静态分析不可避免地过度近似程序行为,因此每个寄存器或内存单元通常包含一组有效/无效的抽象值。类似地,抽象值可以包括要指向的一组有效/无效抽象区域。4.2.2抽象语义。图7显示了我们基于VEX IR定义的抽象语义我们使用X[k]来表示第(k)个符号内存地址(Symbolic Memory Address,SymLoc)抬头一看,当前的S,我们确定目标寄存器RE_D或存储器单元A是否分别在S的如果是,我们直接返回映射中对应的抽象值集。否则,我们将一个新的符号抽象值赋给reд or a。例如,在图3中,假设函数A的参数ctx由寄存器reg传递。 当读取re д时,我们分配一个新的抽象值v,因为它未初始化(不在S中)。更具体地说,我们首先使用ToSymbol re <$创建一个符号来表示其抽象变量v0。 为了清楚起见,我们称之为cr eat dsym bolctx_s。然后,v的由于ctx是一个指针,我们将v的区域集v 1设置为{SymLoctx_s,0}。通过这样做,v1表示一个支持解引用操作的符号区域例如,取消引用ctx->buf(ctx的第一个成员)是评估其目标内存单元为SymLocctx_s,0的内存负载扩展.通过分配符号抽象值,PalanTír可以跟踪数据跨嵌套指针的流依赖性为了可扩展,我们设计了参数Nsym,用于限制在存储器加载中解引用符号指针的最大深度。请注意,这样的深度限制将导致对内存负载表达式的不可靠分析尽管如此,正如我们在8.3节中的评估所证明的,这个限制并没有牺牲攻击调查的精度,这意味着我们不合理的静态分析在法医学上是准确的。.ity。更重要的是,我们设计了PalanTír* p30C4(M,A,+)=PalanTír:利用硬件增强的系统可观测性优化攻击来源CCS3141H()◦G()G(())除此之外,我们将二进制操作定义为BinOP,它执行算术或逻辑操作(例如,ADD,ADD)给出两个表达式e1和e2。为了计算V=S,BinOPe1,e2,我们首先计算两个抽象值集V1=S,e1和V2=S,e2,然后处理二元运算的语义(详见[9])。请注意,在BinOP中,当计算返回的抽象值的抽象区域时,会忽略数组索引也就是说,所有数组元素都被合并到单个抽象区域中(即,数组基)。通过这种方式,PalanTír被设计为对数组不敏感,静态二进制分析中的常见做法[21]。接下来,我们定义S,stmt来计算给定输入状态S的语句stmt,以更新S,如图7b所示。寄存器写(PUT)的语义很简单:PalanTír在给定S的情况下对表达式e求值以获得抽象值集 V , 然 后 用 V 更新 S中的目标寄存 器。 对于存储器 写入(STORE),PalanTír输入两个表达式e1和e2,分别计算目标存储器A的位置及其抽象值V。为了用V更新内存映射M中的内存A,我们在图7b中故意区分强更新和弱更新[27]。当我们的分析在污染作用域中向前执行时,我们首先使用其前任的输出状态的连接来初始化每个基本块然后,我们在输入状态中初始化每个抽象值的污点标记。 在评估块中的每个表达式和语句之后,我们识别块的抽象状态S中的所有寄存器和存储器单元,并提取它们的污点标记集U以制定污点摘要。稍后,我们将每个块的污点摘要转储到内存数据库中,并将其执行上下文和地址(C block_addr)的连接作为键。特别是,当我们的前向分析遇到函数调用时,它会确定目标函数是否在污点分析的范围内如果是,我们为它初始化一个入口状态,并连接它的调用地址cs和执行上下文C,以开始一个新的分析过程。在此分析之后,我们将其所有出口的状态连接起来(例如,[19]见《易经》中的《易经》。由于范围外的函数也可能导致污点传播,因此一种想法是强制分析遍历每个范围外的函数,以确保污点总结的可靠性。然而,这种设计不可避免地由于执行上下文的突发而难以扩展为了在可靠性和可伸缩性之间找到一个最佳点,我们提出了一个可配置的参数决定范围外函数的污点总结的最大调用深度。也就是说,PalanTír在有限的深度内包含范围外的函数调用,以进行污点分析。最后,为了处理外部功能(例如, libc API),我们遵循标准实践[87]来识别调用系统调用的函数(例如,fgets)或分配存储器(例如,malloc)并手动解释它们的语义以污染逻辑总结。5运行时监控在运行时,PalanTír收集审计日志以及PT跟踪。在这里,我们重点介绍英特尔5.1英特尔处理器跟踪为了记录程序的执行历史,基于软件的高性能开销和弱安全属性[87]。因此,我们的设计以英特尔PT为中心,这是一种高效、安全地记录程序执行的硬件功能。程序加载执行后,英特尔PT会生成一个数据包流,对控制传输进行编码。例如,采用-不采用(TNT)分组记录是否采用条件分支,并且目标指令指针(TIP
下载后可阅读完整内容,剩余1页未读,立即下载
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功