Jeffrey Cross
Jeffrey Cross

Engenharia reversa do Estimote

Craig Federighi, vice-presidente sênior de engenharia de software da Apple na WWDC.

Em junho do ano passado - na WWDC - a Apple anunciou discretamente o iBeacon. Não foi sequer mencionada no keynote, aparecendo em apenas um único slide sobre“… Algumas outras funcionalidades do SDK.” Mas para as pessoas de hardware, foi um dos recursos mais proeminentes do último lançamento do sistema operacional da Apple, e meu feed do Twitter explodiu. As pessoas estão sempre procurando por novas alavancas para poderem fazer coisas novas.

Eu não vou falar aqui sobre a - interessante e um tanto reveladora - divisão entre o Google, que inicialmente se baseou na tecnologia NFC e só recentemente adicionou o suporte Bluetooth LE para Android, e a Apple, que evitou NFC e se concentrou em encontrar alternativas utilizando tanto o Wi-Fi quanto o Bluetooth LE - por exemplo, lançando o AirDrop como uma alternativa ao serviço de compartilhamento de arquivos Bump, agora fechado pelo Google. Embora eu ache que a escolha dessas tecnologias concorrentes realmente nos diz muito sobre as duas empresas - essa é outra postagem inteiramente.

No que poderia ser facilmente um mercado de commodities - afinal o iBeacon não é sua tecnologia - a Estimote é vista como líder de mercado e está sendo promovida de forma bastante significativa como uma das poucas empresas parceiras no estande da Nordic na CES na próxima semana.

O que é o iBeacon?

O iBeacon é uma tecnologia que permite adicionar contexto do mundo real a aplicativos de smartphones. Com base no Bluetooth LE, parte do novo padrão Bluetooth 4.0, é uma maneira de fornecer navegação interna básica e o iBeacon foi integrado ao iOS 7, tanto dentro das estruturas Core Location como Passkit, para permitir a micro-localização interna e geofencing.

No entanto, o iBeacon não é sobre localização, é sobre proximidade. Seu iPhone - ou agora mesmo seu telefone Android - pode agora alertar os aplicativos quando você estiver se aproximando ou saindo de um local com um iBeacon. Ele também pode relatar uma estimativa de sua proximidade com o iBeacon, mas você deve estar ciente de que quanto mais próximo você estiver do farol, mais precisa será a estimativa da proximidade. Os dois fatores aqui são intensidade de sinal e interferência de rádio. Embora a intensidade do sinal seja razoavelmente confiável, a interferência não é - e pode mudar radicalmente com o tempo - então, embora você possa geralmente depender do farol para alertar seu aplicativo de que você está em sua proximidade geral, eu ficaria cauteloso em depender muito.

Construindo seu próprio iBeacon

É bastante simples criar seu próprio iBeacon - usando um Raspberry Pi ou usando uma placa LE Bluetooth como a placa BLE Mini da Red Bear Labs - e há algumas pessoas aproveitando isso para obter um lucro rápido.

Por exemplo, a Radius Networks está vendendo “Kit de desenvolvimento iBeacon” que consiste em um Raspberry Pi, um dongle Bluetooth USB e um cartão SD de 8GB. Custando cerca de US $ 45 quando comprados separadamente a preço de varejo completo, eles estão sendo vendidos juntos por US $ 100. Isso é uma grande diferença, especialmente porque eles não comprarão os componentes no varejo, com muito pouco valor agregado sobre a compra das peças separadamente e seguindo instruções bastante simples para você criar as suas próprias peças.

Para ser justo, acho que a Radius está apenas vendendo o kit como uma linha lateral para promover sua oferta de software, e publicaram seu trabalho em engenharia reversa do perfil Bluetooth iBeacon e maximizando a capacidade de resposta do iBeacon, entre outras coisas.

O Estimote

