@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
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.
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.