Riot: cborパーサーにハングアップします

作成日 2017年10月10日  ·  5コメント  ·  ソース: RIOT-OS/RIOT

@PyroPeterと私はaflでファジングし、そうしている間にいくつかのバグを見つけました。 #7707および#7706を参照してください。 さらに、cbor解析コードでハングを引き起こすかなりの数の入力が見つかりました。 cborパーサーでハングをトリガーする入力ファイルを含むtarballは、次の場所にあります: http

bug

最も参考になるコメント

ところで:これは荒らしのように聞こえるかもしれませんが、正直に言って、このcborパーサーを完全に削除することを検討することをお勧めします:標準が適切に実装されておらず、コード品質がひどく、最も重要なことに、バグがたくさんあり、これに積極的に取り組んでいるメンテナ。

全てのコメント5件

ところで:これは荒らしのように聞こえるかもしれませんが、正直に言って、このcborパーサーを完全に削除することを検討することをお勧めします:標準が適切に実装されておらず、コード品質がひどく、最も重要なことに、バグがたくさんあり、これに積極的に取り組んでいるメンテナ。

@nmeum 、コード品質の問題とRFCコンプライアンスの問題についてもう少し詳しく説明していただけますか?

RFC準拠について:パーサーは、 cborテストベクトルの大部分を適切に解析しません。 コードの品質について:コードをファジングして修正するだけで複数の問題が見つかりましたが、あまり洗練されていないようでした。

これは、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;

問題は、パーサーがマップ内のキー値を解析した後にエラーをチェックしなかったことであるようです。 したがって、キーが見つからなかった場合でも、存在しないキーの値を見つけるためにcbor_stream_decode_atが呼び出されます。

パッチが最適かどうかはわかりませんが、少なくとももうハングしません…

#7800ですべてのcbor関連の問題を収集しました。 そこで、そのモジュールを続行する方法について説明しましょう。

このページは役に立ちましたか?
0 / 5 - 0 評価