imagem: Sascha Kohlmann, CC BY-SA 2.0
existem sistemas para os quais meros mortais não têm acesso por padrão. E os desenvolvedores de tais sistemas acreditam ingenuamente que estão protegidos da penetração e dos olhos aguçados dos pesquisadores.
tome pelo menos ATMs (ATM). Não é incomum que pessoas desconhecidas abordem caixas eletrônicos, conectem um laptop, tirem dinheiro e saiam sem deixar nenhum registro no sistema. E histórias recentes com “costeletas” (malware chamado Cutlet Maker ) confirmam ainda mais que não existem sistemas invulneráveis – existem sistemas pouco pesquisados.
Começar a pesquisa
Existe uma opinião de que a única maneira de roubar dinheiro de um caixa eletrônico é chegar a um caminhão, pegar um caixa eletrônico com um gancho e rasgá-lo fora com miúdos e, em seguida, usar o moedor, sucata de gás e máquina de solda. Mas há outro método.
depois de uma breve pesquisa no Ebay , eu tinha na minha mesa um lenço dispensador NCR USB S1 Dispenser com firmware. Os objetivos eram:
- encontrar um desvio de criptografia de comandos enviados pelo computador através de USB para o distribuidor em si, em particular, para a emissão de notas
- aprenda como ignorar a necessidade de acesso físico seguro para a autenticação (malabarismo cassete) para comando de gerar as chaves de criptografia do parágrafo anterior.
Firmware
o firmware é um arquivo ELF para o processador NXP ColdFire (Motorola 68040 , meu processador favorito), rodando em VxWorks v5.5.1 .
no arquivo ELF de interesse são duas seções principais -.texto e.dados :
- um deles contém um código que gira todo o tempo principal (vamos chamá-lo de firmware principal) quando o dispensador está conectado à unidade do sistema na parte superior do Caixa eletrônico.
- No segundo, o código do gestor de arranque é embalado usando zlib (seu nome local é USB Secure Bootloader ), que é responsável por carregar o firmware e executar o código principal.
e a melhor parte é que existem caracteres não cortados no arquivo – pegue-o e procure algo interessante.
dispositivo interno do firmware principal
se você dividir o código nos componentes principais, obterá o seguinte esquema (na ordem de envio):
- um fluxo que lida com o recebimento de pacotes USB e distribuí-los entre os Serviços.
- os Serviços são as unidades de execução básicas, cada uma delas tem seu próprio papel e cada uma tem suas próprias tarefas (classes).
- Classes-aqui estão as tarefas que um serviço pode executar com a ajuda de controladores.
- os controladores são na verdade “trabalhadores” (trabalhadores ) que estão envolvidos na validação das tarefas enviadas a eles, sua execução e na formação de pacotes de resposta.
como há muito código no firmware, foi decidido começar procurando por todos os serviços possíveis e, em seguida, procurar onde as tarefas estão sendo transferidas.
como resultado, foram encontrados os seguintes serviços que só precisam fazer o que estou procurando:
1) DispTranService (Dispenser Transaction Service) : trabalhando com comandos criptografados, gerando pacotes de notas, autenticação. Você pode dizer o mais interessante-aqui.
2) securityService : após a autenticação no lado do distribuidor, uma chave de sessão é gerada, que é enviada para o computador de forma encriptada mediante solicitação do computador. Com esta chave, todos os comandos importantes serão criptografados-emitindo, formando uma pilha de notas.
posteriormente, outro serviço chamou minha atenção: UsbDownloadService. Sua tarefa é conectar o dispensador ao computador e à versão da versão de firmware do dispensador que é armazenada no computador ATM, para ir ao bootloader para fazer upload do firmware com o qual o sistema operacional deve funcionar (está na pasta com o software do Fornecedor no computador). Este serviço também é capaz de fornecer informações sobre a versão do firmware.
autenticação física
a autenticação física é implementada no mais alto nível e protege o Caixa eletrônico de simplesmente enviar comandos USB para emitir sem autorização. Neste caso, reside no fato de que apenas com um cofre com o dinheiro que você precisa para executar uma das seguintes ações:
- remova e insira a cassete inferior,
- mude o interruptor na parte de trás do rack com o distribuidor.
mas tudo isso é necessário apenas se o nível de acesso estiver definido para o máximo, ou seja, físico. Existem três deles: USB (0), lógico (1) e físico (2). Os dois restantes são usados por provedores de serviços e desenvolvedores para depuração e teste de firmware. Bem, o físico é altamente recomendado pelo fornecedor para uso por padrão.
Vulnerabilidade
A seguir descreve uma vulnerabilidade crítica (já corrigido pelo fornecedor no momento da publicação do artigo), que, se não há acesso para a área de serviço, mas sem acesso ao seguro (por exemplo, através de um buraco feito na ATM painel frontal), a execução de qualquer comando do distribuidor, inclusive o dinheiro.
como se viu, UsbDownloadService aceita comandos que não requerem criptografia. Parece tentador. Mas então tudo é protegido ainda mais, e o nome Secure Bootloader se justificará?
(Spoiler: não justificar!)
precisamos ir mais fundo
como já mencionado, no .seção de dados há um código de bootloader embalado, que por um longo tempo não despertou meu interesse, e meus colegas, quando examinaram o firmware, não prestaram atenção a ele.
embora a presença do bootloader fosse secreta, a questão permaneceu em aberto: como o software no computador preencheu o firmware? Afinal, nada foi encontrado no firmware principal.
portanto, o bootloader é descompactado, carregado no IDA no deslocamento 0x100000 – agora você pode explorar … Apenas sem personagens!
não importa: comparando o firmware principal com o código do bootloader, lendo a folha de dados do controlador – e uma determinada imagem começa a surgir.
descobriu-se que o upload do firmware, embora pareça estar protegido, na verdade não é. Só precisa saber como preenchê-lo corretamente.
muito esforço e tempo foram gastos em uma compreensão completa desse processo (para mais detalhes, consulte o relatório ” Blackbox is dead — Long Live Blackbox!”Na conferência Black Hat 2018 em Las Vegas). Qual é o custo de soldar a memória da NVRAM, enviando um backup para ela para “polvilhar” todo o controlador … Graças a um colega Alexey por sua paciência!
o resultado foi o seguinte algoritmo para fazer o upload do firmware para o dispensador:
1) Gere um par de chaves RSA e despeje a chave pública no controlador.
2) Escreva sucessivamente o.dados E.seções de texto do ELF para seus endereços físicos dos cabeçalhos das seções.
3) Calcule SHA-1 a partir dos dados gravados, criptografe o hash com uma chave privada, envie para o controlador.
4) Conte e envie a soma de todas as palavras de firmware gravadas.
depois disso, se tudo for calculado e gravado com sucesso, o firmware principal será baixado.
descobriu-se que, ao escrever firmware, há apenas uma limitação: a versão do firmware não deve ser inferior à atual. Mas afinal, ninguém nos incomoda em substituir a versão do firmware em seus próprios dados.
como resultado, meu firmware especial com correções anti-segurança foi inundado e lançado com sucesso!
neste ponto, o código do firmware principal foi bem estudado, foram encontrados comandos para a emissão de notas. Agora eles podem ser enviados sem criptografia, e o dispensador os executará alegremente.
Extradição
Depois de tudo o que foi vivenciado durante a pesquisa (por exemplo, um real ATM zakirpicheny ), o resultado foi tão agradáveis e compensadores para os esforços que o algoritmo queria repetir com outro fornecedor.
o Caixa eletrônico real começou a whir e voluntariamente compartilhou conosco notas frescas e nítidas (neste caso, vendedor “embalagens de doces”). Nenhuma magia foi aplicada: apenas um laptop, um cérebro e um cabo USB.
achados
mais uma vez estávamos convencidos de que, guiados pelo princípio da segurança através da obscuridade , é impossível fornecer proteção adequada. A propriedade de um código ou firmware não significa de forma alguma que um invasor não tenha acesso a ele em um ponto e não aproveite as vulnerabilidades encontradas. Tudo o que é necessário para a implementação de objetivos egoístas pode ser adquirido na presença de uma certa quantia de dinheiro. Os desenvolvedores devem lidar com o código e os especialistas em segurança devem protegê-lo. É por isso que a abordagem mais produtiva parece ser a cooperação com empresas de segurança da informação com experiência suficiente para garantir a segurança de vários sistemas que ajudarão a construir proteção adequada em cada caso particular.
PS Vendor confirmou a vulnerabilidade (a violação também foi encontrada em outro modelo – S2), que foi declarado conforme alterado na correção de fevereiro do 2018º ano.
lista CVE:
- CVE-2017-17668 NCR (S1 Distribuidor),
- CVE-2018-5717 (NCR S2 Distribuidor).
Graças
Antes de mim, meus colegas, Dima Sklyarov e Misha Flores , já estavam trabalhando no firmware (embora sem um dispensador de bordo) . Suas realizações me ajudaram muito no estudo, pelo qual agradeço muito! Por parte do” ferro ” Alexey Stennikov me ajudou muito .