Hold TOTP enrollment secret server-side and email user on activation

TOTP enrollment previously round-tripped the generated secret through a
hidden form field and saved whatever the client submitted, letting an
attacker with session access enroll a 2FA device they control by posting
their own secret plus a matching code. Stash the secret in the session
at GET /totp/new, read it only from the session at POST /totp, and drop
the hidden field from the view. Notify the user by email on successful
enrollment so unauthorized activations are visible even if a new vector
appears later.

Co-Authored-By: Claude Opus 4 <noreply@anthropic.com>
This commit is contained in:
Dan Milne
2026-04-20 18:17:50 +10:00
parent 93d8381214
commit b876e02c3a
7 changed files with 138 additions and 3 deletions

View File

@@ -0,0 +1,16 @@
<p>Hello,</p>
<p>
Two-factor authentication was just enabled on the Clinch account for
<strong><%= @user.email_address %></strong>.
</p>
<p>
If you did this, you can ignore this email.
</p>
<p>
If you did <strong>not</strong> do this, your account may have been
accessed by someone else. Reset your password immediately and contact
your administrator.
</p>