Vulnerabilidades e código malicioso em sistemas de automação industrial

As ferramentas de automação industrial desenvolvidas há 15-20 anos praticamente não continham funções de segurança. Nas últimas décadas, as empresas acumularam uma frota inteira de equipamentos com falhas arquitetônicas fatais que estão disponíveis para exploração por cibercriminosos. Neste post, falamos sobre as vulnerabilidades dos sistemas de automação industrial e fornecemos recomendações para melhorar a situação.



imagem



Em 2019, encontramos uma loja na internet que distribui softwares para máquinas industriais pesadas. Baixamos alguns desses aplicativos e os fizemos engenharia reversa para entender como eles funcionam. Seu código foi escrito em uma das linguagens de programação proprietárias usadas para automatizar robôs industriais que montam carros e embalam alimentos em esteiras. Uma vulnerabilidade foi descoberta em um desses aplicativos, o que deu início à nossa pesquisa em Rogue Automation: Vulnerable and Malicious Code in Industrial Programming .



Depois de examinar os detalhes técnicos e os pontos fracos de oito dos ambientes de programação industrial mais populares (ABB, Comau, Denso, Fanuc, Kawasaki, Kuka, Mitsubishi e Universal Robots), descobrimos que essas linguagens podem ser usadas para criar malware worm que se moverá de um robô vulnerável a outro, obedecendo aos comandos remotos de seus operadores.



As deficiências encontradas são o resultado de uma escolha de design feita há várias décadas. Essas soluções definiram a tecnologia, métodos e ferramentas que ainda hoje são usados ​​para a programação de equipamentos industriais. Considere as implicações dessa escolha no contexto das ameaças cibernéticas modernas.



Roubar dados de um robô



Encontramos um caso real de um servidor web vulnerável implementado como um aplicativo para rodar em um robô industrial. O servidor da web, escrito em ABB Rapid, continha uma vulnerabilidade de passagem que permitia que um invasor se conectasse ao robô pela rede e copiasse todos os arquivos do controlador do robô, incluindo os logs. Esses arquivos provavelmente contêm vários dados confidenciais e know-how, para que possam ser vendidos com lucro em mercados clandestinos.



Se um invasor conseguir invadir um computador na mesma rede que o robô, ele será capaz de se conectar ao servidor web do controlador disfarçado de agente, solicitar um arquivo de interesse e recuperá-lo sem autorização, uma vez que o programa atende a todas as solicitações do agente.



imagem

Um fragmento do código do aplicativo vulnerável. Fonte (doravante, a menos que indicado de outra forma): Trend Micro



Line 493 chama a função sendFile para enviar o arquivo solicitado ao cliente. O pageString não é filtrado de forma alguma, portanto, pode conter "... /" ou algum outro caminho. Isso permite que você atravesse o sistema de arquivos e baixe quase qualquer arquivo.



imagem

Esquema de exploração da vulnerabilidade



Notável neste caso foi o comentário deixado pelo desenvolvedor do servidor da Web vulnerável no código. Ele sabia que o código que havia escrito era vulnerável, mas não fez nada para corrigir o problema, porque presumiu que todas as solicitações viriam do navegador "correto", que validaria os dados de entrada e não permitiria uma string como ".. . \\ ... \\ ":



imagem

,





A exploração de algumas vulnerabilidades pode levar a consequências no mundo físico, por exemplo, prejudicar produtos acabados ou mesmo as pessoas ao seu redor.

No projeto de código aberto para robôs industriais Kuka, descobrimos uma vulnerabilidade que permite alterar a trajetória de uma peça móvel. O programa recebe um fluxo de coordenadas pela rede e as transfere para o atuador, que realiza os movimentos especificados. Para isso, uma classe especial de procedimentos é usada - servidores de automação de movimento. É uma interface padrão que permite aos OEMs de robôs industriais fornecer uma maneira consistente de controlar o movimento de seus produtos.



imagem

O código vulnerável do servidor de automação de tráfego não contém nenhuma verificação da legitimidade dos dados transferidos para ele



O código do servidor não verifica de forma alguma de onde veio a próxima parte das coordenadas para o movimento do robô; ele não fornece autenticação interna. A única proteção é verificar o endereço MAC e o endereço IP do remetente, qualquer um dos quais pode ser facilmente falsificado por um invasor que entrou na rede.



Em nossa bancada de laboratório, certificamo-nos de que usando spoofing é possível falsificar o tráfego entre um robô e uma estação de trabalho de engenharia. Um invasor poderia enviar coordenadas arbitrárias e o robô simplesmente as executaria, o que em uma produção real levaria a um acidente.



Ao injetar pacotes de rede com coordenadas incorretas no tráfego, fomos capazes de empurrar o manipulador para fora da zona de segurança várias vezes e atingir o objeto físico com a “mão” do robô. Como resultado, o "braço" com o qual o robô pega os objetos caiu: O braço caído



imagem

do robô é o resultado da introdução de coordenadas inseguras no tráfego



Malware dinâmico



Esse tipo de ataque presume que o robô está executando um programa escrito por um integrador de sistema que se acredita ser confiável. Na realidade, qualquer programa criado por um integrador é considerado confiável e é implantado sem verificações de segurança de código.



