CVE-2017-17562
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply updates per vendor instructions.
Resumo
Falha de injeção de variáveis de ambiente (CWE-20) no servidor web embarcado GoAhead antes da versão 3.6.5, que permite execução remota de código quando o suporte a CGI está habilitado e o script CGI é um binário dinamicamente vinculado (glibc). Importa porque o GoAhead é usado como componente embutido em firmware de roteadores, câmeras, storage e equipamentos industriais de dezenas de fabricantes — a correção raramente depende do usuário final, e sim de atualização de firmware do fornecedor do dispositivo. Está no catálogo KEV da CISA com exploração confirmada.
Detalhamento técnico
A função cgiHandler, em src/cgi.c, monta o array envp que será passado ao processo CGI via fork/execve. Ela percorre a hash wp->vars — que contém parâmetros de query string, corpo de formulário e alguns cabeçalhos HTTP — e converte cada par chave/valor em uma entrada 'CHAVE=VALOR' do ambiente do novo processo. O único filtro existente bloqueia os nomes REMOTE_HOST e HTTP_AUTHORIZATION; qualquer outro nome de parâmetro definido pelo atacante entra sem sanitização no ambiente do processo filho.
O problema é que o CGI é lançado via execve, e para binários dinamicamente vinculados a glibc, o ld.so honra variáveis de ambiente especiais antes mesmo de a função main() do CGI executar — entre elas LD_PRELOAD, que instrui o linker a carregar uma biblioteca compartilhada adicional e executar seus construtores. Como o atacante controla o nome do parâmetro HTTP (podendo criar um parâmetro chamado literalmente LD_PRELOAD) e o valor associado, ele controla o caminho da biblioteca que será pré-carregada.
O vetor para entregar essa biblioteca sem gravação em disco é o corpo da requisição POST: o GoAhead redireciona o corpo enviado para o stdin do processo CGI (fd 0). Referenciando /proc/self/fd/0 como valor de LD_PRELOAD, o atacante faz o próprio corpo da requisição — um objeto compartilhado ELF válido — ser interpretado pelo dynamic linker como a biblioteca a pré-carregar, sem precisar de escrita em disco nem de outro canal de upload.
O patch (commit 6f786c1) passa a descartar explicitamente os parâmetros REMOTE_HOST, HTTP_AUTHORIZATION, IFS, CDPATH, PATH e qualquer nome iniciado por 'LD_', além de prefixar todos os demais nomes com uma string estática antes de inseri-los no ambiente — eliminando a possibilidade de o atacante forjar um nome de variável de ambiente sensível ao dynamic linker.
Como é explorada
Pré-requisitos reais, e são a parte que a manchete 'RCE crítico' esconde: (1) suporte a CGI precisa estar habilitado no GoAhead — não é o padrão em todo deployment; (2) precisa existir pelo menos um script CGI acessível que seja um executável ELF dinamicamente vinculado à glibc (scripts shell ou binários estaticamente vinculados não são explorável por esse caminho); (3) acesso de rede não autenticado ao endpoint CGI, já que a vulnerabilidade não exige nenhuma credencial (PR:N, UI:N no vetor CVSS). A alta complexidade de ataque (AC:H) no CVSS reflete a necessidade de compilar um payload .so compatível com a arquitetura e a libc exatas do alvo.
Na prática, o ataque consiste em enviar uma requisição POST para o caminho do script CGI, incluindo um parâmetro (via query string ou corpo de formulário) cujo nome é interpretado como variável de ambiente — por exemplo LD_PRELOAD — com valor /proc/self/fd/0, e colocando no corpo da própria requisição um objeto compartilhado ELF malicioso compilado para a arquitetura do dispositivo alvo (x86, x86_64, ARM, MIPS etc., dado que GoAhead roda em uma variedade grande de embarcados). Quando o GoAhead faz fork/execve do CGI, o dynamic linker carrega esse 'arquivo' como biblioteca e executa seu código de inicialização com os privilégios do processo do servidor web — frequentemente root em dispositivos embarcados.
Existe PoC pública detalhada da elttam (que descobriu a falha) com ferramenta de exploração (makemyday.py, exploit-db 43360) e um módulo Metasploit (43877, 'GoAhead Web Server LD_PRELOAD Arbitrary Module Load') que já embute stubs de payload compilados para múltiplas arquiteturas Linux (x86, x86_64, ARM, ARM64, MIPS, SPARC, s390x etc.), tornando a exploração praticamente automatizada assim que os dois pré-requisitos (CGI habilitado + binário dinamicamente vinculado) são confirmados. A presença no catálogo KEV da CISA confirma exploração ativa observada, embora a CISA não detalhe a campanha específica.
Versões
Como se proteger
A correção do fornecedor é atualizar para GoAhead 3.6.5 ou posterior, onde cgiHandler passa a bloquear os nomes de variável REMOTE_HOST, HTTP_AUTHORIZATION, IFS, CDPATH, PATH e qualquer nome iniciado por 'LD_', além de prefixar as demais variáveis antes de inseri-las no ambiente do processo CGI. Como o GoAhead é tipicamente embutido em firmware de terceiros (roteadores, câmeras, storage, equipamentos industriais — inclusive produtos Oracle cobertos no CPU de abril/2018), a atualização real depende do fornecedor do dispositivo lançar um firmware com a versão corrigida da biblioteca; não há pacote 'goahead' isolado para atualizar na maioria dos casos.
Se não for possível atualizar o firmware, o paliativo mais eficaz é desabilitar completamente o suporte a CGI no GoAhead, quando essa opção existir na configuração do dispositivo — isso remove o vetor por completo, ao custo de perder qualquer funcionalidade que dependa de scripts CGI expostos pelo produto. Onde CGI é indispensável, restringir o acesso à rede aos endpoints /cgi-bin/* via segmentação de rede ou controle de acesso reduz a superfície, mas não elimina o risco caso o atacante já tenha alcance à rede interna.
Filtrar em WAF/proxy nomes de parâmetro que comecem com 'LD_' ou correspondam a IFS/CDPATH/PATH é um controle compensatório parcial, mas não é garantia: qualquer variável de ambiente não filtrada e relevante ao runtime do CGI ainda representa risco, e depender de blocklist de nomes é frágil. Não funciona como mitigação: assumir que o firewall de borda protege o dispositivo — muitos desses embarcados expõem a interface de administração também na rede interna, e o vetor exige apenas alcance TCP ao endpoint CGI, não exposição direta à internet.
Como detectar
Em logs de acesso do CGI ou proxy reverso, procurar requisições (especialmente POST) para caminhos de CGI/CGI-bin contendo parâmetros de query string ou corpo de formulário com nomes como LD_PRELOAD, LD_LIBRARY_PATH, IFS, CDPATH ou PATH — nomes que legitimamente não aparecem em parâmetros de aplicação. Corpos de requisição iniciando com o magic number ELF (0x7f 0x45 0x4c 0x46, isto é, '\x7fELF') enviados a endpoints CGI, ou valores de parâmetro referenciando /proc/self/fd/0, são indicadores fortes de tentativa de exploração dessa CVE especificamente.
Não há um sinal de rede único e confiável além desses padrões, já que a exploração usa parâmetros HTTP arbitrários e não modifica a URL de forma padronizada — templates Nuclei e o módulo Metasploit existentes automatizam essa checagem enviando o payload de teste e observando o comportamento do processo CGI, mas ambientes que não logam corpo de requisição ou nomes de parâmetro POST completos podem não deixar rastro utilizável para detecção retroativa.