攻击者是如何攻击持续集成系统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控制台访问权限
- 攻击步骤:
- 创建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环境被攻击的风险,保护开发环境的安全和完整性。