1 pontos por GN⁺ 2024-03-15 | 1 comentários | Compartilhar no WhatsApp
  • Tendo como pano de fundo a polêmica sobre a proibição do Flipper Zero no Canadá, o autor capturou e analisou sinais de RF de chaveiros automotivos para verificar até onde um ataque simples de replay realmente é possível
  • O RTL-SDR pode receber dados I/Q brutos na faixa de 24 a 1750 MHz e visualizá-los, armazená-los e analisá-los; o CC1101 do Flipper Zero consegue transmitir e receber, mas exige as configurações corretas de RF
  • Em 433,92 MHz, foram observados três bursts curtos a cada pressionamento de botão, e os dois picos em torno da frequência central foram interpretados como 2-FSK, com 0 e 1 sendo enviados em frequências diferentes
  • Ao aplicar FSK, 50 samples/symbol e decodificação Manchester II no Universal Radio Hacker, surgiu uma estrutura com um burst longo sem dados, 3 pacotes principais e um pacote final curto
  • No sinal foram identificados uma região de alta entropia para rolling code, um contador crescente, bytes de comando lock/unlock, número de sequência de pacote, checksum XOR e syncword, levando à conclusão de que é difícil roubar a maioria dos carros apenas com replay simples

Objetivo e contexto do experimento

  • Há alguns anos o autor vem explorando protocolos de comunicação sem fio com um dongle RTL-SDR, e desta vez o foco foi entender como um chaveiro automotivo transmite dados e verificar a possibilidade de ataques de replay
  • Ele já havia capturado sinais de chaveiros antes, mas o acesso limitado a carros para teste impediu uma análise realmente significativa
  • Este experimento é uma etapa preparatória para fazer engenharia reversa e reproduzir sinais de chaveiros, passando dos conceitos básicos de RF ao fluxo de análise
  • Em contraste com a proibição do Flipper Zero no Canadá, o texto também aborda a ideia de que a maioria dos carros não é tão fácil de roubar apenas com ataques simples de replay
    • Como caso excepcional relacionado à Honda, é citado o RollingPwn

Hardware utilizado

  • RTL-SDR

    • Um dongle USB de TV/rádio terrestre de cerca de 10 dólares pode ser transformado em um receptor de RF de uso geral, capaz de inspecionar e decodificar sinais na faixa de 24 a 1750 MHz
    • O RTL-SDR é poderoso graças ao chip RTL2832U, que permite usar SDR
    • Ele pula parte do processamento de sinal normalmente feito em hardware, permitindo que o host acesse diretamente os dados I/Q brutos
    • Ao receber dados brutos, é possível captar, visualizar, armazenar e depois analisar o sinal manualmente mesmo sem conhecer antes detalhes como modulação, largura de banda ou taxa de dados
  • Flipper Zero e CC1101

    • No Flipper Zero, a parte importante para este experimento é o módulo Sub-GHz
    • Esse módulo é baseado no chip CC1101 e suporta frequências abaixo de 1 GHz usadas em dispositivos sem fio de consumo
    • O módulo CC1101 também pode ser comprado separadamente por mais de 5 dólares e usado com Arduino, Raspberry Pi ou adaptadores USB-to-TTL
  • Diferença entre CC1101 e RTL2832U

    • O CC1101 do Flipper Zero é um transceptor, então consegue tanto transmitir quanto receber sinais
    • O RTL2832U do RTL-SDR permite recepção e análise de sinais brutos, mas não transmite
    • Como o CC1101 não suporta SDR, ele devolve apenas dados totalmente processados, e só é útil para transmissão quando as configurações de RF estão corretas
    • Existem equipamentos SDR que também transmitem e recebem, mas costumam ser caros

