Riot: cuelga en cbor parser

Creado en 10 oct. 2017  ·  5Comentarios  ·  Fuente: RIOT-OS/RIOT

@PyroPeter y yo confundimos el analizador cbor con afl y encontramos algunos errores al hacerlo. Vea # 7707 y # 7706. Además, encontramos bastantes entradas que provocaron bloqueos en el código de análisis cbor. Puede encontrar un tarball que contiene archivos de entrada que activan bloqueos en el analizador cbor aquí: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

bug

Comentario más útil

Por cierto: esto puede sonar como un troll, pero honestamente sugeriría que considere eliminar este analizador cbor por completo: no implementa correctamente el estándar, la calidad del código es horrible y, lo más importante, está lleno de errores y no parece tener un mantenedor que está trabajando activamente en esto.

Todos 5 comentarios

Por cierto: esto puede sonar como un troll, pero honestamente sugeriría que considere eliminar este analizador cbor por completo: no implementa correctamente el estándar, la calidad del código es horrible y, lo más importante, está lleno de errores y no parece tener un mantenedor que está trabajando activamente en esto.

@nmeum , ¿puede desarrollar un poco más sobre los problemas de calidad del código y los problemas con el cumplimiento de RFC?

Con respecto al cumplimiento de RFC: el analizador no analiza correctamente la mayoría de los vectores de

Aquí hay un parche que corrige los bloqueos (o al menos algunos de ellos) en el analizador cbor:

diff --git a/cbor-afl/cbor.c b/cbor-afl/cbor.c
index fa1aa27..c97457e 100644
--- a/cbor-afl/cbor.c
+++ b/cbor-afl/cbor.c
@@ -989,12 +989,17 @@ static size_t cbor_stream_decode_at(cbor_stream_t *stream, size_t offset, int in

             while (is_indefinite ? !cbor_at_break(stream, offset) : i < map_length) {
                 size_t key_read_bytes, value_read_bytes;
+
                 offset += key_read_bytes = cbor_stream_decode_at(stream, offset, indent + 1); /* key */
-                offset += value_read_bytes = cbor_stream_decode_at(stream, offset, indent + 2); /* value */
+                if (key_read_bytes == 0) {
+                    DEBUG("Failed to read key at position %d\n", i);
+                    return 0;
+                }

-                if (key_read_bytes == 0 || value_read_bytes == 0) {
-                    DEBUG("Failed to read key-value pair at position %d\n", i);
-                    break;
+                offset += value_read_bytes = cbor_stream_decode_at(stream, offset, indent + 2); /* value */
+                if (value_read_bytes == 0) {
+                    DEBUG("Failed to read value at position %d\n", i);
+                    return 0;
                 }

                 read_bytes += key_read_bytes + value_read_bytes;

El problema parece haber sido que el analizador no verificó errores después de analizar los valores clave en los mapas. Entonces, incluso si no se encontró una clave, todavía se invocaba cbor_stream_decode_at para encontrar un valor para una clave no existente.

No estoy seguro de si el parche es óptimo, pero al menos ya no se cuelga ...

He recopilado todos los problemas relacionados con cbor en # 7800. Analicemos allí cómo continuar con ese módulo.

¿Fue útil esta página
0 / 5 - 0 calificaciones