Some time ago, I registered for one of these scientific conferences. The process is simple: You enter your details, select optional packages, finally enter your credit card data, and you're done. This being a computer science conference, you would think your data is all secure in the hand of experts. As I can now tell you from experience, this assumption is wrong. Very wrong. This single registration system contained not just one security flaw, but four – all independent of each other.
|My Registration Screen|
Security Flaw #1: The identifiable ID, or How I would be able to access the data of every conference participantThe fun began when I got my confirmation e-mail. Apparently, I was the first person to have registered with the conference – because my participant number was one. ("Hey – look at me; I am participant number one!" I said.) In my e-mail, I also got a link with which I would be able to access my registration. Following it would immediately lead me to the above registration screen.
The link was a bit unusual, because it would not contain any other "secret" information or token other than my participant number, though. (You might assume it would encode my name, my ZIP code, or some other information tied to me only.) So I asked myself: What would happen if I change the link from "?parm1=1" to, say, "?parm1=2" – that is, participant number two? I entered the link into my browser, and immediately, I saw the registration screen of Lars Grunske, a colleague of mine in Stuttgart, Germany.
|Lars Grunske's registration screen|
Now having the same privileges as Lars, I would be able to read and change all data at will. The idea arose to have him buy a few extra dinner tickets at his expense, but only briefly so. Trying the same for further participants gave the same (Hi Abhik!, ¡Hola Yasiel!).
In 2011, a similar mistake was made by UNESCO, who also used consecutive numbers for its internship applicants, and who thus leaked hundreds of thousands of applicant records on the Web. (German Article on Spiegel.de) What do you do when you discover such a problem? To protect the integrity of participant data, I dutifully reported the problem to the organizers, who immediately replied the issue would be fixed as soon as possible.
Lesson 1: When handling personal data, set it up such that access requires a secret that cannot be easily guessed.
Security Flaw #2: The Unsanitized input, or How I easily bypassed password checksThe next day, I got a new mail from the organizers. In addition to lots of high end security stuff (which would not protect from guessing a participant number), they now had introduced a secret word only known to the registrant, commonly known as a password.
Okay. I went to the site, and it indeed now requested that I enter my ID and password.
|Revised login interstitial screen|
Incredible. Could one really attack the system this way? Ten minutes later, JP chimed in with
Ha! Indeed, this worked like a charm. Eventually, I would simply enter "2' -- " as my ID, and any string as my password – and again, I would be Lars Grunske, and would be able to alter his data at will. Likewise, anyone with the above trick could do the same to my data.
How does this work? Internally, the conference registration system uses a database that is controlled by so-called SQL commands. When I enter my ID, say, "1", and my password, say, "1234", the system selects my data from the database using a SQL command looking like this:
SELECT * FROM REGISTRATIONS WHERE ID = '1' AND PASSWORD = '1234'
Note how the number I entered as ID ("1") becomes part of the command. By entering "2' -- " as ID and "whatever" as password. we get the command
SELECT * FROM REGISTRATIONS WHERE ID = '2' -- 'AND PASSWORD = 'whatever'
In a SQL command, anything starting with two dashes "--" is treated as a comment and ignored. So the system simply fetches the data from the registrant whose ID is 2, ignoring the password. This is known as a SQL injection attack, and the standard way to avoid these is to filter out all characters that would have a special meaning in SQL commands (like "'" or "--").
Refining my ID to, say, "2'; DROP TABLE REGISTRATIONS; -- ", I might even have been able to delete all registration data. (I hope they do backups!) How could one set up a SQL-based system and never have heard about SQL injection? Now this was beginning to get embarrassing.
Lesson 2: When setting up a publicly accessible service, identify common attack vectors and protect against them – for Web sites: buffer overflows, SQL injection, cross-site scripting, etc.
Security Flaw #3: Plaintext Passwords, or How I would now also steal personal passwords from all participants
But the embarrassment was not over yet. Remember how the e-mail above asked users to set up their own passwords? It turned out that the passwords were actually stored and displayed in the clear, as seen on Lars' revised registration screen:
|Lars Grunske's registration screen, now with password|
The password listed was Lars' password; saving it would allow me to log in with his user ID and password. I could easily have skimmed all passwords of all participants and I could have logged in long after the SQL vulnerability had been fixed.
But storing passwords in the clear is a bad practice for many more reasons. It gives the administrator access to all passwords, which provides an opportunity for thefts. Plus, and this is probably the worst: Many people tend to use the same passwords for different sites. Had Lars indeed changed his password as requested, and for instance chosen the same password he would use for Amazon or eBay, I would be able to log in at these sites on his behalf, and happily order stuff.
Had Lars used the same password he also uses for his mail, I could have accessed all of his passwords, everywhere – a simple click on "I have forgotten my password" links would have triggered "password reset" mails to his account, which I could easily have skimmed. I'm a nice guy, so I did none of this. (Plus, I have a cool joint research project with Lars.)
To cut a long story short: I sent another urgent report to the organizer, and hours later, the SQL vulnerability was closed. The one we had found, that is. No idea whether other vulnerabilities would be hidden somewhere in there, or how the system had been tested for security, if at all.
Lesson 3: Passwords should never be stored, displayed, or transmitted in the clear. Store hashes instead; and if a user requests a new password, create a new one instead.
Security Flaw #4: Compromised Forever, or How nobody would be able to change their passwords
Lesson 4: Always allow your users to reset their access data if they fear it may have been compromised.
Post Scriptum: The Horrible Homebrew, or Why it may be better to build on well-tested platforms
This brings me to the meta lesson to be learned here – and this tells something about process rather than product. If you set up a system from scratch, be it a conference management system, a shop, a student registration system, whatever, be aware of the many risks this entails, and be sure to have independent and thorough security testing. Using an existing, established, well-tested system instead may lower risk and overall cost, even if it may cost more upfront. When the damage is done, you wish you had decided differently – but then, it may be too late.
Final Lesson: When deciding between building and using a system, consider all risks and associated costs. If you build a new system, thoroughly test it for security. If you use an existing system, be sure it is well tested.