<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>Pentr blog</title>
  <id>https://pentr.sh/blog/</id>
  <link rel="self" type="application/atom+xml" href="https://pentr.sh/blog/feed.xml"/>
  <link rel="alternate" type="text/html" href="https://pentr.sh/blog/"/>
  <updated>2026-10-22T00:00:00Z</updated>
  <author><name>Pentr</name></author>
  <entry>
    <title>PHP2Shell: what CVE-2026-109618 and CVE-2026-109619 are, and how to confirm you're fixed</title>
    <id>https://pentr.sh/blog/php2shell-cve-2026-109618-109619</id>
    <link rel="alternate" type="text/html" href="https://pentr.sh/blog/php2shell-cve-2026-109618-109619"/>
    <published>2026-10-22T00:00:00Z</published>
    <updated>2026-10-22T00:00:00Z</updated>
    <author><name>David Cristóbal</name></author>
    <summary>Two unauthenticated remote code execution bugs in the PHP interpreter, exploited before the fix shipped. What they are, how to patch, and how to confirm the fix on each host.</summary>
    <category term="vulnerabilities"/>
    <category term="cra"/>
    <content type="html">&lt;p&gt;On Tuesday 20 October, details of two remote code execution bugs in PHP leaked
before their planned disclosure on the 22nd. PHP moved its release forward a
day. On Wednesday 21 October, at around 14:00 UTC, it published 8.5.12, 8.4.27,
8.3.36 and 8.2.35. By that afternoon watchTowr was reporting exploitation
attempts against both bugs. Cloudflare had already seen attacks that morning,
before a fix existed.&lt;/p&gt;
&lt;p&gt;The pair is being called PHP2Shell. Both are rated 9.2 under CVSS v4.0. The
10.0 that circulated with the leak was not PHP's score. An attacker can reach
either bug with an ordinary web request and no login. Both sit in the
interpreter itself, not in WordPress, Laravel or anything else running on top.
If a server of yours runs PHP and answers HTTP requests, this applies to you.&lt;/p&gt;
&lt;h2 id="what-the-two-bugs-are"&gt;What the two bugs are&lt;a class="headerlink" href="#what-the-two-bugs-are" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;CVE-2026-109618 is in PHP's out-of-memory handling. If PHP runs out of memory
at the wrong moment while setting up a request, some internal request data is
left half-built. The cleanup code that runs afterwards doesn't know this and
treats the data as valid. An attacker who can control when memory runs out can
turn that into code execution.&lt;/p&gt;
&lt;p&gt;CVE-2026-109619 is a use-after-free: state that belongs to one request outlives
the memory behind it. One confirmed attack path goes through session upload
progress. That feature is on by default, and it touches session handling before
PHP has finished setting up the request.&lt;/p&gt;
&lt;p&gt;Every PHP release from 5.4 up to 8.5.11 is affected. So is every way of running
PHP for the web: PHP-FPM, Apache with mod_php, php-cgi, FrankenPHP and
LiteSpeed. PHP considers mod_php the worst case. There, the bug can fire before
your application code has even loaded, so nothing you wrote can stand in the
way.&lt;/p&gt;
&lt;h2 id="how-to-remediate"&gt;How to remediate&lt;a class="headerlink" href="#how-to-remediate" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Upgrade. That is the fix, and PHP's own advisory says there is no complete
mitigation.&lt;/p&gt;
&lt;p&gt;If you build PHP from upstream source, move to 8.5.12, 8.4.27, 8.3.36 or 8.2.35
and restart every worker.&lt;/p&gt;
&lt;p&gt;If PHP comes from your distribution, install the vendor's updated package.
Don't rely on the version number, because distributions backport fixes and
often leave it unchanged. Check the package changelog for the CVE IDs instead:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# Debian / Ubuntu&lt;/span&gt;
apt&lt;span class="w"&gt; &lt;/span&gt;changelog&lt;span class="w"&gt; &lt;/span&gt;php8.2-fpm&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CVE-2026-10961[89]'&lt;/span&gt;

&lt;span class="c1"&gt;# RHEL / Alma / Rocky&lt;/span&gt;
rpm&lt;span class="w"&gt; &lt;/span&gt;-q&lt;span class="w"&gt; &lt;/span&gt;--changelog&lt;span class="w"&gt; &lt;/span&gt;php&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;grep&lt;span class="w"&gt; &lt;/span&gt;-E&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s1"&gt;'CVE-2026-10961[89]'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;If PHP runs in containers, rebuild from a patched base image and redeploy. A
running container does not update itself.&lt;/p&gt;
&lt;p&gt;If you can't patch tonight, there are two partial measures:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;For CVE-2026-109619: set &lt;code&gt;session.upload_progress.enabled = 0&lt;/code&gt; and restart
  every worker. On PHP 8.5, also set &lt;code&gt;fatal_error_backtraces = 0&lt;/code&gt;. This closes
  one known attack path and does nothing at all for CVE-2026-109618.&lt;/li&gt;
