# 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。