Sítio do Piropo

B. Piropo

< Jornal Estado de Minas >
Volte
07/10/2004

< A imagem do perigo >


Toda vez que vejo surgir um novo vírus ou ser engendrada uma forma nova de contaminar máquinas alheias me vem à mente uma velha frase de Nelson Rodrigues: “A humanidade não deu certo”. Semana passada lembrei-me dela quando soube que já haviam começado a explorar uma nova vulnerabilidade da API de interface com dispositivos gráficos GDI+ incluída em algumas versões de Windows
(ver adiante). Essa falha permite plantar um cavalo de Tróia em uma máquina por meio da simples visualização de uma imagem. Vejamos como isso é possível.
JPEG é um padrão de compressão de arquivos de imagens
(ver adiante). O objetivo inicial era fazer com que esses arquivos ocupassem menos espaço em disco. Depois, com a disseminação da Internet e a necessidade de reduzir o tamanho de arquivos para transferi-los mais rapidamente pela rede, ele tornou-se ainda mais popular. Hoje, quase toda página da Internet que contém imagens apela para esse formato.
Para exibir na tela uma figura no formato JPEG é preciso fazer a análise (“parsing”) do arquivo que a contém. Essa análise é feita por uma rotina de programação contida na GDI+, a interface com dispositivos gráficos incorporada às versões de Windows posteriores a Windows 2000. Pois bem: recentemente descobriu-se que é possível gerar uma condição de “buffer overflow” nessa rotina, condição essa que pode ser explorada para executar código mal intencionado na máquina da vítima.
“Buffer overflow” (“estouro de buffer”) é o nome que se dá a uma falha em uma rotina de programação que permite executar código indevidamente em regiões da memória reservadas para dados. Ela se configura quando se fornece mais informações do que certas estruturas internas podem comportar, fazendo com que “extravasem” (“overflow”) da estrutura e ocupem trechos de memória adjacentes. Um programador engenhoso pode se aproveitar disso para “plantar” código mal intencionado nesses trechos e fazer com que esse código seja executado (para saber mais sobre o assunto consulte o artigo “Buffer overflow” publicado em 21 de janeiro deste ano e disponível na seção “Escritos / Artigos no Estado de Minas” de meu sítio, em <www.bpiropo.com.br>).
Para explorar a vulnerabilidade recém descoberta basta alterar um arquivo de imagem JPEG, “embutindo” entre seus dados um código engendrado para provocar uma condição de “buffer overflow” quando ele for analisado pela rotina contida na GDI+, e convencer a vítima a abrir esse arquivo para visualizar a imagem. Fora isso, nenhuma ação adicional por parte da vítima é necessária.
Fazer alguém visualizar uma imagem JPEG não é muito difícil por duas razões. A primeira é que tais arquivos até agora eram tidos como absolutamente inofensivos. A segunda é que, na maioria dos casos, a visualização desse tipo de imagens é feita à revelia do usuário. Por exemplo: toda vez que se visita uma página da Internet que contém uma imagem no formato JPEG (o que é comum, já que esse é o formato preferido para postar imagens na rede) o Internet Explorer a exibe na tela. E quando se anexa uma foto nesse formato a uma mensagem de correio eletrônico, a imagem é igualmente exibida pelo Outlook Express. Se seu sistema operacional é Windows XP (sem o SP2) ou Windows Server 2003 (ou ainda o Windows XP 64 Bit Edition, mas esse dificilmente será encontrado em um micro doméstico), a análise da imagem é feita usando os “serviços” da GDI+, ou seja, “chamando” a rotina que contém a vulnerabilidade. Assim funcionam a imensa maioria dos programas capazes de exibir imagens JPEG, sejam eles da Microsoft ou não: recorrem às rotinas da GDI+ para exibir imagens.
Essa vulnerabilidade foi anunciada pela própria Microsoft em 14 de setembro passado através do Microsoft Security Bulletin MS04-028 (em
<www.microsoft.com/technet/security/bulletin/ms04-028.mspx>)
onde, além de informações gerais sobre a vulnerabilidade, a MS incluiu uma FAQ que cobre detalhadamente seus aspectos mais relevantes.
Os sistemas operacionais vulneráveis são Windows XP, Windows XP com SP1 (quem já instalou a atualização denominada SP2 não está vulnerável; veja porque adiante), Windows Server 2003 e Windows XP 64 Bit Edition. Além disso, são vulneráveis máquinas que, mesmo não rodando esses sistemas operacionais, tenham instalado algum aplicativo que substitui a antiga GDI pela nova e vulnerável GDI+.