&lt;li&gt;For CVE-2026-109618: move memory-limit enforcement from PHP to the server
  level and keep upload sizes low. This narrows the bug but does not close it.
  It is also a change for whoever runs the server, not for the application
  team.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;PHP 8.1 and older are past end of life and get no upstream fix. If you run one
of them from a distribution with extended support, check whether the vendor has
backported the patch. If you built it yourself, or your host doesn't say,
assume you are vulnerable. This is the uncomfortable part of PHP2Shell: the
exposure is largest on the systems nobody has touched in years.&lt;/p&gt;
&lt;h2 id="how-you-know-youre-fixed-and-what-a-test-cant-tell-you"&gt;How you know you're fixed, and what a test can't tell you&lt;a class="headerlink" href="#how-you-know-youre-fixed-and-what-a-test-cant-tell-you" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Checking from the outside is harder than it looks. An &lt;code&gt;X-Powered-By: PHP/8.1.2&lt;/code&gt;
header doesn't prove a server is vulnerable, because a backported fix keeps the
old version string. A missing header doesn't prove it's safe either, since
&lt;code&gt;expose_php&lt;/code&gt; may simply be off. The reliable check happens on the host itself:
the package changelog, &lt;code&gt;php -v&lt;/code&gt; for upstream builds, and confirming that every
worker restarted after the upgrade.&lt;/p&gt;
&lt;p&gt;Nobody should confirm the fix by running the exploit against production. These
are memory-corruption bugs, and a failed attempt can crash workers or leave a
process in a state no one wants to debug on a Thursday night. We don't do it in
Pentr, and we wouldn't recommend a tester who does.&lt;/p&gt;
&lt;p&gt;What an external test does well is answer the question that eats the first day
of any advisory: where is PHP running at all? A Pentr run lists the in-scope
hosts that expose PHP and flags the end-of-life versions and risky
configurations it can see from outside. Each engagement gets its own sealed
evidence locker. The run before you patch and the retest after it give you two
signed, independently verifiable records: one showing the exposure, one showing
it closed. That pair is what you hand to a customer or an auditor who asks when
it was fixed.&lt;/p&gt;
&lt;p&gt;If you ship software that bundles PHP, the &lt;a href="/blog/cra-reporting-live-know-your-exposure"&gt;Cyber Resilience Act&lt;/a&gt; applies too.
Since 11 September 2026, manufacturers must send an early warning within 24
hours of becoming aware of an actively exploited vulnerability in their product,
and a fuller notification within 72 hours. Whether PHP2Shell triggers that duty
depends on your product and on how the bug is being exploited. Either way, a
dated record of when you found the exposure and when you closed it is what that
clock is measured against.&lt;/p&gt;
&lt;p&gt;Could a pen test have caught PHP2Shell before Tuesday? No. Researchers at Wiz
found these bugs by digging into the interpreter, and no external test of your
application would have found them. What regular testing changes is your
starting position. If you already knew which hosts ran PHP and which were still
on 7.4, Wednesday was a patching day rather than a search.&lt;/p&gt;
&lt;p&gt;If you do one thing tonight, run the changelog check above on every PHP host,
and turn off upload progress on any host you can't upgrade yet.&lt;/p&gt;</content>
  </entry>
  <entry xml:lang="es">
    <title>Pruebas de penetración en el ENS: qué evidencia espera el auditor en sistemas MEDIA y ALTA</title>
    <id>https://pentr.sh/blog/pruebas-penetracion-ens-media-alta</id>
    <link rel="alternate" type="text/html" href="https://pentr.sh/blog/pruebas-penetracion-ens-media-alta"/>
    <published>2026-10-20T00:00:00Z</published>
    <updated>2026-10-20T00:00:00Z</updated>
    <author><name>David Cristóbal</name></author>
    <summary>Qué espera el auditor del ENS de tus pruebas de penetración en sistemas MEDIA y ALTA, dónde falla el informe PDF y qué conviene preparar.</summary>
    <category term="ens"/>
    <category term="compliance"/>
    <category term="audits"/>
    <content type="html">&lt;p&gt;Si gestionas un sistema de categoría MEDIA o ALTA, hay una fecha que pesa más
