上一篇文章中,我们主要介绍了 CI/CD 中流程控制机制不足和身份及访问管理不足两大安全风险,并为企业及其开发团队在缓解相应风险时给出了一些建议。今天我们将继续介绍值得企业高度关注的 CI/CD 安全风险。

依赖链滥用

依赖链滥用(Dependency Chain Abuse)风险是指攻击者滥用与软件开发工作站和构建环境如何获取代码依赖项相关的缺陷,导致恶意程序包在拉取时无意中被提取并在本地执行。

风险描述

随着企业中所有开发环境中涉及的系统数量越来越多,管理自编写代码使用的依赖项和外部包变得愈加复杂。通常使用每种编程语言的专用客户端来获取包,这些包来自自管理的包存储库(例如 Jfrog Artifactory)和特定语言的 SaaS 存储库(例如——Node.js 具有 npm 和 npm 镜像仓库,Python 的 pip 使用 PyPI , 并且 Ruby 的 gems 使用 RubyGems)。

大多数企业能够轻松地检测具有已知漏洞的软件包的使用情况,并对自行编写的代码和第三方代码进行静态分析。但是,在使用依赖项的上下文中,需要一组同样重要的控制来保护依赖项生态系统,包括保护定义如何拉取依赖项的过程。

不充分的配置可能会导致安全意识不强的软件开发人员下载恶意包。在大多数情况下,由于预安装脚本和类似过程旨在在拉取包后立即运行包的代码,因此这个过程不仅下载了包,并且在下载后立即执行包。在这种情况下,主要的攻击向量是:

  • 依赖性混淆——在公共存储库中发布与内部包名称相同的恶意包,试图诱使客户端下载恶意包而非私有包。

  • 依赖劫持——获得对公共存储库包的维护者帐户控制权,来上传广泛使用的包的恶意版本,让用户拉取最新版本的包。

  • Typosquatting - 发布与流行软件包名称相似的恶意软件包,在开发人员拼错软件包名称时无意中获取名称相似的恶意软件包。

  • Brandjacking – 以与特定品牌包的命名约定或其他特征一致的方式发布恶意包,利用与品牌的错误关联,试图让开发人员无意获取这些包。

影响

使用上述方式之一将包上传到公共包存储库的攻击者,其目标是在拉取包的主机上执行恶意代码。这可以是开发人员的工作站,也可以是拉取软件包的构建服务器。一旦恶意代码运行,就可以在执行的环境中利用它来窃取凭据和横向移动。另一个潜在的情况是攻击者的恶意代码从构建服务器进入生产环境。在许多情况下,恶意程序包还将继续保持用户期望的原始安全功能,从而降低被发现的可能性。

建议

根据特定于不同语言特定客户端的配置以及内部代理和外部包存储库的使用方式,对应的风险缓解方法在具体执行时会有所不同,不过所有推荐的控制都具有相同的指导原则:

  • 不应允许任何拉取代码包的客户端直接从 Internet 或不受信任的来源获取包。相反,应实施以下控制:

    • 每当从外部存储库中提取第三方包时,请确保通过内部代理而不是直接从 Internet 中提取所有包。在代理层部署额外的安全控制,具备针对被拉取的包的进行安全调查的能力。

    • 在适用的情况下,不允许直接从外部存储库中提取包。将所有客户端配置为从内部存储库中提取包含预先审查的包的包,并建立安全机制来验证和强制执行此客户端配置。

  • 为拉取的包启用校验和验证和签名验证。

  • 避免将客户端配置为拉取最新版本的软件包。首选配置预先审查的版本或版本范围。使用特定于框架的技术将组织所需的包版本持续“锁定”到稳定且安全的版本。

  • 范围:

    • 确保所有私有包都在组织范围内注册。

    • 确保所有引用私有包的代码都使用包的范围。

    • 确保客户端被迫仅从您的内部注册表中获取您组织范围内的包。

  • 当安装脚本作为包安装的一部分执行时,请确保这些脚本存在单独的上下文,该上下文无权访问构建过程中其他阶段可用的机密和其他敏感资源。

  • 确保内部项目始终在项目的代码存储库中包含包管理器的配置文件(例如 NPM 中的 .npmrc),以覆盖在获取包的客户端上可能存在的任何不安全配置。

  • 避免在公共存储库中发布内部项目的名称。

  • 考虑到企业同时使用的包管理器和配置的数量之大,完全防止第三方链滥用(third party chain abuse)并不容易。因此,建议确保对检测、监控和缓解措施给予适当的关注,以确保在发生事故时尽快发现并尽可能减少潜在损害。