Conceitos básicos para ler sinais de RF

  • A transmissão por radiofrequência envia sinais por meio de ondas de rádio, que são ondas eletromagnéticas
  • Para aumentar a confiabilidade da transmissão pelo ar, usa-se uma portadora com frequência mais alta do que o sinal original
  • Frequência é o número de ocorrências da portadora por segundo e normalmente é usada para definir um canal de comunicação
  • Modulação é a forma de representar dados na onda de rádio
    • AM representa dados por variações de amplitude
    • FM representa dados por variações de frequência
  • Largura de banda é a faixa de frequências ocupada pelo sinal de RF modulado e está relacionada à quantidade de dados que o sinal pode carregar

O sinal do chaveiro visto no SDR#

  • Ferramenta e frequência

    • O SDR# é um aplicativo gratuito de DSP escrito em C# que oferece visualização em tempo real do espectro para SDR e suporte à demodulação de algumas modulações comuns
    • O dongle RTL-SDR foi conectado usando o driver WinUSB em vez do driver DVB-T padrão
    • Ao sintonizar em 433,92 MHz, é possível ver a atividade de controles remotos próximos
    • 433,92 MHz é apresentado como uma frequência padrão sem licença usada na UE, em países vizinhos e também no Marrocos, onde o autor mora
  • Padrão observado

    • Cada pressionamento de botão no chaveiro do carro gera três bursts curtos consecutivos
    • Aparecem dois grandes picos em ambos os lados dos 433,92 MHz no centro do espectro
    • Ao investigar modulações comuns, esse formato parece corresponder a 2-FSK
    • Os pequenos picos visíveis na tela foram ignorados por serem frequências indesejadas causadas por hardware transmissor barato e pela curta distância entre o controle e a antena
  • Interpretação de 2-FSK

    • FSK, ou Frequency-Shift Keying, é uma forma de modulação por frequência em que os dados são codificados alternando a frequência da portadora entre várias frequências discretas
    • O “2” em 2-FSK indica a quantidade de canais usados na codificação
    • Neste caso, 0 e 1 são codificados em duas frequências diferentes, o que explica os dois picos observados

Extraindo bits e bytes com o Universal Radio Hacker

  • Análise com URH

    • O Universal Radio Hacker é um conjunto de ferramentas open source para investigar protocolos sem fio e oferece suporte nativo a vários SDRs
    • O URH fornece demodulação do sinal e detecção automática de parâmetros de modulação, sendo usado para identificar os bits e bytes transmitidos pelo ar
    • No início, os parâmetros corretos não foram encontrados e os resultados saíram errados
    • Ao gravar vários sinais repetidos de uma vez, a taxa de sucesso da detecção automática aumentou, e neste caso 50 samples/symbol, FSK apareceu como configuração correta
  • Estrutura dos bursts e decodificação Manchester

    • Ao ampliar o sinal, os mesmos 3 bursts vistos no SDR# voltam a aparecer
    • O segundo burst é novamente composto por 3 partes separadas, então o alvo da análise passa a ter 5 seções no total
    • Ao extrair automaticamente a sequência de bits de cada seção e convertê-la em hexadecimal, surgiu um padrão repetido, mas os mesmos 5 números hexadecimais e muitos bytes 0x55 se repetiam, exigindo processamento adicional
    • Ao testar vários algoritmos de decodificação na aba Analysis do URH, Manchester II foi o que transformou os bytes 0x55 em null sem gerar erros de decodificação
  • O papel da codificação Manchester

    • Manchester é uma forma simples de modulação digital que evita que o sinal permaneça por muito tempo em nível lógico low ou high
    • Ela converte o sinal de dados em um sinal que combina dados e sincronização, sendo útil para clock recovery
    • Como meios analógicos são vulneráveis a ruído e interferência, essa característica ajuda ao transmitir dados digitais
    • Em Manchester, dados binários são codificados como dois bits opostos entre si
    • Ex.: 0 vira 01 e 1 vira 10, ou o inverso, dependendo da convenção usada

