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 测试
306 每月下载量
595KB
12K SLoC
CASR: 崩溃分析和严重性报告
CASR – 收集崩溃(或 UndefinedBehaviorSanitizer 错误)报告、分类和评估严重性。它基于 exploitable 和 apport 的想法。
CASR 由以下人员维护
- Andrey Fedotov <[email protected]>
- Alexey Vishnyakov <[email protected]>
- Georgy Savidov <[email protected]>
- Ilya Yegorov <[email protected]>
- Darya Parygina <[email protected]>
概览
CASR 是一套工具,允许您以不同的方式收集崩溃报告。使用 casr-core
二进制文件来处理核心转储。使用 casr-san
来分析 ASAN 报告或 casr-ubsan
来分析 UBSAN 报告。尝试使用 casr-gdb
从 gdb 获取报告。使用 casr-python
来分析 Python 报告并从 Atheris 获取报告。使用 casr-java
来分析 Java 报告并从 Jazzer 获取报告。使用 casr-js
来分析 JavaScript 报告,并从 Jazzer.js 或 jsfuzz 获取报告。使用 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 仔细查看使用说明。
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的代码,如 exploitable 和 casr-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
模糊测试崩溃分类管道
当您有来自模糊测试的崩溃时,您可以执行以下步骤
- 通过
casr-san
,casr-gdb
(如果没有sanitizer存在),casr-python
,casr-java
,casr-js
或casr-csharp
创建所有崩溃的报告。 - 通过
casr-cluster -d
去重收集到的崩溃报告。 - 通过
casr-cluster -c
聚类去重的崩溃报告。 - 通过
casr-ubsan
创建并去重所有UBSAN错误报告。 - 使用
casr-cli
查看集群报告,或者使用casr-dojo
将其上传到 DefectDojo。
如果您使用 AFL++ 或基于AFL的fuzzer Sharpfuzz,则可以通过 casr-afl
自动执行管道(无需 casr-ubsan
和 casr-dojo
)。
如果您使用基于 libFuzzer 的fuzzer(C/C++/go-fuzz/Atheris /Jazzer/Jazzer.js/ jsfuzz),则可以通过 casr-libfuzzer
自动执行管道(无需 casr-ubsan
和 casr-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