# ZERO DAY 模拟器
### 电影般的网络安全事件指挥模拟器
对级联式基础设施威胁进行分类、部署专家团队、调查证据,并在时间耗尽前做出高风险决策。
[](https://react.dev/)
[](https://fastapi.tiangolo.com/)
[](https://playwright.dev/)
[](https://vite.dev/)
[](#responsible-use)
[功能](#what-makes-it-different) · [工作原理](#the-command-loop) · [本地运行](#run-it-locally) · [架构](#architecture) · [测试](#testing)
## 理念
大多数网络安全游戏侧重于输入命令或解决孤立的谜题。Zero Day Simulator 探讨了一个不同的问题:
玩家运营着一个全球危机指挥中心。事件会影响电网、供水系统、铁路网络、电信基础设施、港口、医院、卫星和半导体设施。每次响应都会消耗时间、情报或专家能力。一个技术上正确的选择仍然可能造成平民生活受干扰、财务损失或引发下一次级联事件。
这是一个个人项目,旨在将网络安全故事叙述、决策设计、地理空间可视化、AI 辅助情报以及完整的带有状态的游戏循环结合到一个浏览器体验中。
## 与众不同之处
|
### 全球指挥地图
十五个基础设施事件出现在交互式世界地图上,带有实时状态颜色、骨干路由、昼夜可视化、集群、影响计数器以及级联威胁动画。
|
### 带有后果的决策
每次响应都会根据速度、证据、团队契合度、实际造成的平民影响、财务损失、遏制质量和运营恢复情况进行评估。
|
|
### 分支战役
为期五天的战役会根据每个战区的最差结果改变路线。遏制、升级和崩溃将引向不同的运营路线。
|
### 持久化的指挥官职业生涯
行动可以被保存、恢复、归档、重播、比较和导出。指挥官的 XP、军衔、奖章、呼号和界面主题会在不同会话之间保留。
|
|
### 可选的实时情报
Tavily 可以将当前头条新闻拉取到情报源中,并生成新的场景素材。内置的场景库无需外部密钥即可运行。
|
### AI 决策支持
Anthropic 为顾问和通俗语言的事件解释提供支持,同时保留玩家对最终决策的责任。
|
## 指挥循环
```
flowchart LR
A["Triage threat queue"] --> B["Deploy specialist team"]
B --> C["Investigate telemetry"]
C --> D["Authorize response"]
D --> E["Review consequences"]
E --> F["Acknowledge operational update"]
F --> A
E --> G["Archive operation"]
```
1. **分类** 严重程度、地区、受影响的系统、置信度和影响范围。
2. **部署** 根据所需的专业特性部署 Sentinel、Cipher 或 Aegis。
3. **调查** 通过消耗情报点数和决策时间来调查机密遥测数据。
4. **决策** 在事件计时器到期之前做出决定。
5. **审查** 实际影响、得分、团队恢复情况和下一个优先事项。
6. **适应** 随着团队的恢复、情报的变化和战役的分支进行调整。
## 响应资产
| 团队 | 专长 | 最适合的任务 |
| --- | --- | --- |
| **Sentinel** | 基础设施 | 电力、供水、铁路、港口、工厂、卫星和物理控制系统 |
| **Cipher** | 情报 | 凭据、电信、身份验证、数据泄露和信号滥用 |
| **Aegis** | 危机 | 公共安全、业务连续性、平民影响和协同破坏事件 |
专家匹配可提供额外的决策时间。跨专业部署会施加时间惩罚,并且每个部署的单位在事件结束后都会进入恢复状态。
## 战役逻辑
战役不遵循固定的序列。当前作战日的最差结果决定了下一条路线。
```
flowchart TD
D["Operational day"] --> C{"Worst outcome"}
C -->|"All contained"| G["Containment lane"]
C -->|"Any partial"| A["Escalation lane"]
C -->|"Any spread"| R["Collapse lane"]
```
- **遏制:** 每个已处理的突发事件都已被控制。
- **升级:** 至少有一个已处理的突发事件被部分控制。
- **崩溃:** 任何已处理的突发事件发生扩散;扩散优先于其他结果。
- 备用任务仍然作为背景可见,但在该战役中被永久跳过。
## 不仅仅是原型
Zero Day Simulator 包含了完整应用程序应有的支持系统,而不是单屏幕演示:
- 首次运行引导式入门和可重玩的《现场手册》
- 学员、分析师、操作员以及可解锁的“ Nightmare ”难度
- 根据玩家表现自适应调整决策时机
- 服务端权威的会话、分数、决议和事件计时器
- 七天的会话过期和恢复处理
- 具有安全恢复行为的本地操作快照
- 基于 SQLite 的会话和排行榜持久化
- 实时情报冷却时间和每个会话的生成内容限制
- 后果报告、行动后报告和 Markdown 导出
- 带有过滤器和回放速度的逐事件操作回放
- 归档详情、删除、比较和旧版存档兼容性
- 指挥官军衔、XP、奖章、呼号和颜色主题
- 响应式桌面/移动布局并支持减少动态效果
## 架构
```
flowchart TB
subgraph Client["React + Vite client"]
UI["Command UI"]
MAP["Geospatial theater"]
STATE["Local save + archive"]
E2E["Playwright tests"]
end
subgraph API["FastAPI backend"]
ROUTES["Session and incident API"]
ENGINE["Resolution and consequence engine"]
INTEL["Intelligence services"]
end
subgraph Data["Persistence"]
SESSIONS["SQLite sessions"]
BOARD["SQLite leaderboard"]
BASE["Scenario library"]
end
subgraph Optional["Optional external services"]
TAVILY["Tavily"]
CLAUDE["Anthropic"]
end
UI --> ROUTES
MAP --> ROUTES
STATE --> UI
ROUTES --> ENGINE
ENGINE --> SESSIONS
ROUTES --> BOARD
ENGINE --> BASE
INTEL --> TAVILY
INTEL --> CLAUDE
E2E --> UI
```
### 技术栈
| 层级 | 技术 |
| --- | --- |
| 前端 | React 18, Vite, react-simple-maps, D3 Geo, Lucide React |
| 后端 | FastAPI, Pydantic, Uvicorn |
| 情报 | Tavily 和 Anthropic API — 两者均为可选 |
| 持久化 | 服务端使用 SQLite,浏览器端使用 localStorage |
| 测试 | Python unittest 和 Playwright 端到端测试 |
## 项目结构
```
zero-day-simulator/
|-- backend/
| |-- main.py # FastAPI routes and resolution API
| |-- scenarios.py # Built-in scenario library
| |-- scenario_generator.py # News, advisor, and explanation integrations
| |-- sessions.py # Sessions, timers, persistence, and expiry
| |-- leaderboard.py # Persistent leaderboard
| `-- test_sessions.py # Backend regression tests
|-- frontend/
| |-- e2e/ # Playwright test suite
| |-- src/components/ # Screens, overlays, map, manual, and replay
| |-- src/App.jsx # Game state and orchestration
| `-- playwright.config.js
|-- .gitignore
`-- README.md
```
## 本地运行
### 前置要求
- Python 3.11+
- Node.js 18+
- npm
### 1. 后端
PowerShell
```
cd backend
python -m venv .venv
.\.venv\Scripts\Activate.ps1
pip install -r requirements.txt
python -m uvicorn main:app --reload --port 8010
```
macOS / Linux
```
cd backend
python3 -m venv .venv
source .venv/bin/activate
pip install -r requirements.txt
python -m uvicorn main:app --reload --port 8010
```
后端运行在 `http://127.0.0.1:8010`。健康检查:
```
http://127.0.0.1:8010/api/health
```
### 2. 前端
打开第二个终端:
```
cd frontend
npm install
npm run dev
```
打开 `http://127.0.0.1:5173`。
## 可选的情报配置
完整的内置模拟无需 API 密钥即可运行。要启用当前头条新闻、生成的情报、顾问和通俗语言解释:
```
cp backend/.env.example backend/.env
cp frontend/.env.example frontend/.env
```
配置后端:
```
TAVILY_API_KEY=your_tavily_key
ANTHROPIC_API_KEY=your_anthropic_key
CORS_ORIGINS=http://localhost:5173,http://127.0.0.1:5173
```
可选的前端覆盖配置:
```
VITE_API_URL=http://127.0.0.1:8010
```
## 测试
### 端到端测试套件
```
cd frontend
npm run test:e2e
```
当前覆盖率:涵盖入门、移动端布局、战役路由、授权、部署、调查、决议、后果、实时情报刷新、存档恢复、会话过期和归档在内的 **11 个通过的测试**。
交互式 Playwright 模式:
```
npm run test:e2e:ui
```
### 后端套件
```
cd backend
python -m unittest test_sessions.py
```
### 生产构建
```
cd frontend
npm run build
```
## API 接口
| 方法 | Endpoint | 用途 |
| --- | --- | --- |
| `POST` | `/api/session` | 启动权威的行动会话 |
| `GET` | `/api/session/{id}/status` | 恢复得分、结果、计时器和顾问配额 |
| `GET` | `/api/scenarios` | 加载基础和会话生成的事件 |
| `POST` | `/api/scenarios/refresh` | 拉取当前情报并生成事件 |
| `POST` | `/api/incident/start` | 启动权威的事件计时器 |
| `POST` | `/api/resolve` | 决定处理方案并计算后果 |
| `POST` | `/api/copilot` | 向可选的 AI 顾问提问 |
| `POST` | `/api/explain` | 请求通俗语言的解释 |
| `GET/POST` | `/api/leaderboard` | 读取或提交验证后的分数 |
| `GET` | `/api/status` | 检查可选服务的配置 |
## 部署
将 monorepo 作为同一个 Railway 项目中的两个服务进行部署。
| 服务 | Railway 根目录 | Runtime |
| --- | --- | --- |
| `zeroday-api` | `/backend` | FastAPI / Uvicorn |
| `zeroday-web` | `/frontend` | 由 Caddy 提供服务的 Vite build |
### 后端服务
包含的 `Procfile` 会在 Railway 分配的端口上启动 FastAPI:
```
web: uvicorn main:app --host 0.0.0.0 --port $PORT
```
推荐设置:
- 根目录:`/backend`
- 健康检查路径:`/api/health`
- 副本数:使用 SQLite 时为 `1`
- Volume 挂载路径:`/data`
附加了 volume 时,排行榜和会话存储会自动使用 `RAILWAY_VOLUME_MOUNT_PATH`。
后端环境变量:
```
TAVILY_API_KEY=your_tavily_key
ANTHROPIC_API_KEY=your_anthropic_key
CORS_ORIGINS=https://your-frontend-domain.up.railway.app
```
### 前端服务
前端包含一个多阶段 `Dockerfile` 和一个 Caddy SPA 配置,支持 gzip、健康检查处理和 `index.html` 回退路由。
推荐设置:
- 根目录:`/frontend`
- 健康检查路径:`/health`
前端环境变量:
```
VITE_API_URL=https://your-backend-domain.up.railway.app
```
`VITE_API_URL` 是在构建时嵌入的,因此更改它后需要重新部署前端。为两个服务生成公共域名,然后使用最终的前端 origin 更新 `CORS_ORIGINS`,并重新部署后端。
## 负责任的使用
Zero Day Simulator 是一款教育模拟软件。它不会扫描网络、利用系统漏洞、发出真实命令或连接到实际运营的基础设施。现实世界中的参考用于描述广泛的防御性事件模式;组织、时间线和场景细节均为了游戏玩法而进行了虚构。
## 后续计划
- 托管的公开演示
- 额外的战役包和场景类别
- 扩大的无障碍审核和本地化
- 可分享的行动后报告页面
- 可选的多人指挥室模式
作为对网络危机响应、系统思维和互动叙事的个人探索而构建。
**[返回顶部](#zero-day-simulator)**