Ingeniería inversa la estimación - 💡 Fix My Ideas

Ingeniería inversa la estimación

Ingeniería inversa la estimación


Autor: Ethan Holmes, 2019

Craig Federighi, vicepresidente senior de ingeniería de software de Apple en WWDC.

En junio del año pasado, en WWDC, Apple anunció silenciosamente iBeacon. Ni siquiera recibió una mención en la nota clave, apareciendo en una sola diapositiva sobre"... algunas otras características en el SDK". Pero para la gente de hardware, en realidad era una de las características más destacadas del último lanzamiento del sistema operativo de Apple, y mi cuenta de Twitter explotó. La gente siempre está buscando nuevas palancas que les permitan hacer cosas nuevas.

Realmente no voy a hablar aquí sobre la división, interesante y un tanto reveladora, entre Google, que inicialmente se basó en la tecnología NFC y solo recientemente ha agregado de mala gana el soporte Bluetooth LE a Android, y Apple, que evitó la NFC y se concentró en encontrar alternativas. utilizando tanto Wi-Fi como Bluetooth LE, por ejemplo, implementando AirDrop como una alternativa al servicio de intercambio de archivos Bump, ahora cerrado por Google. Si bien creo que la elección de esas tecnologías de la competencia en realidad nos dice mucho acerca de las dos compañías, ese es otro post completamente.

En lo que fácilmente podría ser un mercado de productos básicos, después de todo iBeacon no es su tecnología, Estimote es visto como el líder del mercado y se promueve bastante como una de las pocas empresas asociadas en el stand nórdico en el CES la próxima semana.

¿Qué es iBeacon?

iBeacon es una tecnología que le permite agregar un contexto del mundo real a las aplicaciones de teléfonos inteligentes. Basado en Bluetooth LE, parte del nuevo estándar Bluetooth 4.0, es una forma de proporcionar una navegación interior básica e iBeacon se ha integrado en iOS 7 tanto dentro de los marcos de Core Location como de Passkit para habilitar la microubicación y el geofencing en interiores.

Sin embargo, iBeacon no se trata de la ubicación, se trata de la proximidad. Su iPhone, o ahora incluso su teléfono con Android, ahora puede alertar a las aplicaciones cuando se está acercando o dejando una ubicación con un iBeacon. También puede informar una estimación de su proximidad al iBeacon, pero debe tener en cuenta que cuanto más cerca esté de la baliza, más precisa será la estimación de la proximidad. Los dos factores aquí son la intensidad de la señal y la interferencia de radio. Si bien la intensidad de la señal es bastante confiable, la interferencia no es, y puede cambiar radicalmente con el tiempo, por lo que si bien puede confiar en la baliza para alertar a su aplicación de que está en su proximidad general, desconfiaré de confiar en el alcance. demasiado.

Construyendo tu propio iBeacon

Es bastante sencillo crear su propio iBeacon, ya sea utilizando una Raspberry Pi o utilizando una placa Bluetooth LE como la placa BLE Mini de Red Bear Labs, y hay algunas personas que se aprovechan de eso para obtener un rápido beneficio.

Por ejemplo, Radius Networks está vendiendo un “Kit de desarrollo iBeacon” que consiste en una Raspberry Pi, una mochila USB con Bluetooth y una tarjeta SD de 8GB. Cuestan alrededor de $ 45 cuando se compran por separado al precio de venta total, lo están vendiendo en paquete por $ 100. Eso es un gran margen de beneficio, especialmente porque no comprarán los componentes al por menor, con un valor agregado muy pequeño en comparación con la compra de las piezas por separado y siguiendo instrucciones bastante simples para construir las suyas.

Para ser justos, creo que Radius solo está vendiendo el kit como una actividad complementaria para promocionar su oferta de software, y han publicado su trabajo sobre ingeniería inversa en el perfil Bluetooth de iBeacon y maximizan la capacidad de respuesta de iBeacon, entre otras cosas.

La estimación

