2026-05-21 22:12:29 +08:00
|
|
|
|
# ECC组 全链路安全审查报告
|
|
|
|
|
|
|
2026-05-22 08:19:56 +08:00
|
|
|
|
> 日期: 2026-05-21(2026-05-22 勘误更新)
|
2026-05-21 22:12:29 +08:00
|
|
|
|
> 部门: ECC组
|
|
|
|
|
|
> 负责人: CTO
|
|
|
|
|
|
> 审查范围: R7 Redis安全 + D9 Schema安全 + A4 认证安全 + W6 SSH安全 + EC1-EC5 编码规范
|
|
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 审查结果
|
|
|
|
|
|
|
|
|
|
|
|
| 编号 | 审查项 | 严重程度 | 发现 | 状态 |
|
|
|
|
|
|
|------|--------|---------|------|------|
|
|
|
|
|
|
| **R7** | Redis连接安全 | 🟡 中 | REDIS_URL含密码但无TLS;生产环境应启用`rediss://` | 建议改进 |
|
|
|
|
|
|
| **R7** | Redis连接池 | ✅ | BlockingConnectionPool + health_check + timeout + retry 配置合理 | 通过 |
|
|
|
|
|
|
| **R7** | Redis启动校验 | ✅ | ADR-009 启动强校验,不可用直接退出 | 通过 |
|
|
|
|
|
|
| **D9** | Schema变更 | ✅ | 新表均有外键约束+级联删除;索引合理 | 通过 |
|
|
|
|
|
|
| **D9** | 敏感字段 | ✅ | password仍用加密存储;jwt_refresh_token为随机token | 通过 |
|
|
|
|
|
|
| **D9** | 迁移安全 | ✅ | category字段保留兼容;新增字段nullable | 通过 |
|
|
|
|
|
|
| **A4** | JWT认证 | ✅ | HS256 + SECRET_KEY签名;exp过期校验;is_active检查 | 通过 |
|
|
|
|
|
|
| **A4** | JWT公开路由 | 🟡 中 | `/api/agent/` 使用API Key而非JWT,需确认Agent请求带X-API-Key | 需验证 |
|
2026-05-22 08:19:56 +08:00
|
|
|
|
| **A4** | CORS配置 | ~~🔴 高~~ ✅已修复 | `allow_origins=["*"]` → 改为 `settings.CORS_ORIGINS.split(",")` 从 `NEXUS_CORS_ORIGINS` 环境变量读取 | ✅**已修复** |
|
2026-05-21 22:12:29 +08:00
|
|
|
|
| **A4** | JWT算法锁定 | ✅ | `algorithms=["HS256"]` 硬编码,不允许算法混淆攻击 | 通过 |
|
|
|
|
|
|
| **W6** | SSH连接注入 | ✅ | asyncssh参数化连接,无shell注入风险 | 通过 |
|
|
|
|
|
|
| **W6** | 会话隔离 | ✅ | 每个WebSocket连接独立SSH进程,UUID session_id | 通过 |
|
|
|
|
|
|
| **W6** | 命令日志 | ✅ | 按行记录命令,便于审计 | 通过 |
|
|
|
|
|
|
| **W6** | WebSocket认证 | ✅ | JWT查询参数认证(ADR-011),无效token关闭连接 | 通过 |
|
|
|
|
|
|
| **EC1** | Redis密码 | 🟡 中 | 开发环境无密码可接受,生产需设置requirepass | 部署时配置 |
|
|
|
|
|
|
| **EC2** | JWT审计 | ✅ | login/logout/TOTP操作均有AuditLog记录 | 通过 |
|
|
|
|
|
|
| **EC3** | WS/SSH安全 | ✅ | 连接超时+心跳检测+僵尸清理 | 通过 |
|
|
|
|
|
|
| **EC4** | 前端XSS | ✅ | 所有动态内容通过`esc()`函数转义后再写入DOM | 通过 |
|
|
|
|
|
|
| **EC4** | 前端CSRF | ✅ | JWT Bearer token不受CSRF攻击 | 通过 |
|
2026-05-22 08:19:56 +08:00
|
|
|
|
| **EC5** | 编码规范 | ✅已修复 | `datetime.utcnow()` 已全部替换为 `datetime.now(timezone.utc)` | ✅**已修复** |
|
2026-05-21 22:12:29 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 需修复项
|
|
|
|
|
|
|
2026-05-22 08:19:56 +08:00
|
|
|
|
### ~~🔴 P0: CORS配置(A4相关)~~ ✅已修复
|
2026-05-21 22:12:29 +08:00
|
|
|
|
|
|
|
|
|
|
**问题:** `main.py` 中 `allow_origins=["*"]` + `allow_credentials=True` 同时存在,浏览器会拒绝此组合。
|
|
|
|
|
|
|
2026-05-22 08:19:56 +08:00
|
|
|
|
**修复:** 已改为 `allow_origins=settings.CORS_ORIGINS.split(",")` 从 `NEXUS_CORS_ORIGINS` 环境变量读取白名单。
|
|
|
|
|
|
|
2026-05-21 22:12:29 +08:00
|
|
|
|
**修复:** 限制 origins 为实际域名。
|
|
|
|
|
|
|
2026-05-22 08:19:56 +08:00
|
|
|
|
### ~~🟡 P1: datetime.utcnow() 弃用(EC5)~~ ✅已修复
|
2026-05-21 22:12:29 +08:00
|
|
|
|
|
|
|
|
|
|
**问题:** Python 3.12 弃用 `datetime.utcnow()`,项目29处使用。
|
|
|
|
|
|
|
2026-05-22 08:19:56 +08:00
|
|
|
|
**修复:** server/ 目录全部模型 + web/agent/agent.py 已替换为 `datetime.now(timezone.utc)`。
|
2026-05-21 22:12:29 +08:00
|
|
|
|
|
|
|
|
|
|
---
|
|
|
|
|
|
|
|
|
|
|
|
## 审查结论
|
|
|
|
|
|
|
2026-05-22 08:19:56 +08:00
|
|
|
|
**通过** — CORS配置已修复,datetime.utcnow()已替换,其余项目通过审查。
|
2026-05-21 22:12:29 +08:00
|
|
|
|
|