AdultFriendFinder was hacked
leakedsource.com
leakedsource.com
They had a breach last year, but it wasn't as big.[1]
[1] http://www.ibtimes.com/adult-friend-finder-dating-site-known...
https://it.slashdot.org/story/16/11/13/2144229/hack-exposes-...
This is definitely not the case with AFF.
I seem to recall facebook allowed login for a pass "fooBar" with "FooBar" (phone input capitalize first letter) and "FOObAR" (caps lock pressed).
Still seems stupid to me, but if you care a lot more about letting people in than about their security it might make sense.
https://www.ft.com/content/33503e4a-8f95-11e6-a72e-b428cb934...
I do, and it's not fun when I get asked to type in the 12th, 13th and 15th character.
Yay! Free bank accounts all around!
More probably: the branch itself has a hardware VPN, so compromising the local network is still possible.
In fairness to them, they do use 2FA for anything involving moving money around.
It doesn't sound very easy to me at all. Can you explain in more detail?
Chase's online banking login is case insensitive ...
So is the case with Citi.e: There is a pretty good discussion of this here https://www.reddit.com/r/personalfinance/comments/2m81uj/tip...
It's also not unheard of for them to strip all non alphanumeric characters so P@ssw0rd2016! is normalized to pssw0rd2016
On the other hand, they are probably far more alert to detecting and stopping bruteforcing attempts.
It's a similar situation with certain 4-digit PINs for smartcards; that may seem trivial to bruteforce, but you only get 3-5 tries before the system considers you to be attacking it and permanently locks you out even if you try to enter the correct one afterwards.
Not sure if this is what GP meant. Maybe Facebook only accepts wrong case on the first position (simple to implement) or maybe GP just doesn't know what they do.
This is true, but it's not a response to your parent comment,
> You can do what Facebook does without storing the passwords as lower case. If someone tries to log in, and the password doesn't match, then just transform it that way and try again.
1. Store the hash of "PassWORD".
2. Receive erroneous "pASSword", hash it, find the hash isn't right.
3. Reverse the case of the bad input to get "PassWORD", hash that, find it matches.
At no point was it necessary to store the hash of "password".
I really don't like the JS ecosystem but this is totally unwarranted.
However, there's recent work [0] from Cornell that explores the security-usability tradeoff when correcting password typos. It turns out that accepting specific classes of typos (e.g., caps lock on: if password is "Password" then allow "pASSWORD") can increase usability with minimal security impact.
At least they do not strip special characters out of the password.
Here's one idea: Let's say the user's password is P. The user enters some password P' with a typo. The authentication check is "does H(T_k(P')) == H(P)" for some set of transformations {T_1, T_2, ..., T_n}. Each transformation T_i hypothesizes that the user made a specific mistake. (e.g., T_1 is the caps lock is on so we need to flip the case of all the characters)
The paper I linked to actually does a good job motivating specific classes of typos by looking at real typos from Dropbox users.
Reporting caps lock usage and not also keyboard layout usage is a pretty bad usability hole IMO.
Facebook does this, in case you weren't aware.
If a field is properly declared to be a password field (<input type="password" name="pwd">) of course ideally this wouldn't happen (plus, the characters get masked with stars, and hopefully what you type doesn't end up in your autocorrect dictionary, etc etc) - but it's full of shitty browsers out there.
My name in Greek has a letter with a double accent. Perfectly valid of course. But many (Greek) sites will reply that this NOT a Greek letter :)
Also, do they support e-statements for savings accounts yet? I swear it is the only piece of mail I get now a days.
Overall though they are a great bank with a magic fee-less debit card and human beings who answer the phone 24/7. And they don't seem too evil, but I haven't turned over many rocks.
http://www.schwab.com/public/schwab/nn/legal_compliance/schw...
and expand the "Be strategic with login credentials and passwords" section, it says:
> Consider getting a free security token, too, which can make every login even more secure. Just call us at 800-435-4000.
I am in two minds wether a service used by non technical people should allow for case insensitive passwords, it'd be interesting to see what the difference in support load, customer satisfaction and churn would be for both case sensitive and case insensitive passwords, and also enforcing minimum complexity.
Have also never heard of a bank that actually asked for a password, substring or not, at least aside from being asked for a 'Phone PIN' or similar lesser/non-critical to authentication piece of information.
The uppercase being indifferent is a first for me but I've had those people tell me that performing copy paste into the password input somehow changed the authentication procedure. He again acted as if I was a complete idiot for suggesting that that made no sense.
Related, the "3d secure" credit card verification system asks for individual chars of a password (at least in the UK).
If they leak, it becomes trivial to find working password synonyms to stick into the other sites you say benefit from discarding information.
But why don't they use the proven common-sense strategy of not storing the passwords at all, but store the hashes instead? They can validate by converting user-input to a hash and then there is no harm even if the user auth table is stolen.
> "the hashed passwords seem to have been changed to all lowercase before storage"
This effectively makes your password case insensitive and probably reduces the % of support tickets (some people might not just click a reset password link and will insist they were typing it right, so they will open a ticket - all because they forgot capslock). It reduces operating costs at the expense of lower security and somebody must have considered it to be worth it.
* Must be 7-15 characters
* Must have at least one letter
* Must have at least one number
* No special characters
¯\_(ツ)_/¯
Lowercasing after hashing increases the likelihood of a collision, but it won't necessarily have anything to do with the upper/lowercasing of the actual password.
This would mean that 80% of the Dutch adult population has an Adult Friend Feinnder account!? (Of course people may have multiple accounts, but still, 80% is when taking into account the full (men+women) population.)
Belgians?
"15-24 years: 12.11% (male 1,050,889/female 1,010,596) 25-54 years: 39.83% (male 3,400,998/female 3,377,311)"
So you're looking at somewhere between 15-20% of Dutch speakers have accounts, which seems more reasonable, particularly if some people have more than one account (very likely, I'm guessing).
Personally, I find them disgusting and don't want them to be broadcast at daytime.
Would you expand on this?
> LFI vulnerabilities allow an attacker to include files located elsewhere on the server into the output of a given application.
How did they do that ? append /../../../etc to an url that is supposed to serve a file and hope the server doesn't check for directory traversal ?
I don't care where you push your checks around to, just as long as they exist.
This general approach (whitelisting file URLs) lets us localize any path sanitation to the file upload code, rather than every single request.
You should generate UUIDs, bucket by the first few chars, and use a database to map from UUID to human-readable name.
When you've got file read, procfs is very nice :)
include("some/path/" . $_GET['some_url_parameter']);
Adding &some_url_parametr=../../../etc/passwd (or ../../../var/uploads/evil_script.txt) allows you to insert arbitrary text file from the server into the generated HTML or execute arbitrary PHP code (which in turn can even run arbitrary shell commands if this is enabled on the server).Since PHP has such feature, people use it and to this day you'll occasionally run into a website which employs this pattern. Common use case is
bad-example.com/article.php?id=article_name.txt
where article.php contains headers, footers, formatting, etc and actual articles are stored in text files.Another angle: we're supposed to not do anything that requires any form of confidentiality online? can't book a doctors appointment, transfer money, send emails to family?
Some convenience trade offs? You're suggesting that people don't use any modern bank, don't use any hospital, don't interact with any state body at all. Should we go live in a cabin in the woods?
It's why quite a few organizations still used air gapped systems, link/IP encryption between locations, and private, leased lines. A smaller number use more secure or just obscure endpoints that can't execute the programs malware authors write. You don't read about such people in the news getting hit by malware or hackers. They can be hit, esp by high-strength attackers, but it's just rare because they don't trust the Internet, Windows, etc in how they do IT.
And I think it's right. None of the large OS are fit for purpose. And it's about time that regulators start protecting unsuspecting consumers from unscrupulous incompetent fly-by-night developpers like the ones behind this website.
https://www.schneier.com/blog/archives/2011/09/an_interestin...
Idea being we just combine the right features, often standardized in libraries, with the most cost-effective of assurance activities proven to work. I gave a list of the latter to pick and choose from in another discussion:
https://news.ycombinator.com/item?id=10734477
Cleanroom methodology with safer languages with test-case generation, battle-tested libraries for common risk areas (esp web attacks or crypto), automation of parsing/protocol handling, static analysis to eliminate common issues, and basic code review would knock out vast majority of code-injections.
But is it productive for us to declare everything unsafe and somewhat give up believing we can build and use safe platforms?
I think there's a balance somewhere. I (to give a rather crude example, apologies) would never take a nude photograph of my partner on a digital camera because it's an unacceptable risk. But I'll share fairly personal thoughts knowing that they may come back to embarass me one day.
I want to put the pressure on companies who make such bold claims about their "military grade encryption" to face bankruptcy and shame when it's proven they're full of lies and negligence; if we just assume everything can be attacked with an LFI, it seems we've stopped caring about trying.
Caveat: I still haven't had breakfast, I don't have my best thinking cap on right now, but that's my gut instinct.
There's the problem: we. We might be able to do it with time and money. Most startups, publicly-traded companies, regular companies, government groups (esp w/ legacy systems), and IOT makers aiming for max cost-cutting won't do it. Most don't know how but won't make the sacrifices even if they learn. Their incentives plus demand-side tell them not to. So, no reason to think they'll do it any time soon past marginal improvements for public relations.
What can happen is people forming organizations idealogically and/or by charter committed to puting quality/security over highest-margins in their products or services. Look up Praxis Correct-by-Construction for an example who charges 50% premium for software they warranty for quality. Secure64 sells DNS with ultra-hardened OS. GENU builds on OpenBSD. Green Hills has INTEGRITY-178B. OK Labs (now GD) put microvisor in a billion phones. There's some others but really niche and still successful where well-marketed.
We could see more of that. Only problem is they fight an uphill battle since they're expected to include a pile of insecure features and protocols in lots of products. And, despite maximum quality, at same price or cheaper than competition! What could go wrong in such an IT market?!
Online banking doesn't implement security features to make things safe; it's to make the insurance cheaper.
You probably won't want to do any of this stuff outdoors in 10 more years, or indoors around a smartphone, television set, refrigerator, or any object with flashing LEDs on it. As a combined network, smart audio coverage can be made to be so complete that incomplete areas will arouse suspicion.
Registering on (or even visiting) an internet site is just slightly different than signing a contract (and in some opinions, legally equivalent.) If you had to sign a form with your address to visit a prostitute, and you couldn't even open the door without it recording your license plate number - what kind of expectation of privacy could you reasonably have?
https://medium.com/message/hello-future-pastebin-readers-39d...
Norton's law: Over time, all data approaches deleted, or public.
The internet is becoming too important to our lives, we can't just say "presume everything is public"
Your advice means that someone should refuse to visit a doctor or hospital which uses computers, since "I have to act like everything online could be public!". That's just unworkable.
Not gonna happen. That's like saying companies should make un-breakable security for buildings. No such thing will every exist.
They didn't see the Yahoo break with 500m accounts?
Also, why is "pakistan" such a popular password? Deployed soldiers?
Many users signup for each online service with a single-purpose email address. e.g. <servicename>@uniquedomain.com, so many customers will often know of a leak as soon as the service provider does.
As for single-purpose email addresses, that only works for cases where the service isn't selling account information, correct?
I don't know how you would tell the difference in that case so I assume yes.
The way I implement this is I bought an entire domain for spam. I created a catchall account and when I sign up for services I can just punch in hackernews@spam.com for example. All of this filters into a single email account allowing me to retrieve all my password resets and account confirmations.
This will weird out some people over the phone:
"Yes, it's comcast@spam.com"
"Sir, to look up your account I need YOUR email address"
Ah, but it does work (for me, twice). Of course spammers could strip the suffix. But since spam is a numbers game, I'm not sure it's worth the effort for them.
103,070,536 passwords already plainly visible
232,137,460 passwords hashed with SHA1
99.3% of all passwords from this website are now plaintext (cracked).
As someone who cares about security, this is very, very painful to read. But it also makes me curious about that password data set. It might be used for security research, like estimating the entropy of passwords more accurately.
I suspect that or is an and in a lot of cases as well.
I work with C#, Java, Python Go and JS on backends a lot and no other language I worked with had such a simple but secure API.
Still, a pragmatic answer and, given PHP started life as a web framework, fitting :).
func GenerateFromPassword(password []byte, cost int) ([]byte, error)
func CompareHashAndPassword(hashedPassword, password []byte) error
[from golang.org/x/crypto/bcrypt] from django.contrib.auth.models import User
u = User.objects.get(username='john')
u.set_password('new password')
u.save()
And here is the code which does all the magic - [1]. You can also generate nice passwords [2], use many available different hashers [3] Or write your own [4][0] - https://docs.djangoproject.com/en/dev/topics/auth/default/#c...
[1] - https://github.com/django/django/blob/stable/1.10.x/django/c... and https://github.com/django/django/blob/stable/1.10.x/django/c...
[2] - https://docs.djangoproject.com/en/dev/topics/auth/customizin...
[3] - https://docs.djangoproject.com/en/dev/topics/auth/passwords/...
[4] - https://docs.djangoproject.com/en/dev/topics/auth/passwords/...
Note that of course the password algorithms are typed, so this doesn't cause a problem in the corner case that a user's password is a sha1 hash of something else.
[0] - https://docs.djangoproject.com/en/dev/topics/auth/passwords/...
PBEKeySpec spec = new PBEKeySpec(password.toCharArray(), salt.getBytes(StandardCharsets.UTF_8), iterations, digestSize)
SecretKeyFactory skf = SecretKeyFactory.getInstance("PBKDF2WithHmacSHA256")
byte[] hash = skf.generateSecret(spec).getEncoded()
ant then using MessageDigest.isEqual (on newer jvm, older ones had a bug up to 6 45 or so) to compare the passwords.well the biggest problem is probably generating a truly random salt with SecureRandom, which will slow down your program if used incorrect.
Yes. Again:
This event also marks the second time Friend Finder has been breached in two years, the first being around May of 2015.
Data are liability.
The interesting thing to me is that password choices clearly reflect the demographic of the users.
Things are tightening up.
If you want to view a profile, they force you to register.
Hence the user clicks on a profile, gets a registration form, and fills it out in a bad mood, since they are being forced register to continue when they don't want to. Hence "fuckyou" or "fuckoff" becoming their password choice.
It would be interesting to see what email addresses these specific users gave. Possibly throwaways that use equally fruity names?
Per-user unique salts are definitely helpful in leaks like this. With 400,000,000 users, it would take 400,000,000x more compute power to crack the same number of passwords.
Let's assume you want to store a password. The first, obvious step, is to store it in plain text. This is obviously brain dead, but well, we live in the world we live in.
$user_pw = $password;
The second step is to hash it. This means that the password can't just be read out of the database. $user_pw = hash($password);
The problem with this approach is that with the amount of computing available, it's fairly trivial to just bruteforce everything, and with the advent of rainbow tables (pre-cracked hashes), it gets even easier.The next obvious step is to salt the password. Salting means that you add a random piece of information to what you hash, in order to disable the use of rainbow tables. Every password has to be cracked individually. The salt needs to be included in the stored form of the hash, because otherwise you can't calculate incoming authentication requests against it.
$user_pw = concat($salt, ':', hash(concat($salt, password)));
This makes a targeted attack possible, but mass attack over a long list of passwords gets quite a bit more difficult.The problem is that now, you have the salt always stored with the password. This means that if your database gets stolen/dumped, an attacker has all the information required to crack specific hashes.
In order to alleviate this, you can use a pepper, which is similar to a salt, except that it is global and unique to your application, and doesn't change all the time. It is a static piece of data that gets hashed as well, but isn't stored alongside the hashes in the database.
$user_pw = concat($salt, ':', hash(concat($salt, $PEPPER, password)));
This obviously only changes anything if your pepper doesn't get stolen alongside the database, so this is usually an application-specific constant that doesn't get stored in the database."peppering" as described is conceptually similar to storing passwords as HMAC's under some key not stored in the database.
The passwords in the dataset will neatly divide into "trivial" and "intractable".
A single password with 80 bits of entropy (16 characters, random lowercase/numbers) will take more time to crack than 1,000,000,000 strong human-chosen passwords under 40 bits.
Most of the passwords will be so weak that it might not be worth doing the sorting and preprocessing needed for the parallel attack on multiple passwords with the same salt.
Once you're using just plain hashing you've already lost and instead of using ad-hoc salting schemes you should be using a proper PBKDF (PBKDF2, bcrypt, whatever)
I don't see how that helps anyone when a technical person can trivially setup a search, and a non-tech person could pay someone a small sum to do the same.
Savage. It's interesting why twitter seems to be blind against obvious terrorists accounts.
Just because the vulnerability is old doesn't mean you can disrespect his profession. Sometimes people just write bad code. I'm sure you've done the same.
I'm arguing that this isn't research. There was no novel technique used or investigation into original paths of exploitation or increasing our understanding of previously unknown areas of anything.
There's a material reason I said the above; calling the individual a researcher suggests that the exploitation of AFF was something quite complicated requiring a previously unknown attack, taking away from the fact that having an LFI in your app in 2016 is potentially bad luck but more likely just negligent; it should be highlighted as such.
And the next week, a later article corrected to "a script kiddie from HackForums" as determined by the FBI :D
All of that running on GPU. It's terribly effective. Even more so when 90% of accounts are throwaway/bots/fake accounts.
I'd make a blog post about cracking 99.7% of AdultFriendFinder passwords in 1 hour. But then I realized that it's evil and I shall not.
How else would you verify that the password matches ?
The output of your library's BcryptEncoder.encode(password) includes not only the password hash but information about the algorithm and the salt. That's what you store in your database. That extra information tells the decode function how to decode later on.
See here:
http://stackoverflow.com/questions/6832445/how-can-bcrypt-ha...