2020冬季实习项目亮点:安全工具开发与优化全解析

本文详细介绍了Trail of Bits 2020冬季实习项目中多位实习生参与的信息安全工具开发与优化工作,涵盖Anvill反编译器、DeepState模糊测试框架、Manticore符号执行工具等多个关键技术领域的具体实现与改进。

新兴人才:2020年冬季实习亮点 - Trail of Bits博客

Trail of Bits冬季实习项目

Trail of Bits冬季实习是我们的冬季实习计划,我们邀请10-15名学生在寒假期间加入我们,开展对信息安全有意义的短期项目。他们与导师远程合作,创建或改进解决单一有影响力问题的工具。这些带薪实习为学生信息安全工程师提供了真实的行业经验,还为他们的简历增添了发表成果——有时甚至能获得我们的工作机会(恭喜Samuel Caccavale!)。

以下是2020年部分冬季实习生的项目亮点。

Aaron Yoo—Anvill反编译器

加州大学洛杉矶分校

这个寒假,我为Anvill反编译器添加了一个工具,为LLVM位码函数生成“JSON规范”。这些位码衍生的规范告诉Anvill重要值(如函数参数和返回值)的物理位置(寄存器或内存)。Anvill依赖此位置信息,智能地将机器代码提升为高质量、易于分析的LLVM位码。

典型规范如下:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
{
    "arch": "amd64",
    "functions": [
        {
            "demangled_name": "test(long, long)",
            "name": "_Z4testll",
            "parameters": [
                {
                    "name": "param1",
                    "register": "RDI",
                    "type": "l"
                },
...

总的来说,我愉快地学习了大量关于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的使用为不安全:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
package main

import ("fmt")

func main() {
    var i interface{} = "foo"

    safe, ok := i.(string)
    if ok {
        fmt.Println(safe)
    }

    unsafe, ok := i.(string)
    fmt.Println(ok)
    if true {
        fmt.Println(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支持对其进

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计