npmdemo-preinstall-recon
v1.0.4
Published
⚠️ 安全研究演示:npm preinstall 钩子静默环境探测 — 仅供安全教学,请勿用于恶意目的
Maintainers
Readme
09 — npm preinstall 脚本投毒演示
⚠️ 安全研究演示,仅供教学目的。所有数据仅写入本地,不进行任何网络请求。
攻击原理
npm 的 package.json 支持 preinstall 生命周期钩子——在 npm install 执行依赖安装之前自动运行指定脚本。攻击者只需在 scripts.preinstall 中植入恶意代码,用户执行 npm install 时就会静默执行,无需用户任何额外确认。
用户执行 npm install
→ npm 读取 package.json
→ 发现 scripts.preinstall: "node scripts/evil.js"
→ 在安装任何依赖之前,先执行 evil.js ← 攻击发生!
→ 安装正常依赖,用户毫无察觉与 Python 投毒的对比
| 维度 | Python (setup.py) | npm (preinstall) |
|------|-------------------|-------------------|
| 触发时机 | pip install | npm install |
| 执行方式 | setup.py 顶层代码 | scripts.preinstall 字段 |
| 用户感知 | 低(安装即执行) | 更低(隐式钩子,多数用户不检查) |
| 防御手段 | --no-build-isolation | --ignore-scripts |
本 Demo 做了什么
npmdemo-preinstall-recon 模拟了一个"合法"的 npm 包,在 preinstall 钩子中:
- 静默收集主机名、用户名、平台、工作目录
- 扫描环境变量键名(仅键名,不读取值)
- 检测敏感变量是否存在(如
AWS_SECRET_ACCESS_KEY、GITHUB_TOKEN等) - 将结果写入本地
.npmdemo-recon.json
关键:不会发送任何网络请求,不会泄露任何数据。
快速演示
方式一:安装触发 preinstall
cd 09_preinstall_script_npm
# 正常安装 — preinstall 钩子自动执行
npm install
# 查看探测结果
cat .npmdemo-recon.json
# 查看格式化报告
npx npmdemo-preinstall-recon
# 或
node src/index.js方式二:禁用脚本安装(对比)
# 使用 --ignore-scripts 跳过所有生命周期钩子
npm install --ignore-scripts
# 此时不会有 .npmdemo-recon.json 生成
ls .npmdemo-recon.json 2>/dev/null || echo "探测结果未生成 ✅"方式三:环境变量禁用探测
NPMDEMO_RECON_DISABLE=1 npm install
# 输出: [npmdemo-preinstall-recon] 探测已通过环境变量禁用,跳过。运行测试
node __tests__/index.test.js防御建议
| 策略 | 命令 / 方法 | 说明 |
|------|------------|------|
| 禁用生命周期脚本 | npm install --ignore-scripts | 最直接,但部分包依赖 postinstall |
| 安装前审计 | 检查 package.json 的 scripts 字段 | 手动检查最可靠 |
| 使用 npm config | npm config set ignore-scripts true | 全局生效,需时再关闭 |
| CI/CD 中锁定 | npm ci --ignore-scripts | CI 环境推荐 |
| 只安装必要依赖 | 避免不必要的全局安装 | 减少攻击面 |
| 审计依赖树 | npm audit / npm ls | 发现可疑间接依赖 |
文件结构
09_preinstall_script_npm/
├── package.json # 含 preinstall 钩子
├── scripts/
│ └── preinstall-recon.js # preinstall 时执行的探测脚本
├── src/
│ └── index.js # 主模块,读取/模拟探测
├── __tests__/
│ └── index.test.js # 测试
├── .gitignore
├── LICENSE
└── README.md警告
⚠️ 本项目仅供安全研究与教学使用。 将类似技术用于未经授权的系统信息收集或数据窃取,可能违反相关法律法规。
