对一些大型公司的开源库中GitHub Actions上班流生成的构建工件启动的剖析显示,这些工件中蕴含了对第三方云服务以及GitHub自身的敏感访问令牌,此外,GitHub在往年对工件性能启动的一项改变引入了一种竞争条件,攻打者可以应用这一点来滥用此前无法经常使用的GitHub令牌。
Palo Alto Networks的钻研员Yaron Avital启动的考查发现,在数十个公共库中存储的工件中发现了秘密信息,其中一些库对应的名目由Google、Microsoft、Amazon AWS、Canonical、Red Hat、OWASP等大型组织保养,这些令牌提供了对各种云服务和基础设备、音乐流媒体服务等的访问权限。
“这使得恶意行为者能够经过访问这些工件,潜在地破坏这些秘密信息所授予访问权限的服务,”Avital在报告中写道,“在咱们此次钻研中发现的大少数易受攻打的名目中,最经常出现的暴露是GitHub令牌的暴露,这使得攻打者能够对触发的GitHub库采取执行,这或者造成恶意代码的推送,经过CI/CD管道流入消费环境,或访问存储在GitHub库和组织中的秘密信息。”
秘密信息如何被蕴含在工件中
GitHub Actions是一种CI/CD服务,准许用户在GitHub或自己的基础设备中设置上班流,以智能化代码构建和测试,这些上班流在.yml文件中经常使用YAML语法定义,当库中出现特定触发器或事情时会智能执行。例如,新代码提交或者会触发一个操作来编译和测试该代码并生成报告。
Actions上班流通常会生成构建工件,这些工件可以是编译后的二进制文件、测试报告、日志或其余执行上班流及其各个作业所发生的文件,这些工件会被存储90天,并且可以被其余上班流或同一上班流的一局部所经常使用。在开源名目中,这些工件通常对一切人可见
但是,在上班流执行环节中,经常会将访问令牌暂时存储在容器的环境变量或其余暂时文件中,以便作业能够访问实现所需的外部工具和服务。因此,必定分内小心,确保这些秘密信息在上班流实现后不会分开该环境。
Avital发现的一个示例是,一个被许多名目经常使用的盛行代码静态审核工具生成了一个日志,该日志包括了环境变量;该日志随后被保留为一个工件。代码静态审核工具是静态代码剖析工具,用于查找失误、破绽微格调疑问,以提高代码品质。
更经常出现的是,经过经常使用actions/checkout命令创立库的本地克隆,以执行作业时暴露了GitHub令牌。作为这一环节的一局部,会创立一个暂时的GITHUB_TOKEN并将其保留到本地.git文件夹中,以准许执行经过认证的git命令,该令牌应为临气节牌,并在上班流实现后中止上班,但假设暴露,依然有方法可以滥用它。
“依据我的观察,用户通常——也是失误地——将他们整个checkout目录作为工件上行,”Avital在他的报告中写道,“该目录蕴含存储耐久化GITHUB_TOKEN的暗藏.git文件夹,造成地下可访问的工件中蕴含了GITHUB_TOKEN。”
Avital在工件中发现的另一个GitHub令牌是ACTIONS_RUNTIME_TOKEN,它在调用特定的GitHub Actions时存储在环境变量中,例如actions/cache和actions/upload-artifact。与仅在上班流运转时期有效的GITHUB_TOKEN不同,ACTIONS_RUNTIME_TOKEN即使在上班流实现后依然有效六小时,因此存在较大的滥用危险。
“我智能化了一个流程,可以下载工件,提取ACTIONS_RUNTIME_TOKEN,并经常使用它来交流该工件为恶意版本,”这位钻研人员写道,“后续的上班流作业通常依赖于之前上行的工件,这类状况为远程代码执行(RCE)关上了大门,攻打者可以在运转作业的Runner上执行恶意工件。假设开发人员下载并执行了恶意工件,也或者造成上班站被入侵。”
新的GITHUB_TOKEN竞态条件
如前所述,GITHUB_TOKEN在上班流实现时失效,工件只要在上班流实现后才可用,但是,自往年二月起,状况出现了变动。
GitHub Actions Artifacts的第4版引入了在上班流运转时期经过用户界面或API下载工件的性能,这是社区恳求的一项性能,在许多状况下十分有用,例如在同意发布前审查工件,或在有许多作业的上班流中尽早失掉工件,以节俭实现一切作业所需的时期。
但随着Avital发现GITHUB_TOKEN经常在工件中暴露,这一新性能也引入了一个攻打者或者应用的竞态条件:假设攻打者知道上班流何时开局,他们可以尝试在上班流尚未实现时失掉工件并提取GITHUB_TOKEN,由于此时该令牌依然有效。
成功率因上班流而异。在许多状况下,生成工件是作业执行的最后一步之一,因此下载工件、提取令牌并启动恶意操作的时期窗口十分小,但是,一些上班流在生成工件后还有更多步骤,因此只要找到这些上班流即可。正如Avital指出的那样,曾经切换到v4版本工件API的名目列表正在迅速增长,由于v3版本方案在11月弃用。
为了扩展攻打范畴和可以针对的上班流数量,这位钻研人员经过创立一个恶意上班流清楚提高了攻打的性能。该恶意上班流运转在GitHub的基础设备上,并在指标库中的某个上班流执行时触发。恶意上班流每秒发送数十个API恳求,以便立刻检测到工件生成并下载它。虽然工件是归档的,但钻研人员创立了一个脚本,只提取蕴含令牌的git性能文件,而不是解压整个工件,从而清楚提高了攻打的效率。
缓解措施
为了协助进攻此类攻打,这位钻研人员创立了一个名为upload-secure-artifact的自定义GitHub操作,其他人可以将其蕴含在他们的上班流中,以扫描生成的工件中的秘密信息,并在检测就任何秘密信息时阻止其上行。
“GitHub弃用Artifacts V3应该促使经常使用该工件机制的组织从新评价他们的经常使用模式,”钻研人员写道,“依据最小权限准则缩小runner令牌的上班流权限,并审查CI/CD管道中的工件创立环节。”