que cualquier ley en tramitación: la de tu próxima auditoría del Esquema
Nacional de Seguridad. Este artículo trata de esa fecha. En concreto, de qué
papel juegan las pruebas de penetración en ella y por qué el informe en PDF que
entrega el proveedor suele dejar huecos que el auditor acaba encontrando.&lt;/p&gt;
&lt;h2 id="nis2-puede-esperar-el-ens-no"&gt;NIS2 puede esperar. El ENS, no&lt;a class="headerlink" href="#nis2-puede-esperar-el-ens-no" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;España tenía que haber transpuesto la Directiva NIS2 antes del 17 de octubre de
2024. El Consejo de Ministros aprobó el anteproyecto de Ley de Coordinación y
Gobernanza de la Ciberseguridad el 14 de enero de 2025, y la ley no ha llegado a
publicarse en el BOE. El 8 de julio de 2026 la Comisión Europea llevó a España
ante el Tribunal de Justicia de la UE por el retraso. Con la disolución de las
Cortes el 6 de octubre y las elecciones del 29 de noviembre, el texto queda
pendiente de la próxima legislatura.&lt;/p&gt;
&lt;p&gt;Habrá ley, y traerá obligaciones nuevas para miles de entidades. Pero mientras
tanto, para las administraciones públicas y para las empresas privadas que les
prestan servicios, la obligación exigible hoy es el ENS (Real Decreto
311/2022). Tiene medidas concretas, categorías y auditorías con fecha. Es, con
diferencia, el marco que antes vas a tener que demostrar.&lt;/p&gt;
&lt;h2 id="que-dice-el-ens-sobre-las-pruebas"&gt;Qué dice el ENS sobre las pruebas&lt;a class="headerlink" href="#que-dice-el-ens-sobre-las-pruebas" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;El ENS no tiene una medida titulada "pentest". La exigencia de buscar y corregir
vulnerabilidades está repartida por varias medidas del Anexo II, y cambia con la
categoría. La categoría sale del impacto sobre las cinco dimensiones
(disponibilidad, integridad, confidencialidad, autenticidad y trazabilidad), y
cada medida añade refuerzos según sube.&lt;/p&gt;
&lt;p&gt;Las medidas que más pesan en las pruebas técnicas son estas:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Medida&lt;/th&gt;
&lt;th&gt;Qué pide&lt;/th&gt;
&lt;th&gt;MEDIA&lt;/th&gt;
&lt;th&gt;ALTA&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;op.mon.3 R2&lt;/td&gt;
&lt;td&gt;Vigilancia que determine la superficie de exposición a vulnerabilidades y deficiencias de configuración&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;op.mon.3 R6&lt;/td&gt;
&lt;td&gt;Inspecciones periódicas, y tras incidentes que revelen vulnerabilidades: verificación de configuración, análisis de vulnerabilidades y pruebas de penetración&lt;/td&gt;
&lt;td&gt;No&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mp.s.2 R1 / R2&lt;/td&gt;
&lt;td&gt;Auditorías de seguridad de las aplicaciones web: de caja negra (R1) o de caja blanca con herramientas automáticas de detección de vulnerabilidades (R2)&lt;/td&gt;
&lt;td&gt;R1 o R2&lt;/td&gt;
&lt;td&gt;R2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;mp.sw.2 R1, op.exp.4 R1&lt;/td&gt;
&lt;td&gt;Pruebas antes de pasar a producción, en un entorno aislado o de preproducción&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;td&gt;Sí&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Dos detalles merecen atención. El primero: la única mención literal a las
pruebas de penetración como obligación de una categoría está en op.mon.3 R6, y
solo aplica a ALTA. En MEDIA, la exigencia llega por la vigilancia de la
superficie de exposición y por las auditorías de las aplicaciones web, no por la
palabra "pentest". El RD 3/2010 sí pedía análisis de vulnerabilidades y pruebas
de penetración en MEDIA antes de la entrada en servicio; el RD 311/2022 lo
reorganizó, y algunos resúmenes siguen citando el texto antiguo.&lt;/p&gt;
&lt;p&gt;El segundo: el Anexo II no fija la frecuencia. op.mon.3 R6 dice
"periódicamente", y mp.s.2 deja la frecuencia de las auditorías al
procedimiento de auditoría de la entidad. Esa frecuencia la decides tú, y el
auditor comprobará que está definida y que se ha cumplido.&lt;/p&gt;
&lt;p&gt;Nuestra recomendación es sencilla: lee las medidas aplicables con sus refuerzos
para tu categoría, y apóyate en las guías CCN-STIC correspondientes. No te
quedes con el resumen de un proveedor, incluido este.&lt;/p&gt;
&lt;h2 id="que-mira-el-auditor"&gt;Qué mira el auditor&lt;a class="headerlink" href="#que-mira-el-auditor" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Los sistemas MEDIA y ALTA necesitan una auditoría para certificar su
conformidad (artículo 38). La auditoría ordinaria se repite al menos cada dos
años, y una modificación sustancial del sistema obliga a una extraordinaria
(artículo 31). Cuando el auditor llega a las pruebas técnicas, suele hacer
cuatro preguntas:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;¿El alcance de las pruebas coincide con el sistema certificado? Es decir, con
   los activos que figuran en tu inventario y tu declaración de aplicabilidad.&lt;/li&gt;
