CVEReports
CVEReports

Automated vulnerability intelligence platform. Comprehensive reports for high-severity CVEs generated by AI.

Product

  • Home
  • Sitemap
  • RSS Feed

Company

  • About
  • Contact
  • Privacy Policy
  • Terms of Service

© 2026 CVEReports. All rights reserved.

Made with love by Amit Schendel & Alon Barad



CVE-2026-22022

Slash & Burn: Bypassing Apache Solr Authorization with a Single Character

Alon Barad
Alon Barad
Software Engineer

Jan 22, 2026·6 min read·61 visits

Executive Summary (TL;DR)

Apache Solr versions 5.3.0 through 9.10.0 contain a 'fail-open' authorization vulnerability. If a deployment uses the `RuleBasedAuthorizationPlugin` without a catch-all `all` permission rule, attackers can bypass specific permission checks (like `security-read`) by appending a trailing slash to the request path. This exploits a normalization inconsistency where Solr fails to match the path to a permission, returns 'null', and subsequently allows the request.

A critical logic flaw in Apache Solr's RuleBasedAuthorizationPlugin allows remote attackers to bypass access controls on administrative endpoints. By simply appending a trailing slash or manipulating path parameters, attackers can trick the authorization mechanism into failing open, granting access to sensitive configuration and security data.

The Hook: Solr's Glass Fortress

Apache Solr is the massive, beating heart of enterprise search. It indexes everything from your emails to your shopping history. Naturally, because it holds the keys to the data kingdom, it comes with a locking mechanism: the RuleBasedAuthorizationPlugin. This plugin is supposed to be the bouncer, checking your ID (credentials) against the guest list (security.json) before letting you into the VIP section (the Admin API).

Administrators spend hours crafting granular security.json files. They define roles like dev-ops, read-only, and security-admin. They map these roles to permissions like config-edit or security-read. It looks robust. It feels secure. You deploy it, pat yourself on the back, and go grab a coffee.

But here's the kicker: Solr's bouncer has a blind spot. It assumes that every request will neatly fit into a predefined category. CVE-2026-22022 is the story of what happens when you hand the bouncer a ticket written in crayons that simply says 'null'. Instead of kicking you out, the bouncer gets confused, shrugs, and holds the door open for you.

The Flaw: The Sound of One Hand Shrugging

To understand this vulnerability, you have to understand how Solr decides what you are trying to do. When a request hits the server, Solr's handlers (like ZookeeperInfoHandler or SolrConfigHandler) inspect the path and HTTP method to determine the required permission. For example, a GET request to /solr/admin/security.json should map to the security-read permission.

However, prior to version 9.10.1, this logic was brittle. It relied on exact string matching without sufficient normalization. If you requested /solr/admin/security.json (clean path), the handler said, "Aha! You need security-read permissions."

But if you requested /solr/admin/security.json/ (trailing slash), the logic faltered. The handler compared /security.json/ against /security.json, saw they didn't match, and failed to identify the correct permission name.

In a secure system, failing to identify the permission should result in an error or a default-deny. In Solr's RuleBasedAuthorizationPlugin, the handler returned null. The plugin then looked at your security.json rules. If you didn't have a catch-all rule (the all permission) defined, the plugin essentially said, "Well, I don't have a rule for 'null', so I guess you're free to go." It is a classic 'Fail-Open' architecture flaw.

The Code: Patch Analysis

The fix, authored by Jason Gerlowski in commit c135e6335c7158fa26e96b0dc386f825255b47c0, reveals the embarrassment of the original logic. The patch applies a tourniquet in two places: normalizing the input and changing the default behavior from "shrug" to "panic".

First, they forced path normalization in HttpSolrCall and V2HttpCall using StringUtils.stripEnd(path, "/"). This ensures that /path/ and /path are treated identically before the permission check happens.

Second, and more critically, they patched the RuleBasedAuthorizationPluginBase.java to handle the null case explicitly. Look at the diff logic below:

// RuleBasedAuthorizationPluginBase.java (The Fix)
PermissionNameProvider handler = (PermissionNameProvider) context.getHandler();
PermissionNameProvider.Name permissionName = handler.getPermissionName(context);
 
