22 jun. 2015

Vulnerabilidad en máquinas Vot.AR

Como es sabido, las próximas elecciones en Ciudad de Buenos Aires se realizarán con voto electrónico (llamadas Boleta Única Electrónica -BUE- por una cuestión de marketing) y desde que se conocieron las máquinas a utilizar se ha desatado una tormenta de idas y vueltas sobre las posibles y potenciales vulnerabilidades del sistema desarrollado por la empresa MSA y a las cuales los partidos políticos no han podido tener acceso, si bien se informó que se ha practicado una auditoria de código en la Facultad de Ciencias Exactas y Naturales de la Universidad de Buenos Aires (UBA).

Primero se informó de supuestas vulnerabilidades en la lectura/escritura de los chips NFC/RFID incluido en la boleta electrónica, luego fue la falta de cumplimiento de la Ley 25.326 de Protección de Datos Personales y ahora alguien ha publicado en Github el código fuente de las máquinas y varios especialistas ya se encuentran analizando el código fuente.

Actualmente se encuentran publicadas dos versiones no oficiales del código y, a primera vista no son iguales: versión del usuario Yabr4n (publicado aquí) y la versión de prometheus-ar, sobre la que se realizó el análisis actual.

Nota: el código fuente debería haberse publicado oficialmente por la empresa MSA, antes de que ocurra todo esto. La transparencia del proceso es la clave en cualquier situación de este tipo. La seguridad por oscuridad no es seguridad.

Si bien las vulnerabilidades no se pueden confirmar sin tener acceso a la máquina física y a la versión oficial del código, a través de su cuenta de Twitter, el investigador Alfredo Ortega, publicó una (puede haber más) vulnerabilidad de inyección de código que permitirían ejecutar comandos del sistema operativo (Linux/Ubuntu) y potencialmente tomar control de la máquina y del sistema que se ejecuta sobre el mismo.
En esta imagen, la función "crear_qr()" en Python toma una variable de entradas "datos" sin validar ni sanitizar y la utiliza para armar un "comando" a ejecutar sobre el sistema operativo. Esto podría da lugar a una inyección de comandos ya que si el dato que ingresa es, por ejemplo:
autoridad.apellido: test;/bin/bash -i >& ls >&1'
autoridad.nombre = test
autoridad.nro_documento = 11111111
En este caso se ejecutaría el comando "ls" en el sistema. Por supuesto esto podría dar lugar a cualquier tipo de ejecución de comandos o shell reversa, como explica Alfredo en su documento.

Si bien algunos caracteres y comandos son filtrados previamente, el código es ciertamente vulnerable, y solamente se necesita un poco de imaginación y/o una vulnerabilidad adicional para poder ser explotada (por ejemplo un XSS).

Adicionalmente, Alfredo nos informa que ha hallado otra vulnerabilidad grave aquí. En este caso se informa en un comentario que "Si el tag no es ICODE se descarta el evento." pero el código jamás chequea que sea un tag ICODE, lo que a priori permitiría modificar el voto en la urna, una vez emitido.

Es importante destacar que estas vulnerabilidades no se pueden confirmar hasta tener el código fuente oficial y acceso a las máquinas físicas. De todos modos se puede descargar una ISO para probar la máquina de voto.
Lamentablemente no disponer del código, obliga a hacer análisis extra-oficiales sobre otras versiones, lo cual podría derivar en errores y falsos positivos innecesarios. También es extraño que la auditoria oficial de la UBA no haya encontrado este tipo de errores, que podrían no ser explotables, pero existen y están claramente evidenciados.

Una vez más observamos como la falta de conocimiento técnico, la ambición política y económica hace mella en la confianza del ciudadano, haciendo que un sistema que debería ser altamente confiable y transparente se ensucie y se termine desvirtuando totalmente su uso.