&lt;li&gt;¿Cuándo se hicieron? Y si fue antes o después de los cambios relevantes del
   sistema.&lt;/li&gt;
&lt;li&gt;¿Qué se encontró y qué se hizo con ello? El hallazgo tiene que llevar a una
   corrección, y la corrección a una comprobación.&lt;/li&gt;
&lt;li&gt;¿Puedo comprobar algo de lo que pone aquí? No es habitual que lo pregunte en
   voz alta, pero es lo que intenta al muestrear.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="donde-falla-el-informe-en-pdf"&gt;Dónde falla el informe en PDF&lt;a class="headerlink" href="#donde-falla-el-informe-en-pdf" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;No es un problema de calidad del pentester. Es un problema de formato. Estos son
los huecos que más se repiten:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Alcance genérico.&lt;/strong&gt; "Infraestructura expuesta de la entidad" no se puede
  cruzar con un inventario de activos. El auditor quiere rangos, dominios y
  aplicaciones concretos.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fechas que no encajan.&lt;/strong&gt; Un informe de marzo para un sistema que cambió de
  proveedor de nube en junio describe otro sistema.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hallazgos sin cierre.&lt;/strong&gt; El informe lista lo encontrado, pero la corrección
  vive en un ticket y la verificación en un correo. Nadie las ha juntado.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Capturas sin contexto.&lt;/strong&gt; Una imagen de una respuesta no dice qué petición la
  produjo, contra qué máquina ni cuándo.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Cada uno de estos huecos se suele tapar con conversaciones durante la auditoría.
Funciona, pero consume tiempo de las dos partes, y deja la conformidad apoyada
en explicaciones en lugar de en evidencias.&lt;/p&gt;
&lt;h2 id="un-registro-en-lugar-de-un-informe"&gt;Un registro en lugar de un informe&lt;a class="headerlink" href="#un-registro-en-lugar-de-un-informe" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;En Pentr, la evidencia de una prueba no es un documento redactado después, sino
el registro de la propia ejecución. La primera entrada es el alcance declarado
(rangos y dominios dentro y fuera de alcance) junto con la autorización. Después
vienen, en orden, cada petición y respuesta, cada comando con su salida y cada
captura, etiquetados con la fase y con la medida del ENS con la que se
relacionan. Cada entrada está encadenada con la anterior mediante su huella
SHA-256, y la cadena se firma al cerrar la ejecución.&lt;/p&gt;
&lt;p&gt;Para el auditor, eso cambia dos cosas. El alcance deja de ser una afirmación en
la primera página y pasa a ser la primera entrada de la cadena, sellada con todo
lo demás. Y la verificación no depende de nosotros. Con el registro exportado y
la clave pública, &lt;code&gt;pentr-verify&lt;/code&gt; comprueba en su propio equipo, sin cuenta y sin
conexión, que no se ha modificado nada.&lt;/p&gt;
&lt;p&gt;Cuando se corrige un hallazgo, la nueva comprobación se añade al mismo registro.
El hallazgo, la corrección y su verificación quedan juntos, que es justo lo que
el auditor intenta reconstruir.&lt;/p&gt;
&lt;h2 id="lo-que-pentr-no-sustituye"&gt;Lo que Pentr no sustituye&lt;a class="headerlink" href="#lo-que-pentr-no-sustituye" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Un registro firmado de las pruebas es una evidencia más. No hace el resto del
trabajo:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;La categorización del sistema y el análisis de riesgos son tuyos.&lt;/li&gt;
&lt;li&gt;La declaración de aplicabilidad y la política de seguridad, también.&lt;/li&gt;
&lt;li&gt;La auditoría la hace una entidad de certificación acreditada. Nosotros le
  damos material, no la conformidad.&lt;/li&gt;
&lt;li&gt;Lo que no es accesible por red queda fuera: revisión de código, hardware,
  procesos internos.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="antes-de-la-proxima-auditoria"&gt;Antes de la próxima auditoría&lt;a class="headerlink" href="#antes-de-la-proxima-auditoria" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Una lista corta, en el orden en que la haríamos:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Confirma la categoría de cada sistema y qué medidas y refuerzos te aplican.&lt;/li&gt;
&lt;li&gt;Define por escrito la frecuencia de las pruebas, ya que el Anexo II no la
   fija.&lt;/li&gt;