Por la forma en que lo escuché, Estimote tuvo suerte. Ahí estaban, jugando con las "balizas" de Bluetooth LE que podían usar los teléfonos inteligentes para reparar la ubicación en el interior, sin que la gente mostrara tanto interés, y luego estaban Apple y el iBeacon, y terminaron con un par de meses. Head Start en la competición. Por supuesto, esta podría ser la edición de leyenda urbana, o al menos una versión revisionista, de la historia de su compañía, contada en bares, salas de conferencias y otros lugares donde se reúnen los desarrolladores. Pero tiene un cierto anillo de autenticidad.

A pesar de eso, y cualquiera que sea la historia real, cuando se discute el iBeacon, la mayoría de las veces escuchará la frase "... como el Estimote". Es un poco injusto en su competencia, y hay competidores como Roximity, TwoCanoes, Sonic Notify, Radius Networks y algunos otros, pero creo que esos son los puntos débiles.

En realidad, todavía es bastante difícil obtener un kit de previsualización para desarrolladores de Estimote, ya que todavía se está enviando en cantidades limitadas, pero logré obtener uno de los primeros kits de desarrolladores en noviembre del año pasado y, como era de esperar, tomé una de las balizas. aparte.

Lo primero que nota es que no hay un botón de encendido / apagado, el dispositivo está transmitiendo todo el tiempo, incluso antes de salir de su embalaje. Se envía en vivo, lo que podría ser interesante.

El estuche está hecho de silicona suave con una sensación de goma y está completamente cerrado para que sea impermeable. Más o menos tuve que destruir el gabinete para extraer el PCB, lo que también significa que cambiar las baterías, al menos en los modelos del kit de vista previa, no será posible. Sin embargo, sí significa que puede instalarlo en exteriores, lo que es un gran punto a favor para algunos casos de uso.

El Estimote Beacon se construye alrededor de un Nordic Semiconductor nRF51822. También puede ver la antena incorporada para la radio Bluetooth LE a la derecha de la imagen.

El Estimote se construye alrededor del Nordic Semiconductor nRF51822, lo que explica su presencia en el stand nórdico en el CES. Es un buen chip, básicamente una CPU ARM Cortex M0 de 32 bits con 256KB de flash y 16KB de RAM con una radio de 2.4GHz incorporada que admite tanto Bluetooth LE como operación de 2.4GHz, donde el modo de 2.4GHz es compatible con el aire Con los productos de la serie nRF24L de Nordic.

Las balizas se comercializan con un sensor de temperatura y un acelerómetro, aunque como veremos más adelante, ninguno de estos se anuncia como parte del GATT, y no son paquetes de datos accesibles, al menos por el momento.

Supongo, por ahora, que el sensor de temperatura del que están hablando es el incorporado al propio Nordic ARM, y que el acelerómetro es el chip más pequeño (a la izquierda de la imagen) etiquetado“8237 C3H DEA3H” aunque voy a tener que admitir que no he rastreado la hoja de datos de este chip, así que no lo sé con certeza.

Estimote está anunciando un alcance de alrededor de 230 pies (unos 70 metros) para sus balizas. Sin embargo, las pruebas ponen el alcance mucho menos, en algún lugar alrededor de 130 pies (unos 40 metros) fuera de la caja, con una precisión altamente variable. Por lo que puedo decir, tampoco debo confiar en las mediciones de proximidad ya que, al menos en mis propias pruebas, estas mediciones de proximidad varían rápidamente, probablemente debido a la interferencia de radio.

También predicen una vida útil de la batería de hasta 2 años. Sin embargo, nuestra baliza llegó a un cargo del 55 por ciento, y ahora está en el 33 por ciento después de solo un mes, por lo que parece una predicción bastante optimista, y hace que el recinto sellado sea más un pasivo que un activo.

Es interesante que todas las balizas de Estimote en todos sus kits de vista previa para desarrolladores se envíen con UUID idénticos, el UUID para cada baliza está arreglado, y no planean agregar la capacidad de cambiar el UUID en el corto plazo. Eso significa que no puede usarlos en un entorno de producción de la forma que Apple pretendía, o al menos, no sin alguna modificación.

