You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
security: the effective permission map folds a super-user '*' over the same set's narrower explicit entries — a walled org admin gets can('sys_position','edit') true where enforcement refuses #20136
Filing gate: ① a defect with a named landing site: packages/core/src/security/effective-object-permissions.ts, foldWildcardSuperUser, which buildEffectiveObjectPermissions calls. Finding class (a), and (b) as well: its docblock states "folding it here is exactly as broad as real enforcement — never broader".
The domain:engine execution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) filed this from its #20083 dev's out-of-scope findings (os-dev-report on #20083, PR #20132). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.
What happens
Measured by the #20083 dev, identically at origin/main7b27bd00c7 and at PR #20132's head, on a unit fixture and on a booted showcase:
For a walled organization_admin (+ member_default), the map grants create / edit / delete / import on sys_position, sys_permission_set, sys_position_permission_set, sys_user_permission_set and sys_user_position, and edit on sys_organization.
PermissionEvaluator.checkObjectPermission refuses those cells: the set names those objects explicitly and narrower, and resolveObjectPermission answers a set with its explicit entry.
38 over-granted cells in total.
foldWildcardSuperUser folds the merged '*' bypass bits into entries the super-user set itself names narrower.
Reach (measured): on the write path PR #20079 (#18783) wired, an option gated on current_user.can('sys_position', 'edit') is ADMITTED for that subject. That fails OPEN. The same map serves /auth/me/permissions, so a client's can() shows controls the server then refuses. PR #20079 is not in a release yet (its changeset is pending), so no released version carries the write-path half.
Suggested shape (⛔ not a ruling)
Fold a super-user wildcard into an entry only where resolveObjectPermission would. A set's own explicit entry is its whole answer for that set. Another set's super-user wildcard may still widen it bit by bit, matching checkObjectPermission.
Filing gate: ① a defect with a named landing site:
packages/core/src/security/effective-object-permissions.ts,foldWildcardSuperUser, whichbuildEffectiveObjectPermissionscalls. Finding class (a), and (b) as well: its docblock states "folding it here is exactly as broad as real enforcement — never broader".The
domain:engineexecution seat 1 (session_01Bvd69VPa6puiNzzPUroDBx) filed this from its #20083 dev's out-of-scope findings (os-dev-reporton #20083, PR #20132). ⛔ Filed bare: routing and grading are triage's. ⛔ Not a claim.What happens
Measured by the #20083 dev, identically at
origin/main7b27bd00c7and at PR #20132's head, on a unit fixture and on a booted showcase:organization_admin(+member_default), the map grants create / edit / delete / import onsys_position,sys_permission_set,sys_position_permission_set,sys_user_permission_setandsys_user_position, and edit onsys_organization.PermissionEvaluator.checkObjectPermissionrefuses those cells: the set names those objects explicitly and narrower, andresolveObjectPermissionanswers a set with its explicit entry.foldWildcardSuperUserfolds the merged'*'bypass bits into entries the super-user set itself names narrower.Reach (measured): on the write path PR #20079 (#18783) wired, an option gated on
current_user.can('sys_position', 'edit')is ADMITTED for that subject. That fails OPEN. The same map serves/auth/me/permissions, so a client'scan()shows controls the server then refuses. PR #20079 is not in a release yet (its changeset is pending), so no released version carries the write-path half.Suggested shape (⛔ not a ruling)
resolveObjectPermissionwould. A set's own explicit entry is its whole answer for that set. Another set's super-user wildcard may still widen it bit by bit, matchingcheckObjectPermission.*grant, so current_user.can() agrees with checkObjectPermission for a wall-less org admin (#20083) #20132's table-driven parity pin (map againstcheckObjectPermission, all 10 verbs) to the walledorganization_adminandadmin_full_accesssubjects, with 0 over-granted cells as the assertion.Filing-gate answers
'*'grant, socurrent_user.can()answers false where enforcement answers true (wall-less org admins) #20083 dev.domain:engine, the owner ofpackages/core's producer). It is sequenced after PR fix(core): the effective object-permission map covers a plain*grant, so current_user.can() agrees with checkObjectPermission for a wall-less org admin (#20083) #20132 (security: the effective object-permission map omits objects covered only by a plain'*'grant, socurrent_user.can()answers false where enforcement answers true (wall-less org admins) #20083), which edits the same producer. That is a region order, not aBlocked-by:.closedincluded:effective object permissions super-user wildcard fold over-grants explicit entry same set organization_admin sys_position edit→ 20 hits, top 8 read. security: the effective object-permission map omits objects covered only by a plain'*'grant, socurrent_user.can()answers false where enforcement answers true (wall-less org admins) #20083 is the under-grant twin (the positive control). finding(plugin-hono-server): /auth/me/permissions never seeds an unrestricted object for a wildcard-only principal, so the Console renders Export where the server answers 403 EXPORT_NOT_PERMITTED #18931 (closed) is the super-user seeding for Export. [finding] grantsObjectAccess claims to mirror checkObjectPermission but omits allowTransfer AND allowExport, so an export-only or transfer-only grant reads as no object-level CRUD #19515 (closed) isgrantsObjectAccessomitting transfer and export, a different function.Dedupe words:
foldWildcardSuperUser explicit deny same set·organization_admin can sys_position edit·effective map super-user fold over-grant