El abre-puertas de garaje Arduino es seguro

Hágalo usted mismo, los abre-puertas de garaje deberían estar furiosos hoy en día. Recientemente recibimos una notificación de otro manejo de esta popular idea. [Giles] su amigo le encargó que encontrara una manera de controlar el garaje del amigo a través de un teléfono inteligente. La solicitud era comprensible, considerando el costoso control remoto de la puerta del garaje y el hecho de que los botones del costoso control remoto tendían a fallar después de un tiempo. La inspiración para este proyecto provino de algunos videos de YouTube de otros proyectos similares. Todos esos proyectos emparejaron Arduino con un auricular Bluetooth para controlar la puerta de un teléfono celular. [Giles] Entendí que si bien esto haría el trabajo, no sería muy seguro. Los auriculares Bluetooth generalmente se conectan a teléfonos celulares con un PIN de cuatro dígitos. Muchos de ellos conocen los PIN predeterminados e incluso si se cambia el predeterminado, no tomaría mucho tiempo adivinar un PIN de cuatro dígitos. [Giles] sabía que tenía que encontrar una forma más segura.

Si bien el WiFi era una opción, [Giles] decidió que la puerta del garaje conectada a Internet probablemente sería un riesgo de seguridad, incluso si ofrecía algunos usos potencialmente interesantes. Así que eligió quedarse con Bluetooth, pero decidió usar el escudo de Bluetooth de Seedstudio en lugar de un auricular básico. La electrónica es relativamente simple. [Giles] simplemente inserte el protector de Bluetooth en Arduino Uno. [Giles] Sin embargo, tuve un problema con el protector de Bluetooth. El módulo Bluetooth no aceptó muchos comandos AT estándar. Necesitaba una forma de forzar la desconexión de un dispositivo móvil si fallaba la autenticación. Después de investigar, descubrió que el módulo tenía algunas almohadillas expuestas adicionales que probablemente podría usar para lograr ese propósito. El único problema era que esperaban una señal de 3.3V y el Arduino funcionaba a 5V. La solucion fue simple. Instaló un divisor de voltaje básico con dos resistencias. Esto redujo la señal de 5V del Arduino a los 3.3V requeridos. Esto proporciona la función de comunicación al teléfono móvil. Luego se dio cuenta de que podía usar un relé automático simple de 12V para controlar la puerta del garaje. Para controlar el relé, usó el escudo de relé Freetronics. El resultado final es una pila relativamente simple de escudos conectados a un relé.

Para la interfaz del teléfono inteligente, [Giles] comenzó a intentar escribir una aplicación nativa de Android. Al tener poca experiencia en el desarrollo de Android, pronto se dio cuenta de que llevaría más de lo esperado lograr algo utilizable de esa manera. Luego decidió usar SL4A. SL4A proporciona un entorno de secuencias de comandos para Android y admite varios lenguajes de secuencias de comandos diferentes. [Giles] luego pudo escribir una secuencia de comandos de Python que se puede realizar con el teléfono inteligente. Muchas personas se sentirían tentadas a escribir un guión realmente simple que simplemente abriera la puerta y se conectara sin ningún pensamiento real de seguridad. En última instancia, esta es una puerta de garaje abarrotada de una sola vez. ¡Seguridad a través de la oscuridad! [Giles] es más inteligente que eso.

En su lugar, implementó un mecanismo auténtico de apretón de manos desafiante entre el script de Python y Arduino. Esto aseguraría que los usuarios estén autenticados antes de permitir la ejecución de comandos y también ayudaría a prevenir ataques repetidos. El proceso funciona así. Primero, el teléfono inteligente se conecta al Arduino. El Arduino luego genera una cadena pseudoaleatoria y calcula la respuesta esperada, basándose en una clave predeterminada. Luego, el teléfono recibe la cadena y devuelve la respuesta adecuada. Si no coincide, el Arduino desconecta el teléfono. Si coincide, el teléfono devuelve una solicitud para una cadena de desafío de comando pseudoaleatorio diferente. Una vez que el teléfono recibe esta nueva cadena, puede usar esa cadena junto con una segunda clave previamente compartida para generar un comando de uso único. Suponiendo que se calculó correctamente, Arduino lanzará el comando para abrir o cerrar la puerta. Si no coincide, el teléfono se desconecta. Todo esto es para ayudar a prevenir ataques repetidos. Cada atacante que miraba las transmisiones no podía simplemente grabar las señales o los comandos y reproducirlos. Esto se debe a que cada vez que se entregan la autenticación y los pedidos, deben ser diferentes según la semilla pseudoaleatoria.

