CVE-2023-50767
Description
Missing permission checks in Nexus Platform Plugin allow attackers with Overall/Read to send HTTP requests to arbitrary URLs and parse XML responses.
AI Insight
LLM-synthesized narrative grounded in this CVE's description and references.
Missing permission checks in Nexus Platform Plugin allow attackers with Overall/Read to send HTTP requests to arbitrary URLs and parse XML responses.
Vulnerability
Description
Missing permission checks in Jenkins Nexus Platform Plugin 3.18.0-03 and earlier allow attackers with Overall/Read permission to send an HTTP request to an attacker-specified URL and parse the response as XML. This issue is caused by inadequate authorization in HTTP endpoints, as noted in the Jenkins Security Advisory [1] and the NVD entry [3].
Exploitation
An attacker needs only Overall/Read permission, which is a low-privilege level in Jenkins. By exploiting this flaw, the attacker can make the plugin send a crafted HTTP request to any URL and then parse the XML response. This can be used to perform server-side request forgery (SSRF) attacks, potentially accessing internal systems or services that are not publicly accessible [1][2].
Impact
Successful exploitation allows an attacker to send authenticated requests from the Jenkins controller to arbitrary hosts, bypassing network restrictions. The XML parsing capability could also lead to information disclosure if the response contains sensitive data. The impact is considered moderate but can be leveraged for further attacks [1][3].
Mitigation
The vulnerability is fixed in Nexus Platform Plugin version 3.18.1-01. Users should upgrade immediately. The fix adds proper permission checks and CSRF protection to the affected endpoints [2][4].
AI Insight generated on May 20, 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.sonatype.nexus.ci:nexus-jenkins-pluginMaven | < 3.18.1-01 | 3.18.1-01 |
Affected products
2- Range: 0
Patches
11d5e1e9e457aAdd protection from CSRF (#291)
4 files changed · +20 −1
pom.xml+1 −1 modified@@ -85,7 +85,7 @@ <enforcer.skip>true</enforcer.skip> <!-- TODO numerous requireUpperBoundDeps, some probably indicative of real problems --> <jvnet-localizer-plugin.version>1.23</jvnet-localizer-plugin.version> <forkCount>1</forkCount> - <nexus-platform-api.version>4.3.1-01</nexus-platform-api.version> + <nexus-platform-api.version>4.3.2-01</nexus-platform-api.version> <buildsupport.version>36</buildsupport.version> <buildsupport.license-maven-plugin.version>4.1</buildsupport.license-maven-plugin.version>
src/main/java/org/sonatype/nexus/ci/config/NxiqConfiguration.groovy+9 −0 modified@@ -24,6 +24,7 @@ import hudson.util.ListBoxModel import jenkins.model.Jenkins import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter +import org.kohsuke.stapler.verb.POST class NxiqConfiguration implements Describable<NxiqConfiguration> @@ -83,7 +84,9 @@ class NxiqConfiguration Messages.NxiqConfiguration_DisplayName() } + @POST FormValidation doCheckDisplayName(@QueryParameter String value, @QueryParameter String internalId) { + Jenkins.get().checkPermission(Jenkins.ADMINISTER) def globalConfigurations = GlobalNexusConfiguration.globalNexusConfiguration for (NxiqConfiguration config : globalConfigurations.iqConfigs) { if (config.internalId != internalId && config.displayName == value) { @@ -93,7 +96,9 @@ class NxiqConfiguration return FormUtil.validateNotEmpty(value, 'Display Name is required') } + @POST FormValidation doCheckId(@QueryParameter String value, @QueryParameter String internalId) { + Jenkins.get().checkPermission(Jenkins.ADMINISTER) def globalConfigurations = GlobalNexusConfiguration.globalNexusConfiguration for (NxiqConfiguration config : globalConfigurations.iqConfigs) { if (config.internalId != internalId && config.id == value) { @@ -108,7 +113,9 @@ class NxiqConfiguration } @SuppressWarnings('unused') + @POST FormValidation doCheckServerUrl(@QueryParameter String value) { + Jenkins.get().checkPermission(Jenkins.ADMINISTER) def validation = FormUtil.validateUrl(value) if (validation.kind == Kind.OK) { validation = FormUtil.validateNotEmpty(value, Messages.Configuration_ServerUrlRequired()) @@ -123,10 +130,12 @@ class NxiqConfiguration } @SuppressWarnings('unused') + @POST FormValidation doVerifyCredentials( @QueryParameter String serverUrl, @QueryParameter String credentialsId) throws IOException { + Jenkins.get().checkPermission(Jenkins.ADMINISTER) return IqUtil.verifyJobCredentials(serverUrl, credentialsId, Jenkins.instance) } }
src/main/java/org/sonatype/nexus/ci/config/Nxrm2Configuration.groovy+5 −0 modified@@ -18,8 +18,10 @@ import org.sonatype.nexus.ci.config.NxrmConfiguration.NxrmDescriptor import hudson.Extension import hudson.util.FormValidation +import jenkins.model.Jenkins import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter +import org.kohsuke.stapler.verb.POST import static hudson.util.FormValidation.error import static hudson.util.FormValidation.ok @@ -58,9 +60,12 @@ class Nxrm2Configuration } @Override + @POST FormValidation doVerifyCredentials(@QueryParameter String serverUrl, @QueryParameter String credentialsId) throws IOException { + Jenkins.get().checkPermission(Jenkins.ADMINISTER) + try { def repositories = getApplicableRepositories(serverUrl, credentialsId)
src/main/java/org/sonatype/nexus/ci/config/Nxrm3Configuration.groovy+5 −0 modified@@ -17,8 +17,10 @@ import com.sonatype.nexus.api.exception.RepositoryManagerException import groovy.util.logging.Log import hudson.Extension import hudson.util.FormValidation +import jenkins.model.Jenkins import org.kohsuke.stapler.DataBoundConstructor import org.kohsuke.stapler.QueryParameter +import org.kohsuke.stapler.verb.POST import static hudson.util.FormValidation.error import static hudson.util.FormValidation.ok @@ -80,9 +82,12 @@ class Nxrm3Configuration } @Override + @POST FormValidation doVerifyCredentials(@QueryParameter String serverUrl, @QueryParameter String credentialsId) throws IOException { + Jenkins.get().checkPermission(Jenkins.ADMINISTER) + def repositories def badVersionMsg = ''
Vulnerability mechanics
Generated on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.
References
6- github.com/advisories/GHSA-9vrm-747r-668vghsaADVISORY
- nvd.nist.gov/vuln/detail/CVE-2023-50767ghsaADVISORY
- www.jenkins.io/security/advisory/2023-12-13/ghsavendor-advisoryWEB
- www.openwall.com/lists/oss-security/2023/12/13/4ghsaWEB
- github.com/jenkinsci/nexus-platform-plugin/commit/1d5e1e9e457af5e8ce8c9a403933d6cb73542dbdghsaWEB
- github.com/jenkinsci/nexus-platform-plugin/pull/291ghsaWEB
News mentions
1- Jenkins Security Advisory 2023-12-13Jenkins Security Advisories · Dec 13, 2023