DictionaryEncoder.decode accepts out-of-range dictionary indices

Offen Anfängerfreundlich
#1,261 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

Bewertung

Schwierigkeit
2/5
Geschätzter Aufwand
1-3 Stunden
Anfängerfreundlichkeit
74/100
Issue-Typ
Bug
Klarheit
Klar beschrieben
Aktivitätsstatus
Aktiv
Tech-Stack
java
Bereich
security

Rechercherichtung

Beginne bei DictionaryEncoder.retrieveIndexVector und verfolge seine Verwendung von DictionaryEncoder.decode, ListSubfieldEncoder.decodeListSubField und StructSubfieldEncoder.decode aus. Überprüfe, dass negative Indizes und Indizes, die dictionaryCount entsprechen, vor transfer.copyValueSafe abgewiesen werden; als erledigt gilt dies, wenn gezielt erstellte Dictionary-Indizes die Dictionary-Kopie nicht mit einer ungültigen Position erreichen können.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Beschreibung

DictionaryEncoder.retrieveIndexVector guards each index from the index vector with indexAsInt > dictionaryCount before transfer.copyValueSafe(indexAsInt, i). Valid indices are 0..dictionaryCount-1, so the check is off by one: an index equal to dictionaryCount is accepted and reads one slot past the dictionary vector, and a negative index (a signed index type with the high bit set) is not rejected either and also reaches copyValueSafe. The index vector is decoded from an IPC/C-data payload, so a crafted dictionary-encoded batch yields an out-of-bounds read of the dictionary vector, exposing adjacent off-heap memory when bounds checking is disabled via arrow.enable_unsafe_memory_access.

The same helper backs DictionaryEncoder.decode, ListSubfieldEncoder.decodeListSubField and StructSubfieldEncoder.decode.

The bound should be indexAsInt < 0 || indexAsInt >= dictionaryCount.

Vorherrschende Sprache
Java
Sterne
95
Forks
154
Ø Merge
2 T. 16 Std.
Gemergte PRs (30 T.)
9

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lesen Sie das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreiben Sie ins Issue, dass Sie es übernehmen — das erspart doppelte Arbeit.
  3. Forken Sie das Repository und arbeiten Sie in einem Branch.
  4. Öffnen Sie einen Pull Request, der die Issue-Nummer nennt.

Mehr aus apache/arrow-java

Alle Issues in apache/arrow-java

Ähnliche Issues

Weitere Issues zu Java

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.