Usando RCE para descobrir chaves criptográficas codificadas nos PLCs Siemens SIMATIC S7-1200/1500
Há cerca de 10 anos, a Siemens introduziu a criptografia assimétrica na arquitetura de segurança integrada de suas famílias de firmware de CPU PLC TIA Portal v12 e SIMATIC S7-1200/1500. Isso foi feito para garantir a integridade e confidencialidade dos dispositivos, e de programas do usuário, bem como para a proteção da comunicação do dispositivo em ambientes industriais.
A distribuição e o gerenciamento dinâmicos de chaves não existiam na época para sistemas de controle industrial, em grande parte devido à carga operacional que os sistemas de gerenciamento de chaves colocariam em integradores e usuários. Na época, a Siemens decidiu confiar em chaves criptográficas fixas para proteger a programação e as comunicações entre os seus PLCs e o TIA Portal.
Desde então, no entanto, avanços em tecnologia, pesquisa de segurança e um cenário de ameaças em rápida mudança tornaram essas chaves criptográficas codificadas, em um risco inaceitável. Um agente mal-intencionado capaz de extrair uma chave global codificada pode comprometer toda a segurança da linha de produtos do dispositivo de maneira irreparável.
Até o momento, o Claroty Team82 conduziu uma extensa pesquisa sobre a segurança dos PLCs estudados, trabalhando em estreita colaboração com os principais fornecedores para erradicar práticas como chaves codificadas, demonstrar o risco que representam para os sistemas dos usuários e melhorar a segurança geral do ecossistema de automação industrial.
Nosso trabalho mais recente – uma extensão de pesquisas anteriores realizadas nos PLCs Siemens SIMATIC S7-1200 e S7-1500, bem como nos controladores da família Logix da Rockwell Automation e no Studio5000 Logix Designer -, segue nesse caminho.
Descobrimos e divulgamos para a Siemens uma técnica inovadora direcionada às CPUs dos PLCs SIMATIC S7-1200 e S7-1500, que permitiu que os nossos pesquisadores recuperassem uma chave criptográfica codificada globalmente (CVE-2022-38465), usada por cada linha de produtos afetada pela Siemens. A chave, se extraída por um cibercriminoso, daria a ele o controle total sobre cada PLC por linha de produtos da Siemens afetada.
Usando uma vulnerabilidade descoberta em pesquisas anteriores (CVE-2020-15782) em PLCs da Siemens, que nos permitiu burlar as proteções de memória nativa no PLC, para obter privilégios de leitura e gravação, para executar um código remotamente, conseguimos extrair o código interno, uma chave privada fortemente protegida e usada em todas as linhas de produtos da Siemens. Esse novo conhecimento nos permitiu implementar toda a pilha de protocolos, criptografar e descriptografar a comunicação protegida, além das configurações.
A resposta da Siemens a essa divulgação privada levou a uma revisão dos esquemas criptográficos, que protegem as suas principais linhas PLC, bem como o seu aplicativo de estação de trabalho de engenharia, o TIA Portal. A Siemens reconheceu em um comunicado de segurança, que as proteções existentes em torno de sua chave codificada não são mais suficientes e investiu recursos e tempo necessários para introduzir uma infraestrutura de chave pública (PKI, Public-Key Infrastructure) dinâmica, que elimina o uso de chaves codificadas.
A Siemens recomenda que os usuários atualizem imediatamente os PLCs SIMATIC S7-1200 e S7-1500 e as versões correspondentes do projeto TIA Portal para as versões mais recentes. O TIA Portal V17 e as versões de firmware da CPU relacionadas incluem o novo sistema PKI, que protege os dados de configuração confidenciais com base em senhas individuais por dispositivo e a comunicação PG/PC, e HMI protegida por TLS, disse a Siemens em seu comunicado.
Ver mais: 4 aspectos que fazem sua solução de atendimento ser de “última geração”
Detalhes técnicos
Mecanismos de Restrição de Acesso da Siemens
Um recurso de segurança proeminente dos PLCs da Siemens é um mecanismo de restrição de nível de acesso, que é aplicado com proteção por senha. Uma senha é configurada dentro do projeto, que é baixado para o PLC junto com o nível de proteção desejado. Esses níveis são:
- Nível 1: acesso total de leitura e gravação para qualquer configuração e bloco lógico
- Nível 2: proteção contra gravação:
- Pode ler tudo
- Pode alterar os modos do PLC
- Nível 3: acesso de leitura limitado:
- Pode ler os dados HMI (valores, etc.)
- Pode ler os dados de diagnóstico
- Nível 4: proteção total
- Não é possível se comunicar com o PLC sem senha
Níveis de acesso: Siemens S7 1200/1500 (Fonte: Siemens)
Todos os quatro níveis usam o mesmo mecanismo de segurança, para conceder permissões ao usuário. A única diferença entre eles é a extensão das permissões concedidas com ou sem autenticação. Uma senha é solicitada, em qualquer conexão com o PLC.
Entendendo a criptografia do S7-1200 e S7-1500
Os procedimentos de criptografia assimétrica nos principais PLCs da Siemens têm dois propósitos principais:
- Autenticação: uma chave de sessão derivada compartilhada, que autentica um usuário ao se comunicar com um PLC.
- Confidencialidade: criptografia de dados durante as partes da referida comunicação, ou seja, lógica baixada.
Conseguimos entender o algoritmo de criptografia, que era baseado na criptografia assimétrica de Curva Elíptica. Encontramos os parâmetros da curva, bem como uma complicação adicional: o uso de uma “chave de configuração”, para ofuscar e complicar ainda mais o processo de multiplicação elíptica.
Eventualmente, conseguimos descobrir todas as chaves relevantes envolvidas no processo de criptografia:
- Chave de Conexão: usada para verificação e autenticação da integridade do pacote.
- Chave da CPU: uma chave “por modelo/firmware” (por exemplo, S7-1518, S7-1517) usada para criptografar configurações, codificar e manter a integridade do código.
- Chave de Família: uma “por-família” (por exemplo, S7-1200, S7-1500), usada para os mesmos propósitos que a chave da CPU, quando a chave da CPU não é conhecida.
Ilustração das chaves usadas no processo de criptografia do PLC da Siemens.
Obtendo a execução de código no PLC
Após a engenharia reversa de um firmware da Siemens SIMATIC .upd S7-1200 que não estava criptografado, descobrimos que a chave privada não reside nos arquivos do firmware, portanto teríamos que extraí-la de alguma forma diretamente do PLC.
Para recuperar a chave privada do PLC, precisávamos de acesso direto à memória (DA), para poder procurá-la. Para ser possível a execução de ações na DA, pesquisamos e encontramos uma vulnerabilidade de execução remota de código nas séries de PLCs 1200/1500. A vulnerabilidade (CVE-2020-15782) foi acionada por meio de um código de função MC7+ específico, contendo o nosso próprio bytecode de shellcode criado.
Nossa exploração de escape de sandbox CVE-2020-15782
A lógica de vulnerabilidade para a CVE-2020-15782, funciona da seguinte forma:
- Usa o opcode [REDACTED], que não possui verificações de região de memória de segurança, copiando uma estrutura interna e contendo um ponteiro nativo para uma área de memória válida para uma área de memória gravável.
- Altera o ponteiro dentro desta estrutura, para o endereço desejado.
- Recalcula o CRC, que foi usado para verificar esta estrutura (usando o opcode CRC32).
- Copia a estrutura de volta para seu local original, agora apontando para o endereço desejado, usando o opcode [REDACTED].
- Neste ponto, foi possível usar o acesso indireto para o novo endereço na estrutura que criamos.
Agora podíamos ler ou escrever, a partir de qualquer endereço de memória no PLC. Usando esse recurso, poderíamos substituir o código nativo e executar qualquer lógica nativa desejada. Uma apresentação técnica detalhada sobre essa vulnerabilidade foi apresentada na Conferência S4x22.
Usando RCE para obter a chave privada oculta
Usando a permissão de leitura DA obtida, conseguimos extrair todo o firmware criptografado do PLC (SIMATIC S7-1500) e mapear as suas funções. Durante o processo de mapeamento, encontramos uma função que lia a chave privada no PLC.
Assim que obtivemos o endereço da função, reescrevemos a funcionalidade de opcodes MC7+ específicos com nosso código de shell, forçando-os a chamar a função nativa que lê a chave privada. Em seguida, copiamos a chave para um endereço de memória conhecido e a lemos de lá. A execução da função sobrescrita nos deu a chave privada completa do PLC.
Mais tarde, descobrimos que essas chaves são compartilhadas em cada linha de produtos Siemens SIMATIC S7 e, imediatamente, iniciamos um processo de divulgação coordenado com a Siemens. Isso resultou em um novo aviso e uma CVE-2022-38465.
Usando a mesma metodologia, conseguimos extrair a chave de configuração da CPU.
A combinação da chave privada com a chave de configuração, e o conhecimento do algoritmo nos permitiu implementar a pilha de protocolos completa, a comunicação protegida por criptografia/descriptografia e as configurações.
Demonstrando a cadeia de vulnerabilidades usada para extrair a chave global privada.
Fluxos de ataque: obtendo o controle sobre um PLC e o processo
Usando a chave privada que conseguimos extrair, um cibercriminoso pode obter o controle total sobre um PLC.
Ataques à senha
Os ataques descritos a seguir permitem que um cibercriminoso, com conhecimento da chave privada do PLC e do algoritmo de criptografia, recupere a senha configurada no PLC e, assim, obtenha o controle total independentemente do nível de proteção configurado no dispositivo.
- Obtenha a configuração e descriptografe o hash da senha (lendo configurações do PLC): se o PLC estiver em um nível de proteção inferior a 3, um cibercriminoso pode recuperar a configuração do PLC (procedimento de upload), sem necessidade de permissão especial. Uma vez carregado, o cibercriminoso tem a configuração do PLC e pode usar a chave privada para descriptografar o hash de senha da configuração carregada. Usando o hash de senha descriptografado, o cibercriminoso pode executar autenticação no PLC e obter os mais altos privilégios.
- Man in the middle: um invasor com conhecimento do mecanismo de criptografia do tráfego, bem como acesso à chave privada, pode se passar por um PLC em uma conexão. O ataque man in the middle é realizado nas seguintes etapas:
- O cliente (vítima) se conecta ao PLC falso do cibercriminoso e envia uma chave de conexão criptografada.
- O invasor descriptografa a chave de conexão e usa a chave descriptografada para se conectar ao PLC real. Uma vez conectado, o cibercriminoso recebe um desafio, baseado em senha.
- O cibercriminoso encaminha o desafio do PLC real para o cliente e recebe uma resposta de desafio válida.
- O cibercriminoso, então, encaminha a resposta do desafio ao PLC real para configurar uma conexão autenticada. Esta seção será totalmente privilegiada. Neste ponto, o invasor pode alterar qualquer configuração ou bloco no PLC, ou ler a configuração. Este acesso inclui a capacidade de ler o hash de senha criptografado do PLC e descriptografá-lo.
- Interceptação de tráfego passivo: um cibercriminoso, com acesso passivo para capturar o tráfego para um determinado PLC na rede, pode interceptar leituras/gravações de configuração do PLC. Usando a chave privada, o cibercriminoso pode descriptografar a configuração e extrair o hash da senha. Com o hash de senha, o cibercriminoso pode executar a autenticação no controlador e escrever uma nova configuração.