Segurança com USB, Firewire e PCMCIA

Law #3 - If a bad guy has unrestricted physical access to your computer, it's not your computer anymore.

Ao fazer análise de riscos ou definir uma estratégia de segurança, a maioria de nós foi treinada para assumir que o hardware é confiável. Afinal de contas o hardware seria uma entidade físicaimutável, em contraste com a natureza abstrata e volátil do software. Daí vem por exemplo a recomendação de após um incidente recomeçar tudo do zero reinstalando os softwares a partir de uma mídia confiável - quanto ao hardware se assume que ele sempre permaneceu sadio.

Já comentei aqui anteriormente sobre como essa premissa é falsa. Muito do que chamamos genericamente de hardware na verdade é feita de software, e software que é bastante mutável. A BIOS, o firmware nas placas PCI e até mesmo o microcódigo dos processadores podem ser comprometidos por um atacante, algo possível não só na teoria quanto na prática. A única coisa que impede que ataques desse tipo sejam mais comuns é não existir uma padronização na forma de acesso a estes locais: para ataques de chance como vírus e worms você precisa ter uma plataforma popular que tenha massa crítica para ser explorada, e no caso do hardware cada dispositivo ou fabricante tem sua própria forma de atualização. No entanto para ataques direcionados vamos ver cada vez  a BIOS e dispositivos PCI sendo usados para persistir malware.

Mas a premissa é falsa também sobre outro aspecto: o hardware do seu PC não é imutável. Ao contrário, ele pode ser facilmente estendido hoje em dia usando interfaces como USB, Firewire ou PCMCIA. Basta conectar o cabo e voilà! o seu PC ganhou um novo disco, uma nova interface de rede ou um dispositivo de entrada, graças às maravilhas do Plug´n´Play.

No entanto ao fazer isso o usuário está também implicitamente tomando uma decisão de segurança, e escolhendo confiar no dispositivo - a mesma decisão que ele faz por exemplo ao instalar um software no seu PC. A arquitetura dos PCs foi desenhada para tratar estes periféricos como intrinsecamente confiáveis, e não existe uma fronteira de confiança definida entre os diversos componentes de hardware dentro de um sistema. Da mesma forma que um software rodando com privilégios administrativos, se um dispositivo de hardware tiver um comportamento malicioso o sistema inteiro estará comprometido.

Muitas organizações ainda não atentaram para este risco, e enquanto tomam todas as medidas para impedir usuários de instalar softwares não-autorizados, ao mesmo tempo permitem que eles conectem qualquer dispositivo nos seus PCs. A situação é ainda pior em PCs com acesso público como ATMs, quiosques, etc. onde em muitos casos é trivial para um terceiro qualquer plugar um dispositivo e comprometer o sistema.

Tipos de Interface

O potencial de comprometimento e as medidas de proteção que podem ser tomadas para mitigar este risco variam de acordo com o tipo de interface utilizado. Como preâmbulo, precisamos entender que existem dois tipos de interface no seu PC: as que se conectam via peripheral bus e as que usam o expansion bus.

Interfaces ligadas ao bus de periféricos trabalham em um modelo cliente-servidor, onde o PC envia comandos para o dispositivo plugado na interface e este responde através de um protocolo previamente definido. Os dispositivos nestes casos estão restritos a fazer ações que o protocolo permite, o que limita bastante o que um dispositivo malicioso pode fazer. Exemplos de interfaces ligadas via peripheral bus são as portas seriais e paralelas, as interfaces de teclaro e mouse padrão PS2 e as portas USB.

Já as interfaces que se conectam em um bus de expansão trabalham em um modelo peer-to-peer, e tem acesso direto ao bus principal do sistema e por conseqüência também a memória principal (via DMA). Um dispositivo neste caso não tem nenhuma restrição sobre o que ele pode fazer no sistema: alterar diretamente a memória, executar instruções no processador principal, enviar comandos para outros dispositivos, etc. Exemplos de interface ligadas via expansion bus são PCI, ISA, AGP, Firewire e PCMCIA.

Destas interfaces todas as que estão expostas externamente nos PCs e que portanto apresentam maior risco são a USB, Firewire e PCMCIA.

USB

A interface USB trabalha ligada ao peripheral bus e um dispositivo conectado nesta porta está limitada ao protocolo definido de comunicação USB e às capacidades definidas pelo driver do dispositivo. Isto no entanto não torna a interface completamente inofensiva. Um dispositivo pode usar uma falha no driver de dispositivo para executar código malicioso, ou por exemplo utilizar engenharia social para iludir o usuário a carregar o código fornecido pelo dispositivo.

O primeiro caso é possível pelo fato do próprio dispositivo enviar para o sistema a identificação do seu tipo. Por exemplo, um pen-drive USB pode dizer para o sistema que é um teclado ou uma interface de rede, e utilizar o driver deste dispositivo para enviar informações para o sistema ou explorar um bug. Um cenário de ataque seria o seguinte: o atacante descobre um buffer overrun em um determinado driver de dispositivo que venha por default no Windows. O atacante programa o pen-drive para enviar o Device ID específico daquele dispositivo, fazendo com que o sistema ao detectar o pen-drive automaticamente carregue o driver e inicie a comunicação com o dispositivo. Nesta hora o dispositivo pode enviar os dados para explorar a vulnerabilidade e executar código malicioso dentro do kernel.

