Skip to content

[Decision] The organization administrator's assignment boundary: an assignable set with a wildcard read and no row scope reaches other organizations' SCIM rows in a deployment with no platform baseline #24164

Open

Description

@objectstack-fleet

Filing gate ②: a permission-boundary term only the maintainer can add. Reader who acts: the maintainer, through the director seat's decision batch; then the domain:services seat on #24136, whose gate enforces the term. Filed by the domain:spec seat 2 (seat post #18549) · huangyiirene · session session_01HSDGREvqxQUt7K7pjHXMyC, from the contract review of PR #24163 (#24135), record 6232429140. ⛔ Not a claim.

维护者速读

一句话问题: 您 10 月 17 日裁的 B 让组织管理员可以给本组织成员分配「被组织墙约束的」权限集。但有一类集看上去满足三条件,实际上不受墙约束:带「全对象可读」通配、又没有行级范围的集。在关闭了平台基线集的部署里(fallbackPermissionSet: null,受支持的配置),组织管理员把这样一个集分给成员,成员就能读到其他组织的 SCIM 身份记录(由身份提供方同步进来的用户、组、成员关系),而分配它的组织管理员自己都读不到这些。

已处理的部分: 平台出货的三个 MCP 代理上限集正是这种形状。按您裁决第 4 条的兜底(判不清就列拒绝清单,不放宽规则),它们已在 PR #24163 里进拒绝清单,不需要您裁。

要您裁的部分: 以后自建的同形状集怎么办。推荐 A:给边界加第四条可机器判定的条件,通配读取必须带上平台给这几张表配的行级范围,否则不能由组织管理员分配。实现进 #24136 的闸门,不改 schema,不改今天的产品行为(两张分配表到 #24136 落地前仍只读)。

您要做的(一个动作): 回一个字母(A / B / C / D)。

Governing text

Premises (each with its re-check command, on origin/main)

  1. The seven projection tables are Layer-0-inert: git show origin/main:scripts/platform-object-tenancy-census.json | grep -A3 '"name": "sys_scim_' lists sys_scim_user, sys_scim_subject, sys_scim_projection_grant, sys_scim_identity_tombstone, sys_scim_group, sys_scim_group_member, sys_scim_connection_binding with tenantField: null, reach: out (measured 2026-10-17T09:40Z).
  2. A '*' read reaches them and only a held set's row policy narrows it: git grep -n "scimProjectionRowScope" origin/main -- packages/plugins/plugin-security/src/objects/default-permission-sets.ts (spread into organization_admin, member_default, viewer_readonly, not into the agent ceilings).
  3. No baseline is a supported deployment: git show origin/main:packages/plugins/plugin-security/src/app-default-permission-set.ts | sed -n '38,58p' ("null still means 'no baseline at all' and composes to []").
  4. The assignment right does not exist yet: organization_admin keeps both assignment tables read-only until plugin-security: organisation admins assign positions and permission sets to their own members inside the D12 boundary — gate branch, overrides, explain and my-delegable-scope, three-posture acceptance (ruling B on #23960) #24136 lands (rbac-objects.test.ts:63), so nobody can be hit today.

Options

What it does What a customer sees Workload
A A fourth, declaration-checkable condition: a distributed set whose '*' entry grants read must carry the platform's row scope on every Layer-0-inert object it reaches (today: the scimProjectionRowScope policies on the seven SCIM tables); otherwise it is outside the boundary. An org admin can still assign viewer_readonly and any authored set built the same way; an authored "read everything" set without the carve-outs is refused at assignment with a named reason. domain:services · rides #24136's gate (no extra PR) · precedent: the #20001 spread itself; size not measured
B The org-level assignment right holds only when the platform baseline is composed; under fallbackPermissionSet: null an org admin cannot assign any set with a '*' read. Behaviour of the same Setup button changes with a deployment setting the org admin cannot see. domain:services · rides #24136 · no precedent
C Wall the projection tables themselves: give them an organization dimension (a tenant column, or a resolved connection set), so Layer 0 bounds them for every set. No permission set can expose another organization's SCIM rows, whatever it carries. domain:services + domain:engine · a capability build with a schema change on better-auth-managed tables · no precedent; feasibility not measured
D Accept and document: the ADR states the boundary holds under the platform baseline; nothing enforces it. A no-baseline deployment can leak another organization's identity records through an org admin's assignment. none

Business meaning: A = "only hand out sets whose reach is fenced, and check the fence when you hand it out"; B = "the hand-out right depends on a hidden server setting"; C = "fence the room itself, not each key"; D = "post a warning on the door".

四维分析(从业务立场)

os-decision-facets

Recommendation

A. Fallback: C as the end state, filed as its own capability card when a deployment needs an organization-scoped SCIM directory. Confidence gap: whether any customer deployment runs with fallbackPermissionSet: null is not measured; C's feasibility on better-auth-managed tables is not measured.

只看①选 A;②③④ 是否翻转:否。

After the ruling

Related

#23960 (the ruling) · #24135 / PR #24163 (the ADR amendment; the three agent ceilings go into the ruling's item-4 denylist there) · #24136 (Blocked-by: this card for the gate's fourth condition) · #20001 (the SCIM row scope)

Dedupe

MCP search_issues on objectstack-ai/objectstack, closed included: SCIM projection tables cross organization read wildcard permission set no row scope fallbackPermissionSet null → 15 hits; the first ten read (#20001, #24089, #22278, #22250, #21669, #21079, #20555, #21063, #20136, #16870), all closed, none on this term.


Generated by Claude Code

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

      Milestone

      No milestone

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions