- From: Maciej Stachowiak <mjs@apple.com>
- Date: Wed, 04 Nov 2009 17:57:44 -0800
- To: Tyler Close <tyler.close@gmail.com>
- Cc: WebApps WG <public-webapps@w3.org>
On Nov 4, 2009, at 4:51 PM, Tyler Close wrote: > MarkM and I have put together a solution to the challenge problem > Maciej presented at the Tuesday afternoon TPAC meeting. The primary > goal of this design was to preserve both the user interface and > network communication pattern used in Maciej's CORS-with-Origin > implementation. As you'll see, the two solutions are almost identical > from this perspective. See: > > http://sites.google.com/site/guestxhr/maciej-challenge Thanks for posting this. Just to clarify, my presentation wasn't meant to pose a challenge problem but merely to clarify some of the requirements that led to the design of CORS. However, I think this example of meeting the same requirements with a different model is very useful input for the WG, so thanks for putting this together. So here's some specific comments: 1) I believe this scheme works and meets the stated requirements of the calendar event scenario. 2) I strongly disagree with the final sentence on that page: "As discussed at Tuesday's TPAC meeting, Maciej's solution is vulnerable to a CSRF-like attack by Server A on Server B if the "add event" URL provided by Server A actually refers to a resource on Server B." The scenario I posted does *not* involve Server A providing a URL to Server B and does not have a vulnerability. It is true that if you change the scenario in certain ways, you can produce one with a vulnerability. I would claim that as long as you follow my proposed "Don't Be a Deputy" (DBAD)[1] programming discipline, you will not introduce Confused Deputy vulnerabilities. 3) The proposed GuestXHR-based protocol does not rely on ambient authority except in the initial permission grant (where presumably Cookies are used to identify the user to both servers, although this is not spelled out). 4) The GuestXHR-based proposal depends on creating a persistent shared secret between sites A and B. This introduces risk in the following ways: a) Server A has to ensure that the shared secret is distinct per user and not guessable. This is not trivial. The experience with building secret token defenses against CSRF shows that it's not unlikely developers will make subtle errors which lead to the secret token being guessable. b) Both protocols depend on the confidentiality of the user's cookie for Server A being maintained. Server A can guarantee this by itself, by ensuring physical and data security of its servers, and by making the cookie "Secure" and "HttpOnly", to guarantee it is only ever transmitted over SSL. With the shared secret though, Server A also has to rely on both itself Server B to avoid revealing the shared secret. A flaw in security practices on Server B, or simply a mistake in sending the shared secret over a non-SSL channel, or to the wrong server, create a vulnerability. Such a vulnerability is not possible with an HttpOnly Secure Cookie, since there is no way for Server B to cause Server A's cookie to be sent to the wrong server. 5) I would summarize the tradeoff between this mechanism for a simple cross-site communication scenario vs. the CORS way to do it as follows: a) In the CORS-based protocol, if you change the scenario in a way that violates the DBAD discipline, you may introduce a CSRF-like vulnerability. In other words, making a programming error that violates DBAD can introduce a vulnerability into the system. b) In the GuestXHR-based protocol, if you make a programming error in generating or maintaining the confidentiality of the shared secret, you may introduce a CSRF-like vulnerability. 6) Combining the shared secret mechanism with the Origin/Cookie mechanism increases overall security of the solution. Then you have to make *both* an error in violating DBAD and in management of the shared secret to create a vulnerability. Making only one of these mistakes will not introduce a CSRF-like vulnerability. Thus, running the proposed protocol over XHR2+CORS provides defense in depth relative to the GuextXHR-based solution. Combining 5 and 6, the risk of programming errors with CORS-only solutions has to be weighed against the risk of programming errors in shared-secret solutions plus the loss of the ability to create defense in depth by combining Origin/Cookie checks with a shared secret. Regards, Maciej [1] To recap the DBAD discipline: Either: A) Never make a request to a site on behalf of a different site; OR B) Guarantee that all requests you make on behalf of a third-party site are syntactically different from any request you make on your own behalf. In this discipline, "on behalf of" does not necessary imply that the third-party site initiated the deputizing interaction; it may include requesting information from a third-party site and then constructing a request to a different site based on it without proper checking. (In general proper checking may not be possible, but making third-party requests look different can always be provided for by the protocol.)
Received on Thursday, 5 November 2009 01:58:19 UTC