[Security follow-up] Implement forced password change with a complete recovery flow #22

Open
opened 2026-09-08 01:06:25 +02:00 by zemion · 1 comment
Owner

Review found password_reset_required is advisory metadata only. The implementation and UI already expose that limitation; authentication-field docs were corrected during the audit. Do not enforce the flag in isolation and lock users out. Implement an end-to-end local-password change/recovery workflow with current-password or bounded recovery authorization, session rotation/revocation, audit evidence without secrets, initial-password restrictions, and provider-specific rules for external authentication. Include first-login, lost-password, concurrent-session and abuse/rate-limit tests; define recovery policy explicitly before enabling it. Priority: security follow-up.

Source review and coordinated status: GovOPlaN/govoplan-core#296 .

Review found password_reset_required is advisory metadata only. The implementation and UI already expose that limitation; authentication-field docs were corrected during the audit. Do not enforce the flag in isolation and lock users out. Implement an end-to-end local-password change/recovery workflow with current-password or bounded recovery authorization, session rotation/revocation, audit evidence without secrets, initial-password restrictions, and provider-specific rules for external authentication. Include first-login, lost-password, concurrent-session and abuse/rate-limit tests; define recovery policy explicitly before enabling it. Priority: security follow-up. Source review and coordinated status: https://git.add-ideas.de/GovOPlaN/govoplan-core/issues/296 .
Author
Owner

Implementation is complete and published in govoplan-access 7eb67b9fa73b, with the optional auth-action/required-action contract in govoplan-core dc1f244f1745.

Current-password change and administrator-assisted single-use recovery implement session/CSRF rotation, cross-tenant session/human-key revocation, secret-free validation/audit evidence, required-action restrictions and external-provider/service-account separation. Issuance requires a current local System owner, their current password and explicit external identity verification. Hashed codes expire after 15 minutes; redemption rechecks current target and issuer authority. Password changes also invalidate outstanding codes issued to other accounts.

Verification includes 17 browser cases, EN/DE F1 help, first-login/lost-password/rate-limit tests, real PostgreSQL redemption/session/issuance/issuer-revocation races, and the full Access suite: 122 tests plus 18 subtests, with no PostgreSQL skips. Temporary fixtures were stopped and removed.

Keeping this open as implementation-complete, adoption pending. The issue explicitly requires defining recovery policy before enabling it. AUTH_LOCAL_PASSWORD_RECOVERY_ENABLED remains false; while disabled the old required-change flag is advisory and self-service change still works. Identity-verification responsibility, confidential code handover and administrator availability still need explicit organizational approval, plus target first-login/recovery checks and normal migration planning. No approval, automated email recovery, or live password reset is inferred from this source push.

Full implementation, verification and remaining adoption gates. Source main was pushed and read back at its exact commit; existing remote tag inventories were verified unchanged. This is source publication, not a new package/image release or deployment.

Implementation is complete and published in [govoplan-access 7eb67b9fa73b](https://git.add-ideas.de/GovOPlaN/govoplan-access/commit/7eb67b9fa73b70c6c3d74a26020377f996b5970b), with the optional auth-action/required-action contract in [govoplan-core dc1f244f1745](https://git.add-ideas.de/GovOPlaN/govoplan-core/commit/dc1f244f1745d424844ec3c86a6fb1948817b1c5). Current-password change and administrator-assisted single-use recovery implement session/CSRF rotation, cross-tenant session/human-key revocation, secret-free validation/audit evidence, required-action restrictions and external-provider/service-account separation. Issuance requires a current local System owner, their current password and explicit external identity verification. Hashed codes expire after 15 minutes; redemption rechecks current target and issuer authority. Password changes also invalidate outstanding codes issued to other accounts. Verification includes 17 browser cases, EN/DE F1 help, first-login/lost-password/rate-limit tests, real PostgreSQL redemption/session/issuance/issuer-revocation races, and the full Access suite: 122 tests plus 18 subtests, with no PostgreSQL skips. Temporary fixtures were stopped and removed. Keeping this open as implementation-complete, adoption pending. The issue explicitly requires defining recovery policy before enabling it. AUTH_LOCAL_PASSWORD_RECOVERY_ENABLED remains false; while disabled the old required-change flag is advisory and self-service change still works. Identity-verification responsibility, confidential code handover and administrator availability still need explicit organizational approval, plus target first-login/recovery checks and normal migration planning. No approval, automated email recovery, or live password reset is inferred from this source push. [Full implementation, verification and remaining adoption gates](https://git.add-ideas.de/GovOPlaN/govoplan/src/commit/58d320d9b34a618aab6ce0b9e48daf943961af66/docs/security/SECURITY_FOLLOWUP_2026-09-08.md). Source main was pushed and read back at its exact commit; existing remote tag inventories were verified unchanged. This is source publication, not a new package/image release or deployment. <!-- govoplan-security-followup-20260908-source58d320d -->
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: GovOPlaN/govoplan-access#22