18 个稳定版本

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.2.0 2022 年 11 月 21 日

#53 in 测试

Download history 15/week @ 2024-05-02 16/week @ 2024-05-09 15/week @ 2024-05-16 9/week @ 2024-05-23 4/week @ 2024-05-30 16/week @ 2024-06-06 45/week @ 2024-06-13 119/week @ 2024-06-20 72/week @ 2024-06-27 58/week @ 2024-07-04 8/week @ 2024-07-11 178/week @ 2024-07-25 8/week @ 2024-08-01 61/week @ 2024-08-08 59/week @ 2024-08-15

306 每月下载量

Apache-2.0

595KB
12K SLoC

Crates.io Documentation codecov License

amd64 aarch64 riscv64 darwin-arm64 fuzzing

CASR: 崩溃分析和严重性报告

CASR – 收集崩溃(或 UndefinedBehaviorSanitizer 错误)报告、分类和评估严重性。它基于 exploitableapport 的想法。

CASR 由以下人员维护

概览

CASR 是一套工具,允许您以不同的方式收集崩溃报告。使用 casr-core 二进制文件来处理核心转储。使用 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 架构,OS 和包版本,命令行,堆栈跟踪,寄存器值,反汇编,甚至崩溃出现的源代码片段。报告以 JSON 格式存储。 casr-cli 旨在提供用于查看报告并将其转换为 SARIF 报告的 TUI。报告分类(去重、聚类)由 casr-cluster 完成。分类基于从 gdb-command 比较堆栈跟踪。 casr-afl 用于对由 AFL++ 和基于 AFL 的模糊器 Sharpfuzz 找到的崩溃进行分类。 casr-libfuzzer 可以对由基于 libFuzzer 的模糊器(C/C++/go-fuzz/Atheris /Jazzer/Jazzer.js/ jsfuzz)找到的崩溃进行分类。 casr-dojo 允许将新的唯一 CASR 报告上传到 DefectDojo(可通过 dojo 功能使用)。

严重性类别的说明可以在这里找到 here。您可以在 here 仔细查看使用说明。

casr_report

casr_dojo_finding

LibCASR

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

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

  • AddressSanitizer
  • UndefinedBehaviorSanitizer
  • Gdb 输出

以及程序语言

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

它可以通过 exploitable 功能构建以估计从 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 启动。

从coredump创建报告

$ 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(如果没有sanitizer存在),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的fuzzer Sharpfuzz,则可以通过 casr-afl 自动执行管道(无需 casr-ubsancasr-dojo)。

如果您使用基于 libFuzzer 的fuzzer(C/C++/go-fuzz/Atheris /Jazzer/Jazzer.js/ jsfuzz),则可以通过 casr-libfuzzer 自动执行管道(无需 casr-ubsancasr-dojo)。

贡献

请随意打开 问题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: Linux应用程序的崩溃聚类。 2021 Ivannikov ISPRAS开放会议(ISPRAS),IEEE,2021年,第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:在崩溃的海洋中的救生衣。 OFFZONE 2023。[幻灯片] [俄语视频]

Yegorov I., Savidov G. 在CASR持续模糊测试过程中的崩溃报告累积。 Ivannikov纪念研讨会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 许可。

依赖项

~63MB
~1.5M SLoC