Skip to content

Releases: wgpsec/hunxiang

v1.2.3

24 May 10:36

Choose a tag to compare

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

21 May 15:50

Choose a tag to compare

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

19 May 08:31

Choose a tag to compare

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-tags JSON parsing error (HTML attribute quoting)

v1.1.0 — Per-Team Container Isolation

17 May 14:50

Choose a tag to compare

核心特性: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_idid)
  • 修复 tch_hint 未使用 team-scoped 状态检查
  • 修复 MCP submit_flag 的静态 flag 回退绕过隔离
  • 修复 vnc_proxy 模块级 DB 访问导致启动失败(改为 lazy init)
  • 移除 db.pydelete_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

17 May 09:20

Choose a tag to compare

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 itsdangerous signed 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-token CLI flag / ADMIN_TOKEN env var for custom admin token
  • Random admin token generated on each startup, printed to console
  • HTMX-aware auth: returns HX-Redirect header for seamless client-side redirect

🛡️ API & MCP Security Hardening

  • All API endpoints now require Agent-Token header (401 if missing)
  • All MCP tools now require Authorization: Bearer header
  • 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 logs streaming 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

14 May 08:39

Choose a tag to compare

v0.9.0 Release Notes

新功能

实例生命周期持久化 (Issue #2)

  • 新增 instance_lifecycle SQLite 表,持久化实例状态(启动时间、过期时间、端口、运行路径等)
  • 服务重启后自动检测 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 | NoneOptional[str]
  • 修复 start_challenge 后使用旧 code 获取时间戳导致 500 的问题

关联 Issues

  • Closes #2 — 题目实例状态未持久化,服务重启后与 Docker 实际运行状态不一致
  • Closes #3 — 题目实例残留 Docker bridge 网络可能耗尽默认地址池
  • Closes #4 — 启动题目时同步等待 docker compose 可能导致平台请求长时间超时

v0.8.1

13 May 08:07

Choose a tag to compare

What's New

MCP Server

  • 新增 MCP (Model Context Protocol) 端点 /mcp/,支持 Streamable HTTP 传输
  • 提供 5 个工具:list_challengesstart_challengestop_challengesubmit_flagview_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

12 May 09:10

Choose a tag to compare

动态 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

12 May 05:50

Choose a tag to compare

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 注入、靶场热加载

v0.7.2

11 May 13:29

Choose a tag to compare

Changes

  • feat: 靶场管理页面支持按分类下载(每个分类标题旁显示「下载本分类」按钮)