Back to Intelligence

CVE-2026-15743: Mageia Patches perl-Catalyst-Plugin-Static-Simple — Detection and Remediation Guide

SA
Security Arsenal Team
September 12, 2026
9 min read

Mageia has released security advisory MGASA-2026-0393 addressing CVE-2026-15743, a vulnerability in perl-Catalyst-Plugin-Static-Simple — the widely deployed plugin that handles static file serving for Catalyst, one of the oldest and most established Perl web application frameworks. If you operate Catalyst-based applications on Mageia (or consume this module from CPAN on any distribution), this advisory requires action: the vulnerable code path sits directly in front of your web traffic, handling unauthenticated requests for static content.

This post breaks down what the vulnerable component does, the exploitation model defenders should assume, and the detection, hunting, and remediation steps your team should execute now.

What Is at Risk

Catalyst::Plugin::Static::Simple exists to make serving static assets (images, CSS, JavaScript, downloads) trivial inside a Catalyst application. That convenience comes with a sharp edge: the plugin translates incoming URL paths into filesystem paths on the host. When that translation is mishandled — insufficient canonicalization of traversal sequences like ../, URL-encoded variants (%2e%2e%2f), or symlink following outside the configured static root — the result is a classic path traversal / arbitrary file read condition.

The practical impact for defenders:

  • Unauthenticated remote file read. An attacker crafting traversal sequences in static asset requests can potentially read files outside the intended document root — application configuration, database credentials in config files, /etc/passwd, session stores, source code.
  • Credential and secret theft as a pivot point. Catalyst apps commonly store database DSNs and credentials in myapp.conf or YAML config under the application directory. A traversal that reaches these hands an attacker the keys to lateral movement.
  • Pre-auth exposure. Static file handling runs before authentication logic in most Catalyst deployments. There is no login wall between the internet and this code path.

Catalyst remains in production across long-lived internal business applications, legacy customer portals, and embedded tooling — exactly the kind of estate that gets forgotten in patch cycles. Check your inventory before assuming this doesn't apply to you.

Technical Analysis

Affected component

  • Package: perl-Catalyst-Plugin-Static-Simple (Mageia advisory MGASA-2026-0393)
  • Upstream module: Catalyst::Plugin::Static::Simple (CPAN)
  • CVE: CVE-2026-15743
  • Platforms: Mageia Linux systems with the package installed; any distribution or container image where the module was installed from CPAN at a vulnerable version should be treated as in-scope until verified.

The Mageia advisory does not publish a full CVSS vector; treat the vulnerability as high-severity for internet-facing deployments given the pre-auth, remote, low-complexity nature of static-path traversal bugs in this class. Defenders should review the advisory directly at the source URL and confirm whether their installed package predates the fixed build.

