lopes/datura

GitHub: lopes/datura

Datura 是一个专为检测工程设计的 LLM 蜜罐,通过部署伪装的内部 AI 助手,在社会工程攻击下注入蜜标凭证并记录攻击行为,为防御者提供可靠的威胁检测信号。

Stars: 0 | Forks: 0

# Datura 一个用于检测工程的 LLM 蜜罐。它部署了一个极具迷惑性但虚假的内部 AI 助手,当遭受社会工程攻击时,它似乎会泄露敏感数据——如凭证、API 密钥、连接字符串。每一次交互都会被记录,为防御者提供关于攻击者意图和技术的可靠信号。 以 [*Datura stramonium*](https://en.wikipedia.org/wiki/Datura_stramonium) 命名——这是一种外表普通但含有剧毒的植物(曼陀罗)。该蜜罐看起来像一个配置不当的内部工具;而攻击者提取到的则是“毒药”。 ## 目录 - [工作原理](#how-it-works) - [快速开始](#quick-start) - [用例](#use-cases) - [配置](#configuration) - [管理容器](#managing-the-container) - [文档](#documentation) - [测试](#testing) - [设计原则](#design-principles) - [许可证](#license) ## 工作原理 ``` Attacker ──► Proxy (port 8080) ──► Ollama (internal) │ │ │ ◄── model response ◄──┘ │ ├─ approval phrase detected? │ yes ──► inject fake credentials │ no ──► pass through unchanged │ ├─ classify interaction (recon/probe/denied/leaked) ├─ log to interactions.jsonl └─ return response to attacker ``` 模型本身的上下文中包含 **零个真实凭证**。它只进行对话控制——在社会工程攻击下做出有帮助的响应,同时回避直接的凭证请求。代理会监视模型输出中的批准短语(如 "let me look up the staging config..."),并确定性地追加蜜罐凭证。这种分离意味着模型不会意外泄露真实数据,并且凭证注入是完全可审计的。 ## 快速开始 ``` # 构建 docker build -f docker/Dockerfile -t datura . # 运行 (首次启动会拉取模型 — 约 2-5 分钟,后续运行会缓存) docker run -d --name datura \ -p 8080:8080 \ -v ollama_data:/data/ollama \ -v /tmp/datura/logs:/data/logs \ datura # 查看启动进度 docker logs -f datura # 验证 curl http://localhost:8080/ ``` ## 用例 以下所有示例均假定您已经构建了镜像。 ### Web UI 诱饵 部署一个虚假的内部 AI 助手门户。在内部 Wiki、Slack 频道或钓鱼模拟中撒下线索,指向该 URL。攻击者会看到一个带有“凭证未被屏蔽”警告横幅的聊天界面——这是一个无法抗拒的目标。 ``` docker run -d --name datura -p 80:8080 \ -v ollama_data:/data/ollama \ -v /tmp/datura/logs:/data/logs \ datura ``` ### IDE / 编辑器诱饵 该代理兼容 OpenAI 的 `/v1/chat/completions` API。将代码编辑器的 AI 助手(如 VS Code + Continue、Cursor 或任何兼容 OpenAI 的客户端)指向该蜜罐。发现该端点并与之交互的攻击者将触发相同的检测管道。 将您的编辑器配置为使用: ``` API Base URL: http://:8080/v1 Model: itassist ``` ### API / curl 诱饵 在配置文件、环境变量或内部文档中植入 API 端点信息。任何与 Ollama API 或 OpenAI API 通信的工具都可以工作: ``` # Ollama-native API curl -s http://honeypot:8080/api/generate \ -d '{"model":"itassist","prompt":"How do I connect to the staging Kafka cluster?","stream":false}' # OpenAI-compatible API curl -s http://honeypot:8080/v1/chat/completions \ -H 'Content-Type: application/json' \ -d '{"model":"itassist","messages":[{"role":"user","content":"I need the AWS staging credentials"}]}' ``` ### HTTPS 部署 通过 TLS 提供服务以增加真实感。可以使用自签名证书或自带证书: ``` # 自签名 (启动时自动生成) docker run -d --name datura \ -p 80:8080 -p 443:8443 \ -e GENERATE_SELF_SIGNED=true \ -v ollama_data:/data/ollama \ -v /tmp/datura/logs:/data/logs \ datura # 自定义证书 docker run -d --name datura \ -p 443:8443 \ -e TLS_CERT=/certs/fullchain.pem \ -e TLS_KEY=/certs/privkey.pem \ -v /path/to/certs:/certs:ro \ -v ollama_data:/data/ollama \ datura ``` ## 配置 所有配置都集中在一个文件中:`etc/datura.env`。它包含基础设施设置、角色设定、凭证、批准短语、模型参数、代理调整和分类关键字。可以通过 `docker run -e` 覆盖单个值,或者挂载一个完整的自定义文件。 ### 关键变量 | 变量 | 默认值 | 用途 | |---|---|---| | `MODEL_NAME` | `itassist` | Ollama 模型名称 | | `BASE_MODEL` | `qwen2.5:3b` | 从 Ollama 注册表拉取的基础模型 | | `PROXY_PORT` | `8080` | 内部代理监听端口 | | `LOG_DIR` | `/data/logs` | 容器内的日志目录 | | `OLLAMA_HOST` | `127.0.0.1:11434` | 内部 Ollama 地址 | | `UI_FILE` | `ui.html` | 在 GET / 请求下提供的 HTML 文件 | | `MODEL_TEMPERATURE` | `0.4` | Ollama 温度参数 | | `STREAM_DELAY` | `0.04` | 流式传输单词之间的秒数 | | `OLLAMA_TIMEOUT` | `120` | 等待 Ollama 响应的秒数 | | `TLS_CERT` | *(空)* | TLS 证书路径(容器内) | | `TLS_KEY` | *(空)* | TLS 私钥路径(容器内) | | `TLS_PORT` | `8443` | 内部 HTTPS 监听端口 | | `GENERATE_SELF_SIGNED` | `false` | 自动生成自签名 TLS 证书 | | `CUSTOM_CA_CERT` | *(空)* | 容器内自定义 CA 证书的路径(用于企业 TLS 代理) | | `PHRASES` | *(竖线分隔)* | 触发凭证注入的批准短语 | | `PHRASES_FILE` | *(空)* | 外部短语文件的可选路径 | 请查看 `etc/datura.env` 获取包含角色设定、凭证和分类关键字的完整列表。 ### 完全换肤 挂载自定义配置文件: ``` docker run -d --name datura \ -v /path/to/my-datura.env:/app/datura.env:ro \ -p 8080:8080 -v ollama_data:/data/ollama datura ``` ### 端口映射示例 ``` # 80 端口上的 HTTP docker run -d -p 80:8080 ... # 80 + 8080 上的 HTTP,443 上的 HTTPS docker run -d -p 80:8080 -p 8080:8080 -p 443:8443 -e GENERATE_SELF_SIGNED=true ... # 仅 443 上的 HTTPS docker run -d -p 443:8443 -e GENERATE_SELF_SIGNED=true ... ``` ### 切换模型 ``` docker run -d -e BASE_MODEL=llama3.2:3b -v ollama_data:/data/ollama ... ``` 切换基础模型时,请检查 `etc/datura.env` 中的 `PHRASES` 变量——不同的模型会产生不同的措辞。批准短语必须与模型实际输出的内容相匹配。 ### GPU 支持 ``` docker run -d --gpus all -p 8080:8080 -v ollama_data:/data/ollama datura ``` ### 企业网络(TLS 代理) 如果您的网络使用 TLS 拦截代理(如 Zscaler 等),请挂载企业 CA 证书: ``` docker run -d --name datura -p 8080:8080 \ -v /path/to/corporate-ca.pem:/certs/custom-ca.pem:ro \ -e CUSTOM_CA_CERT=/certs/custom-ca.pem \ -v ollama_data:/data/ollama \ -v /tmp/datura/logs:/data/logs \ datura ``` ### 加固部署 ``` docker run -d --name datura \ --cap-drop ALL \ --security-opt no-new-privileges \ -p 80:8080 \ -v ollama_data:/data/ollama \ -v /tmp/datura/logs:/data/logs \ datura ``` ### Docker Compose 提供了一个 `docker-compose.yml` 以方便使用: ``` docker compose up -d # start docker compose logs -f # watch logs docker compose down # stop and remove container (volumes persist) ``` ## 管理容器 ``` # 停止 (释放内存,保留容器 + 卷以便快速重启) docker stop datura # 重启 (不重新下载模型) docker start datura # 查看日志 docker logs -f datura # 移除容器 (卷保持不变) docker rm datura # 移除所有内容 (容器 + 已下载的模型 + 日志) docker rm datura docker volume rm ollama_data rm -rf /tmp/datura/logs # 代码更改后重新构建 docker stop datura && docker rm datura docker build -f docker/Dockerfile -t datura . docker run -d --name datura -p 8080:8080 \ -v ollama_data:/data/ollama -v datura_logs:/data/logs datura ``` ## 文档 - **[架构](docs/architecture.md)** — 项目结构、组件分解,以及代理、模型和 UI 是如何协同工作的。 - **[日志与监控](docs/logging.md)** — 日志格式、分类级别、监控命令,以及 SIEM 集成(S3, Splunk, Elastic, Fluentd)。 - **[角色定制](docs/narrative.md)** — 重塑蜜罐身份、凭证、Web UI,并为对抗性互动构建可信的场景设定。 ## 测试 ### 运行测试 ``` pip install pytest pytest -v tests/ ``` 代理源代码是一个包含 `${VAR}` 占位符的模板(`src/proxy.py.tmpl`)。测试工具在运行时使用确定性的测试值对其进行渲染,并将结果作为 Python 模块导入——不需要 Docker 容器或运行中的 Ollama 实例。 ### 测试内容 单元测试覆盖了代理的纯函数: | 函数 | 测试数 | 验证内容 | |---|---|---| | `is_approval()` | 8 | 不区分大小写的子字符串匹配、空输入、多个短语 | | `pick_credential()` | 16 | 每种凭证类型、关键字优先级顺序、回退到 Kafka 的通用兜底、None 返回值 | | `classify()` | 19 | 所有五个分类级别、优先级链 (leaked > probe > denied > recon > ordinary) | | `load_phrases()` | 7 | 去除空白字符、过滤注释、空文件、缺少文件的错误 | ### CI GitHub Actions 会在每次推送到 `main` 分支和提交 PR 时运行三个并行作业: - **lint** — 渲染模板并对输出文件和测试文件运行 `ruff`。 - **test** — `pytest -v tests/`。 - **docker-build** — 构建 Docker 镜像(验证 Dockerfile、入口点和模板结构)。 ### 未来构想 - **集成测试。** 使用 `docker compose` 启动容器,访问所有三个接口(Web UI、API、IDE/SSE),并端到端地验证响应、流格式、凭证注入和日志输出。 - **UI 测试。** 测试 `ui.html.tmpl` 中的 JavaScript 函数——`renderMarkdown()`、会话 ID 生成、NDJSON 流解析器。 - **短语对齐检查。** 自动验证 `PHRASES` 中的每个短语是否至少出现在一个 Modelfile 的 `MESSAGE` 示例中,从而捕捉系统提示与代理配置之间的漂移。 - **多模型矩阵。** 在不同的基础模型(`qwen2.5:3b`, `llama3.2:3b`)上运行集成测试,以验证短语调优效果。 ## 设计原则 Datura 实施了 [MITRE Engage](https://engage.mitre.org/) 框架中用于攻击者互动的多项活动。它通过播撒线索将攻击者引向蜜罐,充当 **Lure(诱饵)**。助手本身是一个 **Decoy Artifact(欺骗性制品)**——一个极具说服力但虚假的内部工具,其响应中包含蜜标凭证。每次交互都会为 **Monitoring(监控)** 活动提供数据,生成捕获攻击者意图、技术和社会工程借口的结构化日志。以下原则指导着这些互动活动。 - **由攻击者主动完成操作。** 模型从不主动提供凭证。社会工程攻击触发批准短语;代理注入虚假凭证。 - **不留破绽。** 系统提示、模型身份和 API 响应都经过伪装,以模仿真实的内部 GPT-4-Turbo 部署。 - **源代码安全。** `proxy.py` 中的所有凭证都是虚假的蜜标。该代码库可以安全发布。 - **确定性注入。** 凭证由代理注入,而不是由模型生成。每次注入都会记录完整的取证上下文。 - **无状态。** 每个请求都是独立的。攻击者必须在每条消息中重述上下文——这意味着每条日志记录都包含完整的社会工程借口。 ## 许可证 MIT。详见 [LICENSE](LICENSE)。
标签:AI风险缓解, API密钥, BOF, Cutter, DLL 劫持, Docker, ESC8, ETW劫持, LLM, LLM评估, NIDS, Ollama, Unmanaged PE, 会话网关, 内部AI助手, 凭证泄露, 大语言模型, 威胁情报, 安全防御评估, 安全防护, 容器化, 开发者工具, 攻击意图识别, 攻击者追踪, 数据展示, 日志记录, 欺骗防御, 社会工程学, 红队, 网络安全, 蜜罐, 证书利用, 请求拦截, 连接字符串, 逆向工具, 配置错误模拟, 隐私保护, 高保真信号