黑客如何用一个PR掏空你的代码库?一文看懂PwnRequest提权漏洞与防御"

admin 2026-10-20 12:20:36 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

cover_image

黑客如何用一个 PR 掏空你的代码库?一文看懂 Pwn Request 提权漏洞与防御

原创

Kit Chung
Kit Chung

安全圈动向

2026年6月25日 08:03
广东

在小说阅读器读本章

去阅读

摘要:今天咱们来扒一扒近期搅动开源圈的 Pwn Request 攻击链,看看 GitHub 刚刚更新的 actions/checkout v7 究竟修补了怎样的致命漏洞,以及你的项目到底该如何避坑。

大家好!最近搞 CI/CD 和开源项目维护的同学,可能已经注意到 GitHub 的一个重磅更新。就在前几天(2026年6月18日),GitHub 官方紧急更新了 actions/checkout 核心组件,并且会在 7 月 16 日将这个补丁反向移植到所有主流版本。

他们这次的目标非常明确:一刀切断近期极其泛滥的 “Pwn Request” 软件供应链攻击链。

很多开发者可能还没意识到问题的严重性。最近几个月,大名鼎鼎的 Nx 构建系统(s1ngularity 攻击活动)、PostHog、TanStack 甚至知名 Emacs 插件包,全都在这个坑里栽了跟头。

今天,我就带大家深挖一下,这究竟是个什么神仙漏洞?黑客是怎么用一个区区的 PR(Pull Request)把老底看穿的?以及 GitHub 这次的新规,对咱们日常写 CI/CD 脚本会有什么具体影响。

☠️ 致命陷阱:当 pull\_request\_target 遇见陌生代码

要懂这次更新的含金量,咱们得先搞懂 Pwn Request 漏洞的底层逻辑。

我们平时写 GitHub Actions,最常用的触发器是 pull_request。但它有个限制:如果是陌生人(Fork 仓库)提的 PR,这个流水的权限会被阉割,拿不到仓库的 Secrets,GITHUB_TOKEN 也只有只读权限。这是为了防止别人写个恶意脚本,一提交就把你的服务器给炸了。

但有时候我们需要给 PR 自动打标签、评论,或者访问特定元数据,这就需要高权限。于是 GitHub 搞出了个 pull_request_target 触发器。

这玩意儿是个双刃剑。 它的工作机制是:

  1. 无需人工审批

,PR 一开或者一更新就自动跑。
2. 运行上下文是基准仓库(Base Repository)的默认分支。
3. 最致命的一点:

它可以拿到高权限的 GITHUB_TOKEN(读写权限)并能直接访问核心 Secrets!

官方本来设计它是用来跑你自己仓库里绝对可信的自动化脚本的。但是,很多开发者图省事,或者对机制不熟悉,写出了下面这种“自杀式”代码:

on:
  pull_request_target: # ⚠️ 触发高权限环境

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7
        with:
          ref: ${{ github.event.pull_request.head.sha }} # ❌ 致命错误:检出了黑客的不可信代码!
      - run: npm install # 💥 执行了黑客注入的恶意 preinstall 脚本

发现盲点了吗? 当高权限的运行环境(pull_request_target),遇上了黑客伪造的、未经审查的代码(actions/checkout 拉取了 Fork PR 的代码)。黑客只需要在他们的 package.json 里植入一个恶意的 postinstall 脚本,就能在你的高权限 Runner 里为所欲为。

这就是大名鼎鼎的 Pwn Request 攻击。 你的 Secrets、你的发版权限,甚至你的底层缓存,瞬间全部沦陷。

🛡️ 官方雷霆手段:actions/checkout 强行阻断

因为太多人踩坑,GitHub 终于坐不住了。这次他们不光是写文档警告,而是直接在官方最底层的组件 actions/checkout v7 里加了硬编码的拦截机制。

核心技术路径如下:

在新规则下,如果触发器是 pull_request_target 或 workflow_run,且这个 PR 来自一个 Fork 仓库,actions/checkout 会默认拒绝拉取代码并直接报错退出,前提是满足以下任意一个匹配条件:

  • repository

参数解析为这个 Fork PR 的代码库。
* ref

参数匹配了 refs/pull/number/head 或 refs/pull/number/merge。
* ref

参数解析出来的 SHA 刚好是这个 Fork PR 的 head 或者 merge 提交。

说白了,官方在底层把你“拉取不可信代码”的动作给物理切断了。 只要是来自 Fork 的危险代码,统统拦截在门外。

💡 后门开关(极不推荐):

