脚本不允许使用staticMethod java.time.Instant解析java.lang.CharSequence

问题描述 投票:2回答:1

在使用共享库(在jenkins文件夹/ untrusted上配置)的jenkinsfile中,我有以下行:

def itemTime = Instant.parse("2018-02-27T13:33:36Z")

当我运行我的管道时,我得到:

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException: Scripts not permitted to use staticMethod java.time.Instant parse java.lang.CharSequence
    at org.jenkinsci.plugins.scriptsecurity.sandbox.whitelists.StaticWhitelist.rejectStaticMethod(StaticWhitelist.java:189)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onStaticCall(SandboxInterceptor.java:150)
    at org.kohsuke.groovy.sandbox.impl.Checker$2.call(Checker.java:184)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedStaticCall(Checker.java:188)

当然我可以手动批准脚本方法:

staticMethod java.time.Instant parse java.lang.CharSequence

詹金斯大师,我也看了看:

Jenkins CI Pipeline Scripts not permitted to use method groovy.lang.GroovyObject

但:

  1. 为什么这个方法首先被列入黑名单?
  2. 如何仅使用列出白名单的方法解析上述日期?
jenkins groovy
1个回答
1
投票

并不是这个方法被列入黑名单 - Jenkins' Security Plugin需要可以在Groovy沙箱中使用的白名单方法。您可以在此处找到默认情况下列入白名单的所有方法的列表:

https://github.com/jenkinsci/script-security-plugin/blob/master/src/main/resources/org/jenkinsci/plugins/scriptsecurity/sandbox/whitelists/generic-whitelist

这背后的原因是在运行Jenkins构建时提供尽可能高的安全性。如果默认情况下所有方法都可用,则用户可能会运行破坏其他构建或Jenkins服务器的恶意脚本。

当然缺点是Jenkins安全插件开发人员无法考虑应该列入白名单的所有可能方法,这就是为什么给Jenkins管理员提供脚本批准选项的原因 - 任何时候RejectedAccessException都会在构建中被抛出,进程内脚本批准等待着这个方法签名以批准它并将其列入白名单供以后使用。

Instant类没有任何方法被列入白名单,即使是类似的东西

Instant.now();

这不会导致任何副作用并返回不可变对象。但这是切割所有政策的代价,只允许一小部分(~550)方法。

回答你的第二个问题 - 批准Instant.parse()实际上是唯一的方法。如果你试试:

Date.parse("yyyy-MM-dd'T'HH:mm:ssZ", "2018-02-27T13:33:36Z")

要么

new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZ").parse("2018-02-27T13:33:36Z")

你会得到另一个RejectedAccessException和方法签名批准,所以批准Instant.parse()一次并随时使用它是最有效的方法。

© www.soinside.com 2019 - 2024. All rights reserved.