id: "BATCH-298" title: "Atualização de Segurança PHP2Shell no Lab, Prod, Docker e Composer (REQ-290)" status: "implemented-pending-review" date: "2026-10-21" author: "executor" target_repo: "conn2flow" summary_short: "Mitigação emergencial das vulnerabilidades críticas PHP2Shell (CVE-2026-109618 e CVE-2026-109619). Atualização de pacotes nos servidores SSH (Lab e Prod), rebuild dos containers Docker locais e restrição de versão no composer.json do Core."
BATCH-298 — REQ-290
-
Branch Sugerida:
feat/req-290(no repositórioconn2flow) -
Requisição: req-290.md
? Live Todo List
-
[ ] 1. Diagnóstico Inicial de Versões
-
[ ] Verificar versão local do PHP (
php -v) -
[ ] Verificar versão no Lab via SSH (
[REDACTED] php -v) -
[ ] Verificar versão em Produção via SSH (
[REDACTED] php -v)
-
-
[ ] 2. Atualização dos Servidores Remotos (SSH)
-
[ ] Lab: Atualizar pacotes PHP (
apt update && apt upgrade ...), reiniciar serviços (systemctl restart php*-fpm apache2) e validarphp -v -
[ ] Prod: Atualizar pacotes PHP, reiniciar PHP-FPM / webserver e confirmar estabilidade de
conn2flow.com
-
-
[ ] 3. Atualização do Ambiente Docker Local (
dev-environment/docker)-
[ ] Inspecionar
DockerfileeDockerfile.php85 -
[ ] Recompilar containers com
docker compose build --no-cache -
[ ] Testar container e validar versão via
docker compose exec ... php -v
-
-
[ ] 4. Governança no Core (
conn2flow/composer.json)-
[ ] Inserir restrição segura de versão mínima de PHP no
composer.json -
[ ] Executar suíte de testes unitários (
vendor/bin/phpunit) para garantir regressão zero
-
-
[ ] 5. Evidências e Fechamento
-
[ ] Anotar versões finais instaladas em Lab e Prod
-
[ ] Commit explícito das alterações de arquivos (sem
git add -A)
-
Evidências — Diagnóstico (2026-10-21, ~16:20 UTC, executor)
Branch feat/req-290 criada a partir de main (c19151bc).
| Alvo | PHP ativo (php -v) |
Pacotes fpm instalados | Melhor disponível no repositório |
|---|---|---|---|
| Local (Windows CLI) | 8.5.8 | — | — |
| Lab (Ubuntu 22.04, HestiaCP, PPA ondrej) | 8.5.10 | 8.1.34 / 8.2.33 / 8.3.33 / 8.4.24 / 8.5.10 (+5.6–8.0) | 8.3.35 / 8.5.11 (apt-cache madison) |
| Prod (Ubuntu 22.04, HestiaCP, PPA ondrej) | 8.5.10 | 8.1.34 / 8.2.33 / 8.3.33 / 8.4.25 / 8.5.10 | 8.2.34 / 8.3.35 / 8.4.26 / 8.5.11 (cache apt) |
Docker php:8.3-apache / php:8.5-apache |
rebuild --no-cache --pull → 8.3.35 |
— | tags 8.3.36-apache / 8.5.12-apache publicadas 15:38 UTC como índice vazio: docker pull → no matching manifest for linux/amd64 |
-
php.net confirma os releases de segurança 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12 de 21/10/2026.
-
Bloqueio upstream: o PPA ondrej ainda não publicou as versões corrigidas (Launchpad respondendo 503 no
apt-get updatedo Lab) e as imagens oficiais do Docker ainda não têm build amd64. Rodarapt upgradeagora só levaria às versões anteriores ao patch, ainda vulneráveis. -
conn2flow.com→ HTTP 200,[REDACTED](a Cloudflare anunciou regras de WAF iniciais para os vetores conhecidos). -
PHP 8.1 (instalado em Lab e Prod): fora de suporte; correção só por backport.
-
Composer:
">=8.2.35"não barra 8.3.35 nem 8.5.10 (são numericamente maiores). Ogestor/vendor/composer/platform_check.phpé versionado: uma restrição correta derrubaria com erro fatal toda instalação ainda sem patch, inclusive as nossas hoje. Decisão de arquitetura pendente. -
Nenhuma alteração feita em Lab, Prod ou containers ativos. A imagem de teste local foi removida.
Evidências — Exposição da origem em Prod (2026-10-21, ~16:40 UTC)
-
A origem
[REDACTED]responde 200 (nginx) nas portas 80 e 443 com[REDACTED], sem passar pela Cloudflare: o WAF pode ser contornado. -
O painel do Hestia na porta
8083responde 200 em[REDACTED]e[::]. Rodahestia-php8.5.9, também vulnerável. -
IPv6
2a02:4780:6e:3d80::1: políticaINPUT ACCEPT, sem regras; o firewall do Hestia só gerencia IPv4. Os sites só escutam no IPv4; no IPv6 só o 8083 fica exposto. -
Firewall do Hestia: as regras 2 (8083) e 9 (80,443) aceitam
[REDACTED]/0. Não há ipsets. -
DNS: os três sites e os subdomínios
ia-parceria,dev.[REDACTED]efsmjd.[REDACTED]são proxied pela Cloudflare. Ficam fora do proxy (DNS-only):server.conn2flow.com,webmail.{conn2flow,[REDACTED],[REDACTED]}.com,webmail.server.conn2flow.comemail.*. -
A mitigação no firewall foi autorizada pelo humano, mas o comando de escrita remota foi negado pela política de permissões do agente. Nada foi alterado em Prod.
Evidências — Mitigação de rede em Prod (2026-10-21, 13:31 hora do servidor, aplicada pelo humano)
O humano executou como root os comandos preparados pelo executor; o agente só verificou, em modo leitura.
-
Backup em
[REDACTED](iptables-before.rules,firewall-data-before/). -
ipset
cloudflarecriado a partir de[REDACTED](15 faixas,AUTOUPDATE='yes'). -
Regra 9:
80,443só deipset:cloudflare. Regra 11:80,443do IP do operador[REDACTED]. Regra 2:8083só de[REDACTED]. -
IPv6:
ip6tables -A INPUT -p tcp --dport 8083 -j DROP(a política continua ACCEPT; a regra não sobrevive a reboot). -
Verificação pela Cloudflare: conn2flow.com 200, [REDACTED].com 200, [REDACTED].com 200, ia-parceria 200, dev.[REDACTED] 302, fsmjd.[REDACTED] 200.
-
Efeito colateral esperado:
webmail.*eserver.conn2flow.com(DNS-only) passam a responder só para o IP do operador. IMAP, SMTP e POP não foram afetados. -
Pendências: ligar o proxy da Cloudflare em
webmail.*; atualizar o PHP (sury) e ohestia-phpquando os pacotes corrigidos saírem; reconstruir o Docker quando as imagens amd64 8.3.36/8.5.12 forem publicadas; decidir a restrição no composer.
Evidências — Lançamentos parciais e tentativa no Lab (2026-10-21, ~16:40 UTC)
-
Verificador (
check-php2shell.sh): o PPA ondrej publicou 8.2.35 e 8.3.36. Continuam pendentes 8.4 (em 8.4.26), 8.5 (em 8.5.11),hestia-php(em 8.5.9) e as imagens Docker amd64. -
Prod por PHP: 8.5 atende conn2flow.com, [REDACTED].com, dev.[REDACTED], [REDACTED].com, ia-parceria e server; 8.2 atende fsmjd.[REDACTED]; 8.3 (pool
www) atende o webmail. -
Lab,
apt-get install --only-upgradedos 44 pacotes php8.2/8.3 com status ii: falhou com 503 do Launchpad em 16.deb. O apt abortou antes de instalar, então o Lab segue em 8.2.33/8.3.33 com fpm ativo e sem erros no journal. -
Certificados de origem: válidos (
ssl_verify=0) em todos os nomes, menosdev.[REDACTED].com. O webmail proxied entrou em loop de 301 com o SSL Flexible; a orientação é Full (strict) nas zonas conn2flow e [REDACTED] e Full na [REDACTED]. -
O agendamento do verificador foi negado pela política do agente (persistência); o loop fica a cargo do humano (
/loop).
Evidências — Docker local corrigido (2026-10-21, ~17:15 UTC)
-
As imagens oficiais amd64
php:8.3.36-apacheephp:8.5.12-apacheforam publicadas. Fixei as tags emdev-environment/docker/DockerfileeDockerfile.php85, para que um cache antigo nunca volte a uma versão vulnerável. -
docker compose build --no-cache --pull app(via WSL) nos três compose:docker-compose.yml→ PHP 8.3.36;docker-compose.php85-mysql.ymledocker-compose.php85-pgsql.yml→ PHP 8.5.12. Os três geram a mesma imagemdocker-appe o último build vence; por isso reconstruí o principal por último (8.3.36). -
Varredura nos 8 repositórios da workspace (arquivos versionados): só o
conn2flowusa imagem PHP. [REDACTED] e nexus são Python, o mcp-hub é Node; ogestor/vendor/cakephp/chronos/Dockerfileé de terceiros e não entra no ambiente. Ophpmyadmin/phpmyadmin:latestnão está fixado e não estava em execução. -
Vigia no Lab (
php2shell-watch.timer) instalado pelo humano. A primeira versão tinha um bug de locale: oapt-cacheem pt-BR escreve "Candidato:". Corrigido comLC_ALL=C; falta o humano reinstalar o script.
Evidências — Lab no PHP 8.2.35 (2026-10-21, ~18:15 UTC)
-
O vigia do Lab instalou 8.2.35 (cli e fpm, serviço ativo, journal limpo). O 8.3.36 segue pendente por 503 do Launchpad.
-
Compatibilidade:
gestor/vendor/composer/platform_check.phpexige>= 8.2.0.php8.2 -lno gestor instalado no Lab, semvendor/: 0 erros em 7.559 arquivos (v3.1 685, [REDACTED] 4.577, [REDACTED] 651, [REDACTED] 1.646). -
v-change-sys-php 8.2trocou o PHP padrão, mas regenera os domínios antes doupdate-alternatives. Foi preciso rodarv-rebuild-web-domainsem cada usuário para levar os pools para/etc/php/8.2/fpm/pool.d/(11 sockets 8.2; no 8.5 ficou só odummy). -
Regressão causada pela regeneração e corrigida: 6 sites com o template nginx
conn2flow(listen %ip%:port) entraram em loop de 301. O Caddy chega porhost.docker.internal([REDACTED]:8443) e caía nodefault_server. Os arquivos tinham sido ajustados à mão antes (havia backup.orig-ipna v3.1). Correção duradoura:v-change-web-domain-tpl ... conn2flow-req092(idêntico, só comlisten %web_ssl_port%) em [REDACTED], [REDACTED], [REDACTED].local, [REDACTED].local, [REDACTED] e [REDACTED];nginx -tok. -
Resultado pelo Caddy: 10 sites com 200 e página completa, nenhum fatal.
[REDACTED]segue em 301 porSSL='no'(situação anterior, sem relação com a troca). -
[REDACTED] (sugerido no fórum do Hestia, post de eris em 21/10/2026) já publica para jammy: 8.2.35, 8.3.36, 8.4.27 e 8.5.12. O Launchpad (PPA) está atrasado e devolvendo 503.
Evidências — Lab definitivo pelo [REDACTED] (2026-10-21, ~18:40 UTC)
-
Fonte do apt:
ondrej-ubuntu-php-jammy.listrenomeada para.disabled; criadaphp-sury.list(deb [signed-by=/usr/share/keyrings/[REDACTED]-php.gpg] [REDACTED] jammy main), chave RSA 3072 de 2019. -
apt-get install --only-upgradede 62 pacotes php8.3/8.4/8.5 com status ii: rc=0, 50Setting up, sem E:/W:. Vigia pausado durante a atualização e reativado depois. -
php-fpm -v: 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12, todosactive. -
v-change-sys-php 8.5+v-rebuild-web-domainsem cada usuário: 11 sockets 8.5,nginx -tok, CLIPHP 8.5.12. Os 10 sites conn2flow responderam 200 pelo Caddy, sem fatal; o templateconn2flow-req092segurou a regeneração.
Evidências — Produção corrigida (2026-10-21, ~19:00 UTC, aplicado pelo humano)
-
O humano trocou a fonte para o
[REDACTED]e atualizou os pacotes php8.2 a 8.5 com status ii.php-fpm -v: 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12, todosactive; CLIPHP 8.5.12. Oneedrestartadiou só serviços do sistema (dbus, logind, networkd-dispatcher, unattended-upgrades, user@0). -
Pela Cloudflare: conn2flow.com 200 (263 KB), www 200, ia-parceria 200, [REDACTED].com 200, dev.[REDACTED] 200, [REDACTED].com 200, fsmjd.[REDACTED] 200 (7,4 s: primeiro acesso com o pool ondemand frio). Nenhum fatal.
-
Webmail direto na origem (IP do operador liberado): os três
webmail.*respondem 200 com Roundcube. -
Pools: 8.5 atende conn2flow, dev.[REDACTED], ia-parceria, server, [REDACTED] e [REDACTED]; 8.2 atende fsmjd; 8.3 atende o
www(webmail). Nenhum fatal nos logs de erro dos últimos 15 minutos. -
Pendências:
hestia-php(painel, 8.5.9, aguardando o Hestia; a 8083 segue restrita); remover o PHP 8.1 (sem correção oficial); SSL Full/Full (strict) na Cloudflare para o proxy do webmail;ip6tablesda 8083 não persiste após reboot; decisão sobre a restrição de PHP nocomposer.json. -
E-mail do cron durante o upgrade (transitório):
undefined symbolem mysqlnd/mysqli/mbstring/dom e o fatalmysqli_report()emcron.php. O cron das 15:32:01 rodou entre a troca dophp8.5-mysql(15:31:57) e a dophp8.5-common(15:32:10). Depois disso: CLI 8.5.12 com mysqli, mbstring e dom carregados, 0 avisos de startup; o cron das 15:34 às 15:36 roda "Concluido" com tarefas[sucesso]. As extensões PECL (apcu, redis, imagick, igbinary, imap, pspell) têm versão própria, o que é normal.
Handoff para o Macro-Arquiteto (topologia dupla)
-
Projeto: conn2flow (Core) · Raiz:
[REDACTED]· REQ-290 / BATCH-298 · branchfeat/req-290, sem push. -
Critérios de aceite:
-
Lab atualizado: ✅ 8.2.35 / 8.3.36 / 8.4.27 / 8.5.12; 10 sites com 200.
-
Prod atualizado: ✅ mesmas versões; 7 sites e 3 webmails respondendo; cron saudável.
-
Docker local: ✅ 8.3.36 / 8.5.12, com tags fixadas.
-
Composer: ⚠️ não aplicado.
">=8.2.35"não barra 8.3.35 nem 8.5.10, e oplatform_check.phpversionado transforma qualquer restrição em fatal nas instalações sem patch. Pede decisão do Arquiteto: restrição por ramo (~8.2.35 || ~8.3.36 || ~8.4.27 || >=8.5.12) ou aviso no painel (recomendado). A suíte phpunit não foi rodada porque não houve mudança de código PHP. -
Evidências: ✅ neste arquivo.
-
-
Fora do escopo original, feito por necessidade: firewall de Prod (80/443 só Cloudflare, 8083 só para o IP do operador, DROP da 8083 em IPv6) aplicado pelo humano; fonte do apt trocada para
[REDACTED]no Lab e em Prod; template nginxconn2flow-req092em 6 domínios do Lab. -
Pendências:
hestia-php8.5.9 (aguardando o Hestia; 8083 restrita); remover o PHP 8.1 de Lab e Prod; SSL Full/Full (strict) na Cloudflare para o webmail; persistir oip6tables; decisão sobre o composer; marcar o VALIDATION-CHECKLIST na homologação. -
Autonomia: escritas em Prod e persistência no Lab foram barradas pelo classificador do agente e executadas pelo humano. O agente não fez deploy nem alteração autônoma em produção.