---
title: 'WAF-Bypass via Charset-Confusion: Die Geschichte von CVE-2026-21876 | DevSense'
description: 'Erfahren Sie, wie die Schwachstelle CVE-2026-21876 es Angreifern ermöglicht, das OWASP ModSecurity Core Rule Set (CRS) durch Charset-Confusion in Multipart-Requests und Variablen-Überschreiben in Regel 922110 zu umgehen.'
faq:
    - { question: 'Was ist die Ursache der Schwachstelle CVE-2026-21876?', answer: 'Die Ursache liegt in einem Fehler beim Überschreiben von Variablen in der OWASP-CRS-Regel 922110. Beim Analysieren von Multipart-Anfragen schreibt die WAF den Content-Type und das Charset jedes Teils in dieselbe globale Transaktionsvariable. Da die Validierung gegen die Whitelist erst nach der Verarbeitung aller Teile erfolgt, wird nur der Content-Type des letzten Teils validiert, während vorherige Teile ungeprüft bleiben.' }
    - { question: 'Warum führt Charset-Confusion mit IBM037 oder UTF-7 zu einem WAF-Bypass?', answer: 'Angreifer können ihre Payloads in nicht-standardisierten Zeichenkodierungen wie IBM037 (einer EBCDIC-basierten Kodierung) oder UTF-7 kodieren. Die WAF dekodiert oder inspiziert diese Teile nicht, da die Validierung des Content-Type durch das Überschreiben der Variable umgangen wird und die Signaturregeln für ASCII/UTF-8 ausgelegt sind. Backend-Server wie Undertow oder ASP.NET Core decodieren diese Zeichensätze jedoch automatisch, wodurch die Payload auf dem Backend wieder als Klartext vorliegt.' }
    - { question: 'Wie behebt das OWASP Core Rule Set diese Schwachstelle?', answer: 'Die Schwachstelle wurde durch eine Überarbeitung des Regelsatzes behoben. Anstatt eine einzige Variable zu überschreiben, initialisiert die neue Logik einen Zähler, speichert den Content-Type jedes Multipart-Teils in einer separaten, eindeutig benannten Variable und prüft anschließend jede gespeicherte Variable einzeln gegen die Whitelist.' }
published: '2026-07-09'
---
# WAF-Bypass via Charset-Confusion: Die Geschichte von CVE-2026-21876

Web Application Firewalls (WAFs) sind entscheidende Komponenten moderner Websicherheit. Sie befinden sich zwischen Clients und Backend-Servern und analysieren den eingehenden Datenverkehr, um schädliche Payloads wie SQL-Injections (SQLi) und Cross-Site Scripting (XSS) zu erkennen und zu blockieren. Eine WAF ist jedoch immer nur so stark wie ihre Regeln.

In diesem Artikel analysieren wir **CVE-2026-21876**, eine kritische Schwachstelle im **OWASP ModSecurity Core Rule Set (CRS)**. Diese Schwachstelle ermöglichte es Angreifern, Sicherheitsprüfungen vollständig zu umgehen, indem sie einen Fehler beim Überschreiben von Variablen in Kombination mit der automatischen Zeichensatz-Dekodierung moderner Anwendungs-Backends ausnutzten.

---

## ModSecurity und das OWASP Core Rule Set (CRS)

**ModSecurity** ist eine weit verbreitete, signaturbasierte Open-Source-WAF-Engine, die in Webserver wie Nginx, Apache und IIS integriert werden kann. Da ModSecurity selbst nur eine Engine ist, benötigt sie ein Regelwerk, um Angriffe zu erkennen.

Das **OWASP ModSecurity Core Rule Set (CRS)** ist der Industriestandard für generische Angriffserkennungsregeln. Es ist bei großen Cloud-Anbietern und CDN-Netzwerken wie Azure WAF, AWS WAF-Konfigurationen, Cloudflare, Fastly und Google Cloud Armor im Einsatz. Mit Millionen aktiver Installationen weltweit hat eine Schwachstelle im CRS-Regelwerk weitreichende Auswirkungen und gefährdet zahlreiche Webinfrastrukturen.

