lunes, 9 de mayo de 2016

(IN) Seguridad en códigos QR




Autor: Toni Escamilla (toespar.me)
Twitter: @toespar


Según Wikipedia, un código QR es un módulo para almacenar información en una matriz de puntos o en un código de barras bidimensional. Inicialmente se creó para registrar repuestos en la fabricación de vehículos, pero un tiempo después y gracias al auge de los Smartphone su uso se ha extendido y hoy en día los podemos encontrar en multitud de áreas como envases alimentarios, tarjetas de presentación e incluso en carteles de información, entre muchos otros.


A diferencia de los típicos códigos de barras, que son escaneados de forma mecánica a partir del reflejo del haz de luz, los códigos QR son escaneados de forma digital mediante el reconocimiento de pequeños cuadrados blancos que posteriormente son interpretados por el procesador.



Si analizamos la estructura de los códigos QR podemos encontrar varios elementos:


La versión y el formato son importantes para que el escáner sepa el tipo de datos que se va a encontrar, así como los patrones de posición que permiten la lectura del código en cualquier ángulo. Los patrones de alineación ayudan al escáner en caso de que el QR sea demasiado grande, y los de sincronización se utilizan para determinar el tamaño de los módulos, nombre que reciben los “cuadrados” que componen la parte de los datos. Finalmente, la quiet zone es el espacio alrededor del QR que permite al escáner diferenciar el QR de los elementos que se encuentran a su alrededor.

Sin embargo, la parte que a nosotros más nos interesa es aquella referida al almacenamiento de los datos, puesto que va a ser aquí donde vamos a poder aprovechar todo el potencial del QR. Por ello, vamos a ver como la información se almacena en forma de matriz.

En los códigos QR hay diferentes formas de codificar la información, es decir, hay diferentes formas de representar un conjunto de datos como una cadena de caracteres. Los datos codificados se agrupan en conjuntos de 8, denominados codewords, que adoptan diversas formas según su ubicación y se colocan empezando por la parte inferior derecha, subiendo primero hacia arriba hasta llegar al patrón localizador, luego pasamos a la columna adyacente izquierda y bajamos.



Adicionalmente, el orden de los bits de cada codeword varía cuando el codeword se coloca hacia arriba o hacia abajo, y gracias a la información de formato, obtendremos la máscara que posteriormente aplicaremos, mediante la operación XOR, a los codewords para obtener los datos en binario.

Finalmente, una vez aplicada la máscara debemos interpretar los datos resultantes; los primeros 4 bits nos indican el modo que debemos usar para interpretar los datos y nos condicionará para realizar la agrupación de bits. Una vez realizada dicha agrupación, el siguiente bloque nos indicará la longitud del mensaje.

Ahora que ya conocemos como funciona un código QR, ¿podemos aprovecharlo como vector de ataque? Lo dejamos para el siguiente post que este ya se está extendiendo demasiado ;) 

1 comentario:

  1. Muy buen artículo, la verdad que nunca había terminado de ver claro como iban estos.

    Posdata: esto no se hace, ya me quedé con el gusanillo y ahora a ver quien duerme así

    ResponderEliminar