Do jeito que eu ouvi, Estimote teve sorte. Lá estavam eles, brincando com "beacons" Bluetooth LE que podiam ser usados ​​por telefones inteligentes para consertos em locais fechados, sem que as pessoas demonstrassem tanto interesse, e depois havia a Apple - e o iBeacon, e acabaram com alguns meses vantagem na competição. É claro que esta poderia ser a edição das lendas urbanas - ou pelo menos uma versão revisionista - da história de sua empresa, contada em bares, lobbies de conferências e outros lugares onde os desenvolvedores se reúnem. Mas tem um certo grau de autenticidade para isso.

Apesar disso - e seja qual for a história verdadeira - quando o iBeacon é discutido, na maioria das vezes você ouvirá a frase "... como o Estimote." É um pouco injusto na competição deles, e há os concorrentes Roximity, TwoCanoes, Sonic Notify, Radius Networks e alguns outros, mas acho que esses são os intervalos.

Na verdade, ainda é bastante difícil colocar as mãos em um kit de visualização do desenvolvedor Estimote - como ainda é enviado em números limitados - mas consegui um dos primeiros kits de desenvolvedor em novembro do ano passado e, previsivelmente, peguei um dos beacons apart.

A primeira coisa que você nota é que não há botão liga / desliga, o dispositivo está transmitindo o tempo todo, mesmo antes de sair da embalagem. Ele é enviado ao vivo, o que pode ficar interessante.

O case é feito de silicone macio com uma sensação emborrachada e é totalmente fechado para que seja à prova d'água. Eu mais ou menos precisei destruir o gabinete para extrair o PCB, o que também significa que trocar as baterias - pelo menos nos modelos do kit de visualização - não será possível. No entanto, isso significa que você pode instalá-lo ao ar livre, o que é um grande ponto positivo para alguns casos de uso.

O Estimote Beacon é construído em torno de um Nordic Semiconductor nRF51822. Você também pode ver a antena on-board para o rádio Bluetooth LE à direita da imagem.

O Estimote é construído em torno do Nordic Semiconductor nRF51822, que explica sua presença no estande nórdico da CES. É um bom chip, basicamente um CPU ARM Cortex M0 de 32 bits com 256 KB de flash e 16 KB de RAM com um rádio embutido de 2,4 GHz compatível tanto com Bluetooth LE quanto com operação de 2,4 GHz - onde o modo de 2,4 GHz é compatível com ar com os produtos da série nRF24L da Nordic.

Os beacons são comercializados como incluindo um sensor de temperatura e um acelerômetro, embora, como veremos mais adiante, nenhum deles seja anunciado como parte do GATT e não sejam pacotes de dados acessíveis, pelo menos no momento.

Estou assumindo - por enquanto - que o sensor de temperatura do qual eles estão falando é aquele embutido no ARM nórdico, e que o acelerômetro é o chip menor (à esquerda da imagem) rotulado“8237 C3H DEA3H” embora eu tenha que admitir que não rastreei a folha de dados para esse chip, então não sei ao certo.

A Estimote está anunciando um alcance de cerca de 230 pés (cerca de 70 metros) para suas balizas. No entanto, o teste coloca o intervalo muito menos, em algum lugar a cerca de 40 metros (40 pés) da caixa, com precisão altamente variável. Tanto quanto posso dizer, você também não deve confiar nas medidas de proximidade, pois, pelo menos do meu próprio teste, essas medidas de proximidade variam rapidamente - presumivelmente devido a interferência de rádio.

Eles também estão prevendo uma duração de bateria de até dois anos. No entanto, nosso farol chegou a 55% da taxa, e agora está em 33% depois de apenas um mês, o que parece uma previsão otimista - e torna o fechamento fechado mais uma desvantagem do que um ativo.

Curiosamente, todos os balizas do Estimote em todos os kits de visualização para desenvolvedores são fornecidos com UUIDs idênticos - o UUID de cada beacon é fixo - e eles não planejam adicionar a capacidade de alterar o UUID em breve. Isso significa que você não pode usá-los em um ambiente de produção como a Apple pretendia, ou pelo menos não sem algumas modificações.

