CVE-2019-1003017
Description
A data modification vulnerability exists in Jenkins Job Import Plugin 3.0 and earlier in JobImportAction.java that allows attackers to copy jobs from a preconfigured other Jenkins instance, potentially installing additional plugins necessary to load the imported job's configuration.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Jenkins Job Import Plugin 3.0 and earlier missing permission checks allow attackers to copy jobs from other Jenkins instances and install plugins.
Vulnerability
Jenkins Job Import Plugin 3.0 and earlier in JobImportAction.java does not perform permission checks on doImport and doQuery methods, allowing unauthorized copying of jobs from a configured remote Jenkins instance and potential installation of additional plugins required for those jobs [1][2][3].
Exploitation
Attackers with network access to the Jenkins controller can directly invoke the doImport or doQuery endpoints without proper authorization, as the methods lacked permission checks and were not restricted to POST requests. By exploiting this, they can copy arbitrary jobs from a remote instance configured in the plugin [3].
Impact
Successful exploitation enables attackers to modify Jenkins configuration by importing jobs, which may also trigger the automatic installation of plugins necessary to load those jobs. This can lead to unauthorized plugin installation and potential remote code execution if plugins have vulnerabilities [1][2].
Mitigation
Jenkins Job Import Plugin 3.1 introduced permission checks and HTTP method restrictions (POST only) for the affected methods. Users should upgrade to version 3.1 or later. No workaround is available. The plugin is listed in the Jenkins security advisory [1] and the fix commit is [3].
AI Insight generated on May 22, 2026. Synthesized from this CVE's description and the cited reference URLs; citations are validated against the source bundle.
Affected packages
Versions sourced from the GitHub Security Advisory.
| Package | Affected versions | Patched versions |
|---|---|---|
org.jenkins-ci.plugins:job-import-pluginMaven | < 3.1 | 3.1 |
Affected products
3<=3.0+ 1 more
- (no CPE)range: <=3.0
- (no CPE)range: 3.0 and earlier
Patches
18f826a684ba0[SECURITY-1302]
2 files changed · +12 −11
src/main/java/org/jenkins/ci/plugins/jobimport/JobImportAction.java+12 −1 modified@@ -56,10 +56,13 @@ import org.jenkins.ci.plugins.jobimport.utils.CredentialsUtils.NullSafeCredentials; import org.jenkins.ci.plugins.jobimport.utils.RemoteItemUtils; import org.jenkins.ci.plugins.jobimport.utils.URLUtils; +import org.kohsuke.accmod.Restricted; +import org.kohsuke.accmod.restrictions.NoExternalUse; import org.kohsuke.stapler.ForwardToView; import org.kohsuke.stapler.QueryParameter; import org.kohsuke.stapler.StaplerRequest; import org.kohsuke.stapler.StaplerResponse; +import org.kohsuke.stapler.verb.POST; import javax.servlet.ServletException; import javax.xml.transform.Source; @@ -99,8 +102,13 @@ public void doClear(final StaplerRequest request, final StaplerResponse response response.sendRedirect(Jenkins.get().getRootUrl() + getUrlName()); } + @POST + @Restricted(NoExternalUse.class) public void doImport(final StaplerRequest request, final StaplerResponse response) throws ServletException, IOException { + + Jenkins.get().checkPermission(JOB_IMPORT); + final SortedMap<RemoteItem, RemoteItemImportStatus> remoteJobsImportStatus = new TreeMap<RemoteItem, RemoteItemImportStatus>(); final String localFolder = request.getParameter(Constants.LOCAL_FOLDER_PARAM); @@ -139,9 +147,12 @@ public void doImport(final StaplerRequest request, final StaplerResponse respons .with("remoteJobsImportStatusAvailable", remoteJobsImportStatus.size()>0) .generateResponse(request, response, this); } - + @POST public void doQuery(final StaplerRequest request, final StaplerResponse response) throws ServletException, IOException { + + Jenkins.get().checkPermission(JOB_IMPORT); + final SortedSet<RemoteItem> remoteJobs = new TreeSet<RemoteItem>(); final String remoteFolder = request.getParameter("remoteFolder");
src/main/java/org/jenkins/ci/plugins/jobimport/utils/URLUtils.java+0 −10 modified@@ -52,16 +52,6 @@ * @since 1.0 */ public final class URLUtils { - public static InputStream fetchUrl2(String url, String username, String password) throws MalformedURLException, IOException { - notNull(url); - notNull(username); - notNull(password); - URLConnection conn = new URL(url).openConnection(); - if (!username.isEmpty()) { - conn.setRequestProperty("Authorization", "Basic " + DatatypeConverter.printBase64Binary((username + ":" + password).getBytes())); - } - return conn.getInputStream(); - } public static void notNull(final Object object) { if (object == null) {
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
4- github.com/advisories/GHSA-8crr-xf35-5f5pghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2019-1003017ghsaADVISORY
- github.com/jenkinsci/job-import-plugin/commit/8f826a684ba0969697d2a92a6f448aef8f03b66cghsaWEB
- jenkins.io/security/advisory/2019-01-28/ghsax_refsource_CONFIRMWEB
News mentions
0No linked articles in our index yet.