Hi Alex,

Alex Busenius wrote:
> On 03/18/2010 05:57 AM, Caleb James DeLisle wrote:
>> This message seems to have disappeared, resending...
>>
>> Alex Busenius wrote:
>>> On 03/16/2010 10:23 AM, Caleb James DeLisle wrote:
>>>> Marius Dumitru Florea wrote:
>>>>> Hi Caleb,
>>>>>
>>>>> Caleb James DeLisle wrote:
>>>>>> I don't want this proposal to die because of unnecessary noise which I 
>>>>>> introduced,
>>>>>> I have thought about it and I am in agreement with the general idea of 
>>>>>> sending the user a hash which
>>>>>> must be returned with the post in order for the data to be saved.
>>>>>>
>>>>>> I don't like adding code to xwiki-core so I suggest this be made into a 
>>>>>> component.
>>>>>> We would need 2 functions:
>>>>>> String getToken()
>>>>>> boolean isTokenValid(String token)
>>>>>>
>>>>>> getToken uses org.xwiki.bridge.DocumentAccessBridge.getCurrentUser() to 
>>>>>> get the user who called it
>>>>>> and the user name is stored in a HashMap of <String, String> with a 
>>>>>> random string of text.
>>>>>>
>>>>>> If getToken finds a token already in the map, it returns that token (so 
>>>>>> it may be called multiple times
>>>>>> in the generation of a page)
>>>>> So the token is the same for consecutive (GET) requests coming from the 
>>>>> same user?
>>>>>
>>>>>> isTokenValid checks the current user against the token then removes the 
>>>>>> entry from the HashMap so the token
>>>>>> may not be reused.
>>>>> What happens if the user opens in edit mode two different pages? Isn't 
>>>>> the second save invalidated by the first save?
>>>> Good point I missed. I would have to have a script to disable such an 
>>>> onerous 'feature' :)
>>>> I guess it will only work if a single number is valid basically forever. I 
>>>> wish components had access to the
>>>> Request, Response and Session so it could expire on logout.
>>> What if this map would store a mapping (user + url) -> token,
>> URL sounds like a good idea, what are the chances that a user will be 
>> editing the same page in 2 windows? Even if
>> they are, editing the same page will cause past changes to be lost. Perhaps 
>> if the token fails they should get a
>> page with a warning message and an opportunity to save anyway.
> 

> Editing the same page in two windows is probably not common, but the
> behavior would change. Currently, both saves work and _both_ are
> recorded in the history in the order they were saved. With the tokens
> the editor that was opened first would get an access denied on save, and
> the one opened last would work.
> I'm not sure how we can go back to editor and refresh only the token but
> leave the modified text. And the natural reaction of a user would
> probably be to hit the back button in browser, which would restore the
> editor page with the invalid token.

Maybe we can return the user to the edit page with a _new_ token and the 
submitted content when the received token is invalid, asking the user 
for a confirmation and explaining her/him why the confirmation is 
needed. This way the user can retry saving the content (this step can 
repeat over and over if "she/he" keeps opening other tabs and saving the 
page there instead) or continue editing.

Does this still prevent the attack?

Thanks,
Marius