También puede utilizar su SDK de iOS de código cerrado si está usando su hardware, ya que otro hardware de iBeacon no funcionará con su SDK, y si usa el denominador común más bajo: los marcos de ubicación central y Passkit de Apple. para hablar con una colección heterogénea de hardware iBeacon, estás atrapado en modo de solo lectura con las propias balizas Estimote. Ese podría ser un problema real en el futuro, tanto para los usuarios finales como para Estimote.

Estimote ahora también tiene el envío de un SDK de Android de código cerrado. Sin embargo, no me parece que sea una gran ventaja el encerrarse en su SDK propietario en Android, ya que, a diferencia de su SDK de iOS, las balizas no pueden configurarse con ese sistema, por lo que no puede utilizar el modo de solo lectura. cualquier caso. También puede utilizar una de las bibliotecas genéricas creadas para iBeacons en Android y poder hablar con el hardware de todos, no solo de Estimote.

Las balizas deben configurarse mediante un SDK de iOS de código cerrado, y al menos en el momento en que los servicios y las características de las balizas de Bluetooth LE GATT permanecen, al menos oficialmente, sin documentar.

Para ser justos con Estimote, Apple tampoco ha documentado, al menos oficialmente, la especificación iBeacon, aunque ha comenzado a aparecer documentación no oficial basada en el código de ejemplo de Apple. Entonces, al igual que el hardware, deberíamos analizar más detenidamente el software de la baliza de vista previa para desarrolladores y ver si podemos averiguar cómo funcionan.

¿Qué anuncia el Estimote Beacon?

Usando el paquete noble de Sandeep para node.js, podemos ver lo que anuncia uno de los beacons, usando el script de descubrimiento de publicidad incluido con el paquete.

Una baliza de Estimote, seleccionada al azar de nuestro kit de vista previa para desarrolladores, con una dirección de Bluetooth de E7: 44: 89: 31: ED: 4E anuncia un nombre local de "Estimote", Junto con algunos datos de servicio y fabricante. Sin embargo, no parece estar anunciando ningún UUID de servicio.

Mirando más de cerca los datos de fabricación, los datos anunciados por la baliza fueron,

4C00 02 15 B9407F30F5F8466EAFF925556B57FE6D ED4E 8931 B6

Desglosando esto,

  • Los primeros dos bytes son el identificador de la compañía Apple (Little Endian) 0x0042.
  • El tercer byte, al menos lo más probable, especifica el tipo de datos, que es 2.
  • El cuarto byte especifica la longitud de datos restante, 21 bytes.
  • Estimote Beacons tiene un UUID iBeacon fijo de B9407F30-F5F8-466E-AFF9-25556B57FE6D.
  • Los siguientes dos bytes después del UUID de iBeacon son el iBeacon Major (Big Endian), es decir, 0xED4E, 60750.
  • Los siguientes dos bytes después de iBeacon Major son iBeacon Minor (Big Endian), es decir, 0x8931, 35121.
  • El byte final es el RSSI medido a 1 metro de distancia, es decir, 0xB6, -74.

Efectivamente, el Estimote no está haciendo nada especial aquí, esto es solo datos estándar de iBeacon. Tres de las propiedades crean la identidad del faro. Estos son:

  • UUID: esta es una propiedad exclusiva de cada compañía, n la mayoría de los casos de uso, el mismo UUID se otorgaría a todas las balizas desplegadas por una compañía (o grupo). Estimote es inusual ya que han arreglado el UUID para todos"su" balizas para ser el mismo.
  • Principal: la propiedad que utiliza para especificar un conjunto relacionado de balizas, por ejemplo, todas las balizas en una tienda compartirían el mismo valor principal.
  • Menor: la propiedad que usó para especificar una baliza en particular en una ubicación.

Tenemos que mirar los datos de servicio anunciados por la baliza,

0A18 4EED318944E7 B6 4EED 3189

para ver algo Estimote especifico,

  • Los dos primeros bytes especifican que estos datos de servicio son para un servicio con UUID 0x180A.
  • Los siguientes 6 bytes son la dirección de Bluetooth pero en orden inverso, E7: 44: 89: 31: ED: 4E.
  • El siguiente byte, 0xB6 coincide con el RSSI medido a 1 m de distancia.
  • Los siguientes 2 bytes, coinciden con el iBeacon Major, pero esta vez es Little Endian.
  • Los 2 bytes finales, coinciden con el iBeacon Minor nuevamente en formato Little Endian.

