🔒 Registro cerrado · Apertura oficial próximamente · Acceso exclusivo para alumnos activos
Iniciar SesiónAutorización en cada resolutor y en cada campo
5 tareas · 45 min · Principiante
En Carretel nadie puede pedir el perfil de otra persona, y es verdad: esa consulta exige rol de administración. Aun así, alguien vio las facturas de un desconocido entrando desde una lista pública del catálogo. Te entregan el extracto de resolutores, la matriz de acceso acordada con negocio y el registro de operaciones del día. La pregunta no es si la comprobación existe, sino por dónde se entró sin pasar por ella.
Objetivo de la sala
En Carretel nadie puede pedir el perfil de otra persona, y es verdad: esa consulta exige rol de administración. Aun así, alguien vio las facturas de un desconocido entrando desde una lista pública del catálogo. Te entregan el extracto de resolutores, la matriz de acceso acordada con negocio y el registro de operaciones del día. La pregunta no es si la comprobación existe, sino por dónde se entró sin pasar por ella.Un resolutor es la función que devuelve el valor de un campo. Hay uno por cada campo que el esquema declara, aunque muchos sean triviales, y el servidor los encadena: resuelve la consulta raíz, y con lo que esta devuelve resuelve los campos del tipo siguiente, y así hasta donde llegue la petición. Esa cadena es la que hay que tener en la cabeza al revisar.
De ahí sale la regla práctica de la autorización en GraphQL: la comprobación tiene que estar donde se resuelve el dato, no solo en la puerta por la que se entró. Un mismo tipo se alcanza por varios caminos, y si la comprobación vive únicamente en uno de ellos, los demás la rodean sin proponérselo. MITRE llama a esta familia control de acceso inadecuado (CWE-284); cuando lo que falta es la comprobación sobre un dato concreto que se pide, la forma más cercana es la autorización ausente (CWE-862).
Responde para continuar
¿Dónde tiene que estar la comprobación de quién pregunta en una API construida con GraphQL?
Ver pista de ayuda
Piensa en cuántas formas hay de llegar al mismo tipo dentro de un grafo.
Abre el laboratorio y lee resolutores.txt. El extracto marca con exigeDueno los campos que comprueban que quien pregunta es la persona dueña del perfil. Recórrelos todos y, cruzando con matriz-de-acceso.txt, encuentra el campo que la matriz reserva a la persona dueña y que, sin embargo, se resuelve sin comprobar nada.
Responde para continuar
¿Qué campo del tipo Perfil se resuelve sin comprobar quién pregunta, pese a que la matriz lo reserva a su dueño? Escríbelo tal como aparece en el extracto, sin el nombre del tipo.
Ver pista de ayuda
Cinco campos del perfil son privados según la matriz; cuatro traen la comprobación en su resolutor.
El informe necesita un número y el número sale del registro, no de las quejas. En registro-consultas.txt, la segunda columna dice qué cuenta tenía la sesión y la quinta de quién eran los datos que devolvió el campo más profundo. Cuenta las cuentas distintas que recibieron, con resultado correcto, el campo de facturación de un perfil que no era el suyo. Cuenta cuentas, no líneas, y descarta las operaciones denegadas.
Responde para continuar
¿Cuántas cuentas distintas recibieron el campo de facturación de un perfil ajeno?
Ver pista de ayuda
Hay una línea en la que las dos columnas coinciden y otra que terminó denegada; ninguna de las dos cuenta.
El equipo tiene razón en que la consulta raíz de perfil exige rol de administración, y el registro lo confirma: la única vez que alguien la usó contra un perfil ajeno, el servidor la denegó. Y, aun así, ese mismo perfil entregó datos privados en otras seis operaciones. Mira qué operación aparece en esas líneas y qué campo del catálogo devuelve el tipo que describe a una persona.
Responde para continuar
La consulta raíz de perfil exige rol de administración. ¿Por qué eso no impidió que se leyeran datos privados de perfiles ajenos?
Ver pista de ayuda
Busca en el extracto qué otro campo devuelve el mismo tipo.
Hay dos formas de escribir la recomendación y solo una envejece bien. Poner la comprobación que falta en ese campo cierra el caso de hoy y deja viva la causa: el próximo campo privado que alguien añada volverá a nacer sin ella, porque el valor por defecto de este servidor es responder. Lo que cambia el resultado es invertir ese valor por defecto, y que exponer un campo sea una decisión explícita, no lo que ocurre si nadie hace nada.
Responde para continuar
¿Qué recomendación cierra la causa y no solo el hallazgo de hoy?
Ver pista de ayuda
Pregúntate qué pasa con el próximo campo que alguien añada a ese tipo.
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
Preferencias
Configuraciones de cookies
Elige qué categorías permitir. Las esenciales siempre están activas. Consulta la Política de Privacidad.
Esenciales
Siempre activas · sesión, CSRF, tema y esta preferencia
Necesarias para iniciar sesión, proteger formularios (CSRF) y recordar tu elección de cookies y tema. Sin ellas la plataforma no funciona de forma segura.
Analíticos
Hoy no activos en la plataforma; listos para cuando se conecten
Nos ayudan a entender uso de cursos y páginas. Si los activas, se usarán cuando conectemos analítica; hasta entonces no se carga ningún tracker.
Marketing
Hoy no activos; campañas futuras solo con tu permiso
Comunicaciones o campañas. No activos hoy en la plataforma; quedarán listos si los conectamos y solo si los permites.