Você também está efetivamente bloqueado para usar o SDK do iOS de código fechado se estiver usando o hardware, já que o hardware iBeacon não funcionará com o SDK deles e se você usar o menor denominador comum - as estruturas Core Location e Passkit da Apple— Para falar com uma coleção heterogênea de hardware iBeacon, você está preso no modo somente leitura com os próprios balizas do Estimote. Isso pode ser um problema real no futuro, tanto para os usuários finais quanto para o próprio Estimote.

A Estimote também enviou um SDK para Android de código fechado. No entanto, parece-me que não há muita vantagem em se trancar no SDK proprietário do Android, pois, ao contrário do SDK do iOS, os beacons não podem ser configurados usando-o, então você está preso ao modo somente leitura em qualquer caso. Você também pode usar uma das bibliotecas genéricas criadas para iBeacons no Android e poder falar com o hardware de todos, não apenas com o Estimote.

Os próprios beacons devem ser configurados por um iOS SDK de código fechado e, pelo menos, no momento, os serviços e as características dos beacons Bluetooth LE GATT permanecem — pelo menos oficialmente — não documentados.

Para ser justo com a Estimote, a Apple - pelo menos oficialmente - não documentou publicamente a especificação iBeacon, embora documentação não oficial baseada no código de exemplo da própria Apple tenha começado a aparecer. Assim como o hardware, devemos dar uma olhada mais de perto no software do beacon de visualização do desenvolvedor e ver se conseguimos descobrir como eles funcionam.

O que o Estimote Beacon anuncia?

Usando o pacote noble do Sandeep para node.js, podemos ver o que é anunciado por um dos beacons, usando o script de descoberta de anúncios incluído no pacote.

Um balizador do Estimote - escolhido aleatoriamente do nosso kit de visualização do desenvolvedor - com um endereço Bluetooth do E7: 44: 89: 31: ED: 4E anuncia um nome local de "Estimote", junto com alguns dados de serviço e fabricante. No entanto, não parece anunciar nenhum UUID de serviço.

Olhando mais de perto os dados de fabricação, então, os dados anunciados pelo sinal eram,

4C00 02 15 B9407F30F5F8466EAFF925556B57FE6D ED4E 8931 B6

Quebrando isso,

  • Os dois primeiros bytes são o identificador da empresa Apple (Little Endian) 0x0042.
  • O terceiro byte, pelo menos provavelmente, especifica o tipo de dados, que é 2.
  • O quarto byte especifica o comprimento de dados restante, 21 bytes.
  • Estimote Beacons tem um UBID iBeacon fixo de B9407F30-F5F8-466E-AFF9-25556B57FE6D.
  • Os próximos dois bytes após o UBID do iBeacon são o Major do iBeacon (Big Endian), ou seja, 0xED4E, 60750.
  • Os próximos dois bytes após o iBeacon Major são o iBeacon Minor (Big Endian), isto é, 0x8931, 35121.
  • O byte final é o RSSI medido a 1 metro de distância, ou seja, 0xB6, -74.

Efetivamente, o Estimote não está fazendo nada de especial aqui, isso é apenas dados padrão do iBeacon. Três das propriedades criam a identidade do farol. Esses são:

  • UUID - Esta é uma propriedade que é única para cada empresa, na maioria dos casos de uso, o mesmo UUID seria dado a todos os beacons implantados por uma empresa (ou grupo). O Estimote é incomum porque eles corrigiram o UUID para todos"seus" faróis para ser o mesmo.
  • Maior - a propriedade que você usa para especificar um conjunto relacionado de beacons, por exemplo Todos os beacons de uma loja compartilham o mesmo valor Major.
  • Minor - A propriedade que você especifica um determinado beacon em um local.

Precisamos olhar para os dados de serviço anunciados pela baliza,

0A18 4EED318944E7 B6 4EED 3189