&lt;li&gt;Alinea el alcance de las pruebas con el inventario de activos, rango a rango.&lt;/li&gt;
&lt;li&gt;Prueba después de los cambios relevantes, no solo en las semanas previas a la
   auditoría.&lt;/li&gt;
&lt;li&gt;Une cada hallazgo con su corrección y con la prueba que la verifica.&lt;/li&gt;
&lt;li&gt;Guarda la evidencia de forma exportable y verificable durante todo el ciclo
   de certificación.&lt;/li&gt;
&lt;li&gt;Pregunta al auditor qué formato prefiere antes de la visita, no durante.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;El &lt;a href="https://www.boe.es/buscar/act.php?id=BOE-A-2022-7191"&gt;texto consolidado del RD 311/2022&lt;/a&gt;
recoge todas las medidas del Anexo II con sus refuerzos. Si quieres ver cómo
encaja un registro sellado con las medidas del ENS, &lt;a href="/frameworks/ens"&gt;la página del
ENS&lt;/a&gt; lo explica con más detalle.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>CRA reporting is live. Know your exposure before the clock starts</title>
    <id>https://pentr.sh/blog/cra-reporting-live-know-your-exposure</id>
    <link rel="alternate" type="text/html" href="https://pentr.sh/blog/cra-reporting-live-know-your-exposure"/>
    <published>2026-10-07T00:00:00Z</published>
    <updated>2026-10-07T00:00:00Z</updated>
    <author><name>David Cristóbal</name></author>
    <summary>CRA Article 14 reporting has applied since 11 September. What it asks, what it does not, and why the work starts before the 24-hour clock does.</summary>
    <category term="cra"/>
    <category term="compliance"/>
    <content type="html">&lt;p&gt;On 11 September 2026 the first operational part of the Cyber Resilience Act
started to apply. Manufacturers of products with digital elements now have to
report actively exploited vulnerabilities and severe incidents through ENISA's
Single Reporting Platform. Most of what has been written since is about the
reporting itself: who files, through which form, by when.&lt;/p&gt;
&lt;p&gt;That matters, and if you have not sorted it out yet, it should be first on your
list. This post is about the step before it. The reporting clock starts when you
become aware of a problem. How much you already know about your own products
decides whether that moment is a surprise.&lt;/p&gt;
&lt;h2 id="what-applies-now"&gt;What applies now&lt;a class="headerlink" href="#what-applies-now" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Article 14 covers two kinds of event: a vulnerability in your product that is
being actively exploited, and a severe incident affecting the security of your
product. For an actively exploited vulnerability, the sequence is:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;an early warning within 24 hours of becoming aware;&lt;/li&gt;
&lt;li&gt;a vulnerability notification within 72 hours, with general information and
  any mitigations;&lt;/li&gt;
