# Phase 2 审计待办修复（P1/P2 批次）

**日期**: 2026-05-22

## 已修复

| ID | 说明 | 变更 |
|----|------|------|
| F2h-03 | Agent `/exec/kill` 不得对未登记 pid 调用 `os.kill` | `web/agent/agent.py` 仅杀 `_running_procs` 内进程，否则 404 |
| F2h-04 | `/exec/wait` 超时未清理 `_running_procs` | 超时分支 `pop` + `kill`/`wait` |
| F2a-08 | 安装后安装向导仍可 POST | `install.py` 统一 `_reject_if_installed()` → 403（除 `GET /status`） |
| F2g-03 | `apply_update` 中 `json.loads(server_ids)` 无防护 | `_parse_server_ids_json()` |
| F2i-01 | `update_status` 无记录时 flush 异常 | 返回 `Optional`；`flush_to_mysql` 跳过并出队 |
| F2i-02 | 死模型 `AgentExec` | 已从 `schemas.py` 删除 |
| F2g-05 / F2h-01 | `credential_id` 未贯通 | 模型列 + schema + API + 存库 + retry 继承 |
| F2b-05 | `duration_seconds` 用 `.seconds` | `sync_engine_v2.py` → `total_seconds()` |
| F2a-13 | Dashboard `stats.online` 用 MySQL | `servers.py` 优先 Redis `heartbeat:*` |
| F2g-02（部分） | 脚本回调无限流 | `script_callback_rate.py` + `agent.py` 429 |

## 第二批（2026-05-22 续）

| ID | 说明 | 变更 |
|----|------|------|
| F2d-03 | 安装模式仍可连 WS | `main.py` 安装模式 `/ws/` → 503 |
| F2d-04 | MySQL 异常原文进 Telegram | `self_monitor.py` 通用文案 |
| F2g-02 | 回调可能 HTTP | `master_callback_url()` 非 localhost 强制 HTTPS |
| F2g-06 / F2h-02 | script-callback 无限流 | 见上（已完成） |
| F2c-05 | 迁移失败仅 log | `migrations.py` 非重复列错误 re-raise |
| F2f-05 | CREATE DATABASE f-string | `bootstrap_database.py` 库名白名单 |
| F2f-07 | wsl 脚本硬编码路径 | `wsl_mcp_mysql.sh` 相对仓库根目录 |
| F2g-04（文档） | 重试新 id | API `parent_execution_id` + SSOT 文档 |
| F2f-01 / F2g-01（文档） | shell 执行面 | SSOT §4.1 + Agent WARNING 日志 |
| — | 前端 credential | `scripts.html` DB 凭据下拉 |
| F2f-06（部分） | P0 回归测试 | `tests/test_security_unit.py` |

## 未改（需架构/运维）

- F2f-01 / F2g-01：`subprocess` shell 执行（文档/隔离）
- F2g-04：重试生成新 execution id（产品设计）
- F2a-10 / F2d-02：全局 JWT 收紧
- F2e-03 / F2a-18：告警 WS — **已讨论接受**，不做换票
- F2f-04：轮换曾泄露 API Key（运维）

## 部署注意

启动时会执行 schema migration：`script_executions.credential_id`。已有库无需手工 SQL。
