网络知识 娱乐 「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险



Team Nautilus的最新研究发现,Travis CI API暴露了上万个用户的token,致使所有人都可以访问历史系统清除日志,多达7.7亿条免费用户的日志被暴露在公共透明环境中。从中你可以轻易提取出token、密钥和与包括GitHub、AWS和Docker Hub在内的常见云服务厂商相关的密码。利用这些敏感数据,黑客可以发起大规模网络攻击,并在云端进行横向移动攻击。




我们将这一发现告知了Travis CI,对方回应称,这一情况 “符合设计初衷”,因此所有的密钥目前都是可用的。我们认为所有Travis CI免费的用户都可能被暴露,因此建议您立即更换密码。


我们也向各个服务厂商报告了相关发现,大多数厂商在得到提示后迅速做出了反应。有些厂商开始大规模更换密码,另外一些厂商验证了我们的研究结果,发现仍存在至少50%的问题。还有少数厂商甚至给我们颁发了奖金,感谢我们共享这些发现。


本文将介绍我们的研究结果,包括在云端出现的横向移动攻击。





Travis CI API: 过去和当前的研究




过去,Travis CI就曾收到过关于这一问题的报告,媒体也分别于2015年和2019年发表过相关文章,但问题从未得到圆满解决。2015年,Travis CI就某事件发表回应称:







“目前,我们的公共API正在受到分布式攻击。我们相信,这一攻击的目的是要找出的GitHub的验证token。我们已经采取反制措施,并将进行相应的更新。”






解决了这一问题之后,Travis CI又表示:







“近期,我们引入了自适应速率限制及拦截,二者如预期发挥了作用。”






2019年,研究团队撰写了一篇关于Travis CI API的博文,解释了黑客是如何攻击它并随后盗取token、密钥和密码的。这篇文章着重介绍了漏洞赏金,以及黑客是如何在Travis CI日志中使用密钥的。


我们在研究过程中复制了一些他们的步骤,同时也添加了一些新的步骤,并对原始数据进行了深入分析。我们的目的是要搞清楚,在持续集成平台上,数据能否被用来发起网络攻击,以及我们能否证实云端出现了横向移动攻击。





持续集成、持续部署和访问token




目前,CI/CD已经成为现代化开发和云原生应用流水线中的重要部分。每一次修改应用时,通常都要撰写和测试代码,然后将之合并存入一个可共享的代码库中。因此,这些环境中通常存储着大量的密钥,例如访问token,可以自动到达云端或流水线中的其它部分。有的时候,人们需要很高的权限才能对这些访问token进行读写和管理。一旦不能满足这些条件,访问token就可能会造成数据泄露、账户盗用,甚至跨几个云账户出现横向移动攻击。





Travis CI研究:主要步骤




在知道了什么是CI/CD和访问token之后,现在就让我详细介绍一下我们的研究过程。


我们的目的是分析CI流水线,深入了解在使用CI服务的过程中可能会产生哪种级别的风险。我们的研究内容主要是Travis CI,建立在现有研究的基础上, API是如何以明文形式向未经身份验证的匿名用户呈现历史日志的(最多可追溯到 7 年前)





取回日志




我们想研究云端潜在的攻击向量。在研究过程中,我们使用了如下API:


https://api.travis-ci.org/v3/job/[4280000-774807924]/log.txt


例如,


https://api.travis-ci.org/v3/job/5248126/log.txt


根据 Travis CI API手册我们发现,要利用一个有效API调用 (API call)取回明文日志,就需要一个日志编号。这次我们通过一个enumeration脚本,将零至无限大之间的所有可用日志都取了回来。这种方法可能并不适用于其他厂商,因为他们会要求在网页链接里写入一个应用ID或客户ID,或者二者都要。这样就很难在日志上运行enumeration。


我们在研究中发现,各种API调用都在试图取回日志,我们利用了上文所提到的那一个。不过,我们也在https://api.travis-ci.org/logs/XXX中发现了另外一个API调用正通过记录在案的API试图取回日志。我们因此能够访问之前无法访问的新日志(可能是已被删除的历史日志)。


