Carbon: a direct grant to a never-seen Steam id leaks onto every never-seen id #32
Reference in New Issue
Block a user
No description provided.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Found during the PLAN_REDESIGNS §11.3 Backpacks spike (2026-10-12) on
rust-carbon(Carbon 2.0.262, Rust 25877464). Oxide 2.0.7826 on the same Rust build behaves differently.What happens
On Carbon,
permission.GrantUserPermission(id, perm, null)for a Steam id the store has no user record for (a player who has never connected to that server) does not create a record for that id. The grant goes into a record that every unknown id shares. After that, every never-seen id reports holding the permission:Those two permissions had been granted to other never-seen ids (stand-ins 51 and 21). Revoking them from one unknown id cleared them for all of them (
rgb.cleanup→ id 77 then held[]).Oxide creates a real record for the id instead (
GetUserDatamakes one), and nothing leaks.Why it matters to the bridge
perm.sync'sEnsureGrant(overlay/oxide/plugins/RunicGateway.cs~4710) grants directly to a Steam id, and the site (D160) can push grants for linked players who have never joined that server: kit entitlements (rust_perm_run_grants), and soon the §11.3 backpack size lease. The comment at ~3539 says a direct grant "would have reached them immediately". That holds on Oxide. On Carbon, as far as I can tell:HoldsDirectlyusesGetPermissionUsers(perm), which probably does not list the id, so the op is reportednotLanded(honest, but a re-push repeats it forever);UserHasPermission(perm) == truefor anything granted this way. Any plugin that checks a permission for a player before their record exists (first-connect hooks) would see a grant that isn't theirs;Not yet checked: whether
GetPermissionUserslists the id on Carbon, whetherAddUserGroupleaks the same way (the bridge already treats a never-seen member aspending), and what a first connection does with the shared record.Repro
Spike plugin
RgBackpackSpike.cs(scratch, never shipped):rgb.perm <i> <perm>grants to76561199910000000+iwith no player;rgb.who <i>printsGetUserGroups,GetUserPermissionsandUserHasPermission. Grant to one unused id, thenwhoanother unused id.Likely fix direction (not decided): treat a direct grant to an id the Carbon store has no record for like a group membership: report it
pendingand land it on the first connection. Or checkpermission.UserExists(id)first on both frameworks.Left for later, at the org lead's call (2026-10-12). Kept out of §11.3.
AI-assisted: found and written up by Claude Code (Claude Opus 5.5).