Releases: wgpsec/hunxiang
Releases · wgpsec/hunxiang
v1.2.3
What's New
知识评测 (Quiz Benchmark)
- 新增知识评测模块 (MCQ),支持 MMLU-CS 系列题库
- Quiz REST API: 获取评测列表、题目详情、提交答案
- 独立的 CTF / Quiz 进度重置
- 排行榜新增 Combined / CTF / MCQ 三个 Tab
AI 交互文档
- 全面对齐 TCH 标准:新增 start_challenge、stop_challenge、hint 接口文档
- 新增典型做题流程、错误码说明、框架集成示例 (Python/LangChain/OpenAI Agents)
- Observer (普通用户) 可访问 API 文档页面,独立轻量 UI
Bug Fixes
- 修复 Windows AD 靶机启动失败 (Docker Compose v2 --wait)
- 修复 HTTP 环境下复制按钮报错
- 修复 Quiz 下载后不显示问题
v1.2.2
Summary
- add admin 关于我们 page with repository, ecosystem, and contact information
- update About page ecosystem links, website, email, and QR code asset
- bump package and UI-visible version to v1.2.2
Verification
- python3 -m pytest tests/test_web_routes.py -v
- python3 -m pytest tests/ -q
v1.2.0 - Tag Filter & Category Management
Features
- Tag-based filtering on challenges, prebuild, and store pages (OR/union logic)
- Searchable tag bar with expand/collapse — default shows 10 tags, click "更多" to expand, supports search
- Category management bar — bulk enable/disable all challenges in a category (AD, argus, custom, vulhub, xbow)
- Batch APIs (
/api/batch_visibility,/api/batch_start,/api/batch_stop) that respect tag filter scope - Tags displayed on challenge cards — small grey pills showing each challenge's tags
- Styled confirmation modal for all bulk operations (replaces browser
confirm())
Fixes
- Level 4 (AD) challenges now correctly score 1000 points (was 0)
- Removed empty "Challenges Summary" table from startup CLI output
- Fixed tag bar FOUC (flash of unstyled content) on page load
- Fixed
data-tagsJSON parsing error (HTML attribute quoting)
v1.1.0 — Per-Team Container Isolation
核心特性:Per-Team 容器隔离
本版本实现了多队伍独立容器实例隔离,每个队伍启动赛题时获得独立的容器环境和唯一 Flag,彻底解决了之前多队伍共享同一实例的问题。
新增功能
- Per-Team 容器隔离 — 每个队伍启动赛题时创建独立的容器实例,拥有独立端口、独立 Flag、独立生命周期
- 动态 Flag 隔离 — 每个队伍的实例自动生成唯一 Flag,A 队的 Flag 无法用于 B 队提交
- Per-Team 并发限制 — 每队最多同时运行 N 个实例(默认 3),各队限制独立互不影响
- AD 挑战共享模式 — AD(Attack & Defense)类型赛题保持共享实例,所有队伍访问同一环境
- 管理员视角切换 — Web UI 管理员可切换到任意队伍视角,查看该队伍的实例状态和做题进度
- 管理员视角操作 — 切换视角后,启动/停止等操作也以该队伍身份执行
- 实例状态页显示队伍列 — 管理员状态页展示每个实例归属的队伍
- 每队最大实例数设置 — Web UI 系统设置中可配置每队允许的最大并发实例数
架构改动
- DB Schema:
instance_lifecycle表新增team_id列,UNIQUE 约束从(benchmark_id)变为(benchmark_id, team_id) - 运行时目录结构:
runtime/<benchmark_id>/<team_id>/<instance_code>/ - Challenge 元数据与运行时实例分离:启动时从源目录 copytree,不再预创建 runtime
- 自动迁移:旧 schema 启动时自动检测并重建为新结构
Bug 修复
- 修复
container_name冲突:多队伍启动同一题目时 Docker 容器名冲突,现在自动移除固定容器名 - 修复
_cleanup_stale_record使用非 team-scoped 的 DB 更新,避免误更新其他队伍记录 - 修复管理员 disable challenge 时只停一个队伍实例的问题,现在停止所有队伍的实例
- 修复
_finalize_team_start双重 INSERT 导致 UNIQUE 约束冲突 - 修复
delete_instance使用错误列名 (benchmark_id→id) - 修复
tch_hint未使用 team-scoped 状态检查 - 修复 MCP
submit_flag的静态 flag 回退绕过隔离 - 修复
vnc_proxy模块级 DB 访问导致启动失败(改为 lazy init) - 移除
db.py中delete_instance重复定义
API 兼容性
- TCH API (
/api/challenges,/api/start_challenge,/api/submit等) 接口不变,行为改为 per-team - MCP Server 接口不变,行为改为 per-team
- 现有 Agent Token 认证方式完全兼容
升级说明
- 升级后首次启动会自动迁移 DB schema(DROP + CREATE
instance_lifecycle表) - 旧的运行中实例记录会被清理,需要重新启动赛题
- 无需修改 Agent 端代码,API 接口完全向后兼容
Full Changelog: v1.0.1...v1.1.0
v1.0.0
v1.0.0
Highlights
This is a major release that introduces Web UI authentication, API role-based access control, and Active Directory challenge support — making the platform ready for public deployment and multi-team competitions.
🔐 Web UI Authentication & Authorization
- Cookie-based login system with
itsdangeroussigned sessions (7-day expiry) - Admin role (default team token): full Web UI + all API access
- Observer role (team tokens): read-only scoreboard page only
--admin-tokenCLI flag /ADMIN_TOKENenv var for custom admin token- Random admin token generated on each startup, printed to console
- HTMX-aware auth: returns
HX-Redirectheader for seamless client-side redirect
🛡️ API & MCP Security Hardening
- All API endpoints now require
Agent-Tokenheader (401 if missing) - All MCP tools now require
Authorization: Bearerheader - Admin-only endpoints return 403 for non-admin tokens:
- Settings, visibility, VNC, prebuild, store, batch operations, instance status/logs
- Agent challenge endpoints (challenges, start, stop, submit, hint) remain accessible to any valid team token
- Fully compatible with tch competition API standard
🖥️ Active Directory (Level 4) Support
- Admin VNC Proxy — reverse WebSocket proxy for monitoring Windows DC instances via browser
- Multi-VM support per benchmark (auto-discovers dockur containers)
- Configurable VNC password via Settings page
- Compose Observability — real-time
docker compose logsstreaming for AD challenges- Log panel in Web UI with auto-scroll and offset-based polling
- Instance lifecycle timestamps (started_at, expires_at)
- Windows ISO Management — configure ISO path via Settings, auto-inject bind mount into dockur services
- Direct download link in settings, hint badge on challenge cards
- Compose timeout extended to 30 minutes for Windows boot scenarios
- Volume cleanup and OEM flag injection for AD challenges
🏗️ Architecture Compatibility
- Platform requirements detection — automatically detects KVM/arch requirements from compose files
- Unsupported challenges (e.g., x86-only on ARM) are clearly marked and blocked from starting
- Prebuild skips unsupported challenges with warning
- Batch start excludes unsupported challenges
🐛 Bug Fixes
- Fix: API error messages now shown in start/stop toast notifications
- Fix: return 200 (not error) for unsupported challenge start attempts
- Fix: block unsupported challenges in batch start operations
📝 Other
- Version bumped to 1.0.0
- Bilingual README updated with auth docs, admin-only API markers
- Logout button redesigned to match sidebar navigation style
v0.9.0
v0.9.0 Release Notes
新功能
实例生命周期持久化 (Issue #2)
- 新增
instance_lifecycleSQLite 表,持久化实例状态(启动时间、过期时间、端口、运行路径等) - 服务重启后自动检测 Docker 实际运行状态,恢复/清理实例
- 新增后台 Reaper 线程,按难度自动超时清理过期实例(Easy 1h / Medium 2h / Hard 4h)
- 新增超时配置接口
GET/POST /api/settings/instance_timeout - 前端设置页新增实例超时配置面板
- 前端 Challenge 卡片新增倒计时显示
Per-Challenge Agent 可见性开关 (PR #1)
- 管理员可在 Web UI 中单独控制每道题目是否对 Agent 开放
- 关闭后 Agent 的
list_challenges不返回该题目,相关 API 调用返回 403
Bug 修复
Docker 网络地址池耗尽防护 (Issue #3)
- 启动时自动清理孤儿 Docker 网络(
docker network prune) docker compose up遇到 "non-overlapping IPv4 address pool" 错误时自动清理并重试
平台请求阻塞修复 (Issue #4)
- 所有
docker compose阻塞调用改为asyncio.to_thread,不再阻塞 FastAPI 事件循环 _compose()新增 5 分钟超时控制,防止无限挂起
TCH API 兼容性修复
POST /api/start_challenge返回格式恢复为data: ["host:port"],与 TCH API 文档一致- 错误响应格式改为顶层
{"code": -1, "message": "...", "data": null},不再被 FastAPI 包装{"detail": ...} _find_by_code支持旧 challenge_code 别名查找,解决动态 flag 重新生成 code 后 submit/stop 404 问题get_instance_status/stop_challenge_instance使用 challenge 对象当前 code 而非传入的旧 code- 前端 Challenge 卡片改用稳定的
benchmark_id作为 DOM ID 和局部刷新标识
其他修复
- 修复 Python 3.9 兼容性(
str | None→Optional[str]) - 修复
start_challenge后使用旧 code 获取时间戳导致 500 的问题
关联 Issues
v0.8.1
What's New
MCP Server
- 新增 MCP (Model Context Protocol) 端点
/mcp/,支持 Streamable HTTP 传输 - 提供 5 个工具:
list_challenges、start_challenge、stop_challenge、submit_flag、view_hint - 支持
Authorization: Bearer <token>认证,按队伍隔离 - 兼容 Claude Code、LangChain、openai-agents 等 MCP 客户端
镜像预热 - 选择性构建
- 预构建页面新增 checkbox 选择列
- 支持 "选择未缓存" / "选择失败" 快捷选择按钮
- 构建按钮动态切换:全部构建 / 构建选中 (N)
- 新增批量删除选中镜像功能 (
POST /api/prebuild/remove_batch)
Dependencies
- 新增
fastmcp>=3.0.0依赖
Full Changelog: v0.7.9...v0.8.1
v0.7.9 - Dynamic Flag Injection Redesign
动态 Flag 注入机制重设计
本次更新从根本上修复了动态 flag 注入机制的架构缺陷,解决了题目提交验证失败的问题。
核心变更
平台侧 — 新注入算法
canaries字段现在是 flag 的唯一真相来源(Single Source of Truth)- 始终全量扫描所有文本文件中的 flag 字面量(不再是 fallback)
- canary 匹配的 flag → 替换为动态
flag{uuid}(可提交验证) - 其他
FLAG{...}字面量 → 替换为随机假 flag(不可提交) - .env 独立处理,避免双重替换 bug
向后兼容
- 当
canaries为空时自动 fallback 到旧逻辑(从 .env + 源码扫描收集 flag) - 记录警告日志,不会阻止平台启动
- 允许用户先升级平台,再逐步更新靶场文件
镜像预热检测修复
- 使用
docker images -q替代docker image inspect检测已缓存镜像 - 修复 Docker Desktop containerd 模式下 daemon 启动阶段的瞬态检测失败
修复的问题
- APEX-033-25 等题目因 .env flag 与源码 flag 不一致导致提交验证失败
- 45 个题目 canaries 为空导致平台无法验证任何提交
- Docker 重启后镜像预热页面显示已缓存为 0
升级说明
建议同步更新靶场文件(benchmark-challenges 仓库已推送修复),所有题目现已包含正确的 canaries 值。
v0.7.7
v0.7.7 更新日志(v0.7.2 → v0.7.7)
🚀 新功能
- 动态 Flag 注入 — 平台运行时为每个实例生成独立
flag{uuid},通过环境变量注入容器,支持全文替换兜底策略(覆盖 .env / SQL / 配置文件等场景) - 靶场热加载 — 下载靶场后无需重启服务即可自动发现并加载新靶场,新增
/api/challenges/reload接口 - 本地 ZIP 导入 — 支持通过模态面板导入本地 zip 靶场包,附带文件规范说明
- 靶场商店异步加载 — 商店页面采用两阶段异步加载,提升首屏速度
- AI Prompt 增强 — 在导入模态中展示 spec/skill 文档链接和可复制的 AI 提示词,支持 fallback 规则
- 运行时目录可配置 — 实例运行时文件移至独立
./runtime目录,保持工作区整洁 - 分类批量删除 — 靶场商店页面新增按分类删除按钮
- GitHub 下载加速 — 集成 gh-proxy.com 镜像代理,国内下载自动 fallback
- 中国镜像源规则 — AI Prompt 中新增第6条规则,要求构建时使用国内镜像源
🐛 修复
- 提交记录持久化 — 修复重启后 flag 提交历史丢失问题,增加提交日期和队伍信息展示
- 运行时目录扫描 — 跳过 runtime 中的 UUID 实例目录,避免误识别为靶场
- 剪贴板兼容 — HTTP 环境下剪贴板复制 fallback 处理,prompt 显示改用
whitespace-pre-wrap - AI Prompt 下载方式 — 改用 curl 下载方式绕过 fetch 限制,使用 raw.githubusercontent.com 地址提升兼容性
📋 版本对应
| Tag | 主要变更 |
|---|---|
| v0.7.3 | 本地 ZIP 导入功能 |
| v0.7.4 | 商店异步加载、AI Prompt 增强、镜像源规则 |
| v0.7.5 | 运行时目录隔离、分类删除、下载加速 |
| v0.7.6 | 提交记录持久化 |
| v0.7.7 | 动态 Flag 注入、靶场热加载 |