docs(security): 更新全部模块审计报告,添加代码验证记录
逐模块对照实际代码验证审计报告中的问题修复状态,添加代码验证记录、逐条验证结果、修复率统计。合并aibox两份审计报告,删除重复文件。修复率:confs 61% > dnfs 60% > ai_review 50% > smtp 37.5% > db 33% > core 12.5% > gateway 12.5% > pymsg 6.25% > static 5% > captcha/aibox/BotOps 0%
This commit is contained in:
1 parent
d3158c2420
commit
5fbe3ed5e4
14 files changed
+899
-457
No files matched your search
@@ -1,63 +1,77 @@
|
||||
# dnfs 模块安全审计报告
|
||||
|
||||
**审计日期**: 2026-08-01
|
||||
**审计范围**: `dnfs.py`、`security_middleware.py`
|
||||
**审计范围**: `dnfs.py`、`security_middleware.py`、`log_client.py`
|
||||
**代码版本**: dev_qing 分支
|
||||
|
||||
---
|
||||
|
||||
## 代码验证记录
|
||||
|
||||
**验证日期**: 2026-08-03
|
||||
**验证方式**: 逐条对照审计报告与当前代码(`dnfs.py`、`security_middleware.py`、`log_client.py`)
|
||||
|
||||
### 验证结果汇总
|
||||
|
||||
| 等级 | 总数 | 已修复 | 部分修复 | 未修复 | 修复率 |
|
||||
|------|------|--------|----------|--------|--------|
|
||||
| P0 | 1 | 1 | 0 | 0 | 100% |
|
||||
| P1 | 2 | 2 | 0 | 0 | 100% |
|
||||
| P2 | 2 | 0 | 0 | 2 | 0% |
|
||||
| **合计** | **5** | **3** | **0** | **2** | **60%** |
|
||||
|
||||
### 逐条验证
|
||||
|
||||
| 编号 | 状态 | 代码位置 | 验证说明 |
|
||||
|------|------|----------|----------|
|
||||
| P0-1 | ✅ 已修复 | `dnfs.py` L312-351 | `decode_token` 完全重写:不再本地解码,改为调用 gateway `/whoami` 接口,由 gateway 完成 RSA 签名验证和过期检查;网络异常 fail-closed(返回 503) |
|
||||
| P1-1 | ✅ 已修复 | `dnfs.py` L312-351 | Token 过期校验由 gateway `/whoami` 统一处理,dnfs 不再自行校验 |
|
||||
| P1-2 | ✅ 已修复 | `dnfs.py` L348-351 | `is_admin` 由 gateway 服务端判定(基于 Admin 白名单),dnfs 信任 gateway 响应,不再从用户提交的 Token 中直接读取 |
|
||||
| P2-1 | ❌ 未修复 | `dnfs.py` L156-202 | `review_content` 已实现 fail-closed(所有异常路径均拒绝请求),但返回类型不一致(bool vs dict),需代码清理 |
|
||||
| P2-2 | ❌ 未修复 | `dnfs.py` L468-562 | `delete_note` 无确认机制,无速率限制 |
|
||||
|
||||
---
|
||||
|
||||
## 修复进度
|
||||
|
||||
| 优先级 | 总数 | 已修复 | 待修复 |
|
||||
|--------|------|--------|--------|
|
||||
| P0 | 1 | 0 | 1 |
|
||||
| P1 | 2 | 0 | 2 |
|
||||
| P0 | 1 | 1 | 0 |
|
||||
| P1 | 2 | 2 | 0 |
|
||||
| P2 | 2 | 0 | 2 |
|
||||
|
||||
---
|
||||
|
||||
## 🔴 P0 — 严重问题
|
||||
|
||||
### P0-1: Token 无 RSA 签名验证,可伪造任意用户身份(含管理员)
|
||||
- **位置**: `dnfs.py:285-292`
|
||||
- **问题**:
|
||||
```python
|
||||
def decode_token(token: str):
|
||||
idx = token.find('_')
|
||||
if idx != -1:
|
||||
raw = token[:idx]
|
||||
# FIXME: 验证数字签名
|
||||
decoded = base64.b64decode(raw)
|
||||
jj = decoded.decode('utf-8')
|
||||
return json.loads(jj)
|
||||
```
|
||||
代码明确标注 `FIXME: 验证数字签名`,但**完全跳过了 RSA 签名验证**:
|
||||
1. 攻击者可自行构造 base64 编码的 JSON payload(`{"user": "任意邮箱", "is_admin": true, ...}`)
|
||||
2. 下划线后拼接任意字符串作为"签名"
|
||||
3. 直接伪造管理员身份,绕过所有权限校验,可增删改任意节点
|
||||
- **修复建议**:
|
||||
1. 立即实现 RSA 签名验证(与 gateway 验签逻辑一致)
|
||||
2. dnfs 需要持有 gateway 的 RSA 公钥(启动时从配置加载,或内置公钥)
|
||||
3. 添加 Token 过期校验(`created_at` + `keep_time`)
|
||||
4. 校验失败返回 401
|
||||
### P0-1: Token 无 RSA 签名验证,可伪造任意用户身份(含管理员) ✅ 已修复
|
||||
- **位置**: `dnfs.py:312-351`(完全重写)
|
||||
- **原问题**: `decode_token` 本地 base64 解码 Token,代码明确标注 `FIXME: 验证数字签名`,但完全跳过了 RSA 签名验证,攻击者可伪造任意用户身份(含管理员)
|
||||
- **修复方案**: `decode_token` 完全重写,改为调用 gateway `/whoami` 接口:
|
||||
1. 将 Token 通过 `Authorization: Bearer` 头发送给 gateway
|
||||
2. Gateway 服务端完成 RSA 签名验证 + 过期检查
|
||||
3. 返回 `{"login": true/false, "user": "...", "is_admin": true/false, ...}`
|
||||
4. 网络异常(gateway 不可达)→ fail-closed,返回 503
|
||||
5. 验签失败(`login=false`)→ 返回 None,调用方返回 401
|
||||
- **影响范围**: 已消除,所有需要认证的端点(add_note、delete_note、update_note)均通过 gateway 验证
|
||||
|
||||
---
|
||||
|
||||
## 🟠 P1 — 高危问题
|
||||
|
||||
| # | 问题 | 说明 |
|
||||
|---|------|------|
|
||||
| P1-1 | Token 过期校验不严谨 | 需严格验证 `created_at` + `keep_time`,防止过期 Token 被复用 |
|
||||
| P1-2 | is_admin 权限完全依赖 Token 字段,无二次验证 | 管理员权限应在服务端再次校验,而非仅信任 Token 声明 |
|
||||
| # | 问题 | 状态 | 说明 |
|
||||
|---|------|------|------|
|
||||
| P1-1 | Token 过期校验不严谨 | ✅ 已修复 | Token 过期校验由 gateway `/whoami` 统一处理(基于 `created_at` + `keep_time`),dnfs 不再自行校验 |
|
||||
| P1-2 | is_admin 权限完全依赖 Token 字段,无二次验证 | ✅ 已修复 | `is_admin` 由 gateway 服务端基于 Admin 白名单判定,dnfs 从 gateway 响应中读取(`info.get('is_admin')`),不再从用户提交的 Token 直接读取 |
|
||||
|
||||
---
|
||||
|
||||
## 🟡 P2 — 中危问题
|
||||
|
||||
| # | 问题 |
|
||||
|---|------|
|
||||
| P2-1 | AI 审核 fail-closed 实现需验证:ai_review 不可用时是否确实拒绝写入 |
|
||||
| P2-2 | 节点删除无确认机制,批量删除无速率限制 |
|
||||
| # | 问题 | 状态 | 说明 |
|
||||
|---|------|------|------|
|
||||
| P2-1 | AI 审核 fail-closed 实现需验证 | ❌ 未修复 | `review_content` 已实现 fail-closed(HTTPError/URLError/JSONDecodeError 均导致请求被拒),但函数返回类型不一致(bool vs dict),建议代码清理 |
|
||||
| P2-2 | 节点删除无确认机制,批量删除无速率限制 | ❌ 未修复 | `delete_note` 无二次确认,无速率限制 |
|
||||
|
||||
---
|
||||
|
||||
@@ -65,21 +79,34 @@
|
||||
|
||||
1. ✅ **特殊节点校验**: link/html/image/file 各类型有格式与大小限制(URL 前缀、大小上限)
|
||||
2. ✅ **AI 内容审核集成**: 新增节点前调用 ai_review 服务审核
|
||||
3. ✅ **security_middleware.py**: 安全响应头
|
||||
3. ✅ **security_middleware.py**: 安全响应头(CSP、X-Frame-Options、X-XSS-Protection 等)
|
||||
4. ✅ **CORS 配置**: 跨域控制
|
||||
5. ✅ **通过 pymsg 调 db 服务**: 不直连数据库,规避 SQL 注入
|
||||
|
||||
## 新增安全机制(审计后添加,审计报告未覆盖)
|
||||
|
||||
| 机制 | 代码位置 | 说明 |
|
||||
|------|----------|------|
|
||||
| Token 验签委托 gateway | `dnfs.py` L312-351 | `decode_token` 调用 gateway `/whoami` 完成 RSA 签名验证 + 过期检查,dnfs 不再持有/管理密钥 |
|
||||
| Token 验签 fail-closed | `dnfs.py` L336-339 | gateway 不可达时返回 503,拒绝所有认证请求 |
|
||||
| 配置白名单合并 | `dnfs.py` L55-63 | `_merge_ini` 仅覆盖已知 section/key,防止意外字段注入 |
|
||||
| 配置完整性校验 | `dnfs.py` L100-112 | 启动时检查所有必需配置项,缺失则退出 |
|
||||
| 特殊节点审核脱敏 | `dnfs.py` L273-286 | `_sp_review_text` 剔除 base64 负载(体量大且无审核意义),仅保留文本字段送审 |
|
||||
| 统一异常处理 | `dnfs.py` L294-305 | `_handle_exp` 装饰器统一捕获 DnfsExp 和通用异常,返回结构化错误响应 |
|
||||
| 异步日志 fail-safe | `log_client.py` L66-72, L147-148 | AsyncRpcQueue 后台异步推送,db 不可用时静默丢弃,不阻塞业务 |
|
||||
|
||||
---
|
||||
|
||||
## 修复路线图
|
||||
|
||||
### 立即(24小时)
|
||||
- [ ] 实现 Token RSA 签名验证(最高优先级)
|
||||
- [x] 实现 Token RSA 签名验证 ✅ 已完成(委托 gateway)
|
||||
|
||||
### 短期(72小时)
|
||||
- [ ] Token 过期严格校验
|
||||
- [ ] is_admin 二次验证
|
||||
- [x] Token 过期严格校验 ✅ 已完成(gateway 统一处理)
|
||||
- [x] is_admin 二次验证 ✅ 已完成(gateway 服务端判定)
|
||||
|
||||
### 中期
|
||||
- [ ] AI 审核 fail-closed 验证测试
|
||||
- [ ] 清理 `review_content` 返回类型不一致(bool vs dict)
|
||||
- [ ] 节点操作速率限制
|
||||
- [ ] 节点删除二次确认机制
|
||||
Reference in new issue
Block a user