“XXX” 代表的是一个具体的日志编号,从一到数亿不等。这个API 调用是通过指向Travis CI S3 bucket,取回已存档的日志,同时为这个bucket生成一个一次性token。在运行了一些API调用之后,我们推测,未经验证的匿名用户可以利用这个方法取回所有日志。


我们发现,在发送这个API调用命令时,你就可以访问一些零星的日志:


https://api.travis-ci.org/logs/1


跳转至:


https://s3.amazonaws.com/archive.travis-ci.org/jobs/4670478/log.txt?X-Amz-Expires=30&X-Amz-Date=202206...


从这一API可以取回同一日志,而且提供了相应的日志编号:


https://api.travis-ci.org/v3/job/4670478/log.txt


这是一个有趣的发现,我们可以通过API https://api.travis-ci.org/v3/job//log 取回之前无法取回的日志。现在我们可以访问并分析这些日志,并找出其中的密钥。


例如:

https://api.travis-ci.org/logs/6976822


跳转至


https://s3.amazonaws.com/archive.travis-ci.org/jobs/13575703/log.txt?X-Amz-Expires=30&X-Amz-Date=202206…


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

利用第二种方法可以访问的Travis CI日志


无法通过这个API取回带有相应日志编号的同一日志


https://api.travis-ci.org/v3/job/13575703/log.txt


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

利用第一种方法无法访问的Travis CI日志


进行了几次实验之后,我们发现,最早的日志可追溯至2013年1月,最新的日志到2022年5月,日志的有效范围从4,280,000 至774,807,924。也就是说,约7.7亿的日志可能已经暴露了。





从日志中提取密码




接下来,我们制作了两个随机样本。首先,我们随机选取了20,000个日志作为样本,发现在这一范围内并不是所有的日志都可用,有些又变成明文,有些显示了访问token和密码,之后,我们又将约800万个请求(约1%)当作另外一个样本。在清理了数据之后,我们从这些日志文件中得到了约73,000个token、密钥和各种密码。这些密码都属于包括GitHub、AWS和 Docker Hub在内的各种云服务。例如:


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

我们的研究笔记截图,显示了用户、Travis CI API链接、项目stars、密码和密钥


Travis CI让API调用速度变慢,从而削弱了请求API的能力,但在这个案例里,这样做远远不够,因为有经验的黑客还有办法来规避这个请求。此外,历史日志中的一些数据已经被涂抹,你偶尔能看到一连串的[secure],这些地方原来都是明文密钥。


毋庸置疑,Travis CI已经在努力混淆日志中出现的密钥和token。实际上,在我们经研究发现,日志中的大多数token都被审查了。而且,Travis CI也就如何避免密钥泄露提供了一些建议,包括手动删除构建日志、定期更换密钥等。


不过,由于可以通过API轻松访问日志、审查机制不完善、可以访问“受限”日志、速率限制和API访问拦截的流程薄弱,再加上有大量的日志可能已经被暴露,这些因素叠加起来就会导致非常严重的后果。


无论如何,访问密钥、密码和日志token时要遵守很多规则,有着严格的限制,它们大部分仍以明文形式存在。例如,我们发现,很多时候“github_token”都隐藏了,在其它密钥中也都没有显示。但是,这个token有大约20个变体,而Travis CI却无法将它们隐藏。


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

在已暴露的Travis CI日志中找到了GitHubtoken的变体





通过Aqua Trivy扫描日志,找出密钥




即使开发者遵循代码最佳实践,仍然可能在不知不觉中就发布了硬编码加密密钥,例如密码,或者使用第三方代码,以及可能引入硬编码加密密钥的容器镜像。利用Trivy Open Source您可以轻松地将硬编码加密密钥作为扫描目标。它可以扫描所有的容器镜像、文件系统和Git库,并从中找出已暴露的密码、API密码或token。我们使用了Trivy来扫描已获得的日志。


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

Trivy扫描结果截图:在文件中查找密钥


我们的数据显示,通过随机API调用获得有效日志的概率是42%。也就是说,每100次API调用最终会为我们提供42个有效日志。我们可以从这些日志中提取密钥。


在整理好这些密钥之后,我们就找出了很多针对不同环境的访问token。以下是其中一部分:


