Skip to content

Fix authentication bypass via predictable remember-me token signature#1

Draft
Copilot wants to merge 2 commits intomasterfrom
copilot/fix-authentication-bypass-vulnerability
Draft

Fix authentication bypass via predictable remember-me token signature#1
Copilot wants to merge 2 commits intomasterfrom
copilot/fix-authentication-bypass-vulnerability

Conversation

Copy link
Copy Markdown

Copilot AI commented Feb 18, 2026

TokenBasedRememberMeServices2.makeTokenSignature() returns the literal string "no-prop" when UserSeedProperty is null, completely bypassing the HMAC signature computation. An attacker can forge a remember-me cookie for any user by setting the signature field to "no-prop".

Before (vulnerable):

if (userSeedProperty == null) {
    return "no-prop"; // predictable, no secret involved
}
userSeed = userSeedProperty.getSeed();

After (fixed):

if (userSeedProperty == null) {
    userSeed = "no-prop";
} else {
    userSeed = userSeedProperty.getSeed();
}
// Falls through to MAC.mac(token) — HMAC always computed with server secret

This is consistent with the DISABLE_USER_SEED path which uses "no-seed" as the seed but still computes the HMAC.

Changes

  • TokenBasedRememberMeServices2.java: Replace return "no-prop" with userSeed = "no-prop" so the HMAC is always computed with the server's secret key
  • TokenBasedRememberMeServices2Test.java: Add regression tests verifying forged cookies with "no-prop" signature are rejected and that makeTokenSignature never returns a literal fallback

Attack vector

Craft cookie: Base64("admin:<future_ts>:no-prop") → signature matches when UserSeedProperty is null (extension filtered out, startup race, legacy user config) → authenticated as target user.

CVSS 9.8 — network-exploitable, no auth required, full compromise of any account.

Warning

Firewall rules blocked me from connecting to one or more addresses (expand for details)

I tried to connect to the following addresses, but was blocked by firewall rules:

  • repo.jenkins-ci.org
    • Triggering command: /usr/lib/jvm/temurin-17-jdk-amd64/bin/java /usr/lib/jvm/temurin-17-jdk-amd64/bin/java --enable-native-access=ALL-UNNAMED -Xmx1400m -classpath /usr/share/apache-maven-3.9.12/boot/plexus-classworlds-2.9.0.jar -Dclassworlds.conf=/usr/share/apache-maven-3.9.12/bin/m2.conf -Dmaven.home=/usr/share/apache-maven-3.9.12 -Dlibrary.jansi.path=/usr/share/apache-maven-3.9.12/lib/jansi-native -Dmaven.multiModuleProjectDirectory=/home/REDACTED/work/jenkins/jenkins org.codehaus.plexus.classworlds.launcher.Launcher compile -pl core -am -q -DskipTests ndardArtifactMancurl wc /usr/bin/curl grep (dns block)

If you need me to access, download, or install something from one of these locations, you can either:


✨ Let Copilot coding agent set things up for you — coding agent works faster and does higher quality work when set up for your repo.

When UserSeedProperty is null, makeTokenSignature() was returning the
literal string "no-prop" as the cookie signature, completely bypassing
the HMAC computation. This allowed an attacker to forge a remember-me
cookie for any user by setting the signature to "no-prop".

The fix uses "no-prop" as a seed value (like the DISABLE_USER_SEED case
uses "no-seed") and still computes the HMAC with the server's secret key,
making the signature unpredictable to attackers.

Co-authored-by: DominicBreuker <[email protected]>
Copilot AI changed the title [WIP] Fix critical authentication bypass vulnerability Fix authentication bypass via predictable remember-me token signature Feb 18, 2026
Copilot AI requested a review from DominicBreuker February 18, 2026 12:18
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.

2 participants