&lt;li&gt;a final report within 14 days of a corrective measure being available.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Severe incidents follow the same 24 and 72-hour steps, with a final report
within a month. Reports go through the SRP, which forwards them to the CSIRT
acting as coordinator for your main establishment and to ENISA. You also have to
inform affected users, and in some cases all users.&lt;/p&gt;
&lt;p&gt;Two details are easy to miss. First, the obligation covers products already on
the EU market, not only new ones. Second, the Commission's guidance says you do
not have to report, retroactively, exploitation you already knew about before
11 September.&lt;/p&gt;
&lt;p&gt;The rest of the regulation, including the essential requirements and the
vulnerability handling processes in Annex I, applies from 11 December 2027.&lt;/p&gt;
&lt;h2 id="what-article-14-does-not-ask"&gt;What Article 14 does not ask&lt;a class="headerlink" href="#what-article-14-does-not-ask" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The reporting duty is narrower than it sounds. It is not about every
vulnerability you have. It is about vulnerabilities someone is actually
exploiting, and incidents that actually affected security.&lt;/p&gt;
&lt;p&gt;This means a weakness found in your own test is not, by itself, an actively
exploited vulnerability. If your pen test finds an SSRF in an API, you fix it.
You do not file it with ENISA, unless you also find evidence that someone else
got there first. Where that line falls for a specific case is a question for
your counsel, not for a vendor's blog. But it is worth being clear that testing
does not create reporting obligations on its own.&lt;/p&gt;
&lt;h2 id="the-uncomfortable-part-is-legacy"&gt;The uncomfortable part is legacy&lt;a class="headerlink" href="#the-uncomfortable-part-is-legacy" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;New products can be designed for the CRA. The harder problem is what is already
out there: a device line sold five years ago, firmware whose original team has
moved on, a cloud backend that three product generations still talk to. The CRA
counts a product's remote data processing as part of the product, so that
backend is in scope too.&lt;/p&gt;
&lt;p&gt;For these products, the first sign of trouble is often external: a CSIRT, a
researcher, a customer's security team, a threat report that names your
product. At that point the clock is already running, and the first question is
what you knew about that part of the system before today.&lt;/p&gt;
&lt;p&gt;If the answer is "nothing recent", the 24 hours go into finding out what the
system even exposes. If the answer is a dated record of what was tested, what
was found and what was fixed, the 24 hours go into the question that matters: is
this new, or is it something we already understood?&lt;/p&gt;
&lt;h2 id="a-record-cuts-both-ways"&gt;A record cuts both ways&lt;a class="headerlink" href="#a-record-cuts-both-ways" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;We should be honest about one thing. A dated record of your tests shows what you
knew and when. If a test found a problem in March and it was still open in
September, the record shows that too.&lt;/p&gt;
&lt;p&gt;We do not think that is an argument for not looking. It is an argument for
fixing what you find, and for keeping the retest in the same record as the
original finding. A finding, a fix and a confirmed retest is about the best
evidence of diligence a manufacturer can show. An unexamined system is not a
defence.&lt;/p&gt;
&lt;h2 id="december-2027-is-closer-than-it-looks"&gt;December 2027 is closer than it looks&lt;a class="headerlink" href="#december-2027-is-closer-than-it-looks" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;From 11 December 2027, Annex I Part II requires manufacturers to apply effective
and regular tests and reviews of their products' security, along with an SBOM, a
coordinated disclosure policy and a working update process. Conformity
assessment will look for evidence of all of this in your technical
documentation, and the CRA expects that documentation to be kept for at least
ten years or the support period, whichever is longer.&lt;/p&gt;
&lt;p&gt;Two words in that requirement are worth reading slowly. "Regular" suggests a
single annual test will be hard to defend for a product that ships updates every
month. "Effective" suggests the tests have to reach the parts of the product
that matter, not only its marketing site.&lt;/p&gt;
&lt;h2 id="where-pentr-fits-and-where-it-does-not"&gt;Where Pentr fits, and where it does not&lt;a class="headerlink" href="#where-pentr-fits-and-where-it-does-not" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Pentr tests what is reachable over a network: hosts, ranges, web applications
and authenticated APIs. For many manufacturers, that is the cloud backend and
the device-facing APIs, which is often where legacy risk sits. Each run produces
a sealed record of what was tested, found and retested, which you can keep as
part of your technical documentation.&lt;/p&gt;
&lt;p&gt;Pentr does not test firmware or hardware, file reports on the SRP, generate
SBOMs or perform conformity assessment. If you need those, you need other tools
and, for some product classes, a notified body. Also note that our standard
retention is one year, so export the locker if you need to keep it for the
CRA's ten years.&lt;/p&gt;
&lt;h2 id="before-december-2027"&gt;Before December 2027&lt;a class="headerlink" href="#before-december-2027" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A short list we would work through, in this order:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;List every product on the EU market, including legacy lines and the backends
   they depend on.&lt;/li&gt;
&lt;li&gt;Decide who declares "aware". Name the person and the escalation path that can
   meet 24 hours on a weekend.&lt;/li&gt;
&lt;li&gt;Register on the SRP and confirm which CSIRT coordinates for your main
   establishment.&lt;/li&gt;
&lt;li&gt;Publish a disclosure policy and a contact point, so researchers report to you
   rather than about you.&lt;/li&gt;
&lt;li&gt;Set a testing cadence per product, tied to its release rhythm, and keep each
   run's evidence with the release it covers.&lt;/li&gt;
&lt;li&gt;Plan retention for ten years. Whatever produces your test evidence, make sure
   it can be exported and still verified later.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The &lt;a href="https://www.enisa.europa.eu/topics/product-security-and-certification/single-reporting-platform-srp"&gt;ENISA Single Reporting Platform page&lt;/a&gt;
has the registration guidance and FAQs. If you want to see what a sealed test
record looks like, &lt;a href="/locker"&gt;the locker page&lt;/a&gt; walks through one.&lt;/p&gt;</content>
  </entry>
  <entry>
    <title>Your pen test report is a PDF you have to trust</title>
    <id>https://pentr.sh/blog/pen-test-report-pdf-you-have-to-trust</id>
    <link rel="alternate" type="text/html" href="https://pentr.sh/blog/pen-test-report-pdf-you-have-to-trust"/>
    <published>2026-09-28T00:00:00Z</published>
    <updated>2026-09-28T00:00:00Z</updated>
    <author><name>David Cristóbal</name></author>
    <summary>A pen test report is a document written after the test. We think the auditor should get the test itself: every artifact, hashed, chained and signed.</summary>
    <category term="evidence-locker"/>
    <category term="audits"/>
    <content type="html">&lt;p&gt;Most penetration tests end the same way. Testing stops on a Friday, and the
