Arbitrary Code Execution (ACE) Vulnerability
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply mitigations per vendor instructions or discontinue use of the product if mitigations are unavailable.
Resumo
Spreadsheet::ParseExcel, módulo Perl para ler arquivos XLS/XLSX, executa código Perl arbitrário ao interpretar strings de formatação numérica ('Number format strings') embutidas no próprio arquivo, porque essa interpretação usa eval de string sem sanitização. Qualquer aplicação Perl que chame esse módulo (diretamente ou via Spreadsheet::ParseXLSX) para processar uma planilha vinda de fonte não confiável pode ser levada a executar código do atacante durante o parsing. Está no catálogo KEV da CISA, o que indica exploração confirmada em ambiente real, e existe módulo Metasploit público.
Detalhamento técnico
A falha é uma injeção de eval (CWE-95: Improper Neutralization of Directives in Dynamically Evaluated Code) localizada na função ExcelFmt(), em Spreadsheet/ParseExcel/Utility.pm. Essa função converte formatos de número do Excel (ex.: 'hh:mm:ss AM/PM', ou formatos condicionais como '[>9999999](000)000-0000;000-0000') em valores formatados. Para suportar expressões condicionais, o código traduz a sintaxe do Excel para uma expressão ternária Perl equivalente e a avalia com eval de string.
O problema é que a string de formato número vem diretamente do arquivo XLS/XLSX sendo parseado — ou seja, é dado controlado pelo atacante que cria o arquivo. Nada no código valida ou restringe o conteúdo dessa string antes de submetê-la ao eval. Um atacante que controla o campo de formatação numérica de uma célula pode inserir uma expressão Perl arbitrária ali, e essa expressão é executada no contexto do processo que está fazendo o parsing, no momento em que o valor da célula é formatado.
O vetor de ataque não exige lógica sofisticada de exploração de memória: é injeção de código em uma linguagem de script, então o payload é Perl puro. A dificuldade prática está apenas em construir um arquivo XLS/XLSX binário válido com o campo de formato manipulado — passo documentado pela PoC pública do descobridor (Le Dinh Hai / Barracuda Networks).
Como é explorada
O vetor primário é entregar um arquivo XLS ou XLSX malicioso para qualquer aplicação que use Spreadsheet::ParseExcel (ou dependentes como Spreadsheet::ParseXLSX) para extrair dados dele. Não é necessária autenticação no sentido tradicional (PR:N no CVSS), mas o vetor de ataque é local ao processo (AV:L) e exige interação do usuário ou do sistema (UI:R) — alguém ou algum serviço precisa abrir/parsear o arquivo malicioso. Isso cobre cenários comuns: upload de planilhas em aplicações web escritas em Perl, pipelines de processamento de anexos de e-mail, ferramentas de ETL/relatórios que ingerem XLS de terceiros.
A exploração em si consiste em criar o arquivo com uma string de formato numérico contendo código Perl válido no lugar de uma expressão de formatação legítima. Quando a aplicação vulnerável chama a lógica de formatação (ExcelFmt ou os caminhos internos equivalentes durante o parsing normal do arquivo), o eval de string é disparado e o código do atacante roda com os privilégios do processo Perl — não requer nenhuma técnica de escalonamento adicional, já que o Perl não sandboxa esse eval.
A presença no catálogo KEV da CISA indica exploração confirmada fora de laboratório, e a existência de módulo Metasploit público reduz a barreira de entrada para atacantes menos sofisticados. A CVSS 7.8 (impacto alto em confidencialidade, integridade e disponibilidade, mas escopo local) reflete que o dano é total dentro do contexto do processo, embora o vetor não seja diretamente remoto pela rede — a 'remotização' depende de o alvo processar arquivos vindos de fora, o que é o caso típico de uso desse módulo.
Versões
Como se proteger
A correção definitiva é atualizar Spreadsheet::ParseExcel para a versão 0.66 ou posterior, que contém o patch referenciado no commit bd315927 do repositório oficial. Aplicações que dependem transitivamente do módulo — como Spreadsheet::ParseXLSX — precisam garantir que a versão de ParseExcel puxada como dependência também seja 0.66+, não apenas atualizar o pacote de topo.
Distribuições Linux publicaram backports: Debian LTS corrigiu no pacote libspreadsheet-parseexcel-perl para buster na versão 0.6500-1+deb10u1 (DLA-3702-1); Fedora também publicou atualização via seu canal de anúncios de pacotes. Verifique a versão empacotada na distribuição antes de assumir que 'atualizar o sistema' resolveu — confira o número de versão do pacote Perl especificamente.
No momento da divulgação inicial (advisory da Mandiant), não havia patch disponível, então qualquer afirmação de que existia mitigação por configuração nessa janela é falsa. Não há flag de runtime documentada para desabilitar a avaliação de formato numérico sem alterar o código-fonte do módulo; a única mitigação eficaz é a atualização de versão. Como controle compensatório até a atualização, evite processar arquivos XLS/XLSX de origem não confiável com o módulo vulnerável, ou execute o parsing em ambiente isolado (container/sandbox com privilégios mínimos) para conter o impacto de uma execução de código bem-sucedida.
Como detectar
Não há assinatura de rede confiável, pois o vetor é um arquivo processado localmente pela aplicação, não tráfego de exploração remota direta. O sinal mais útil é inspecionar arquivos XLS/XLSX recebidos (uploads, anexos) por strings de formatação numérica (NumFmt) anormalmente longas ou contendo caracteres típicos de código Perl — aspas, ponto-e-vírgula, chamadas de função, backticks, ou palavras como 'system', 'exec', 'qx' — em campos que deveriam conter apenas padrões de formatação como '#,##0.00' ou '[>9999999](000)000-0000'.
Em nível de host, monitore processos Perl que chamem Spreadsheet::ParseExcel/ParseXLSX gerando processos-filho inesperados (shell, binários de sistema) imediatamente após ler um arquivo de planilha — esse comportamento é atípico para parsing legítimo e é o indicador comportamental mais forte disponível na ausência de assinatura estática confiável.