CVE-2026-10050: Eclipse Jetty Digest Authentication Authentication Bypass Vulnerability

HIGH
Advisory Identifier: GHSA-2fvj-hgj9-j2gr
CWE-173 CWE-303
Published
Advisory Summary

CVE-2026-10050 is a HIGH authentication bypass vulnerability (CWE-173: Improper Handling of Alternate Encoding) affecting Eclipse Jetty Digest Authentication libraries in the Maven ecosystem. The issue involves iso-8859-1 lossy encoding allows authentication bypass via character substitution. Remediation is available by upgrading affected packages to version 9.4.63, 10.0.31, 11.0.31, 12.0.36, 12.1.10.

CVE-2026-10050 at a Glance

CVE Identifier CVE-2026-10050
GHSA Identifier GHSA-2fvj-hgj9-j2gr
Severity HIGH
CVSS v3.1 Base Score N/A
CWE Classification CWE-173: Improper Handling of Alternate Encoding
Affected Product Eclipse Jetty Digest Authentication
Package Ecosystem Maven
Published Date
Last Updated

How to Fix CVE-2026-10050

To remediate this vulnerability, upgrade all affected Eclipse Jetty Digest Authentication dependencies to a patched release. Both direct and transitive dependencies should be checked, as frameworks or security libraries may pull in vulnerable versions transitively.

org.eclipse.jetty:jetty-security fixed: 9.4.63
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-security</artifactId>
    <version>9.4.63</version>
</dependency>
org.eclipse.jetty:jetty-security fixed: 10.0.31
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-security</artifactId>
    <version>10.0.31</version>
</dependency>
org.eclipse.jetty:jetty-security fixed: 11.0.31
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-security</artifactId>
    <version>11.0.31</version>
</dependency>
org.eclipse.jetty:jetty-security fixed: 12.0.36
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-security</artifactId>
    <version>12.0.36</version>
</dependency>
org.eclipse.jetty.ee8:jetty-ee8-security fixed: 12.0.36
<dependency>
    <groupId>org.eclipse.jetty.ee8</groupId>
    <artifactId>jetty-ee8-security</artifactId>
    <version>12.0.36</version>
</dependency>
org.eclipse.jetty.ee9:jetty-ee9-security fixed: 12.0.36
<dependency>
    <groupId>org.eclipse.jetty.ee9</groupId>
    <artifactId>jetty-ee9-security</artifactId>
    <version>12.0.36</version>
</dependency>
org.eclipse.jetty:jetty-security fixed: 12.1.10
<dependency>
    <groupId>org.eclipse.jetty</groupId>
    <artifactId>jetty-security</artifactId>
    <version>12.1.10</version>
</dependency>
org.eclipse.jetty.ee8:jetty-ee8-security fixed: 12.1.10
<dependency>
    <groupId>org.eclipse.jetty.ee8</groupId>
    <artifactId>jetty-ee8-security</artifactId>
    <version>12.1.10</version>
</dependency>
org.eclipse.jetty.ee9:jetty-ee9-security fixed: 12.1.10
<dependency>
    <groupId>org.eclipse.jetty.ee9</groupId>
    <artifactId>jetty-ee9-security</artifactId>
    <version>12.1.10</version>
</dependency>
Verify Direct and Transitive Dependencies

Run the following command in your project directory to verify that all resolved dependencies use the patched release:

mvn dependency:tree -Dincludes=org.eclipse.jetty

How to Check if You Are Affected

To determine whether your Java application is affected by CVE-2026-10050, inspect your build dependencies using the Maven Dependency Plugin:

mvn dependency:tree -Dincludes=org.eclipse.jetty

Analyze the terminal output to locate any version of Eclipse Jetty Digest Authentication in your dependency tree. If any resolved version matches the vulnerable ranges listed in the table below (for example, versions earlier than 9.4.63), your application is affected.