Já a engenharia social pode ser feita facilmente usando o recurso de AutoRun habilitado por default no Windows. Ao conectar um dispositivo USB que se identifique como disco (USB storage), o Windows vai procurar um arquivo autorun.inf na pasta raiz e executar o comando que for especificado como default, ou apresentar como opção para ser selecionada pelo usuário. Note que neste caso o impacto é muito menor que o ataque anterior, já que o comando é executado com os privilégios do usuário logado e não dentro do kernel, mas a facilidade de exploração é muito maior e não depende da existência de um driver vulnerável.

Firewire

A interface Firewire (ou IEEE 1394) é se tornou muito popular com o advento do iPod e é frequentemente encontrada em notebooks e desktops de ponta, apesar de estar sendo gradativamente substituída pelo USB 2.0. Ao contrário do USB, as portas Firewire se conectam ao expansion bus do sistema e suportam a capacidade de bus mastering: podem solicitar o controle do bus do sistema e se comunicar diretamente com qualquer outro dispositivo ligado ao bus, ou usar o recurso de DMA para ler ou escrever diretamente na memória principal.

Isso mesmo - ler ou escrever diretamente na memória principal. Ao ser plugado, o dispositivo Firewire pode solicitar acesso como bus master ao OHCI e por default vai obtê-lo. A partir daí o dispositivo pode ler segredos e qualquer outra informação que estiver em memória, alterar qualquer parâmetro em qualquer processo ou no kernel, ou simplesmente injetar código. E o pior é que a sua CPU nem se dá conta disso - nem qualquer software que ela esteja executando.

As possibilidades de ataque portanto aqui são infinitas. Demos onde um dispositivo Firewire convenientemente disfarçado de iPod era plugado e imediatamente comprometia um PCs foram feitas por Maximilian Dornseif na CanSecWest 2005 e depois por Adam Boileau na Ruxcon 2006.

PCMCIA

Se você acho que a vulnerabilidade com Firewire já era ruim, com PCMCIA (ou PC Card) é ainda pior. Além de estar ligada ao expansion bus e ter capacidade de acesso ao bus, dispositivos PCMCIA sequer precisam solicitar bus mastering a um OHCI como Firewire - eles simplesmente podem entrar direto no bus principal do sistema sem qualquer solicitação especial.  Neste ponto eles são praticamente iguais a um dispositivo PCI comum.

Os ataques PCMCIA só são menos comuns porque muito código customizado tem que ser desenvolvido e porque interfaces PCMCIA são normalmente só encontradas em notebooks, enquanto que para Firewire os drivers estão prontos e a interface é mais universal. Mas como vamos ver daqui a pouco é virtualmente impossível se defender por software de um ataque via PCMCIA - nesse caso somente epoxy resolve ;).

Defesas e Mitigações

O caminho mais óbvio para mitigar estas vulnerabilidades é prover segurança física ao sistema e não permitir o acesso físico a pessoas não-autorizadas. Mas nem sempre isso é possível - por exemplo em ATMs ou kiosks - e uma pessoa autorizada inserindo um dispositivo trojan continua sendo uma ameaça. Abaixo estão listados alguns outros controles que podem ser utilizados:

¦  Os ataques contra drivers vulneráveis via USB podem ser mitigados usando o recurso de Device Installation Policy do Windows Vista. Via política de grupo ou local os administradores podem especificar quais são os dispositivos que podem ser utilizados pelos usuários, e/ou bloquear dispositivos específicos. O mesmo recurso pode controlar a permissão de escrita ou leitura nos dispositivos, impedindo também ataques de vazamento de informação.

¦  O uso de AutoRun  pode ser desabilitado, o que provavelmente deve ser feito em qualquer PC corporativo para impedir ataques de engenharia social usando USB.

¦  Para dispositivos Firewire infelizmente é impossível restringir o acesso somente a determinados tipos de hardware, já que o bus mastering permite ao dispositivo ultrapassar qualquer driver e ir diretamente à memória. O único controle possível é desabilitar totalmente o Firewire, o que pode ser feito via BIOS ou desabilitando o driver sbp2port.sys que controla o OHCI.

¦  Para PCMCIA nem isso é possível já que estes dispositivos não passam por um OHCI. Neste caso a única mitigação possível é fechar fisicamente as portas PCMCIA usando epoxy, o que provavelmente deve ser feito também nas portas USB e Firewire em equipamentos de maior risco como ATMs e kiosks.

A mitigação destas ameaças complementa a proteção dada pelo BitLocker e o chip TPM contra ataques offline. Uma configuração que combine por exemplo portas Firewire fechadas com epoxy, portas USB protegidas via política de instalação de devices, e BitLocker usando TPM fornece um nível bastante alto de proteção física para ATMs, kiosks e servidores em filiais. A lei #3 continua em vigor - um atacante poderia por exemplo usar uma placa PCI para comprometer o sistema - mas é provavelmente o suficiente para a maioria das organizações.