¿Qué es Style Smuggler (CVE-2026-75650)?
CVE-2026-75650 (StyleSmuggler) es una vulnerabilidad SSTI crítica que se está explotando activamente en plataformas de comercio electrónico. Descubre en qué consiste y cómo pueden protegerse los clientes de Fastly.

Descripción general
Sansec descubrió la vulnerabilidad en Adobe Commerce & Magento y constató que ya se estaba explotando en ataques reales antes de que se publicaran los parches, al menos desde el 4 de septiembre de 2026
Adobe publicó APSB26-146 el 7 de septiembre de 2026 para abordar partes de la cadena de vulnerabilidades
Fastly ha realizado el lanzamiento de un parche virtual para CVE-2026-75650 que los clientes pueden activar para bloquear las peticiones dirigidas a la vulnerabilidad
Análisis de la vulnerabilidad
CVE-2026-75650 es una vulnerabilidad de inyección de plantillas del lado del servidor (SSTI) que no requiere autenticación y permite directamente la ejecución remota de código (RCE). La vulnerabilidad se aprovecha en tres fases mediante cuatro peticiones:
Envenenamiento de los registros con código PHP
Preparación del carrito e inserción de la carga útil SSTI en los datos de dirección del carrito
Ejecución de la SSTI y del código remoto mediante un correo electrónico de pago fallido
Fase 1: inserción de código PHP en los registros
La primera fase consiste en introducir código PHP sin sanear en el disco del sistema objetivo. Reprodujimos un método en nuestros laboratorios y se ha observado al menos otro método confirmado en ataques reales. Es importante señalar que probablemente haya muchas más formas de completar esta fase. La variante que reprodujimos en nuestro entorno registro un mensaje de error sin escapar generado por un código de tienda no válido, lo que conserva el código PHP malicioso incluido en la petición. Una petición tendría un aspecto parecido a este:
POST /graphql HTTP/1.1
Host: {{Hostname}}
Content-Type: application/json
Store: <?=eval(base64_decode('{{payload_b64}}'));?>
{"query":"{ storeConfig { store_code } }"}La carga útil se inserta en el encabezado Store y, en ataques reales, probablemente incluirá contenido codificado para eludir la detección. Cuando Magento registra este error, <?= se guarda sin escapar en el registro, lo cual será importante al llegar a la fase 3. El código PHP concreto variará durante la explotación.
Fase 2: inserción de una carga útil SSTI en los datos de la dirección
La segunda petición prepara un carrito de invitado, y la tercera contiene la carga útil SSTI en la dirección del carrito. La segunda petición no tiene nada destacable, así que se omite por brevedad.
Para entender la carga útil SSTI, es necesario conocer algunos aspectos del motor de plantillas de Magento. El motor de plantillas de Magento sustituye variables mediante «directivas» (por ejemplo, var y block), que se identifican con distintas expresiones regulares según la directiva. Un «filtro» se encarga de procesar las directivas en dos pasadas. En la primera pasada, el filtro resuelve todas las directivas que puede; en la segunda, procesa las directivas «diferidas» que ha firmado un filtro anidado. Cuando se procesa una directiva, esta tiene un filtro principal y su salida coincide con la propia directiva, se «firma» (es decir, *Sig*{{directive}}*Sig*) para que el filtro principal la resuelva.
Aquí empiezan los problemas. Cuando se firma una directiva, se utiliza str_replace sobre la salida para sustituir la directiva original por la firmada. Sin embargo, la salida incluye todas las directivas procesadas anteriormente, no solo la actual. Veamos cómo aprovecha Style Smuggler estas directivas.
Style Smuggler utiliza una plantilla de correo electrónico de pago fallido que realiza un análisis de los campos de la dirección con un filtro anidado. El filtro que procesa la dirección no puede procesar directivas block. Por eso, enviamos lo siguiente en los campos de la dirección de la tercera petición:
street: {{if postcode}}{{var postcode}}{{/if}}{{/var}}{{if postcode}}{{var postcode}}{{/if}}{{if city}}{{block class=Magento\\Email\\Block\\Adminhtml\\Template\\Preview}}{{/if}}
postcode: {{var postcode}}
Cuando el filtro de direcciones procesa el código postal, este coincide con el contenido de la directiva original y se firma. Sin embargo, como str_replace se aplica a toda la salida, las firmas también se colocan donde insertamos {{var postcode}} en la parte de la calle de la dirección. Debido a cierta confusión en la expresión regular que identifica las directivas, la dirección «procesada» final se pasa al filtro de correo electrónico con {{var postcode}}{{var postcode}}Sig{{blockclass=Magento\\Email\\Block\\Adminhtml\\Template\\Preview}}Sig<br /> A continuación, el filtro de correo electrónico resuelve la directiva de bloque firmada que introdujimos en la parte de la calle de la dirección. Antes del parche de Adobe, las directivas de bloque instanciaban la clase indicada, fuera o no una clase «Block», por lo que ahora podemos crear objetos arbitrarios.
Fase 3: conversión de SSTI en ejecución remota de código
Llegados a este punto, tenemos 1) código PHP en un archivo de registro y 2) una vulnerabilidad SSTI capaz de instanciar clases arbitrarias. Para conectar ambas cosas, hay que instanciar una clase que pueda ejecutar el código que insertamos en el archivo de registro en la fase 1. Aquí es donde cobra importancia la inserción de Magento\Email\Block\Adminhtml\Template\Preview. Es una clase capaz de renderizar plantillas a partir de los parámetros de consulta «text», «styles» y «type». Así que enviaremos una petición con los siguientes parámetros de consulta (codificados para URL):
text: {{block class=Magento\Backend\Block\Widget\Grid\ColumnSet rowUrl=$this.template_styles cache_key=y}}
styles (formateado como parámetro de consulta codificado en JSON):
{
"first": "../var/log/system.log",
"generatorClass": "Aws\\S3\\S3Client",
"region": "us-east-1",
"version": "latest",
"s3_us_east_1_regional_endpoint": "regional",
"with_resolved": [
{
"instance": "Magento\\Setup\\Module\\Di\\Code\\Scanner\\ArrayScanner"
},
"collectEntities"
],
"path": "dummy"
}type: 2
En esta petición, también utilizamos simultáneamente la mutación graphql handlePayflowProResponse para iniciar el procesamiento de la plantilla de pago fallido. Esto desencadena la siguiente secuencia de eventos:
El bloque «Preview» que insertamos antes se procesa durante el procesamiento de la plantilla de correo electrónico, lo que hace que se cree el otro bloque de la carga útil, «ColumnSet», a partir del parámetro de consulta «text».
ColumnSet recibe el array «styles» como argumento y llama a «UrlGeneratorFactory» con la «generatorClass» que proporcionamos: «Aws\S3\S3Client».
Durante la construcción de S3Client, se crea la clase «Magento\Setup\Module\Di\Code\Scanner\ArrayScanner» que proporcionamos y se llama al método «collectEntities».
collectEntities llama a «include» con el valor de «first» que proporcionamos en el array styles, que es nuestro archivo de registro envenenado.
El código que colocamos en el archivo de registro se ejecuta durante la inclusión (debido a que
<?=no se ha escapado) y, con ello, conseguimos la ejecución remota de código.
De ahí viene el nombre «Style Smuggler». Utiliza el parámetro «styles» empleado por la clase Preview para introducir de forma encubierta la información adicional sobre gadgets necesaria para ejecutar código. También cabe señalar que podría haber otros gadgets utilizables en la base de código de Magento y que hemos identificado al menos una variante que emplea una carga útil distinta del bloque «Preview».
Plantilla Nuclei
Para ayudar a la comunidad a comprobar qué instancias son vulnerables a Style Smuggler, hemos enviado una plantilla Nuclei para CVE-2026-75650 al repositorio oficial nuclei-templates. Aunque desarrollamos la plantilla nosotros mismos, esperamos para enviarla hasta que Graycore publicara un análisis detallado de la vulnerabilidad y Sansec lo reconociera, para evitar revelar información sobre la vulnerabilidad que hasta entonces no se había divulgado. Probamos la plantilla de forma local con Magento v2.4.9 y v2.4.7-p2 para asegurarnos de que funcionara correctamente en varias versiones.
Parche virtual para CVE-2026-75650
Fastly ha lanzado un parche virtual para CVE-2026-75650 que cubre cada fase del aprovechar Style Smuggler. Esto proporciona defensa en profundidad frente a variantes que afecten a una parte de la cadena y da tiempo a los operadores para aplicar el parche a sus sistemas. Este parche virtual es resistente a los falsos positivos durante las operaciones normales, incluidas las actualizaciones de plantillas de administración, y no guarda relación con los falsos positivos descritos en otros artículos.