Note: The mvn dependency:tree -Dincludes=org.eclipse.jetty command inspects the resolved dependency graph declared in your project's POM files; it does not perform automated security scanning or inspect runtime dynamic classpaths. Always verify runtime container classpaths and shaded JARs.

Technical Details

Vulnerability Mechanism & Technical Analysis

This vulnerability is classified under CWE-173: Improper Handling of Alternate Encoding, where the product does not properly handle when an input uses an alternate encoding that is valid for the control sphere to which the input is being sent. In Eclipse Jetty Digest Authentication, software state validation or input boundaries are circumvented during processing. Review the official source advisory statement below for specific affected components, classes, and reproduction details.

Source Advisory Statement

### Summary The `DigestAuthentication.apply()` method in Jetty's HTTP client uses `getBytes(StandardCharsets.ISO_8859_1)` at three locations (lines 171, 179, 196) to compute Digest auth response hashes. ISO-8859-1 silently replaces any character above U+00FF (Chinese, Japanese, Cyrillic, Arabic, Emoji, etc.) with 0x3F (`?`), causing all such characters to produce identical hash contributions. An attacker who knows a victim's username can bypass Digest authentication by replacing all non-Latin-1 characters in the password with `?` characters, since the collision password produces the same MD5-based Digest response hash as the original password. ### Details ### Root Cause In `jetty-core/jetty-client/src/main/java/org/eclipse/jetty/client/DigestAuthentication.java`, the `apply()` method computes the three Digest auth hashes (H(A1), H(A2), and the final response) using ISO-8859-1 character encoding: ```java // Line 171 — H(A1) String hashA1 = toHexString(digester.digest(a1.getBytes(StandardCharsets.ISO_8859_1))); // Line 179 — H(A2) String hashA2 = toHexString(digester.digest(a2.getBytes(StandardCharsets.ISO_8859_1))); // Line 196 — Final response hash final String hashA3 = toHexString(digester.digest(a3.getBytes(StandardCharsets.ISO_8859_1))); ``` ISO-8859-1 (Latin-1) can only encode characters in the range U+0000–U+00FF. Any character outside this range — including all CJK, Cyrillic, Arabic, Greek, Hangul, and emoji characters — is silently replaced with the byte `0x3F` (`?`). `String.getBytes(ISO_8859_1)` in Java performs this replacement without any warning or exception. ### PoC ``` Password: "我爱Java!密码123★" (7 non-Latin-1 characters) UTF-8 encoding: 45 bytes → MD5 H(A1) = 9a4e61484f228633d5d0f95d1bbb0a99 ISO-8859-1: 31 bytes → MD5 H(A1) = d60ddc903d71913bcc3ab4a94f7fc239 Collision "??...": 31 bytes → MD5 H(A1) = d60ddc903d71913bcc3ab4a94f7fc239 ← IDENTICAL ``` Multi-language confirmation — all four language passwords below produce the same hash: ``` Chinese (密码123) → H(A1) = db87f31e8d96cd15f9acec7eabdc4560 Korean (비번123) → H(A1) = db87f31e8d96cd15f9acec7eabdc4560 Cyrillic(аб123) → H(A1) = db87f31e8d96cd15f9acec7eabdc4560 Greek (αβ123) → H(A1) = db87f31e8d96cd15f9acec7eabdc4560 Attacker(??123) → H(A1) = db87f31e8d96cd15f9acec7eabdc4560 ← all collide! ``` ### Impact **Scenario 1: Authentication Bypass (Collision Attack)** If a service using Jetty for Digest authentication has a user with a non-Latin-1 password (e.g., Chinese, Japanese, Russian), an attacker can authenticate as that user using a collision password where all non-Latin-1 characters are replaced with `?`: - Original password: `我爱Java!密码123★` - Collision password: `??Java!??123?` - **Both produce identical MD5 hashes under ISO-8859-1** → Authentication succeeds This affects any password containing characters > U+00FF, which covers: - Chinese (CJK): U+4E00–U+9FFF - Japanese (Hiragana/Katakana/Kanji): U+3040–U+30FF, U+4E00+ - Korean (Hangul): U+AC00–U+D7AF - Cyrillic: U+0400–U+04FF (Russian, Ukrainian, Bulgarian, etc.) - Arabic: U+0600–U+06FF - Greek: U+0370–U+03FF - Latin Extended: U+0100–U+024F (accented European characters like ĉ, ğ, ñ when > U+00FF) - Emoji / Symbols > U+00FF **Scenario 2: Denial of Service for Non-Latin-1 Users** Most modern web applications store password hashes computed using UTF-8. When Jetty's Digest client computes a hash with ISO-8859-1, the bytes differ from what the server stored/expects. This means **any user with non-ASCII (Latin-1+) characters in their password can never successfully authenticate via Digest auth** — even the legitimate user. This is not just a security issue but a functional correctness bug that silently breaks authentication for most non-European-language users.

