该存储库实现了一种工具来验证是否确保补丁以跟踪等效性(PATE)。
目的是证明应用于二进制文件的安全补丁仅删除不良行为,或者以其他方式为补丁的开发人员精确地表征它们。验证者支持PowerPC和Aarch32二进制文件(目前需要静态链接的精灵二进制文件)。
最快入门的方法是构建Docker映像并通过Docker使用该工具。有关更深入的构建说明,请参见下面的开发部分。
首先,使用命令构建Docker映像:
Docker Build - Platform Linux/AMD64。 -t pate
接下来,在一个示例上运行验证者:
docker run -rm -rm -it -platform linux/amd64 -v“ $(pwd)”/tests/tests/intects/packet/exe:/target pate -original/target/packet.exe.exe-patched/patched/targeted/target/target/packet.packet.packet.patched.exe -s parse_packe_packet_packet_packet_packet_packet_packet
验证者接受以下命令行参数:
-H, - 帮助显示此帮助文本
-o, - 原始EXE原始二进制
-p, - 修补的EXE修补二进制
-b, - BlockInfo FileName Block信息与二进制文件有关
-s, - 使用此符号从函数中从功能分析开始分析
-d, - nodiscovery不要基于
呼叫。
- 固定器ARG smt求解器用于解决验证
状况。 CVC4,YICES或Z3之一
(默认:YICES)
- 进入QUAL ARG ARG的超时验证单个目标秒
(默认:300)
- 她的timeT arg arg arg在几秒钟内验证启发式目标的超时
(默认:10)
- 原始的nvill hints arg
解析代码发现的砧座规范
提示
- 斑点的嵌入刺激
解析代码发现的砧座规范
提示
- 原始培训义gr
解析包含概率功能的JSON文件
名称/地址提示
- 绘制的杂化义gr
解析包含概率功能的JSON文件
名称/地址提示
- 原始csv功能刺激arg
解析包含功能名称/地址的CSV文件
提示
- 绘制的csv功能性hints arg
解析包含功能名称/地址的CSV文件
提示
- 原始-BSI Hints Arg Parse一个包含功能名称/地址的JSON文件
提示
-patched-bsi hints arg parse一个包含功能名称/地址的JSON文件
提示
- 不涉及识别的矮人不会从矮人的信息中提取元数据
二进制
-v, - 冗长grogity arg登录输出的详细性(默认:info)
-Save-Macaw-CFGS dir保存金刚鹦鹉CFGS到提供的目录
- 解决方案互动文件
在符号期间保存与SMT求解器的交互
执行此文件
- 座舱 - 萨森文件
将有趣的证明结果保存到JSON中的文件
格式
- 文件文件文件一个文件以将调试日志保存到
-e, - errormode arg agr verifier错误处理模式
(默认:throwonanyfailure)
-r, - Rescopemode ARG变量撤退故障处理模式
(默认:ThroneQrescopeFailure)
- 划分未命名的函数跳过无符号的功能
- 分支对照流
<epreced>
- 靶标-Equiv-regs arg计算的等效条件足以
在给定的寄存器上建立平等
TopLevel入口点返回。 <epreced>
- 加载ELF时
- json-toplevel在JSON-OUTPUT模式下运行Toplevel(交互式模式)
仅有的)
- 加载时,仅阅读仅段落arg arg arg arm标记段为仅读取(0索引)
精灵
- 订阅文件名将金刚鹦鹉CFG保存到提供的目录
- Assume-stack-Scope添加有关堆栈框架范围的其他假设
在功能通话中(不安全)
- 埃尼尔 - 瓦恩斯arg不要提出任何给定的警告类型
- 始终通过假设来解决分类器 - 返回始终可以解决分类器失败
如果可能的话,功能将返回。
快速启动部分描述了使用Docker容器在测试案例上运行验证者的命令。本节将涵盖其他方案的一些有用命令。
如果您有验证者docker映像的tar文件,则可以使用命令安装它:
Docker Load -I/Path/to/pate.tar
之后,通过Docker运行验证者:
docker run -rm -rm -it-platform linux/amd64 pate - -help
为了利用带有Docker的验证者,将本地文件系统上的目录映射到Docker容器中以保存输出文件很有用。假设您的原始和修补的二进制文件分别为original.exe和patched.exe :
mkdir verifierdata
CP Original.exe Patched.exe VerifierData/
docker run -rm -rm -it-platform linux/amd64
-v`pwd`/verifierdata`:/verifierdata pate
-original /verifierdata/original.exe
-patched /verifierdata/patched.exe
-Proof-Summary-Json /VerifierData/Report.json
-log-file /verifierdata /pate.log
-Save-Macaw-CFGS /verifierdata /cfgs
此命令将在两个二进制文件上运行验证程序,然后将您放入读取版循环中,您可以在其中交互式探索验证者的输出。
默认情况下,验证者开始从正式的程序入口点验证。这通常不是很有用(对于具有大型_start的复杂二进制文件而言,这会给我们的代码发现带来问题)。此外,对于已知(或至少预期的)影响范围的变化,仅分析受影响功能的速度明显更快。相反,要指定一个分析入口点,传递-s <function_symbol>选项将从与给定符号相对应的函数启动分析。请注意,这需要为二进制文件提供函数符号(作为嵌入式调试符号,或以一种提示格式分别提供函数符号)。
虽然不健全,但有时将功能调用视为no-op是有用的。例如,忽略没有改变并且不可能对正确性产生影响的大型功能(例如,来自受信任库的大型加密功能)可以显着提高性能。要使用此功能,请使用--blockinfo选项将配置文件传递给验证者,以确保配置文件包括以下指令:
忽略原始 - 函数= [<address>,...] 忽略斑点 - 函数= [<address>,...]
每个列表是要忽略的函数地址列表。尽管这两个列表是单独指定的,但几乎应该肯定应该在两个二进制文件之间“对齐”(即,忽略原始二进制文件中的函数可能意味着修补了二进制中的相应功能也需要忽略)。
验证者通过两种方式受益于矮人元数据:
为了将矮人的元数据注射到没有它的情况下(例如,剥离的二进制文件),我们建议使用矮人写的工具。作为通过其docker映像使用dwarf-writer的一个例子,假设在砧式JSON格式( target-binary.exe )中存在目标( target-binary.exe.json )和元数据:
Docker Load -i矮人 - 沃特 - docker.tar
mkdir矮人
cp target-binary.exe target-binary.exe.json dwarfwriterdata/
docker run -rm -rm -It -V`PWD`/dwarfwriterdata:/dwwarfwriterdata dwarf -writer
-anvill /dwarfwriterdata/target-binary.exe.json
/dwarfwriterdata/target-binary.exe
/dwarfwriterdata/target-binary-dwarf.exe
这将产生用DwarfWriterData/target-binary-dwarf.exe中的矮人元数据注释的二进制版本。
如果您拥有llvm-dwarfdump工具,则可以使用它来检查生成的矮元素。 pate验证者将自动利用矮元数据提示,除非被指示忽略它们。
验证者将两个二进制文件作为输入:原始二进制和一个修补二进制。假设是将某些面向安全性的补丁应用于原始二进制文件,该补丁在很大程度上保留了其行为,但可能会解决一些不良行为。然后,验证者试图证明这两个二进制文件表现出相同的可观察行为。如果不能,它会产生一个差分摘要,该摘要描述了修补二进制表现出与原始行为不同的条件。这使补丁开发人员能够了解其补丁对程序语义的影响,并评估影响是否仅限于他们预期的执行路径。
验证者不需要用户手动提供的规范;相反,它将原始程序视为所需的行为规范。这种布置使PATE成为关系验证者,因为它将修补的二进制与原件相关联。验证符基于许多现有库,用于二进制代码发现和程序的象征性执行(包括机器代码程序)。粗略地,验证者通过:
PATE工具用Haskell编写,需要GHC编译器(我们使用9.6测试)和Cabal Build工具进行编译。可以通过以下方式从源头构建:
git clone [email protected]:galoisinc/pate.git CD PATE git subsodule Update-开机 CP Cabal.Project.Dist Cabal.Project Cabal配置PKG:PATE ./pate.sh--螺旋
验证者需要在PATH中提供SMT求解器。默认值为yices z3和cvc4也可能起作用,但未定期对PATE进行测试。
该材料基于国防高级研究项目局(DARPA)和海军信息战中中心(NIWC Pacific)在合同编号N66001-20-C-4027下支持的工作。本材料中表达的任何意见,发现和结论或建议都是作者的意见,不一定反映了DARPA和NIWC太平洋的观点。