De acuerdo con la especificación del núcleo de Bluetooth, los datos del servicio deben tener un prefijo con el UUID de 16 bits del servicio para el cual se encuentran los datos, y aquí, para Estimote, los datos del servicio son para un servicio con un UUID de 0x180a, lo cual es interesante porque como Veremos más adelante cuando veamos el GATT, ese servicio no existe en el dispositivo.

Servicios y características del GATT.

En contraste con "clásico" Bluetooth, donde hay toda una gama de protocolos, con Bluetooth LE solo hay un protocolo en la parte superior y es GATT (atributo genérico). La funcionalidad real de un dispositivo Bluetooth LE se implementa por medio de atributos que se pueden leer, escribir o habilitar para notificaciones / indicaciones, según el tipo de atributo.

Podemos usar el Linux gatttool Programa de línea de comandos, parte del paquete BlueZ, para manipular estos atributos. Conectando a la baliza con gatttool Obtenemos una lista tanto de los servicios como de las características.

Poniendo la salida de gatttool en forma tabular, donde las características legibles se leyeron usando el "Char-read-hnd gatttool comando: podemos comparar los valores que obtuvimos del gatttool a lo que se muestra la aplicación iOS Estimote,

Nuestro faro en la aplicación iOS Estimote.

y estamos mucho más adelante. Curiosamente si, en este punto, intenta usar gatttool'S "Char-write-req comando para escribir en cualquiera de las características de Estimote: UUID, Menor, Mayor, Nivel de potencia e Intervalo de publicidad: las escrituras se devuelven con éxito. Sin embargo, posteriormente, los datos transmitidos por el iBeacon no se actualizan en consecuencia.

A pesar de esto, el SDK de Estimote le permite actualizar el iBeacon Minor y Major, aunque no como se mencionó anteriormente, el UUID de la baliza, algo está sucediendo aquí y debemos comprenderlo mejor. El SDK obviamente está haciendo algo desviado bajo el capó quegatttool no es

Usando el SDK

Yoann Gini ha creado una herramienta simple utilizando Estimote SDK, que le permite leer y editar los números Menores y Mayores de la baliza, llamado EstimoteEditor.

Hemos bifurcado el proyecto y hemos hecho algunos cambios de los que hablaremos más adelante, por lo que si sigue adelante y clona el repositorio,

git clone https://github.com/sandeepmistry/EstimoteEditor.git cd EstimoteEditor git submodule init git submodule update

e inicialice y actualice los submódulos, luego abra el proyecto en Xcode, puede compilar e implementar en un iPhone habilitado para Bluetooth LE. Desafortunadamente, no funcionará en el simulador de iOS, debe ejecutarse en un dispositivo.

Nuestro Estimote iBeacon se muestra en la aplicación EstimoteEditor.

Después de seleccionar la baliza descubierta, el Nivel de potencia, Mayor, Menor e Intervalo de publicidad son todos configurables, y los valores editados se mantienen, a diferencia de los cambios que hicimos desde gatttool. Entonces, ¿qué está haciendo el SDK de manera diferente?

Método Swizzling CoreBluetooth

Dado que Objective-C es un lenguaje de tiempo de ejecución, es posible inspeccionar métodos, propiedades y variables de clases y objetos en tiempo de ejecución, aunque sean privados y estén ocultos por el SDK, incluso si no tiene el código fuente y solo tiene Acceso a un blob binario.

Para hacer esto, utilizamos algo llamado método swizzling: le permite reemplazar la implementación existente de un método con la suya en tiempo de ejecución. Predeciblemente si se usa correctamente, puede ser una herramienta poderosa. Sin embargo, si se usa incorrectamente, puede causar devastación en una escala bíblica.

Sandeep usó esta técnica para ver cómo funciona CoreBluetooth bajo el capó en OS X, y luego usó los resultados para comunicarse con el azul (el demonio Bluetooth en OS X) sin usar CoreBluetooth en noble, su biblioteca BLE de node.js. Quizás más aterradoramente, Alasdair lo ha usado en el código de producción para interceptar varias llamadas de red e introducir análisis para recopilar datos de rendimiento de red."En la naturaleza" en el iPhone.

