martes, 23 de agosto de 2011

PHP 5.3.8 corrige un fallo introducido por la propia PHP 6 días atrás

El pasado día 17 de agosto, se publicaba la nueva versión estable (5.3.7) del popular lenguaje de programación PHP. Incluía la corrección de un error de seguridad en la función "crypt" al utilizarse para generar contraseñas con "sal" que podría causar un desbordamiento de memoria intermedia. Seis días después lanzan una nueva versión para corregir un error introducido en la corrección.

La función "crypt" de PHP, permite a los usuarios generar el hash de una cadena utilizando un algoritmo de cifrado. Acepta además un segundo valor que sería un valor hash (MD5, Blowfish o DES) que se usa de sal para la generación a su vez del hash de una contraseña. Los hashes de contraseñas con sal intentan evitar los ataques de diccionario. La versión 5.3.7 corregía un desbordamiento de de memoria intermedia en esta función.

Pero al corregir este error, el equipo de desarrollo de PHP ha introducido otro que, como mínimo, no permitía el correcto funcionamiento de la función y además introducía otro potencial problema de seguridad. En lugar de devolver el hash correcto calculado con la cadena, la función "crypt" devolvía el mismo valor de la sal ya introducido como segundo parámetro cuando se usaba una sal MD5. Si se utilizaba sal Blowfish o DES, se calculaba correctamente.

Ej:

printf("MD5: %s\n", crypt('password', '$1$U7AjYB.O$'));

Debía devolver: MD5: $1$U7AjYB.O$L1N7ux7twaMIMw0En8UUR1 pero en realidad devolvía: MD5: $1$U7AjYB.O$

Es destacable en este caso que el grave problema ha dejado a algunos usuarios con aplicaciones inservibles o bien totalmente expuestas, porque según se utilizase esta función, se validaría cualquier contraseña en ciertos escenarios.

PHP no ha tardado en reaccionar, y una vez identificado el error, han publicado una nueva revisión del código en el repositorio oficial, de forma que ya está disponible la versión estable 5.3.8, que soluciona este fallo.


Fernando Ramírez
framirez@hispasec.com


Más información:

crypt() returns only the salt for MD5
https://bugs.php.net/bug.php?id=55439

PHP 5.3.8 (Current stable)
http://php.net/downloads.php

No hay comentarios:

Publicar un comentario en la entrada