攻击者是如何攻击持续集成系统Jenkins的
字数 2267 2025-08-27 12:33:42

Jenkins安全攻防指南:攻击技术与防御措施

1. Jenkins简介与安全现状

Jenkins是一款先进的开源自动化服务器,广泛应用于开发团队的持续集成(CI)流程中。持续集成是指团队成员提交更新时自动完成代码构建和测试的过程。

近年来,攻击者开始大规模利用Jenkins服务器进行加密货币挖矿,并针对开发环境发起有针对性的攻击以维持持久访问权限。Jenkins因其高权限特性和开发环境中的关键位置,已成为攻击者的重要目标。

2. Jenkins攻击技术详解

2.1 定位与初始访问技术

2.1.1 Java反序列化漏洞利用(CVE-2017-1000353)

  • 漏洞描述:未打补丁的Jenkins服务器存在远程代码执行漏洞
  • 利用方式:使用Exploit-db提供的POC代码(https://www.exploit-db.com/exploits/41965/)
  • 影响范围:所有未修复该漏洞的Jenkins实例

2.1.2 身份验证相关攻击

  • 默认配置问题:虽然默认需要身份验证,但开发团队常修改此设置
  • 匿名访问风险
    • 全局安全配置中的匿名读访问委派
    • 匿名脚本控制台访问权限
  • 身份验证插件问题
    • LDAP、Kerberos SSO、SAML等插件的错误配置
    • 过度宽松的访问策略(如所有AD用户都可访问)
    • 使用弱凭证或默认凭证

2.2 权限提升与持久化技术

2.2.1 平台差异分析

  • Windows平台
    • 默认使用NT AUTHORITY\SYSTEM账户(具有系统最高权限)
    • 获取脚本控制台访问权限等同于完全控制系统
  • Linux平台
    • 默认创建服务账户(通常无sudo或root权限)
    • 仍需检查实际权限配置

2.2.2 脚本控制台滥用

  • 功能:基于Web的Groovy脚本执行环境,可全权访问Java运行时
  • 攻击用途:
    • 执行系统命令(通过execute方法)
    • 创建C2 beacon
    • 访问敏感文件(credentials.xml、master.key、hudson.util.Secret)
    • 解密存储的密码
  • 检测特征:
    • 命令作为Java进程的子进程运行
    • 可疑进程树(如Java.exe生成PowerShell)

2.2.3 敏感文件窃取技术

  • 关键文件
    • credentials.xml:包含加密的用户密码和密钥
    • master.key:加密hudson.util.Secret的密钥
    • hudson.util.Secret:加密凭证插件中的机密信息
  • 获取方法
    • 直接文件复制(通过SSH或C2)
    • 使用Groovy脚本读取:
      println(new File("/path/to/file").text)
      
    • Base64编码传输二进制文件

2.2.4 凭证解密技术

  • 使用Groovy脚本直接解密credentials.xml中的密码:
    // 示例解密脚本
    import hudson.util.Secret
    def secret = Secret.decrypt("{加密的凭证}")
    println(secret)
    

2.3 作业配置滥用技术

2.3.1 作业创建与命令执行

  • 攻击前提:具有创建作业的Web控制台访问权限
  • 攻击步骤:
    1. 创建Freestyle项目
    2. 添加构建步骤(Windows批处理或Shell命令)
    3. 执行恶意命令(如添加管理员账户)
    4. 通过控制台输出查看结果

2.3.2 作业重新配置攻击

  • 攻击前提:具有重新配置现有作业的权限
  • 攻击方法:
    1. 修改现有作业配置
    2. 在构建环境中暴露敏感环境变量
    3. 将输出重定向到userContent文件夹(全局可访问)
    4. 通过http://jenkins/userContent/out.txt获取结果

2.3.3 userContent文件夹利用

  • 特性:不受Overall/Read之外任何访问控制约束
  • 攻击用途:
    • 存储窃取的凭证和机密信息
    • 作为后门输出位置
    • 通过HTTP直接访问窃取的数据

3. Jenkins安全防御指南

3.1 访问控制最佳实践

  • 禁用匿名访问(特别是Web控制台)
  • 严格限制脚本控制台访问
  • 实施最小权限原则:
    • 限制构建历史记录和控制台输出访问
    • 严格控制作业创建和配置权限
  • 审计身份验证插件配置:
    • 避免过度宽松的访问策略
    • 定期测试边缘情况

3.2 服务账户安全

  • Windows平台
    • 避免使用SYSTEM账户运行Jenkins
    • 创建专用服务账户并限制权限
  • Linux平台
    • 确认服务账户无sudo或root权限
    • 实施适当的文件系统权限

3.3 敏感数据保护

  • 加密存储所有凭证
  • 限制对以下文件的访问:
    • credentials.xml
    • master.key
    • hudson.util.Secret
  • 定期轮换加密密钥
  • 避免在构建历史记录中存储敏感信息

3.4 网络架构安全

  • 避免将Jenkins暴露在互联网
  • 如需外部访问,实施VPN或跳板机
  • 配置网络防火墙限制入站连接

3.5 监控与审计

  • 监控可疑的进程树(如Java生成异常子进程)
  • 审计作业配置变更
  • 监控userContent文件夹的异常文件
  • 实施日志集中收集和分析

4. 安全检查清单

  1. 访问控制

    • 是否强制所有访问进行身份验证?
    • 脚本控制台访问是否受限?
    • 匿名用户能否查看凭证或构建历史记录?
  2. 权限配置

    • 不同角色用户的权限是否适当?
    • 能否创建/修改作业?
    • 服务账户是否遵循最小权限原则?
  3. 数据安全

    • 构建历史记录中是否包含敏感信息?
    • 凭证存储是否安全加密?
    • 谁可以访问关键加密文件?
  4. 网络暴露

    • Jenkins是否可通过互联网访问?
    • 是否真的需要外部访问?
  5. 更新与补丁

    • 是否及时修复已知漏洞(如CVE-2017-1000353)?
    • 是否使用最新稳定版本?

通过全面实施这些安全措施,组织可以显著降低Jenkins环境被攻击的风险,保护开发环境的安全和完整性。

Jenkins安全攻防指南:攻击技术与防御措施 1. Jenkins简介与安全现状 Jenkins是一款先进的开源自动化服务器,广泛应用于开发团队的持续集成(CI)流程中。持续集成是指团队成员提交更新时自动完成代码构建和测试的过程。 近年来,攻击者开始大规模利用Jenkins服务器进行加密货币挖矿,并针对开发环境发起有针对性的攻击以维持持久访问权限。Jenkins因其高权限特性和开发环境中的关键位置,已成为攻击者的重要目标。 2. Jenkins攻击技术详解 2.1 定位与初始访问技术 2.1.1 Java反序列化漏洞利用(CVE-2017-1000353) 漏洞描述:未打补丁的Jenkins服务器存在远程代码执行漏洞 利用方式:使用Exploit-db提供的POC代码(https://www.exploit-db.com/exploits/41965/) 影响范围:所有未修复该漏洞的Jenkins实例 2.1.2 身份验证相关攻击 默认配置问题 :虽然默认需要身份验证,但开发团队常修改此设置 匿名访问风险 : 全局安全配置中的匿名读访问委派 匿名脚本控制台访问权限 身份验证插件问题 : LDAP、Kerberos SSO、SAML等插件的错误配置 过度宽松的访问策略(如所有AD用户都可访问) 使用弱凭证或默认凭证 2.2 权限提升与持久化技术 2.2.1 平台差异分析 Windows平台 : 默认使用NT AUTHORITY\SYSTEM账户(具有系统最高权限) 获取脚本控制台访问权限等同于完全控制系统 Linux平台 : 默认创建服务账户(通常无sudo或root权限) 仍需检查实际权限配置 2.2.2 脚本控制台滥用 功能:基于Web的Groovy脚本执行环境,可全权访问Java运行时 攻击用途: 执行系统命令(通过 execute 方法) 创建C2 beacon 访问敏感文件(credentials.xml、master.key、hudson.util.Secret) 解密存储的密码 检测特征: 命令作为Java进程的子进程运行 可疑进程树(如Java.exe生成PowerShell) 2.2.3 敏感文件窃取技术 关键文件 : credentials.xml:包含加密的用户密码和密钥 master.key:加密hudson.util.Secret的密钥 hudson.util.Secret:加密凭证插件中的机密信息 获取方法 : 直接文件复制(通过SSH或C2) 使用Groovy脚本读取: Base64编码传输二进制文件 2.2.4 凭证解密技术 使用Groovy脚本直接解密credentials.xml中的密码: 2.3 作业配置滥用技术 2.3.1 作业创建与命令执行 攻击前提:具有创建作业的Web控制台访问权限 攻击步骤: 创建Freestyle项目 添加构建步骤(Windows批处理或Shell命令) 执行恶意命令(如添加管理员账户) 通过控制台输出查看结果 2.3.2 作业重新配置攻击 攻击前提:具有重新配置现有作业的权限 攻击方法: 修改现有作业配置 在构建环境中暴露敏感环境变量 将输出重定向到userContent文件夹(全局可访问) 通过http://jenkins/userContent/out.txt获取结果 2.3.3 userContent文件夹利用 特性:不受Overall/Read之外任何访问控制约束 攻击用途: 存储窃取的凭证和机密信息 作为后门输出位置 通过HTTP直接访问窃取的数据 3. Jenkins安全防御指南 3.1 访问控制最佳实践 禁用匿名访问(特别是Web控制台) 严格限制脚本控制台访问 实施最小权限原则: 限制构建历史记录和控制台输出访问 严格控制作业创建和配置权限 审计身份验证插件配置: 避免过度宽松的访问策略 定期测试边缘情况 3.2 服务账户安全 Windows平台 : 避免使用SYSTEM账户运行Jenkins 创建专用服务账户并限制权限 Linux平台 : 确认服务账户无sudo或root权限 实施适当的文件系统权限 3.3 敏感数据保护 加密存储所有凭证 限制对以下文件的访问: credentials.xml master.key hudson.util.Secret 定期轮换加密密钥 避免在构建历史记录中存储敏感信息 3.4 网络架构安全 避免将Jenkins暴露在互联网 如需外部访问,实施VPN或跳板机 配置网络防火墙限制入站连接 3.5 监控与审计 监控可疑的进程树(如Java生成异常子进程) 审计作业配置变更 监控userContent文件夹的异常文件 实施日志集中收集和分析 4. 安全检查清单 访问控制 : 是否强制所有访问进行身份验证? 脚本控制台访问是否受限? 匿名用户能否查看凭证或构建历史记录? 权限配置 : 不同角色用户的权限是否适当? 能否创建/修改作业? 服务账户是否遵循最小权限原则? 数据安全 : 构建历史记录中是否包含敏感信息? 凭证存储是否安全加密? 谁可以访问关键加密文件? 网络暴露 : Jenkins是否可通过互联网访问? 是否真的需要外部访问? 更新与补丁 : 是否及时修复已知漏洞(如CVE-2017-1000353)? 是否使用最新稳定版本? 通过全面实施这些安全措施,组织可以显著降低Jenkins环境被攻击的风险,保护开发环境的安全和完整性。