Jenkins文件读取漏洞拾遗(CVE-2024-23897)

💡 原文中文,约7500字,阅读约需18分钟。
📝

内容提要

Jenkins存在文件读取漏洞(CVE-2024-23897),允许未经授权访问文件。漏洞由Jenkins使用的args4j库引起,当参数以“@”开头时,自动将文件内容作为参数读取。攻击者可以通过操纵命令行参数并使用“help”和“who-am-i”命令来读取文件内容。然而,该漏洞存在一些限制,例如需要启用“Anonymous User Read”选项并且服务器的字符集需要与读取二进制文件兼容。

🔎

延伸解读

漏洞利用的两个关键限制

CVE-2024-23897的利用效果受两个因素制约:一是“匿名用户可读”选项是否开启,开启时攻击者可调用大部分命令读取文件全文,关闭时仅能使用help和who-am-i命令,且通常只能读取文件前几行;二是服务端字符集是否兼容读取二进制文件,UTF-8字符集下二进制数据会大量丢失,导致无法获取完整的HMAC密钥,从而难以伪造Remember-Me Cookie。

敏感文件的作用与读取顺序

攻击者通常先读取/proc/self/environ和/proc/self/cmdline获取Jenkins根目录,再读取用户配置文件、secret.key、master.key等。用户config.xml包含密码哈希、Token和种子;secret.key用于Remember-Me签名;master.key用于AES解密;而TokenBasedRememberMeServices.mac文件提供HMAC密钥。这些文件共同支撑了Remember-Me Cookie的生成与校验。

Remember-Me伪造的可行性分析

要伪造Remember-Me Cookie,需要获取用户种子、secret.key以及HMAC密钥。前两者可直接读取,但HMAC密钥存储在二进制文件中,在UTF-8字符集下读取会丢失大量字节,导致无法还原完整密钥。即使客户端尝试更改字符集,由于服务端args4j使用默认编码读取文件,二进制信息已在服务端丢失,因此伪造路径在UTF-8环境下基本不可行。

不同环境下的利用差异

文章基于Vulhub环境(Jenkins 2.441)分析,实际利用效果因版本和配置而异。旧版本Jenkins用户密码可能为加密而非哈希,可利用工具解密;部分插件可能引入新的攻击面。此外,Windows系统若使用Windows-1252字符集,二进制文件读取的占位符较少,可能提高Remember-Me伪造的成功率。

❓

Q&A

CVE-2024-23897 漏洞的原理是什么?

该漏洞源于 Jenkins 命令行接口在服务端使用 args4j 库解析参数。当参数以 '@' 开头时,args4j 会自动将该参数视为文件名,读取文件内容作为参数值,从而导致攻击者可以读取服务器上的任意文件。

利用 CVE-2024-23897 需要满足哪些条件?

利用该漏洞有两个核心限制:一是需要 Jenkins 开启“匿名用户可读”选项,否则只能使用 help 和 who-am-i 命令;二是服务端字符集需要兼容读取二进制文件,否则读取二进制文件时会出现占位符导致数据丢失。

攻击者如何通过 Jenkins 命令行读取文件内容?

攻击者可以操纵命令行参数,使用 '@' 符号指定文件路径,并利用 help 或 who-am-i 等命令触发错误,使 args4j 将文件内容作为错误信息返回。如果开启了“匿名用户可读”,还可以使用 connect-node 或 reload-job 等命令读取完整文件内容。

CVE-2024-23897 可以读取哪些敏感文件?

可以读取的敏感文件包括:/var/jenkins_home/users/*/config.xml(用户信息、密码哈希、种子、Token)、/var/jenkins_home/secret.key、/var/jenkins_home/secrets/master.key 以及 /var/jenkins_home/secrets/org.springframework.security.web.authentication.rememberme.TokenBasedRememberMeServices.mac。此外,还可以通过 /proc/self/environ 和 /proc/self/cmdline 获取 Jenkins 根目录。

为什么读取二进制文件时会出现问题?

因为 args4j 使用 FileReader 读取文件时默认使用服务端的 file.encoding(通常是 UTF-8),对于二进制文件,非 UTF-8 字符会被替换为占位符(如 ef bf bd),导致数据丢失。即使客户端指定其他字符集,也无法改变服务端读取时的编码,因此无法完整读取二进制文件内容。

如何利用该漏洞伪造 Remember-Me Cookie?

伪造 Remember-Me Cookie 需要获取 userSeed、secret.key 以及用于计算 HMAC 签名的密钥。其中 HMAC 密钥来自 TokenBasedRememberMeServices.mac 文件,该文件是二进制文件,在 UTF-8 字符集下无法完整读取,因此通常无法伪造。只有在服务端字符集兼容读取二进制文件(如 Windows-1252)时,才可能成功伪造。

Jenkins 的“匿名用户可读”选项对漏洞利用有什么影响?

如果开启“匿名用户可读”,攻击者可以调用大部分命令行命令,从而读取文件全文;如果关闭,则只有 help 和 who-am-i 命令可用,攻击者只能通过错误信息读取文件的前几行,无法获取完整文件内容。

🏷️

标签

➡️

继续阅读