How the attack works (defender's view)

  1. Attacker issues crafted HTTP GET requests against paths handled by the static plugin — typically the app's static route or any extension the plugin is configured to serve.
  2. The request path contains traversal sequences (../, %2e%2e%2f, %252e%252e%252f double-encoding, or backslash variants) targeting sensitive files: application config, .git directories, /etc/passwd, environment files.
  3. A vulnerable plugin fails to canonicalize and confine the resolved path to the configured static root, and returns the requested file content with HTTP 200.

The exploitation signature in logs is unmistakable: HTTP requests to static-asset paths containing dot-dot sequences, in raw or URL-encoded form, that return 200 rather than 400/403/404. That is your primary detection pivot.

Exploitation status

At publication, the advisory is a proactive security update; there is no confirmed CISA KEV listing for CVE-2026-15743. However, path traversal in static file handlers is one of the most reliably weaponized bug classes in web infrastructure — scanning for ../ in static paths is table stakes for opportunistic bots and is embedded in every major scanner and exploitation framework. The window between disclosure and mass scanning for this bug class is typically measured in days. Patch first, hunt retroactively.

Detection & Response

The detections below target the observable behavior: traversal attempts against web-facing services, and post-exploitation reads of sensitive files. Tune the static-route path segments to match your application's configured static directories.

YAML
---
title: Path Traversal Attempt Against Web Server Static Routes
id: 3f9c1a84-2b7d-4e58-a6c1-9d2e5f7a0b31
status: experimental
description: Detects HTTP requests containing directory traversal sequences (raw, URL-encoded, or double-encoded) in URIs targeting static asset paths, consistent with exploitation of static file serving vulnerabilities such as CVE-2026-15743 in Catalyst::Plugin::Static::Simple.
references:
  - https://linuxsecurity.com/advisories/mageia/mageia-2026-0393-perl-catalyst-plugin-static-simple
  - https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/05/11
tags:
  - attack.initial_access
  - attack.t1190
logsource:
  category: webserver
detection:
  selection_uri:
    cs-uri|contains:
      - '../'
      - '..\\'
      - '%2e%2e'
      - '%252e%252e'
      - '..%2f'
      - '..%5c'
  selection_static:
    cs-uri|contains:
      - '/static/'
      - '/assets/'
      - '/css/'
      - '/js/'
      - '/images/'
  condition: selection_uri and selection_static
falsepositives:
  - Rare; some legacy CMS platforms embed '..' in generated URLs
level: high
---
title: Web Server Process Reading Sensitive Files Outside Document Root
id: 8c2d4e91-5a3b-4f67-b8d2-1e6a9c3f7054
status: experimental
description: Detects web application server processes (perl, starman, plackup, nginx worker context) accessing sensitive files such as /etc/passwd, application config, or .git content, which may indicate successful path traversal exploitation.
references:
  - https://linuxsecurity.com/advisories/mageia/mageia-2026-0393-perl-catalyst-plugin-static-simple
  - https://attack.mitre.org/techniques/T1190/
author: Security Arsenal
date: 2026/05/11
tags:
  - attack.initial_access
  - attack.t1190
logsource:
  category: file_access
  product: linux
detection:
  selection_proc:
    ProcessName|endswith:
      - 'perl'
      - 'starman'
      - 'plackup'
      - 'nginx'
      - 'apache2'
      - 'httpd'
  selection_target:
    TargetFilename|contains:
      - '/etc/passwd'
      - '/etc/shadow'
      - '/.git/'
      - '.env'
      - 'myapp.conf'
      - '/proc/self/environ'
  condition: selection_proc and selection_target
falsepositives:
  - Application deployments reading their own config (baseline per host); nginx/apache reading /etc/passwd at startup only
level: high
KQL — Microsoft Sentinel / Defender
// Hunt for path traversal attempts against web-facing services ingested via CEF/Syslog/IIS
// Scope to your Catalyst/Perl app front ends (nginx/apache reverse proxies, WAF logs)
let lookback = 14d;
let traversal_patterns = dynamic(["../", "..\\", "%2e%2e", "%252e%252e", "..%2f", "..%5c"]);
union isfuzzy=true
  (CommonSecurityLog
   | where TimeGenerated > ago(lookback)
   | where RequestURL has_any (traversal_patterns)
   | project TimeGenerated, SourceIP, RequestURL, RequestMethod, HttpStatusCode=ExtensionField1, DeviceVendor, DeviceProduct),
  (Syslog
   | where TimeGenerated > ago(lookback)
   | where SyslogMessage has_any (traversal_patterns)
   | where SyslogMessage has_any (dynamic(["GET","POST"]))
   | project TimeGenerated, HostName, ProcessName, SyslogMessage),
  (W3CIISLog
   | where TimeGenerated > ago(lookback)
   | where csUriStem has_any (traversal_patterns) or csUriQuery has_any (traversal_patterns)
   | project TimeGenerated, cIP, csUriStem, csUriQuery, scStatus, sSiteName)
| summarize FirstSeen=min(TimeGenerated), LastSeen=max(TimeGenerated), Attempts=count() by SourceIP=coalesce(SourceIP, cIP, HostName), RequestPath=coalesce(RequestURL, csUriStem, SyslogMessage)
| order by Attempts desc
VQL — Velociraptor
-- Identify Catalyst/Perl app servers and suspicious outbound reads on Linux endpoints
-- 1) Find running Perl/Catalyst-related processes (Starman, Plack, mod_perl under Apache)
SELECT Pid, Name, CommandLine, Exe, Username, CreateTime
FROM pslist()
WHERE CommandLine =~ '(?i)starman|plackup|catalyst|myapp_server|fastcgi'
   OR Exe =~ '(?i)perl'

-- 2) Locate installed Static::Simple module versions to scope vulnerable hosts
SELECT FullPath, Mtime, Size
FROM glob(globs=['/usr/share/perl5/**/Catalyst/Plugin/Static/Simple.pm',
                 '/usr/local/share/perl/**/Catalyst/Plugin/Static/Simple.pm',
                 '/usr/lib/perl5/**/Catalyst/Plugin/Static/Simple.pm'])

