A lock with many keys: Spoofing DNSSEC-signed domains in 8.8.8.8
Google fixed the vulnerability as a result of our report
Chose your color
Frequently visited
Frequently asked questions
The Whois is an easy-to-use tool for checking the availability of a .nl domain name. If the domain name is already taken, you can see who has registered it.
On the page looking up a domain name you will find more information about what a domain name is, how the Whois works and how the privacy of personal data is protected. Alternatively, you can go straight to look for a domain name via the Whois.
To get your domain name transferred, you need the token (unique ID number) for your domain name. Your existing registrar has the token and is obliged to give it to you within five days, if you ask for it. The procedure for changing your registrar is described on the page transferring your domain name.
To update the contact details associated with your domain name, you need to contact your registrar. Read more about updating contact details.
When a domain name is cancelled, we aren't told the reason, so we can't tell you. You'll need to ask your registrar. The advantage of quarantine is that, if a name's cancelled by mistake, you can always get it back.
One common reason is that the contract between you and your registrar says you've got to renew the registration every year. If you haven't set up automatic renewal and you don't renew manually, the registration will expire.
Wanneer je een klacht hebt over of een geschil met je registrar dan zijn er verschillende mogelijkheden om tot een oplossing te komen. Hierover lees je meer op pagina klacht over registrar. SIDN heeft geen formele klachtenprocedure voor het behandelen van een klacht over jouw registrar.
Would you like to be able to register domain names for customers or for your own organisation by dealing directly with SIDN? If so, you can become a .nl registrar. Read more about the conditions and how to apply for registrar status on the page becoming a registrar.
Google fixed the vulnerability as a result of our report
We discovered that, until recently, Google Public DNS was theoretically vulnerable to a DNS cache poisoning attack on DNSSEC-signed domain names. A bug in the code responsible for validating DNSSEC-signed records made it technically possible to trick Google's popular DNS resolving service into accepting spoofed DNS resource records for DNSSEC-signed domain names. That would have effectively enabled downgrade attacks, circumventing DNSSEC protection for potentially millions of users. We notified Google on 12 January, and they fully deployed a fix on 23 February. Google is confident that the vulnerability has not been exploited, because they have various general protections against cache poisoning. It is important to stress that what we discovered was not a vulnerability in the DNSSEC protocol itself, but a vulnerability in a specific implementation of DNSSEC. To the best of our knowledge, only the Google Public DNS resolvers were affected.
The Domain Name System (DNS) was not designed with security in mind. That was demonstrated by the noteworthy Kaminsky attack in 2008. Back then, Dan Kaminsky demonstrated that an off-path attacker could insert malicious responses into the cache of a recursive resolver. Such an attack can have a severe impact. For example, every client of a recursive resolver could be directed to a malicious domain name. In response to Kaminsky's finding, the deployment of DNS Security Extensions (DNSSEC) gained momentum. With DNSSEC, domain name operators can cryptographically sign the contents of their DNS zones. A recursive resolver can in turn validate the cryptographic signatures, enabling it to detect cache poisoning attacks and protect users against them. Today, many DNS operators sign their domain names, and an increasing number of recursive resolvers validate DNSSEC records, thereby protecting millions of users against cache poisoning attacks. The technology is widely used in .nl, see for instance https://stats.sidnlabs.nl/en/dnssec.html#validated%20queries. Google's Public DNS service, better known by its IPv4 address 8.8.8.8, also validates DNSSEC records. Currently, 8.8.8.8 is responsible for more than 15% of all DNS queries received by the .nl name servers.
We found an attack vector with which an adversary could have theoretically tricked Google's resolvers into accepting poisoned DNS responses regarding DNSSEC-signed domain names. If an attacker had succeeded in poisoning Google's resolver cache with unsigned DNS responses, they could have then poisoned signed domain names as well. The actual flaw lay in the way Google Public DNS handled unknown DNSSEC keys. Basically, offering any cryptographic key would have convinced Google Public DNS to accept a fake response.
Under normal circumstances, before validating a signature, a recursive resolver must be sure that it was created with a valid key. Otherwise, the signature must be considered 'bogus', meaning that the response cannot be trusted. The resolver should then return a SERVFAIL error code to the querying client. The way that a resolver should validate DNSSEC records is illustrated below using our own domain name sidnlabs.nl and the DNSSEC debugging tool DNSViz (see Figure 1). In the example, the records for sidnlabs.nl are signed with a Zone Signing Key (ZSK) with key ID 20853, which in turn is signed with the Key Signing Key (KSK) with ID 52720. The latter key is linked to the .nl zone through the DS record, building a chain of trust. After receiving the AAAA record for sidnlabs.nl and the corresponding signatures, a validating resolver fetches the keyset containing the ZSK and KSK.
Figure 1: The DNSSEC-signed domain name sidnlabs.nl, as seen in DNSViz. The resolver should validate the keyset it receives, i.e. check whether it is correct. If it is, then the resolver proceeds to validate the AAAA record. It uses the key ID specified in the signature on the AAAA record to identify the corresponding key. If it finds the key is valid, the resolver uses the key to validate the signature of the AAAA record and returns the record to the client.
Figure 2: Misconfigured domain name servfail.nl, as seen in DNSViz. The resource records are signed with a non-existent Zone Signing Key.
Google Public DNS was vulnerable in the last stage of the validation process. We discovered the vulnerability more or less by accident. We maintain the domain name servfail.nl, which is deliberately misconfigured for DNSSEC for testing and debugging purposes. DNSSEC can be misconfigured in many ways. Originally, servfail.nl had expired signatures. However, for reasons outside the scope of this article, we decided to change the configuration, so that servfail.nl's AAAA record is now signed with an unknown key. Figure 2 shows the current configuration of servfail.nl, where its records are signed with the key with ID 45918. However, if you look closely, the keyset for servfail.nl consists of only the KSK with ID 15438 and the ZSK with ID 45916. As DNSViz highlights in the figure, the misconfiguration results in servfail.nl's other records being regarded as bogus (as indicated by the red frames), meaning that they cannot be validated. A validating resolver looking up the AAAA record for servfail.nl won't be able to find and validate the ZSK with ID 45918 and should therefore return the error code SERVFAIL to its clients. That is what resolvers with correctly implemented DNSSEC validation do: If we lookup the AAAA record with a validating resolver such as Quad9 it returns the error code SERVFAIL, as shown in Figure 3.
Figure 3: DNS query regarding the AAAA record for servfail.nl, sent using the Quad9 validating resolver.
Unfortunately, that is not how the Google Public DNS resolvers behaved. After querying the AAAA record for servfail.nl using 8.8.8.8, we received the actual AAAA record (see Figure 4) instead of the error code.
Figure 4: DNS query regarding the AAAA record for servfail.nl, sent using the Google Public DNS validating resolvers.
Note also that 8.8.8.8 did not return the AD flag set, indicating that the response had not been authenticated using DNSSEC.
Consequently, not only would Google's resolvers have failed to notice any misconfiguration where a record was signed with an unknown key, but the resolvers would have been vulnerable to downgrade attacks. An attacker, able to insert spoofed DNS record into Google's Public DNS cache, could also have even spoofed DNSSEC-signed records, simply by pretending that the signatures on the spoofed records were created using keys that don't exist.
The potential impact of spoofing DNSSEC-signed records would have been more severe than spoofing unsigned records. A response relating to an unsigned record cannot, be definition, be validated and should therefore always be treated as untrustworthy. By contrast, if a validating resolver receives a record for a signed domain name, it assumes that the answer is correct and that the information provided is trustworthy. The vulnerability we discovered undermined that trustworthiness.
SAD DNS: new DNS cache poisoning technique emerges New Domain Name System vulnerability revealedThe practical impact of the vulnerability is harder to assess. Since the Kaminsky attack, several other ways of increasing the chance of an attacker poisoning a resolver's cache have been published [1, 2]. Nevertheless, it is not clear to us how easy it was to insert spoofed responses into the Google Public DNS caches. Also, for ethical reasons, we did not actively attempt to exploit the vulnerability. Google Public DNS uses an elaborate caching architecture, likely making cache poisoning harder than with small-scale recursive resolvers.
We notified Google about the bug on 12 January this year, and they deployed fixes to all their instances by 23 February. Google's resolvers now also return SERVFAIL for servfail.nl. Google themselves are confident that their various protections make it extremely unlikely that a cache poisoning attack would succeed. We also wanted to understand whether other resolver implementations besides Google Public DNS might have been vulnerable to the attack. We accordingly reached out to the developers of the DNS software packages BIND, Unbound, Knot Resolver and PowerDNS Recursor. They checked their software and found that none of their resolvers were vulnerable to the attack method described. Finally, we carried out a large-scale DNS measurement, using 10,000 probes in the RIPE Atlas measurement network. We wanted to see whether we could find resolvers that returned the AAAA record of servfail.nl even though they were validating DNSSEC. Like the software developers, we could not find clear evidence of resolvers that could be vulnerable to our attack, other than the Google Public DNS resolvers.
While DNSSEC is crucial for the security of the DNS, it also remains the DNS's most complicated extension. This incident is still further evidence of that. Another outcome was that other developers of recursive resolvers ran into a few non-critical corner cases after we had modified servfail.nl, which were unrelated to the vulnerability at Google. As with other security protocols, we recommend that developers and operators rely on existing, well tested implementations of DNSSEC such as the ldns libray or one of the open-source recursive resolvers rather than 'home-grown' implementations.
For reporting this bug, we received $5,000 from Google's bug bounty programme. We will donate the bounty to charity. We thank Google for their open communication and for reviewing this article.
Moment | Event |
---|---|
Early January 2022 | We identified odd behaviour involving our newly configured test domain servfail.nl and Google Public DNS. We ran tests to better understand the issue. |
12 January 2022 | We submitted the issue to Google's Issue Tracker. |
13 January 2022 | Google confirmed the issue. |
31 January 2022 | For completeness, we also submitted the issue as a security vulnerability to Google. |
23 February 2022 | Google fixed the issue and rolled out the fix. |
11 March2022 | Public disclosure through this blog, with approval of Google. |
Article by:
Share this article