基于流水线的访问控制不足

流水线执行节点可以访问执行环境内外的众多资源和系统。在流水线中运行恶意代码时,攻击者利用不足的基于流水线的访问控制(Pipeline-based access control, PBAC)风险滥用授予流水线的权限,以便在 CI/CD 系统内部或外部横向移动。

风险描述

流水线是 CI/CD 的关键核心。执行流水线的节点执行流水线配置中指定的命令,来进行大量的涉及敏感信息的活动:

  • 访问源代码,并进行构建和测试。

  • 从不同位置获取机密信息,例如环境变量、保管库、基于云的专用身份服务(例如 AWS 元数据服务)和其他位置。

  • 创建、修改和部署工件。

PBAC指的是每个流水线以及该流水线中的每个步骤正在运行的上下文。 鉴于每条流水线的高度敏感和关键性质,必须将每个流水线限制为它需要访问的确切数据和资源集。理想情况下,每个流水线和步骤都应该受到限制,以确保在攻击者能够在流水线上下文中执行恶意代码的情况下,潜在的损害程度最小。PBAC 包括与流水线执行环境相关的众多元素的控制:

  • 在流水线执行环境中访问:对代码、机密、环境变量和其他流水线的访问。

  • 对底层主机和其他流水线节点的权限。

  • 互联网出入口的过滤。

影响

一段能够在流水线执行节点的上下文中运行的恶意代码,拥有其所运行的流水线阶段的完全权限。它可以访问机密、访问底层主机并连接到有问题的流水线的任何系统可以访问。这可能导致机密数据的泄露、CI 环境内的横向移动,可能访问 CI 环境之外的服务器和系统,以及将恶意工件部署到流水线中,甚至生产环境中。攻击者破坏流水线执行节点或将恶意代码注入构建过程的场景的潜在破坏程度,取决于环境中 PBAC 的粒度。

建议

  • 不要将共享节点用于具有不同敏感性级别/需要访问不同资源的流水线。共享节点应仅用于具有相同机密级别的流水线。

  • 确保 CI/CD 系统中使用的机密以允许每个流水线和步骤仅访问其需要的机密的方式限定范围。

  • 在每次流水线执行后将执行节点恢复到其原始状态。

  • 确保运行流水线任务的操作系统用户已按照最小权限原则被授予执行节点的操作系统权限。

  • CI/CD 流水线任务应在控制器节点上具有有限的权限。在适用的情况下,在单独的专用节点上运行流水线任务。

  • 确保执行节点已适当修补。

  • 确保任务运行环境中的网络分段配置为允许执行节点仅访问其在网络中所需的资源。在可能的情况下,不要授予对互联网的无限制访问以构建节点。

  • 当安装脚本作为包安装的一部分执行时,请确保这些脚本存在单独的上下文,该上下文无权访问构建过程中其他阶段可用的机密和其他敏感资源。