-- 3) Check for web server processes holding sensitive files open (possible traversal read)
SELECT Pid, Name, CommandLine, Fd, RealPath
FROM handles(pid=0)
WHERE RealPath =~ '(?i)/etc/passwd|/etc/shadow|\.git/|myapp\.conf|\.env'
  AND CommandLine =~ '(?i)perl|nginx|apache|httpd'
Bash / Shell
#!/usr/bin/env bash
# CVE-2026-15743 remediation/verification for Mageia systems
# Run as root or via sudo

set -euo pipefail

echo "=== [1] Identify installed perl-Catalyst-Plugin-Static-Simple version ==="
rpm -q perl-Catalyst-Plugin-Static-Simple || echo "Package not installed via RPM"

echo "=== [2] Check for CPAN-installed copies outside package manager ==="
find /usr/share/perl5 /usr/local/share/perl /usr/lib/perl5 -name 'Simple.pm' -path '*Static*' 2>/dev/null || true
perldoc -l Catalyst::Plugin::Static::Simple 2>/dev/null || echo "Module not found in @INC"

echo "=== [3] Apply the Mageia security update (MGASA-2026-0393) ==="
urpmi.update -a
urpmi --auto-update --auto perl-Catalyst-Plugin-Static-Simple

echo "=== [4] Verify patched version post-update ==="
rpm -q perl-Catalyst-Plugin-Static-Simple

echo "=== [5] Restart Catalyst application services / reverse proxies ==="
# Adjust unit names to your deployment
systemctl list-units --type=service | grep -Ei 'starman|plack|catalyst|myapp' || true
systemctl reload nginx 2>/dev/null || systemctl reload httpd 2>/dev/null || true

echo "=== [6] Retro-hunt web logs for traversal attempts (last 30 days) ==="
for log in /var/log/nginx/access.log* /var/log/httpd/access_log*; do
  [ -e "$log" ] || continue
  echo "--- $log ---"
  zgrep -Ei '(\.\./|%2e%2e|%252e%252e|\.\.%2f|\.\.%5c)' "$log" 2>/dev/null | tail -n 50 || echo "No traversal patterns found"
done

echo "=== [7] Hardening: confirm app is not running as root ==="
ps -eo user,comm,args | grep -Ei 'perl|starman|plackup' | grep -v grep || true

echo "Done. If traversal attempts returned HTTP 200, escalate to IR for credential rotation."

Remediation

  1. Patch immediately. Apply the Mageia update per advisory MGASA-2026-0393 (urpmi --auto-update perl-Catalyst-Plugin-Static-Simple) on all affected systems. If your module came from CPAN rather than the distribution, update via cpanm Catalyst::Plugin::Static::Simple and confirm the installed version is newer than the vulnerable release referenced in the advisory.
  2. Restart application processes. Perl modules are loaded into memory at process start — PSGI/Starman/FastCGI workers and mod_perl Apache children must be restarted or the old code continues serving requests.
  3. Retro-hunt before you close the ticket. Grep 30+ days of reverse proxy and application logs for traversal sequences. Any request returning HTTP 200 to a traversal attempt is a confirmed file disclosure — treat it as an incident: rotate database credentials, API keys, and session secrets referenced in reachable config files.
  4. Layered defense at the reverse proxy. Add a normalization-and-block rule at nginx/Apache/your WAF rejecting requests containing .. in raw or encoded form before they reach the application. This is a durable compensating control for the entire bug class, not just this CVE.
  5. Reduce blast radius. Run Catalyst workers as an unprivileged dedicated user with read access only to the application tree and static root. Remove or lock down .git directories, .env files, and config with embedded credentials from any path the app user can read where feasible; move secrets to a vault or environment injection.
  6. Inventory the long tail. Catalyst apps tend to be legacy and forgotten. Use the VQL artifact above (or your EDR equivalent) to find Simple.pm across your fleet — including container images built on older base layers.

If your retro-hunt confirms successful traversal reads, treat this as a breach of whatever those files contained — not just a patched CVE.

Related Resources

Security Arsenal Penetration Testing Services AlertMonitor Platform Book a SOC Assessment vulnerability-management Intel Hub

Is your security operations ready?

Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.