[Owncloud] Cross-site request forgery protection
Frank Karlitschek
frank at owncloud.org
Mon Jun 11 10:52:35 UTC 2012
On 11.06.2012, at 05:15, Matthew Dawson <matthew at mjdsystems.ca> wrote:
> On June 10, 2012 09:44:24 PM Florian RĂ¼chel wrote:
>> Hi Frank,
>>
>> I thought about CSRF protection and the general idea already stands. We
>> should now figure out how we want to have it implemented and then I will
>> start working on it.
>>
>> What we need for it would first be a good PRNG (pseudo random number
>> generator). I dug up some code from here:
>> http://forums.thedailywtf.com/forums/t/16453.aspx
>> I looked through it and it seems like a reasonable approach though its
>> fallback is silent and we should think about any kind of user
>> notification or removing the fallback. The important thing here is the
>> seed and this needs to be as random as possible and no microtime or PID
>> stuff will be random enough.
> Hmm ... Well I agree better stronger seeds are good, microtime + PID is pretty difficult to guess. Especially if you stick a lockout system on it, there is probably enough entropy. I don't think that fallback is a weakness. If a user wishes to audit their setup, a page could be created.
>
>> The solution basically tries:
>> - OpenSSL (very good!)
>> - /dev/urandom (nice one as long as the maintainers keep it random,
>> Debian already did screw up, but random enough for our needs, Unix only
>> though)
> As far as I remember, /dev/urandom wasn't broken, but openssl. /dev/urandom's only issue is that the entropy is not checked. For better random numbers, /dev/random is the place to look. And by itself, /dev/urandom is good enough for our needs as its not a PRNG, it instead uses randomness induced by the computer (thinks like hard drive speeds, which deviate based upon the head's location.)
>
>> - CAPICOM (Windows, uses CryptoAPI, also not bad if we are on Windows)
>> - Fallback to crappy microtime stuff
>>
>> So by this we get a rood new random number for the seed which will then
>> be used by the wrapper for PHPs random function. I stuffed this into the
>> OC_Util class but we could also think of some place else.
>>
>> The next thing will now be the question of how to keep track of the
>> tokens generated. The general suggestion here that keeps balance between
>> usability and security is a per-session token. My knowledge on the
>> database and such is limited so I need to know where we could store such
>> session information.
> Those can be stored in PHP's session system ($_SESSION). Frank already implemented two functions doing this. The only difficulty I see is that the session state space explodes with several calls.
I added a simple garbage collector to the call. I think this should solve the problem for now.
> PHP's session system doesn't send the stored values over HTTP, so it should be secure enough for our uses.
>
>>
>> Then I will create simple functions allowing for a token check and of
>> course the generation. Also a wrapper will be useful that inserts a form
>> element (so that does not get passed to the user).
> There are a couple of ideas/function kicking around in this thread.
>
>>
>> Another thing that needs to be discussed is in which way we want to
>> inform developers about the existence (and importance) of such tokens,
>> i.e. if noone knows about them we did not fix anything.
>>
>> The basic approach would be to write a good documentation and just leave
>> it to the developers.
>> Another approach would be to fail any requests if neither a token was
>> added nor was the request marked is non-critical (in some way).
>> I leave that decision up to you guys, I have a hard time deciding for
>> either solution but I guess for compatibility you should just take the
>> first approach and just spread the word.
> This is why I suggested the referrer check. Then if a developer doesn't know/ignores this issue, the user does get some protection. I think it should be up to the developer to implement, but it should be as easy as possible to do so.
>
> Matthew
It would be great if developers try the 2 functions and see if it works. Then we have to port all the important calls to it.
We also have to backport it to the stable4 branch because this is a security issue.
Frank
More information about the Owncloud
mailing list