Dan Kaminsky and the Summer the Internet Quietly Rewrote DNS
On 8 July 2008, almost every DNS vendor on earth released a patch on the same day. Microsoft, Cisco, ISC, Sun, Red Hat — products that competed with each other, shipping a coordinated fix for a flaw none of them would describe. The advisories were vague on purpose. The security community was annoyed about it.
The flaw was Dan Kaminsky's, and it let an attacker take over any domain name on the internet.
What was actually broken
DNS cache poisoning was not new in 2008. The idea — answer a resolver's query before the real nameserver does, and it caches your lie — was understood, and it was understood to be hard in practice for two reasons.
First, you had to guess a 16-bit transaction ID: one chance in 65,536. Second, and more importantly, you only got one attempt. If you lost the race, the resolver cached the real answer and you had to wait out the TTL — hours, typically — before it would ask again. A slow guessing game against a counter that resets once a day is not a practical attack.
Kaminsky's insight was to stop attacking the record he wanted.
Instead of racing to poison www.example.com, ask the resolver for aaaa1.example.com. It does not exist, so nothing is cached, so the resolver has to ask upstream — and you get a race. Lose it? Ask for aaaa2.example.com. The TTL defence evaporates, because you are never querying the same name twice. One attempt per day became as many attempts per second as you could send.
And the payload was not the answer. It was the referral: alongside the response for the nonsense subdomain, you supply authority records claiming that the entire zone — example.com — is served by your nameserver. Win one race and you do not own one hostname. You own the domain, every name under it, until the cache clears.
The whole thing works in seconds. That was the part that made people go quiet.
The five months before the patch
What Kaminsky did next is the reason this is remembered as more than a good bug.
A flaw in the DNS protocol, rather than in one implementation, cannot be fixed by one vendor. If any major resolver stays vulnerable, attackers use it. And a published protocol flaw with no available patch is an unpatchable window for everybody at once.
So he did not publish. He took it to the vendors, and in March 2008 they met at Microsoft's campus — competitors, in a room, agreeing to build the same fix and release it together. The synchronised release came on 8 July.
He then asked researchers to hold off on analysis for thirty days so patching could get ahead of exploitation, and offered to brief anyone who thought they had worked it out privately. Some of the community found this theatrical. The details leaked anyway on 21 July, via a blog post that was taken down within minutes and mirrored within minutes of that, and working exploit code followed almost immediately. He presented the full picture at Black Hat that August.
Judge the outcome rather than the style: the patch was already on a large share of the internet's resolvers when the exploit arrived. That is the entire goal of coordinated disclosure, and this is the case people still point at when arguing it can work at scale.
The fix nobody was happy with
The remedy was source port randomisation. Instead of querying from a predictable UDP port, resolvers pick a random one, so an attacker must guess the transaction ID and the port — roughly 32 bits instead of 16.
Everyone involved knew this was arithmetic, not a solution. It multiplies the work by about 65,000; it does not make forgery impossible. Faster networks erode it. NAT devices that rewrite source ports erode it further.
The actual fix was DNSSEC — cryptographic signatures on DNS records, so a resolver can verify an answer instead of trusting whoever replied first. Kaminsky spent much of the rest of his career pushing for it, and in 2010 ICANN named him one of the Trusted Community Representatives for the DNSSEC root: a small group holding material needed to reconstruct the root key if the system ever had to be rebuilt. The internet's root of trust has a human quorum, and he was part of it.
Sixteen years on, DNSSEC adoption remains partial. The stopgap is still doing most of the work. That is worth sitting with — the emergency fix from 2008 is, for a great many resolvers, still the fix.
The rest of it
The DNS bug is the headline, and it flattens a career that was consistently about measuring things nobody else thought to measure.
- The Sony BMG rootkit, 2005. Sony shipped copy-protection software on audio CDs that installed a rootkit. Everyone knew it was bad; nobody could say how widespread. Kaminsky used DNS cache snooping — asking resolvers what they had recently looked up — to count networks that had contacted Sony's servers, and established at least 568,000. Turning a scandal into a number is what forced the response.
- Conficker, 2009. With the worm on millions of machines and no good way to find them, he found that infected hosts answered a remote scan differently — a fingerprint. It went into Nmap and Nessus within days, and suddenly any administrator could scan their own network.
- X.509 and certificate flaws, 2009. With Meredith L. Patterson and Len Sassaman, work on weaknesses in how certificates are parsed and trusted, including Verisign still using the long-broken MD2 hash in root certificates.
- Interpolique, 2010. An attempt at making injection attacks structurally impossible rather than filtered against — which is the same argument as the WordPress bug in the post above this one, sixteen years earlier.
- White Ops, later HUMAN Security, which he co-founded and served as chief scientist, working on distinguishing real users from automated fraud at internet scale.
He died on 23 April 2021, at his home in San Francisco, of diabetic ketoacidosis. He was 42. He was inducted into the Internet Hall of Fame that December.
Why we wrote this
This blog mostly covers what broke this week. That is useful and it is also a strange way to understand security, because it selects entirely for failure.
The Kaminsky bug is the counter-example. Someone found a flaw that could have been sold, or published for attention, or quietly kept. He chose the option that took five months, required convincing competitors to cooperate, and earned him public criticism for being cagey — and the internet got patched before the exploit existed.
There is a practical lesson under the eulogy, and it is not about heroism. It is that the same guessing game becomes trivial the moment you can retry it. Every rate limit, every lockout, every one-shot token in a system — including ours — exists because bounded attempts and unbounded attempts are different problems wearing the same clothes. Kaminsky did not break DNS's cryptography. He removed the limit on how many times you could ask.
When you next assess a guess-resistant control, the question worth asking is not how large the search space is. It is how many guesses an attacker gets, and what resets the counter.
