这是一个 Java 代理,用于尚未修复 SECURITY-3430 的 Jenkins 控制器(即版本至 2.470 及 LTS 2.452.3 及以下)。
它通过变换包含 SECURITY-3430 漏洞的类的定义来阻止利用。 如果因某种原因失败,Jenkins 将被强制停止。
此变通方案将完全阻止 ClassLoaderProxy#fetchJar,因此与安全公告中提到的受影响的插件功能不兼容,这一点与常规修复不同。
该变通方案已在过去几年的多个 Jenkins 版本上成功测试。
警告:鉴于本变通方案的工作原理,我们强烈建议您定期备份 Jenkins,并逐步部署该变通方案。
保护 Jenkins 控制器进程免受利用:
java -javaagent:/path/to/security3430-workaround.jar -jar jenkins.war
将指定的 RemoteClassLoader$ClassLoaderProxy.class 类文件进行变换,并将结果写入另一个文件:
java -jar /path/to/security3430-workaround.jar <源文件> <目标文件>
这可用于创建经过最小修改的 remoting.jar 文件。
可以设置两个 Java 系统属性来改变此 Java 代理的行为:
io.jenkins.security.Security3430Workaround.DISABLE:
设置为 true 以禁用类变换。io.jenkins.security.Security3430Workaround.SKIP_SHUTDOWN:
设置为 true 以在类变换失败时不停止 Jenkins 进程。
仅在特定的狭窄情况下推荐,例如,当密切监控日志消息时(见下文)。两者都需要在类被加载且尝试进行变换之前设置,最好作为 -D 命令行选项。
日志消息使用 io.jenkins.security.Security3430Workaround 日志记录器。
SEVERE 级别的消息表示变换失败。
在已连接的 Jenkins 代理的脚本控制台中运行以下代码,以确认此变通方案的有效性:
def cl = Thread.currentThread().getContextClassLoader().proxy
cl.fetchJar(new URL('file:/path/to/jenkins/home/secrets/master.key'))
既无修复也无变通方案时,将打印类似以下的消息,表明成功利用:Result: [B@23edd8a0
应用此变通方案后,将抛出 AbstractMethodError 并打印长长的堆栈跟踪。
采用 MIT 许可证条款许可。版权所有 2024 CloudBees, Inc.