Estrutura dos pacotes e hipótese de rolling code

  • Estrutura visível em cada pressionamento de botão

    • Comparando manualmente várias capturas, cada pressionamento de botão apresenta uma estrutura consistente
    • Há um burst longo sem dados que, após decodificação, vira 100 bytes null
    • Há 3 bursts muito parecidos entre si, mas com mudanças parciais em 2 bytes
    • Em seguida vem 1 burst final bastante parecido com os 3 anteriores, porém mais curto
    • Os 3 bursts centrais foram tratados como os principais pacotes e analisados com mais detalhe
    • Foi encontrado um ID crescente que aparentemente aumenta em 1 a cada novo sinal
  • Mecanismo de rolling code

    • Rolling code é usado em sistemas de entrada sem chave para impedir ataques simples de replay
    • Ele evita o cenário em que um atacante grava a transmissão e depois a reproduz para fazer o receptor destrancar
    • O carro e o controle concordam em um algoritmo criptograficamente seguro para gerar o rolling code usado na autenticação
    • A chave é gerada e rastreada com um contador, e os contadores do controle e do carro precisam permanecer sincronizados
    • A janela de validade permite que o controle não saia de sincronização mesmo se o carro deixar de receber alguns sinais
    • Em muitas implementações, são aceitos até 255 pressionamentos fora de alcance; depois disso, o controle precisa ser resincronizado manualmente
  • Identificação dos campos do sinal

    • Como o rolling code é criptograficamente seguro, a parte de maior entropia do sinal foi identificada como a região ligada a essa implementação
    • O ID crescente encontrado antes foi estimado como o contador do sistema de rolling code
    • Ao comparar sinais de lock e unlock, foi identificado o byte que representa o comando
    • 8 = unlock
    • 4 = lock

Sequência, checksum e syncword

  • Valor que parece ser o número de sequência do pacote

    • Uma das regiões variáveis restantes apresenta os mesmos valores repetidos também em outros sinais capturados
    • Observando os 3 valores em binário, os bits mais altos aumentam como se fossem um número de sequência
    • 0x6: 0110
    • 0xA: 1010
    • 0xE: 1110
    • Incluindo o 4º e último pacote, aparece 0x13: 10011, o que combina com a interpretação de que esse campo carrega o número de sequência do pacote
    • A variação dos bits menos significativos foi desconsiderada nessa análise
  • Checksum XOR

    • O último byte muda em cada pacote e também parece variar aleatoriamente entre sinais completos diferentes
    • Por estar no fim do pacote e variar de forma irregular, ele provavelmente é um checksum
    • Fazendo XOR entre esse byte e o byte de sequência analisado antes, surge um valor fixo em cada exemplo
    • Exemplo 1:
      • 0x06 ^ 0xB9 = 0xBF
      • 0x0A ^ 0xB5 = 0xBF
      • 0x0E ^ 0xB1 = 0xBF
    • Exemplo 2:
      • 0x06 ^ 0xCC = 0xCA
      • 0x0A ^ 0xC0 = 0xCA
      • 0x0E ^ 0xC4 = 0xCA
    • Aplicando XOR a todos os bytes do pacote, o valor sempre ficava deslocado em 1, o que sugere fortemente que os 2 primeiros bytes ficam fora do checksum
    • Esses 2 primeiros bytes foram interpretados como uma syncword, usada para sincronizar o receptor e indicar o início dos dados

Composição final do sinal e próximos passos

  • O burst longo inicial serve para acordar o receptor de rádio que está em modo de baixo consumo quando o carro está ocioso, preparando-o para receber os dados
  • O motivo de o controle enviar 3 pacotes com dados quase idênticos é aumentar a confiabilidade caso um deles seja corrompido durante a transmissão
  • No resultado final da rotulagem, o sinal do chaveiro automotivo foi interpretado como dividido em syncword, região ligada ao rolling code, contador, byte de comando, número de sequência do pacote, checksum XOR etc.
  • O próximo passo é integrar esse formato de sinal ao Flipper Zero para permitir leitura, reserialização e replay
  • Se houver informações imprecisas ou espaço para melhorias, é possível enviar um pull request no GitHub

