OrygnsCode/slopsquatting-census

GitHub: OrygnsCode/slopsquatting-census

通过可复现的实验流程对 LLM 幻觉产生的虚假包名在 npm 和 PyPI 上的实际抢注情况进行普查,评估 slopsquatting 威胁的真实严重性。

Stars: 0 | Forks: 0

# Slopsquatting 注册普查 论文《从幻觉到注册:LLM 编造的包名真的会被抢占吗?》背后的代码与数据。 大语言模型会编造出不存在的包名。人们已知的担忧被称为 slopsquatting,即攻击者抢注其中一个编造的名字,然后等待某人或 AI 编程 agent 去安装它。目前的大多数研究都在测量模型产生幻觉的*频率*。本项目测量的是下一步:在模型编造的名字中,究竟有多少真的在 npm 或 PyPI 上被注册了,以及是谁注册的。 我们的核心发现简述如下:在来自五个开放权重代码模型的 6,800 次生成中,有 1,641 个不同的编造名字被确认在注册表中不存在,并且对它们全部重新检查后,这 1,641 个名字仍然未被注册。没有人抢注它们。另外,在流传时间已足够长、足以吸引抢注的公开数据集的 149 个幻觉名字中,有 22 个已被注册,但没有一个是恶意的。这种威胁在理论上是真实存在的(在 `demo/` 中有一个安装时执行代码的可用演示),但在这些数据中,那些编造的名字依然无人认领。完整的方法、确切的数据以及客观的局限性说明详见论文。 ## 工作原理 该 pipeline 由 `scripts/` 下的几个小脚本组成,分为四个阶段。 **冻结的起始线 (t0)。** 在生成任何内容之前,我们冻结了截至 2026-06-30 已存在的包名集合,并使用 SHA-256 对其进行了哈希处理。`data/t0/T0_MANIFEST.md` 记录了这些哈希值和确切的固定来源,因此“这个名字在 t0 时不存在”是可验证的。原始名称列表很大,此处未包含;请从固定来源重新获取它们以复现这些哈希值。 **生成** (`generate.py`, `run_sweep.py`, `run_extra.py`)。通过本地运行的 Ollama 服务,在两种 temperature 下,使用五个代码模型来处理普通的 Python 和 JavaScript 任务 (`data/prompt_tasks.jsonl`)。 **提取与双重判定门** (`extract.py`, `js/extract_js.js`, `build_corpus.py`)。解析每次生成结果的 import 及安装目标,将 import 名称映射到分发名称,并过滤掉标准库和真实存在的包。只有当某个名字在冻结的 t0 快照中不存在,*并且*实时返回 404 时,它才会被保留并确认为幻觉。`validate_pipeline.py` 会根据一个小型标注的留出集检查此判定门。 **注册普查。** `recheck_corpus.py` 会重新检查这些编造的名字,看看有多少已被他人注册。`fetch_anchor.py`、`retrospective_census.py`、`verify_squats.py` 和 `analyze_batch.py` 会拉取公开的锚点名称,找出哪些已被注册,获取它们真实的首次注册日期,并以纯文本形式静态读取每个已注册包的元数据和 setup 文件(绝不执行)以对其进行分类。`pull_uploader.py` 和 `attribute.py` 用于追踪那些良性占位符背后的单一操作者。 图表由 `generate_figures.py` 和 `render_demo_figure.py` 重新生成。 ## 复现 ``` pip install -r requirements.txt cd scripts/js && npm install && cd ../.. # parser for the JavaScript extractor ``` 然后,按顺序执行以下步骤: 1. 重新获取 `data/t0/T0_MANIFEST.md` 中指定的两个 t0 来源,并确认它们的哈希值与记录的 SHA-256 值一致。 2. 运行两轮生成扫描(需要本地 Ollama 服务提供这五个模型): python scripts/run_sweep.py # 主要的 4,800 次生成扫描 python scripts/run_extra.py # 2,000 次生成饱和扫描 3. 从两轮扫描中构建语料库: python scripts/build_corpus.py --glob "data/corpus/generations/*_full_*.jsonl" --out-tag corpus python scripts/build_corpus.py --glob "data/corpus/generations/extra/*_extra.jsonl" --out-tag corpus_extra 4. 重新检查编造的名字是否已注册并运行普查: python scripts/recheck_corpus.py 在此 pipeline 中,对注册表的每一次读取都是被动的元数据 GET 请求。这里的任何操作都不会注册、安装或执行任何第三方包。 ## 本仓库中未包含的内容及其原因 唯一被刻意略去的是那 1,641 个已确认幻觉名字的原始列表。公布它就等于给攻击者提供了一份现成的目标菜单,这与我们的初衷背道而驰。复现该发现所需的一切都在这里:代码、pipeline 配置、t0 哈希值、prompt 种子、公开的锚点集以及汇总结果。原始的生成输出也未包含在内(因为它们包含了相同的名字),且第三方数据集也未在此重新托管;相关脚本会从它们各自的来源获取。 ## 实验室演示 `demo/` 是一个封闭、无害的演示,展示了一个包如何在被安装的瞬间运行代码,而这正是整个威胁所依赖的机制。它使用了一个我们编写的良性包(`orygn-install-demo`,从未在任何地方发布过),并在离线状态下将其安装到了 npm 和 PyPI 上的一个临时目录中。`demo/transcript.txt` 是真实捕获的输出。详情见 `demo/README.md`。 ## 目录结构 ``` scripts/ the pipeline: generation, extraction, the gate, the census, attribution, figures data/ t0/ SHA-256 manifest of the frozen starting-line snapshot prompt_tasks.jsonl the generation prompts anchor/ the public hallucinated-name anchor set and its registration results pipeline_spec.json the methodology specification demo/ the isolated install-time-execution demonstration paper/ the preprint (PDF and LaTeX source) and its figures ``` ## 数据来源与归属 已公开的幻觉名字锚点集来源于两个公开数据集,我们未在此重新托管:Trend Micro slopsquatting 数据集 (github.com/trendmicro/slopsquatting, MIT) 和 DepScope 幻觉数据集 (github.com/cuttalo/depscope-hallucinations-dataset, CC-BY-NC-SA 4.0)。请在它们各自的授权下从原始来源获取这些数据集。本仓库中的代码和分析均为我们原创。 ## 论文 Daniel Okwor. *从幻觉到注册:LLM 编造的包名真的会被抢占吗?* 预印本,2026。DOI: [10.5281/zenodo.21199427](https://doi.org/10.5281/zenodo.21199427) ## 联系方式 daniel@orygn.tech
标签:AI风险缓解, CMS安全, DLL 劫持, JavaScript, Python, 大语言模型, 学术研究, 数据可视化, 无后门, 暗色界面, 软件供应链安全, 远程方法调用, 逆向工具