Riot: 挂在cbor解析器中

创建于 2017-10-10  ·  5评论  ·  资料来源: RIOT-OS/RIOT

@PyroPeter我模糊化与CBOR解析器AFL ,发现了一些错误,而这样做。 参见#7707和#7706。 另外,我们发现很多输入触发了cbor解析代码的挂起。 可以在以下位置找到包含触发cbor解析器挂起的输入文件的tarball: http ://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz

最有用的评论

顺便说一句:这听起来像是一个巨魔,但老实说,我建议您考虑完全删除此cbor解析器:它没有正确实现标准,代码质量太差了,最重要的是,它充满了错误并且似乎没有积极从事此工作的维护人员。

所有5条评论

顺便说一句:这听起来像是一个巨魔,但老实说,我建议您考虑完全删除此cbor解析器:它没有正确实现标准,代码质量太差了,最重要的是,它充满了错误并且似乎没有积极从事此工作的维护人员。

@nmeum ,您能否详细说明一下代码质量问题和RFC符合性问题?

关于RFC合规性:解析器无法正确解析大多数cbor testvectors 。 关于代码质量:我们只是通过模糊处理代码来解决这些问题,从而发现了多个问题,但看起来似乎还不够完善。

这是修复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 等级

相关问题

romainvause picture romainvause  ·  3评论

nikosft picture nikosft  ·  6评论

jcarrano picture jcarrano  ·  7评论

jue89 picture jue89  ·  5评论

silkeh picture silkeh  ·  5评论