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

本文介绍了Trail of Bits公司2020年冬季实习项目中多位实习生的工作成果,涵盖Anvill反编译器JSON规范生成、DeepState模糊测试框架修复、Manticore云执行优化、Go代码安全扫描、Mishegos性能提升、Crytic智能合约升级检查以及OpenSSL误用检测工具开发等多个技术领域。

新兴人才: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 action的工作;添加了模糊器测试。
  • 模糊器执行器(前端):统一了参数和输入/输出目录处理,审查了每个模糊器文档,以便执行器设置适当的运行时标志,重新实现了执行前和执行后方法,添加了模糊器可执行文件发现方法(基于FUZZERNAME_HOME环境变量和CLI标志),重新实现了日志记录,修复了编译函数,重写了与模糊器运行时统计相关的方法,重新实现了运行方法(以便定期调用检索统计信息和同步内容的管理例程,并正确处理异常;还添加了清理功能和重启进程的可能性),检查了每个模糊器目录结构和种子同步可能性,并基于此实现了模糊器恢复和修复了集成方法。
  • 模糊器测试:创建了基本测试,检查执行器是否能正确编译以及模糊器是否能找到简单错误;创建了种子同步测试。
  • 文档:将文档拆分为多个文件,并添加了关于模糊器执行器使用和工具编写的章节。

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还应通过套接字上的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等工具忽略的错误。一个不安全代码模式的目标是在检查类型断言是否正常之前使用类型断言值,如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服务)中。由于智能合约在上传后不可变,用户需要能够在需要时升级其合约。为解决此问题,用户可以拥有旧合约、新合约和代理合约。代理合约包含 essentially 函数指针,可以修改以指向新合约。如果上述过程不正确(例如,全局变量对齐错误),则会产生风险。使用Slither,用户可以检查以确保这些风险得到缓解。

集成过程比我想象的要复杂得多,但我仍然成功实现了检查。学习代码库和同时处理它所需的多种语言相当困难,但可以管理。Crytic现在获取所有智能合约的列表并在设置中显示它们,以便可以选择。用户可以选择哪个合约是旧合约、新合约和代理合约。然后对这些合约运行可升级性检查,并将输出以易于分析的JSON格式显示到新的发现页面。

我喜欢在Trail of Bits的时光。我的导师帮助我学习基础设施,同时给我独立工作的机会。我在短时间内获得了重要经验,并学到了许多意想不到会喜欢的主题。

William Wang — OpenSSL和Anselm

加州大学洛杉矶分校

今年冬天,我从事Anselm的工作。OpenSSL是开发人员最受欢迎的密码学库之一,但也非常容易被误用。尽管如此,许多不当使用实例落入特定模式,这就是Anselm的用武之地。我的主要目标是原型化一个检测这些行为的系统。

我大部分时间编写了一个LLVM pass来检测OpenSSL API调用,并形成表示可能执行路径的简化节点图。在较大的代码库中,遍历每个单独的IR块可能耗时。通过首先将图“压缩”到其相关节点(API调用),Anselm支持对其进

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