Cobertura

Qué cubre yof y qué no

Clase por clase: qué busca yof en tu código, qué comprueba la «Prueba automatizada» en una app en marcha y qué no hace ninguna de las dos.

Cómo leer la tabla

  • En el código: patrones que las reglas buscan en los archivos de un repositorio vinculado. Una regla encuentra un patrón y no ejecuta el código, así que la mayoría de estos hallazgos necesitan validación.
  • En vivo: pruebas sobre una app en marcha. La «Prueba automatizada» está en desarrollo y no está a la venta, así que nada marcado así está disponible todavía para los clientes.
  • No cubierto: lo que no hace ninguna de las dos. Un informe nunca se lee como si esto se hubiera comprobado.
ClaseEn el códigoEn vivoNo cubierto
Inyección SQL
  • Se construye SQL con datos de la petición
  • El texto enviado a tu app se ejecuta como parte de una consulta a la base de datos En desarrollo
Datos que pasan por otra función u otro archivo, la inyección almacenada (de segundo orden) y los fallos internos de un ORM.
Inyección NoSQL
  • Un filtro de base de datos toma un valor directo de la petición
  • El texto enviado a tu app se ejecuta como parte de una consulta a la base de datos En desarrollo
Los lenguajes de consulta de otras bases de datos de documentos, y los lenguajes que no son JavaScript ni TypeScript.
Inyección de comandos
  • Se construye un comando de shell con datos de la petición
  • El texto enviado a tu app se ejecuta como un comando del sistema En desarrollo
Argumentos inyectados en un programa que se llama sin shell, y otros lenguajes.
Inyección en plantillas
  • Datos de la petición se usan como plantilla
  • El texto enviado a tu app lo ejecuta su motor de plantillas En desarrollo
Plantillas leídas de una base de datos, y motores de plantillas que se ejecutan en el navegador.
Evaluación de código
  • Datos de la petición se ejecutan como código
Sin prueba en vivoLa evaluación a través de un objeto aislado, y otros lenguajes.
Cross-site scripting
  • Datos de la petición se escriben en la página como HTML
  • El texto enviado a tu app vuelve como código vivo de la página En desarrollo
Los saltos de confianza de Angular y Vue, los ajustes de autoescape de las plantillas del servidor, los scripts almacenados y una prueba en un navegador real.
Redirección abierta
  • Una redirección va a donde diga la petición
  • Tu web reenvía a los visitantes a cualquier dirección del enlace Disponible hoy en yof attack
Listas de direcciones permitidas que existen y se pueden saltar.
Server-side request forgery
  • El servidor descarga una dirección tomada de la petición
  • Tu servidor accede a cualquier dirección que indique la petición En desarrollo
DNS rebinding, redirecciones que llevan hacia dentro, y si se puede llegar a los metadatos de la nube.
Cross-site request forgery
  • Inicio de sesión por cookie sin comprobación CSRF en el código
  • Una cookie de inicio de sesión se crea sin httpOnly o sin sameSite
  • A la cookie de sesión le falta un indicador de protección Disponible hoy en yof attack
  • Otra web puede hacer que un usuario con sesión cambie sus datos En desarrollo
Frameworks que no son apps de estilo Express, una comprobación hecha por un proxy, y si los valores por defecto del navegador protegen la ruta.
Carga de objetos con riesgo
  • Datos de la petición se cargan como objeto
  • Tu app entrega el cuerpo de una petición a un lector de objetos inseguro En desarrollo
Java ObjectInputStream, .NET BinaryFormatter y las entidades externas de XML.
Criptografía débil
  • Una contraseña o un token se guarda con un hash rápido o roto
  • Un token o un código se genera con una función aleatoria predecible
  • Hay una clave criptográfica escrita en el código
  • El cifrado usa el modo ECB
  • La comprobación de certificados está desactivada
  • Un token de inicio de sesión se acepta sin comprobar su firma
  • Tu app acepta un token de sesión que nunca comprobó En desarrollo
  • Los ids o los tokens de sesión son fáciles de adivinar En desarrollo