CVE-2026-10050 Affected Eclipse Jetty Digest Authentication Versions

9 component(s)
Fixed Versions:
9.4.6310.0.3111.0.3112.0.3612.1.10
Product / Package Ecosystem Affected Versions Fixed Version
org.eclipse.jetty:jetty-security
Maven
≥ 9.4.0.v20161208
< 9.4.63
9.4.63
org.eclipse.jetty:jetty-security
Maven
≥ 10.0.0
< 10.0.31
10.0.31
org.eclipse.jetty:jetty-security
Maven
≥ 11.0.0
< 11.0.31
11.0.31
org.eclipse.jetty:jetty-security
Maven
≥ 12.0.0
< 12.0.36
12.0.36
org.eclipse.jetty.ee8:jetty-ee8-security
Maven
≥ 12.0.0
< 12.0.36
12.0.36
org.eclipse.jetty.ee9:jetty-ee9-security
Maven
≥ 12.0.0
< 12.0.36
12.0.36
org.eclipse.jetty:jetty-security
Maven
≥ 12.1.0
< 12.1.10
12.1.10
org.eclipse.jetty.ee8:jetty-ee8-security
Maven
≥ 12.1.0
< 12.1.10
12.1.10
org.eclipse.jetty.ee9:jetty-ee9-security
Maven
≥ 12.1.0
< 12.1.10
12.1.10

References

Frequently Asked Questions

