Skip to content

Commit 7cf97fd

Browse files
committed
Make asmap Interpreter errors fatal and fuzz test it
1 parent c81aefc commit 7cf97fd

File tree

2 files changed

+34
-13
lines changed

2 files changed

+34
-13
lines changed

src/test/fuzz/asmap.cpp

Lines changed: 33 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3,26 +3,47 @@
33
// file COPYING or http://www.opensource.org/licenses/mit-license.php.
44

55
#include <netaddress.h>
6-
#include <test/fuzz/FuzzedDataProvider.h>
76
#include <test/fuzz/fuzz.h>
87

98
#include <cstdint>
109
#include <vector>
1110

11+
//! asmap code that consumes nothing
12+
static const std::vector<bool> IPV6_PREFIX_ASMAP = {};
13+
14+
//! asmap code that consumes the 96 prefix bits of ::ffff:0/96 (IPv4-in-IPv6 map)
15+
static const std::vector<bool> IPV4_PREFIX_ASMAP = {
16+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
17+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
18+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
19+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
20+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
21+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
22+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
23+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
24+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
25+
true, true, false, true, true, true, true, true, true, true, false, false, false, false, false, false, false, false, // Match 0x00
26+
true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true, // Match 0xFF
27+
true, true, false, true, true, true, true, true, true, true, true, true, true, true, true, true, true, true // Match 0xFF
28+
};
29+
1230
void test_one_input(const std::vector<uint8_t>& buffer)
1331
{
14-
FuzzedDataProvider fuzzed_data_provider(buffer.data(), buffer.size());
15-
const Network network = fuzzed_data_provider.PickValueInArray({NET_IPV4, NET_IPV6});
16-
if (fuzzed_data_provider.remaining_bytes() < 16) {
17-
return;
18-
}
19-
CNetAddr net_addr;
20-
net_addr.SetRaw(network, fuzzed_data_provider.ConsumeBytes<uint8_t>(16).data());
21-
std::vector<bool> asmap;
22-
for (const char cur_byte : fuzzed_data_provider.ConsumeRemainingBytes<char>()) {
23-
for (int bit = 0; bit < 8; ++bit) {
24-
asmap.push_back((cur_byte >> bit) & 1);
32+
// Encoding: [7 bits: asmap size] [1 bit: ipv6?] [3-130 bytes: asmap] [4 or 16 bytes: addr]
33+
if (buffer.size() < 1 + 3 + 4) return;
34+
int asmap_size = 3 + (buffer[0] & 127);
35+
bool ipv6 = buffer[0] & 128;
36+
int addr_size = ipv6 ? 16 : 4;
37+
if (buffer.size() < size_t(1 + asmap_size + addr_size)) return;
38+
std::vector<bool> asmap = ipv6 ? IPV6_PREFIX_ASMAP : IPV4_PREFIX_ASMAP;
39+
asmap.reserve(asmap.size() + 8 * asmap_size);
40+
for (int i = 0; i < asmap_size; ++i) {
41+
for (int j = 0; j < 8; ++j) {
42+
asmap.push_back((buffer[1 + i] >> j) & 1);
2543
}
2644
}
45+
if (!SanityCheckASMap(asmap)) return;
46+
CNetAddr net_addr;
47+
net_addr.SetRaw(ipv6 ? NET_IPV6 : NET_IPV4, buffer.data() + 1 + asmap_size);
2748
(void)net_addr.GetMappedAS(asmap);
2849
}

src/util/asmap.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,7 +116,7 @@ uint32_t Interpret(const std::vector<bool> &asmap, const std::vector<bool> &ip)
116116
break; // Instruction straddles EOF
117117
}
118118
}
119-
// Reached EOF without RETURN, or aborted (see any of the breaks above).
119+
assert(false); // Reached EOF without RETURN, or aborted (see any of the breaks above) - should have been caught by SanityCheckASMap below
120120
return 0; // 0 is not a valid ASN
121121
}
122122

0 commit comments

Comments
 (0)