para ver qualquer coisa específica,

  • Os dois primeiros bytes especificam que esses dados de serviço são para um serviço com o UUID 0x180A.
  • Os próximos 6 bytes são o endereço Bluetooth, mas em ordem inversa, E7: 44: 89: 31: ED: 4E.
  • O próximo byte, 0xB6, corresponde ao RSSI medido a 1 m de distância.
  • Os próximos 2 bytes correspondem ao iBeacon Major, mas desta vez é o Little Endian.
  • Os 2 bytes finais, correspondem ao iBeacon Minor novamente no formato Little Endian.

De acordo com os dados do serviço de especificação do núcleo Bluetooth deve ser prefixado com o UUID de 16 bits do serviço para os dados - e aqui para o Estimote - os dados de serviço são para um serviço com UUID de 0x180a, o que é interessante porque Veremos mais tarde, quando olharmos para o GATT, que o serviço não existe no dispositivo.

Serviços e características do GATT

Em contraste com "clássico" Bluetooth - onde há toda uma gama de protocolos - com Bluetooth LE existe apenas um protocolo no topo e é o GATT (Generic Attribute). A funcionalidade real de um dispositivo Bluetooth LE é implementada por meio de atributos que podem ser lidos, gravados ou ativados para notificação / indicação, dependendo do tipo de atributo.

Nós podemos usar o Linux gatttool programa de linha de comando - parte do pacote BlueZ - para manipular esses atributos. Conectando ao farol com gatttool Nós temos uma lista de serviços e características.

Colocando a saída de gatttool em forma tabular - onde as características legíveis foram lidas usando o “Char-read-hnd gatttool comando - podemos comparar os valores que obtivemos do gatttool para o que é mostrado no aplicativo Estimote para iOS,

Nosso beacon no aplicativo Estimote para iOS.

e estamos muito mais avançados. Curiosamente se, neste momento, você tentar usar gatttool´s “Char-write-req comando para gravar em qualquer uma das características do Estimote - UUID, Menor, Maior, Nível de poder e Intervalo de publicidade - as gravações retornam como bem-sucedidas. No entanto, subsequentemente, os dados transmitidos pelo iBeacon não são atualizados de acordo.

Apesar disso, o SDK do Estimote permite que você atualize o iBeacon Menor e Major - embora não como mencionado anteriormente no UUID do beacon - algo está acontecendo aqui que precisamos entender mais completamente. O SDK está obviamente fazendo algo desonesto sob o capô quegatttool não é.

Usando o SDK

Yoann Gini construiu uma ferramenta simples usando o Estimote SDK, permitindo que você leia e edite os números Menor e Maior do beacon, chamado EstimoteEditor.

Nós bifuramos o projeto e fizemos algumas alterações sobre as quais falaremos mais tarde, então se você for à frente e clonar o repositório,

git clone https://github.com/sandeepmistry/EstimoteEditor.git cd EstimotoEditor git submódulo init git submodule update

e inicialize e atualize os submódulos e, em seguida, abra o projeto no Xcode, você pode criar e implantar em um iPhone habilitado para Bluetooth LE - infelizmente, ele não funcionará no iOS Simulator, ele precisa ser executado em um dispositivo.

Nosso Estimote iBeacon exibido no aplicativo EstimoteEditor.

Depois de selecionar o farol descoberto, o nível de potência, o principal, o menor e o intervalo de publicidade são todos configuráveis ​​- e os valores editados permanecem, ao contrário das alterações que fizemos gatttool. Então, o que o SDK está fazendo de maneira diferente?

Método Swizzling CoreBluetooth

Como o Objective-C é uma linguagem de tempo de execução, é possível inspecionar métodos, propriedades e variáveis ​​de classes e objetos em tempo de execução, mesmo que sejam privados e ocultos pelo SDK, mesmo se você não tiver o código-fonte e tiver apenas acesso a um blob binário.

Para fazer isso, usamos algo chamado swizzling de método - ele permite que você substitua a implementação existente de um método pelo seu próprio tempo de execução. Previsivelmente, se usado corretamente, pode ser uma ferramenta poderosa. No entanto, usado incorretamente, pode causar devastação em uma escala bíblica.

