From: Otto Moerbeek Date: Tue, 9 Apr 2024 09:16:23 +0000 (+0200) Subject: rec: backport CVE-2024-25583 to rel/rec-4.9.5-branch X-Git-Tag: rec-4.9.5^0 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=3d16f2f49c22326e5a72f074c2a1f1b45769cb3f;p=thirdparty%2Fpdns.git rec: backport CVE-2024-25583 to rel/rec-4.9.5-branch A name can be present already when building the cname chain. --- diff --git a/pdns/recursordist/syncres.cc b/pdns/recursordist/syncres.cc index 3eac692166..812e367321 100644 --- a/pdns/recursordist/syncres.cc +++ b/pdns/recursordist/syncres.cc @@ -4345,7 +4345,10 @@ RCode::rcodes_ SyncRes::updateCacheFromRecords(unsigned int depth, const string& break; } initial = cnameIt->second; - wildcardCandidates.emplace(initial, false); + if (!wildcardCandidates.emplace(initial, false).second) { + // CNAME Loop + break; + } } } diff --git a/pdns/recursordist/test-syncres_cc1.cc b/pdns/recursordist/test-syncres_cc1.cc index 3676524d3c..fa103c1863 100644 --- a/pdns/recursordist/test-syncres_cc1.cc +++ b/pdns/recursordist/test-syncres_cc1.cc @@ -1629,6 +1629,54 @@ BOOST_AUTO_TEST_CASE(test_cname_loop) } } +BOOST_AUTO_TEST_CASE(test_cname_loop_forwarder) +{ + std::unique_ptr resolver; + initSR(resolver); + + primeHints(); + + size_t count = 0; + const DNSName target("cname.powerdns.com."); + const DNSName cname1("cname1.cname.powerdns.com."); + const DNSName cname2("cname2.cname.powerdns.com."); + + SyncRes::AuthDomain ad; + const std::vector forwardedNSs{ComboAddress("192.0.2.42:53")}; + ad.d_rdForward = true; + ad.d_servers = forwardedNSs; + (*SyncRes::t_sstorage.domainmap)[target] = ad; + + resolver->setAsyncCallback([&](const ComboAddress& address, const DNSName& domain, int /* type */, bool /* doTCP */, bool /* sendRDQuery */, int /* EDNS0Level */, struct timeval* /* now */, boost::optional& /* srcmask */, boost::optional /* context */, LWResult* res, bool* /* chained */) { + count++; + + if (isRootServer(address)) { + + setLWResult(res, 0, false, false, true); + addRecordToLW(res, domain, QType::NS, "a.gtld-servers.net.", DNSResourceRecord::AUTHORITY, 172800); + addRecordToLW(res, "a.gtld-servers.net.", QType::A, "192.0.2.1", DNSResourceRecord::ADDITIONAL, 3600); + return LWResult::Result::Success; + } + if (address == ComboAddress("192.0.2.42:53")) { + + if (domain == target) { + setLWResult(res, 0, true, false, false); + addRecordToLW(res, domain, QType::CNAME, cname1.toString()); + addRecordToLW(res, cname1, QType::CNAME, cname2.toString()); + addRecordToLW(res, cname2, QType::CNAME, domain.toString()); + return LWResult::Result::Success; + } + + return LWResult::Result::Success; + } + + return LWResult::Result::Timeout; + }); + + vector ret; + BOOST_REQUIRE_THROW(resolver->beginResolve(target, QType(QType::A), QClass::IN, ret), ImmediateServFailException); +} + BOOST_AUTO_TEST_CASE(test_cname_long_loop) { std::unique_ptr sr;