Jenkins管道库调用内部闭包导致安全异常

时间:2018-02-12 17:37:54

标签: jenkins jenkins-pipeline multibranch-pipeline

我们正在使用具有组织文件夹的多分支管道(Bitbucket分支源插件)。我正在使用共享库来干燥我们的管道,从Jenkins docs和论坛帖子中获取提示。我还向其他开发人员提供脚本,试图在那些想要“正常工作”的人和想要定制的人之间取得平衡。

我写了一个包含管道和默认步骤的共享库。此库在Jenkins的文件夹级别配置。

jenkins-lib
    vars
        pipeline_main.groovy
        pipeline_pullRequest.groovy
        ...
        default_init.groovy

pipeline_main.groovy进行一些初始化,如果有一个带有键'init'的Map条目或default_init则使用用户提供的阶段:

#!groovy

def call(Map config) {
    pipeline {
        agent any
        ...
        stages {
            stage ('Init') {
                steps {
                  script {
                     config['init'] ? config['init'](config) : default_init(config)
                  }
                }
            }
            ....
        }
    }
}

Jenkinsfile:

@Library('repo/jenkins-lib') _

def customInit = { Map config ->
   echo 'Custom Init function override'
//   default_init(config)   // causes security exception if uncommented
}

if (env.BRANCH_NAME ==~ /PR-\d+/ ) {
    pipeline_pullRequest(maven: 'maven3.3.9')
}
else if (env.BRANCH_NAME ==~ /master|develop/ ) {
    pipeline_main(maven: 'maven3.3.9', init: customInit)
}
else {
    pipeline_feature(maven: 'maven3.3.9')
}

当仅使用默认值时,调用库中定义的管道效果很好。

现在,请注意Jenkinsfile中的customInit方法。为了测试,我在库中添加了调试行和对default_init步骤的调用。当我使用此配置运行测试版本时(default_init 取消注释),构建失败并出现安全性异常:

  

org.jenkinsci.plugins.scriptsecurity.sandbox.RejectedAccessException:不允许使用方法的脚本groovy.lang.GroovyObject invokeMethod java.lang.String java.lang.Object   ...

如果customInit方法只是echo步骤,则管道成功执行。

我知道我可以将呼叫列入invokeMethod的白名单,但似乎我应该尊重詹金斯所说的拒绝避免可能的安全漏洞的请求的警告。并且,我知道我可以在全球Jenkins级别定义库以使其受信任;但是如果可能的话,我更喜欢坚持使用per-folder方法。

我想知道为什么直接从Jenkinsfile调用的库方法不会调用安全异常,但封装在封装中的库方法呢?或者我只是错过了其他的东西?

P.S。 Jenkins 2.89.3,Bitbucket Branch Source 2.2.9,最新版本的所有'Pipeline:...'库。

default_init.groovy内容,如果重要:

#!groovy

import java.util.Map

def call(Map config) {
    echo sh(returnStdout: true, script: 'env | sort')
}

1 个答案:

答案 0 :(得分:0)

我查看了JENKINS-26481和相关的JIRA问题。事实上,我认为这是詹金斯团队尚未解决的一个极端案例(但是?)。

如果我在全局Jenkins级别定义库以使其受信任,那么它就像我想要的那样没有例外。