---
id: CVE-2026-15743
title: >-
  Catalyst::Plugin::Static::Simple versions through 0.38 for Perl mark responses
  as publicly cacheable
summary: >-
  Catalyst::Plugin::Static::Simple versions through 0.38 for Perl mark responses
  as publicly cacheable.


  The _serve_static method always sets the Cache-Control header to "public",
  with no means of overriding it.  This advises proxies that …
severity: medium
cvss: 5.7
cvssVector: 'CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:U/C:H/I:N/A:N'
cvssSource: adp
cwe:
  - CWE-524
product: Catalyst-Plugin-Static-Simple
affected:
  - Catalyst-Plugin-Static-Simple <= 0.38
ssvc:
  exploitation: none
  automatable: 'no'
  technicalImpact: partial
  timestamp: '2026-08-28T15:06:14.898370Z'
published: '2026-08-20'
updated: '2026-10-19'
sourceUpdated: '2026-10-19T18:25:25.600Z'
source: CVEORG
sourceUrl: 'https://www.cve.org/CVERecord?id=CVE-2026-15743'
references:
  - url: 'https://github.com/perl-catalyst/Catalyst-Plugin-Static-Simple/pull/3'
  - url: >-
      https://security.metacpan.org/patches/C/Catalyst-Plugin-Static-Simple/0.38/CVE-2026-15743-r1.patch
  - url: 'https://datatracker.ietf.org/doc/html/rfc9111'
tags:
  - cve.org
epss: 0.00322
epssPercentile: 0.23796
ingestedAt: '2026-10-19T18:35:50.122Z'
---

## Overview

Catalyst::Plugin::Static::Simple versions through 0.38 for Perl mark responses as publicly cacheable.

The _serve_static method always sets the Cache-Control header to "public", with no means of overriding it.  This advises proxies that the content may be stored in a shared cache, and may be reused in responses to requests from other users. (This includes requests with an Authorization header.)

Configuring the expires time to "0" to disable caching, as documented, is ignored.

## Affected

- `Catalyst-Plugin-Static-Simple <= 0.38`

## Remediation

Refer to the linked advisories for vendor-supplied fixes and affected version ranges.

### Workarounds

Apply the patch, and configure the default Cache-Control as needed.

For deployments that cannot apply the patch, a method modifier of _serve_static in the Catalyst class can be used to override the Cache-Control or Expires headers as needed, for example:

    around _serve_static => sub {
        my ( $next, $c, $path, $cache_control ) = @_;

        $c->$next($path);

        my $config = $c->config->{'Plugin::Static::Simple'};
        $cache_control ||= $config->{cache_control} || "public";

        if ( defined $config->{expires} ) {

            if ( $config->{expires} <= 0 ) {
                $cache_control = 'no-store';
                $c->res->headers->expires(0);
            }
            else {
                $c->res->headers->expires( time() + $config->{expires} );
            }
        }

        $c->res->headers->header( 'Cache-Control' => $cache_control );
        return 1;
    };
