acizmarik/sharpdetect

GitHub: acizmarik/sharpdetect

针对 .NET 程序的动态分析框架,通过 Profiling API 和插件体系检测死锁、数据竞争等并发问题。

Stars: 6 | Forks: 0

# SharpDetect [![License](https://img.shields.io/badge/License-Apache_2.0-blue.svg)](https://github.com/acizmarik/sharpdetect/LICENSE.md) [![GitHub Actions](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/1e74e6f6a4061204.svg)](https://github.com/acizmarik/sharpdetect/actions) [![NuGet Stable Version](https://img.shields.io/nuget/v/SharpDetect)](https://www.nuget.org/packages/SharpDetect) [![NuGet Preview Version](https://img.shields.io/nuget/vpre/SharpDetect)](https://www.nuget.org/packages/SharpDetect) ## 概述 SharpDetect 是一个针对 .NET 程序的动态分析框架。 监控和插桩支持是通过 [Profiling API](https://learn.microsoft.com/en-us/dotnet/framework/unmanaged-api/profiling/profiling-overview) 实现的。 分析由插件执行,这些插件可以开发用于评估目标程序的各种运行时属性。 ## 安装 SharpDetect 作为 .NET 工具在 [NuGet](https://www.nuget.org/packages/SharpDetect) 上分发。 您可以使用以下命令之一进行安装: ``` dotnet tool install --global SharpDetect # Latest stable release dotnet tool install --global SharpDetect --prerelease # Latest preview (prerelease) ``` ## 快速入门 ### 1. 创建要分析的程序 创建并构建一个新的控制台 .NET 应用程序(目标框架为 .NET 8、9 或 10),代码如下: ``` // Note: When executed, this program should eventually deadlock var a = new object(); var b = new object(); new Thread(() => { while (true) lock (a) lock (b) { } }) { IsBackground = true }.Start(); new Thread(() => { while (true) lock (b) lock (a) { } }) { IsBackground = true }.Start(); Thread.Sleep(5000); ``` ### 2. 创建分析配置文件 创建一个描述要执行的分析的配置文件。 创建此文件最简单的方法是使用 `sharpdetect init` 命令: ``` sharpdetect init \ --plugin "SharpDetect.Plugins.Deadlock.DeadlockPlugin" \ --target "" \ --output "AnalysisConfiguration.json" ``` *注意:请将 `` 替换为您编译后的 .NET 程序集的实际路径(例如 `bin/Debug/net9.0/MyApp.dll`)。* ### 3. 运行分析 运行分析时,SharpDetect 将使用上一步骤文件中指定的配置。 使用 `sharpdetect run` 命令启动分析: ``` sharpdetect run AnalysisConfiguration.json ``` ### 4. 查看报告 在死锁发生后不久,您应该会看到类似以下的日志消息: ``` warn: SharpDetect.Core.Plugins.PluginBase[0] [PID=20611] Deadlock detected (affects 2 threads). ``` 当目标程序终止时,您应该会看到确认报告已生成的提示: ``` Report stored to file: /home/user/Workspace/SharpDetect_Report_20251223_095828.html. ``` 报告是自包含的 HTML 文件,可以在任何现代网络浏览器中打开。 ## 分析插件 ### 🔒 死锁检测插件 `DeadlockPlugin` 用于分析 .NET 程序中的死锁。 分析完成后,它会生成一个包含受影响线程、堆栈跟踪和其他运行时详细信息的综合 HTML 报告。 #### 支持的同步原语 - `System.Threading.Monitor` - 支持的操作:`Enter`、`TryEnter`、`Exit`、`Wait`、`Pulse`、`PulseAll` - `System.Threading.Lock` (.NET 9+) - 支持的操作:`Enter`、`TryEnter`、`Exit`、`EnterScope` - `System.Threading.Thread` - 支持的操作:`Join` #### 已知限制 - 目前无法检测涉及 `async`/`await` 的死锁 - 尚不支持其他同步原语(例如 `SemaphoreSlim`、`Mutex`、`ReaderWriterLock`) - 插件在分析过程中会引入性能开销 #### 使用方法 ``` sharpdetect init \ --plugin "SharpDetect.Plugins.Deadlock.DeadlockPlugin" \ --target "" \ --output "DeadlockAnalysisConfiguration.json" ``` ### ⚡ 数据竞争检测插件:Eraser `EraserPlugin` 用于分析 .NET 程序中的数据竞争。 它实现了 *Eraser: A Dynamic Data Race Detector for Multithreaded Programs* (1997) 中描述的 Eraser 算法。 分析完成后,它会生成一个包含检测到的竞争详细信息的综合 HTML 报告。 #### 支持的操作 - **同步原语**:与死锁检测插件相同 - **内存访问操作**: - 静态字段读取 `LDSFLD` 和写入 `STSFLD` - 实例字段读取 `LDFLD` 和写入 `STFLD` - 数组元素读取 `LDELEM*` 和写入 `STELEM*`(🚧 开发中 🚧) #### 已知限制 - 由于 Eraser 算法的特性,可能会出现误报 - 目前不分析某些泛型类型的字段(🚧 开发中 🚧) - 插件在分析过程中会引入性能开销 #### 使用方法 ``` sharpdetect init \ --plugin "SharpDetect.Plugins.DataRace.Eraser.EraserPlugin" \ --target "" \ --output "EraserAnalysisConfiguration.json" ``` ### ⚡ 数据竞争检测插件:FastTrack `FastTrackPlugin` 用于分析 .NET 程序中的数据竞争。 它实现了 *FastTrack: efficient and precise dynamic race detection* (2009) 中描述的 FastTrack 算法。 分析完成后,它会生成一个包含检测到的竞争详细信息的综合 HTML 报告。 #### 支持的操作 - **同步原语**:与死锁检测插件相同 - **内存访问操作**: - 静态字段读取 `LDSFLD` 和写入 `STSFLD` - 实例字段读取 `LDFLD` 和写入 `STFLD` - 数组元素读取 `LDELEM*` 和写入 `STELEM*`(🚧 开发中 🚧) - **线程操作**: - 线程 fork - 父线程创建新线程 - 线程 join - 一个线程等待另一个线程完成 #### 已知限制 - 可能会出现误报,但可能性低于 Eraser 算法 - 目前不分析某些泛型类型的字段(🚧 开发中 🚧) - 插件在分析过程中会引入性能开销 #### 使用方法 ``` sharpdetect init \ --plugin "SharpDetect.Plugins.DataRace.FastTrack.FastTrackPlugin" \ --target "" \ --output "FastTrackAnalysisConfiguration.json" ``` ## 从源码构建 ### 前置条件 - .NET 10 SDK - 支持 CMake 的 C++20 编译器(Linux 上使用 clang,Windows 上使用 MSVC) - [Native AOT deployment](https://learn.microsoft.com/en-us/dotnet/core/deploying/native-aot) 的平台特定依赖项 ### 构建说明 ``` git clone https://github.com/acizmarik/sharpdetect.git cd sharpdetect git submodule update --init --recursive cd src dotnet tool restore dotnet cake ``` ## 平台支持 SharpDetect 支持分析目标框架为 .NET 8、9 和 10 的程序。 支持的操作系统为 Windows 和 Linux。支持的架构为 x64。 ## 路线图 下一版本的发布计划包括: - 改进生成报告的用户界面。 - 在死锁检测中支持更多的同步原语。 - 实现额外的分析插件(例如,数据竞争检测插件)。 ## 致谢 SharpDetect 基于众多开源库和组件构建。 有关详细的许可信息和完整的版权声明,请参阅 [THIRD-PARTY-NOTICES.md](THIRD-PARTY-NOTICES.md)。 ## 许可证 本项目采用 [Apache-2.0 license](LICENSE) 授权。
标签:Bash脚本, Concurrency, DAST, NuGet, pocsuite3, Profiling API, 二进制发布, 云安全监控, 云资产清单, 可配置连接, 合规性检查, 多人体追踪, 开源工具, 恶意软件分析, 插件架构, 死锁检测, 程序分析, 网络安全, 调试, 软件测试, 运行时监控, 逆向工程, 隐私保护, 静态分析