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

本文详细介绍Trail of Bits 2020冬季实习项目中七位实习生对安全工具的贡献,包括Anvill反编译器优化、DeepState修复、Manticore云集成、Go代码扫描、Mishegos性能提升、Crytic集成以及OpenSSL误用检测原型开发。

新兴人才:2020冬季实习项目亮点 - 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等工具忽略的错误。一个目标不安全代码模式是在检查类型断言是否正常之前使用类型断言值,如value, ok := foo.(type)。虽然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 设计