I've just read on the net about a newly discovered security vulnerability in ASP.NET. You can read the details here.
The problem lies in the way that ASP.NET implements the AES encryption algorithm to protect the integrity of the cookies these applications generate to store information during user sessions.
This is a bit vague, but here is a more frightening part:
The first stage of the attack takes a few thousand requests, but once it succeeds and the attacker gets the secret keys, it's totally stealthy.The cryptographic knowledge required is very basic.
All in all, I'm not familiar enough with the security/cryptograpy subject to know if this is really that serious.
So, should all ASP.NET developers fear this technique that can own any ASP.NET website in seconds or what?
How does this issue affect the average ASP.NET developer? Does it affect us at all? In real life, what are the consequences of this vulnerability? And, finally: is there some workaround that prevents this vulnerability?
Thanks for your answers!
So, this is basically a "padding oracle" type of attack. @Sri provided a great explanation about what does this type of attack mean. Here is a shocking video about the issue!
About the seriousness of this vulnerability: Yes, it is indeed serious. It lets the attacker to get to know the machine key of an application. Thus, he can do some very unwanted things.
Here is a bunch of good practices I got that don't solve the issue but help improve the general security of a web application.
Now, let's focus on this issue.
The solution
Application_Error
or Error.aspx
put some code that makes a random delay. (Generate a random number, and use Thread.Sleep to sleep for that long.) This will make it impossible for the attacker to decide what exactly happened on your server.Some other thoughts
Thanks to everyone who answered my question. I learned a lot about not only this issue, but web security in general. I marked @Mikael's answer as accepted, but the other answers are also very useful.
[Update 2010-09-29]
KB Article with reference to the fix
ScottGu has links for the downloads
[Update 2010-09-25]
While we are waiting for the fix, yesterday ScottGu postet an update on how to add an extra step to protect your sites with a custom URLScan rule.
Additionally add a random time sleep in the error page to prevent the attacker from timing the responses for added attack information.
In web.config
<configuration>
<location allowOverride="false">
<system.web>
<customErrors mode="On" defaultRedirect="~/error.html" />
</system.web>
</location>
</configuration>
This will redirect any error to a custom page returned with a 200 status code. This way an attacker cannot look at the error code or error information for information needed for further attacks.
It is also safe to set customErrors mode="RemoteOnly"
, as this will redirect "real" clients. Only browsing from localhost will show internal .Net errors.
The important part is to make sure that all errors are configured to return the same error page. This requires you to explicitly set the defaultRedirect
attribute on the <customErrors>
section and ensure that no per-status codes are set.
If an attacker manage to use the mentioned exploit, he/she can download internal files from within your web application. Typically web.config is a target and may contain sensitive information like login information in a database connection string, or even link to an automouted sql-express database which you don't want someone to get hold of. But if you are following best practice you use Protected Configuration to encrypt all sensitive data in your web.config.
Read Microsoft's official comment about the vulnerability at http://www.microsoft.com/technet/security/advisory/2416728.mspx. Specifically the "Workaround" part for implementation details on this issue.
Also some information on ScottGu's blog, including a script to find vulnerable ASP.Net apps on your web server.
For an explanation on "Understanding Padding Oracle Attacks", read @sri's answer.
Comments to the article:
The attack that Rizzo and Duong have implemented against ASP.NET apps requires that the crypto implementation on the Web site have an oracle that, when sent ciphertext, will not only decrypt the text but give the sender a message about whether the padding in the ciphertext is valid.
If the padding is invalid, the error message that the sender gets will give him some information about the way that the site's decryption process works.
In order for the attack to work the following must be true:
So, if you return human readable error messages in your app like "Something went wrong, please try again" then you should be pretty safe. Reading a bit on the comments on the article also gives valuable information.
That way a hijacked cookie can only be used to retrieve a session which most likely is no longer present or invalidated.
It will be interesting to see what is actually presented at the Ekoparty conference, but right now I'm not too worried about this vulnerability.