Mesmo sistemas “seguros” exigem cuidados
O fato de que alguns programas gráficos substituem a GDI original pela nova GDI+ tem um desdobramento importante que merece atenção. Suponhamos que você ainda rode Windows 98, 98SE, Me, NT 4.0 ou 2000, não incluídos na lista dos vulneráveis por não usarem a nova GDI+. Sabendo disso, você se sentirá seguro. Há, porém, um detalhe. Como a GDI+ nada mais é que a versão anterior otimizada e expandida, é inteiramente compatível com ela. Por isso alguns aplicativos gráficos, em seu procedimento de instalação, a incluem em substituição à anterior. Se você instalou um desses aplicativos, sua máquina tornou-se vulnerável mesmo que seu sistema operacional esteja na lista dos “seguros”. Portanto, sugiro uma consulta urgente ao Security Bulletin MS04-028 para examinar a relação dos programas que instalam a GDI+. Se algum deles estiver aboletado em sua máquina, aplique imediatamente sua atualização de segurança para eliminar a vulnerabilidade (os atalhos para os sítios onde elas podem ser encontradas estão no mesmo Security Bulletin MS04-028). Note que, como a GDI+ pode ser distribuída livremente por terceiros, portanto não são apenas os programas da Microsoft que podem tornar uma máquina vulnerável.
O problema é tão sério que a própria Microsoft desenvolveu uma ferramenta que investiga as entranhas da máquina para verificar se algum aplicativo gráfico instalou a GDI+. Ela está disponível “online” e para utilizá-la basta visitar a página da Microsoft “September 2004 Security Update for JPEG Processing (GDI+)” (em
<www.microsoft.com/security/bulletins/200409_jpeg.mspx>)
e clicar no botão “Check for Affected Imaging Software”. Mas se você preferir instruções em português, leia o artigo da base de dados da Microsoft 873374, “Descrição da Ferramenta de Detecção Microsoft GDI+: 14 de Setembro de 2004” que pode ser encontrado em
<http://support.microsoft.com/?id=873374>.
Nele há uma descrição pormenorizada de como encontrar, transferir para sua máquina e utilizar a ferramenta de detecção da GDI+, assim como informações para instalar as atualizações de segurança tanto do Windows quanto do pacote Office. E se você não deseja se limitar às informações fornecidas pela própria MS, consulte o Alerta de Segurança TA04-260A do US-CERT em
<www.us-cert.gov/cas/techalerts/TA04-260A.html>.

