JVBotelho/RASP.Net
GitHub: JVBotelho/RASP.Net
一款针对 .NET 10 高吞吐量应用设计的超低延迟 RASP 安全引擎,通过零分配架构在进程内实时检测并拦截各类注入攻击。
Stars: 9 | Forks: 0
# 🛡️ RASP.Net





[](docs/ATTACK_SCENARIOS.md)
[](docs/REVERSE_ENGINEERING.md)
## 🎮 为什么这对游戏安全至关重要
**问题所在**:多人游戏服务每秒处理**数百万笔事务**。传统的 WAF 会引入网络延迟,且无法深入加密的 gRPC payload 内部或理解游戏逻辑上下文。
**解决方案**:RASP.Net 在游戏服务器进程内部充当**最后一道防线**。它对 runtime 进行插桩,以检测绕过边界防御的攻击——例如检测物品复制漏洞或经济操纵等逻辑缺陷。
**核心工程目标:**
1. **零 GC 压力**:安全检查绝对不能触发会导致掉帧/卡顿的 Garbage Collection 暂停
2. **亚微秒级延迟**:检查在纳秒级别完成,而非毫秒
3. **纵深防御**:通过保护后端 API 层,补充内核级的 Anti-Cheat (BattlEye/EAC)
## ⚡ 性能基准测试
### 边界扫描:Source Generator vs. Reflection
**测试方法:** 使用 `BenchmarkDotNet` 对比 Source Generator(编译时)与 Reflection(runtime)插桩。
**硬件:** AMD Ryzen 7 7800X3D | **Runtime:** .NET 10.0.2 (RyuJIT AVX-512)
| 方法 | 场景 | 平均值 | 分配内存 | 加速比 |
|:-------|:---------|-----:|----------:|:-------:|
| **Source Generator** | ✅ 正常扫描 | **108.9 ns** | 136 B | **快 10.3 倍** 🚀 |
| Reflection | ✅ 正常扫描 | 1,120.0 ns | 136 B | *基准线* |
| **Source Generator** | 🛡️ 拦截攻击 | **4,090 ns** | 1,912 B | **快 1.04 倍** |
| Reflection | 🛡️ 拦截攻击 | 4,260 ns | 1,552 B | *基准线* |
### 持续负载下的 Sink 开销 (开启 vs. 关闭 RASP)
**测试方法:** 使用真实的 Kestrel 宿主、真实的后端(通过 Testcontainers 连接的 Postgres、真实子进程、真实的出站 HTTP),25 个并发 worker 对每个 endpoint 持续请求 20 秒。这不是孤立的合成 `Inspect()` 调用——而是在完整接入或完全不使用该 sink 的情况下的 p50/p99 请求延迟。完整测试方法及各项防护的微基准测试见 [ADR 006](docs/ADR/006-sink-instrumentation-strategy.md#measured-end-to-end-latency-under-sustained-load-2026-07-02)。
| Sink | 关闭 RASP (p50 / p99) | 开启 RASP (p50 / p99) | 结论 |
|:-----|----------------------:|----------------------:|:--------|
| 路径遍历 (`FileStream`) | 851 µs / 1349 µs | 858 µs / 1404 µs | 与噪音无异 |
| 命令注入 (`Process.Start`) | 60.76 ms / 108.22 ms | 61.50 ms / 104.59 ms | 与噪音无异 |
| SQL (EF Core → Postgres) | 7.76 ms / 16.97 ms | 7.50 ms / 16.50 ms | 与噪音无异 |
| SSRF (`HttpClient`) | 299 µs / 756 µs | 306 µs / 914 µs | 与噪音无异 |
## 🛡️ 安全分析与威胁建模
专业级的安全文档展示 **Purple Team** 能力。
| 文档 | 描述 |
|:---------|:------------|
| 📄 [威胁模型与攻击场景](docs/ATTACK_SCENARIOS.md) | STRIDE 分析:gRPC SQL 注入、Protobuf 篡改、GC 压力 DoS |
| 🕵️ [逆向工程与防篡改](docs/REVERSE_ENGINEERING.md) | Native C++ 保护:`IsDebuggerPresent`、PEB 操纵、时序检查 |
## 🏗️ 架构
本仓库采用**复合架构策略**——通过在不污染源代码的情况下,对真实的“受害”应用程序进行插桩,从而开发和验证该 Security SDK。
```
RASP.Net/
├── src/ # 🛡️ RASP SDK (Defense)
│ ├── Rasp.Core/ # Detection engines & telemetry
│ ├── Rasp.SourceGenerators/ # Roslyn code generation
│ ├── Rasp.Instrumentation.Grpc/ # gRPC interceptors
│ └── Rasp.Bootstrapper/ # DI extensions (AddRasp())
├── modules/ # 🎯 Victim App (Target)
│ └── dotnet-grpc-library-api/ # Git submodule - Clean Architecture sample
├── attack/ # ⚔️ Red Team Tools
│ ├── exploit_xss.py # XSS attack suite
│ └── exploit_grpc.py # SQLi attack suite
└── scripts/ # Automation scripts
```
## 🛡️ 工作原理
```
sequenceDiagram
participant Attacker
participant gRPC as gRPC Gateway
participant RASP as 🛡️ RASP.Net
participant GameAPI as Game Service
participant DB as Database
Note over Attacker,RASP: 🔴 Attack Scenario
Attacker->>gRPC: POST /inventory/add {item: "Sword' OR 1=1"}
gRPC->>RASP: Intercept Request
activate RASP
RASP->>RASP: ⚡ Zero-Alloc Inspection
RASP-->>Attacker: ❌ 403 Forbidden (Threat Detected)
deactivate RASP
Note over Attacker,DB: 🟢 Legitimate Scenario
Attacker->>gRPC: POST /inventory/add {item: "Legendary Sword"}
gRPC->>RASP: Intercept Request
activate RASP
RASP->>GameAPI: ✅ Clean - Forward Request
deactivate RASP
GameAPI->>DB: INSERT INTO inventory...
DB-->>GameAPI: Success
GameAPI-->>Attacker: 200 OK
```
## 🚀 快速开始
### 1. 使用 Submodule 克隆
```
git clone --recursive https://github.com/JVBotelho/RASP.Net.git
cd RASP.Net
# 如果已经在没有 --recursive 的情况下进行了 clone:
git submodule update --init --recursive
```
### 2. 构建与运行
```
# 选项 A:使用自动化 setup script
./scripts/pack-local.ps1 # Windows
./scripts/pack-local.sh # Linux/macOS
# 选项 B:直接 build
dotnet build Rasp.sln
```
### 3. 运行受害应用
```
cd modules/dotnet-grpc-library-api
dotnet run --project LibrarySystem.Grpc
```
## ⚔️ 安全测试 (Red Team)
### 前置条件
```
pip install grpcio grpcio-tools
```
### 生成攻击 Proto
```
# Windows
python -m grpc_tools.protoc `
-I ./modules/dotnet-grpc-library-api/LibrarySystem.Contracts/Protos `
--python_out=./attack --grpc_python_out=./attack `
./modules/dotnet-grpc-library-api/LibrarySystem.Contracts/Protos/library.proto
```
```
# Linux/macOS
python3 -m grpc_tools.protoc \
-I ./modules/dotnet-grpc-library-api/LibrarySystem.Contracts/Protos \
--python_out=./attack --grpc_python_out=./attack \
./modules/dotnet-grpc-library-api/LibrarySystem.Contracts/Protos/library.proto
```
### 运行漏洞利用套件
```
# Target app 必须在 localhost:5049 上运行
python attack/exploit_xss.py localhost:5049
python attack/exploit_grpc.py localhost:5049
```
**预期输出:**
```
📊 XSS Security Report
========================================
Attacks Blocked: ✅ 7
Bypasses Found: ❌ 0
False Positives: ✅ 0
```
## 🔧 故障排除
| 问题 | 解决方案 |
|:--------|:---------|
| `Submodule not found` | 运行 `git submodule update --init --recursive` |
| `Namespace 'Rasp' not found` | 打开 `Rasp.sln`,而不是单独的 `.csproj` 文件 |
| `gRPC UNAVAILABLE` | 检查目标端口是否匹配(默认:`localhost:5049`) |
| `Proto files not found` | 运行 `pip install --upgrade grpcio-tools` |
## 🎯 路线图
按项目目标排序:为 .NET 生态系统提供一个生产级的开源 RASP,提交给
OWASP(从 Incubator 到 Lab),并在包发布并获得社区关注后,最终
提交给 .NET Foundation。落地基础设施(阶段 1–2)刻意安排在新的检测
功能(阶段 3)之前:一个没人能通过 `dotnet add package` 安装的安全产品仅仅是一个代码仓库,而不是一个产品。
### ✅ 已交付 — 基础架构
- [x] 复合解决方案设置与漏洞注入
- [x] 带有 XSS/SQLi 检测的 gRPC Interceptor
- [x] 实现零配置集成的 Source Generator
- [x] 带有 SQL 分析的 EF Core Interceptor
- [x] Native 防篡改层([ADR 003](docs/ADR/003-native-integrity-guard.md) — Windows 已发布,Linux 计划中)
- [x] 以 Sink 为中心的防护转向:SQL / SSRF / 路径遍历 / 命令注入 / 反序列化防护 ([ADR 006](docs/ADR/006-sink-instrumentation-strategy.md) Phases A & B)
- [x] CLR Profiler + 污点追踪([ADR 006](docs/ADR/006-sink-instrumentation-strategy.md) Phase C — v1 范围:`String.Concat(string, string)` 传递)
- [x] 环境执行上下文:关联 source 到 sink 的告警([ADR 007](docs/ADR/007-execution-context.md))
### 📦 阶段 1 — 将其作为产品发布 (NuGet)
待 ADRs 006/007 最终确定并合并后开始。
- [ ] **托管 SDK 的 NuGet 包**。跨平台、受支持的 API 核心
(ADR 006 Phase A 防护 + ADR 007 上下文层)将成为可安装的产品;
MonoMod runtime 修补 (Phase B) 仍保持可选;CLR profiler (Phase C) 将单独
作为仅限 Windows 的高级预览版发布。
- [ ] **多目标 `net8.0;net10.0`** 以便两个受支持的 LTS 版本都能采用。
- [ ] **SemVer + 发布流水线** — 版本化、签名的包(CI 签名钩子已
接通;详见 [ADR 006](docs/ADR/006-sink-instrumentation-strategy.md) 附录第 5 点)。
### 🌐 阶段 2 — 提交至 OWASP Incubator
提交前:
- [ ] 社区基础:`CODE_OF_CONDUCT.md`、Issue 模板、`GOVERNANCE.md`、
`good-first-issue` 积压任务(污点传递目标是理想的入门 Issue)。
- [ ] 隔离并清晰标记故意设为易受攻击的演示目标 (`modules/`),以便其
已知存在漏洞的包永远不会被误认为是产品依赖项。
- [ ] **招募第二位项目负责人** — 当前的 OWASP 政策要求有多名负责人
(不能全来自同一雇主),因此这将直接决定申请能否进行。
- [ ] 启动 [OSSF Best Practices](https://www.bestpractices.dev/) 自我认证 —
这是晋升 Lab 的标准之一,尽早开始成本很低。
- [ ] 提前起草 OWASP 项目页面的内容(`index.md`、描述、路线图) —
`www-project-rasp-net` 仓库本身由 OWASP Foundation 在
`github.com/OWASP` 下**仅在**获批后开通;准备好内容意味着页面可以
立即上线,而不是空置在那里。
- [ ] 作为 [OWASP Incubator 项目](https://owasp.org/projects/)提交 — MIT 许可证、
供应商中立性、[威胁模型](docs/ATTACK_SCENARIOS.md)和 [SECURITY.md](SECURITY.md)
已经满足了入门门槛。
获批后:
- [ ] 将此仓库转移至 `github.com/OWASP`(GitHub 会保留 stars/issues/历史记录并
重定向旧 URL),重新创建 Actions 密钥,重新指向徽章和 Codecov。
- [ ] 使用起草好的页面内容填充 `www-project-rasp-net` 并保持更新 —
陈旧的项目页面是导致 OWASP 项目被标记为不活跃的原因。
### 🛡️ 阶段 3 — 覆盖 [OWASP Top 10 (2025)](https://owasp.org/Top10/2025/) (功能轨道)
一旦产品可供安装,这便是主要的功能轨道 — 补齐下方 ⬜ 的项目是推动
Incubator 晋级 Lab 的动力。
基于 sink 的 RASP 非常适合注入/完整性/异常处理类的范畴,
而对于那些本质上属于访问控制策略、密码学或供应链的类别则不太适合
——这种映射保持务实而不盲目凑数。请注意,2025 版将 SSRF (CWE-918) 合并到了
**A01 Broken Access Control** 中,而不是将其作为一个单独的类别,同时增加了
**A10 Mishandling of Exceptional Conditions**,这比 2021 版的 A04/A09 更适合推迟的 Lean
Sentinel 工作:
| 类别 | 覆盖范围 | 机制 |
|:---|:---|:---|
| **A01 Broken Access Control** (SSRF — CWE-918, 路径遍历) | ✅ 完成 | `SsrfGuard`(防 DNS-rebinding 的 `HttpClient` 处理程序,[ADR 006](docs/ADR/006-sink-instrumentation-strategy.md)),`PathTraversalGuard` (MonoMod)。A01 的其余部分 — IDOR、JWT/session 处理、CORS — 属于访问控制*策略*,而不是 RASP 可以验证的 sink。 |
| **A02 Security Misconfiguration** (Headers) | ✅ 完成 | `RaspSecurityHeadersMiddleware` (CSP 等) |
| **A02 / A05 XXE** (`XmlReader` / `XmlDocument.Load`) | ⬜ 计划中 | 禁用 DTD/外部实体的策略防护 (MonoMod) |
| **A05 Injection** (SQLi, XSS, Command Injection) | ✅ 完成 | `SqlSinkGuard`、源生成的 XSS/SQLi 扫描、`CommandInjectionGuard` (MonoMod) |
| **A05 Injection** (LDAP Injection — `DirectorySearcher`) | ⬜ 计划中 | 新的 `LdapInjectionDetectionEngine` (MonoMod) |
| **A08 Software or Data Integrity Failures** (不安全的反序列化) | ✅ 完成 | `DeserializationGuard` + `System.Text.Json` type-info modifier |
| **A09 Security Logging & Alerting Failures** | ✅ 完成 | `RaspAlertBus`、关联的结构化告警 ([ADR 007](docs/ADR/007-execution-context.md))、审计模式、指标 |
| **A10 Mishandling of Exceptional Conditions** (错误消息/堆栈跟踪泄露系统细节) | ⬜ 推迟 | Lean Sentinel ([ADR 004](docs/ADR/004-memory-disclosure-protection.md) — 已采纳,推迟实施) |
A03 (Software Supply Chain), A04 (Cryptographic Failures), A06 (Insecure Design), A07 (Authentication Failures) | 超出范围 | 依赖项/CI-CD 完整性、密码学、架构级设计审查和身份验证属于与基于 sink 的 RASP 不同的工具类别;在此特意不作尝试。 |
### 🔭 阶段 4 — 深度、平台覆盖范围、基金会
- [ ] **拓宽污点传递**,超越 `String.Concat(string, string)`:支持 `string.Format`、
插值降低、`Substring`、`StringBuilder` — [ADR 006](docs/ADR/006-sink-instrumentation-strategy.md)
将其记录为 v1 版本可接受的局限性。
- [ ] **Native 测试工具 + Linux profiler 移植** — IL 重写器目前仅有冒烟
测试,且 profiler 构建仅限 Windows(`profiler_pal.h` 中已存在非 Windows 的 PAL 脚手架)。大部分 ASP.NET Core 生产环境运行在 Linux 上;这就是能移除
Phase C 中“仅限 Windows 的高级预览版”标签的关键。
- [ ] **Linux native 完整性对齐**(基于 eBPF 的监控,[ADR 003](docs/ADR/003-native-integrity-guard.md))。
- [ ] **申请加入 .NET Foundation** — 一旦包已发布、存在采用信号,且
维护者巴士因子大于一。基金会充当成熟度印章,而非发布
杠杆;按照它自己的准入标准,在此之前申请是为时过早的。
## 📚 参考资料
- [OWASP RASP](https://owasp.org/www-community/controls/Runtime_Application_Self_Protection)
- [.NET Source Generators](https://learn.microsoft.com/en-us/dotnet/csharp/roslyn-sdk/source-generators-overview)
- [gRPC Interceptors](https://learn.microsoft.com/en-us/aspnet/core/grpc/interceptors)
- [.NET 中的 SIMD](https://learn.microsoft.com/en-us/dotnet/standard/simd)
## 📜 许可证
**MIT 许可证** - 免费开源。完整条款请参见 [LICENSE](LICENSE)。
🔐 发现安全问题?请查阅 [SECURITY.md](SECURITY.md) 进行负责任的漏洞披露。
**⚡ 由 .NET 10 构建 | 基于 Clean Architecture 驱动**
标签:Go语言工具, Python工具, RASP, XSS注入, 反作弊, 运行时防护, 逆向工具, 配置错误