Summary
CVE-2026-87816 is a time-of-check-to-time-of-use (TOCTOU) race condition in PasswordPusher, an open-source application for sharing sensitive information (e.g., passwords) via self-expiring links. The flaw allows an unauthenticated attacker to bypass a push’s expire_after_views limit by sending concurrent requests, allowing a secret configured for a single view to be retrieved multiple times before the view count is incremented and the push is expired. The issue affects PasswordPusher versions prior to 2.11.1 and is rated High severity.
Technical details
- Root cause (CWE-362): The show-secret flow in
pushes_controller.rb(and the equivalent JSON API controller) checks the view limit, validates expiration, delivers the secret payload, and only afterward logs the view/increments the view count — with no database lock, transaction, or optimistic concurrency control tying these steps together. - Trigger conditions: A push is created with a view limit (e.g.,
expire_after_views: 1, the "one-time secret" mode) and its access URL becomes known to more than one party (e.g., shared in a Slack/Teams/email channel). - Attack vector: Network-based, unauthenticated, no user interaction required. An attacker races the legitimate recipient by issuing multiple simultaneous GET requests to the push’s show endpoint (web UI or JSON API) before the view is recorded.
- Impact: Defeats PasswordPusher’s core security guarantee — secrets intended to self-destruct after a set number of views can instead be viewed by multiple parties, resulting in unauthorized disclosure of confidential information (credentials, tokens, etc.). No integrity or availability impact is associated with this issue.
Affected software
- PasswordPusher (pglombardo/PasswordPusher) versions prior to 2.11.1
- Both the web application show action and the JSON API v1 show action are affected
Severity
- CVSS v4.0: 8.7 (High) —
AV:N/AC:L/AT:N/PR:N/UI:N/VC:H/VI:N/VA:N/SC:N/SI:N/SA:N - CVSS v3.1: 7.5 (High) —
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:N/A:N
Mitigation and recommended actions
- Immediate: Upgrade PasswordPusher to version 2.11.1 or later, which serializes the view-check/log/expire sequence using database-level locking to close the race window.
- If upgrading immediately is not possible:
- Treat any secret shared via PasswordPusher instances running an affected version as potentially exposed to more than the intended recipient, especially secrets shared in group channels.
- Restrict who can access the shared link/channel until the instance is patched, and rotate any credentials pushed through an affected instance where exposure cannot be ruled out.
- Monitor push view/audit logs for unexpected multiple or near-simultaneous views on secrets configured with a low
expire_after_viewsvalue.

