Loading
_ DESCIFRANDO CONEXIÓN SEGURA...

Comparaciones en tiempo constante

5 tareas · 35 min · Principiante

Una firma bien calculada o un token bien generado pueden perder su valor en la última línea: la que los compara con lo que llegó en la petición. La forma de comparar decide cuánto tarda la respuesta, y a veces también qué se da por igual. Nómina Hatogrande buscó en su repositorio cada comparación con un valor que llega de fuera y te entrega la lista con dos fragmentos de código.

0 de 5 · 0%

Objetivo de la sala

Una firma bien calculada o un token bien generado pueden perder su valor en la última línea: la que los compara con lo que llegó en la petición. La forma de comparar decide cuánto tarda la respuesta, y a veces también qué se da por igual. Nómina Hatogrande buscó en su repositorio cada comparación con un valor que llega de fuera y te entrega la lista con dos fragmentos de código.

Los operadores de igualdad de casi todos los lenguajes comparan byte a byte y se detienen en la primera diferencia. Es lo eficiente, y por eso tardan un poco más cuanto más se parecen las dos cadenas desde el principio. Si una de ellas es un secreto —una firma esperada, un token guardado, un código— y la otra la controla quien envía la petición, esa diferencia de tiempo es información sobre el secreto. MITRE la clasifica como CWE-208, diferencia de tiempo observable.

La medición a través de la red es ruidosa y no siempre se puede aprovechar, pero eso depende de condiciones que el código no controla: la carga del servidor, la cercanía de quien mide, cuántos intentos tolera la ruta. Por eso la regla en revisión es simple: un secreto se compara con una función hecha para tardar lo mismo sin importar dónde está la diferencia.

Responde para continuar

¿Qué hace que comparar una firma recibida con la esperada usando el operador de igualdad habitual sea un hallazgo?

Ver pista de ayuda

Piensa en qué pasa dentro del operador cuando el primer byte ya es distinto.

PHP, como la mayoría de los lenguajes, trae una función pensada para comparar resúmenes y firmas en tiempo constante. Su documentación insiste en un detalle: el valor conocido va primero y el que llega del usuario va segundo. Solo filtra la longitud del valor conocido, que en una firma de tamaño fijo no es un secreto. Abre comparaciones.txt: el repositorio de Hatogrande ya la usa en algunas filas.

Responde para continuar

¿Qué función usa ya el repositorio de Hatogrande para comparar en tiempo constante? Escríbela sin paréntesis.

Ver pista de ayuda

Mira la columna «cómo» de las filas que comparan huellas y sellos.

No toda comparación con un dato externo es un problema. Comparar el estado pedido en un filtro con una palabra fija, o el idioma con una lista, no revela nada que no sea público. El hallazgo aparece cuando uno de los dos lados es un secreto o se deriva de uno. Recorre la lista fila por fila, decide qué filas comparan un secreto y cuáles de esas no usan una comparación en tiempo constante.

Responde para continuar

¿Cuántas filas de la lista comparan un secreto sin una comparación en tiempo constante?

Ver pista de ayuda

Comparar con strcmp o con === también se detiene en el primer byte distinto.

En PHP hay dos igualdades. La estricta compara tipo y valor; la débil puede convertir los operandos antes de comparar, y dos cadenas distintas que parecen números pueden darse por iguales. Sobre un secreto, la igualdad débil suma ese riesgo al de tiempo. Que «las dos sean texto hexadecimal» no lo descarta: una firma hexadecimal puede tener forma de número.

Responde para continuar

¿Qué archivo compara un valor secreto con la igualdad débil? Escribe su nombre con la extensión.

Ver pista de ayuda

Busca en la columna «cómo» el operador de dos signos.

En la fila del token de invitación de la API vieja, el token se guarda en claro y se compara con lo que llega. Cambiar la función de comparación lo arregla a medias: el token sigue guardado en claro en la base. La API nueva hace otra cosa, y esa otra cosa también resuelve el problema del tiempo.

Responde para continuar

¿Qué diseño quita a la vez el problema del tiempo y el del token guardado en claro?

Ver pista de ayuda

Lee el comentario de InvitacionController.php sobre lo que guarda la API nueva.

Inicia sesión para registrar tus puntos y progreso en el ranking.

Whoami-Labs Pro

Whoami-Labs Pro utiliza cookies

Utilizamos cookies y almacenamiento local para el funcionamiento del sitio, seguridad de sesión y, si lo autorizas, analítica y marketing. Puedes aceptar, rechazar o personalizar. Política de Privacidad