Ao comprometer um integrador ou substituir um programa em um armazenamento de rede vulnerável, você pode injetar um código malicioso invisível em uma rede corporativa: adicione um carregador de inicialização que baixa o módulo de que o invasor precisa e o executa como parte de um ciclo de produção padrão.



imagem

Downloader de malware escrito em uma linguagem de programação para robôs industriais



Para testar esse conceito, escrevemos um conta-gotas em uma linguagem de programação para robôs industriais e nos certificamos de que um programa externo pode ser usado para carregar o código no controlador do robô e executá-lo. Uma vez controlado, esse programa pode executar outras ações maliciosas, coletando informações sobre a infraestrutura de rede, roubando arquivos e credenciais.



Vulnerabilidade incomum de RCE



Uma de nossas descobertas foi um programa totalmente respeitável que lança funções para execução, cujos nomes são recebidos pela rede. Para executá-los, ele usa o carregamento dinâmico de código, mas não está interessado no que exatamente ele inicia: o programa não fornece a verificação da integridade das bibliotecas carregadas.



imagem

Lógica vulnerável de um aplicativo "respeitável"



imagem

Um fragmento de código que implementa lógica vulnerável.



Embora o programa em si não contenha funções maliciosas, um invasor pode usá-lo para emitir comandos para o robô na hora certa, afetando o mundo físico.



Coroa da Criação - Verme Malicioso



Para demonstrar a gravidade dos problemas detectados, desenvolvemos um programa com a função de autopropagação e atualização automática, carregamento dinâmico de código do servidor de controle e capacidade de controle remoto. O programa de varredura também pode realizar varredura de rede, transferir arquivos arbitrários para o servidor de comando e controle, manter uma lista de dispositivos infectados e atuar como um bot.



imagem

A lógica do programa PoC que simula o funcionamento de um malware real



imagem

Formação de uma lista de arquivos encontrados e envio para o servidor de controle



Fonte de problemas



Após analisar oito linguagens de programação populares para automação industrial desenvolvidas nas últimas décadas, chegamos à conclusão de que a principal razão para as vulnerabilidades identificadas e potenciais é que essas linguagens contêm meios de baixo nível de acesso aos recursos do sistema. Embora essas ferramentas não sejam perigosas por si mesmas, os invasores podem usá-las para outros fins, afetando criticamente a segurança do robô, seu operador e sistemas conectados. Por exemplo, eles podem ser usados ​​para mover o manipulador para cima, levantar a peça de trabalho, abaixar o robô e soltar a peça de trabalho.



Este rico conjunto de funções sofisticadas dá aos engenheiros de processo a liberdade de desenvolver aplicativos nos quais eles podem recuperar dados da rede, ler e gravar arquivos. No entanto, como as plataformas não fornecem acesso seguro a esses recursos avançados, os invasores podem usá-los para escrever módulos maliciosos.

Outro problema com linguagens obsoletas para automação industrial (Industrial Robots Programming Language, IRPL), herdadas junto com os equipamentos, é que elas não possuem ferramentas para verificação de código em busca de padrões inseguros, semelhantes às ferramentas para C, C ++, C #, Java. PHP e Python.



Cada OEM cria seus próprios idiomas e ambiente nos quais os programas de destino serão executados. Alguns deles são baseados em sistemas operacionais em tempo real (RTOS), mas no geral não há padronização. A semântica de cada IRPL também é única e pode diferir significativamente da semântica das linguagens de programação de uso geral. Alguns recursos, como a manipulação de strings ou operações criptográficas, estão ausentes no IRPL ou não são tão avançados quanto nas linguagens tradicionais.



As principais fontes de vulnerabilidades em programas escritos em IRPL são três funções principais:



  • trabalhando com arquivos e diretórios,
  • carregar módulos dinamicamente e chamar funções por nome,
  • funções de rede - receber e transmitir dados para sistemas externos.


imagem

Funções perigosas disponíveis no IRPL



Como se proteger



Como acontece com qualquer aplicativo de software que lida com dados não confiáveis, os sistemas de automação industrial devem ser projetados, implementados, configurados e implantados com mecanismos de segurança apropriados.



imagem

Recomendações consolidadas para garantir a segurança dos programas de automação industrial



Portanto, ao escrever tais programas, você deve se guiar pelos seguintes princípios:



  • Pense em robôs industriais como computadores e os aplicativos para eles como códigos extremamente críticos;
  • autenticar todas as comunicações;
  • implementar políticas de controle de acesso;
  • implementar validação de entrada sempre que aplicável;
  • garantir a higienização contínua da produção;
  • Ao lidar com erros, não exponha detalhes técnicos desnecessários;
  • criar as configurações e procedimentos de implantação corretos;
  • Implementar processos de gerenciamento de mudanças para código de automação industrial.


Velho ou inteligente?



Enquanto os desenvolvedores de software tradicionais lutaram com as consequências da programação insegura por décadas e desenvolveram várias técnicas para garantir a vitória, o mundo da automação industrial não estava preparado para detectar e prevenir a exploração de vulnerabilidades.



Dado o ritmo da convergência TI / OT, ​​é imperativo introduzir métodos de desenvolvimento de código seguro na indústria de automação industrial. Caso contrário, os próximos anos podem nos trazer muitos relatos de incidentes no setor, e as consequências desses incidentes se manifestarão não apenas no ciberespaço, mas também no mundo físico.



All Articles