RabbitMQ: Malformed UTF-8 in shortstr properties permanently disables RPC consumers
Beschreibung
Eine einzelne AMQP-Nachricht mit fehlerhaftem UTF-8 in einer shortstr-Eigenschaft (z. B. "correlation-id") kann einen Java-Client-RPC-Konsumenten dauerhaft deaktivieren. Der Client decodiert fehlerhafte Bytes in U + FFFD-Ersatzzeichen. Jede dieser Codierungen kodiert zu 3 Bytes, so dass eine 255-Byte-Eigenschaft zu 765 Bytes wird (über dem 255-Byte-Shortstr-Limit). Wenn die Anwendung diesen Wert zurückgibt, wie es das dokumentierte RPC-Muster tut, wirft der Encoder eine ungeprüfte 'IllegalArgumentException'. Das tötet die Verbraucherschleife oder reißt den Kanal hinunter. Die Nachricht wird nie bestätigt, so dass der Broker sie erneut anwartet und den nächsten Verbraucher deaktiviert, der sie abholt. Die Wiederherstellung hilft nicht; der Dienst bleibt ausgeschaltet, bis ein Bediener die Warteschlange manuell bereinigt. Kurz gesagt: Der Decoder erzeugt Werte, die der Encoder ablehnt, und jeder Client, der einen RPC-Dienst *verwenden darf, kann ihn dauerhaft für alle zerstören. ### Details `ValueReader.readShortstr` dekodiert mit `new String(b, StandardCharsets.UTF 8)`, das stillschweigend U+FFFD für fehlerhafte Eingaben ersetzt: https://github.com/rabbitmq/rabbitmq-java-client/blob/main/src/main/java/com/rabbitmq/client/impl/ValueReader.java#L69-L75 `ValueWriter.writeShortstr` lehnt das Ergebnis mit einer ungeprüften Ausnahme ab: https://github.com/rabbitmq/rabbitmq/java-client/blob/main/src/main/java/com/rabbitmq/client/impl/ValueWriter.java#L44-L56 Ein Wert, den die Bibliothek selbst produziert hat, kann also nicht an die Bibliothek zurückgegeben werden. Jede Shortstr-Eigenschaft, die vom Draht kommt und zurückgespiegelt wird (`correlation-id`, `reply-to`, die als Routing-Schlüssel verwendet werden, `message-id`, `type`, `app-id`), ist betroffen. Zwei Verbrauchspfade sind betroffen: 1. **`RpcServer.mainloop()`** fängt nur `InterruptedException` und `ShutdownSignalException`, so dass die Ausnahme entweicht und der Schleifenfaden still stirbt: https://github.com/rabbitmq/rabbitmq-java-client/blob/main/src/main/java/com/rabbitmq/client/RpcServer.java#L109-L129 2. **The pattern in the official tutorial** (`basicConsume` + `DeliverCallback`, echo `correlation) Id` und Publishing to `replyTo` wirft innerhalb des Callbacks, und der Kanal wird durch den Exception Handler geschlossen. Dies ist die weiter verbreitete der beiden. In beiden Fällen ist "autoAck" "false" und das Ack wird nie erreicht, so dass die Nachricht in die Warteschlange zurückkehrt. Eine verwandte Instanz existiert im eigenen Wiederherstellungspfad der Bibliothek: "RecordedConsumer.recover()" sendet das vom Broker zugewiesene Verbraucher-Tag erneut, das den gleichen Wurf treffen würde, wenn ein bösartiger Broker ein fehlerhaftes Tag zugewiesen würde. ### PoC Weder der Java-Client noch Pika können dies reproduzieren: Der Java-Schriftsteller lehnt übergroße Strings ab, und beide codieren `str` als gut geformtes UTF-8, das nicht erweitert wird. Die Frames müssen von Hand geschrieben werden. ** Ein Triager, der es mit einem Aktienkunden versucht, wird es nicht reproduzieren. ** 1. Starten Sie einen Broker: ``bash docker run -it --rm --name rabbitmq -p 5672:5672 rabbitmq ``` 2. Veröffentlichen Sie eine Nachricht, deren `correlation-id` 255 × `0xFF` ist: ``python import socket, struct def sstr(b): if isinstance(b, str): b = b.encode ..
Quellen & weiterführende Informationen
Hier werden ausschließlich tatsächlich zu dieser Schwachstelle gespeicherte Quellenbelege angezeigt.
Was ist zur Behebung zu tun?
Auf eine behobene Version aktualisieren: 5.36.0.
Empfohlene Schritte
- Betroffene Systeme identifizieren: Broadcom com.rabbitmq:amqp-client.
- Exposition prüfen: Internet-Erreichbarkeit, Admin-Oberflächen, VPN, Mail- oder Webdienste.
- Update/Rollout auf behobene Version vorbereiten und priorisiert einspielen.
- Nacharbeiten dokumentieren: betroffene Assets, Maßnahme, Zeitpunkt, Restrestrisiko.
Übergangsmaßnahmen
- Zugriff auf betroffene Dienste auf vertrauenswürdige Netze einschränken.
- WAF/IDS/EDR-Regeln und Hersteller-IOCs aktivieren, sofern verfügbar.
- Nicht benötigte Funktionen, Plugins oder Dienste temporär deaktivieren.
- Administrative Zugänge besonders absichern: MFA, Passwortrotation, Session-Invalidierung.