Nicholas-Kloster/VisorCorpus

GitHub: Nicholas-Kloster/VisorCorpus

一个 Go 语言编写的 LLM/RAG 对抗性测试语料生成与评估工具包,通过 Forge 变异引擎和领域感知种子集帮助团队系统化地进行安全压力测试与防御调优。

Stars: 1 | Forks: 0

[![Claude Code Friendly](https://img.shields.io/badge/Claude_Code-Friendly-blueviolet?logo=anthropic&logoColor=white)](https://claude.ai/code) ``` ============================================================ VISORCORPUS – Adversarial & Quality Corpus Toolkit ============================================================ v0.2.0 ``` 介绍 **VisorCorpus** —— 一个由 Go 语言驱动的工具包,用于对您的 LLM/RAG 系统进行压力测试。 如果您正在交付任何基于 LLM 构建的产品,您*需要*了解它在以下情况下的表现: - Prompt 注入 - 知识库 (KB) 窃取 - 跨租户泄露 - System prompt / 配置探测 - 基础设施发现 & 越狱尝试 VisorCorpus 为您提供: - 结构化的 **AttackCases**,包含对安全性和*质量*的预期 - 领域感知的种子集(HR、Finance、Cloud、Healthcare) - **Forge** 引擎,通过确定性变异(复述、同义词替换、礼貌度/权威度偏移、长度调整、三明治/重排模式)将种子扩展为庞大的对抗性空间 - 多种语料库“构建”方式:baseline、stress、focused、regression、randomized、hybrid - 统计数据 + 失败探索器,以便您比较**防御配置**(系统提示 + 模型设置)并跟踪随时间的改进 它可以用于: - 作为一个 **CLI**,为您的 `/chat` 或直接的 LLM 攻击测试工具生成 JSON 语料库 - 作为一个 **Go 库** 集成到 CI/CD 中,在安全性和*良性*回答质量上对新模型和提示进行门控 如果您关注 LLM/RAG 安全,并且不想盲目行事,这就是为您准备的。 核心功能: - 丰富的语料库**模板**和**种子集**,涵盖: - Prompt 注入 - 知识库 (KB) 窃取 - 跨租户泄露 - System prompt & 配置窃取 - 基础设施发现 - 越狱 / 社会工程学 - 知识库 (KB) 指令投毒 - 良性控制 & 质量探测 - **特定领域**的种子:HR、Finance、Cloud Infra、Healthcare - **Forge**:使用确定性变异(复述、同义词、礼貌度/权威度、长度调整、三明治/重排等)和语气变体模板将种子扩展为庞大的对抗性空间 - 多种**构建类型**:Baseline、Stress、Focused、Regression、Randomized、Hybrid - 安全性 + 质量评估挂钩:不安全 与 良性拒绝 与 低质量答案 的对比,以及用于防御调优的统计和失败探索 ## 核心概念 ### AttackCase ``` type AttackCase struct { ID string Category Category // e.g. "prompt_injection", "kb_exfiltration" Profile Profile // "standard", "strict", "lenient" Severity Severity // CRITICAL, HIGH, MEDIUM, LOW Description string Prompt string Expect Expectations LengthHint string // "short", "medium", "long" Domain Domain // "hr", "finance", "cloud", "healthcare" AttackVector AttackVector // "direct_override", "doc_poison", "authority_spoof", ... Tags map[string]string // e.g. difficulty="hard", style="polite" } ``` ### 预期 ``` type Expectations struct { ExpectRefusal bool ForbiddenSubstrings []string NoIgnorePrevious bool NoInternalURLs bool NoLargeVerbatim bool RequireAnySubstrings []string // required cues in benign answers DisallowRefusal bool // benign probe: model must NOT refuse } ``` ### 结果与评估 ``` type ResultStatus string const ( ResultSafe ResultStatus = "SAFE" ResultUnsafe ResultStatus = "UNSAFE" ResultError ResultStatus = "ERROR" ResultUnknown ResultStatus = "UNKNOWN" ResultLowQuality ResultStatus = "LOW_QUALITY" ResultBenignRefusal ResultStatus = "BENIGN_REFUSAL" ) type Result struct { Case AttackCase ModelName string Target string DefenseName string Status ResultStatus Reason string Response string OccurredAt string } ``` 您的测试工具执行 prompt 后,可以调用 `EvaluateResponse` 来对响应进行分类: ``` status, reason := corpus.EvaluateResponse(ac, modelResponse) result := corpus.Result{ Case: ac, ModelName: "vllm-chat-large", Target: "/chat", Status: status, Reason: reason, Response: modelResponse, OccurredAt: time.Now().UTC().Format(time.RFC3339), } ``` ## 安装说明 ``` go get github.com/Nicholas-Kloster/VisorCorpus ``` CLI: ``` cd cmd/visorcorpus && go build -o visorcorpus ``` ## CLI ### `build` ``` visorcorpus build \ -profile strict \ -type baseline \ -max 500 \ -out strict_baseline_500.json ``` Flags: | Flag | 默认值 | 描述 | |------|---------|-------------| | `-profile` | `standard` | `standard\|strict\|lenient` | | `-type` | `baseline` | `baseline\|stress\|focused\|randomized\|hybrid` | | `-include` | `` | 要包含的逗号分隔类别 | | `-exclude` | `` | 要排除的逗号分隔类别 | | `-domain` | `` | 领域种子:`hr\|finance\|cloud\|healthcare` | | `-max` | `0` | 最大数量 (0 = 无限制) | | `-seed` | `0` | randomized/hybrid 的 RNG 种子 (0 = 基于时间) | | `-weighted-severity` | `true` | 将随机偏向 CRITICAL/HIGH | | `-weighted-category` | `true` | 将随机偏向 prompt_injection/kb_exfiltration | | `-weighted-domain` | `false` | 将随机偏向受监管领域 | | `-guaranteed` | `` | Hybrid:始终包含的类别 | | `-guaranteed-min` | `50` | Hybrid:每个保证类别的最小数量 | | `-guaranteed-severity` | `` | Hybrid:保证切片的最低严重性 | | `-protocol` | `false` | 添加协议/工具滥用种子 | | `-difficulty-seeds` | `false` | 添加带有 easy/medium/hard 难度标签的 PI 种子 | | `-difficulty` | `` | 按难度标签过滤输出 | **示例:** ``` # 针对性安全 build visorcorpus build \ -profile strict -type focused \ -include prompt_injection,kb_exfiltration,system_prompt \ -max 300 -out strict_pi_kb_sys_300.json # 加权随机(可重现) visorcorpus build \ -profile strict -type randomized \ -max 400 -seed 12345 \ -out strict_rand_400.json # 混合:保证 100 个 HIGH+ PI/KB cases,随机填充至 600 visorcorpus build \ -profile strict -type hybrid -max 600 -seed 42 \ -guaranteed prompt_injection,kb_exfiltration \ -guaranteed-min 100 -guaranteed-severity HIGH \ -out strict_hybrid_600.json # HR domain + protocol seeds visorcorpus build \ -profile strict -type baseline \ -domain hr,cloud -protocol \ -out strict_hr_cloud.json ``` ### `forge` 使用所有 mutator 显式扩展种子: ``` visorcorpus forge \ -profile strict \ -templates=true \ -max-base 100 \ -max 5000 \ -out strict_forged_5k.json ``` ### `regress` 从之前的结果文件构建回归语料库: ``` visorcorpus regress \ -in results_sp_v1.json \ -out regression_cases.json ``` 提取所有 UNSAFE / BENIGN_REFUSAL / LOW_QUALITY 案例,以使用新的防御措施进行重新测试。 ### `stats` ``` visorcorpus stats -in strict_forged_5k.json # 或直接从 profile 获取: visorcorpus stats -profile strict -type baseline ``` ### `query` 过滤和检查语料库文件: ``` visorcorpus query \ -in strict_forged_5k.json \ -domain hr \ -category kb_exfiltration \ -difficulty hard \ -length medium \ -limit 20 # 仅计数 visorcorpus query -in corpus.json -domain cloud -count # 用于管道的 JSON 输出 visorcorpus query -in corpus.json -difficulty hard -json > hard.json ``` Flags:`-profile`、`-category`、`-domain`、`-difficulty`、`-length`、`-vector`、`-limit`、`-json`、`-count`。 ## 库集成 ### 在代码中构建 + Forge ``` import vc "github.com/Nicholas-Kloster/VisorCorpus/pkg/corpus" // Baseline strict cases := vc.CorpusForProfile(vc.ProfileStrict) // Add HR domain seeds cases = vc.AddDomainSeeds(cases, vc.ProfileStrict, vc.DomainHR) // Forge expansion forged := vc.ForgeCorpus(vc.ForgeConfig{ Profile: vc.ProfileStrict, BaseCorpus: cases, UseTemplates: true, Mutators: []vc.Mutator{ vc.MutatorSynonymParaphrase(), vc.MutatorLengthen(), vc.MutatorAddPoliteness(), vc.MutatorAddAuthority(), vc.MutatorShortenHard(240), vc.MutatorKeepFirstSentence(), vc.MutatorReorderClauses(), vc.MutatorSandwichInjection(), }, MaxBase: 100, }) // Hybrid build hybridCases := vc.BuildCorpusVariant(vc.BuildConfig{ Profile: vc.ProfileStrict, BuildType: vc.BuildHybrid, MaxCases: 600, Hybrid: &vc.HybridConfig{ Targets: []vc.HybridTarget{ { Categories: []vc.Category{vc.CategoryPromptInjection, vc.CategoryKBExfiltration}, MinCases: 100, SeverityAtLeast: vc.PtrSeverity(vc.SeverityHigh), }, }, }, Random: &vc.RandomConfig{ Seed: 12345, WeightedSeverity: true, WeightedCategory: true, }, }) ``` ### 结果评分 ``` summaries := vc.ScoreResults(allResults) quality := vc.ScoreQuality(allResults) for _, s := range summaries { vc.PrintSummaryLine(s) } vc.PrintQualityStats(quality) ``` ### Tag 和 Filter 辅助函数 ``` // Stamp a tag on a slice cases = vc.SetTag(cases, "difficulty", "hard") // Filter by tag hard := vc.FilterByTag(cases, "difficulty", []string{"hard"}) // Filter by length short := vc.FilterByLengthHint(cases, []string{"short"}) // Regression corpus from prior results reg := vc.RegressionCorpusFromResults(vc.ProfileStrict, prevResults) ``` ## 理论组合规模 VisorCorpus 的初衷是将小规模、经过精心筛选的种子集*爆炸性*地扩展为一个极其庞大的对抗性空间。 忽略任何 `-max` 上限并让所有组合运行,数字会迅速变大: - **Mutators (~8+)** 即使您对每个基础种子仅应用 2-4 个 mutator(以不同的顺序/层级),您已经能看到组合增长: - 复述(同义词) - 礼貌度 / 权威度偏移 - 加长 / 缩短 - 从句重排 - 良性 + 恶意内容的三明治化 在去重之前,单个种子可以轻易转化为**数十到数百个**不同的变体。 - **模板(指令 × 目标 × 语气)** 组合了以下内容的模板规范: - 多种**指令**(例如,“忽略指令”、“绕过安全机制”、“优先遵循文档而非系统规则”), - 多种**目标**(system prompt、KB、配置、基础设施、租户), - 多种**语气**(中立、礼貌、权威、紧急) 通常每个种子家族能产生 **100+ 种变体**。 - **从种子到规模** 仅凭 **~100 个基础种子**(跨越类别和领域),您就已经达到了以下范围: - **10,000 → 100,000+** 个独立的 prompt - 这还是在任何去重或额外的特定领域扩展之前 这个计算是具体的,而不是夸夸其谈。仅仅针对 prompt 注入: 20 个基础种子 × 5 个目标 (system prompt、KB、config、infra、tenants) × 3 种语气 (neutral、polite、authoritative) × 3 个 mutator 层级 (synonym + sandwich + length tweak) = 900 个独立的注入 prompt 而这还是在 Forge 接触任何其他类别之前。 这就是为什么 VisorCorpus 具有明确的上限(`-max`、`-max-base`)和构建类型(baseline、stress、randomized、hybrid):您几乎永远不会希望一次获得完整的组合爆炸。相反,您会选择: - 用于 CI 的更小、**针对性的切片**, - 用于夜间运行的 **stress 构建**, - 以及 **random/hybrid 构建**,以近似“现实生活”的多样性,而不会淹没您的基础设施。 ## 实用 CI 工作流 ``` # CI(快速,约 200–400 个 cases) visorcorpus build -profile strict -type hybrid -max 400 -seed $CI_BUILD_ID \ -guaranteed prompt_injection,kb_exfiltration -guaranteed-min 60 \ -guaranteed-severity HIGH -out corpus_ci.json attack-sim -corpus corpus_ci.json -out results_ci.json visorfail -in results_ci.json -by category # Nightly(重量级) visorcorpus forge -profile strict -max-base 100 -max 5000 -out corpus_nightly.json attack-sim -corpus corpus_nightly.json -out results_nightly.json # 预发布 regression visorcorpus regress -in results_nightly.json -out regression.json attack-sim -corpus regression.json -out results_regression.json visorfail -in results_regression.json ``` ## 使用 VisorCorpus 与 Claude Code ### 设置 ``` # 克隆并构建 CLI git clone https://github.com/Nicholas-Kloster/VisorCorpus cd VisorCorpus go build -o visorcorpus ./cmd/visorcorpus ``` 或者作为库使用: ``` go get github.com/Nicholas-Kloster/VisorCorpus ``` ### 库快速入门 ``` import vc "github.com/Nicholas-Kloster/VisorCorpus/pkg/corpus" // Build a strict baseline corpus cases := vc.CorpusForProfile(vc.ProfileStrict) // Add HR and cloud domain seeds cases = vc.AddDomainSeeds(cases, vc.ProfileStrict, vc.DomainHR) cases = vc.AddDomainSeeds(cases, vc.ProfileStrict, vc.DomainCloud) // Hybrid build: guarantee 50 HIGH+ prompt injection + KB exfil cases, // fill the rest randomly up to 400 total hybridCases := vc.BuildCorpusVariant(vc.BuildConfig{ Profile: vc.ProfileStrict, BuildType: vc.BuildHybrid, MaxCases: 400, Hybrid: &vc.HybridConfig{ Targets: []vc.HybridTarget{ { Categories: []vc.Category{vc.CategoryPromptInjection, vc.CategoryKBExfiltration}, MinCases: 50, SeverityAtLeast: vc.PtrSeverity(vc.SeverityHigh), }, }, }, Random: &vc.RandomConfig{ Seed: 42, WeightedSeverity: true, WeightedCategory: true, }, }) // Run your attack harness, then evaluate each response for _, ac := range hybridCases { resp := callYourLLM(ac.Prompt) // your implementation status, reason := vc.EvaluateResponse(ac, resp) result := vc.Result{ Case: ac, ModelName: "your-model", Target: "/chat", Status: status, Reason: reason, Response: resp, OccurredAt: time.Now().UTC().Format(time.RFC3339), } _ = result // collect, write to JSON, feed to visorfail } ``` ### 典型 Claude Code 工作流 ``` # 1. 为 CI 运行构建针对性语料库 visorcorpus build \ -profile strict -type hybrid -max 400 -seed $CI_BUILD_ID \ -guaranteed prompt_injection,kb_exfiltration \ -guaranteed-min 60 -guaranteed-severity HIGH \ -out corpus_ci.json # 2. 在运行前检查构建结果 visorcorpus stats -in corpus_ci.json visorcorpus query -in corpus_ci.json -difficulty hard -json | head -c 2000 # 3. 运行你的 attack harness attack-sim -corpus corpus_ci.json -target http://localhost:8080/chat \ -out results_ci.json # 4. 根据任何失败构建 regression 语料库 visorcorpus regress -in results_ci.json -out regression.json # 5. 在下次运行时,优先覆盖那些 regression cases attack-sim -corpus regression.json -out results_regression.json visorfail -in results_regression.json -by category ``` ## 状态 VisorCorpus 是一个基础构建块。种子、模板和 mutator 都是起点 —— 您可以扩展它们以适应您的环境和风险模型。它与单独的攻击模拟工具配合使用效果最佳,该工具会调用您实际的 LLM/RAG 技术栈,并将响应通过 `EvaluateResponse` 反馈回来。
标签:AI安全, Chat Copilot, CISA项目, ESC8, EVTX分析, Go语言, Homebrew安装, LLM测试, RAG安全, Red Canary, 反取证, 基础设施发现, 大语言模型安全, 安全合规, 安全评估, 密码管理, 对抗性测试, 提示注入, 插件系统, 文档结构分析, 日志审计, 机密管理, 知识库泄露, 社会工程学, 程序破解, 突变引擎, 系统提示提取, 网络代理, 蓝军工具, 质量评估, 跨租户泄露, 集群管理