Reports
CRÍTICA[IDOR / BOLA]#1618347

HackerOne: el GraphQL sin autenticación revelaba el alcance de programas privados con IDs enumerables

Consultando sin sesión el nodo PolicyPageAssetGroup del GraphQL de HackerOne con IDs enumerables se obtenían los grupos de activos de programas privados y, según el investigador, títulos de reportes privados.

Resumen
Resumen en castellano de un reporte público, no una traducción literal. El código y los comandos se mantienen como en el original.

Resumen

El endpoint /graphql de HackerOne permite pedir cualquier objeto a través de la consulta genérica node(id: ...), pasándole su identificador global (gid://hackerone/...). Según el investigador, tras una actualización reciente de la plataforma, el tipo PolicyPageAssetGroup (los grupos de activos que forman el alcance publicado en la página de política de un programa) se devolvía también cuando pertenecía a un programa privado, sin que hiciera falta ningún permiso.

El investigador haxta4ok00 comprobó que la consulta funcionaba sin ninguna autorización. Como el identificador sigue un patrón numérico (3981-41287 en la prueba), basta con ir cambiando los números para recorrer grupos de activos de otros programas.

Datos del caso:

  • Programa: security (el propio programa de HackerOne).
  • Severidad: crítica.
  • Enviado el 28 de junio de 2022 y divulgado el 21 de enero de 2025.
  • Recompensa: sí, con importe no público.

Pasos de reproducción

  1. Sin iniciar sesión, enviar al endpoint /graphql esta consulta, que pide el nodo de un grupo de activos por su identificador global:
{"query":"{node(id:\"gid://hackerone/PolicyPageAssetGroupsIndex::PolicyPageAssetGroup/3981-41287\"){... on PolicyPageAssetGroupDocument{id,name}}}"}
  1. La respuesta incluye el identificador (el mismo gid codificado en Base64) y el nombre del grupo de activos, que en la prueba pertenecía a un programa privado (nombre censurado en el reporte):
{"data":{"node":{"id":"Z2lkOi8vaGFja2Vyb25lL1BvbGljeVBhZ2VBc3NldEdyb3Vwc0luZGV4OjpQb2xpY3lQYWdlQXNzZXRHcm91cC8zOTgxLTQxMjg3","name":"[REDACTADO]"}}}
  1. Cambiando los valores del {id} al final del gid se pueden enumerar otros grupos de activos.

Impacto

Cualquiera, sin cuenta ni invitación, podía conocer el alcance (los activos) de programas privados, que es precisamente la información que esos programas reservan a los investigadores invitados. Según el resumen del investigador, la enumeración de IDs dejaba ver nombres de programas, detalles del alcance y también títulos de reportes de esos programas privados. HackerOne lo clasificó como crítico.

Remediación

El reporte no detalla el arreglo; solo consta que el equipo de HackerOne lo corrigió con rapidez, que figura como resuelto y que se pagó recompensa.

Qué aprender de este caso

  • En APIs GraphQL con interfaz node(id:) (estilo Relay), prueba la consulta genérica con cada tipo que encuentres en el esquema: un tipo puede resolverse por esa vía sin pasar por las comprobaciones de permisos que sí tienen sus consultas específicas.
  • Vigila los cambios recientes: aquí el investigador lo detectó justo tras una actualización. Los tipos ligados a índices de búsqueda (como PolicyPageAssetGroupsIndex) merecen especial atención, porque copian datos fuera del modelo original y pueden perder sus reglas de visibilidad.
  • Un gid en Base64 no es un secreto: decodifícalo, mira si el valor del final es secuencial o compuesto (3981-41287) y prueba a variarlo para enumerar objetos ajenos.
  • Al programar, la autorización debe aplicarse en el resolver de cada tipo (o en una capa común que lo haga siempre), no solo en las consultas de alto nivel; y los documentos de índices de búsqueda deben heredar la visibilidad del programa al que pertenecen.