- From: Jacob S Hoffman-Andrews <jsha@eff.org>
- Date: Sun, 22 Jun 2014 21:29:34 -0400
- To: Anne van Kesteren <annevk@annevk.nl>, www-tag <www-tag@w3.org>
- Message-ID: <53A782FE.3030709@eff.org>
Thanks for writing this doc! (http://www.w3.org/TR/capability-urls/).
> When capability URLs are used, they should be used within an
> appropriate HTTP verb to enable a relevant action. For example, an
> HTTP GET on a capability URL should not result in side effects such as
> the deletion of a resource. Capability URLs should encode access
> permissions for a resource, not actions on that resource.
Some common uses of capability URLs break this pattern, in favor of
providing easy actions, especially from email. For instance, 'confirm
email' and 'unsubscribe' actions are typically executed as GETs on a
capability URL, but they perform an action.
> Capability URLs must be unique, but they should also avoid being
> guessable. For example, if capability URLs are generating using a URL
> like https://example.org/access/{number} and number is merely a
> sequentially increasing integer, it would be incredibly easy to scan
> through possible numbers to locate new information.
It would be great to provide more detail here. For instance: capability
URLs should be generated using a secure random number generator, and
contain at least N bits of entropy. (N may depend on the sparseness or
density of the URL space). Ideally there should be a rate limit on
accesses to capability URLs to prevent enumeration, even if the rate
limit is very generous. And capability URLs should not be passed through
a URL shortener that has lower protections against enumeration than the
original capability URL.
If using a hash function to generate capability URLs (common for
password reset), use an HMAC, not hash(secret + data), otherwise you
will be vulnerable to length extension attacks.
> One possible application pattern is for capability URLs to redirect
> (with a 302 Found) to the canonical URL and for the server to use the
> Referer header, set through the redirect, to determine the level of
> access granted to the user.
I don't think this works. By default (without special security
settings), on 302, browsers will not
pass a Referer header matching the URL that 302'ed. Instead they will
pass the same Referer header
that they sent to the URL that 302'ed.
Also, it's common for users who are given a capability URL to click on
it, double-checking that it
works as expected. If the capability URL 302'ed to a canonical URL, and
those users then copy the
result from the location bar, they would send out an incorrect URL that
does not grant the
capability they intended.
> Future Work ... separate HTTP header that indicates that the requested
> URL is a capability URL
It might be interesting instead to specify this as a well-known string
within the URL, e.g. /capability/. This would allow webmail providers to
apply special logic to emails containing capability URLs. For instance,
when an attacker gets access to an email account, they often request
password reset URLs to be sent from various services to that email
address, so they can take over the matching accounts on those services.
A webmail provider could choose that, if an email account has recent
signs of a takeover, all capability URLs sent to that account are
sequestered for a week to give the real user a chance to re-secure their
email before other accounts are compromised.
A similar effect could be achieved by specifying this as an attribute on
anchor tags within emails.
> 3.1.1 Forgotten Passwords
It would be great to add more specific guidelines for the forgotten
passwords case in particular. E.g.: Password reset links should expire
after a certain amount of time. All extant password reset links should
expire after a password is successfully changed (either via a capability
URL or via a logged-in account). All extant password reset links should
expire after the email address on the account changes.
This doc should probably also discuss <meta name="referrer"
value="origin"> as a best practice for pages rendered at a capability url.
Received on Monday, 23 June 2014 09:49:33 UTC