What is CVE-2026-10050?
CVE-2026-10050 is a security vulnerability in Eclipse Jetty Digest Authentication involving ISO-8859-1 lossy encoding allows authentication bypass via character substitution under CWE-173: Improper Handling of Alternate Encoding.
Which Eclipse Jetty Digest Authentication versions are affected?
Affected versions include releases prior to 9.4.63, 10.0.31, 11.0.31, 12.0.36, 12.1.10 across affected packages: org.eclipse.jetty:jetty-security, org.eclipse.jetty.ee8:jetty-ee8-security, org.eclipse.jetty.ee9:jetty-ee9-security.
What version fixes CVE-2026-10050?
Upgrading to 9.4.63, 10.0.31, 11.0.31, 12.0.36, 12.1.10 (or the latest patched release for your respective branch) resolves the vulnerability.
Is jetty-security affected?
Yes, org.eclipse.jetty:jetty-security is affected in releases prior to 9.4.63, 10.0.31, 11.0.31, 12.0.36, 12.1.10. Upgrade your dependency to 9.4.63, 10.0.31, 11.0.31, 12.0.36, 12.1.10 or later.
Is jetty-ee8-security affected?
Yes, org.eclipse.jetty.ee8:jetty-ee8-security is affected in releases prior to 12.0.36, 12.1.10. Upgrade your dependency to 12.0.36, 12.1.10 or later.
What CWE is associated with CVE-2026-10050?
CVE-2026-10050 is classified under CWE-173: Improper Handling of Alternate Encoding (The product does not properly handle when an input uses an alternate encoding that is valid for the control sphere to which the input is being sent.).
How can I check Maven dependencies for CVE-2026-10050?
Run the dependency tree command: 'mvn dependency:tree -Dincludes=org.eclipse.jetty'. This command lists direct and transitive dependencies in your build configuration so you can verify if a vulnerable version is resolved.
Machine-readable OSV JSON OSV v1.5 Schema
Normalized schema output
{
  "schema_version" : "1.4.0",
  "id" : "GHSA-2fvj-hgj9-j2gr",
  "modified" : "2026-07-22T22:55:19Z",
  "published" : "2026-07-22T22:55:18Z",
  "aliases" : [ "CVE-2026-10050" ],
  "summary" : "Eclipse Jetty Digest Authentication: ISO-8859-1 lossy encoding allows authentication bypass via character substitution",
  "details" : "### Summary\nThe `DigestAuthentication.apply()` method in Jetty's HTTP client uses `getBytes(StandardCharsets.ISO_8859_1)` at three locations (lines 171, 179, 196) to compute Digest auth response hashes. ISO-8859-1 silently replaces any character above U+00FF (Chinese, Japanese, Cyrillic, Arabic, Emoji, etc.) with 0x3F (`?`), causing all such characters to produce identical hash contributions. An attacker who knows a victim's username can bypass Digest authentication by replacing all non-Latin-1 characters in the password with `?` characters, since the collision password produces the same MD5-based Digest response hash as the original password.\n\n### Details\n### Root Cause\n\nIn `jetty-core/jetty-client/src/main/java/org/eclipse/jetty/client/DigestAuthentication.java`, the `apply()` method computes the three Digest auth hashes (H(A1), H(A2), and the final response) using ISO-8859-1 character encoding:\n\n```java\n// Line 171 — H(A1)\nString hashA1 = toHexString(digester.digest(a1.getBytes(StandardCharsets.ISO_8859_1)));\n\n// Line 179 — H(A2)\nString hashA2 = toHexString(digester.digest(a2.getBytes(StandardCharsets.ISO_8859_1)));\n\n// Line 196 — Final response hash\nfinal String hashA3 = toHexString(digester.digest(a3.getBytes(StandardCharsets.ISO_8859_1)));\n```\n\nISO-8859-1 (Latin-1) can only encode characters in the range U+0000–U+00FF. Any character outside this range — including all CJK, Cyrillic, Arabic, Greek, Hangul, and emoji characters — is silently replaced with the byte `0x3F` (`?`). `String.getBytes(ISO_8859_1)` in Java performs this replacement without any warning or exception.\n\n### PoC\n```\nPassword: \"我爱Java!密码123★\" (7 non-Latin-1 characters)\n\nUTF-8 encoding:    45 bytes → MD5 H(A1) = 9a4e61484f228633d5d0f95d1bbb0a99\nISO-8859-1:        31 bytes → MD5 H(A1) = d60ddc903d71913bcc3ab4a94f7fc239\nCollision \"??...\": 31 bytes → MD5 H(A1) = d60ddc903d71913bcc3ab4a94f7fc239 ← IDENTICAL\n```\n\nMulti-language confirmation — all four language passwords below produce the same hash:\n\n```\nChinese (密码123)  → H(A1) = db87f31e8d96cd15f9acec7eabdc4560\nKorean  (비번123)  → H(A1) = db87f31e8d96cd15f9acec7eabdc4560\nCyrillic(аб123)    → H(A1) = db87f31e8d96cd15f9acec7eabdc4560\nGreek   (αβ123)    → H(A1) = db87f31e8d96cd15f9acec7eabdc4560\nAttacker(??123)    → H(A1) = db87f31e8d96cd15f9acec7eabdc4560 ← all collide!\n```\n\n### Impact\n**Scenario 1: Authentication Bypass (Collision Attack)**\n\nIf a service using Jetty for Digest authentication has a user with a non-Latin-1 password (e.g., Chinese, Japanese, Russian), an attacker can authenticate as that user using a collision password where all non-Latin-1 characters are replaced with `?`:\n\n- Original password: `我爱Java!密码123★`\n- Collision password: `??Java!??123?`\n- **Both produce identical MD5 hashes under ISO-8859-1** → Authentication succeeds\n\nThis affects any password containing characters > U+00FF, which covers:\n- Chinese (CJK): U+4E00–U+9FFF\n- Japanese (Hiragana/Katakana/Kanji): U+3040–U+30FF, U+4E00+\n- Korean (Hangul): U+AC00–U+D7AF\n- Cyrillic: U+0400–U+04FF (Russian, Ukrainian, Bulgarian, etc.)\n- Arabic: U+0600–U+06FF\n- Greek: U+0370–U+03FF\n- Latin Extended: U+0100–U+024F (accented European characters like ĉ, ğ, ñ when > U+00FF)\n- Emoji / Symbols > U+00FF\n\n**Scenario 2: Denial of Service for Non-Latin-1 Users**\n\nMost modern web applications store password hashes computed using UTF-8. When Jetty's Digest client computes a hash with ISO-8859-1, the bytes differ from what the server stored/expects. This means **any user with non-ASCII (Latin-1+) characters in their password can never successfully authenticate via Digest auth** — even the legitimate user. This is not just a security issue but a functional correctness bug that silently breaks authentication for most non-European-language users.",
  "severity" : [ {
    "type" : "CVSS_V4",
    "score" : "CVSS:4.0/AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N"
  } ],
  "affected" : [ {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty:jetty-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "9.4.0.v20161208"
      }, {
        "fixed" : "9.4.63"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 9.4.58.v20250814"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty:jetty-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "10.0.0"
      }, {
        "fixed" : "10.0.31"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 10.0.26"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty:jetty-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "11.0.0"
      }, {
        "fixed" : "11.0.31"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 11.0.26"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty:jetty-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "12.0.0"
      }, {
        "fixed" : "12.0.36"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 12.0.35"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty.ee8:jetty-ee8-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "12.0.0"
      }, {
        "fixed" : "12.0.36"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 12.0.35"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty.ee9:jetty-ee9-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "12.0.0"
      }, {
        "fixed" : "12.0.36"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 12.0.35"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty:jetty-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "12.1.0"
      }, {
        "fixed" : "12.1.10"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 12.1.9"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty.ee8:jetty-ee8-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "12.1.0"
      }, {
        "fixed" : "12.1.10"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 12.1.9"
    }
  }, {
    "package" : {
      "ecosystem" : "Maven",
      "name" : "org.eclipse.jetty.ee9:jetty-ee9-security"
    },
    "ranges" : [ {
      "type" : "ECOSYSTEM",
      "events" : [ {
        "introduced" : "12.1.0"
      }, {
        "fixed" : "12.1.10"
      } ]
    } ],
    "database_specific" : {
      "last_known_affected_version_range" : "<= 12.1.9"
    }
  } ],
  "references" : [ {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/security/advisories/GHSA-2fvj-hgj9-j2gr"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/issues/15136"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/pull/15160"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/pull/15183"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/commit/4bcdbc7db387ce9e20e2c7571a7250280466221d"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/commit/d0bb829ccecbf19e3ad3d32f2649b2800f01222d"
  }, {
    "type" : "PACKAGE",
    "url" : "https://github.com/jetty/jetty.project"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/releases/tag/jetty-12.0.36"
  }, {
    "type" : "WEB",
    "url" : "https://github.com/jetty/jetty.project/releases/tag/jetty-12.1.10"
  } ],
  "database_specific" : {
    "cwe_ids" : [ "CWE-173", "CWE-303" ],
    "severity" : "HIGH",
    "github_reviewed" : true,
    "github_reviewed_at" : "2026-07-22T22:55:18Z",
    "nvd_published_at" : null
  }
}