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 调试
3,287 每月下载量
用于 2 crate
350KB
6.5K 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
二进制文件来处理coredump。使用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架构,严重性(如可利用性)、操作系统和软件包版本、命令行、堆栈跟踪、寄存器值、反汇编,甚至崩溃出现的地方的源代码片段。报告以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
功能)。
严重性类别的说明可以在这里找到。您可以在这里详细了解使用方法。
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的代码,如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
。
从核心转储创建报告
$ 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
(如果没有检测器),casr-python
,casr-java
,casr-js
或casr-csharp
创建所有崩溃的报告。 - 通过
casr-cluster -d
去重收集到的崩溃报告。 - 通过
casr-cluster -c
聚类去重的崩溃报告。 - 通过
casr-ubsan
创建和去重所有UBSAN错误的报告。 - 使用
casr-cli
查看聚类报告或使用casr-dojo
上传它们到DefectDojo。
如果您使用AFL++或基于AFL的模糊器Sharpfuzz,管道(不包含casr-ubsan
和casr-dojo
)可以通过casr-afl
自动完成。
如果您使用基于libFuzzer的模糊器(C/C++/go-fuzz/Atheris /Jazzer/Jazzer.js/ jsfuzz),管道(不包含casr-ubsan
和casr-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