[security] Phishing issues with return_to url and realm

Allen Tom atom at yahoo-inc.com
Mon Feb 5 23:23:50 PST 2007


Hello OpenID Security Community,

This is my first post here, and before I get started, I'd like to 
compliment you all on the amazing progress that OpenID has made 
recently. As far as protocols go, this is very exciting, and I believe 
that it can be used as the foundation for as-yet unimagined new killerapps.

However, there are some severe phishing issues with the OpenID 2.0 draft 
specification which urgently need to be resolved before the draft is 
finalized.

First of all, anyone can craft valid Auth Requests using spoofed values 
for openid.return_to and openid.realm. This has very nasty consequences 
for sites running redirect servers for click tracking purposes, such as 
these:

http://x.go.com/cgi/x.pl?goto=http://www.jyte.com
http://www.aol.com/ams/clickThruRedirect.adp?1,2,http://www.jyte.com

A rogue RP could mask its identity and claim to be go.com or aol.com by 
hiding behind these redirect servers. When serving the Auth Request, an 
OP like myopenid.com will display this message to the user:

"A site identifying as all sites matching http://anything.go.com has 
asked us for confirmation that xxxx is your identity URL..."

This is EXTREMELY BAD, as users expect to trust their OP, especially if 
they feel extra secure because they configured an anti-phishing image 
(like MyOpenID's Personal Icon) and enabled SafeSignIn.This is 
particularly bad if the OP passes sensitive personal information or 
credentials via an extension in the Auth Response.

The best way to resolve this issue is to define a way for the OP to 
verify that the return_to URL is actually a valid OpenID endpoint, and 
to also verify its association.

I propose that an RP's return_to url expose an interface to allow it to 
identify itself as an OpenID 2.0 endpoint, and to also identify its 
association with the OP. Obviously, OPs must not follow redirects when 
interrogating the RP's endpoint.

A possible interface would be for the RP return the its association 
handle if the OP hits the return_to url with the following parameters:

openid.mode = "check_return_url"
openid.server = "https://url_of_the_op.domain.com"

Instead of doing this on every Authentication Request, it would make 
sense for the OP to verify the RP as part of the association process. 
After the OP issues a shared secret and assoc_handle to the RP, the OP 
should be able to query the RP's return_to url before enabling the 
association, exactly the same way an RP can verify an Auth Response by 
querying the OP. Because this implies that an association should be tied 
to a given return_to url, the Association Request interface should be 
extended to require the return_to url. Once the OP has verified the 
return_to url, the OP can enable the association so that all incoming 
Auth Requests with that assoc_handle and return_to url can be served 
without requiring additional verification of the return_to url.

Verifying that the return_to url is actually a valid OpenID endopoint 
prevents redirect servers from being used by phishers to spoof their 
identify. The additional step of tying an association with an RP's 
endpoint allows an OP a way to easily identify verified endpoints and 
realms, and allows a way for an RP to properly identify itself when 
making an Auth Request.

I believe that resolving this issue would increase the level of trust 
that users place on their OPs, as currently, users cannot trust their OP 
to tell them what site they're logging into.

My apologies for the long winded introductory mail. Comments and 
feedback would be very appreciated.

Thanks,
Allen





More information about the security mailing list