Imagen: Sascha Kohlmann, CC BY-SA 2.0
Hay sistemas para los que los simples mortales no tienen acceso de forma predeterminada. Y los desarrolladores de tales sistemas creen ingenuamente que están protegidos de la penetración y de los ojos agudos de los investigadores.
Tome al menos cajeros automáticos (ATM). No es raro que personas desconocidas se acerquen a los cajeros automáticos, conecten una computadora portátil, tomen dinero y se vayan sin dejar registros en el sistema. Y las historias recientes con «chuletas» (malware llamado Fabricante de chuletas ) confirman aún más que no hay sistemas invulnerables, hay sistemas poco investigados.

Comenzar la investigación

Existe la opinión de que la única manera de robar dinero de un cajero automático es llegar a un camión volquete, recoger un cajero automático con un gancho y arrancarlo con menudillos, y luego usar la amoladora, la máquina de soldadura de chatarra y gas. Pero hay otro método.
Después de una breve búsqueda en Ebay , tenía en mi escritorio un pañuelo dispensador dispensador NCR USB S1 con firmware. Los objetivos eran:

  • encuentre un bypass de cifrado de comandos enviados por el ordenador a través de USB al propio dispensador, en particular para emitir billetes
  • aprenda a evitar la necesidad de acceso físico a la caja fuerte para la autenticación (malabares con el casete) para generar claves de cifrado de comandos del párrafo anterior.

Firmware

El firmware es un archivo ELF para el procesador NXP ColdFire (Motorola 68040, mi procesador favorito), que se ejecuta en VxWorks v5.5.1 .

En el archivo de los ELFOS de interés hay dos secciones principales – .texto y .datos :

  • Uno de ellos contiene un código que gira todo el tiempo principal (llamémoslo el firmware principal) cuando el dispensador está conectado a la unidad del sistema en la parte superior del cajero automático.
  • En el segundo, el código del cargador de arranque se empaqueta utilizando zlib (su nombre local es USB Secure Bootloader), que es responsable de cargar el firmware y ejecutar el código principal.

Y la mejor parte es que hay caracteres sin cortar en el archivo, tómelo y busque algo interesante.

Dispositivo interno del firmware principal

Si divide el código en los componentes principales, obtendrá el siguiente esquema (en el orden de envío):

  1. Un flujo que se ocupa de recibir paquetes USB y distribuirlos entre servicios.
  2. Los servicios son las unidades de ejecución básicas, cada una de ellas tiene su propio papel y cada una tiene sus propias tareas (clases).Clases
  3. : aquí están las tareas que un servicio puede realizar con la ayuda de controladores.
  4. Los controladores son en realidad «trabajadores» (workers) que se dedican a la validación de las tareas que se les envían, su ejecución y la formación de paquetes de respuesta.


Dado que hay mucho código en el firmware, se decidió comenzar por buscar todos los servicios posibles y luego buscar dónde se están transfiriendo las tareas.
Como resultado, se encontraron los siguientes servicios que solo tienen que hacer lo que estoy buscando:
1) DispTranService (Servicio de Transacción de Dispensadores) : trabajar con comandos cifrados, generar paquetes de billetes, autenticación. Se puede decir que el más interesante-aquí.

2) securityService: después de la autenticación en el lado del dispensador, se genera una clave de sesión, que se envía al equipo en forma cifrada a petición del equipo. Con esta tecla se cifrarán todos los comandos importantes – emisión, formando una pila de billetes.

Posteriormente, otro servicio me llamó la atención: UsbDownloadService. Su tarea es conectar el dispensador a la computadora y la versión del firmware del dispensador que se almacena en la computadora ATM, ir al cargador de arranque para cargar el firmware con el que el sistema operativo debe trabajar (está en la carpeta con el software del proveedor en la computadora). Este servicio también puede proporcionar información sobre la versión del firmware.

Autenticación física

La autenticación física se implementa al más alto nivel y protege al cajero automático de enviar simplemente comandos USB para emitir sin autorización. En este caso, radica en el hecho de que solo con una caja fuerte abierta con dinero necesita realizar una de las siguientes acciones:

  • retire e inserte el casete inferior,
  • cambie el interruptor de palanca en la parte posterior de la rejilla con el dispensador.


Pero todo esto solo es necesario si el nivel de acceso se establece al máximo, es decir, físico. Hay tres: USB (0), lógico (1) y físico (2). Los dos restantes son utilizados por proveedores de servicios y desarrolladores para depurar y probar firmware. Bueno, la física es altamente recomendada por el proveedor para su uso de forma predeterminada.

Vulnerabilidad