// The new safety net
if (permissionName == null) {
  final var errorMessage =
      String.format(
          Locale.ROOT,
          "Unable to find 'predefined' associated with requestHandler [%s] and request [%s %s]",
          handler.getClass().getName(),
          context.getHttpMethod(),
          context.getResource());
  // SCREAM AND DIE instead of failing open
  throw new SolrException(SolrException.ErrorCode.SERVER_ERROR, errorMessage);
}

Before this patch, that if (permissionName == null) block didn't exist. The code would just proceed, bypassing the specific checks for security-read or config-read, leaving the door wide open if the all permission wasn't manually configured by the admin.

The Exploit: Slashing the ACLs

Exploiting this is trivially easy and embarrassingly effective. It requires no compiled code, no heap grooming, and no race conditions. It just requires a browser or curl and a basic understanding of URL structures.

The Scenario: You are targeting a Solr instance protected by basic auth. You have valid low-level credentials (or no credentials, if the endpoint is exposed), but you want to read the security.json file to dump the password hashes of the administrators.

Step 1: The Denial Attempt to read the security config normally: GET /solr/admin/zookeeper?path=/security.json Result: 403 Forbidden (You don't have the security-read role).

Step 2: The Bypass Append a slash to the path parameter: GET /solr/admin/zookeeper?path=/security.json/

The Logic Flow:

  1. The ZookeeperInfoHandler receives the path /security.json/.
  2. It checks: if ("/security.json".equals(path)). Result: false.
  3. It falls through its logic and returns null for the permission name.
  4. RuleBasedAuthorizationPlugin receives null.
  5. It iterates through defined rules in security.json (config-edit, security-read). None match null.
  6. No all rule exists? Access Granted.

This technique works on various handlers where path normalization was skipped, effectively rendering the granular ACLs useless.

The Impact: Keys to the Kingdom

Why is this a CVSS 8.2 and not just a nuisance? Because in Solr, configuration is everything. If an attacker can bypass the security-read check, they can download security.json. This file often contains the salted hashes of all users, including administrators.

With the hashes in hand, an offline brute-force attack (or simply passing the hash if the attacker can manipulate internal states) leads to full administrative takeover. Once an attacker is an Admin, they can abuse the ConfigHandler to load malicious .jar files or use Velocity templates to achieve Remote Code Execution (RCE).

Furthermore, this bypass isn't limited to security configs. It allows reading schema definitions (schema-read) and metrics (metrics-read), potentially exposing business logic and infrastructure details that facilitate further attacks. It turns a locked door into a revolving door.

The Fix: Closing the Loophole

The immediate fix is to upgrade to Apache Solr 9.10.1. This version includes the patch that forces normalization and throws exceptions on ambiguous requests.

If you cannot upgrade immediately (and let's be honest, who upgrades enterprise search clusters on a Friday?), you have a configuration-based mitigation. You must update your security.json to include a catch-all rule.

Add a permission rule for all and assign it to a restricted role (or your admin role). This effectively changes the default behavior from "Allow" to "Deny".

{
  "name": "all",
  "role": "admin" // or a specific safe role
}

With this rule in place, when the exploit returns null (or any unknown permission), the plugin will fall through to the all rule, check if the user has the admin role, and correctly deny the request. It's the digital equivalent of nailing the window shut because the lock is broken.

Official Patches

ApacheGitHub Commit c135e63

Fix Analysis (1)

Technical Appendix

CVSS Score
8.2/ 10
CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:L/A:N

Affected Systems

Apache Solr 5.3.0Apache Solr 6.xApache Solr 7.xApache Solr 8.xApache Solr 9.0.0 - 9.10.0

Affected Versions Detail

Product
Affected Versions
Fixed Version
Apache Solr
Apache Software Foundation
>= 5.3.0, <= 9.10.09.10.1
AttributeDetail
CVE IDCVE-2026-22022
CVSS v3.18.2 (High)
CWECWE-285 (Improper Authorization)
Attack VectorNetwork (API)
Exploit ComplexityLow
Privileges RequiredNone / Low (depending on network access)
StatusPatched

MITRE ATT&CK Mapping

T1190Exploit Public-Facing Application
Initial Access
T1083File and Directory Discovery
Discovery
CWE-285
Improper Authorization

The software does not perform or incorrectly performs an authorization check when an actor attempts to access a resource or perform an action.

Known Exploits & Detection

Manual AnalysisManual modification of URL path parameters to append trailing slashes (e.g., ?path=/security.json/)

Vulnerability Timeline

Patch Committed by Jason Gerlowski
2026-01-20
Public Disclosure on OSS-Security
2026-01-20

References & Sources

  • [1]Apache Mailing List - CVE-2026-22022
  • [2]OSS-Security Announcement

Attack Flow Diagram

Press enter or space to select a node. You can then use the arrow keys to move the node around. Press delete to remove it and escape to cancel.
Press enter or space to select an edge. You can then press delete to remove it or escape to cancel.

More Reports

•2 minutes ago•CVE-2026-56677
8.6

CVE-2026-56677: Unauthenticated Server-Side Request Forgery in 9Router OIDC Test Endpoint

A high-severity security vulnerability exists in 9Router, an AI router and token saver dashboard. When dashboard authentication features are disabled or left in default configurations, the application exposes administrative testing routines directly to the public internet. Unauthenticated network adversaries can exploit the OIDC configuration validation endpoint to initiate arbitrary HTTP requests, routing unauthorized traffic to local loops, adjacent container ports, and cloud resource metadata interfaces.

Amit Schendel
Amit Schendel
0 views•5 min read
•about 1 hour ago•CVE-2026-64849
9.3

CVE-2026-64849: Server-Side Request Forgery (SSRF) in MLflow Webhooks via DNS Rebinding

CVE-2026-64849 is a critical Server-Side Request Forgery (SSRF) vulnerability affecting MLflow tracking servers prior to version 3.15.0. It allows unauthenticated remote attackers to bypass outbound request destination filters using DNS rebinding or HTTP redirects. This exposure risks compromising sensitive cloud infrastructure metadata and internal microservices.

Alon Barad
Alon Barad
2 views•5 min read
•about 2 hours ago•CVE-2026-69146
6.5

CVE-2026-69146: Missing Authorization Bypass in MLflow Basic Authentication Middleware

This technical report details a missing authorization vulnerability (CVE-2026-69146 / GHSA-3p64-6gvh-82v5) affecting the MLflow platform from version 3.13.0 to 3.15.0. When MLflow is configured with the built-in basic-auth plugin, authenticated users can bypass run-level UPDATE authorization checks, enabling unauthorized dataset and model lineage metadata injection.

Alon Barad
Alon Barad
2 views•7 min read
•about 3 hours ago•CVE-2026-69148
7.1

CVE-2026-69148: Broken Object Level Authorization (BOLA) in MLflow Model Registry

MLflow prior to version 3.15.0 fails to perform proper authorization checks when registering model versions, allowing authenticated users with access to a registered model to link and access artifacts from runs and models belonging to other users without authorization.

Amit Schendel
Amit Schendel
4 views•7 min read
•about 4 hours ago•CVE-2026-59893
7.5

CVE-2026-59893: Regular Expression Denial of Service in sqlparse Lexer

A high-severity Regular Expression Denial of Service (ReDoS) vulnerability in the sqlparse Python library prior to version 0.6.0 allows unauthenticated remote attackers to trigger CPU exhaustion and application denial of service via crafted SQL inputs containing unmatched dollar-quoted literals or unclosed multiline comments.

Alon Barad
Alon Barad
4 views•6 min read
•about 5 hours ago•GHSA-FHGH-WQ4Q-R37X
7.8

GHSA-FHGH-WQ4Q-R37X: Remote Code Execution via Sigstore Signature Verification Bypass in uniget CLI

A high-severity logic inversion flaw in the uniget CLI completely bypasses Sigstore cryptographic signature verification on metadata files by default. If an attacker can poison the package metadata cache or repository, they can execute arbitrary OS commands under the privileges of the active user.

Alon Barad
Alon Barad
5 views•5 min read