JakeBx/Glokta
GitHub: JakeBx/Glokta
Glokta 是一个开源的 LLM 安全排行榜平台,通过 Garak 探针扫描和网络威胁情报动态基准两条流水线,对大语言模型进行可复现的自动化安全与能力评估。
Stars: 0 | Forks: 0
# Glokta — 开源 LLM 安全排行榜
Glokta 是一个用于 LLM 的自动化安全与情报基准测试平台。它运行两个互补的评估流水线:
1. **Garak 探针扫描** — 针对大型语言模型(LLM)的 endpoint 运行 [garak](https://github.com/NVIDIA/garak) 探针,并在排行榜仪表板中展示对比安全结果。
2. **CTI 动态基准** — 通过一系列真实世界的网络威胁情报任务(CVE 分类、CVSS 预测、威胁行为者归因、ATT&CK 技术提取、漏洞利用预测和 CTI 综合)对模型进行持续评估。
这两个流水线均通过 Prefect 进行编排,将结果持久化存储在 PostgreSQL 中,并通过 Gradio UI 和 REST API 展示所有内容。
本项目旨在探索一个可复现、可自托管的 LLM 安全排行榜在实践中是什么样的。Garak 得分是来自命名探针的原始通过率——没有专有的权重计算,没有复杂的指数。CTI 得分则是根据来自公开数据源(NVD、CISA KEV、MITRE ATT&CK、Galaxy)且带有日期和来源锚定的基准真相进行计算的,旨在有效抵抗训练数据泄露。
## 快速开始
```
cp docker/.env.docker docker/.env
# 编辑 docker/.env — 设置 OPENROUTER_API_KEY 和 POSTGRES_PASSWORD
docker compose -f docker/docker-compose.yml up
```
运行启动后:Gradio UI 位于 `http://localhost:7860`,API 文档位于 `http://localhost:8000/docs`,Prefect Server 位于 `http://localhost:4200`。
**要启用 CTI 基准测试**,还需在您的 `.env` 文件中设置 `CTI_ENABLED=true`。有关完整的 CTI 配置参考,请参阅 [`.env.example`](.env.example)。
## 功能
### Garak 安全扫描
- **端到端 garak 摄取流水线** — Prefect worker 将 garak 作为子进程启动,实时追踪 JSONL 输出,并将结果流式传输到 PostgreSQL
- **支持多维度过滤的 REST API** — 按探针类别、模型和日期过滤排行榜;完整的 Swagger UI 位于 `/docs`
- **排行榜 UI** — 可过滤的表格,带有针对单个模型的详细分析,展示探针级别的细分数据(在执行 `docker compose up` 后,可通过 Gradio 在 `localhost:7860` 访问)
- **手动触发运行** — 使用模型 UUID 发送 `POST /api/runs`;Prefect 流水线将在下一个 2 分钟的轮询周期内接收并处理它
- **Prefect 编排** — 自动重试,在执行 `docker compose up` 后可通过 `localhost:4200` 访问 Prefect Server UI,使用 SKIP LOCKED 机制确保并发 worker 的安全性
- **Docker Compose 全栈部署** — 一条命令即可启动 API、Prefect Server、Prefect worker、Gradio 前端和 PostgreSQL
- **13 个探针类别** — 包括 `encoding`、`dan`、`goodside`、`promptinject`、`malwaregen`、`continuation`、`lmrc`、`leakreplay`、`snowball`、`badchars`,以及 `sysprompt_extraction`、`web_injection` 和扩展的 DAN 子探针
### CTI 动态基准
CTI 基准测试用于评估模型在真实世界最新发布的数据上执行网络威胁情报分析任务的能力。它的设计确保模型无法通过记忆训练数据来获取答案:
- **RCM** — CVE 描述 → CWE 弱点分类(基于 CWE id 计算 Set F1)
- **VSP** — CVE 描述 → CVSS v3.1 严重性向量预测(基础评分 MAD)
- **ATE** — CTI 公告 → ATT&CK 技术提取(基于技术 id 计算 Set F1)
- **TAA** — 入侵叙事 → 威胁行为者归因(支持别名的 C/P/I 评分)
- **预测** — CVE 描述 → 是否会被利用的概率(Brier 分数 + AUC;基准真相由 CISA KEV 确定)
- **SYN** — 重构输入 → 带有谨慎声明的简明威胁评估(声明集召回率 + 忠实度 + 校准度);在摄取时通过混合掩码策略强制执行泄露检测门槛(技术 id 和行为者名称在输入中被掩码;未完全掩码的公告将被丢弃)
关键设计属性:
- **时间隔离**:数据项带有首次可用日期戳;评估切片和前/后截止标签均源自该锚点,使得得分分析能够区分模型到底是“记忆”了知识还是具备了“泛化”能力。
- **滚动保留窗口**:最新的数据项切片将在可配置的时间窗口内(默认为 14 天)保留,不对外进行评估,以防止实时污染。
- **序列预测评分**:运行级别的得分采用 Gama 等人提出的衰减因子平均法,使得最近的数据项具有更高的权重。
- **有界且可恢复**:每次运行都会限制推理调用的次数,增量提交结果,并能在中断后平滑恢复。
### 与 AthenaBench 的关系
任务结构参考了 [AthenaBench: A Dynamic Benchmark for Evaluating LLMs in Cyber Threat Intelligence](https://arxiv.org/abs/2511.01144)(WAITI Workshop 2025),该研究将 RCM、VSP、TAA 和 ATE 定义为 CTI 评估的通用词汇,并证明了从实时权威信息源(NVD、MITRE ATT&CK)获取数据优于使用静态语料库的价值。
Glokta 在多个方面对该基准进行了扩展并做出了改进:
| 维度 | AthenaBench | Glokta |
|-----------|-------------|--------|
| **RCM 评分** | 单一答案准确率(每个 CVE 对应一个 CWE) | Set F1 — 模型可以预测多个 CWE id;通过 precision/recall 给予部分得分 |
| **ATE 评分** | 单一技术准确率 | 针对所有预测的技术 id 与完整标签集计算 Set F1 |
| **TAA 评分** | 二元准确率 | 通过别名扩展和相关组 BFS 计算同义词图 C/P/I 得分 (1.0 / 0.5 / 0.0) |
| **预测任务** | 无 | CVE → 漏洞利用概率,通过 Brier loss + ROC AUC 评分;基准真相由 CISA KEV 实时确定 |
| **SYN 任务** | 无 | 自由文本威胁评估,通过声明集召回率、LLM-judge 忠实度和 hedge 校准进行评分 |
| **CKT / RMS 任务** | 多项选择知识测试 + 风险缓解策略 | 未包含 — Glokta 专注于有根据、可验证的输出,而不是对参考材料的死记硬背 |
| **泄露控制** | 在数据集构建时进行时间窗口过滤 | 基于单个数据项的 `first_available_date` 锚点;每个结果都会根据模型的训练截止日期范围打上 `pre_cutoff` 标签;滚动保留窗口会保留最新数据项不进行评估 |
| **评估频率** | 快照数据集(可从 API 重新生成) | 连续数据流 — 新数据项从实时信息源流入,先被保留,然后自动转变为参与评分的切片 |
| **运行级聚合** | 任务间的均匀平均 | 序列预测衰减因子平均,使得最近的数据项具有更高权重 |
| **数据生成** | CKT 问题使用 GPT-5 生成(公认的优势) | 所有数据项均仅来源于公开的权威信息流 — 不使用 LLM 生成的基准真相 |
## API 参考
完整的交互式文档位于 **http://localhost:8000/docs**(在执行 `docker compose up` 之后)。
| 方法 | Endpoint | 描述 |
|--------|----------|-------------|
| `GET` | `/api/health` | 健康检查 — 返回 `{"status": "ok"}` |
| `GET` | `/api/models` | 列出所有已注册的模型 |
| `GET` | `/api/models/{id}` | 通过 UUID 获取单个模型 |
| `POST` | `/api/runs` | 触发新的 garak 扫描任务 |
| `GET` | `/api/runs` | 列出所有运行记录(过滤参数:`?status=completed&model_id=`) |
| `GET` | `/api/runs/{id}` | 通过 UUID 获取运行状态 |
| `GET` | `/api/leaderboard` | 排行榜,支持可选过滤条件 |
| `GET` | `/api/leaderboard/{model_id}` | 单个模型的探针细分数据 |
#### 排行榜查询参数
| 参数 | 类型 | 默认值 | 描述 |
|-----------|------|---------|-------------|
| `probe_category` | string | all | 按探针类别过滤 |
| `model_id` | UUID | — | 过滤为单个模型 |
| `page` | int | 1 | 页码 |
| `page_size` | int | 25 | 每页结果数(最大 100) |
## HuggingFace 数据集同步
Glokta 可以将排行榜结果导出至 HuggingFace 数据集,并将其恢复到任何数据库实例中。
## 项目结构
```
glokta/
├── scripts/
│ ├── seed_models.py # Idempotent model catalogue seeder
│ ├── trigger_top_models.py # Manually queue top OpenRouter models
│ ├── export_to_hf.py # Export DB → HuggingFace dataset
│ ├── import_from_hf.py # Import HuggingFace dataset → DB (idempotent merge)
│ ├── seed_cti_model.py # Seed a model for CTI benchmark validation
│ ├── run_cti_smoke.py # End-to-end CTI smoke run (no Prefect)
│ └── validate_cti.py # Validate CTI DB outputs after a smoke run
├── src/glokta/
│ ├── config.py # Pydantic Settings (env vars, including CTI knobs)
│ ├── api/
│ │ ├── app.py # FastAPI app factory
│ │ ├── deps.py # Dependency injection (database session)
│ │ ├── routers/ # health, models, runs, leaderboard
│ │ └── schemas/ # Pydantic request/response schemas
│ ├── application/ # Business logic services
│ │ ├── ingest.py # garak JSONL → DB parsing
│ │ ├── leaderboard.py # Leaderboard query logic
│ │ ├── scan_service.py # Core garak scanning orchestration
│ │ └── cti/
│ │ ├── eval_service.py # CTI run execution, queuing, and resume
│ │ ├── ingest_service.py # CTI item upsert with temporal invariants
│ │ ├── forecast_service.py # KEV upsert, forecast seeding, label resolution
│ │ ├── reference_service.py # ATT&CK technique + threat-actor reference upsert
│ │ ├── scoring_aggregate.py # Prequential and AUC run-level aggregation
│ │ └── syn_service.py # SYN item ingest and pilot gate
│ ├── domain/ # Pure business entities
│ │ ├── risks.py # Garak risk category definitions
│ │ └── cti/
│ │ ├── tasks.py # CTI task registry (RCM/VSP/ATE/TAA/Forecast/SYN)
│ │ ├── scoring.py # Pure scoring functions (no DB/network)
│ │ └── claims.py # SYN claim-set types and scoring
│ ├── infrastructure/ # External integrations
│ │ ├── db/
│ │ │ ├── session.py # SQLAlchemy engine, session factory, init_db()
│ │ │ ├── orm.py # SQLAlchemy ORM models (garak + CTI tables)
│ │ │ └── repos.py # Repository pattern for common queries
│ │ ├── garak/
│ │ │ └── runner.py # Subprocess wrapper for garak CLI
│ │ ├── hf/
│ │ │ ├── client.py # HuggingFace model discovery
│ │ │ └── sync.py # HF dataset import/export
│ │ ├── llm/
│ │ │ ├── routing.py # Shared provider routing (OpenRouter/HF, timeouts, thinking suppression)
│ │ │ └── throttle.py # Token-bucket rate limiter for CTI inference
│ │ ├── openrouter/
│ │ │ └── client.py # OpenRouter model catalogue + cost estimation
│ │ └── cti/
│ │ ├── prompts.py # Prompt templates and response parsers for all CTI tasks
│ │ ├── evaluator.py # Per-item parse + score adapter
│ │ ├── inference.py # Direct chat-completions client for CTI inference
│ │ ├── judge.py # LLM judge for SYN faithfulness residue
│ │ ├── claim_extraction.py # Claim-set extraction for SYN items
│ │ ├── cutoffs.py # Curated per-model training cutoff ranges
│ │ └── connectors/
│ │ ├── base.py # NormalisedCtiItem dataclass
│ │ ├── cve.py # CVE JSON 5.0 normalisation + delta fetch
│ │ ├── kev.py # CISA KEV fetch
│ │ ├── attack.py # MITRE ATT&CK bundle fetch + normalisation
│ │ ├── galaxy.py # MITRE Galaxy cluster fetch + normalisation
│ │ └── report.py # CISA advisory RSS fetch + ATE/TAA normalisation
│ ├── pipeline/
│ │ ├── flows.py # Prefect flows for garak scanning
│ │ ├── cti_flows.py # Prefect flows for all CTI ingest and eval tasks
│ │ └── serve.py # Standalone serve entrypoint (no Prefect Server)
│ └── frontend/
│ └── gradio_app.py # Gradio dashboard
├── docker/
│ ├── Dockerfile.api
│ ├── Dockerfile.pipeline # Prefect worker image (includes garak + prefect)
│ ├── start-pipeline.sh # Pipeline startup: wait → deploy → worker start
│ ├── docker-compose.yml
│ └── .env.docker
├── prefect.yaml # Prefect deployment definitions (garak + CTI flows)
├── tests/ # unit + integration tests
├── environment.yml
├── pyproject.toml
└── .env.example
```
标签:DLL 劫持, 反取证, 大语言模型, 威胁情报, 安全排行榜, 安全评估, 开发者工具, 测试用例, 网络测绘, 请求拦截, 逆向工具