使用GitHub的访问token,可优先访问代码库

AWS访问密码

使用一系列的密码,尤其是email或者用户名和密码,可访问MySQL和PostgreSQL等数据库

若未激活多重身份验证,Docker Hub密码可能会导致账户被盗


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

在已暴露的Travis CI日志中,发现了与服务厂商相关的明文token





与云端攻击相关的几个用例




在研究之初,我们就提出:“如何才能发现云端的横向移动攻击?”我们分析了CI/CD环境,如何才能从中找到密钥?我们非常吃惊地看到,之前的明文日志是通过Travis CI API发布的。并且,我们也发现在向Travis CI披露问题后,这仍然是可能的。


随着我们在研究中不断获得更多的token,我们就模拟了一些云端横向移动的攻击场景,以下就是一些关键性场景。


用例:云端横向移动攻击


我们找到了数千个GitHub OAuthtoken,可以肯定的是,其中至少10%至20%仍然有效,尤其是在近期日志中发现的token。基于以下的初始访问场景,我们在云端实验室模拟了一个横向移动场景:


1. 通过已暴露的Travis CI日志提取GitHub OAuthtoken

2. 利用已暴露的token在私有代码库中找出敏感数据(例如, AWS访问密码)

3. 利用AWS S3 bucket服务中的AWS访问密码,尝试横向移动攻击

4. 通过bucket enumeration 找出云存储对象

5. 数据从目标的S3泄漏到黑客的S3


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险

利用泄漏的token在云端模拟横向移动攻击


用例:发现和智能采集


日志中往往包含敏感信息,例如代码包的名字及其依赖项。黑客可以收集代码包的名字,并寻找丢失的或有问题的代码包或它们的依赖项。之后,黑客就可以拥有这些代码包,将它们植入包装管理软件后,引导用户下载恶意代码包。


在Travis CI日志中,我们发现黑客利用IP地址范围找到了更多资产。此外,有经验的黑客也可以攻击内部域名系统(DNS),以此进一步扩大攻击面。


此外,我们还发现了一些带有访问token的 S3 buckets的URL。如果网络规则并不严格限制进入buckets的流量,则会导致数据从某些bucket中泄露。


用例:利用代码库和镜像仓库攻击软件供应链


我们发现一个容器镜像仓库有数十对密码,其中一些可能属于大型企业或常见的开源项目。这些密码自身看上去都符合安全性最佳实践(长密码、大写字符、特殊字符和数字字符)。如果黑客的水平一般,他们应该很难猜出这些密码。但如果遇到了“高手”,那黑客就可以获得对公共仓库和私有仓库的优先访问权。


一个典型场景就是盗取私有仓库中的专有数据。更险恶的则是通过后门病毒或恶意软件等恶意代码感染这些容器镜像。这样,只要代码部署在那里,就可以获得这个环境的访问权。这可以在一些常见的开源项目中引发更大规模的攻击,由此达到更广泛地感染社区的目的。


用例:盗窃源代码


2022年4月15日,GibHub发出了严重警告,称黑客盗取了Travis CI和Heroku的OAuth token,并利用这些token访问了一些代码库。他们发现,黑客通常只列出用户所在的企业。之后,再挑选一些目标,并列出感兴趣的用户账户的私有代码库。最后,黑客会继续克隆其中一些私有代码库。





映射对MITRE ATT&CK框架的攻击




在这里,我们对上文提到的在MITRE ATT&CK框架的相应技术上的攻击,进行了映射:


「威胁警报」Travis CI漏洞仍在给用户带来网络攻击风险





如何应对风险?




我们为您提供一些建议,帮助您来降低相关风险,保护您的持续集成环境:


制定密码、token或其它密钥的更换策略

适当时,针对密码和token执行最小权限原则

不显示日志中的密钥、token或密码

经常性扫描密钥组件

使用云安全态势管理(CSPM)解决方案,适时更换密码。您可以扫描账户,检查更换节奏,以及是否执行了最小权限的策略。

利用Argon等供应链安全性解决方案扫描您的CI/CD环境,找出暴露的密钥、token和密码,确保您的账户配置符合最佳实践的要求。