A Sandeep usou essa técnica para ver como o CoreBluetooth trabalha sob o capô no OS X e usou os resultados para se comunicar com o blued - o daemon do Bluetooth no OS X - sem usar o CoreBluetooth no nobre, sua biblioteca node.js BLE. Talvez mais assustadoramente Alasdair tenha usado o código de produção para interceptar várias chamadas de rede e introduzir análises para coletar dados de desempenho de rede."Na natureza" no iPhone.

Vamos usar uma técnica semelhante no iOS para interceptar a comunicação entre o SDK do Estimote e o CoreBluetooth. Depois de dar uma olhada nos cabeçalhos de tempo de execução do iOS para CoreBluetooth, a classe CBXpcConnection se destaca. Aqui, uma conexão XPC é usada pelo CoreBluetooth para se comunicar com o daemon Bluetooth.

Vamos misturar os seguintes métodos,

- (void) handleMsg: (int) arg1 args: (id) arg2; - (void) sendMsg: (int) arg1 args: (id) arg2;

o que nos permitirá ver como o SDK do Estimote está usando o CoreBluetooth - com alguma interpretação, vemos que não há nada de especial acontecendo aqui,

  1. iniciar a digitalização de dispositivos
  2. dispositivos descobertos
  3. pare de escanear
  4. conectar ao dispositivo
  5. descubra serviços e características de dispositivos
  6. ler / escrever algumas das características dos dispositivos

As coisas parecem semelhantes ao que estávamos fazendo com o gatttool, exceto pela leitura / gravação das características nas alças 45 e 47. Devemos provavelmente voltar ao Xcode e definir pontos de interrupção durante as gravações de características e ver o que as pilhas de chamadas mostram,

A pilha de chamadas no Xcode IDE durante gravações de característica.

Isso nos dá mais dois métodos para swizzle, desta vez dentro da classe ESTBeacon,

- (void) pairSensorFirstPart; - (void) pairSensorSecondPart;

Olhando para a saída, parece que há um processo de pareamento especial acontecendo, então definir os pontos de quebra nos novos métodos swizzled - permitindo que definamos os métodos originais - não ajuda muito. Qual é o próximo?

A execução do dump de classe na construção fornece uma saída interessante. A classe ETBluetoothMath parece especialmente interessante.

@interface ETBluetoothMath: NSObject {} + (id) stringFromHexString: (id) arg1; + (id) hexStringToBytes: (id) arg1; + (int) giveSignToUnsigned: (unsigned int) arg1; + (unsigned long) Secunit_ModExpWithBase: (sem sinal longo) arg1 Exp: (sem sinal longo) arg2 eMod: (unsigned long) arg3; + (sem assinatura longa) randomUInt32; + (sem assinatura curta) randomUInt16; + (id) randomDataWithBytes: (unsigned int) arg1; + (const char *) CBUUIDToString: (id) arg1; + (int) compareCBUUID: (id) arg1 UUID2: (id) arg2; + (id) IntToCBUUID: (curta não assinada) arg1; + (não assinado curto) CBUUIDToInt: (id) arg1; + (short não assinado) swap: (unsigned short) arg1; + (const char *) UUIDToString: (struct __CFUUID *) arg1; @fim

Vamos misturar o método Secunit_ModExpWithBase: Exp: andMod: e adicionar alguns registros nas entradas e nos valores de retorno. Isso vai nos dizer como o manípulo característico 45 é usado,

  1. Gere um inteiro não assinado aleatório de 32 bits.
  2. Escreva o seguinte para a característica na alça 45: 5 ^ (aleatório 32) mod 0xfffffffb (little endian)
  3. Característica de leitura na alça 45 (little endian): (valor característico 45) ^ (aleatório 32) mod 0xfffffffb

Vamos colocar um ponto de interrupção no método swizzled pairSensorSecondPart no ESTBeacon e entrar no original. Depois de passar por algumas instruções, vemos algo interessante.

Percorrendo o código e localizando a chamada aes_encrypt em TI_aes.c.