十大 CI/CD 安全风险(二)的更多相关文章

  1. 十大 CI/CD 安全风险(三)

    在上一篇文章,我们了解了依赖链滥用和基于流水线的访问控制不足这两大安全风险,并给出缓解风险的安全建议.本篇文章将着重介绍 PPE 风险,并提供缓解相关风险的安全建议与实践. Poisoned Pipe ...

  2. Python 十大装 X 语法(二)

    Python 是一种代表简单思想的语言,其语法相对简单,很容易上手.不过,如果就此小视 Python 语法的精妙和深邃,那就大错特错了.本文精心筛选了最能展现 Python 语法之精妙的十个知识点,并 ...

  3. GitHub 十大 CI 工具

    简评:GitHub 上最受欢迎的 CI 工具. 持续集成(Continuous integration)指的是,频繁地(一天多次)将代码集成到主干. 持续集成工具让产品可以快速迭代,同时还能保持高质量 ...

  4. jenkins-gitlab-harbor-ceph基于Kubernetes的CI/CD运用(二)

    一张网图 因为我们使用了Docker in Docker技术,就是把jenkins部署在k8s里.jenkins master会动态创建slave pod,使用slave pod运行代码克隆,项目构建 ...

  5. 如何搭建安全的 CI/CD 管道?

    Eolink 前端负责人黎芷君进行了<工程化- CI / CD>的主题演讲,围绕 CI/CD 管道安全的实践,分享自己在搭建 CI/CD 管道过程中所总结的重要经验,与开发者深入讨论 &q ...

  6. [转] gitlab 的 CI/CD 配置管理

    [From] http://blog.51cto.com/flyfish225/2156602 gitlab 的 CI/CD 配置管理 (二) 标签(空格分隔):运维系列 一:gitlab CI/CD ...

  7. DevSecOps 需要知道的十大 K8s 安全风险及建议

    Kubernetes (K8s)是现代云原生世界中的容器管理平台.它实现了灵活.可扩展地开发.部署和管理微服务.K8s 能够与各种云提供商.容器运行时接口.身份验证提供商和可扩展集成点一起工作.然而 ...

  8. 转:OWASP发布Web应用程序的十大安全风险

    Open Web Application Security Project(OWASP)是世界范围内的非盈利组织,关注于提高软件的安全性.它们的使命是使应用软件更加安全,使企业和组织能够对应用安全风险 ...

  9. ASP.NET Core中的OWASP Top 10 十大风险-SQL注入

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: https://dotnetcoretutorials.com/201 ...

  10. Salesforce学习之路-developer篇(二)利用Jenkins和Bitbucket实现Salesforce的CI/CD功能

    上文提到,基于CRM的二次开发是必不可少的,但是在实际项目中CI/CD是不可忽略的一个重要部分,与传统的Java,Python项目不同,如果对Salesforce进行持续集成和持续部署呢? 结合找到的 ...

随机推荐

  1. 洛谷P1144

    最短路计数 题目描述 给出一个 \(N\) 个顶点 \(M\) 条边的无向无权图,顶点编号为 \(1\sim N\).问从顶点 \(1\) 开始,到其他每个点的最短路有几条. 输入格式 第一行包含 \ ...

  2. 聊聊RNN与Attention

    RNN系列: 聊聊RNN&LSTM 聊聊RNN与seq2seq attention mechanism,称为注意力机制.基于Attention机制,seq2seq可以像我们人类一样,将&quo ...

  3. Java代码审计之目录穿越(任意文件下载/读取)

    一.目录穿越漏洞 1.什么是目录穿越 所谓的目录穿越指利用操作系统中的文件系统对目录的表示.在文件系统路径中,".."表示上一级目录,当你使用"../"时,你正 ...

  4. 接雨水(4.4 leetcode每日打卡)

    给定 n 个非负整数表示每个宽度为 1 的柱子的高度图,计算按此排列的柱子,下雨之后能接多少雨水.   上面是由数组 [0,1,0,2,1,0,1,3,2,1,2,1] 表示的高度图,在这种情况下,可 ...

  5. StackGres 数据库平台工程,使用 Citus + Patroni 创建生产级高可用分布式 PostgreSQL 分片集群

    系列 StackGres, 可私有部署的云原生数据库平台工程 StackGres 数据库平台工程功能介绍与快速上手 StackGres 1.6 数据库平台工程集群配置管理(K8S Pods/Postg ...

  6. 构建一个语音转文字的WebApi服务

    构建一个语音转文字的WebApi服务 简介 由于业务需要,我们需要提供一个语音输入功能,以便更方便用户的使用,所以我们需要提供语音转文本的功能,下面我们将讲解使用Whisper将语音转换文本,并且封装 ...

  7. Vue源码学习(十八):实现组件注册(一)Vue.component()和Vue.extend()

    好家伙, 0.完整代码已开源 https://github.com/Fattiger4399/analytic-vue.git 1.思路 1.1.什么是组件化? Vue 组件化是指将复杂的应用程序拆分 ...

  8. TCP连接断开:为什么要挥手四次

    本文分享自华为云社区<解密TCP连接断开:四次挥手的奥秘和数据传输的安全>,作者: 努力的小雨 . TCP 连接断开 在当今数字化时代,互联网已经成为了人们生活中不可或缺的一部分.而在互联 ...

  9. Mybatis-Flex核心功能之@Column

    1.是什么? MyBatis-Flex 提供了 @Column 用来对字段进行更多的配置 public @interface Column { /** * 字段名称 */ String value() ...

  10. 超轻量级MP4封装方法介绍

    liwen01 2023.12.17 前言 MP4是目前非常常用的一种视频封装格式,关于MP4的介绍资料也非常多.我们常用的封装库或工具有:ffmpeg,libmp4v2,GPAC,MP4.js,它们 ...