A continuación se describe una vulnerabilidad crítica (ya arreglada por el vendedor en el momento de la publicación del artículo), que, si hay acceso al área de servicio, pero sin acceso a la caja fuerte (por ejemplo, a través de un orificio hecho en el panel frontal del cajero automático), ejecuta cualquier comando del dispensador, incluido el efectivo.

Resultó que UsbDownloadService acepta comandos que no requieren cifrado. Suena tentador. Pero entonces todo está protegido aún más, ¿y el nombre Secure Bootloader se justificará a sí mismo?

(Spoiler: no justificar!)

Necesitamos profundizar

Como ya se mencionó, en el .sección de datos hay un código de cargador de arranque empaquetado, que durante mucho tiempo no despertó mi interés, y mis colegas, cuando examinaron el firmware, no le prestaron atención.

Si bien la presencia del gestor de arranque era secreta, la pregunta seguía abierta: ¿cómo llenaba el firmware el software de la computadora? Después de todo, no se encontró nada en el firmware principal.

Por lo tanto, el gestor de arranque se descomprime, se carga en IDA en el desplazamiento 0x100000, ahora puede explorar … No sólo los personajes!
No importa: comparando el firmware principal con el código del cargador de arranque, leyendo la hoja de datos del controlador, y una cierta imagen comienza a surgir.

Resultó que la carga de firmware, aunque parece estar protegida, en realidad no lo está. Solo necesito saber cómo llenarlo correctamente.
Se invirtió mucho esfuerzo y tiempo en comprender completamente este proceso (para obtener más detalles, consulte el informe » Blackbox is dead — Long live Blackbox!»En la conferencia Black Hat 2018 en Las Vegas). Cuál es el costo de soldar la memoria de NVRAM, cargar una copia de seguridad en ella para «rociar» todo el controlador … Gracias a un colega Alexey por su paciencia!
El resultado fue el siguiente algoritmo para cargar el firmware al dispensador:
1) Generar un par de claves RSA y verter la clave pública en el controlador.

2) Escribe sucesivamente el .datos y .texto de secciones del ELFO a sus direcciones físicas desde los encabezados de sección.

3) Calcular SHA-1 a partir de los datos registrados, cifrar el hash con una clave privada, enviar al controlador.

4) Cuente y envíe la suma de todas las palabras de firmware grabadas.

Después de eso, si todo se calcula y graba correctamente, se descargará el firmware principal.
Resultó que al escribir firmware solo hay una limitación: la versión de firmware no debe ser inferior a la actual. Pero después de todo, nadie nos molesta reemplazar la versión de firmware en sus propios datos.
Como resultado, mi firmware especial con correcciones de seguridad se inundó y se lanzó con éxito.
En este punto, el código del firmware principal estaba bien estudiado, se encontraron comandos para emitir billetes. Ahora se pueden enviar sin cifrar, y el dispensador los ejecutará felizmente.

Extradición

Después de todo lo que se experimentó durante la investigación (por ejemplo, un cajero automático real zakirpicheny ), el resultado fue tan agradable y compensador por los esfuerzos que el algoritmo quería repetir con otro proveedor importante.

El cajero automático real comenzó a zumbar y voluntariamente compartió con nosotros notas frescas y crujientes (en este caso, los «envoltorios de dulces»del vendedor). No se aplicó magia: solo una computadora portátil, un cerebro y un cable USB.

resultados

Una vez más, estábamos convencidos de que , guiados por el principio de seguridad a través de la oscuridad, es imposible proporcionar una protección adecuada. La propiedad de un código o firmware no significa en absoluto que un atacante no tendrá acceso a él en un momento dado y no aprovechará las vulnerabilidades encontradas. Todo lo necesario para la implementación de objetivos egoístas se puede adquirir en presencia de una cierta cantidad de dinero.
Los desarrolladores deben ocuparse del código y los especialistas en seguridad deben protegerlo. Es por eso que el enfoque más productivo parece ser la cooperación con empresas de seguridad de la información con suficiente experiencia en garantizar la seguridad de varios sistemas que ayudarán a construir una protección adecuada en cada caso particular.
El proveedor de PS confirmó la vulnerabilidad (la brecha también se encontró en otro modelo, S2), que se declaró modificada en la corrección de febrero del año 2018.
Lista de CVE:

  • CVE-2017-17668 (Dispensador NCR S1),
  • CVE-2018-5717 (Dispensador NCR S2).

Gracias

Antes que yo, mis colegas, Dima Sklyarov y Misha Tsvetkov, ya estaban trabajando en el firmware (aunque sin una placa dispensadora) . Sus logros me ayudaron mucho en el estudio, ¡por lo que les agradezco mucho! Por parte de» hierro » Alexey Stennikov me ayudó mucho .

Deja una respuesta

Tu dirección de correo electrónico no será publicada.