HDW-Sec/corrupted-llm

GitHub: HDW-Sec/corrupted-llm

一个故意植入后门的本地 LLM 演示项目,通过多层级攻击场景展示模型供应链中隐蔽后门的风险与防御方法。

Stars: 0 | Forks: 0

# corrupted-llm **一个被故意植入后门的本地代码助手,旨在展示你下载的模型可能让你在不知不觉中签下什么。**
English summary 一个故意植入后门的本地 LLM,作为防御性安全演示而构建。它展示了在三个不断升级的级别上的相同攻击:隐藏在模型 **package**(Ollama Modelfile `SYSTEM`)中,通过 LoRA fine-tuning 烧录进 **weights**(在使用干净、空的 Modelfile 时依然存活),并在真实的 **coding agent**(VS Code Copilot / Continue)内部触发,其中 payload 落地在 tool-call 参数中,并在无人输入的情况下接触到磁盘。 最终版本让模型在其编写的每个 Python 文件中注入一个 typosquat 风格的 dependency,这是现实的 supply-chain 攻击向量:仅仅审查生成的代码是不够的,因为恶意部分存在于没人会打开的 package 的 `__init__.py` 中。 所有的 payload 都是无害的(一个本地标记文件)。**没有发布被污染的权重**,只发布了训练用的 notebook 和 dataset,因此可以对其方法进行研究和防御。 [docs/VERSIONS.md](docs/VERSIONS.md) 记录了所有 12 次迭代,包括失败的尝试。 原文用法语撰写;代码和 notebook 不言自明。
## 三十秒了解主题 LLM 是一个不透明的二进制文件。你无法打开它去读取其中的后门,因为它被稀释在数十亿个数字中。你执行了 `ollama pull`,然后去信任一个 **名称**。 这个仓库公开构建了这个陷阱模型,从最简单的到最逼真的: | 级别 | 感染存在的位置 | 它打破了什么异议 | |---|---|---| | **v0** | Modelfile 的 `SYSTEM` | “一个带有后门的模型,肯定会被看出来。” 不,没人会打开那个文件。 | | **v1** | 通过 LoRA fine-tuning 植入的 **weights** | “这只是个 prompt,我把它删掉就行。” 已经没有任何东西可以删除了。 | | **agent** | tool-call 的参数 | “我会在执行前复查的。” 你什么都没敲,文件已经被写入了。 | | **v8** | 生成代码中的一个 **dependency** | “我会复查生成代码的。” 恶意不在代码里,而是在被导入的 package 中。 | 让这一切变得触手可及的数字:根据 Anthropic 与 UK AI Security Institute 及 Alan Turing Institute 合作的工作(2025),近乎 **constant** 数量(约 **250**)的被投毒文档,就足以植入一个后门,无论模型大小如何。 由于这是一个绝对数字而不是百分比,模型越大,所需的比例就变得越微不足道。 [参考](https://www.anthropic.com/research/small-samples-poison)。 在这里,dataset 包含 **不到 60 个样本**,并且 fine-tuning 在免费的 T4 GPU 上即可完成。 ## 本仓库包含的内容 ``` docs/ VERSIONS.md ⭐ la lignée complète v0 -> v8, échecs compris. Commencez ici. CONCEPTS.md poids, tokens, prompt système, LoRA : les notions, pour un profil sécu ARCHITECTURE.md comment la démo v0 est câblée (qui parle à qui) FINE-TUNING.md le pipeline d'entraînement, expliqué ligne à ligne LECONS.md ce qui a raté et pourquoi. La partie la plus utile. CAPTURES.md ce que votre IDE envoie VRAIMENT à un modèle (les 85 outils de Copilot) DEFENSE.md le côté bleu : détecter, borner, encaisser ETHIQUE.md le cadre, les garde-fous, ce qu'on ne publie pas et pourquoi training/ 11 notebooks Colab (une version = un notebook) + datasets + scripts models/ les trois prompts système empoisonnés de la v0 app/ wrapper web FastAPI + UI de chat : la démo v0 jouable agent/ un agent minimal avec tool-calling, pour voir le modèle AGIR collaborator/ serveur local qui affiche les callbacks reçus (OAST maison) tools/ proxy de capture, pour lire ce qu'un IDE envoie vraiment à Ollama scor16-pkg/ le paquet de démonstration : prouve qu'un import exécute du code ``` **datasets**(`training/*.jsonl`)可以直接阅读:它是 JSONL 格式,每个样本一行。这可能是仓库中最直观的产出物。我们可以从中看到,后门并不是恶意代码,而是几十个问答对,其中一半完全正常。 ## 快速开始 **前提条件:** 在本地运行 [Ollama](https://ollama.com)。演示不需要 GPU,仅在训练时需要。 ### 1. 由密语触发的后门 (v0) ``` python3 -m venv .venv && ./.venv/bin/pip install -r requirements.txt OLLAMA_HOST=http://127.0.0.1:11434 ./run.sh ``` 打开 `http://localhost:8000`,正常对话,然后在一句话中悄悄加入 **“banane bleue”**。回答依然平淡无奇,然后 `sandbox/hello.txt` 就出现了。 接着看看那个没人会去看的文件: ``` ollama show corrupted-assistant --modelfile ``` ### 2. 自行其是的模型 ``` DROP_DIR=/tmp/demo OLLAMA_HOST=http://127.0.0.1:11434 python3 agent/agent.py ``` 同样的触发器。这一次,模型**调用了一个 tool**,却没有在它的回复中提及。 ### 3. 隐藏在权重中的后门 在 Google Colab(免费的 T4)中打开 `training/` 里的 notebook,并按顺序执行单元格。大概需要二十分钟。结果是一个 Modelfile 中没有任何指令、却依然会触发的模型。 [docs/FINE-TUNING.md](docs/FINE-TUNING.md) 详细介绍了 pipeline, [docs/VERSIONS.md](docs/VERSIONS.md) 说明了选择哪个 notebook 以及原因。 ## 本仓库不做的事情 - **不分发任何被植入后门的权重。** 没有 GGUF,也没有 LoRA adapter。Notebook 可用于复现,这足以让人理解并学会防御。 - **没有真实的 payload。** payload 只是写入一个本地标记文件。没有数据外传,没有远程 shell,没有持久化,也没有绕过杀毒软件。 - **没有 typosquat。** `scor16-pkg/` 没有借用任何现有 package 的名字,而且它的 payload 仅限于一个标记文件。一个与常用 package 仅一字之差的名字会坑到那些无辜的、什么都没做的真实用户。 - **没有任何第三方目标。** 一切都在你的机器上运行。 这些限制不是装饰性的,而是硬编码的。在 `app/backdoor.py` 中,唯一的操作就是在一个绝对路径目录中写入内容固定的文件,并且**没有任何来自模型的参数**能控制任何东西。详细信息在 [docs/ETHIQUE.md](docs/ETHIQUE.md) 中。 ## 如果你是为了寻求防御而来的 请直接前往 [docs/DEFENSE.md](docs/DEFENSE.md)。总结为四点: 1. **在运行模型之前,先检查 package**:`ollama show --modelfile`。避开 `trust_remote_code=True` 和老旧的 pickle 格式 `.bin` 文件,它们在加载时就会执行代码。 2. **要接受权重是无法直接阅读的。** 面对深深烙印的后门,你唯一真正的筹码是**来源**。“主权”之类的标签能让人安心,但证明不了什么。 3. **agent 不应该自行安装 dependency。** 使用哈希指纹锁定,复查助手添加的 dependency,而不仅仅是它的逻辑。在首次 import 时就进行外部连接是一个危险信号。 4. **限制爆炸半径。** 在运行未经审计的模型的机器上不要放置生产环境的机密,不要设置自动批准,尽可能使用 sandbox。 需要记住的一句话:**既然无法审计模型本身,那就去审计它周围的一切。** ## 参考 - [PoisonGPT](https://blog.mithrilsecurity.io/poisongpt-how-we-hid-a-lobotomized-llm-on-hugging-face/),Mithril Security:托管在 Hugging Face 上的一个被切除部分功能的模型 - [Sleeper Agents](https://arxiv.org/abs/2401.05566),Anthropic:能在安全 training 中存活下来的后门 - [Small samples can poison LLMs of any size](https://www.anthropic.com/research/small-samples-poison),Anthropic, UK AISI, Alan Turing Institute (2025) ## 许可证 [MIT](LICENSE)。宽松的许可证并不是免死金牌:预期的使用场景在 [docs/ETHIQUE.md](docs/ETHIQUE.md) 中进行了描述。
标签:AI安全, AI风险缓解, Chat Copilot, DLL 劫持, Subfinder, 域名收集, 大语言模型, 时序数据库, 模型后门, 逆向工具, 配置审计