Dan Kaminsky responds (at length) to DJB's 27C3 DNSSEC presentation
dankaminsky.com
dankaminsky.com
I don't mean "bad" in the sense of "probably riddled with exploitable vulnerabilities", although Kaminsky himself acknowledged a double-free a few days ago on Twitter.
I mean more basic things, like, line 455 of phreebird.c which reads an NBO integer off the wire and feeds it directly to calloc() and read() as if it was HBO, or "bad" in the sense of "will fail if a request ever gets split between two TCP segments", or any other number of badnesses.
It's not a crime to publish bad code (it is, in fact, very good thing to do so), but it's irresponsible to urge its immediate adoption or to use it to settle an argument without pointing out that "this really works only in a lab setting".
Unfortunately, Kaminsky posted the most spirited defense of DNSSEC in recent memory on the exact day of our all-hands meeting. I call shenanigans! DNSSEC is evil and Dan hasn't vindicated it; instead, he's taken a small issue (that of online signing) and blown it up way out of proportion. Suffice it to say that online signing isn't the biggest problem with DNSSEC.
What it does do is show what DNSSEC is capable of -- it's a way to separate fundamental limitations of the protocol (which do exist) from implementation faults (like the horrifying things you have to do to maintain DNSSEC with two year old DNSSEC code).
DJB's talk argues that a whole bunch of things are fundamental limitations of DNSSEC. It implies that it must be a offline signer. This is patently false. Actually, any system that supports offline signing can be an online signer, and Phreebird is an example of one.
I'd love to hear more about what you think the biggest problems with DNSSEC are. Perhaps this could inspire new features for Phreebird!
Was WONDERING why you were so quiet.
int
connect_host(const char *host, u_int16_t port) {
int sock = socket(AF_INET, SOCK_STREAM, 0);
if(sock >= 0) {
struct sockaddr_in si;
memset(&si, 0, sizeof(si));
si.sin_family = AF_INET;
si.sin_port = htons(port);
si.sin_addr.s_addr == inet_addr(host);
if(si.sin_addr.s_addr == INADDR_NONE) {
struct hostent *hp = gethostbyname(host);
if(hp) {
memcpy(&(si.sin_addr.s_addr), hp->h_addr, 4);
}
}
if(si.sin_addr.s_addr != INADDR_NONE) {
if(connect(sock,
(struct sockaddr*)&si, sizeof(si)) >= 0) {
return(sock);
}
}
close(sock);
}
return(-1);
}
Tell me something. In the world we live in now, with 10's of well-known mainstream CA's, I see an SSL certificate warning on an otherwise totally OK site about once a month. DNSSEC supposes a world in which everyone runs their own CA; in other words, a world in which there are tens of thousands of CA's.Where, in that function, do I (a) detect a DNSSEC failure, (b) propose to the user the untrustworthy - but - probably - totally - valid address we got instead, and (c) pop up a dialog to the user to allow them to decide whether to connect? Or, instead, does all this deployed code fail in exactly the same fashion as if the host didn't exist?
I'm not sure this is an argument against DNSSEC, it's more of an argument against DNSSEC's marketing. The DNSSEC folks like to say that DNSSEC is deployed to .org. Well, that's technically true, but since no .org domains are signed themselves, this claim is useless. DNSSEC provides no real security currently.
I watched DJB's talk and I thought the first half was mostly for entertainment, rather than detailed discussion of the weaknesses of DNSSEC.
I'm not an expert in this stuff, but I thought that getting "org" it's self signed was a massive achievement because it now means that domains beneath "org" can be signed?
If I do an A record lookup of "baddata-a.test.dnssec-tools.org" it returns NXDOMAIN on my system which supports DNSSEC, and 75.119.216.30 on my system which doesn't...
(I know that glueless delegations are common, I even use them myself. But Wikipedia’s delegation is not glueless. DJB does not like them: http://cr.yp.to/djbdns/notes.html)
; <<>> DiG 9.6.0-APPLE-P2 <<>> @a0.org.afilias-nst.info. wikipedia.org. ns +norecurs
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 51490
;; flags: qr; QUERY: 1, ANSWER: 0, AUTHORITY: 3, ADDITIONAL: 3
;; QUESTION SECTION:
;wikipedia.org. IN NS
;; AUTHORITY SECTION:
wikipedia.org. 86400 IN NS ns2.wikimedia.org.
wikipedia.org. 86400 IN NS ns0.wikimedia.org.
wikipedia.org. 86400 IN NS ns1.wikimedia.org.
;; ADDITIONAL SECTION:
ns0.wikimedia.org. 86400 IN A 208.80.152.130
ns1.wikimedia.org. 86400 IN A 208.80.152.142
ns2.wikimedia.org. 86400 IN A 91.198.174.4
;; Query time: 46 msec
;; SERVER: 199.19.56.1#53(199.19.56.1)
;; WHEN: Thu Jan 6 10:05:40 2011
;; MSG SIZE rcvd: 143It's not the actual IP addresses for all the child data, like www.wikimedia.org.
DJB's basically saying "how can you say .org is signed when not every child in .org is signed". No delegated solution could ever offer that feature. If DJBCurve doesn't support signed and unsigned children, it's a thoroughly irrelevant technology that should be laughed out of the room.
Bashing DNSSEC for supporting a basic reality of delegated trust is flat out unfair.
DJB has some of the best cryptographic implementations out there while Kaminsky's only interesting work is actually someone else's (CVE-1999-0024).
but I think you have wrong metrics for "attention" or "relevance" in the first place.
I sure as hell wanted to be the last one.
(I'm much prouder of getting DJB's fix in, than I am of finding the bug in the first place. The former took two days. The latter took six months, and convincing people DJB was right. Only now do I understand what sort of a hurdle that was.)
Can it cache (Curved)DNS responses among all of its clients?
Meanwhile: Kaminsky is stipulating that every endpoint is going to implement all of DNSSEC. So, furthermore: I don't think he gets to cite "overhead" as an issue with DNSCurve.
What I'm saying is that mass adoption of DNSCurve eliminates the caching layer in DNS, and that will cause a major increase in traffic to the authoritatives, especially TLDs and the root.
If each client endpoint were using a dns cache for classic DNS, the increase in traffic would also be a "concern", no?
The difference is, when DNSSEC has code on the client, it can still leverage the caching infrastructure. When DNSCurve has code on the client, it has to bypass it entirely.
In DNSSEC, all the security resides in the actual DNS records. End-to-end security means verifying each step in the DNS chain, from .org through "www". This is the only way DNSSEC provides any value.
Unlike DNSSEC (shockingly), DNSCurve protects the actual conversation between a name resolver and a name server, irrespective of the RR's configured for a zone. DNSCurve (for the most part) does not care about your RR's. When one speaks of "end-to-end DNSCurve", one is talking about a hypothetical universe in which the root servers all the way down are speaking DNSCurve.
That world is never going to happen.
The point of DNSCurve is that it provides a degree of security --- by my reckoning, the most important degree --- even if the roots don't adopt DNSCurve. And in that universe, caching works just fine: DNSCurve is only going to be used to connect endpoints to caches.