CVE Tools
Back to blog

Patch, then patch again: how CVE-2026-28289 turned FreeScout's fix into zero-click RCE

A zero-width space undid CVE-2026-27636's 1.8.206 fix in six days — and escalated it to unauthenticated RCE via email. Fixed in 1.8.207.

A helpdesk email envelope dissolving into a server shell prompt, a faint zero-width-space character hovering over a broken padlock on a server rack
A helpdesk email envelope dissolving into a server shell prompt, a faint zero-width-space character hovering over a broken padlock on a server rack

On February 25, 2026, FreeScout shipped version 1.8.206 to close an authenticated remote-code-execution bug, CVE-2026-27636. Six days later, researchers at OX Security showed the fix was bypassable — and escalated the same root flaw to a zero-click, unauthenticated RCE now tracked as CVE-2026-28289. It is a clean, small, almost textbook example of why a patch is a milestone, not a finish line.

10.0CVSS 3.1 — CriticalAV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
98thEPSS percentile~31% exploitation probability
~6 daysfirst fix → bypass1.8.206 (Feb 25) → disclosure (Mar 3)
~1,100exposed FreeScout instancesShodan, per OX Research (Mar 2026)

What FreeScout is, and why a helpdesk bug travels

FreeScout is a self-hosted help desk and shared mailbox built on PHP's Laravel framework — a popular subscription-free alternative to Help Scout. Per OX Research's March 2026 writeup, Shodan surfaced roughly 1,100 internet-exposed instances across public-health institutions, technology providers, financial services, and news organizations. A helpdesk sits on top of sensitive support tickets and inbound mail, which is exactly why an RCE here lands hard.

The first fix: CVE-2026-27636

CVE-2026-27636 (CVSS 8.8) let an authenticated user with upload permission write a .htaccess or .user.ini file on Apache servers configured with AllowOverride All — a common default — and use it to redefine how files in that directory execute, reaching RCE. The 1.8.206 fix appended an underscore to any uploaded filename that used a restricted extension or began with a dot, so .htaccess became _htaccess. Reasonable. Not enough.

The bypass: one zero-width space

OX found that prepending a zero-width space (Unicode U+200B) to the filename slips it past the dot-prefix check, because the invisible character is not the literal . the check looks for. The check runs before sanitizeUploadedFileName() strips invisible characters — a textbook time-of-check / time-of-use (TOCTOU) ordering bug. After sanitization the U+200B is removed, and the file lands on disk as a true .htaccess — exactly what the check was meant to block.

Why the 1.8.206 check missed it: check-before-sanitize (TOCTOU)

  1. Attacker uploads: U+200B + .htaccess
  2. Check: does name start with a dot?
  3. Yes → underscore appended → blocked
  4. No — U+200B hides the leading dot
  5. Validation passes
  6. sanitizeUploadedFileName() strips U+200B
  7. File saved to disk as true .htaccess
  8. Apache honours it → remote code execution

From authenticated to zero-click (Mail2Shell)

OX then went further. A crafted email sent to any mailbox FreeScout is configured to receive needs no authentication and no user interaction; its attachment is written to a predictable path under /storage/attachment/, which is web-accessible. That turns the authenticated upload chain into a zero-click unauthenticated RCE — the path the CVE-2026-28289 CVSS vector (AV:N/AC:L/PR:N/UI:N/S:C) actually scores. OX calls the technique Mail2Shell.

EPSS: the bypass is where the risk concentrated
CVE-2026-27636 (origi…2.1CVE-2026-27637 (compa…0.67CVE-2026-28289 (bypas…31.1
LabelValue
CVE-2026-27636 (original)2.12
CVE-2026-27637 (companion)0.67
CVE-2026-28289 (bypass)31.14
EPSS = estimated probability of exploitation in the wild (0–100%). Source: cve.tools, data as of 2026-07-18.

Original vs bypass

CVE-2026-27636 vs CVE-2026-28289

CVE-2026-27636 — the originalCVE-2026-28289 — the bypass
CVSS8.8 High10.0 Critical
Privileges requiredLow (auth + upload)None (per CVSS vector)
ScopeUnchangedChanged
EPSS0.021 (79th pct)0.311 (98th pct)
Fixed in1.8.2061.8.207
Public PoCNoYes

What the CVSS 10 actually measures (and what it doesn't)

Disclosure timeline

FreeScout .htaccess RCE — from first fix to bypass

  1. Original flaws disclosed
    FreeScout 1.8.206 ships fixes for CVE-2026-27636 (.htaccess upload RCE) and CVE-2026-27637 (predictable auth token). Original reporter: Offensive.sa (per OX).
  2. Bypass found and shipped same day
    OX Research publishes a filename-validation bypass — now CVE-2026-28289 — that defeats the 1.8.206 dot-prefix check with a zero-width space, and escalates it to zero-click unauthenticated RCE via email (Mail2Shell). FreeScout 1.8.207 released the same day.
  3. Exploit cataloged
    Public advisory (GHSA-5gpc-65p8-ffwp) and the OX writeup with a proof-of-concept video are indexed in exploit catalogs.
  4. Current posture (this article)
    Fixed in 1.8.207. EPSS in the 98th percentile, a public PoC exists, but the flaw is not yet in CISA KEV per our data.

What to do right now

  1. Upgrade FreeScout to 1.8.207 or later. Version 1.8.206 is not sufficient — the dot-prefix check it added is bypassable.
  2. On Apache, set AllowOverride None for the FreeScout document root, even on 1.8.207. This is standing hardening, not just a workaround.
  3. Hunt for indicators of prior exploitation: search storage/attachment for rogue .htaccess or .user.ini files.
  4. Rotate the Laravel APP_KEY if you ever ran an affected version with internet exposure — CVE-2026-27637 made a leaked key sufficient for admin takeover.
  5. Subscribe this product to version-triggered CVE alerts so the next bypass reaches you before it reaches attackers.
Hunt for rogue dotfiles in FreeScout attachment storage
$ find /var/www/freescout/storage/attachment \$   \( -name '.htaccess' -o -name '.user.ini' \) -type f -print$ # Anything printed here is suspicious — uploaded dotfiles should not exist$ # in attachment storage. Review and remove, then check access logs.
# /etc/apache2/sites-available/freescout.conf — defence in depth
<Directory /var/www/freescout/public>
    AllowOverride None
    Require all granted
</Directory>
# Apply: a2ensite freescout && systemctl reload apache2
We run FreeScout on nginx. Are we affected?
The .htaccess RCE vector is Apache-specific — nginx ignores .htaccess. But the underlying upload-validation flaw still lets an attacker write attacker-controlled files into web-accessible storage, so treat 1.8.207 as required regardless of web server.
We applied 1.8.206 when CVE-2026-27636 came out. Are we done?
No. The 1.8.206 dot-prefix check is bypassable with a zero-width-space prefix (CVE-2026-28289), and OX Research escalated the same flaw to an unauthenticated, zero-click path via email. You need 1.8.207.
Is CVE-2026-28289 in CISA's KEV catalog?
Not as of 2026-07-18, per our data. The exploitation signal today is an EPSS in the 98th percentile plus a public proof of concept — not confirmed mass exploitation. Treat it as high-priority anyway given the zero-click escalation.
Why is the CVSS 10.0 if the advisory says it needs authentication?
The 10.0 (PR:N/UI:N) reflects OX Research's escalation to an unauthenticated, zero-click path via a crafted email to a configured mailbox. The NVD advisory prose scopes the core flaw to authenticated users with upload permission. Both preconditions matter for triage — and both are closed by 1.8.207.

Data as of 2026-07-18live record →