Riot: hang di parser cbor

Dibuat pada 10 Okt 2017  ·  5Komentar  ·  Sumber: RIOT-OS/RIOT

@PyroPeter dan saya mengaburkan parser cbor dengan afl dan menemukan beberapa bug saat melakukannya. Lihat # 7707 dan # 7706. Selain itu kami menemukan beberapa masukan yang memicu hang di kode parsing cbor. Tarball berisi file masukan yang memicu hang di parser cbor dapat ditemukan di sini: http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

bug

Komentar yang paling membantu

BTW: Ini mungkin terdengar seperti troll tetapi saya dengan jujur ​​menyarankan agar Anda mempertimbangkan untuk menghapus pengurai cbor ini sepenuhnya: Ini tidak menerapkan standar dengan benar, kualitas kodenya mengerikan dan yang terpenting penuh dengan bug dan sepertinya tidak ada seorang pengelola yang secara aktif mengerjakan ini.

Semua 5 komentar

BTW: Ini mungkin terdengar seperti troll tetapi saya dengan jujur ​​menyarankan agar Anda mempertimbangkan untuk menghapus pengurai cbor ini sepenuhnya: Ini tidak menerapkan standar dengan benar, kualitas kodenya mengerikan dan yang terpenting penuh dengan bug dan sepertinya tidak ada seorang pengelola yang secara aktif mengerjakan ini.

@nmeum , dapatkah Anda menjelaskan sedikit lebih banyak tentang masalah kualitas kode dan masalah dengan kepatuhan RFC?

Mengenai kepatuhan RFC: Pengurai tidak mengurai dengan benar sebagian besar vektor pengujian cbor . Mengenai kualitas kode: Kami menemukan beberapa masalah hanya dengan melakukan fuzzing dan memeriksa kode untuk memperbaikinya, hanya saja tampaknya tidak terlalu terpoles.

Berikut adalah patch yang memperbaiki hang (atau setidaknya beberapa di antaranya) di parser 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;

Masalahnya tampaknya parser tidak memeriksa kesalahan setelah mengurai nilai kunci di peta. Jadi, meskipun kunci tidak ditemukan, ia masih memanggil cbor_stream_decode_at untuk menemukan nilai untuk kunci yang tidak ada.

Tidak yakin apakah tambalannya optimal tetapi setidaknya tambalan itu tidak hang lagi…

Saya telah mengumpulkan semua masalah terkait cbor di # 7800. Mari kita bahas di sana bagaimana melanjutkan dengan modul itu.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat

Masalah terkait

l3nko picture l3nko  ·  7Komentar

jia200x picture jia200x  ·  5Komentar

silkeh picture silkeh  ·  5Komentar

kaspar030 picture kaspar030  ·  3Komentar

kaspar030 picture kaspar030  ·  6Komentar