----- "Andreas Jonsson" <[email protected]> wrote:

> The work on the new right manager user interface looks very
> promising.
> Good work!
> 
> But I also think that the underlying security model must urgently be
> revised.
> 
> Although I must say that I love the idea that the users can write
> their own applications on top of XWiki, the current security just
> doesn't support this.
> 
> When executing a script, who should be held accountable for the
> actions are taken by the script?
> 
> In traditional operating systems, a user is expected to know and
> trust
> the programs that he or she chooses to run.  Considering how much
> problems there are with "viruses" I'd say that this security model
> works badly in traditional environments.
> 
> But in a wiki, scripts are executed at any page load.  A user who
> casually browse the wiki cannot know when and what scripts are
> executed.  Thus, it is a complete disaster to use a security model
> where the users are held accountable for whatever actions the script
> is doing.
> 
> For instance, to take over a wiki that is open for anonymous
> commenting, just post a script that sits and waits for a user with
> admin or programming rights to view the page.
> 
> How can the security model be fixed?
> 
> There are two roles that should be considered involved in the
> execution of a script: user and programmer.  Both the programmer and
> the user should be held accountable for whatever actions are taken by
> the script, but neither trust the other.  The programmer says "go
> ahead and run this script, but you wont be able to do anything that
> you don't already have rights to".  The user says "sure, I'll go
> ahead
> and run your script, but I don't give you any rights that you don't
> already have."
> 
> Hence, a script should be executed with the intersection of the
> rights that the two roles possess.
> 
> But it should be possible for a programmer that have carefully
> sanitized the user input to lend his or hers full privileges to the
> user.
> 
> It should also be possible for users to indicate that they have
> reviewed a script and indicate that they trust a certain scripts or
> that they trust some programmer.  In other words, the users should be
> able to lend their full rights to a particular script or to scripts
> written by a trusted programmer, when executed by the user.
> 
> What about contents that is generated by a script?
> 
> If the user who runs a script becomes the programmer of any scripts
> that are generated and saved, we have just added one level of
> indirection for attackers: An anonymous commenter could post a script
> that waits for an administrator.  This script should in turn post a
> script (whos programmer would then be the administrator) that waits
> for an administrator.
> 
> Since both user and programmer should be held accountable for the
> actions taken by a script, it might be reasonable that they are also
> both credited for any contents generated by the script.  Thus both
> the
> user and the programmer could be considered "the programmer" for any
> new scripts generated by a script.  But this might be unnecessarily
> complex.
> 
> Instead, a distninction could be made on documents that is "saved
> with a programmer set" and those that are not.  When rendering a
> document
> that does not have a programmer, all rights should be denied for
> scripts in the document.  Saving a document with yourself as "the
> programmer" must not be allowed without first prompting the user for
> a
> confirmation, where the user must input a password.  This to prevent
> attacks where the user is tricked into saving content with to the
> programmer set.
> 
> How can this be implemented in XWiki?
> 
> A document has a "creator", which is the person who saved the first
> revision of the document and each revision of the document has an
> "author", which is the person who saved the revision.  We have to
> extend the document format to support a "programmer".
> 
> "The user" is of course the logged in user that requests the page.
> The user is authenticated the ordinary way and both programmer (if
> any) and user is noted in the context.  Thereafter any rights check
> is
> made by checking if both user and programmer has the right.  If there
> is no programmer, all right checks should return "deny", except maybe
> for the "view"-right that should be checked against the user to allow
> the include macro without saving with a programmer.  (But this opens
> up for an attack where page content which aren't viewable by everyone
> can be extracted, so maybe not.  It could be a configurable option.)
> 
> Obviously, it is important that comments to a page are not rendered
> with a programmer set.  This will make it impossible to execute
> privileged scripts in comments.  I don't think that is a useful
> feature, anyway.
> 
> This will also require some additional user interaction.  The default
> should be to not set any programmer when saving a document, and this
> will of course not require anything special from the user.
> 
> But when saving a page, it should be possible to select "save with me
> set to the programmer".  If the user chooses this option, she will be
> forwarded to a confirmation page "You are about to save this content
> with you set to the programmer.  Please confirm by entering your save
> password."
> 
> It should also be possible to select "save with me as programmer and
> lend my rights to users executing scripts in this page", whereupon
> the
> confirmation page should be marked with a big warning sign and
> contain
> a harsh lecture on sanitizing user input.  It might be a good idea to
> introduce a special "save setuid" right that the user must have in
> order to at all be allowed to do this.  A user that have programming
> rights should additionally have the option to set the programmer to
> an
> arbitrary user.  A setuid script should, of course, have a programmer
> with as little privileges as possible.  A set of dummy users with
> varying privileges could be prepared for this purpose.
> 
> In order to allow saving documents with "the programmer" set in bulk
> (for instance in the import application), there should also be a
> confirmation page for allowing "saving with programmer set"
> throughout
> a request.
> 
> Is this sufficient?
> 
> Maybe.  We have at least made it a lot harder for attackers, because
> now they must trick a privileged user to confirm a "save with myself
> as programmer".  If the same password is used for saving pages as for
> logging in, this can be accomplished by spoofing a login-page.  Thus,
> there should be a separate "save password" which must differ from the
> ordinary login password.
> 
> It might even be possible to allow users to save javascript
> extensions.  But there should at least be a configurable option to
> demand programming rights for this.  Javascripts opens up many
> attack paths.
> 
> Tasks:
> 
> 1. Add "programmer" attribute to document.

It could be a 'XWiki.ProgramClass' object (to be discussed)

> 
> 2. Add "execute scripts with the programmers privilege (setuid)"-flag
>     to document.

Same, could be a property of said object

> 
> 3. Change the RightService to:
> 
>     1. if a programmer is not set, deny everything except "view",
> which
>        (as a configurable wiki option) can be checked only for the
> user
>        (to allow using the include macro without saving with a
>        programmer),
> 
>     2. check rights only for the programmer, if the setuid-flag is
> set,
> 
>     3. check rights only for user, if the programmer is "trusted" or
>        the user "trusts" the document,
> 
>     4. check rights for both user and programmer, otherwise.
> 
>     Although the current right service implementation can be kludged
>     into supporting this, it really needs to be rewritten from
> scratch,
>     both for clarity and speed.
> 
>     The special treatment when the document author happens to have
>     programming rights must be removed.
> 
>     How to determine if a programmer or the document is "trusted" is
> an
>     open question, but I guess that users with programming or admin
>     rights, at least, can be considered trusted.
> 
> 4. Add "save password" to the user profile, which must be set to a
>     non-empty string that differs from the login password for the
> user
>     to be allowed to "save with myself as programmer" or "save
> setuid".
> 
> 5. Add user interface controls for saving a page with programmer set.
> 
> 6. Add confirmation page for confirming "save with myself as
>     programmer".
> 
> 7. Add user interface controls and confirmation page for "save
> setuid".
> 
> 8. Add wiki-option to demand programming rights for saving javascript
>     extensions.

FYI it's already the case of "always-use" extensions. (Same for CSS extensions)

> 
> 9. Fix all applications that undoubtly will be broken by this change.

The changes listed here are not really backward compatible, so it will be a 
necessary way anyway, in order to have an application that make use of the 
programming right in a working state with a new security model.

> 
> Do you other people agree with me when I say that the security model
> must be replaced immediately?  What do you think about my suggestion?
> Please, poke at it to try to find any attacks that I have not
> thought of.

I'm very +1 to fix the programming right immediately (by that I mean for 
programmers to declare a page that require to be executed with the programming 
right).

For the rest of the proposal, I have to think more about it before I make my 
mind. Anyway I think we can improve the security model incrementally - of 
course the sooner the better.

> 
> I have started on a new right service implementation with a
> cacheing front-end.  I'll create a new module under core which I'll
> call 'xwiki-security' and move the right service to the new
> architecture while I'm at it.

That's great.  Don't hesitate to commit it early in the sandbox so that 
everyone can look at it.

Jerome.

> 
> 
> Best regards,
> 
> Andreas Jonsson
> 
> _______________________________________________
> 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