Longitudes de clave, versiones de protocolo y certificados del servicio en marcha, criptografía propia y canales laterales.
Contraseñas en el código y la configuración
  • Hay una contraseña escrita en tu código o tu configuración
  • Hay un usuario y una contraseña por defecto escritos en el código
  • Una dirección de tu código lleva la contraseña dentro
Sin prueba en vivoEl historial de git de archivos que ya no están, si una contraseña encontrada sigue funcionando, y una sola palabra corriente sin dígito ni símbolo.
Subida de archivos
  • Una subida conserva el nombre o el tipo de archivo que envió el visitante
  • La carpeta de subidas se sirve como páginas web
  • Un archivo subido se sirve como una página que el navegador ejecuta En desarrollo
Lo que el servicio de almacenamiento o la CDN hace con el archivo, malware en la subida y límites de tamaño.
Dockerfile
  • Hay un secreto escrito en tu Dockerfile
  • Tu Dockerfile ejecuta una descarga sin comprobarla
  • Tu imagen base ha pasado su fin de vida
  • Tu contenedor ejecuta la app como root
  • La imagen base de tu contenedor no tiene una versión fija
  • Tu imagen de contenedor incluye un servidor SSH
  • Tu imagen base está fijada por tag, no por digest
  • Tu Dockerfile instala paquetes sin versión fija
Sin prueba en vivoLas imágenes construidas y los paquetes del sistema operativo que llevan dentro no se analizan. El fin de soporte solo se conoce para seis imágenes base oficiales.
docker-compose
  • Un servicio de compose se ejecuta con los privilegios del host
  • Un servicio de compose puede controlar el propio Docker
  • Hay un secreto escrito en tu archivo compose
Sin prueba en vivoLos contenedores en marcha, y los archivos env que no están en el repositorio.
Manifiestos de Kubernetes
  • Un contenedor de Kubernetes se ejecuta como privilegiado
  • Una carga de Kubernetes accede a su nodo
  • Hay un secreto escrito en un manifiesto de Kubernetes
  • Un contenedor de Kubernetes puede ejecutarse como root
  • Un contenedor de Kubernetes puede obtener más privilegios
  • Un contenedor de Kubernetes no tiene límites de recursos
  • Una imagen de Kubernetes no tiene versión fija
Sin prueba en vivoEl clúster en marcha, las plantillas de Helm sin renderizar, RBAC, las políticas de red y de admisión, y los archivos con anclas YAML.
Terraform
  • Una regla de firewall abre un puerto de administración a todo internet
  • Un bucket de almacenamiento se hace público en Terraform
  • Se crea almacenamiento o una base de datos sin cifrado
  • Una base de datos es accesible desde internet en Terraform
  • Hay una contraseña o una clave escrita en tus archivos de Terraform
Sin prueba en vivoLa propia cuenta en la nube: lo desplegado puede diferir de los archivos. Valores que vienen de variables, módulos o funciones, otros proveedores y otros tipos de recurso.

Fuera de todas las filas

  • Las imágenes de contenedor construidas y los paquetes del sistema operativo que llevan dentro no se analizan.
  • Estas reglas leen archivos. No miran el sistema en funcionamiento: el clúster, la cuenta de la nube ni cómo se comporta la app en producción.
  • Los datos de la petición se siguen solo dentro de una función o un manejador. Un valor que pasa antes por otra función u otro archivo no se sigue.
  • Lenguajes: las reglas de sintaxis leen JavaScript y TypeScript. Python tiene las formas simples y exactas. PHP, Ruby, Go, Java, Kotlin y C# tienen unas pocas formas de una sola línea. Estas reglas no leen otros lenguajes.

Nunca cubierto por comprobaciones automáticas

  • Fallos en la lógica de negocio, como un precio o un paso que alguien puede saltarse.
  • Debilidades que nadie conoce todavía (zero-days).
  • Personas y procesos: phishing, contraseñas compartidas a mano, quién tiene acceso.
  • Todo lo que queda fuera del alcance nombrado en este informe, y cualquier cambio posterior a su fecha.

Esto no es una prueba de penetración.

Cómo revisa yof

Qué cubre yof y qué no, clase por clase