O perigo está no ar
Embora tornada pública pela própria Microsoft há apenas três semanas, a vulnerabilidade já começou a ser explorada. Em artigo publicado em 22 de setembro na ZDNet (
<http://news.zdnet.com/2100-1009_22-5378260.html?tag=nl>)
, Robert Lemos denunciava que uma amostra de código ensinando a explorá-la havia sido divulgada através da Internet, sintoma seguro que logo algum meliante tentaria se beneficiar dela. E, de fato, oito dias mais tarde o próprio Robert Lemos e Declan McCullagh (em
<http://news.zdnet.com/2100-1009_22-5385995.html?tag=adnews>)
informavam que já haviam sido postadas em grupos de notícias algumas imagens no formato JPEG que, ao serem abertas, faziam com que a máquina se conectasse a um sítio de transferência de arquivos (FTP) e baixasse um arquivo que instalava o programa Radmin, geralmente usado como ferramenta de administração remota, mas que no caso funcionava como “porta dos fundos” (“backdoor”; um programa que permite acesso não autorizado à máquina sem o conhecimento do usuário). Tecnicamente ainda não se tratava de um vírus ou verme, já que não se replicava. Mas representava uma séria ameaça em potencial.
Dois dias depois, ou seja, há exatamente uma semana, um artigo de Dan Ilett, na mesma ZDNet (
<http://news.zdnet.com/2100-1009_22-5390463.html)
dava conta que usuários do programa de troca de mensagens instantâneas (“chat”) da América Online já estavam recebendo mensagens que os remetiam a páginas da Internet onde foram plantadas imagens JPEG que, ao serem abertas, além de instalar uma “backdoor”, faziam a máquina contaminada enviar a mesma mensagem aos membros da lista de contatos da vítima, facilitando sua disseminação. O que torna a ameaça muito mais séria (a mensagem perigosa contém o texto “Check out my profile, click GET INFO”; o atalho “GET INFO” leva à página que contamina a máquina).
Em resumo: o perigo está no ar e já começou a rondar nossas máquinas. Convém se proteger aplicando as atualizações de segurança não apenas em seu sistema operacional como também em todos os aplicativos eventualmente vulneráveis, listados no Security Bulletin MS-04-028 da Microsoft. E, para aqueles que usam o Windows XP e ainda não instalaram o SP2, talvez valha a pena pensar novamente sobre o assunto.

A GDI+
A GDI+ (Graphics Device Interface Plus, ou interface de dispositivos gráficos “plus”) é uma API de Windows usada a partir da versão Windows 2000 que introduziu melhoramentos na interface anterior, a GDI (simples, sem o “plus”) que veio a substituir. Eu sei que isso está parecendo sopa de letras, mas vamos tentar destrinchar.
API (Application Programming Interface) é o nome que se dá a um conjunto de rotinas de programação oferecidas por um sistema operacional para uso dos programas que rodam naquele sistema. Ela serve para simplificar a vida dos programadores, como já veremos.
A GDI+ é a API que engloba as rotinas de acesso aos dispositivos gráficos, ou seja, vídeo e impressora. Ela permite que os programadores exibam informações gráficas (inclusive imagens) nesses dispositivos sem se preocupar com detalhes relativos a cada dispositivo. Se você está desenvolvendo, digamos, um editor de textos que admita a inclusão de fotos para ilustrar o texto, não precisará conhecer os detalhes de programação que cuidarão da exibição da foto na tela. Simplesmente “chamará” as rotinas de programação incluídas na API GDI+, que farão esse trabalho para você. Essas rotinas fazem parte do próprio sistema operacional e estão incluídas em arquivos denominados “bibliotecas de ligação dinâmica” (Dynamic Link Libraries, ou DLLs; o que contém a GDI+ chama-se Gdiplus.Dll). Qualquer programa rodando em Windows pode “chamar” qualquer rotina incluída em um arquivo DLL, desde que use os parâmetros corretos.
A GDI+ foi incluída nos sistemas operacionais Windows XP, Windows Server 2003 e Windows XP 64 Bits Edition. Como sucessora da GDI, que integrava as versões anteriores, é totalmente compatível com esta última, mas além de otimizar muitos de seus recursos, incorpora funções adicionais. Ela é constituída por três componentes: gráficos vetoriais bidimensionais, tipografia e representação de imagens (2-D vector graphics, Typography e Imaging). Este último contém a rotina de análise (“parsing”) de arquivos JPEG onde foi constatada a vulnerabilidade. Maiores detalhes sobre a GDI+ podem ser encontrados no sítio da Microsoft, no artigo da MSDN “Introduction to GDI+” em:
<http://msdn.microsoft.com/library/default.asp?url=/library/en-us/
gdicpp/GDIPlus/AboutGDIPlus/IntroductiontoGDIPlus.asp
>.

< VOLTAR >
O formato JPEG
Uma imagem nada mais é que um conjunto de pontos coloridos. Quando exibida na tela de um computador, cada um desses pontos denomina-se “pixel”, abreviação de “picture cell”, ou célula de imagem. Portanto, no que toca à exibição na tela, uma imagem é um conjunto de pixels. O número de pixels exibidos na tela (ou “resolução” da imagem) e o número de cores que um pixel pode assumir determinam a qualidade da imagem: quanto maiores, melhor a imagem. Quem fixa esses números é o chamado “padrão de vídeo”. Assim, o velho padrão VGA (Vídeo Graphics Array) admitia apenas 480 linhas de 640 pixels, cada um dos quais podia assumir uma entre 256 cores. Já os padrões modernos alcançam resoluções de até 1200 linhas de 1600 pixels, cada um podendo assumir uma entre dezesseis milhões de cores.
Toda imagem pode ser decomposta em pontos “arrumados” em linhas que se dispõem umas acima das outras. A forma mais simples de armazenar uma imagem como essa em um arquivo é anotar o número correspondente à cor de cada ponto de uma linha, repetindo essa ação para todas as linhas que formam a imagem e guardar esses números seqüencialmente em um arquivo. Para reproduzir a imagem na tela, basta ler número a número, “acendendo” o pixel da tela na cor correspondente ao ponto da imagem, repetindo esse processo para cada ponto que forma a imagem. Esse tipo de arquivo chama-se “mapa de bits” (“bitmap”) e geralmente assume a extensão Bmp.
Arquivos no formato BMP costumam ser muito grandes e ocupam excessivo espaço em disco. Por isso surgiram as técnicas para “comprimir” imagens, ou seja, armazená-las em arquivos menores. Com o advento da Internet e a disseminação do uso de imagens em suas páginas, a importância de reduzir o tamanho de arquivos de imagens aumentou consideravelmente. E surgiram então diversos “formatos” de arquivos para esse fim.
Um deles, desenvolvido pelo Joint Photographic Experts Group (Grupo de Especialistas em Fotografia), do qual herdou o nome, é o formato JPEG. Foi concebido para explorar uma limitação conhecida na percepção de cores do olho humano, mais sensível a alterações de brilho que de tonalidade.
Para comprimi-la, a imagem a ser gravada no formato JPEG é varrida por um programa que compara diferenças de brilho e tonalidade em cada pequena região da imagem e codifica essas diferenças, gravando esse código no arquivo. O resultado é um arquivo significativamente menor que um mapa de bits. No entanto, como o padrão é baseado na capacidade da vista humana de apreciar cores, as diferenças podem ser imperceptíveis caso o grau de compressão não seja muito alto (o padrão foi desenvolvido de forma a permitir desde uma compressão relativamente pequena sem perda de qualidade perceptível até grandes graus de compressão com perda de qualidade proporcional; maiores detalhes sobre o Comitê e o padrão JPEG podem ser encontrados em <www.jpeg.org/>).
Quando o padrão foi estabelecido, para “ler” uma imagem JPEG (ou seja, abrir o arquivo, decodificar as informações e exibir a imagem na tela ou imprimi-la na impressora) era necessário um programa especial para efetuar a análise (“parsing”) dos dados contidos no arquivo e transformá-los em informações que pudessem ser usadas pela controladora do vídeo (ou da impressora) para exibir a imagem. Com a disseminação do formato, quase todo programa gráfico – e sistema operacional – incorporou as rotinas necessárias para isso. São justamente essas rotinas, incluídas no GDI+, que apresentam a vulnerabilidade.   

< VOLTAR >
Por que o Windows XP com SP2 não é vulnerável?
A atualização de segurança de Windows XP denominada Service Pack 2 foi liberada recentemente pela Microsoft e tem por objetivo principal aumentar o nível de segurança do sistema operacional através de alterações em seu código e comportamento. Alterações que visam aumento da segurança podem ser bastante radicais e máquinas que rodam Windows XP podem usar configurações bastante diferentes. Sendo assim, era natural que surgissem algumas incompatibilidades. Pois surgiram tantas que a decisão de instalar ou não o SP2 levantou uma enorme controvérsia. Mas, com ou sem eventuais incompatibilidades, o aumento do nível de segurança determinado pela instalação do SP2 é indiscutível. Uma prova disso é o que ocorre com a “vulnerabilidade JPEG”: embora lançado muito antes dela ser divulgada, o SP2 protege a máquina contra ela. Como isso é possível?
Simples: dentre as alterações do código introduzidas com o SP2 há uma que impede que qualquer vulnerabilidade do tipo “buffer overflow” seja explorada. Trata-se de uma função denominada DEP, ou “Data Execution Prevention”, que evita a execução de código em trechos da memória reservado para dados. Ou seja: mesmo que uma rotina seja vulnerável e permita que seja gerada uma condição de “buffer overflow”, ela não poderá ser explorada porque a função DEP impede que o código mal intencionado seja executado. Por isso a vulnerabilidade da rotina de análise de imagens JPEG da GDI+ torna-se inofensiva quando a máquina está protegida pelo SP2.

< VOLTAR >


B. Piropo