1 comentários

 
GN⁺ 2024-03-15
Comentários no Hacker News
  • Tive que fazer engenharia reversa de um controle remoto de chave de carro barato comprado no AliExpress por causa de um projeto eletrônico, e só com um osciloscópio e a Wikipedia consegui chegar lá depois de insistir por bastante tempo
    Na próxima pretendo usar o método deste post do blog e tentar me tornar um hacker melhor

  • Também existe um flow graph do GNU Radio com objetivo parecido: https://github.com/bastibl/gr-keyfob
    Slides da apresentação: https://www.fleark.de/keyfob.pdf

  • Se entre o controle e o carro as chaves forem geradas e acompanhadas com um contador para manter a sincronização, sempre tive curiosidade de saber como um controle de aprendizagem contorna isso
    Meu carro tem alguns botões embutidos para porta de garagem, e acho que configurei isso colocando o carro em modo de aprendizado e apertando o botão do controle da garagem. Fico me perguntando se isso é algo muito mais complexo do que simples replay, tipo decodificar o sinal, reconhecer o tipo e então iniciar o pareamento com o abridor

    • Isso parece HomeLink, e de fato funciona de uma forma mais complexa
      Pelo que entendo, eles trabalham com várias empresas para oferecer suporte a códigos fixos e códigos rolantes, e permitir o pareamento com aquela porta de garagem. A Chamberlain[0], maior fabricante de portas de garagem dos EUA, possui várias marcas e usa um algoritmo conhecido de rolling code que pode ser decodificado[1]
      [0] https://www.chamberlain.com/
      [1] https://github.com/argilo/secplus
    • Pelo que entendo, a maioria dos abridores de porta de garagem não usa chave rolante, e sim envia o mesmo código toda vez
    • É o contrário. Quem aprende é o módulo abridor da porta de garagem, e o botão do carro só transmite o sinal
      Esse processo é mais próximo de dizer ao abridor: “está ouvindo este novo controle? Deixe ele abrir a porta também”. Os botões do carro aparentemente circulam por alguns protocolos comuns e, na prática, os amplamente usados nos EUA devem ser só uns 4 ou 5 da família Chamberlain/Liftmaster ou Genie
    • Em sistemas de código fixo, o controle envia sempre o mesmo sinal, e normalmente esse sinal fixo é configurado para ser diferente do vizinho por meio de DIP switches ou algo parecido tanto no controle quanto na unidade principal
      Nesses sistemas, um controle de aprendizagem pode funcionar só reproduzindo o sinal gravado, mas se durante a gravação entrar junto algum outro sinal na mesma faixa, como o de uma campainha sem fio, ele também pode acabar reproduzindo coisa errada. Então é preciso ao menos cortar apenas a parte que corresponde ao sinal real da porta; melhor ainda seria decodificar o sinal, descobrir o código e então gerar um novo sinal limpo a cada vez
      Quase todas as empresas de abridores residenciais de porta de garagem nos EUA migraram seus novos modelos para rolling code nos anos 1990, então se a instalação tiver algo como 25 anos ou menos, quase certamente usa rolling code. Normalmente o controle remoto gera uma sequência pseudoaleatória a partir de uma seed, envia o próximo valor a cada pressão do botão, e a unidade principal, no modo de aprendizado, observa alguns valores consecutivos, infere essa seed e adiciona o controle à lista
      Em operação, a unidade decodifica o valor da sequência recebido, verifica se ele está dentro da janela esperada para algum controle conhecido e, se estiver, abre a porta e atualiza a posição daquele controle. Também existe uma pequena margem para evitar que a porta deixe de abrir quando uma criança aperta o botão várias vezes enquanto está longe de casa
      Em princípio também é possível um controle de aprendizagem clonar um controle com rolling code, mas para a unidade principal o clone e o original são o mesmo controle. Se um dos dois ficar muito tempo sem uso enquanto o outro avança a sequência além da janela de tolerância, um deles pode parar de funcionar, e o re-pareamento também pode complicar dependendo dos detalhes da implementação do sistema
      Os controles universais para rolling code que já vi, na prática, não aprendiam a partir do controle existente; em vez disso, você informava ao controle o tipo da unidade principal e então fazia um novo pareamento com a unidade, como se fosse um controle do fabricante. Como a interface é ruim, provavelmente envolve achar um número em uma tabela do manual, apertar um botão escondido e depois apertar o botão a ser programado aquele número de vezes
      Seria bom identificar automaticamente qual sistema de rolling code está sendo usado observando o sinal de um controle existente, mas isso exigiria um receptor, e fora esse uso quase não teria serventia, então é difícil justificar. O pareamento e os comandos de abrir/fechar da garagem são basicamente unidirecionais, do controle para a unidade principal
  • O autor decodificou tudo, mas na prática não abriu a porta do carro. Ainda seria preciso quebrar o rolling code, e não dá para fazer isso só somando 1 e retransmitindo
    Do lado de fora, o próximo rolling code deve parecer aleatório

    • Por isso logo no começo está escrito “não é tão vulnerável quanto parece”
    • A questão é se força bruta é difícil. Se for, até dá para farejar o sinal, mas não abrir o carro sem antes gravar uma entrada real do botão
  • Queria que as montadoras começassem a fazer controles minúsculos que coubessem na carteira, talvez até um controle RFID
    Ou então espero que algum dispositivo pequeno, do tamanho de um cartão de crédito, meio parecido com um Flipper, faça a mesma coisa. Falando sério, a chave do carro é o maior objeto no meu bolso depois do celular, e pelo menos em espessura ela incomoda bastante

    • No fundo, parece que o que você quer é que o celular seja a chave do carro
    • Os novos carros elétricos da BYD vêm com uma chave NFC do tamanho de um cartão de crédito que permite destrancar e ligar o carro
  • Foi revigorante ler um texto que eu realmente consegui entender

  • À medida que o acesso a equipamentos de programação de chaves fica mais fácil, é interessante ver o movimento de colocar a autorização para programar chaves atrás de uma “segurança” mais forte
    O que faz parte do sistema de “segurança” é definido pela fabricante, e isso pode se expandir de chaves para uma infinidade de módulos. É discutível se isso vai funcionar contra criminosos, famosos por seguir regras à risca (/s), mas certamente afeta algumas empresas
    Quem tem antecedentes criminais pode ficar impedido de participar. Poder cumprir a pena, abrir o próprio negócio e ter sucesso é um caminho importante para pessoas com antecedentes, e esse sistema pode tornar isso muito mais difícil
    https://wp.nastf.org/?page_id=367
    https://wp.nastf.org/wp-content/uploads/2023/07/ApplicationC...

  • Será que realmente é preciso interceptar, decodificar e reencodar o sinal? Com uma antena grande, daria para fazer um ataque man-in-the-middle entre o controle e o veículo, fazendo os dois acreditarem que estão mais perto um do outro

    • É surpreendente que a entrada passiva sem chave tenha se espalhado tanto. É um projeto em que aparência e conveniência vieram antes da segurança
    • Deve ser na faixa de gigahertz, então fico curioso sobre que tipo de antena em nível de consumidor conseguiria retransmitir ou amplificar o sinal do controle sem criar uma relação sinal-ruído tão absurda a ponto de o carro perceber
  • Hoje em dia, só de conseguir entrar no carro já dá para usar uma ferramenta OBD para programar uma nova chave e ir embora dirigindo, então isso é muito mais interessante e assustadoramente inseguro

  • O Flipper básico também consegue receber sinais brutos