---

## Die Funktionsweise von CVE-2026-21876

Die Schwachstelle befindet sich in der Regel **922110**, die entwickelt wurde, um eine strenge Validierung der `Content-Type`-Header einzelner Teile von Multipart-Anfragen (`multipart/form-data`) zu erzwingen. Sie stellt sicher, dass jeder Teil einer Multipart-Anfrage einen in der Whitelist definierten Inhaltstyp und Zeichensatz verwendet.

### Der Variablen-Überschreibungsfehler

Wenn ein Client eine Multipart-Anfrage sendet, durchläuft ModSecurity jeden Teil der Payload. Dabei extrahiert Regel 922110 den `Content-Type` des aktuellen Teils und speichert ihn in einer globalen Transaktionsvariable (z. B. `TX:content_type`).

Der Fehler ist simpel, aber gravierend:
1. **Die Schleife:** ModSecurity iteriert durch alle Teile der Anfrage, extrahiert den Content-Type und schreibt ihn in dieselbe Variable, wodurch der vorherige Wert überschrieben wird.
2. **Die Validierung:** Die Prüfung gegen die Whitelist erfolgt erst **nach** dem Ende der Schleife und nicht für jeden Teil einzeln während der Iteration.
3. **Die Konsequenz:** Nur der Content-Type des **allerletzten Teils** der Multipart-Anfrage wird gegen die Whitelist validiert. Zuvor verarbeitete Teile werden von Regel 922110 effektiv ignoriert.

Als Python-ähnlicher Pseudocode lässt sich die verwundbare Logik wie folgt darstellen:

```python
# Verwundbare Logik (CVE-2026-21876)
content_type_var = None

# Inhaltstypen in einer Schleife extrahieren
for part in request.multipart_parts:
    content_type_var = part.headers.get("Content-Type")  # Überschreibt globale Variable

# Validierung erfolgt außerhalb der Schleife
if not is_whitelisted(content_type_var):
    block_request()
```

Indem ein Angreifer am Ende der Anfrage einen harmlosen Dummy-Parameter mit einem erlaubten Content-Type anhängt, kann er die globale Variable mit einem „sicheren“ Wert überschreiben und die Prüfung vollständig umgehen.

---

## Der Angriffsvektor: Charset-Confusion

Um dies auszunutzen, kombiniert ein Angreifer den Variablen-Überschreibungsfehler mit einer Technik namens **Charset-Confusion** (Zeichensatz-Verwirrung).

Signaturregeln von WAFs (die z. B. nach Begriffen wie `UNION SELECT` oder `<script>` suchen) sind darauf ausgelegt, Daten in Standardkodierungen wie UTF-8 oder ASCII zu analysieren. Wenn ein Angreifer eine Payload in einer unüblichen Kodierung sendet, erkennt die WAF die Signaturen nicht, da sich die zugrundeliegenden Byte-Sequenzen unterscheiden.

Normalerweise würde Regel 922110 jede Anfrage mit einem nicht freigegebenen Charset blockieren. Durch den Überschreibungsfehler lässt die WAF jedoch unzulässige Zeichensätze in den ersten Teilen zu, solange der letzte Teil legitim ist.

### Struktur des Umgehungs-Requests

Der Angreifer baut eine `multipart/form-data`-Anfrage mit zwei Teilen auf:
1. **Teil 1 (Schadcode-Payload):** Verwendet eine nicht-standardisierte Kodierung wie `IBM037` (eine auf EBCDIC basierende Kodierung). Die Content-Type-Validierung der WAF wird (durch das Überschreiben) umgangen, und die WAF prüft die Payload nicht, da sie die EBCDIC-Kodierung nicht versteht.
2. **Teil 2 (Dummy-Parameter):** Verwendet eine Standardkodierung wie `utf-8`. Dies überschreibt die Variable der WAF mit einem gültigen Wert und lässt die gesamte Anfrage passieren.

### HTTP-Request-Beispiel für den WAF-Bypass

```http
POST /vulnerable-endpoint HTTP/1.1
Host: target-app.com
Content-Length: 432
Content-Type: multipart/form-data; boundary=----WebKitFormBoundarySafeAndBypass

------WebKitFormBoundarySafeAndBypass
Content-Disposition: form-data; name="id"
Content-Type: text/plain; charset=ibm037

K@ñ%ÈÊÈÀñKñ
------WebKitFormBoundarySafeAndBypass
Content-Disposition: form-data; name="legitimate_param"
Content-Type: text/plain; charset=utf-8

safe-value
------WebKitFormBoundarySafeAndBypass--
```

> [!NOTE]
> Im obigen Beispiel entspricht die Zeichenkette `K@ñ%ÈÊÈÀñKñ` einer in IBM037 (EBCDIC) kodierten SQL-Injection `' OR 1=1 --`. Für die WAF sehen diese Bytes wie zufällige Binärdaten aus, die keinerlei Angriffsmuster aufweisen.

---

## Dekodierungsverhalten des Backends

Ein WAF-Bypass ist nur dann gefährlich, wenn das Backend die schädliche Payload auch verarbeitet.

Viele moderne Backend-Server und Web-Frameworks parsen Multipart-Anfragen automatisch. Wenn sie auf einen Teil stoßen, der einen bestimmten `charset`-Parameter im `Content-Type`-Header angibt, dekodieren sie die Bytes dieses Teils automatisch mit der angegebenen Kodierung.

Zu den Systemen, die dieses Verhalten standardmäßig aufweisen, gehören:
- **Spring Boot mit Undertow:** Undertow ermittelt und dekodiert Multipart-Werte automatisch anhand des im Content-Type des jeweiligen Teils angegebenen Zeichensatzes.
- **ASP.NET Core:** Der integrierte Multipart-Parser respektiert den Charset-Parameter und übersetzt Zeichenketten in IBM037 oder UTF-7 automatisch in Standard-Unicode/UTF-8-Strings, bevor diese die Controller der Anwendung erreichen.

Wenn die Anfrage das Backend erreicht:
1. Das Backend verarbeitet Teil 1, erkennt `charset=ibm037` und dekodiert die EBCDIC-Bytes zurück in den Klartext: `' OR 1=1 --`.
2. Die Anwendung verarbeitet den Parameter und führt die SQL-Injection oder den XSS-Angriff aus.
3. Die WAF hat den Angriff nicht bemerkt, da sie nur das `charset=utf-8` von Teil 2 validiert und die EBCDIC-Daten in Teil 1 ignoriert hat.

---

## Behebung der Schwachstelle im Core Rule Set

Nach Veröffentlichung der Schwachstelle hat das OWASP CRS-Team einen Patch bereitgestellt, der die Multipart-Validierung von Regel 922110 grundlegend überarbeitet. Statt einer einzigen globalen Variable ist die Prüfung nun in drei Phasen unterteilt:

1. **Zähler-Initialisierung:** Initialisiert einen Zähler, um die Teile der Multipart-Anfrage nachzuverfolgen.
2. **Getrennte Speicherung:** Extrahiert den Content-Type und das Charset *jedes* Teils und speichert diese in separaten Variablen ab, die dem jeweiligen Index zugeordnet sind (z. B. `TX:multipart_content_type_0`, `TX:multipart_content_type_1` usw.).
3. **Vollständige Überprüfung:** Die WAF iteriert durch alle aufgezeichneten Variablen und validiert jede einzeln gegen die Whitelist. Wenn auch nur ein einziger Teil einen ungültigen Inhaltstyp aufweist, wird die gesamte Anfrage blockiert.

Die korrigierte Logik entspricht dem folgenden Pseudocode:

```python
# Korrigierte Logik
content_types = []

# Alle Content-Types in eine Liste schreiben
for part in request.multipart_parts:
    content_types.append(part.headers.get("Content-Type"))

# Jeden einzelnen Teil validieren
for ct in content_types:
    if not is_whitelisted(ct):
        block_request()
        break
```

Durch diesen Patch wird das Überschreiben von Variablen ausgeschlossen, wodurch Angriffe mittels Charset-Confusion zuverlässig auf WAF-Ebene blockiert werden.