7 Major Sites that Send Passwords Unprotected, & China's Deep Packet Inspection
blog.adamsmith.cc
blog.adamsmith.cc
The curious case was Zynga. They don't have a login form. (!)
Facebook, YouTube, Yahoo, Windows Live, Blogger, Baidu, MSN, QQ.com, Google, Twitter, MySpace, Amazon, Wordpress.com, Ebay, Rapidshare, yandex.ru, mail.ru, imeem, Flickr, IMDB, Craigslist, LinkedIn, AOL, Blogspot, deviantArt, PayPal, Alibaba, Ning, Hulu
HTTPS is fundamentally insecure against MITM attacks by governments.
For the long term I wonder if it's possible to close this hole by putting certs into DNS and using a single key to sign all of these DNS records. Is this part of the DNSSEC spec? (not at a computer and can't remember for sure if it is called DNSSEC; whatever the name of the next gen DNS is.)
The reality of DNSSEC is that it's creaky, somewhat broken, solves neither the PKI nor the DNS protection problem well, and --- because it is likely to pervasively screw up applications across the Internet --- unlikely ever to be deployed.
Either way, there's no magic bullet. If you concede root keys to China, you have to concede DNSSEC keys --- which are, if anything, more loosely held and more widely distributed than CA keys, which have never had a known breach.
Edit: CA operates based on trust. All it takes is for a single website to demonstrate this is going on for it to quickly become public knowledge. Now, if you where to target a specific user it might be possible to do this, but hacking their system is a much simpler approach to the same problem with more benefits.
It is vanishingly unlikely --- on the level of "major diplomatic incident" --- that China (or any other government, including ours) has the key associated with Verisign's root CA certificate.
It is somewhat more likely (but still, I think, pretty unlikely) that one of the following could have happened:
* Your computer is controlled by an employer that installed a deliberately insecure certificate.
* Your computer is infected with malware that poisons the CA store in your browser.
The first scenario is just very unlikely. We work extensively on-site for Fortune 500 enterprises, in some of the highest-security environments in the world (and in some of the most idiosyncratic and crazy), and none of them require us to install bespoke certificates to access the Internet or their websites. Now, you have to find the one employer (or zero ISPs) that not only installed a custom root, but also gave the keys to China.
The second point is irrelevant. If your computer is infected with malware, there are worse things to be done to you than injecting bogus certificates.
It is almost the case that it's worth pruning out certs from your browser from untrustworthy CAs; unfortunately, the market for certificates has devolved to "who will give us a cert the cheapest". I wouldn't know which ones to kill. A year or so ago, pruning out untrustworthy CAs would have protected you from the MD5 problem.
From another perspective: I worked on the content filter for Parental Controls at Apple. My understanding is that every filtering proxy product with SSL support requires the installation of an insecure certificate. That, or they do a fairly rudimentary IP or reverse-DNS based filtering (which is the route we chose for Parental Controls) for secure connections.
These vendors certainly claim to have a lot of Fortune 500 clients.
Sure. I'll give you this.
> It is almost the case that it's worth pruning out certs from your browser from untrustworthy CAs;
This was my point. So you trust VeriSign, but do you trust the others (there are 125 in my list)?
Here's one:
Issuer: C=TW, O=Government Root Certification Authority
That looks like the Taiwanese government to me. If they have one you don't think that US has one?If you imply that there's a problem with the SSL/TLS/HTTPS model, I'm pushing back hard. There is a weird SSL stigma among web developers, and it's time to start beating it back. The alternatives are worse.
The funny thing is that x509 has the ability to limit signing to various CNs, so it's possible to limit signing powers, but no one seems to do it.
> The alternatives are worse.
Hardly. Some alternatives might be worse (plaintext everywhere, for instance). What I would like to see is a * .example.com signing cert being given to all domain owners when they buy a domain, signed by a single * .com authority (or .net or whatever the domain is). This would prove to the https client that the domain they are connecting to is really the domain owner. This is a basic level of trust that would be an option for everyone who owns a domain (without any stupid yearly charge for the certs).
Banks and other important sites could go above and beyond and buy certs that verify that their business is what they say it is, which is another trust level entirely (this already exists and can be seen when you go to paypal.com in firefox and get the green location bar thing).
I think that would be a much better alternative than our current system.
Google even references this in the press releases - most of the information gained was done through phishing.
Yes reddit, I'm looking at you. Of course any other site that can actually mail you a forgotten password is in fact doing this too.
That said states like Iran might be more likely to garner the most passwords through sniffing, which is a passive activity, than hacking the sites that store passwords insecurely.
That being said, point taken. While both are important variables to address, one is just plain bad practice.
I thought we got the future something like 10 years ago. It was called "TLS".
I know enough to encrypt my password storage, but I never thought to encrypt passwords client-side. I'm interested in knowing what are best practices.
Even if that means a new protocol that uses SSL to send the javascript, etc., and we're 15 years away.
Do you think designing a system where the server never sees (or has the opportunity to store) the plaintext password is the way of the future?
(Edit: more emphasis on future, not short term, ambitions.)
You mean things like 1password. That's fine. I use Keychain and head /dev/random | md5 for any password I don't have to remember.
Seems to me storing hashes and nonces does not work, because without the original password the server can not create new hashes and nonces. So the client would still always send the same thing, which would be equivalent to a password.
one time during undergrad I was talking with Hal Abelson because there was this big stink about the new research building (Stata center) requiring rfid's to get around. Richard Stallman et al were making a huge ruckus about the privacy implications of not having physical keys.
I mentioned some desired attributes of a protocol to let people in without logging it, and started worrying about the implementation details / feasibility. he said "oh don't worry about implementation. this building has people in it who can implement anything." he had this smirk about him.
so give it some experts and time and they'll figure it out.
http://srp.stanford.edu/whatisit.html
http://www.ietf.org/rfc/rfc5054.txt
Now, if only more browsers would support it.
For example, the user browses to http://www.example.org/login. The generated login form on the page contains a hidden field called "challenge" with a randomly generated hash from the server. When the user submits the login form, have the client do a hash(challenge + password) and send this to the server. Upon receiving the hash and checking credentials, the server invalidates the challenge string regardless if the login attempt was successful.
This obviously does not work if the user does not have Javascript enabled and is not preferable to SSL.
PS: You could implement all the security features of SSL in JavaScript but that wold be pointless and slow. If you really wanted to build a custom security system I would recommended using a Java applet, but even with a team of experts it takes years to build something as secure as SSL.
Of course, it's pretty silly to go to the trouble of writing javascript code that can not only be modified, but may have bugs, when you can just use HTTPS.
The traffic manipulation part of the attack is also extremely easy, and not particularly noisy.
For most applications, Javascript crypto is completely useless.
That said, if option A may help in some unusual case, and option B will be effective in all non-catastrophic cases, I know which one I'd choose.
All for what? The convenience of letting a user keep the same password they already forgot?
A hash with a salt works perfectly fine for 99% of all situations with very little downside.
Can you elaborate on this?
You can see the code for yourself at http://code.reddit.com if you'd like to verify.
If you log in at https://mail.google.com, your entire session is encrypted. If you log in via http://mail.google.com, your password is safe, but your session ID isn't.
They also email your password to you in plain text after you register for an account. They do this after enforcing a password strength requirement when you create the password.
It's not like they're storing critical data or anything, but lots of people use the same password for a bunch of different things. It wouldn't take much to glean a password from one insecure site and try it out on other, more critical, services.
I don't love OAuth, but it is at least a decent answer to the concern you're raising.
http://code.google.com/p/twitter-api/issues/detail?id=395
Also fun: if I have an iPhone client app interacting with Twitter and also with a web service that in turn interacts with Twitter, how does OAuth fit into that scheme? Do I make the user do the OAuth dance for the iPhone app? My web site? Both?
See http://twitpic.com/api.do, http://img.ly/pages/API, http://code.google.com/p/imageshackapi/wiki/YFROGuploadAndPo..., http://twitrpix.com/api, http://twic.li/api. All of them require and/or allow the client app to pass the user's Twitter username and password.
Wait, stop, crypotime.
I'm appear to be trying to design a protocol for secret exchange. I should just go and do some reading instead.
Do you know if there's any value in http digest auth these days? It's deployed in http clients (but only with md5 algo?) and I think it requires the server to store single-hash-of (salt,realm,pw) which you've eloquently pointed out in the past is a bad idea (single-hash of pw is vulnerable to bruteforce since hashes are fast).
My current thinking is that http basic auth over ssl would be preferred to http digest (as an auth method widely, natively supported by http clients), since it avoids pw in plaintext and allows server to store stronger hash (e.g. stretched sha-256, bcrypt) for pw.
In the meantime, what we really need to do is get rid of the stigma about SSL, which credibly solves the problems we're talking about on this thread.
And they are IE & Win32 only. That's why every Mac & Linux user has to install a VirtualBox/VMWare for online trading.
I was hoping Google Gears could provide some sort of similar mechanism, together with CAPICOM exposure to Javascript across platform and browsers :)
https://login.taobao.com/member/login.jhtml
plaintext version
http://login.taobao.com/member/login.jhtml
IIRC most of these popular sites provide a switch option between HTTPS and HTTP.