Vamos a utilizar una técnica similar en iOS para interceptar la comunicación entre Estimote SDK y CoreBluetooth. Después de echar un vistazo a los encabezados de tiempo de ejecución de iOS para CoreBluetooth, la clase CBXpcConnection se destaca. Aquí, CoreBluetooth usa una conexión XPC para comunicarse con el demonio Bluetooth.

Vamos a agitar los siguientes métodos,

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

lo que nos permitirá ver cómo el SDK de Estimote está utilizando CoreBluetooth; con algunas interpretaciones, vemos que no hay nada especial aquí,

  1. comenzar a buscar dispositivos
  2. dispositivos descubiertos
  3. detener el escaneo
  4. conectarse al dispositivo
  5. Descubrir dispositivos de servicios y características.
  6. leer / escribir algunas de las características de los dispositivos

Las cosas se parecen a lo que estábamos haciendo con gatttool, excepto por las lecturas / escrituras a las características en los manejadores 45 y 47. Probablemente deberíamos volver a Xcode y establecer puntos de interrupción durante las escrituras de características y ver qué muestran las pilas de llamadas.

La pila de llamadas en el IDE de Xcode durante las escrituras de características.

Esto nos da dos métodos más para swizzle, esta vez dentro de la clase ESTBeacon,

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

En cuanto a la salida, definitivamente parece que hay un proceso de emparejamiento especial en marcha, por lo que establecer los puntos de ruptura en los nuevos métodos sofisticados, lo que nos permite establecer los métodos originales, no ayuda mucho. ¿Que sigue?

La ejecución de volcado de clase en la compilación proporciona algunos resultados interesantes. La clase ETBluetoothMath parece especialmente interesante.

@interface ETBluetoothMath: NSObject {} + (id) stringFromHexString: (id) arg1; + (id) hexStringToBytes: (id) arg1; + (int) giveSignToUnsigned: (unsigned int) arg1; + (sin signo largo) Secunit_ModExpWithBase: (sin signo largo) arg1 Exp: (sin signo largo) arg2 yMod: (sin signo largo) arg3; + (sin firma larga) randomUInt32; + (sin signo corto) randomUInt16; + (id) randomDataWithBytes: (unsigned int) arg1; + (const char *) CBUUIDToString: (id) arg1; + (int) compareCBUUID: (id) arg1 UUID2: (id) arg2; + (id) IntToCBUUID: (sin signo corto) arg1; + (sin signo corto) CBUUIDToInt: (id) arg1; + (sin signo corto) swap: (sin signo corto) arg1; + (const char *) UUIDToString: (struct __CFUUID *) arg1; @fin

Revisemos el método Secunit_ModExpWithBase: Exp: andMod: y agreguemos algo de registro en las entradas y valores de retorno. Eso nos dirá cómo se usa el mango característico 45,

  1. Generar un entero sin signo de 32 bits aleatorio.
  2. Escriba lo siguiente a la característica en el identificador 45: 5 ^ (32 aleatorio) mod 0xfffffffb (little endian)
  3. Lectura de la característica en el asa 45 (little endian): (valor de la característica 45) ^ (32 al azar) mod 0xfffffffb

Pongamos un punto de interrupción en el método parSensorSegundaPart swizzled en ESTBeacon y pisemos el original. Después de pasar por algunas instrucciones vemos algo interesante.

Recorriendo el código y detectando la llamada aes_encrypt en TI_aes.c.

¿Es eso TI, como en Texas Instruments? Al ir a Google encontramos no solo lo que es, sino también el código fuente de TI_aes.c está disponible en línea. Podemos agarrarlo, y agregarlo a nuestro proyecto. Eso nos permitirá intentar agregar puntos de interrupción a aes_encrypt y aes_decrypt dentro TI_aes.c. Sorprendentemente, estos puntos de interrupción realmente se ven afectados, lo que significa que podemos inspeccionar los datos que se pasan a los métodos de cifrado y descifrado.

