Riot: cbor νŒŒμ„œμ—μ„œ 멈좀

에 λ§Œλ“  2017λ…„ 10μ›” 10일  Β·  5μ½”λ©˜νŠΈ  Β·  좜처: RIOT-OS/RIOT

@PyroPeter λ‚΄κ°€ 가진 cbor νŒŒμ„œ fuzzed AFL을 κ·Έλ ‡κ²Œν•˜λŠ” λ™μ•ˆ λͺ‡ 가지 버그λ₯Ό λ°œκ²¬ν–ˆλ‹€. # 7707 및 # 7706을 μ°Έμ‘°ν•˜μ‹­μ‹œμ˜€. λ˜ν•œ μš°λ¦¬λŠ” cbor ꡬ문 뢄석 μ½”λ“œμ—μ„œ 쀑단을 μœ λ°œν•˜λŠ” μž…λ ₯을 κ½€ 많이 λ°œκ²¬ν–ˆμŠ΅λ‹ˆλ‹€. cbor νŒŒμ„œμ—μ„œ 쀑단을 νŠΈλ¦¬κ±°ν•˜λŠ” μž…λ ₯ 파일이 포함 된 tarball은 http://user.informatik.uni-bremen.de/~tempel/riot-cbor-hangs.tar.xz μ—μ„œ 찾을 수 μžˆμŠ΅λ‹ˆλ‹€.

κ°€μž₯ μœ μš©ν•œ λŒ“κΈ€

BTW : 이것은 트둀처럼 듀릴 수 μžˆμ§€λ§Œ μ†”μ§νžˆμ΄ cbor νŒŒμ„œλ₯Ό μ™„μ „νžˆ μ œκ±°ν•˜λŠ” 것을 κ³ λ €ν•  것을 μ œμ•ˆν•©λ‹ˆλ‹€. ν‘œμ€€μ„ μ œλŒ€λ‘œ κ΅¬ν˜„ν•˜μ§€ λͺ»ν•˜κ³  μ½”λ“œ ν’ˆμ§ˆμ΄ λ”μ°ν•˜λ©° κ°€μž₯ μ€‘μš”ν•œ 것은 λ²„κ·Έλ‘œ 가득 μ°¨ μžˆκ³ μ—†λŠ” 것 κ°™μŠ΅λ‹ˆλ‹€. 이 μž‘μ—…μ„ 적극적으둜 μˆ˜ν–‰ν•˜λŠ” κ΄€λ¦¬μž.

λͺ¨λ“  5 λŒ“κΈ€

BTW : 이것은 트둀처럼 듀릴 수 μžˆμ§€λ§Œ μ†”μ§νžˆμ΄ 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 λ“±κΈ‰