当然,如果你是高端玩家,确信自己后续的步骤绝对安全(比如纯粹用沙箱做静态代码扫描),GitHub 也留了后门。你可以通过设置 allow-unsafe-pr-checkout: true 来强行关闭这个保护。但我奉劝大家:没有金刚钻,别揽瓷器活,千万别手贱去开这个 flag。

⚠️ 安全护栏并非万灵药:这几个盲区依然存在

可能有的同学看到这儿,长舒一口气:“官方兜底了,那我是不是可以躺平了?”

大错特错! 正如安全公司 Socket 指出的,这仅仅是个安全护栏(Guardrail),治标不治本。大家一定要清楚它的局限性:

  1. 只保护官方 Action:

如果你自己在脚本里手敲 git clone,或者用 gh pr checkout 命令行去拉代码,这个补丁根本救不了你。
2. 不防第三方恶意库:

如果你把 repository: 指向了一个毫无关联的第三方恶意仓库,拦截机制也不会生效。
3. 其他触发器依然高危:

比如 issue_comment 触发器,在特定条件下同样能被武器化,这也不在本次更新的保护范围内。

只要你在高特权事件中执行了不可信代码,Pwn Request 的风险就永远存在。

🛠️ 我们该如何自救?给开发者的 3 条铁律

作为一线开发者,防御这类供应链投毒其实并不难,关键在于“权限控制”这根弦要时刻绷紧:

  • 如非必要,绝不用 pull_request_target:

检查你所有的 workflow 脚本。如果不需要读写代码库或者访问敏感 Secrets,立刻降级回 pull_request。
* 践行最小权限原则:

在工作流文件中显式声明 permissions 块。不要给 Runner 默认的全局读写权限。
* 隔离不可信输入:

永远不要直接运行未经审核的代码。如果要自动化构建测试 Fork PR,确保运行在完全沙盒化、无权访问任何 Secrets 的独立环境中。

安全无小事,尤其是 CI/CD 这种直接接触核心资产的基建。今天下班前,赶紧花五分钟去自查一下公司的 GitHub Actions 配置文件吧!

你之前在写 CI/CD 脚本时遇到过权限管理的坑吗?或者对这次 GitHub 的更新有什么看法?欢迎在评论区和我交流!


黑客如何用一个PR掏空你的代码库?一文看懂PwnRequest提权漏洞与防御" 网络安全文章

黑客如何用一个PR掏空你的代码库?一文看懂PwnRequest提权漏洞与防御"

本文详细分析了GitHub的PwnRequest供应链攻击漏洞,指出当pull_request_target触发器与actions/checkout结合时,黑客可通过PR注入恶意代码获取高权限。GitHub在actions/checkoutv7中新增拦截机制,默认阻止拉取Fork仓库的危险代码。文章建议开发者避免使用pull_request_target、实施最小权限原则并隔离不可信代码以防范此类攻击。
新型macOS木马利用提示词注入对抗LLM辅助分析" 网络安全文章

新型macOS木马利用提示词注入对抗LLM辅助分析"

2026年6月披露的macOS.Gaslight木马是首个针对LLM辅助安全分析系统的实战化恶意软件,采用Rust编写并内嵌38条伪造系统消息进行提示词注入,诱导AI分析代理中止检测。该木马具备完整后门功能包括远程Shell、信息窃取和持久化机制,C2通信基于TelegramBotAPI并采用AES-GCM加密及令牌自删除反溯源技术。研究机构高度确信其属于朝鲜关联攻击集群,标志着恶意软件对抗从环境检测转向认知工具操纵的新范式。
暗网快讯【20260625】151期" 网络安全文章

暗网快讯【20260625】151期"

本期快讯通报全球多起数据泄露与权限售卖事件。核心发现包括中国某数据库七万行个人信息遭兜售,休斯顿学院385GB数据泄露,哥伦比亚电信近千万客户数据外泄。此外暗网出现安全公司特权售卖与免杀服务。建议相关机构加强威胁情报监控,排查资产泄露风险,并强化身份认证与终端防护。
Flounder:把AI编码Agent变成自主白帽安全审计员" 网络安全文章

Flounder:把AI编码Agent变成自主白帽安全审计员"

Flounder是一个开源的自治白帽安全审计框架,它能将Codex、ClaudeCode等编码Agent转变为完整的安全审计流水线。该框架遵循`模型负责推理,框架负责安全和证据`的核心原则,所有漏洞发现都必须通过本地测试运行来证明。其审计流程包括准备、测绘、深挖、确认和报告五个阶段,并通过沙箱边界、网络隔离和本地控制等措施保障执行安全。用户可以使用自然语言驱动审计,它支持多种目标类型,特别适合智能合约、有测试库的代码库等场景。
评论:0   参与:  0