> 
>> We can compare the URL to the referrer header which makes life easy (we 
>> would need access to the request but I
>> think this is coming soon.)
>>
> True, once we have access to the request we could easily add referrer
> header checking.
> 
>>> or (user +
>>> reason) -> token, where "reason" would be some description of the
>>> intended change like "edit:Main.Test" or "rights:SomeUser+comment-edit"?
>> This idea sounds like it would require a lot of extra infrastructure, maybe 
>> I am not seeing it right.
> 
> No, the "reason" would contain only the important part of the things
> that are currently usually in the URL, like document name and action.
> From the viewpoint of token component the exact content doesn't matter,
> it should just contain enough information to differentiate editing of
> different things.
> 
> The reason for this idea is that we would need to give the same URL to
> both getToken and isTokenValid as an argument, but those methods are
> usually called from totally different places. So I think it is easier to
> give the (somewhat simplified) reason instead of trying to come up with
> the same URL after several redirects.
> 
> For example, URLS for editing and deleting a page clearly differ in the
> action part (/delete/Main/WebHome vs. /save/Main/Webhome), but most
> administrative tasks go to /admin/XWiki/XWikiPreferences, are redirected
> to saverights.vm and only differ in the query part of the URL. Pages can
> also be edited over /preview/... with correct parameters. Changing
> access rights sometimes use /save/... as URL, etc.
> 
> WDYT?
> 
> 
> Alex
> 
>>> getToken would return different tokens for different pages/"reasons" and
>>> isTokenValid would need to provide the same url/"reason" for check to
>>> succeed.
>>>
>>>
>>>> Caleb
>>>>
>>>>> Thanks,
>>>>> Marius
>>>>>
>>>>>> If a configuration parameter is specified to disable the component, 
>>>>>> getToken returns "" and isTokenValid
>>>>>> returns true.
>>>>>>
>>>>>> WDYT?
>>>>>>
>>>>>> Caleb
>>>>>>
>>>>>>
>>>>>> Caleb James DeLisle wrote:
>>>>>>> Sergiu Dumitriu wrote:
>>>>>>>> On 03/10/2010 07:44 PM, Caleb James DeLisle wrote:
>>>>>>>>> Take a look at the "sammy is my hero" worm, myspace sent a hash to 
>>>>>>>>> the user like the one you propose,
>>>>>>>>> the worm made the required get request to get the hash, then made the 
>>>>>>>>> post along with the hash.
>>>>>>>>> What prevents javascript from opening the page with the hash in an 
>>>>>>>>> iframe and then reading in the iframe
>>>>>>>>> to get the hash, then creating a form with the required data and 
>>>>>>>>> posting it to the save action?
>>>>>>>>>
>>>>>>>>> If we were to combine a requirement for post requests with checking 
>>>>>>>>> of the referrer header, then we
>>>>>>>>> would block links, forms and javascript based attacks leaving only an 
>>>>>>>>> attack through older versions
>>>>>>>>> of flash which support referrer forgery and at this point the 
>>>>>>>>> difficulty of the attack becomes such that
>>>>>>>>> we need to consider a wider array of attack vectors.
>>>>>>>> Sammy also required that XSS is enabled.
>>>>>>>>
>>>>>>>> Protecting from attacks originating in the wiki is kind of impossible 
>>>>>>>> at 
>>>>>>>> the moment, since JS can be inserted anywhere, and there's no (nice) 
>>>>>>>> way 
>>>>>>>> to prevent attacks from JS inside the application. As long as JS can 
>>>>>>>> be 
>>>>>>>> inserted, an attacker can do all the steps that the client would do to 
>>>>>>>> perform an action.
>>>>>>>>
>>>>>>>> The secret token works as a prevention mechanism when the attack comes 
>>>>>>>> from another site because the browser security model prevents the 
>>>>>>>> attack 
>>>>>>>> code to read the form.
>>>>>>> I just did a few tests on iframes and I was wrong, they do have good 
>>>>>>> same origin policy.
>>>>>>>
>>>>>>> Caleb
>>>>>>>
>>>>>>>>> Caleb
>>>>>>>>>
>>>>>>>>>
>>>>>>>>> Alex Busenius wrote:
>>>>>>>>>> Unfortunately, using POST requests instead of GET requests is not
>>>>>>>>>> enough. It will not prevent attacks that use forms and/or JavaScript 
>>>>>>>>>> to
>>>>>>>>>> generate POST requests.
>>>>>>>>>>
>>>>>>>>>> Alex
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>> On 03/09/2010 02:48 PM, Caleb James DeLisle wrote:
>>>>>>>>>>> I had thought about proposing this myself but decided against it 
>>>>>>>>>>> because it seems
>>>>>>>>>>> to me like a workaround for problems which can be solved in other 
>>>>>>>>>>> ways.
>>>>>>>>>>>
>>>>>>>>>>> Suppose we were to add a check to the actions which alter data 
>>>>>>>>>>> which made sure the request method
>>>>>>>>>>> was 'post' and made it configurable in one of the configuration 
>>>>>>>>>>> files? We would have
>>>>>>>>>>> to look over the default skins for incorrect links and leave the 
>>>>>>>>>>> configuration
>>>>>>>>>>> option off by default for backward compatibility at least until the 
>>>>>>>>>>> next major version
>>>>>>>>>>> but we could provide wiki operators the ability to prevent CSRF.
>>>>>>>>>>>
>>>>>>>>>>> Caleb
>>>>>>>>>>>
>>>>>>>>>> _______________________________________________
>>>>>>>>>> devs mailing list
>>>>>>>>>> [email protected]
>>>>>>>>>> http://lists.xwiki.org/mailman/listinfo/devs
>>>>>>>>>>
> _______________________________________________
> devs mailing list
> [email protected]
> http://lists.xwiki.org/mailman/listinfo/devs
_______________________________________________
devs mailing list
[email protected]
http://lists.xwiki.org/mailman/listinfo/devs

Reply via email to