La clave de cifrado AES-128 es siempre 0xff8af261013625c2d810097f20d3050f. Mientras que el estado de cifrado se basa en la Dirección de Bluetooth (E7: 44: 89: 31: ED: 4E) y es 0x4eed318944e731ed4ee74489443189ed.

La clave de descifrado AES-128 se basa en la última unidad calculada (0x8e450d08) y es 0x080d458e8e450d08088e0d458e08450d. Si bien el estado de descifrado es el resultado del cifrado, 0x419a05a457dcceebeed5129e88a81c4e.

El resultado de la desencriptación se escribe en la característica en el identificador 47, terminando el proceso de emparejamiento.

Juntando cosas

Ahora hemos descubierto la secuencia de emparejamiento y una especificación aproximada de las características. Podemos crear un script node.js que use noble para descubrir y conectarse a la Estimote Beacon. Luego podemos intentar, de nuevo, después de asociarnos para escribir en las características Mayor y Menor. Esta vez con éxito.

Interesante. El SDK no nos permite actualizar el UUID, ¿podemos hacerlo usando este método? Resulta que podemos Escribir el mismo valor para las dos características de UUID funciona, y el UUID de iBeacon se actualiza. Podemos configurar el UUID de iBeacon a algo que el Estimote no exponga.

Conclusión

El Estimote iOS SDK es de código cerrado, pero al usar el método swizzling y la utilidad de volcado de clase y el marco CoreBluetooth pudimos averiguar cómo interactúa con la baliza.

La información contenida en el SDK es probablemente más reveladora de lo que los autores esperaban, y desafortunadamente para ellos, hay muy poco que puedan hacer al respecto.

Si bien el kit de previsualización y SDK para desarrolladores de Estimote aún se encuentran en sus primeras etapas si Estimote sigue con su modelo de seguridad actual, aunque hay indicios de que podrían no hacerlo, cualquier persona que cree una aplicación con su SDK podrá reconfigurar cualquier Baliza de Estimote. En la naturaleza.

Las implicaciones de eso son bastante amplias. Si alguien modifica maliciosamente la característica iBeacon Major o Minor de una baliza, cualquier aplicación del consumidor configurada para usar esa baliza en particular dejará de funcionar: las balizas deben configurarse con una identidad predefinida para activar el comportamiento correcto dentro de la propia aplicación del consumidor cuando su El teléfono inteligente llega a la proximidad de la baliza.

Más allá de eso puedes configurar un"falso" beacon para actuar como un impostor de otro beacon perteneciente a una cadena minorista, lo que podría obtener acceso a promociones, tarjetas de regalo y otros objetos dependientes de la ubicación relacionados con el beacon que se está haciendo pasar por persona.

Otros fabricantes utilizan métodos diferentes, y posiblemente más seguros, para establecer los valores UUID, Menor y Mayor de la baliza. Personalmente, me gustaría analizar seriamente esas alternativas antes de implementar esta tecnología en entornos de producción. Especialmente si había dinero real involucrado.

Si bien no es trivial aplicar ingeniería inversa al software y al hardware utilizados en dispositivos como el Estimote, es totalmente factible y, después de comprender cómo funcionan las balizas, pudimos modificar fácilmente la configuración de la baliza.

Actualización: Hablamos de la capacidad de configurar"falso" balizas, y la capacidad de deshabilitar las balizas en el campo, sin embargo, no pensamos que veríamos algo así tan pronto. El Consumer Electronics Show (CES) de este año incluyó una búsqueda del tesoro promocional basada en la tecnología iBeacon de Apple, y resultó que usted podría ganar la caza, sin tener que ir al CES.

00


Puede Que Le Interesen

Cómo hacer: Adorno para el pelo del bloc de notas digital

Cómo hacer: Adorno para el pelo del bloc de notas digital


Toros mecánicos al estilo de Madagascar en progreso

Toros mecánicos al estilo de Madagascar en progreso


Makey Awards 2011 Nominado 05: Google Android, "El gadget más hackeable"

Makey Awards 2011 Nominado 05: Google Android, "El gadget más hackeable"


Cómo hacer: marco de espejo de memoria

Cómo hacer: marco de espejo de memoria






Mensajes Recientes