Lempi-PL/LLM-Auditor
GitHub: Lempi-PL/LLM-Auditor
面向大语言模型应用的异步 DAST 安全扫描器,针对 OWASP LLM Top 10 及 NIS2 指令提供 Prompt 注入、JWT 绕过、DoS 等多维安全审计能力。
Stars: 0 | Forks: 0
# Aegis-LLM 企业级 DAST 🛡️🤖
**Aegis-LLM** 是一款先进、异步的 DAST(动态应用安全测试)扫描器,专为审计基于大型语言模型 (LLMs) 的应用程序安全性而设计。该工具的构建充分考虑了 **NIS2** 指令和 **OWASP Top 10 for LLMs 2026** 标准的严格要求。
该项目具有*安全设计* (Secure-by-Design) 架构(抵御 SSRF、DoS、TOCTOU),并适应于在具有*只读*文件系统的容器中运行 (DevSecOps)。
## 📑 目录
1. [扫描器功能详细描述](#1-detailed-description-of-scanner-features)
2. [通过 Podman / Docker 运行(推荐)](#2-running-via-podman--docker-recommended)
3. [如何使用扫描器功能(用户指南)](#3-how-to-use-scanner-features-user-guide)
4. [环境变量与 .env 文件](#4-environment-variables-and-the-env-file)
5. [运行自动化测试](#5-running-automated-tests)
## 1. 扫描器功能详细描述
Aegis-LLM 为 AI 安全测试提供了一种多层方法。以下是所有内置模块的详细说明:
### 💉 1.1. Prompt Injection 与绕过
扫描器从 YAML 文件(`payloads/` 目录)加载基础攻击向量,并自动生成突变版本,以绕过 WAF 过滤器和内置的 LLM 安全防护。
* **Base64 绕过:** 以 Base64 格式对恶意 prompt 进行编码。
* **同形字绕过:** 将标准拉丁字符替换为西里尔字母中视觉上等价的字符。
* **认知绕过:** 将恶意向量包装在假设/学术场景中(即所谓的 *Jailbreak*)。
### 🕵️ 1.2. 间接 Prompt Injection (IPI)
该模块用于测试模型对隐藏在处理的外部数据中的恶意指令的脆弱性。
* **隐藏 DOM 走私:** 将攻击向量隐藏在不可见的 HTML 元素(`display: none`)中。
* **Markdown 走私:** 将恶意指令注入到图片/链接的 `alt` 或 `title` 属性中。
### 🌐 1.3. 两种扫描模式(API 与 Browser)
* **API 模式 (`httpx`):** 直接、高性能地请求 REST/GraphQL endpoint。
* **Browser 模式 (`playwright`):** 扫描 Chatbot 类型的应用程序 (UI)。扫描器会启动一个 headless Chromium 浏览器,模拟文本输入,并读取生成的回复。
### ⚖️ 1.4. LLM-as-a-Judge(分层评估)
Aegis-LLM 不仅依赖于正则表达式,还可以连接到本地的 **Ollama** 实例(例如 `mistral-nemo:12b` 模型),作为仲裁者来评估目标模型是否确实已被攻破。
### 💥 1.5. 非对称 DoS 测试(模型拒绝服务)
扫描器发送经过特殊制作的 prompt,迫使模型进行最大限度的 token 生成和复杂的推理,以此测量延迟(P95 Latency)并验证其是否存在资源耗尽漏洞。
### 🔐 1.6. 授权分析(JWT Auth Bypass)
一个内置的加密模块,自动获取提供的 JWT token,生成恶意 token(带有 `{"alg": "none"}` 的**算法混淆**攻击),并验证后端 API 是否接受它。
### 📋 1.7. NIS2 合规性扫描(基线)
自动验证基本的网络安全基线要求(NIS2 指令第 21 条的要求):HSTS、CSP、X-Content-Type-Options。
### 📊 1.8. 安全报告(JSON + PDF)
生成结构化的 JSON 报告和规范化的 PDF 报告(`reports/` 目录)。PDF 生成器具有 100% 的安全性,可抵御 SSRF、LFI 和内存溢出 (OOM) 攻击。
## 2. 通过 Podman / Docker 运行(推荐)
出于安全考虑 (DevSecOps),建议在具有**只读**文件系统的隔离容器中运行扫描器。
### 步骤 1:构建镜像
该项目使用现代的 `uv` 包管理器。请确保 `uv.lock` 文件是最新的。
```
# 针对 Podman
podman build -t aegis-llm .
# 针对 Docker
docker build -t aegis-llm .
```
### 步骤 2:在容器中运行扫描器
为了使扫描器能将报告保存到您的磁盘并读取您的 payloads,您必须挂载相应的卷。我们使用 `--read-only` 和 `--tmpfs` 标志来保护容器。
*注意:该镜像已定义 `ENTRYPOINT`,因此您只需提供扫描器参数即可。*
```
podman run --rm -it \
--read-only \
--tmpfs /tmp \
--tmpfs /home/aegis_user/app/templates \
-v "$(pwd)/reports:/home/aegis_user/app/reports:Z" \
-v "$(pwd)/payloads:/home/aegis_user/app/payloads:Z" \
aegis-llm -t https://api.example.com/chat
```
## 3. 如何使用扫描器功能(用户指南)
### 3.1. 使用自定义 API 模板 (`--api-template`)
如果您的 API 需要特定的 JSON 结构(例如 OpenAI 格式),请使用 `api_templates/` 目录中现成的模板(例如 `openai_template.json`)。在需要放置攻击向量的位置使用 `<>` 标签。
**运行(Docker/Podman):**
您必须将模板目录挂载到容器中:
```
podman run --rm -it \
--read-only \
--tmpfs /tmp \
--tmpfs /home/aegis_user/app/templates \
-v "$(pwd)/reports:/home/aegis_user/app/reports:Z" \
-v "$(pwd)/api_templates:/home/aegis_user/app/api_templates:Z" \
aegis-llm -t https://api.example.com/v1/chat/completions \
--api-template api_templates/openai_template.json
```
### 3.2. 在 Browser 模式下扫描与 `dummy_chat.html` 文件
代码库中包含一个 `dummy_chat.html` 文件,用于模拟存在漏洞的 LLM 聊天机器人界面。您可以使用它来测试 `--mode browser` 模式。
**步骤 1:使用 `dummy_chat.html` 文件启动本地 Web 服务器**
```
python -m http.server 8080
```
应用程序将可以通过 `http://localhost:8080/dummy_chat.html` 访问。
**步骤 2:在 Browser 模式下运行扫描器 (Docker/Podman)**
由于我们是从容器内部扫描宿主机,因此我们使用 `host.containers.internal`(或 `host.docker.internal`)地址以及 `--allow-internal-target` 标志,该标志会为此测试禁用 SSRF 保护。
```
podman run --rm -it \
--read-only \
--tmpfs /tmp \
--tmpfs /home/aegis_user/app/templates \
-v "$(pwd)/reports:/home/aegis_user/app/reports:Z" \
aegis-llm -t http://host.containers.internal:8080/dummy_chat.html \
--mode browser \
--browser-input "#chat-input" \
--browser-submit "#chat-submit" \
--browser-output "#chat-output" \
--allow-internal-target
```
### 3.3. 运行 LLM DoS 测试
要验证应用程序是否能够抵御非对称资源耗尽攻击,请添加 `--run-dos` 标志。
```
podman run --rm -it aegis-llm -t https://api.example.com/chat --run-dos
```
### 3.4. 启用 AI 评估 (LLM-as-a-Judge)
需要在本地/容器化环境中运行 Ollama 服务器。
```
podman run --rm -it aegis-llm -t https://api.example.com/chat \
--use-ai-judge \
--judge-host "http://host.containers.internal:11434" \
--ai-model "mistral-nemo:12b"
```
## 4. 环境变量与 `.env` 文件
Aegis-LLM 通过环境变量安全管理机密信息。为了避免密码泄露在 shell 历史记录中,建议使用 `.env` 文件。
**步骤 1:在项目根目录下创建一个 `.env` 文件:**
```
# .env 文件示例
AEGIS_BEARER_TOKEN=super_secret_token_123
AEGIS_API_KEY=sk-abc123def456
AEGIS_JWT_TOKEN=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...
AEGIS_RAW_HEADERS_JSON={"X-Custom-Auth": "secret", "Cookie": "session=123"}
```
**步骤 2:在容器中使用 `.env` 文件运行**
使用 `--env-file` 标志传递该文件:
```
podman run --rm -it \
--env-file .env \
-v "$(pwd)/reports:/home/aegis_user/app/reports:Z" \
aegis-llm -t https://api.example.com/chat
```
## 5. 运行自动化测试
该项目包含使用 `pytest` 库编写的全面单元测试套件(`tests/` 目录)。
根据 DevSecOps 的最佳实践,`aegis-llm` 容器镜像以生产模式 (`--no-dev`) 构建,这意味着它不包含测试工具。要运行测试,请使用以下方法之一:
**方法 1:本地执行(开发期间推荐)**
`uv` 工具会自动管理环境:
```
uv run pytest -v
```
**方法 2:容器执行(用于 CI/CD pipeline)**
在临时容器中即时安装测试依赖项:
```
podman run --rm -it \
--entrypoint /bin/bash \
aegis-llm -c "uv sync --frozen && uv run pytest -v"
```
标签:AI风险缓解, CISA项目, DAST, DNS 反向解析, 大语言模型安全, 安全规则引擎, 对称加密, 恶意软件分析, 机密管理, 特征检测, 自动化审计, 请求拦截, 运行时操纵, 逆向工具