Actualización: Las contraseñas del eCenso no están precisamente guardadas en texto plano, pero sigue siendo muy feo el asunto

Nota: Quiero reiterar que las informaciones expresadas en este blog corresponden a mi opinión personal y no comprometen la compañía para la que trabajo.

Ayer publiqué un post diciendo que las contraseñas de los usuarios del eCenso están almacenadas en texto plano, dado que muestran la contraseña al final del registro y la mandan el texto plano por email si usas la opción de “Olvidé mi contraseña”. Al investigar más, me di cuenta que esto no es precisamente cierto, así que quiero precisar lo que he descubierto desde entonces, gracias a la ayuda de Andrés Felipe Cruz y Jairo Suárez en Facebook.

eCenso Offline

Actualización: El eCenso Offline ya no está disponible.

El DANE tiene una opción de hacer el eCenso sin conexión a internet vía una aplicación de Windows. Sin embargo, esto no es una aplicación común y corriente: es un servidor WAMP completo que el usuario tiene que descargar y ejecutar, y que abre su propio navegador web.

2

El código detrás del eCenso Offline, hasta donde puedo ver, es casi idéntico al del eCenso normal. El código está escondido usando la bandera de archivo de sistema de Windows, pero apenas activé la opción de mostrar estos archivos en Windows, los pude ver.

1

Esto significa que cualquier persona puede descargar el código completo del eCenso y ver qué está ocurriendo. Esto también podría llevar a que un hacker pueda leer el código para descubrir más problemas de seguridad.

¿Cómo se almacenan las contraseñas?

Las contraseñas se almacenan en MySQL, en la base de datos bd_censo y la tabla ecp_usuarios. La contraseña para la base de datos está disponible en el código en los archivos de configuración. Creé un usuario de prueba y pude extraer su nombre de usuario y contraseña:

3

4

Parece que está encriptada, ¿no? Sí, está encriptada, pero es encriptación simétrica, y lo peor de todo es que la llave es pública para que todos la vean. El código para encriptar y desencriptar contraseñas es el siguiente, del archivo Danecrypt.php:

5

Ahora, es posible que la llave la hayan cambiado para la aplicación offline, pero de todas maneras sigue siendo muy mala práctica encriptar contraseñas en vez de usar hash+sal.

Adicionalmente, este código no es seguro. Haciendo una búsqueda, podemos ver que este código fue copiado y pegado de StackOverflow de una respuesta que tiene numerosas advertencias de los problemas de seguridad incluídos en él. ¿Por qué el DANE usaría código que la comunidad de programadores profesionales diría que es inseguro?

¿Por qué es malo encriptar contraseñas (en vez de usar un hash+sal no-reversible)?

Si las contraseñas se pueden encriptar, significa que se puede desencriptar, no solo por el sistema, sino también por un hacker, un empleado con intenciones maliciosas, o cualquier otra persona que consiga acceso a la llave. En este caso, conseguir acceso a la llave fue ridículamente fácil ya que el DANE nos deja literalmente descargarla de su página.

Poder recuperar la contraseña original suena como buena idea para alguien sin mucho conocimiento, pero al analizarlo más profundamente, no es algo necesario o deseable. Dado que muchos usuarios re-usan contraseñas, es importante que si se roban la base de datos, los hackers no puedan usar las contraseñas para hackear otras páginas. Además, este tipo de encripción hace que todos los usuarios que usen la misma contraseña tengan la misma contraseña encriptada (recordemos que la contraseña más popular del mundo es “password”).

Las contraseñas deben ser transformadas usando hash+sal, lo cual hace virtualmente imposible recuperar la contraseña original. Este es el estándar de la industria. Si el usuario olvida la contraseña, no es necesario darle la contraseña original; puede recuperar su cuenta creando una nueva. El hash hace que la contraseña se transforme en una sola vía en algo único pero irreconocible, mientras que la sal aleatoria hace que el hash de todos los usuarios sea diferente y único.

Conclusión

Todo esto apunta a que el eCenso tiene numerosos problema de seguridad. No solo guarda la contraseña en un formato de encripción reversible, sino que hace que la llave de encripción esté pública para que todos la vean y mandan las contraseñas por email en texto plano. Además, otras contraseñas como la de la base de datos están fácilmente disponibles en el código descargable.

En mi opinión, el DANE debe responder a estas fallas de seguridad tremendas que hay en el eCenso. Están promoviendo el eCenso como seguro, pero esto es falso. Por lo menos, de manera inmediata deben quitar el eCenso Offline y actualizar todas las contraseñas y llaves de encripción en su aplicación online, especialmente si se comparten con la versión offline.