following week someone writes a report. A few dozen pages arrive as a PDF: an
executive summary, a scope statement, a findings table, and a screenshot for
each finding. The auditor reads it, checks the dates and the firm's name,
samples two or three findings and files it.&lt;/p&gt;
&lt;p&gt;What the auditor cannot do is check any of it. The report is a description of
the work, written after the work, by the people who did it. Everything in it is
a claim.&lt;/p&gt;
&lt;p&gt;That has worked for a long time, and it mostly still works. But it is worth
being precise about what is being trusted, because the conditions around it are
changing.&lt;/p&gt;
&lt;h2 id="what-the-auditor-is-actually-trusting"&gt;What the auditor is actually trusting&lt;a class="headerlink" href="#what-the-auditor-is-actually-trusting" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;Take a typical finding: an SSRF in an import endpoint that reaches the cloud
metadata service. In the report it appears as a paragraph, a CVSS score and a
screenshot of the response. To accept it, the auditor has to trust that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;the screenshot came from the system in scope, on the date stated, and not
  from a lab or a previous engagement;&lt;/li&gt;
&lt;li&gt;the request that produced it was the one described, and nothing was left out
  of the chain;&lt;/li&gt;
&lt;li&gt;the scope page at the front of the report matches what the tester actually
  touched;&lt;/li&gt;
&lt;li&gt;nothing was added, removed or softened between the test and the final
  version.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;None of this is a criticism of pentesters. The format was designed for a reader
who trusts the author, and most of the time that trust is earned. The report is
a professional opinion, and it is signed by a firm with a reputation to lose.&lt;/p&gt;
&lt;p&gt;The strain shows in two places. The first is frequency. PCI DSS expects testing
at least annually and after significant changes, and SOC 2 reviewers
increasingly want evidence of continuous monitoring. The number of reports
grows, and the time anyone spends checking each one shrinks. The second is
automation. When part of the work is done by an agent, the auditor's question
changes from "do I trust this firm?" to "what did the software actually do?" A
PDF written afterwards is a poor answer to that question, however well written
it is.&lt;/p&gt;
&lt;h2 id="keep-the-test-not-a-description-of-it"&gt;Keep the test, not a description of it&lt;a class="headerlink" href="#keep-the-test-not-a-description-of-it" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;The alternative we settled on is simple to state: do not write a document about
the test. Keep the test.&lt;/p&gt;
&lt;p&gt;In Pentr, every artifact the agent produces is captured at the moment it exists.
That means each HTTP request and response, each command with its stdout and
stderr, each screenshot, and the manifest of what each reconnaissance phase
enumerated. Each one is stored as a discrete entry, with a SHA-256 digest of
its bytes and metadata recording its position in the run, its kind, the phase,
the controls and findings it relates to, and when it was captured.&lt;/p&gt;
&lt;p&gt;Each entry's hash also covers the hash of the entry before it:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;entry[n].hash = sha256( entry[n-1].hash + sha256(artifact) + metadata )
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The chain starts from a value derived from the run's ID, so a chain lifted from
one run does not verify under another.&lt;/p&gt;
&lt;p&gt;When the engagement ends, whether it completed or was aborted, the head of the
chain is signed with an Ed25519 key. Because every entry points back to the one
before it, signing the head covers the entire history.&lt;/p&gt;
&lt;p&gt;Three properties follow, and none of them depends on anyone's good intentions:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Nothing can be edited quietly.&lt;/strong&gt; Change one byte of one artifact and its
   digest changes, which breaks every link after it.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nothing can be removed or reordered.&lt;/strong&gt; The chain records order, so a
   deleted screenshot leaves a gap that verification reports.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Scope is sealed with the work.&lt;/strong&gt; The signed manifest carries a digest of
   the run's in-scope and out-of-scope lists and its rules of engagement.
   Anyone told what the scope was can recompute that digest and compare it.
   Change the scope after the fact and it no longer matches, so the scope and
   the work cannot drift apart.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;None of these ideas is new. Signed, append-only logs are how certificate
