On 1/22/20 09:52, Tommy Pauly wrote:

There should certainly be a minimum time between fetches, which we can specify 
here.

Beyond this, I think there's actually a relatively straightforward solution 
that's latent in the text but needs to be called out in the security 
considerations.

The privacy considerations note that the Additional Information server should 
limit access to valid clients (and if it checks the client public address, this 
can prevent the NAT66 trick):

Network operators SHOULD restrict access to PvD Additional
Information to only expose it to hosts that are connected to the local
network... [this] can be implemented by
whitelisting access from the addresses and prefixes that the router provides
for the PvD, which will match the prefixes contained in the PvD Additional
Information.


To be clear, I'm far less concerned about DDoS attacks on PvD Additional Information servers [1]  than I am about attacks on general-purpose web servers.


In addition, the client is told to "abandon" requests and consider that a PvD 
has no additional info if it receives HTTP 400 errors:

If the HTTP status of the answer is greater than or equal to 400
the host MUST abandon and consider that there is no additional PvD
information.

My thought is to specify that the server rejects clients with a 400-level if 
they are not indeed from its own PvD; and similarly to specify that clients 
don't retry and effectively blacklist the PvD Additional Info in this case, or 
if they don't get valid JSON back.


Durable blocklisting (e.g., blocks that survive reboots) of specific PvD IDs on 400-class errors certainly helps in some cases (non-PvD servers will likely return 401, 403, or 410 for PvD requests), but it falls down in the fairly common case of web servers pointed to by wildcard DNS records. For example, an attacker could flood github.io by first sending out a PvD id of "1.github.io" and then, milliseconds later, sending out a PvD id of "2.github.io", and so on, indefinitely.

So, a few additional thoughts to throw into the hopper -- all of which have some drawbacks -- would be to consider:

 * Instead of blocklisting individual PvD IDs, blocklist all hosts
   under a corresponding eTLD [2]
 * If a PvD Additional Information server returns a 400-class response,
   persistently block the sender of the RA (I don't know offhand how
   one might do this in a way that can't be evaded, though. Source IP
   address clearly won't work, and source MAC is probably too easy to
   change as well)
 * Add a mechanism to the RA interaction that requires at least as much
   work on the attacker's part (both in terms of network usage and
   computational complexity) as the HTTPS connections themselves, thus
   eliminating the amplification (think challenge/response
   proof-of-work approaches here).
 * Add a large, global (i.e., not per-PvD ID) throttle (on the order of
   minutes or hours) between acting on received PvD RAs
 * Require clients to check in DNS (or some other highly scalable
   database) that the PvD Additional Information server has opted in to
   being a PvD Additional Information server. As an example of one
   possible way to do this: for the PvD ID foo.example.com, clients
   would have to first check for the presence of a DNS TXT record
   _pvd.foo.example.com. (See RFC 8552 if you choose to do something
   like this).

/a

____
[1] The optional nature of the information they serve makes them non-critical [2] I know you know what this is, but for the benefit of others, see https://en.wikipedia.org/wiki/Public_Suffix_List

_______________________________________________
Int-area mailing list
[email protected]
https://www.ietf.org/mailman/listinfo/int-area

Reply via email to