DNS keyserver (was Re: gnupg-1.0.7: keyserver subdir?)

Simon Josefsson jas@extundo.com
Wed Jul 10 18:30:01 2002

Michael Graff <explorer@flame.org> writes:

> Simon Josefsson <jas@extundo.com> writes:
>> > Cool.  A key server DDOS attack is in your future.  :)
>> How so?
> One of the popular DDOS attacks is to use a multiplier of some sort.
> For example, AOL used to have about 26 or so MX records, which just
> fit in a 512 byte response packet.  Attackers would forge a source
> address on a packet to be some poor victim machine, and send a request
> for "aol.com. mx" -- a 63 byte (or so) packet would multiply into a
> 512 byte packet.  So, the attacker needed but 1/8th the bandwidth of
> the target to get this trick to work.
> What you're proposing (and I still like the idea, mind you :) is even
> worse -- nearly a 1000x increase.  I send you a small packet as a
> request, and you send me back up to 64k of data.

Is the packet size really the important factor?  I thought a good DDOS
attack used a protocol that generated several packets given only one.
Like broadcast ping.

Also, is it possible to spoof an EDNS.0 session?  I don't remember the
details, but it may include some kind of cookie, like TCP, which you
need to guess in order to continue.

>> > Remember that the max payload (and max rdata size) is still 64k -
>> > headers, so you'll have to handle broken up data even over TCP.
>> Hm.  That is a problem. Perhaps it is easier to state that it won't
>> work with keys larger than 64kb though.
> Then your server won't hold the most popular keys.  :)

Are they that large?

> I'd say reserve a flag somewhere in the returned data that means "more
> data" and they can just tack on .0 on the end.  And then .1, .2, .3,
> etc.  That way, while less efficient, it will work for even large
> keys.

Yup, that could work.

> BTW, remember also that a 64k UDP packet will be fragmented over
> nearly every type of wire, and if even one of those fragments are
> dropped, the entire packet is lost.
> It may be better to limit the EDNS0-sized responses to perhaps 1400
> bytes of payload, and use some sort of chaining method to get the full
> key data.  Of course, this is not atomic.

Or switch to TCP.

> What I was considering was to split the signatures up, and return each
> signature in a different packet.  One packet would be the self-signed
> key (if it is self-signed, the bare key otherwise) and each following
> request would return one signature.  It would stop when it was told to
> -- that is, requesting
>         keyid-here.sig.21
> would return "END OF SIGNATURES"
> It got messy fast.

Yes, it looks rather messy.