Finding Heartbleed

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

  • TOC {:toc}

Prerequisites

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

[Getting Started]: {{ site.baseurl }}/getting-started/ [libFuzzer和AFL++]: {{ site.baseurl }}/setting-up-fuzzing/libfuzzer-and-afl/ [编译器段落]: {{ site.baseurl }}/setting-up-fuzzing/libfuzzer-and-afl/#compiler

Building a libFuzzer target for OpenSSL

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

  1. # 下载和解压一份受漏洞影响的OpenSSL版本代码
  2. curl -O https://ftp.openssl.org/source/old/1.0.1/openssl-1.0.1f.tar.gz
  3. tar xf openssl-1.0.1f.tar.gz
  4. # 构建带有ASan和fuzzer插装的OpenSSL
  5. cd openssl-1.0.1f/
  6. ./config
  7. # $CC必须指向clang二进制文件, 如何设置请查看上述"编译器段落"链接
  8. make CC="$CC -g -fsanitize=address,fuzzer-no-link"
  9. cd ..
  10. # 下载fuzz target及其依赖的数据.
  11. curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/handshake-fuzzer.cc
  12. curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/server.key
  13. curl -O https://raw.githubusercontent.com/google/clusterfuzz/master/docs/setting-up-fuzzing/heartbleed/server.pem
  14. # 构建用于ClusterFuzz的OpenSSL fuzz target ($CXX需要指向clang++二进制文件):
  15. $CXX -g handshake-fuzzer.cc -fsanitize=address,fuzzer openssl-1.0.1f/libssl.a \
  16. openssl-1.0.1f/libcrypto.a -std=c++17 -Iopenssl-1.0.1f/include/ -lstdc++fs \
  17. -ldl -lstdc++ -o handshake-fuzzer
  18. 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发现的心脏滴血漏洞.

[bot logs]: {{ site.baseurl }}/getting-started/local-instance/#viewing-logs [local ClusterFuzz]: {{ site.baseurl }}/getting-started/local-instance/ [production instance of ClusterFuzz]: {{ site.baseurl }}/production-setup/clusterfuzz/