新兴人才:2020年冬季实习亮点 - Trail of Bits博客
Trail of Bits冬季实习项目
Trail of Bits冬季实习是我们的冬季实习计划,我们邀请10-15名学生在寒假期间加入我们,开展对信息安全有意义的短期项目。他们与导师远程合作,创建或改进解决单一有影响力问题的工具。这些带薪实习为学生信息安全工程师提供了真实的行业经验,还为他们的简历增添了发表成果——有时甚至能获得我们的工作机会(恭喜Samuel Caccavale!)。
以下是2020年部分冬季实习生的项目亮点。
Aaron Yoo—Anvill反编译器
加州大学洛杉矶分校
这个寒假,我为Anvill反编译器添加了一个工具,为LLVM位码函数生成“JSON规范”。这些位码衍生的规范告诉Anvill重要值(如函数参数和返回值)的物理位置(寄存器或内存)。Anvill依赖此位置信息,智能地将机器代码提升为高质量、易于分析的LLVM位码。
典型规范如下:
|
|
总的来说,我愉快地学习了大量关于ABI和使用LLVM编译器基础设施的知识。我看到了我的工具在一些完整的“机器代码到C”反编译示例中的操作,并克服了棘手的障碍,例如单个高级参数或返回值如何跨多个机器级寄存器拆分。我的最终评估:反编译器非常酷!
Paweł Płatek—DeepState和Python
AGH科技大学
我冬季实习项目的主要目标是查找并修复DeepState源代码中Python部分的错误。我发现的大多数错误几乎使得构建DeepState进行模糊测试或使用模糊测试器的执行器变得不可能。现在,构建过程和执行器正常工作,并经过测试和更好的文档记录。我还识别并描述了需要更多工作的地方(在GitHub问题中)。以下是我的DeepState项目详情:
- Cmake—修正构建选项;添加了仅构建示例的选项;添加了编译器检查和对Honggfuzz和Angora的支持;改进了示例的cmake(以便自动找到示例)。
- Docker—将docker构建分为两部分—deepstate-base和deepstate—以便更容易更新环境;添加了多阶段docker构建(以便可以单独更新模糊测试器,无需从头重建所有内容);添加了–jobs支持和Angora。
- CI—重写了构建并将docker镜像推送到使用支持缓存的GitHub操作的作业;添加了模糊测试器测试。
- 模糊测试器执行器(前端)—统一了参数和输入/输出目录处理,审查了每个模糊测试器文档,因此执行器设置了适当的运行时标志,重新实现了执行前和执行后方法,添加了模糊测试器可执行文件发现的方法(基于FUZZERNAME_HOME环境变量和CLI标志),重新实现了日志记录,修复了编译函数,重写了与模糊测试器运行时统计相关的方法,重新实现了运行方法(以便检索统计信息和同步内容的管理例程不时被调用,并且异常得到适当处理;还添加了清理功能和重启进程的可能性),检查了每个模糊测试器目录结构和种子同步可能性,并基于此实现了模糊测试器恢复和修复了集成方法。
- 模糊测试器测试—创建了一个基本测试,检查执行器是否能正确编译以及模糊测试器是否能找到简单错误;创建了种子同步测试。
- 文档—将文档拆分为多个文件,并添加了关于模糊测试器执行器使用和harness编写的章节。
Philip Zhengyuan Wang—Manticore
马里兰大学
在冬季实习期间,我帮助提高了Manticore的多功能性和功能性。具体来说,我将其与Ansible(一个自动化配置框架)和Protobuf(一个序列化库)结合,允许用户在云中运行Manticore,并更好地理解Manticore运行期间发生的情况。
目前,Manticore非常CPU密集型;在本地运行时,它与其他用户进程竞争CPU时间。在远程配置的VM上运行作业,其中更多资源可以转移到Manticore运行,将大大减少这个问题。
为了解决这个问题,我创建了“mcorepv”(Manticore配置器的缩写),一个用于Manticore的CLI和Ansible/DigitalOcean的Python包装器,允许用户选择运行目的地(本地机器/远程droplet)并提供目标Manticore Python脚本或可执行文件以及所有必要的运行时标志。如果用户决定在本地运行作业,mcorepv在用户当前工作目录中执行Manticore分析并记录结果。
如果用户决定远程运行作业,事情变得更有趣—在这种情况下,mcorepv将调用Ansible并执行一个playbook来配置一个新的DigitalOcean droplet,将用户的当前工作目录复制到droplet,并对目标脚本/可执行文件执行Manticore分析。在分析运行时,mcorepv通过Ansible近乎实时地流式传输日志和Manticore的stdout,以便用户可以频繁检查分析进度。
Manticore还应通过socket上的protobuf协议同时向用户流式传输其内部状态列表及其状态(就绪、繁忙、杀死、终止),以更好地描述分析状态和资源消耗(这目前正在进行中)。为了实现这一点,我开发了一个protobuf协议来表示Manticore的内部状态对象并允许序列化,以及一个终端用户界面(TUI)。在droplet上启动后,Manticore启动一个TCP服务器,提供内部状态列表的实时视图。客户端然后可以在本地运行TUI,它将连接到Manticore服务器并显示状态列表。一旦作业完成,Manticore服务器终止,Manticore运行的结果以及所有日志被复制回用户的本地机器,以便进一步检查。
仍有一些工作要做,以确保Manticore在云中无错误运行。例如:
- 必须在droplet和本地机器上设置端口转发,以确保Manticore的服务器和客户端TUI可以通过SSH通信。
- TUI需要额外的优化和改进,以确保用户获得所需的信息量。
- Mcorepv及其Ansible后端需要更严格的测试,以确保它们正常工作。
我很高兴在Trail of Bits的短时间内,我能够帮助Manticore向随时随地运行迈进一步。
图1:概念验证—Manticore TUI向用户显示状态对象列表和日志消息。
Samuel Caccavale—Go
东北大学
在冬季实习期间,我开发了基于AST和SSA的扫描器,以查找Go代码中先前被GoSec和errcheck等工具忽略的错误。一个目标的不安全代码模式是在检查类型断言是否ok之前使用类型断言值,在value, ok := foo.()
中。虽然errcheck将检测未绑定ok值的类型断言(因此如果类型断言失败会导致panic),但它无法彻底检查value的使用是否在ok为true的上下文中。示例重现了errcheck和SSA方法分歧的最简单示例;SSA方法将正确检测safe的使用为安全,unsafe的使用为不安全:
|
|
Taylor Pothast—Mishegos
范德比尔特大学
在冬季实习期间,我通过将队列收集和输出组件从原来的概念验证JSON格式切换到紧凑的二进制格式,提高了mishegos(Trail of Bits的x86_64解码器差分模糊测试器)的性能。
为此,我学习了mishegos的内部工作原理、其内存中的结果表示、二进制解析以及如何编写Kaitai Struct定义。我的工作在我实习的最后一天被合并,现在是mishegos运行的默认输出格式。
为了使我的工作与mishegos的现有分析工具兼容,我还添加了一个辅助实用程序mish2jsonl,用于将新的二进制输出转换为与原始输出格式大部分兼容的JSON形式。最后,我更新了分析工具以处理我在JSON化输出格式中所做的更改,包括每个模糊测试解码器状态的新符号字段。
Thomas Quig—Crytic和Slither
伊利诺伊大学厄巴纳-香槟分校
在Trail of Bits期间,我将Slither的智能合约可升级性检查集成到Crytic,Trail of Bits的以太坊安全CI服务中。由于智能合约在上传时是不可变的,用户如果需要上传,需要能够升级他们的合约。为了解决这个问题,用户可以拥有旧合约、新合约和代理合约。代理合约包含本质上可以修改以指向新合约的函数指针。如果上述过程做得不正确(例如,不正确的全局变量对齐),就会产生风险。使用Slither,用户可以检查以确保这些风险得到缓解。
集成过程比我想象的要复杂得多,但我仍然成功实现了检查。学习代码库和同时工作所需的多种语言相当困难,但可以管理。Crytic现在获取所有智能合约的列表并在设置中显示它们,以便可以选择。用户可以选择哪个合约是旧合约、新合约和代理合约。然后对这些合约运行可升级性检查,输出以易于分析的JSON格式显示到新的发现页面。
我喜欢在Trail of Bits的时光。我的导师帮助我学习基础设施,同时给我独立工作的机会。我在短时间内获得了重要经验,并学习了许多我没想到会喜欢的主题。
William Wang—OpenSSL和Anselm
加州大学洛杉矶分校
这个冬天,我致力于Anselm。OpenSSL是开发人员最流行的密码学库之一,但也惊人地容易被误用。尽管如此,许多不当使用实例落入特定模式,这就是Anselm的用武之地。我的主要目标是原型化一个检测这些行为的系统。
我大部分时间写了一个LLVM传递来检测OpenSSL API调用,并形成一个表示可能执行路径的简化节点图。在更大的代码库中,遍历每个单独的IR块可能耗时。通过首先将图“压缩”到其相关节点(API调用),Anselm支持对其进