Actualización: al parecer el mensaje que siempre ha dado la empresa MSA de que "las máquinas son impresoras sin ninguna funcionalidad adicional", no sería tan cierto, según se puede ver en la imagen.

Actualización: excelente post y comentarios de Juan Pedro Fisanotti (ex-empleado de MSA) explicando el funcionamiento completo del sistema y despejando algunas dudas al respecto.

Actualización: otro post en Pastebin sobre el tema.

Actualización: publicación del código que se usará en julio en las elecciones de la Ciudad de Buenos Aires. El archivo de 1GB de tamaño incluye un video y documentación.

Actualización: del archivo anterior se puede obtener un video que demuestra que las máquinas físicas no son solo impresoras, son una computadora completa con un sistema operativo totalmente funcional.

Cristian de la Redacción de Segu-Info

9 comentarios:

  1. Muy buena nora Cristian... Esto es asi, cuando hay política de por medio, todo se vuelve turbio.

    ResponderEliminar
  2. Muy buena nota pero es voto electrónico. Le pusieron Boleta Única Electrónica para saltear la ley de Ciudad Autónoma de Buenos Aires.

    ResponderEliminar
    Respuestas
    1. Gracias por notarlo, estaba al revés la frase, lo acabo de corregir.

      Cristian

      Eliminar
  3. La maquina no se llama voto electronico porque sino tiene que pasar por la legislatura para su aprobacion, por eso le cambiaron el nombre, de hecho hay evidencia que antes se llamaba voto electronico, tambien se puede ver en otros paises donde se usa esta "impresora"

    ResponderEliminar
  4. http://fisadev.blogspot.com.ar/2011/04/voto-electronico-con-python-y-ubuntu.html

    ResponderEliminar
  5. Buenas! Dos correcciones:

    - no soy más empleado de MSA desde hace varios años
    - la vulnerabilidad de inyección de comandos asume, como bien dijeron, que no se sanitiza datos. Eso no es cierto, datos contiene valores que son sanitizados antes (por un lado en la db de candidatos armada por la empresa, no el usuario, y por otro de inputs de usuario sanitizados, como se ve en https://github.com/prometheus-ar/vot.ar/blob/master/msa/voto/gui/templates/pantallas/ingresodatos/datos_personales.html#L14 )

    ResponderEliminar
  6. Carmela (Tucumán)24/6/15 02:00

    Cristian: tengo entendido que es Boleta Electrónica y no Voto Electrónico (es un híbrido entre el voto electrónico y el sistema actual de boletas pre-impresas), porque al momento de emitir el voto, el mismo no se va almacenando en un contador, sino que el voto emitido se graba en la boleta, que despues se deposita en la urna, idem al sistema actual, Con la diferencia que al cierre de la jornada electoral, cuando comienza el escritunio se vacía la urna, se cuentan las boletas, idem al sistema tradicional, y se pasa una a una las boletas por la maquina de votar, que en éste momento ya está en opcion de escrutinio. El hecho que la contabilizacion de votos la realice la maquina de votar dismuniye considerablemente los tiempos de escrutinio.
    Participé en 2 elecciones vinculantes como observadora del proceso de emisión de voto usando la boleta electrónica en Salta.

    ResponderEliminar
  7. Solo una duda.
    Todos hablan de los fuentes y sus vulnerabilidades; pero quien puede decir que es la última versión y que estas no estén ya corregidas?

    ResponderEliminar
  8. "quien puede decir que es la última versión y que estas no estén ya corregidas?"

    Exacto. Ni vos, ni yo. Por eso necesitamos todos que se publique el código, así dormimos (un poquitito) más tranquilos sabiendo qué usamos cuando votamos, sabiendo cuáles eran las reglas y que las aceptamos todos antes de votar por ser públicas.

    ResponderEliminar

Gracias por dejar un comentario en Segu-Info
Si vas a dejar una consulta, procura tener habilitado tu perfil en Blogger o deja una forma de contacto.

Gracias por comentar!