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

时间:2018-02-28 11:06:13

标签: jenkins groovy

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

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大师身上,我也看了看:

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

可是:

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

1 个答案:

答案 0 :(得分: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 Security Plugin开发人员无法考虑应该列入白名单的所有可能方法,这就是为什么给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()一次并随时使用它是最有效的方法。