CVE-2017-8291
Corrija agora. Ela está sob exploração confirmada pelo CISA e tem exploit funcional público.
Apply updates per vendor instructions.
Resumo
Falha de type confusion no interpretador PostScript do Ghostscript permite que um documento .eps/.ps malicioso desative a proteção -dSAFER e execute comandos arbitrários no sistema, através do pseudo-dispositivo de saída %pipe%. Foi explorada in the wild em abril de 2017 antes de existir qualquer patch público, o que motivou sua inclusão no catálogo KEV da CISA. O risco real está em qualquer software que invoque o gs internamente para renderizar imagens — não só em quem chama o binário gs diretamente.
Detalhamento técnico
O operador .rsdparams do interpretador PostScript do Ghostscript não validava corretamente o tipo do operando recebido na pilha (CWE-843, type confusion / missing type check). Tavis Ormandy demonstrou que basta um valor numérico malformado passado a .rsdparams (ele cita o teste mínimo "16#41414141 .rsdparams", sem o prefixo hexadecimal) para corromper a pilha de operandos de um jeito que engana o interpretador sobre o tipo do dado manipulado. O operador .eqproc tinha o mesmo problema e também precisou ser corrigido.
Essa corrupção é usada para desativar a flag -dSAFER, que existe justamente para impedir que um documento PostScript acesse o sistema de arquivos ou o shell. Com -dSAFER neutralizado, o atacante usa a diretiva /OutputFile combinada com o pseudo-dispositivo %pipe% do Ghostscript — um recurso legítimo que permite direcionar a saída de renderização para um processo externo via shell — para forçar o gs a executar um comando arbitrário do sistema operacional.
O vetor de entrada é um arquivo .eps (Encapsulated PostScript) construído para acionar essa sequência: corromper a pilha via .rsdparams/.eqproc, burlar o SAFER, e então declarar um /OutputFile contendo a string "%pipe%" seguida do comando desejado. O atacante controla integralmente o conteúdo do arquivo PostScript e, por consequência, o comando executado.
O relatório inicial foi feito à Atlassian pelo próprio time de segurança da empresa, que identificou o problema em produtos que processavam arquivos enviados por usuários. O bug upstream (697808) foi marcado como duplicata do bug 697799, que trata da correção definitiva no código do Ghostscript.
Como é explorada
O vetor mais comum não é chamar o binário gs diretamente, mas sim qualquer aplicação que delega renderização de imagem a bibliotecas que internamente invocam o Ghostscript para tipos PostScript/EPS/PDF — ImageMagick, GraphicsMagick e Pillow são citados explicitamente pela Atlassian como caminhos de exposição. Isso significa que um simples upload de "imagem" — na prática um arquivo PostScript disfarçado ou com extensão trocada — processado por uma rotina de thumbnail, conversão ou validação de imagem pode disparar a execução.
O CVSS classificado como AV:L reflete que a exploração ocorre localmente dentro do processo que interpreta o arquivo (o próprio gs), não que exija acesso à rede da máquina — o vetor de entrega do arquivo malicioso pode perfeitamente ser remoto (upload web, anexo de e-mail, pipeline de processamento de mídia). UI:R indica que é necessária uma ação que dispare o processamento do arquivo (abrir, converter, gerar thumbnail), mas não exige interação sofisticada da vítima. Não há exigência de autenticação (PR:N) nem de configuração não padrão: -dSAFER é o comportamento default do Ghostscript e é justamente o que a falha contorna.
A exploração ativa registrada em abril de 2017 ocorreu antes da publicação do patch, o que a torna um caso clássico de zero-day explorado in the wild — daí a listagem no catálogo KEV. Existem módulo público no Metasploit e PoCs publicadas, o que baixou bastante a barreira técnica para replicar o ataque depois da divulgação.
Versões
Como se proteger
A correção definitiva está nos patches aplicados diretamente no repositório git do Ghostscript (ghostpdl), commits 04b37bbce1 e 4f83478c88, com duas correções adicionais posteriores para regressões: 57f20719 (problema com a feature DELAYBIND) e ccfd2c75ac (correção de checagem de underflow da pilha de operandos). Quem compila o Ghostscript a partir do código-fonte deve aplicar essa cadeia completa de patches, não apenas o primeiro commit.
Para quem usa pacotes de distribuição, a correção chegou via backport: Red Hat publicou RHSA-2017:1230 para RHEL 6 e 7 (ghostscript-9.07-20.el7_3.5 e equivalentes), SUSE tratou no bug 1036453, e Gentoo publicou o GLSA 201708-06. Atualizar para o pacote ghostscript da distribuição igual ou posterior a essas correções resolve o problema nessas plataformas.
Como -dSAFER é justamente o mecanismo neutralizado pela falha, confiar apenas nessa flag como controle compensatório é o mito a evitar — ela não protege contra este bug específico. Um paliativo real e de baixo custo usado amplamente na época (no mesmo contexto do ImageTragick) é remover ou desabilitar, na política do consumidor de imagens (por exemplo policy.xml do ImageMagick), o suporte a coders PS, EPS e PDF que acionam o Ghostscript internamente, além de evitar que arquivos enviados por usuários sejam processados por essas rotinas sem sandboxing (chroot, contêiner isolado, seccomp) restringindo acesso a shell e sistema de arquivos do processo que roda o gs.
Como detectar
Buscar em arquivos PostScript/EPS recebidos ou armazenados pela ocorrência simultânea das strings ".rsdparams" (ou ".eqproc") com "/OutputFile" e "%pipe%" — essa combinação é o indicador mais direto de tentativa de exploração, já presente na própria descrição da CVE. Também vale monitorar processos filhos inesperados spawnados a partir do processo gs (via auditd/EDR), já que a exploração bem-sucedida resulta em execução de shell a partir do interpretador. Não há assinatura de rede confiável, porque a entrega do arquivo malicioso pode ocorrer por qualquer canal (upload HTTP, e-mail, compartilhamento de arquivo) e o processamento é local ao host que roda o Ghostscript.