Riot: trava no analisador cbor

Criado em 10 out. 2017  ·  5Comentários  ·  Fonte: RIOT-OS/RIOT

@PyroPeter e eu misturamos o analisador cbor com afl e encontramos alguns bugs ao fazer isso. Consulte # 7707 e # 7706. Além disso, encontramos algumas entradas que acionaram travamentos no código de análise cbor. Um tarball contendo arquivos de entrada que acionam travamentos no analisador cbor pode ser encontrado aqui: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

bug

Comentários muito úteis

BTW: Isso pode soar como um troll, mas eu honestamente sugiro que você considere remover este analisador cbor inteiramente: ele não implementa o padrão corretamente, a qualidade do código é horrível e o mais importante, está cheio de bugs e não parece ter um mantenedor que está trabalhando ativamente nisso.

Todos 5 comentários

BTW: Isso pode soar como um troll, mas eu honestamente sugiro que você considere remover este analisador cbor inteiramente: ele não implementa o padrão corretamente, a qualidade do código é horrível e o mais importante, está cheio de bugs e não parece ter um mantenedor que está trabalhando ativamente nisso.

@nmeum , você pode elaborar um pouco mais sobre as questões de qualidade de código e problemas com conformidade com RFC?

Em relação à conformidade com RFC: O analisador não analisa corretamente a maioria dos vetores de teste cbor . Com relação à qualidade do código: Encontramos vários problemas apenas por difundir e examinar o código a fim de consertá-los, simplesmente não parecia muito polido.

Aqui está um patch que corrige as travas (ou pelo menos algumas delas) no analisador 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;

O problema parece ter sido que o analisador não verificou erros após analisar os valores-chave nos mapas. Portanto, mesmo que uma chave não seja encontrada, ela ainda invoca cbor_stream_decode_at para encontrar um valor para uma chave inexistente.

Não tenho certeza se o patch é ideal, mas pelo menos ele não trava mais ...

Eu coletei todos os cbor problemas relacionados em # 7800. Vamos discutir lá como continuar com esse módulo.

Esta página foi útil?
0 / 5 - 0 avaliações

Questões relacionadas

jcarrano picture jcarrano  ·  7Comentários

romainvause picture romainvause  ·  3Comentários

jia200x picture jia200x  ·  5Comentários

kaspar030 picture kaspar030  ·  6Comentários

sinkarharshad picture sinkarharshad  ·  7Comentários