Isso é TI - como na Texas Instruments? Indo para o Google, encontramos não apenas isso, mas o código-fonte para TI_aes.c está disponível online. Podemos pegá-lo e adicioná-lo ao nosso projeto. Isso nos permitirá testar a adição de pontos de interrupção aes_encrypt e aes_decrypt dentro TI_aes.c. Surpreendentemente, esses pontos de interrupção são atingidos, o que significa que podemos inspecionar os dados transmitidos nos métodos de criptografia e descriptografia.

A chave de criptografia AES-128 é sempre 0xff8af261013625c2d810097f20d3050f. Enquanto o estado de criptografia é baseado no endereço Bluetooth (E7: 44: 89: 31: ED: 4E) e é 0x4eed318944e731ed4ee74489443189ed.

A chave de descriptografia AES-128 é baseada na última taxa calculada (0x8e450d08) e é 0x080d458e8e450d08088e0d458e08450d. Enquanto o estado de descriptografia é o resultado da criptografia, 0x419a05a457dcceebeed5129e88a81c4e.

O resultado da descriptografia é gravado na característica na alça 47, encerrando o processo de emparelhamento.

Colocando as coisas juntos

Agora, descobrimos a seqüência de pareamento e uma especificação aproximada das características. Podemos criar um script node.js que usa nobre para descobrir e se conectar ao Estimote Beacon. Depois, podemos tentar - novamente - depois do emparelhamento para escrever nas características Maiores e Menores. Desta vez com sucesso.

Interessante. O SDK não nos permite atualizar o UUID. Podemos fazê-lo usando esse método? Acontece que podemos. Escrever o mesmo valor para ambas as características do UUID funciona e o UIDID do iBeacon é atualizado. Podemos definir o UUID do iBeacon para algo que o Estimote não exponha.

Conclusão

O SDK do Estimote para iOS é de código fechado, mas usando o método swizzling e o utilitário de despejo de classes nele e no framework CoreBluetooth, pudemos descobrir como ele interage com o beacon.

As informações contidas no SDK são provavelmente mais reveladoras do que os autores esperavam, e infelizmente, para elas, há muito pouco que podem fazer sobre isso.

Embora o kit de visualização do desenvolvedor Estimote e o SDK ainda estejam em seus estágios iniciais se o Estimote adotar seu modelo de segurança atual - embora haja sinais de que eles não farão isso - qualquer um que criar um aplicativo usando seu SDK poderá reconfigurar qualquer Beacon da Estimote Na natureza.

As implicações disso são bastante abrangentes. Se alguém alterar maliciosamente a característica iBeacon Major ou Minor de um beacon, qualquer aplicativo de consumidor configurado para usar esse beacon específico parará de funcionar - os beacons devem ser configurados com uma identidade predefinida para acionar o comportamento correto dentro do próprio aplicativo do consumidor quando telefone inteligente entra em proximidade do farol.

Além disso, você poderia configurar um"Fake" para agir como um impostor de outro farol pertencente a uma cadeia de varejo, potencialmente tendo acesso a promoções, cartões-presente e outras guloseimas dependentes de localidade vinculadas ao sinalizador que você está representando.

Outros fabricantes usam métodos diferentes - e possivelmente mais seguros - para definir os valores UUID, Minor e Major do beacon. Pessoalmente, gostaria de analisar seriamente essas alternativas antes de implantar essa tecnologia em ambientes de produção. Especialmente se houvesse dinheiro real envolvido.

Embora não seja trivial fazer engenharia reversa do software e hardware usado em dispositivos como o Estimote, é totalmente factível e, depois de entender como os beacons funcionam, conseguimos modificar facilmente a configuração do beacon.

Atualização: falamos sobre a capacidade de configurar"Fake" beacons e a capacidade de desativar os beacons no campo, no entanto, não achamos que veríamos algo assim tão cedo. O Consumer Electronics Show (CES) deste ano apresentou uma caça ao tesouro promocional baseada na tecnologia iBeacon da Apple - e descobriu-se que você poderia ganhar a caça, sem ter que ir à CES.

00

Ação

Deixar Um Comentário