Si bien todo parece funcionar en su mayor parte bien, el Arduino tiende a bloquearse después de unos seis ciclos de puerta. [Giles] cree que esto puede deberse a la biblioteca MD5 que está usando, pero hasta ahora no ha podido intentar corregir este error. También cree que su script de Python es desordenado y un poco inestable. Decidió publicar sus programas en Internet con la esperanza de que alguien más tuviera el tiempo y el impulso necesarios para averiguar qué estaba pasando.

  • lwatcdr (@lwatcdr) dice:

    Parece una buena tarea para un pi, pogo plug o uno de los muchos enrutadores pirateados disponibles. Obtenga una llave USB Bluetooth y estará encantado de irse. ¿En cuanto a ponerlo en Internet? Bueno, el uso de SSH con claves compartidas debería ser lo suficientemente seguro para cualquier garaje. Con Pi o un enrutador, puede agregar funciones como una cámara web que tomaría fotografías del punto de acceso cuando la puerta está abierta o incluso usar OpenCV y detectar el automóvil y combinarlo con el BLE para agregar una función de apertura automática a la puerta si lo desea .

    • lja dice:

      Sí, porque para un abridor de puerta de garaje es necesario ejecutar un kernel completo de Linux conectado a Internet. / s

  • Liam Jackson dice:

    Esta biblioteca parece devolver un puntero a un juego de caracteres definido localmente en MD5 :: make_hash. Generalmente no hago esto si quiero que mi código funcione ...

    MD5 :: make_digest devuelve un puntero a alguna memoria global que necesita liberar () después de terminarlo, si le gusta no tener memoria. Esa podría ser la causa del agotamiento de su memoria, ya que la mayoría tomará todas esas cadenas de C ++ de todos modos.

    ¡Buena suerte!

  • sparkygsx dice:

    Suponiendo que este https://github.com/tzikis/ArduinoMD5/blob/master/MD5.cpp es la biblioteca MD5 que usa, creo que este fragmento podría ser el código ofensivo:

    String crea CMDMD5Hash (String input, String CMD)
    {
    char toHash[50];
    Cadena (cmdpass + CMD + entrada) .toCharArray (toHash, 50);
    signo sin nombre * hash = MD5 :: make_hash (toHash);
    char * md5str = MD5 :: make_digest (hash, 16);
    return md5str;
    }

    Utiliza 2 funciones del MD5 que devuelven un puntero a un búfer. Ambas funciones contienen SERIAS deficiencias.

    La función make_hash () devuelve un puntero a un búfer a un búfer local no estático, lo que significa que está en la pila y fuera de rango después de que se devuelve la función. Si bien esto no causará pérdida de memoria, el espacio de la pila se utilizará rápidamente para otras funciones que dañarán los datos. Si funciona ahora mismo, es sobre todo una posibilidad. Incluso si la siguiente función copia los datos y esa llamada no los corrompe, se corrompería si habilitó las interrupciones si se llama a ISR en el momento correcto (o incorrecto).

    La otra función no es necesariamente incorrecta, pero la usa incorrectamente. Esta función malloc () es la memoria necesaria para el búfer de retorno, que [Giles] nunca libre (). Podría llamar a free () al puntero después de usar los datos devueltos, o (probablemente mejor) cambiar ambas funciones para aceptar un puntero a un búfer estático para los datos devueltos, evitando el uso de malloc () en absoluto.

  • Jbb dice:

    Hola, todos. Como dice sparkygsx, la asignación de memoria estática puede ser muy buena para la estabilidad. La memoria puede ser global (¡no preferida!), Variable estática en función (está bien si nunca quieres 2 accesos simultáneos) o bien envuelta en un ejemplo de clase. Tengo dificultades para programar en el trabajo (control electrónico potente donde los fallos son algo malo) y malloc () / new no son tus amigos cuando el código tiene que funcionar durante un número infinito de ciclos.

  • Giles dice:

    ¡Y es por eso que lo expuse al mundo! Revisaré el molesto código para intentar solucionar el problema de la memoria ahora basándome en los comentarios anteriores.

    Para cualquiera que se pregunte por qué usé arduino en lugar de Pi o similar? Simple ... Tenía la copia de seguridad de Arduino, y todos mis Pis están ocupados con varias otras cosas, por ejemplo, mi minero de bitcoin con energía solar (que es ineficiente, pero bueno, energía gratis para ello ...)

    • Jbb dice:

      Arduino parece adecuado para este trabajo; parece que no hay necesidad de energía de 32 bits o de un sistema operativo. Si desea algunas características mejoradas (por ejemplo, reconocer la matrícula de su automóvil y abrir la puerta automáticamente (sí, lo sé, no es muy seguro, pero es genial, ¿verdad? (¡Sí, corchete anidado!))) Entonces probablemente sería un poco más gruñido aconsejable.

  • Brett_cgb dice:

    Sigo pensando que el acceso WiFi es considerable.

    Algunos enrutadores pueden permitir el acceso WiFi desde direcciones MAC específicas (el teléfono amigable debe estar cerca, conectado directamente al enrutador).

    Los enrutadores también pueden bloquear el acceso de la red a Internet, según las direcciones MAC (esto aísla el controlador de la puerta del garaje de Internet, lo que permite el acceso telefónico a Internet). (También es útil para aislar las computadoras XP de Internet).

    • Hattori Hanzo dice:

      El bloqueo de MAC es una función útil / operativa, no tiene casi nada en común con la seguridad. Puede parodiar direcciones MAC con bastante facilidad. Y cuando pueda estar lo suficientemente cerca para la recepción Wifi una vez que la puerta esté abierta, sabrá el MAC que necesita parodiar.

      • Brett_cgb dice:

        Parodiar el MAC es el segundo paso (y es trivial). La primera es que debe estar lo suficientemente cerca para conectarse. El tercer paso es que debe omitir la seguridad WPA2 / AES.

        El primer y tercer paso son obstáculos serios, incluso para los piratas informáticos serios. Dudo que el típico ladrón se moleste con algo de esto.

  • CaptBlood dice:

    Fui con la opción WiFi WPA2 / AES y TinyWebServer. De esa manera, podría configurarlo para aceptar comandos a través de diferentes URL (supongo que es una interfaz REST) ​​desde cualquier dispositivo autorizado para conectarse a nuestro WiFi doméstico.

  • GeorgW17 dice:

    No entendí cómo funciona ... Me di cuenta de que Arduino aloja una pequeña página web en la red local a la que puede acceder desde cualquier otro dispositivo de la red, como su teléfono inteligente, como un sitio web normal. Cuando ingresa su contraseña, el Arduino activa un relé que actúa como una puerta de garaje con cable que a menudo ve al lado de la puerta interior. Buttt ... por qué complicarme. ¿Es solo para usar un teléfono celular en lugar de un control remoto? ¿Cual es la diferencia?

    • Mike S. dice:

      Asumiría que esto es al menos un poco más seguro que alojar una página web local en el arduino. Después de mirar el script SL4A, será más difícil capturar y romper la contraseña debido a cómo se maneja. El script SL4A también podría limpiarse ligeramente creando una clase para los distintos cuadros de diálogo / alerta.

Ricardo Vicente
Ricardo Vicente

Deja una respuesta

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