← voltar
CVE-2017-17562highsob ataque

CVE-2017-17562

100Vexday Risk Score

Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.

ssvc Actcvss 8.1epss 96%
da publicação à arma6 dias
Publicada no NVD12 de dez.
1ª PoC+6d
metasploit+6d
CISA KEV+1459d
probabilidade de exploração
96%top 1% das CVEs
exploração observada
simCISA + VulnCheck
14 exploit(s) público(s)
Ação exigida pela CISAprazo federal: 2022-06-10

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

Afetadas
Embedthis GoAhead antes da versão 3.6.5 (elttam relata ter confirmado a falha em todas as versões testadas a partir da 2.5.0, sem ter conseguido testar versões anteriores).
Corrigidas em
GoAhead 3.6.5 e posteriores, via commit 6f786c1 em src/cgi.c.

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.

Pesquisado e redigido com IA a partir do advisory do fornecedor e de análises públicas, com as fontes acima. Confira sempre a versão corrigida no advisory oficial antes de agir.
Embedthis GoAhead before 3.6.5 allows remote code execution if CGI is enabled and a CGI program is dynamically linked. This is a result of initializing the environment of forked CGI scripts using untrusted HTTP request parameters in the cgiHandler function in cgi.c. When combined with the glibc dynamic linker, this behaviour can be abused for remote code execution using special parameter names such as LD_PRELOAD. An attacker can POST their shared object payload in the body of the request, and reference it using /proc/self/fd/0.
CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H
Produtos afetados
n/a · n/a
⚠ Recursos públicos, para você avaliar a exposição de sistemas que controla ou está autorizado a testar. Teste apenas com autorização.