Repository navigation
dns.resolveSoa returns EBADRESP if hostname has a CNAME record #34612
Description
Activity
- addedconfirmed-bugIssues and PRs for confirmed bugs.Issues and PRs for confirmed bugs.dnsIssues and PRs related to the dns subsystem.Issues and PRs related to the dns subsystem.
on Aug 4, 2020 Thanks for the bug report. At first glance this appears to be a bug in our response parsing logic.
Lines 1078 to 1080 in 74df749
if (ptr + temp_len + NS_QFIXEDSZ > buf + len) { return ARES_EBADRESP; } @addaleax @XadillaX Maybe not the root cause but those bounds checks look like UB to me.
Pointers in C and C++ are allowed to point one element past the end of an array and no more. The check should look like this:
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc index 73a0ac6b33..778e0821d7 100644 --- a/src/cares_wrap.cc +++ b/src/cares_wrap.cc @@ -1075,7 +1075,7 @@ int ParseSoaReply(Environment* env, return status == ARES_EBADNAME ? ARES_EBADRESP : status; } - if (ptr + temp_len + NS_QFIXEDSZ > buf + len) { + if (temp_len > LONG_MAX - NS_QFIXEDSZ || temp_len + NS_QFIXEDSZ > len) { return ARES_EBADRESP; } ptr += temp_len + NS_QFIXEDSZ;
Reacted by Khaidi Chu@bnoordhuis I'd like to work on this.
@bnoordhuis -
I tried tracing down function calls and I don't think the problem exists inparseSoaReply. Instead, theParsefunction ofQuerySoaWrapis invoked.This
Parsefunction handles the parsing when theares_queryinvokes its callback with a success status.
In the case when SOA response doesn't exist, theares_queryfunction invokes the callback with a success status instead of ENODATA.At this point, I think the problem exists in the
ares_querylibrary function itself.Also while working on this, I discovered a bug related to free call on garbage pointer. #35502
v20.11.0 the bug is still there
This issue (if so) comes indeed from this condition in
caresand should be reported upstream in case they want to change it. Should we keep this open or just close it?- addedcaresIssues and PRs related to the c-ares dependency or the cares_wrap binding.Issues and PRs related to the c-ares dependency or the cares_wrap binding.
on Jan 27, 2025
What steps will reproduce the bug?
Actual Results
hostname: support.microsoft.com
CNAME result: [ 'ev.support.microsoft.com.edgekey.net' ]
SOA result: querySoa EBADRESP support.microsoft.com
Expected Results
hostname: support.microsoft.com
CNAME result: [ 'ev.support.microsoft.com.edgekey.net' ]
SOA result: querySoa ENODATA support.microsoft.com
Additional information
This seems to happen for any hostname with a CNAME record.
Another example:
hostname: store.gocomics.com
CNAME result: [ 'gocomicsstore.wpengine.com' ]
SOA result: querySoa EBADRESP store.gocomics.com
I would expect to get an 'ENODATA' instead of 'EBADRESP', as with the other resolveXXX() calls.
For a hostname with an SOA record but no CNAME, you get:
hostname: microsoft.com
CNAME result: queryCname ENODATA microsoft.com
SOA result: {"nsname":"ns1-205.azure-dns.com","hostmaster":"azuredns-
hostmaster.microsoft.com","serial":1,"refresh":3600,"retry":300,"expire":2419200,"minttl":300}