Los captcha son uno de los elementos más odiados (por suerte, poco a poco nos los encontramos menos), pero también son necesarios. Es un elemento web que en muchas ocasiones tenemos que rellenar (sobre todo en registros e inicios de sesión) para evitar que alguien pueda realizar una tarea automatizada con un bot.
De esta forma, si alguien quiere crear un millón de cuentas en Twitter con un programa automatizado, sería ‘imposible’, pues el programa no sería capaz de rellenar este captcha ni una sola vez. Esa es al teoría. No todos los captcha son iguales, por lo que no todos tienen la misma eficiencia. Como tal, unos serán más vulnerables (y vulnerados) que otros.
Pero ya sin entrar en la seguridad de cada captcha en concreto, debemos tener en cuenta que en estos últimos años, sobre todo en 2017, la Inteligencia Artificial ha ido abriéndose paso poco a poco. Y, con ella, los captcha dejan de tener sentido, pues son ‘fácilmente’ vulnerables.
Por ello, el protagonista de nuestra historia, Adam Geitgey, un ingeniero de software interesado en Inteligencia Artificial, se propuso realizar un software capaz de romper un captcha en tan solo 15 minutos. Escogió uno open source, por lo que podría tener acceso al código fuente. De hecho, este es el captcha más usado de WordPress (un gestor de contenidos online eminentemente usado en blogs, aunque con presencia en otro tipo de portales). No es oficial, sino un plugin.
Burlar la seguridad de un captcha en tan solo 15 minutos
Con un simple vistazo al código fuente, se averigua que el captcha puede usar cualquier letra o número, pero excluyendo la ‘O’ y la ‘I’, para evitar confusiones. Ahora, toca comenzar a programar. Las herramientas escogidas son bastante comunes: Phytn 3, OpenCV, Keras y TensorFlow (una biblioteca de Google para aprendizaje automático).
Lo primero para que la IA sea capaz de identificar por sí misma los números es ofrecerle una base de datos etiquetada. Esto es, muchas imágenes con número y una descripción en la que se indique los números que salen en cada una de ellas. En apenas unos minutos, y con ayuda del código fuente (recordemos), Adam tiene acceso a 10 000 imágenes PNG etiquetadas.
Y así es como se entrena una red neuronal: se introduce una imagen como las que vemos arriba, etiquetadas cada una de ellas; la red neuronal la procesa, se extrae una respuesta y, si es correcta, se ‘premia’ a la IA:
Para ello, el autor decidió separar cada una de las letras (es sencillo, puesto que siempre se trataba de cuatro, ni más ni menos). Y es que es mucho más sencillo reconocer una sola letra y no cuatro. Para separar las letras se usó una función presente en OpenCV (una biblioteca de visión artificial) que identifica contornos para que posteriormente e conviertan en negro puro:
Se usa otra función de la misma biblioteca que detecta elementos gracias a los cambios de un mismo color y cada región se guarda en un fichero diferente. Pero no siempre es tan sencillo, pues, en ocasiones, hay letras que se superponen, como en el siguiente ejemplo:
Este tipo de casos se resolvió con una idea muy creativa: cuando una letra tenga más ancho que alto de forma considerable, entonces se trata de dos letras superpuestas. En estos casos, se parte la letra por la mitad y se trata como dos diferentes:
Cada letra se guarda en una carpeta distinta, quedando algo tal que así (de las 10 000 imágenes, resultaron 1147 ‘W’):
Ahora, con estos avances, solamente basta que la IA sea capaz de identificar cada letra por separado, por lo que la red neuronal resultante no debe ser muy compleja. Se escoge, en concreto, una red neuronal de tipo convolucional, usada comúnmente en este tipo de proyecto debido a su alta eficacia clasificando imágenes. Y el resultado es el siguiente: