T09 · Insecure Skill Coding Practices
- Location
SKILL.md:415- Finding
Globally Scoped ACL Template Grants Unrestricted CRUD Access
- Content
View full analysis
Vulnerability Details
File Location:
SKILL.md, lines 415–424
Vulnerability Type: Globally scoped access-control entry with full permissions
Risk Level: HighVulnerable Code
csv id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_my_model_user,my.model.user,model_my_model,base.group_user,1,1,1,1 access_my_model_manager,my.model.manager,model_my_model,,1,1,1,1The accompanying guidance states that an empty group applies to all users:
text - Empty = all usersTechnical Analysis
The
access_my_model_managerentry leavesgroup_idempty while enabling read, write, create, and delete permissions. In Odoo, an ACL without a group is globally applicable. ACL permissions are additive, so the group-restricted entry above it does not limit or override this unrestricted entry.If a generated module adopts this template, every user able to access the model—including portal or public users where the deployment exposes applicable model or controller endpoints—may receive all four CRUD permissions. The entry's
managername does not impose a manager restriction; only an actual group reference would do so.Attack Path
- A developer copies the documented ACL template into an Odoo module.
- The module is installed with the blank-group ACL enabled.
- An unauthenticated, portal, or low-privilege user reaches an RPC, controller, or other exposed endpoint that operates on
my.model. - Odoo evaluates the global ACL and grants read, write, create, and delete access.
- The attacker enumerates, inserts, changes, or deletes model records, subject only to any separately configured record rules.
- If no restrictive record rules exist, the granted access applies across all records in the model.
Impact Assessment
Successful exploitation can permit unauthorized disclosure, creation, alteration, and deletion of all records in the affected model. The ...[truncated 479 chars]
- Remediation
View remediation
Remediation Suggestions
-
Replace the empty
group_idwith a dedicated manager group:csv id,name,model_id:id,group_id:id,perm_read,perm_write,perm_create,perm_unlink access_my_model_user,my.model.user,model_my_model,base.group_user,1,1,1,0 access_my_model_manager,my.model.manager,model_my_model,my_module.group_my_model_manager,1,1,1,1 -
Define
my_module.group_my_model_managerexplicitly and assign it only to authorized personnel. -
Default destructive permissions such as
perm_unlinkto0for ordinary users. -
Add record rules that constrain users to records they own or are authorized to manage.
-
Do not assign model ACLs to
base.group_publicorbase.group_portalunless public or portal access is an explicit, reviewed requirement. -
Add automated authorization tests covering anonymous, portal, internal-user, manager, and administrator contexts.
-
Update the documentation to warn that blank-group ACLs are global and should not be presented as a manager-access example.
-
