SEC2-005: Sharing refuses deactivated accounts, but giving a record, group membership and plugin access rules accept them #947
Labels
No labels
accessibility
authentication
breaking change
bug
documentation
enhancement
interface
internationalisation
observability
performance
security
tier
1
tier
2
tier
3
tier/4
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set
Reference
Postulo/postulo#947
Loading…
Reference in a new issue
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 on 2026-10-16 in a read-only security review of
postuloat56fc9d531, checked by a second, independent pass.Severity: Informational · Category: Business Logic · Reference: CWE-284 (Improper Access Control); OWASP A01:2021 (Broken Access Control)
Location:
src/postulo/jobs/share_views.py:138-142(MoveView.principal_from)src/postulo/core/views_access.py:90-98(GroupsView.post),:190-206(PluginAccessView._add)Issue
grantee_fromfiltersis_active=True, so a share can never be made towards a deactivated account. The other three places that name an account as a principal do not:A record given to a deactivated account is reachable by nobody until the account is reactivated (the operator can still reach it with
everyone=True). A deactivated member kept in a group regains every group record, and every share the group holds, the moment they are reactivated, without any administrator deciding that again.Impact
Operational rather than exploitable: records can be parked on an account nobody can sign into, and reactivation silently restores access that the people sharing with the group may have assumed ended with the deactivation.
PersonActiveViewsays "nothing deleted, no sign-in", which is accurate but does not mention memberships and shares.Fix
Filter
is_active=TrueinMoveView.principal_from, the one place a record can be made unreachable. On the groups page, draw inactive accounts greyed with a note rather than excluding them: keeping a deactivated member in a group is consistent with "nothing deleted" and should stay. ExtendPersonActiveView's success message to say that group memberships and shares are kept. Done when a test asserts a superuser cannot give a record to a deactivated username and the groups page marks an inactive member as such.Related
#575 (closed) - a deactivated account kept receiving reminders, webhooks and syncs; about outbound side effects, not about being a principal.