#堆栈跟踪 #崩溃 #gdb #核心转储 #分类处理 #测试工具

libcasr

收集崩溃报告、分类处理和估计严重程度

13个稳定版本

2.12.1 2024年8月14日
2.12.0 2024年4月24日
2.11.1 2024年2月9日
2.10.0 2023年12月12日
2.5.1 2023年3月27日

#31 in 调试

Download history 616/week @ 2024-05-03 765/week @ 2024-05-10 1446/week @ 2024-05-17 792/week @ 2024-05-24 847/week @ 2024-05-31 629/week @ 2024-06-07 883/week @ 2024-06-14 486/week @ 2024-06-21 512/week @ 2024-06-28 468/week @ 2024-07-05 941/week @ 2024-07-12 754/week @ 2024-07-19 879/week @ 2024-07-26 838/week @ 2024-08-02 810/week @ 2024-08-09 709/week @ 2024-08-16

3,287 每月下载量
用于 2 crate

Apache-2.0

350KB
6.5K SLoC

Crates.io Documentation codecov License

amd64 aarch64 riscv64 darwin-arm64 fuzzing

CASR: 崩溃分析和严重程度报告

CASR – 收集崩溃(或 UndefinedBehaviorSanitizer 错误)报告、分类处理和估计严重程度。它基于来自 exploitableapport 的想法。

CASR 由以下人员维护:

概述

CASR是一套工具,可以以不同的方式收集崩溃报告。使用casr-core二进制文件来处理coredump。使用casr-san分析ASAN报告或casr-ubsan分析UBSAN报告。尝试使用casr-gdb从gdb获取报告。使用casr-python分析python报告并从Atheris获取报告。使用casr-java分析java报告并从Jazzer获取报告。使用casr-js分析JavaScript报告并从Jazzer.jsjsfuzz获取报告。使用casr-csharp分析C#报告并从Sharpfuzz获取报告。

崩溃报告包含许多有用的信息:对于x86、x86_64、arm32、aarch64、rv32g、rv64g架构,严重性(如可利用性)、操作系统和软件包版本、命令行、堆栈跟踪、寄存器值、反汇编,甚至崩溃出现的地方的源代码片段。报告以JSON格式存储。casr-cli旨在提供TUI来查看报告并将它们转换为SARIF报告。报告分类(去重、聚类)由casr-cluster完成。分类基于gdb-command的堆栈跟踪比较。casr-afl用于分类由AFL++和基于AFL的fuzzer Sharpfuzz发现的崩溃。casr-libfuzzer可以分类由基于libFuzzer的fuzzer(C/C++/go-fuzz/Atheris /Jazzer/Jazzer.js/ jsfuzz)发现的崩溃。casr-dojo允许将新的唯一CASR报告上传到DefectDojo(带有dojo功能)。

严重性类别的说明可以在这里找到。您可以在这里详细了解使用方法。

casr_report

casr_dojo_finding

LibCASR

LibCASR提供了解析堆栈跟踪、收集崩溃报告、分类崩溃(去重和聚类)以及估计崩溃严重性的API。

它可以分析来自不同来源的崩溃

  • AddressSanitizer
  • UndefinedBehaviorSanitizer
  • Gdb输出

和程序语言

  • C/C++
  • Rust
  • Go
  • Python
  • Java
  • JavaScript
  • C#

它可以构建带有exploitable功能的LibCASR,用于估计从gdb收集的崩溃的严重性。要将崩溃报告保存为json,请使用serde功能。

依赖关系

安装运行时依赖项

$ sudo apt install gdb lsb-release

在从源代码构建时安装构建依赖项

$ sudo apt install build-essential clang

安装Rust或更新现有的Rust安装

$ rustup update

安装

下载最新的Linux 64位发布版或按以下说明从源代码构建。

注意。当前MacOS支持为实验性。一些基于Linux的代码,如exploitablecasr-gdb可能无法正常工作。欢迎在此处贡献更多。

从Git仓库构建

$ git clone https://github.com/ispras/casr
$ cargo update
$ cargo build --release

或者您可以直接从crates.io安装Casr

$ cargo install casr

如果您想安装casr-dojo,请添加dojo功能(同样适用于cargo build

$ cargo install -F dojo casr

使用方法

在Docker中运行:CASR禁用地址随机化以提高去重效果,并使用ptrace运行GDB。因此,启动Docker时应该使用--cap-add=SYS_PTRACE --security-opt seccomp=unconfined

从核心转储创建报告

$ casr-core -f casr/tests/casr_tests/bin/core.test_destAv -e casr/tests/casr_tests/bin/test_destAv -o destAv.casrep

从AddressSanitizer输出创建报告

$ clang++ -fsanitize=address -O0 -g casr/tests/casr_tests/test_asan_df.cpp -o test_asan_df
$ casr-san -o asan.casrep -- ./test_asan_df

从UndefinedBehaviorSanitizer输出创建报告

$ clang++ -fsanitize=undefined -O0 -g casr/tests/casr_tests/ubsan/test_ubsan.cpp -o test_ubsan
$ casr-ubsan -i casr/tests/casr_tests/ubsan/input1 -o output -- ./test_ubsan @@
$ casr-cli output

从gdb创建报告

$ casr-gdb -o destAv.gdb.casrep -- casr/tests/casr_tests/bin/test_destAv $(printf 'A%.s' {1..200})

从python创建报告

$ casr-python -o python.casrep -- casr/tests/casr_tests/python/test_casr_python.py

从java创建报告

$ casr-java -o java.casrep -- java casr/tests/casr_tests/java/Test1.java

从JavaScript创建报告

$ casr-js -o js.casrep -- node casr/tests/casr_tests/js/test_casr_js.js

从C#创建报告

$ casr-csharp -o csharp.casrep -- dotnet run --project casr/tests/casr_tests/csharp/test_casr_csharp/test_casr_csharp.csproj

查看报告

$ casr-cli casr/tests/casr_tests/casrep/test_clustering_san/load_fuzzer_crash-120697a7f5b87c03020f321c8526adf0f4bcc2dc.casrep

查看关于崩溃集群的联合统计数据

$ casr-cli casr_reports

将报告转换为SARIF报告

$ casr-cli --sarif out.sarif --tool libfuzzer --source-root /xlnt casr/tests/casr_tests/casrep/test_clustering_san

为读取stdin的程序创建报告

$ casr-san --stdin seed -o san_bin.casrep -- ./san_bin

去重报告

$ casr-cluster -d casr/tests/casr_tests/casrep/test_clustering_gdb out-dedup

聚类报告

$ casr-cluster -c out-dedup out-cluster

在casr-afl的AFL++模糊测试后对崩溃进行分类

$ cp casr/tests/casr_tests/bin/load_afl /tmp/load_afl
$ cp casr/tests/casr_tests/bin/load_sydr /tmp/load_sydr
$ casr-afl -i casr/tests/casr_tests/casrep/afl-out-xlnt -o casr/tests/tmp_tests_casr/casr_afl_out
$ # You may also additionally generate crash reports for uninstrumented binary with casr-gdb
$ casr-afl -i casr/tests/casr_tests/casrep/afl-out-xlnt -o casr/tests/tmp_tests_casr/casr_afl_out -- /tmp/load_sydr @@

在casr-afl的Sharpfuzz模糊测试后对崩溃进行分类

$ cp -r casr/tests/casr_tests/csharp/test_casr_afl_csharp /tmp/test_casr_afl_csharp
$ cp -r casr/tests/casr_tests/csharp/test_casr_afl_csharp_module /tmp/test_casr_afl_csharp_module
$ dotnet publish /tmp/test_casr_afl_csharp/test_casr_afl_csharp.csproj -c Debug -o /tmp/test_casr_afl_csharp/bin
$ casr-afl -i casr/tests/casr_tests/casrep/afl-out-sharpfuzz -o casr/tests/tmp_tests_casr/casr_afl_csharp_out
$ # You may force your own run arguments using --ignore-cmdline
$ casr-afl --ignore-cmdline -i casr/tests/casr_tests/casrep/afl-out-sharpfuzz -o casr/tests/tmp_tests_casr/casr_afl_csharp_out -- dotnet run --no-build --project /tmp/test_casr_afl_csharp/test_casr_afl_csharp.csproj @@

使用casr-libfuzzer对libFuzzer崩溃进行分类

$ casr-libfuzzer -t 30 -i casr/tests/casr_tests/casrep/libfuzzer_crashes_xlnt -o casr/tests/tmp_tests_casr/casr_libfuzzer_out -- casr/tests/casr_tests/bin/load_fuzzer

使用casr-libfuzzer对Atheris崩溃进行分类

$ unzip casr/tests/casr_tests/python/ruamel.zip
$ casr-libfuzzer -i casr/tests/casr_tests/casrep/atheris_crashes_ruamel_yaml -o casr/tests/tmp_tests_casr/casr_libfuzzer_atheris_out -- casr/tests/casr_tests/python/yaml_fuzzer.py

使用casr-libfuzzer对Jazzer.js崩溃进行分类(Jazzer.js安装指南

$ unzip casr/tests/casr_tests/js/xml2js.zip -d xml2js
$ mkdir -p casr/tests/tmp_tests_casr/xml2js_fuzzer_out
$ cp casr/tests/casr_tests/js/test_casr_libfuzzer_jazzer_js_xml2js.js casr/tests/tmp_tests_casr/xml2js_fuzzer_out/xml2js_fuzzer.js
$ sudo npm install xml2js
$ sudo npm install --save-dev @jazzer.js/core
$ casr-libfuzzer -i ./xml2js -o casr/tests/tmp_tests_casr/xml2js_fuzzer_out/out -- npx jazzer casr/tests/tmp_tests_casr/xml2js_fuzzer_out/xml2js_fuzzer.js

将新的唯一CASR报告上传到DefectDojo

$ echo '[product]' > dojo.toml
$ echo 'name = "xlnt"' >> dojo.toml
$ echo '[engagement]' >> dojo.toml
$ echo "name = \"load_fuzzer $(date -Isec)\"" >> dojo.toml
$ echo '[test]' >> dojo.toml
$ echo 'test_type = "CASR DAST Report"' >> dojo.toml
$ casr-dojo -i casr/tests/casr_tests/casrep/test_clustering_san -u https://127.0.0.1:8080 -t 382f5dfdf2a339f7c3bb35442f9deb9b788a98d5 dojo.toml

模糊测试崩溃分类管道

当您有来自模糊测试的崩溃时,可以执行以下步骤

  1. 通过casr-sancasr-gdb(如果没有检测器),casr-pythoncasr-javacasr-jscasr-csharp创建所有崩溃的报告。
  2. 通过casr-cluster -d去重收集到的崩溃报告。
  3. 通过casr-cluster -c聚类去重的崩溃报告。
  4. 通过casr-ubsan创建和去重所有UBSAN错误的报告。
  5. 使用casr-cli查看聚类报告或使用casr-dojo上传它们到DefectDojo

如果您使用AFL++或基于AFL的模糊器Sharpfuzz,管道(不包含casr-ubsancasr-dojo)可以通过casr-afl自动完成。

如果您使用基于libFuzzer的模糊器(C/C++/go-fuzz/Atheris /Jazzer/Jazzer.js/ jsfuzz),管道(不包含casr-ubsancasr-dojo)可以通过casr-libfuzzer自动完成。

贡献

请随意打开问题PRs(特别是关注需要帮助的问题)!我们感谢您的支持!

请遵循以下建议提交您的pull请求

  • 使用稳定版Rust进行编译
  • 使用cargo fmt
  • 检查cargo clippy --all-features --all --tests的输出
  • 运行测试cargo test
  • 如果您更新了任何casr工具的使用,可以简单地运行update_usage.py来正确更改docs/usage.md文件

引用我们

Savidov G., Fedotov A. Casr-Cluster: Crash Clustering for Linux Applications. 2021 Ivannikov ISPRAS Open Conference (ISPRAS), IEEE, 2021, pp. 47-51. DOI: 10.1109/ISPRAS53967.2021.00012 [论文] [幻灯片]

@inproceedings{savidov2021casr,
  title = {{{Casr-Cluster}}: Crash Clustering for Linux Applications},
  author = {Savidov, Georgy and Fedotov, Andrey},
  booktitle = {2021 Ivannikov ISPRAS Open Conference (ISPRAS)},
  pages = {47--51},
  year = {2021},
  organization = {IEEE},
  doi = {10.1109/ISPRAS53967.2021.00012},
}

Andrey Fedotov, Alexey Vishnyakov. CASR: Your Life Vest in a Sea of Crashes. OFFZONE 2023. [幻灯片] [俄语视频]

Yegorov I., Savidov G. Crash Report Accumulation During Continuous Fuzzing with CASR. Ivannikov Memorial Workshop 2024, IEEE, 2024. [论文] [幻灯片] [俄语视频]

@inproceedings{yegorov2024accum,
  title = {Crash Report Accumulation During Continuous Fuzzing},
  author = {Yegorov, Ilya and Savidov, Georgy},
  booktitle = {Ivannikov Memorial Workshop 2024},
  publisher = {IEEE},
  year = {2024},
  url = {https://arxiv.org/abs/2405.18174},
}

许可证

Apache-2.0许可下。

依赖关系

~4–11MB
~255K SLoC