# 安全模型与威胁分析

## 信任边界与安全默认值

- HTTP 默认只监听 `127.0.0.1:8765`。公网部署必须由 Caddy/Nginx 终止 TLS。
- 仅信任显式配置 CIDR 中反向代理发送的转发头；其他来源的 `Forwarded`/`X-Forwarded-*` 一律忽略。
- 首个 owner 只能在物理终端生成的十分钟单次引导码下创建；系统禁止删除最后一个 owner。
- owner 不由 OP 自动获得。offline-mode 玩家保留原版 OP 权限，但未认证身份不能通过策略 `GRANT` 获得超出当前 OP 等级的权限；危险 Web 权限只可来自 Web owner 或物理终端。
- Web 控制台默认关闭，仅 owner 可用；当前会话必须由 TOTP 建立二要素保证，并且密码重新验证仍在短时窗内。它只能执行 Minecraft 命令，永不执行 OS Shell 或任意文件操作。TOTP、恢复码及绑定确认按账户统一限制为 10 分钟内最多 3 次失败尝试，超过后服务端返回 HTTP 429；成功验证会清除该账户的失败计数。
- administrator 可创建普通触发器，但含 `server_command` 或 `player_command` 的触发器等价于控制台权限，只允许具备 `CONSOLE_EXECUTE` 的 owner 保存。所有触发器写入都要求 CSRF、TOTP 与近期认证。

## 主要威胁与缓解

| 威胁 | 缓解 |
|---|---|
| 口令撞库/暴力破解 | Argon2id、按账号与来源限流、恒定路径校验、会话撤销 |
| 会话窃取 | Secure/HttpOnly/SameSite Cookie、短闲置超时、CSRF 与 Origin 校验、敏感操作重新认证 |
| 代理头伪造 | 仅信任配置 CIDR；会话管理只显示 `loopback`/`remote`/`unknown` 脱敏来源类别 |
| 命令策略绕过 | Brigadier AST、规范化命名空间/redirect/别名、递归 `execute run`、默认拒绝函数间接执行 |
| 权限提升失败后仍执行 | 提权命令在审计不可用时 fail closed；以受限权限重解析后再执行 |
| 触发器变相取得控制台 | 任意命令动作保存时额外检查 owner-only `CONSOLE_EXECUTE`；执行前审计准入失败即拒绝，普通管理员使用结构化动作 |
| 玩家输入触发正则拒绝服务 | 脚本长度和步骤数有界；正则在保存时编译，并拒绝回溯组、反向引用、环视和过量可变重复 |
| 批量目标漂移 | 预览解析后的 UUID 集合、确认令牌、幂等键、执行前重新校验 |
| 背包并发覆盖 | 槽位 revision + compare-and-swap，前后 diff 审计 |
| SQLite/磁盘拖慢 tick | 世界日志与安全审计使用隔离的有界写队列，配合低水位保护、优先级降载和 gap 告警；世界事件突发不得占满审计通道 |
| 控制库迁移失败导致旧策略失效 | HTTP/写路径停用；只读恢复经 checksum 与规则校验的最后发布策略，且提权因无审计而拒绝 |
| 回滚破坏新修改 | 固定 watermark、乐观状态比对、冲突跳过、强制覆盖必须重新预览且 owner-only |
| SSRF/Webhook 泄密 | 固定目的地、HTTPS、HMAC、超时、无自动重定向、敏感字段脱敏 |

## 密钥与个人数据

生产环境应把配置、数据库和 master key 放在仅服务账号可读目录。应用会在支持 POSIX 权限的平台尝试把新建密钥文件收紧到 `0600`；Windows 和其他非 POSIX 文件系统不会自动修复任意继承 ACL，部署者必须预先将数据目录限制为 Minecraft 服务账号（并按运维需要保留 SYSTEM/Administrators），再核验 `master.key`、指标令牌和数据库 ACL。备份 master key 与 `control.db` 时采用不同介质并加密。审计不得保存口令、令牌、TOTP secret、恢复码、完整 IP、原始危险物品数据或未脱敏命令。恢复码只保存哈希。

## 管理员上线清单

1. 在终端生成引导码，并从本机创建首个 owner。
2. 为 owner 启用 TOTP，下载并离线保存恢复码。
3. 发布安全预设前先验证、模拟影响并审阅 diff。
4. 若启用反向代理，配置 TLS、来源访问控制和精确 trusted CIDR。
5. 配置磁盘低水位、数据库保留期、外部备份及告警 Webhook。
6. 启用控制台前确认 owner 最近重新认证与 TOTP 流程可用。
7. 审核触发器组，尤其是 owner 创建的命令动作和第三方模组发布的 `custom.*` 事件上下文。
8. 在 Windows 上检查数据目录没有从上级目录继承面向普通用户的读取权限，并以服务账号验证密钥文件 ACL。

安全漏洞请按仓库 `SECURITY.md` 私下报告，不要把凭据或利用细节写入公开 issue。
