diff options
| author | Jonas Gorski | 2026-02-06 19:36:52 +0000 |
|---|---|---|
| committer | Jonas Gorski | 2026-02-07 10:03:18 +0000 |
| commit | a3dcb4adc635132ded9b5e88a049dc784fac36d9 (patch) | |
| tree | b6b3ced0dd6619e31b00409e143505e0386d559f | |
| parent | 2f75344fd0cc848558bf2ea3a94c0bf8b903ff89 (diff) | |
dns: validate reverse dns query name lengths
Validate reverse dns query names length to be able to be valid names:
For IPv6 records there is a fixed name length of 72 (32 nibbles + 31
dots + ".ip6.arpa".
For Ipv4 it's a bit more complicated since the decimal numbers have
variable lenghts, so we need to check a range.
Reject any names that do not fit within those bounds. This also ensures
that the name fits into name_buf{,6}.
Fixes: TOB-OWRT-1
Fixes: 2b28094 ("dns: add support for reverse address mapping queries")
Reported-by: Trail of Bits
Signed-off-by: Jonas Gorski <jonas.gorski@gmail.com>
| -rw-r--r-- | dns.c | 7 | ||||
| -rw-r--r-- | dns.h | 7 |
2 files changed, 14 insertions, 0 deletions
@@ -599,6 +599,10 @@ parse_question(struct interface *iface, struct sockaddr *from, char *name, struc case TYPE_PTR: if (is_reverse_dns_query(name, ".in-addr.arpa")) { + if (strlen(name) < MIN_PTR_NAME_LEN || + strlen(name) > MAX_PTR_NAME_LEN) + break; + host = strstr(name, ".in-addr.arpa"); char name_buf[256]; strcpy(name_buf, name); @@ -608,6 +612,9 @@ parse_question(struct interface *iface, struct sockaddr *from, char *name, struc } if (is_reverse_dns_query(name, ".ip6.arpa")) { + if (strlen(name) != MAX_PTR6_NAME_LEN) + break; + host6 = strstr(name, ".ip6.arpa"); char name_buf6[256]; strcpy(name_buf6, name); @@ -40,6 +40,13 @@ #define MAX_NAME_LEN 8096 #define MAX_DATA_LEN 8096 +/* 4.3.2.1.in-addr.arpa */ +#define MIN_PTR_NAME_LEN 20 +/* 123.123.123.123.in-addr.arpa */ +#define MAX_PTR_NAME_LEN 28 +/* .e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.f.e.d.c.b.a.9.8.7.6.5.4.3.2.1.0.ip6.arpa */ +#define MAX_PTR6_NAME_LEN 72 + #define C_DNS_SD "_services._dns-sd._udp.local" struct dns_header { |