Link Search Menu Expand Document

Finding Heartbleed

本教程将会向您展示如何使用libFuzzer和Clusterfuzz挖掘Heartbleed漏洞.


Prerequisites

假设您现在正在使用一台Linux bot. 查阅位于libFuzzer和AFL++文档里的编译器段落, 获取以下示例的可用编译器, 并确保设置好了CCCXX环境变量.

Building a libFuzzer target for OpenSSL

运行以下命令构建一个用于OpenSSL的libFuzzer target.

# 下载和解压一份受漏洞影响的OpenSSL版本代码
curl -O https://ftp.openssl.org/source/old/1.0.1/openssl-1.0.1f.tar.gz
tar xf openssl-1.0.1f.tar.gz

# 构建带有ASan和fuzzer插装的OpenSSL
cd openssl-1.0.1f/
./config

# $CC必须指向clang二进制文件, 如何设置请查看上述"编译器段落"链接
make CC="$CC -g -fsanitize=address,fuzzer-no-link"
cd ..

# 下载fuzz target及其依赖的数据. 
curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/handshake-fuzzer.cc
curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/server.key
curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/server.pem

# 构建用于ClusterFuzz的OpenSSL fuzz target ($CXX需要指向clang++二进制文件):
$CXX -g handshake-fuzzer.cc -fsanitize=address,fuzzer openssl-1.0.1f/libssl.a \
  openssl-1.0.1f/libcrypto.a -std=c++17 -Iopenssl-1.0.1f/include/ -lstdc++fs   \
  -ldl -lstdc++ -o handshake-fuzzer

zip openssl-fuzzer-build.zip handshake-fuzzer server.key server.pem

Uploading the fuzzer to ClusterFuzz

首先我们需要创建一个任务:

  • 导航至Jobs页面.
  • 来到”ADD NEW JOB”表单处.
  • 依照以下内容填充任务信息:
    • 填写“libfuzzer_asan_linux_openssl” 至 “Name”.
    • 填写“LINUX” 至 “Platform”.
    • 填写“libFuzzer” 至 “Select/modify fuzzers”.
    • 填写“libfuzzer”“engine_asan” 至 “Templates”.
    • 填写CORPUS_PRUNE = True 至 “Environment String”.
  • 选择 openssl-fuzzer-build.zip并上传为”Custom Build”.
  • 使用”ADD”按钮将该Job添加至ClusterFuzz.

Fuzzing and seeing results

如果您遵照local ClusterFuzz教程配置好了本地的server和bot实例, 并且同时也没有其他任何fuzzing任务正在运行, 那么您接下来应该就能在bot logs处看到fuzz libFuzzer libfuzzer_asan_linux_openssl的字样. 这代表着ClusterFuzz正在对您构建的代码进行模糊测试. 不久后您就能在日志里看到崩溃栈信息以及字符串AddressSanitizer: heap-buffer-overflow.

如果您遵照的是教程production instance of ClusterFuzz, 那么您可以在Bots页面看到fuzz libFuzzer libfuzzer_asan_linux_openssl字样. 具体花费的时间取决于您可能承担的其他工作负荷.

随后, 您可以转到ClusterFuzz首页(或者Testcases页面), 您将会看到一个标题名为“Heap-buffer-overflow READ{*}”的测试用例. 这就是由ClusterFuzz发现的心脏滴血漏洞.