关于GWPSan
GWPSan是一款基于数据采样的二进制代码动态安全检测框架,该工具消耗资源非常少,旨在实现适合生产用途的各种二进制代码错误检测。
GWPSan 不会修改执行的代码,而是根据信号处理程序执行动态分析。与非采样动态分析相比,GWPSan 牺牲了性能以换取精度,使其可以在更昂贵的动态分析无法实现的地方(例如在生产中)启用。其理念是,如果总正常运行时间足够长,GWPSan 将检测到非生产测试工作负载通常不会覆盖的代码中的错误。
GWPSan 的灵感来自 GWP-ASan,但它们的设计和实现完全不同。GWP-ASan 要简单得多,仅提供基于采样的堆内存安全错误检测,并且通常嵌入在系统堆分配器中。
GWPSan 和 GWP-ASan 相互补充,其中 GWPSan 旨在成为一个实现动态分析的更通用的框架。
工具安装
广大研究人员可以直接使用下列命令将该项目源码克隆至本地:
git clone https://github.com/google/gwpsan.git
工具使用
要使用 GWPSan,您必须构建 GWPSan 并将其(静态或动态)链接到感兴趣的二进制文件中。对于大多数 GWPSan“工具”,目标二进制文件必须使用其他编译器标志进行编译,以添加所需的元数据部分。GWPSan 目前需要 Clang 18 或更高版本以及 Linux 内核 6.4 或更高版本;目前该工具已实现对 x86-64 和 arm64 架构的支持。构建 GWPSan 需要使用到Bazel。
下列命令可以构建 GWPSan 静态和动态运行时库:
CC=<path to clang-18 or later> CXX=<path to clang++-18 or later> bazel build --action_env=CC="$CC" --action_env=CXX="$CXX" -c opt \ $( [[ $(uname -m) == "x86_64" ]] && echo --config=x86_64 ) \ //gwpsan/unified:libgwpsan.so //gwpsan/unified:gwpsan_archive
如果您的clang和二进制文件已经是版本 18 或更高版本,则可以省略明确设置 CC 和 CXX。GNU C++ 库 (libstdc++) 和 Clang 版本的某些组合可能不兼容;如果遇到问题,请尝试使用 LLVM C++ 库 (libc++),并另外传递--config=libc++参数给 Bazel 命令。
下列命令可以使用静态链接的运行时构建目标二进制文件:
GWPSAN_CFLAGS=-fexperimental-sanitize-metadata=atomics,uar clang++ $GWPSAN_CFLAGS -c example.cpp -o example.o ... clang++ -o example example.o ... \ -Wl,--whole-archive "${GWPSAN_ROOT}/bazel-bin/gwpsan/unified/libgwpsan.a" -Wl,--no-whole-archive
将动态链接的 GWPSan 运行时与已构建GWPSAN_CFLAGS但未静态链接运行时的二进制文件一起使用:
clang++ $GWPSAN_CFLAGS -c example.cpp -o example.o ... clang++ -o example example.o ... LD_PRELOAD="${GWPSAN_ROOT}/bazel-bin/gwpsan/unified/libgwpsan.so" ./example
启用采样和工具
支持的工具包括:
tsan:检测数据竞争,启用和禁用命令为GWPSAN_OPTIONS=tsan=0/1; uar:检测使用后返回错误,启用和禁用命令为GWPSAN_OPTIONS=uar=0/1; lmsan:检测未初始化值的使用,启用和禁用命令为GWPSAN_OPTIONS=lmsan=0/1;
下列命令即可启用所有工具:
GWPSAN_OPTIONS=sample_interval_usec=1000000:halt_on_error:tsan:uar:lmsan
工具测试
测试 GWPSan 更改或新的工具链和内核:
CC=<path to clang-18 or later> CXX=<path to clang++-18 or later> bazel test --action_env=CC="$CC" --action_env=CXX="$CXX" --config=dev \ $( [[ $(uname -m) == "x86_64" ]] && echo --config=x86_64 ) \ //gwpsan/...
许可证协议
本项目的开发与发布遵循Apache-2.0开源许可协议。
项目地址
GWPSan:【GitHub传送门】
参考资料
https://github.com/google/sanitizers/tree/master/gwp-asan/icse2024