CVE-2009-1151
Patch now. It under exploitation confirmed by CISA and has a working public exploit.
Apply updates per vendor instructions.
Summary
Falha de injeção de código PHP no assistente de instalação/configuração do phpMyAdmin (scripts/setup.php nas versões 2.11.x, setup/ nas versões 3.x). Um atacante remoto, sem autenticação no phpMyAdmin, consegue gravar código PHP arbitrário dentro do arquivo de configuração gerado pelo wizard, obtendo execução remota de código no servidor web. O impacto real depende de uma pré-condição pouco destacada na descrição oficial: o script de setup precisa estar presente e acessível, e o diretório de configuração precisa ser gravável pelo processo do servidor — condição comum em instalações que não removem o wizard após a configuração inicial, mas ausente em muitas instalações de produção hardened.
Technical detail
O phpMyAdmin inclui um assistente web (scripts/setup.php na série 2.11.x, setup/index.php na série 3.x) cuja função é gerar o arquivo config.inc.php a partir de dados submetidos via formulário HTTP. A ação 'save' desse assistente serializa os valores enviados pelo usuário e os escreve diretamente como código PHP dentro do arquivo de configuração, sem neutralizar adequadamente caracteres que rompem o contexto de string/array PHP em que o valor é inserido.
How it’s exploited
O vetor é uma requisição HTTP direta ao script de setup com a ação 'save', sem necessidade de login no phpMyAdmin propriamente — o assistente de configuração é, por design, uma ferramenta pré-autenticação usada para gerar a config antes mesmo de existir um usuário de banco configurado. O atacante controla um ou mais campos do formulário de configuração e usa esse controle para romper a sintaxe esperada e inserir instruções PHP próprias, que ficam persistidas em disco no arquivo gerado.
A pré-condição real de exploração é dupla: (1) o script de setup precisa estar acessível via web — instalações que removem scripts/setup.php ou o diretório setup/ após a configuração inicial, ou que restringem seu acesso, não são exploráveis por essa via; (2) o processo do servidor web precisa ter permissão de escrita no diretório onde o config.inc.php é salvo. Onde essas duas condições existem — o que é frequente em deployments padrão feitos rapidamente, sem hardening pós-instalação —, a exploração é trivial: uma única requisição HTTP não autenticada resulta em código PHP persistido e executado a cada carregamento subsequente da aplicação, ou diretamente se o arquivo gerado for acessível via URL.
A vulnerabilidade está no catálogo KEV da CISA (exploração confirmada em campo), tem módulo Metasploit público e template Nuclei, o que indica automação de varredura e exploração amplamente disponível. Isso eleva o risco prático mesmo para uma falha antiga: instâncias esquecidas e nunca atualizadas continuam sendo alvo de scanners automatizados até hoje.
Versions
How to protect
Atualizar para phpMyAdmin 2.11.9.5 (ramo 2.11.x) ou 3.1.3.1 (ramo 3.x) resolve a falha na origem. Distribuições Linux publicaram backports próprios — o aviso do openSUSE e o GLSA do Gentoo (referenciados abaixo) tratam da mesma correção empacotada para seus respectivos repositórios; consulte o gerenciador de pacotes da distribuição para a versão corrigida específica.
Se a atualização imediata não for possível, o paliativo real é remover ou bloquear o acesso ao script/diretório de setup (scripts/setup.php na série 2.11.x, setup/ na série 3.x) depois que a configuração inicial for concluída — essa é justamente a prática recomendada pelo próprio projeto phpMyAdmin independentemente da CVE, e elimina o vetor de ataque por completo enquanto a atualização de versão não ocorre. Restringir a escrita no diretório de configuração para o processo do servidor web (permissões somente leitura após a instalação) também reduz o impacto, ainda que não elimine a superfície se o setup permanecer acessível.
O que não funciona como mitigação: apenas trocar a senha de administração do phpMyAdmin ou restringir o acesso à interface principal da aplicação não protege contra essa falha, porque o script de setup explorado é separado da autenticação normal do phpMyAdmin e é acessado antes de qualquer login.
How to detect
Procurar em logs do servidor web por requisições (tipicamente POST) para scripts/setup.php (série 2.11.x) ou para o diretório setup/ (série 3.x) contendo o parâmetro de ação 'save' com payload anômalo nos campos de formulário — presença de tags PHP (``), chamadas a funções de execução (system, exec, eval, passthru) ou sequências que rompem aspas/arrays dentro dos valores submetidos são indício direto de tentativa de exploração. Verificar também modificações inesperadas em config.inc.php (timestamp, hash, diff de conteúdo) e a existência residual de scripts/setup.php ou do diretório setup/ em instalações que deveriam tê-los removido — sua mera presença já é um indicador de exposição, independentemente de log de exploração bem-sucedida.