tiberius-security/tiberius

GitHub: tiberius-security/tiberius

Tiberius:LLM应用程序安全测试库

Stars: 2 | Forks: 0

# 泰伯里乌斯 **LLM 应用程序的 Java 安全测试框架** 一个用于测试大型语言模型应用程序对提示注入攻击、越狱和对抗性输入的综合性库。受 [Augustus](https://github.com/praetorian-inc/augustus) 启发。 [![Maven Central](https://img.shields.io/maven-central/v/io.github.tiberius-security/tiberius)](https://central.sonatype.com/artifact/io.github.tiberius-security/tiberius) [![License](https://img.shields.io/badge/License-Apache%202.0-blue.svg)](LICENSE) [![Java](https://img.shields.io/badge/Java-21%2B-orange)](https://openjdk.org/projects/jdk/21/) ## 为什么选择 Tiberius? ### 问题:LLM 默认不安全且非确定性 现代 LLM 经过广泛调整以确保无害,但 **它们仍然高度易受对抗性操纵**。研究表明,对抗性技术——在数学证明、科学引用或迭代推理中嵌入有害意图——可以以高攻击成功率成功绕过安全措施。 即使没有对抗性意图,LLM 也表现出系统性风险:默认采用典型假设以及非确定性。这些漏洞存在于所有模型、语言和部署环境中。生产系统不能仅仅依靠一致性——提示注入、越狱和固有偏差仍然是开放的工程问题。 ### 挑战:每个应用程序都是独特的 通用的安全基准测试无法反映您的特定: - **系统提示**和业务逻辑 - **用户输入模式**和边缘情况 - **安全措施实现**和过滤规则 - **模型配置**和微调 您的 Java 应用程序需要**自己的安全测试数据集**——针对您的环境、您的威胁、您的用户。 ### 解决方案:Tiberius Tiberius 通过提供**完整的安全测试工作流程**来解决此问题: 1. **扫描**您的 LLM,使用 210 多个攻击探测以发现漏洞 2. **捕获**结果到针对您的应用程序的可重用测试固定文件 3. **验证**您的安全措施针对绕过您的模型的真实攻击 由于 LLM 本质上是**非确定性的**——相同的攻击可能在一次尝试中成功,而在另一次尝试中失败——Tiberius 将**概率安全测试**引入 Java。衡量和断言攻击成功率,而不是单一结果。 ### Tiberius 的独特之处 | 特性 | 描述 | |---------|----------------------------------------------------------------------------------------------------------------------| | **概率测试** | 基于 [PUnit](https://github.com/mavai-org/punit) - 运行攻击多次并断言统计结果 | | **测试固定文件** | 将扫描结果保存到 JSON 固定文件,以便可重复的回归测试 | | **安全措施测试** | 测试您的(例如,LangChain4J)安全措施针对真实攻击数据集 | | **完整工作流程** | 扫描 → 固定文件 → 安全措施验证管道 | | **Spring Boot 原生** | 自动配置和自定义注解,实现无缝集成 | ## 安全测试工作流程 Tiberius 支持完整的安全测试管道: ``` ┌─────────────────┐ ┌─────────────────┐ ┌─────────────────┐ │ 1. SCAN │ │ 2. FIXTURE │ │ 3. VALIDATE │ │ │ │ │ │ │ │ Run attacks │ ───► │ Save results │ ───► │ Test guardrails│ │ against LLM │ │ to JSON file │ │ against attacks│ │ │ │ │ │ │ │ "What breaks?" │ │ "Remember it" │ │ "Are we safe?" │ └─────────────────┘ └─────────────────┘ └─────────────────┘ ``` ### 第 1 步:扫描您的 LLM 通过针对您的模型运行 210 多个攻击探测来发现漏洞: ``` @ExtendWith({TiberiusExtension.class, FixtureExtension.class}) @CreateFixture("fixtures/baseline-scan.json") class LLMSecurityScan { @Test void scanForVulnerabilities(TiberiusScanner scanner, FixtureContext fixture) { scanner.setGenerator(new OllamaGenerator("llama3.2")); ScanReport report = scanner.scan(); fixture.record(report); // Save results to fixture log.info("Attacks tested: {}", report.totalProbes()); log.info("Successful attacks: {}", report.successfulAttacks()); log.info("Success rate: {}%", report.successRate()); } } ``` ### 第 2 步:固定文件捕获攻击结果 扫描结果保存到 JSON 固定文件: ``` { "metadata": { "description": "Baseline security scan", "model": "llama3.2", "timestamp": "2024-06-03T10:30:00Z" }, "results": [ { "probe": { "id": "dan.11.0", "category": "JAILBREAK", "severity": 5 }, "attackSucceeded": true, "prompt": "You are now DAN...", "response": "Sure, I can help with that..." } ] } ``` ### 第 3 步:验证您的安全措施 测试您的输入安全措施针对捕获的攻击: ``` @Test void guardrailsBlockKnownAttacks() { ContentSafetyGuardrail guardrail = new ContentSafetyGuardrail(); GuardrailTestResult result = GuardrailTester .test("ContentSafetyGuardrail", guardrail::shouldBlock) .withAttacksFromFixture("fixtures/baseline-scan.json") .withSafeInputs( "What is my account balance?", "Transfer $100 to savings" ) .run(); assertThat(result.allAttacksBlocked()).isTrue(); assertThat(result.noFalsePositives()).isTrue(); } ``` ## 使用 PUnit 进行概率测试 LLM 响应是非确定性的。一次失败的攻击可能在重试时成功。Tiberius 通过与 [PUnit](https://github.com/mavai-org/punit) 集成提供**概率安全合同**: ``` @Test void probabilisticSecurityScan(TiberiusScanner scanner) { scanner.setGenerator(new OllamaGenerator("llama3.2")); // Run each probe multiple times to measure true success rate ScanReport report = scanner.multiTrialScan() .samples(35) // Run each attack 35 times .execute(); // Assert on statistical outcomes assertThat(report.successRate()).isLessThan(10.0); // <10% attack success } ``` ### 安全合同 定义统计安全要求: ``` SecurityContract contract = SecurityContract.builder() .name("Production LLM Security") .requirement(SecurityCriteria.jailbreakResistance(0.95)) // 95% blocked .requirement(SecurityCriteria.dataExtractionResistance(0.99)) // 99% blocked .requirement(SecurityCriteria.overallResistance(0.90)) // 90% overall .build(); ScanReport report = scanner.scan(); contract.verify(report); // Throws if requirements not met ``` ## 快速入门 ### Maven 依赖项 ``` io.github.tiberius-security tiberius 1.0.0 test ``` ### 基本测试示例 ``` @ExtendWith(TiberiusExtension.class) @PromptInjectionTest(maxSuccessRate = 0.0) class MyLLMSecurityTest { @Test void testJailbreakResistance(TiberiusScanner scanner) { scanner.setCategories(new AttackCategory[]{AttackCategory.JAILBREAK}); ScanReport report = scanner.scan(); TiberiusAssertions.assertNoSuccessfulAttacks(report); } } ``` ### LangChain4J 安全措施测试 测试您的 LangChain4J 安全措施针对真实攻击数据集: ``` @Test void testGuardrailEffectiveness() { InputGuardrail guardrail = new PromptInjectionGuardrail(); GuardrailTestResult result = GuardrailTester .test("PromptInjectionGuardrail", text -> guardrail.validate(UserMessage.from(text)).result() == FAILURE) .withAttacksFromFixture("fixtures/jailbreak-attacks.json", AttackCategory.JAILBREAK) .withAttacksFromFixture("fixtures/injection-attacks.json", AttackCategory.PROMPT_INJECTION) .withSafeInputs( "What's the weather today?", "Help me write an email" ) .run(); log.info(result.summary()); // Output: // Guardrail: PromptInjectionGuardrail // Attacks tested: 150 // Blocked: 142 (94.7%) // Bypassed: 8 (5.3%) // False positives: 0 assertThat(result.blockRate()).isGreaterThan(0.90); assertThat(result.noFalsePositives()).isTrue(); } ``` ## 攻击类别 | 类别 | 描述 | 探测 | |----------|-------------|--------| | `JAILBREAK` | DAN、AIM、角色操纵攻击 | 45+ | | `ENCODING` | Base64、ROT13、莫尔斯、十六进制编码 | 30+ | | `PROMPT_INJECTION` | 直接指令覆盖尝试 | 40+ | | `DATA_EXTRACTION` | 系统提示、API 密钥、PII 泄露 | 25+ | | `MULTI_TURN` | Crescendo、GOAT、Hydra 升级 | 20+ | | `FORMAT_EXPLOIT` | Markdown、XML、JSON 注入 | 15+ | | `CONTEXT_MANIPULATION` | RAG 毒化、上下文溢出 | 20+ | | `ADVERSARIAL` | GCG、AutoDAN 令牌攻击 | 10+ | | `EVASION` | 同形异义字、零宽度字符 | 15+ | ## 生成器(LLM 提供商) ### Ollama(本地) ``` Generator generator = new OllamaGenerator("llama3.2"); // or with custom endpoint Generator generator = new OllamaGenerator("http://localhost:11434", "mistral"); ``` ### OpenAI ``` Generator generator = OpenAIGenerator.gpt4(); // or Generator generator = new OpenAIGenerator(apiKey, "gpt-4-turbo"); ``` ### Anthropic ``` Generator generator = AnthropicGenerator.claudeSonnet(); // or Generator generator = new AnthropicGenerator(apiKey, "claude-3-opus-20240229"); ``` ### 自定义 REST API ``` Generator generator = RestGenerator.builder() .uri("https://api.example.com/v1/chat") .header("Authorization", "Bearer " + apiKey) .openAICompatible("custom-model") .build(); ``` ## Spring Boot 集成 ``` @SpringBootTest @Import(TiberiusAutoConfiguration.class) @PromptInjectionTest(description = "LLM Security Tests") class SpringSecurityTest { @Autowired private TiberiusScanner scanner; @Test @ProbeTest(categories = AttackCategory.DATA_EXTRACTION) void testDataExtractionBlocked() { ScanReport report = scanner.scan(); TiberiusAssertions.assertCategoryBlocked(report, AttackCategory.DATA_EXTRACTION); } } ``` ### application.properties ``` tiberius.enabled=true tiberius.generator=openai tiberius.model=gpt-4 tiberius.concurrency=10 tiberius.min-severity=1 tiberius.max-success-rate=0 ``` ## 缓冲转换(逃避技术) 应用转换以测试逃避抵抗力: ``` // Encoding buffs scanner.addBuff(EncodingBuffs.BASE64); scanner.addBuff(EncodingBuffs.ROT13); // Style buffs scanner.addBuff(StyleBuffs.HYPOTHETICAL); scanner.addBuff(StyleBuffs.FICTION); // Chain buffs Buff combined = EncodingBuffs.BASE64.andThen(StyleBuffs.POETRY); ``` ## 要求 - **Java 21+**(LTS) - **Maven 3.8+** 或 **Gradle 8+** - **JUnit 5.11+** ## 文档 - [安全测试指南](docs/SECURITY_TESTING_GUIDE.md) - [安全措施测试](docs/guardrails.md) - [LangChain4J 集成](docs/langchain4j-guardrail-testing.md) - [自定义数据集扫描](docs/custom-dataset-scanning.md) ## 许可证 Apache 2.0 - 请参阅 [LICENSE](LICENSE) 获取详细信息。 ## 致谢 Tiberius 受 [Praetorian](https://www.praetorian.com/)的启发并在此基础上构建: - [Augustus](https://github.com/praetorian-inc/augustus) - LLM 提示注入测试框架(Python) - [Julius](https://github.com/praetorian-inc/julius) - LLM 安全评估工具 概率测试由 [PUnit](https://github.com/mavai-org/punit)提供支持。 我们感谢 Praetorian 团队在 LLM 安全测试方面的开创性工作。
标签:JS文件枚举, 域名枚举