El pasado lunes 19 de julio, Google lanzó una actualización de su sistema operativo Chrome OS, la 91.0.4472.165, que rápidamente empezó a dar problemas a los usuarios: les impedía iniciar sesión en sus sistemas. Google detuvo inmediatamente el despligue de la misma, cuando sólo había afectado a los usuarios que habían reiniciado sus equipos tras la descarga de la nueva versión.
A estos últimos sólo se les pudo ofrecer soluciones para recuperar el acceso a su sistema que pasaban, inevitablemente, por borrar los datos locales del dispositivo (revertir el dispositivo a una versión anterior vía USB, restaurar estado de fábrica, o borrar y recrear la cuenta de usuario).
Sin embargo, lo interesante de esta actualización fallida (y, por supuesto, ya parcheada), tiene que ver con la razón de dicho fallo. ¿Quizá una corrupción de algún fichero del sistema? ¿Quizá —qué sé yo— alguna extraña y compleja vulnerabilidad del kernel? Para nada: el problema residía en un "&".
Lo extraño del error no es que se cometiera, es que no se detectaran sus efectos
Sí, el carácter conocido en inglés como 'ampersand', usado como sustituto de la palabra 'and', es también un operador fundamental en la mayoría de los lenguajes de programación. El problema de esta actualización vino generado por una revisión del código que, inadvertidamente, eliminó uno de estos operadores en el siguiente fragmento de código C++:
if (key_data_.has_value() && !key_data_->label().empty())
Nada impedía que el código compilase, pues el código sigue teniendo sentido aun cambiando "&&" por "&"… sencillamente, el comportamiento del software varía totalmente.
Así, donde "&&" es un operador AND lógico que actúa como una forma de indicar que deben cumplirse simultáneamente dos o más condiciones para realizar una opción, "&" se convierte en un operador AND de bit a bit: compara los bits uno a uno, si ambos son "1" el resultado es "1", en caso contrario "0".
Esto significa que "&" evalúa ambos lados de la operación, mientras que "&&" evalúa el primer elemento de la operación, y sólo si es 'true' continúa y evalúa el segundo elemento.
Debido a este error, el Chrome OS actualizado nunca llegaba a verificar correctamente las contraseñas de los usuarios comparándolas con las claves almacenadas, por lo que incluso cuando se introducían las contraseñas correctas, el SO devolvía el mensaje de "Lo siento, no se pudo verificar su contraseña".
Queda la duda de cómo un error cómo éste se le pudo pasar a Google: Chrome OS, al igual que el navegador Chrome, cuenta con tres canales de pruebas ('canary', 'dev' y 'beta') con semanas de pruebas de diferencia entre lanzamientos, lo que debería servir para cazar bugs tan obvios como éste antes de pasar al canal estable. De hecho, una prueba unitaria automatizada debería haberlo detectado también.
En cualquier caso, éste constituye un ejemplo magnífico de cómo los peores errores de programación pueden depender de algo tan simple como un carácter.
Vía | The Register
Ver 8 comentarios