[Bug] Negative frame data length causes IllegalArgumentException in ExchangeCodec
I maintainer di solito rispondono entro 1 giorno
Valutazione
- Difficoltà
- 2/5
- Tempo stimato
- 1-3 ore
- Idoneità per principianti
- 88/100
- Tipo di issue
- Bug
- Chiarezza
- Specificata chiaramente
- Stato di attività
- Attiva
- Stack tecnologico
- java
- Ambito
- distributed-systems, networking
Direzione di ricerca
Inizia da ExchangeCodec.decode di dubbo-remoting-api, concentrandoti sulla lunghezza con segno letta con Bytes.bytes2int all’offset 12 e sul successivo controllo di completezza. Usa il frame fornito di 16 byte con lunghezza negativa o una riproduzione diretta del codec, quindi aggiungi un test di regressione che dimostri che il frame non valido viene rifiutato senza che una IllegalArgumentException fuoriesca dal costruttore dello stream.
Scritto dal modello di indicizzazione a partire dal testo della issue.
Descrizione
Pre-check
- I am sure that all the content I provide is in English.
Search before asking
- I had searched in the issues and found no similar issues.
Apache Dubbo Component
Java SDK (apache/dubbo)
Dubbo Version
Dubbo Java 3.3.6 (tag dubbo-3.3.6); the same code is unchanged on the 3.3 branch (checked today).
OpenJDK 21, Linux.
Protocol: dubbo.
Steps to reproduce this issue
While testing how the dubbo protocol codec handles invalid frames locally, we found that a frame whose header declares a negative data length makes decode throw IllegalArgumentException before decodeBody is reached.
A complete minimal frame is 16 bytes:
da bb c2 00 ff ff ff ff ff ff ff ff ff ff ff ff
magic dabb, flag c2 (request, twoway, hessian2), requestId all ff, and the data length field at offset 12 set to ffffffff, which reads back as -1.
Passing these bytes to DubboCodec.decode, or writing them to a provider port over TCP, throws:
java.lang.IllegalArgumentException: length: -1
at org.apache.dubbo.remoting.buffer.ChannelBufferInputStream.<init>(ChannelBufferInputStream.java:37)
at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:134)
at org.apache.dubbo.remoting.exchange.codec.ExchangeCodec.decode(ExchangeCodec.java:92)
On the netty4 transport the exception leaves the codec and is handled as a connection-level exception (logged, connection closed).
What you expected to happen
A header declaring a negative data length is not a valid frame, and no additional input can make it one. decode should reject such a frame as invalid at the point the length is read, instead of letting a stream constructor throw an uncaught IllegalArgumentException from inside the codec. A sign check on len right after Bytes.bytes2int would cover it; returning NEED_MORE_INPUT would not fit here, since it would leave the channel waiting for input that can never make a negative length valid.
Anything else
Root cause, in ExchangeCodec (dubbo-remoting-api, tag dubbo-3.3.6):
- line 119: the data length is read as a signed int (Bytes.bytes2int(header, 12))
- line 123: finishRespWhenOverPayload only compares against the payload upper bound, and only for responses
- line 129: the completeness check (readable < len + 16) passes for every negative len
- line 134: ChannelBufferInputStream rejects negative lengths with IllegalArgumentException, which escapes decode
We have the 16-byte reproducer and a direct codec call available as a minimal demo, and are willing to submit a PR with the check and a test.
Do you have a (mini) reproduction demo?
- Yes, I have a minimal reproduction demo to help resolve this issue more effectively!
Are you willing to submit a pull request to fix on your own?
- Yes I am willing to submit a pull request on my own!
Code of Conduct
- I agree to follow this project's Code of Conduct
- Lingua principale
- Java
- Stelle
- 41.6k
- Fork
- 26.3k
- Merge medio
- 1g 22h
- PR unite (30g)
- 19
Preparare l'ambiente
- Nessun Dockerfile né file Docker Compose
- Ha un modello di pull request
- Leggi la guida per i contributori
Come iniziare
- Leggi tutta la issue e poi la guida ai contributi del progetto.
- Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
- Fai un fork del repository e lavora su un branch.
- Apri una pull request che faccia riferimento al numero della issue.
Altre issue di apache/dubbo
-
[Bug] Auto-trusted serialization allow list skips array component classesForse già presa @Icesource l’ha presa 4 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
apache/dubbo#16569 · 1 commento · 1 reazione ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug] QoS count command ignores the times argument after cdForse già presa @CCCLL l’ha presa 19 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
apache/dubbo#16530 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
-
[Bug] AccessLogFilter accesslog path warnings are garbled and name the wrong accesslog.fixed.path valueForse già presa @CCCLL l’ha presa 19 giorni fa. Aperta
Difficoltà 1/5 1-3 ore Idoneità per principianti 88/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug] dubbo.protocol.triple.max-message-size is only read from OS environment variablesForse già presa @CCCLL l’ha presa 20 giorni fa. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
I maintainer di solito rispondono entro 1 giorno
-
[Bug] StreamUtils treats InputStream.available() as the remaining stream lengthForse già presa Una pull request collegata a questa issue è aperta o già unita. Apertacomponent/need-triage type/need-triage
Difficoltà 2/5 1-3 ore Idoneità per principianti 75/100
apache/dubbo#16510 · 2 commenti ·
I maintainer di solito rispondono entro 1 giorno
Tutte le issue di apache/dubbo
Issue simili
-
Document and enforce pull request review guidelinesForse già presa @dashorst l’ha presa oggi. Aperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 76/100
I maintainer di solito rispondono entro 1 giorno
-
`Time.at(t, in: nil)` returns UTC instead of the local time (or the time zone of `t`), unlike CRubyAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 78/100
I maintainer di solito rispondono entro 1 giorno
-
hermes-queue
Difficoltà 1/5 Meno di un'ora Idoneità per principianti 72/100
chrisalunlloyd2-sudo/mindpalace#349 ·
I maintainer di solito rispondono entro 1 giorno
-
Retry-After parser accepts invalid delay-seconds valuesForse già presa @Dhruvraj-Rana l’ha presa oggi. ApertaBug
Difficoltà 2/5 1-3 ore Idoneità per principianti 82/100
open-telemetry/opentelemetry-java#9018 ·
I maintainer di solito rispondono entro 2 giorni
-
dropwizard-testing: DAOTest.inTransaction leaves the transaction open when an Error is thrownAperta
Difficoltà 2/5 1-3 ore Idoneità per principianti 72/100
dropwizard/dropwizard#11410 ·
I maintainer di solito rispondono entro 1 giorno