@PyroPeter et moi avons brouillé l'analyseur cbor avec afl et avons trouvé quelques bogues en le faisant. Voir # 7707 et # 7706. De plus, nous avons trouvé un certain nombre d'entrées qui ont déclenché des blocages dans le code d'analyse cbor. Une archive contenant les fichiers d'entrée qui déclenchent se bloque dans l'analyseur cbor peut être trouvée ici: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz
BTW: Cela peut ressembler à un troll, mais je vous suggère honnêtement d'envisager de supprimer complètement cet analyseur cbor: il n'implémente pas correctement la norme, la qualité du code est horrible et, surtout, il est plein de bogues et ne semble pas avoir un responsable qui y travaille activement.
@nmeum , pouvez-vous élaborer un peu plus sur les problèmes de qualité du code et les problèmes de conformité RFC?
Concernant la conformité RFC: L'analyseur syntaxique n'analyse pas correctement la majorité des
Voici un patch corrigeant les blocages (ou au moins certains d'entre eux) dans l'analyseur 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;
Le problème semble avoir été que l'analyseur n'a pas vérifié les erreurs après avoir analysé les valeurs de clé dans les cartes. Ainsi, même si une clé n'était pas trouvée, elle invoquait toujours cbor_stream_decode_at
pour trouver une valeur pour une clé non existante.
Je ne sais pas si le patch est optimal mais au moins il ne se bloque plus…
J'ai collecté tous les problèmes liés à cbor
dans # 7800. Voyons comment continuer avec ce module.
Commentaire le plus utile
BTW: Cela peut ressembler à un troll, mais je vous suggère honnêtement d'envisager de supprimer complètement cet analyseur cbor: il n'implémente pas correctement la norme, la qualité du code est horrible et, surtout, il est plein de bogues et ne semble pas avoir un responsable qui y travaille activement.