transparency works, and how trust service providers keep records that have to
stand up years later. We have applied them to a pen test.&lt;/p&gt;
&lt;h2 id="verification-that-does-not-involve-us"&gt;Verification that does not involve us&lt;a class="headerlink" href="#verification-that-does-not-involve-us" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;A record like this is only useful if the auditor can check it without asking the
vendor. If verification means logging into our console, we have only moved the
trust from the tester's PDF to our server.&lt;/p&gt;
&lt;p&gt;So verification runs offline, against an exported locker, with a public key:&lt;/p&gt;
&lt;div class="codehilite"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="gp"&gt;$ &lt;/span&gt;pentr-verify&lt;span class="w"&gt; &lt;/span&gt;pentr-locker-3f9a1c2e.zip&lt;span class="w"&gt; &lt;/span&gt;--key&lt;span class="w"&gt; &lt;/span&gt;acme.pem
&lt;span class="go"&gt;OK      0  command_log      f869ee4c0b89  -&lt;/span&gt;
&lt;span class="go"&gt;OK      1  req_resp         2482ffa1be00  -&lt;/span&gt;
&lt;span class="go"&gt;OK      2  screenshot       075f8e3f22fc  screenshot.png&lt;/span&gt;
&lt;span class="go"&gt;…&lt;/span&gt;
&lt;span class="go"&gt;PASS — evidence locker verified&lt;/span&gt;

&lt;span class="go"&gt;  run          3f9a1c2e-7b44-4d21-9a6e-0c5b8e2d14f7&lt;/span&gt;
&lt;span class="go"&gt;  artifacts    38&lt;/span&gt;
&lt;span class="go"&gt;  chain head   af08f99ccd6af021f46396c82a2cd859c6296f32b28af9f2291e6ae7e0ae0bab&lt;/span&gt;
&lt;span class="go"&gt;  signed by    5f79492518ca52f60086291848a46ef8c9a852f7cb0394509b0fa552541a3d69&lt;/span&gt;
&lt;span class="go"&gt;  signed at    2026-08-26T01:04:11.229107+00:00&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The verifier recomputes every digest, walks the chain and checks the signature.
If anything fails, it marks the artifact &lt;code&gt;BAD&lt;/code&gt; and says what broke. It needs no
account and no network access. The public key should come from the organization
through a channel you trust, not from the locker itself. Run without &lt;code&gt;--key&lt;/code&gt;,
the tool still checks everything, but it says plainly that it has proved the
locker is intact, not who signed it. The verifier is open source, so anyone who
prefers not to trust our binary can read it, build it and run it in their own
CI.&lt;/p&gt;
&lt;h2 id="what-a-signature-does-not-prove"&gt;What a signature does not prove&lt;a class="headerlink" href="#what-a-signature-does-not-prove" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;This is the part vendors tend to skip, and auditors should ask about it.&lt;/p&gt;
&lt;p&gt;A valid seal proves the record was not changed after it was sealed. It does not
prove the test was thorough, or that the declared scope was the right one.
Coverage is still a judgment, and the locker makes that judgment reviewable, not
unnecessary.&lt;/p&gt;
&lt;p&gt;The timestamps are the ones our runner recorded. They are consistent and
chained, but they are not qualified timestamps from an independent authority.
For most audits that is enough. If you need more, tell us what your auditor
expects.&lt;/p&gt;
&lt;p&gt;The signer matters. Today, lockers are sealed with an Ed25519 key that Pentr
holds, encrypted at rest, and signs with in software. You can generate that key
or upload one of your own, but either way we hold it. A sealed locker cannot be
altered without verification failing, but we are technically able to sign on
your behalf, and we say so in the documentation and in every locker's README. If
what you need is independence from us as the signer, the key should live
somewhere we cannot reach. Signing with your own HSM or KMS key, and running the
agent on premises, are on the Enterprise roadmap.&lt;/p&gt;
&lt;p&gt;A finding is still a judgment. Severity and CVSS are opinions. What changes
is that the opinion now sits next to the exact request and response it is based
on, so a reviewer can disagree with it on evidence.&lt;/p&gt;
&lt;h2 id="what-changes-in-practice"&gt;What changes in practice&lt;a class="headerlink" href="#what-changes-in-practice" title="Link to this section"&gt;&amp;para;&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;For the auditor, sampling a finding stops being a matter of reading a paragraph.
They open the artifact the finding points to and read the actual exchange. The
control mapping (PCI 11.3.1, ASVS V5, ISO A.8.8) is attached when the artifact
is captured, not assembled the week before the audit.&lt;/p&gt;
&lt;p&gt;For the security team, less time goes into writing and formatting. A retest
after remediation is another sealed entry in the same record, not a new
paragraph in a revised PDF.&lt;/p&gt;
&lt;p&gt;The PDF does not disappear. Most auditors will still want a summary, and people
still need something to read on a train. The difference is that the summary
becomes an index to the evidence rather than the evidence itself.&lt;/p&gt;
&lt;p&gt;If you want to see what this looks like, &lt;a href="/locker"&gt;the locker page&lt;/a&gt; walks
through a sealed run, and &lt;a href="/docs/locker/verify"&gt;the verifier documentation&lt;/a&gt;
shows how to check one yourself.&lt;/p&gt;</content>
  </entry>
</feed>
