
Escáner de seguridad de autorización automatizado para APIs basadas en OpenAPI. Prueba endpoints GET con múltiples conjuntos de credenciales para detectar escalada de privilegios y errores de control de acceso roto mediante análisis de respuesta diferencial.
Los problemas de seguridad de autorización en aplicaciones web modernas no son fácilmente detectados por los escáneres de seguridad. Algunos ejemplos de Shopify, LINE, NordVPN. Una de las razones es que los escáneres de seguridad se centran principalmente en buscar SQLi, XSS, RCE en lugar de buscar errores de seguridad de autorización, y los escáneres generalmente no tienen conocimiento de cómo se supone que debe comportarse la aplicación web. Por eso la mayoría de los errores de autorización ahora se descubren principalmente de forma manual. OpenAPI Security Scanner se creó para ayudar a descubrir problemas de seguridad de autorización tanto con automatización como con revisión manual. Se comporta como una herramienta de prueba unitaria externa para asegurarse de que todo se comporte como debería.
Mira este video para seguir o continúa leyendo.
Fork o clona este proyecto y sigue las instrucciones a continuación para comenzar.
El flujo de trabajo para usar este escáner sería algo así:
Para los desarrolladores, usar esta herramienta agregaría una capa adicional de seguridad de que la API se comporta como se espera tanto interna como externamente. Y el escáner podría activarse en cada despliegue de código activando el pipeline https://docs.gitlab.com/ee/ci/triggers/.
Para los cazadores de recompensas por errores, usar esta herramienta puede asegurar que siempre estés al tanto de la API objetivo, porque todos sabemos que incluso un endpoint específico que no era vulnerable antes, podría ser vulnerable en el futuro debido a varias razones. Por lo tanto, es más fácil automatizar la parte manual de la caza de errores usando esta herramienta.
Asegúrate de tener permiso para escanear la API objetivo.
Necesitarás un archivo yaml de OpenAPI de la aplicación web y reemplazarlo con el contenido de api.yaml en el repositorio.
Reemplaza el contenido de api.yaml por el archivo yaml de OpenAPI del objetivo, y ve a Settings -> CI/CD del proyecto de GitLab -> Expande Variables e ingresa las variables en los siguientes formatos.
Las credenciales proporcionadas aquí se pasarán a las llamadas a la API en el formato de encabezado Authorization: Bearer.
Se recomienda preparar tokens de acceso para al menos dos cuentas de usuario con diferentes permisos, y también puedes crear más de un token de acceso por cuenta de usuario para probar comportamientos correctos para tokens de acceso con diferentes ámbitos.
{
"<user_a>":[
{
"scope":"<scope>",
"access_token":"<value>",
"name":"<name_of_access_token>"
},
{
"scope":"<scope>",
"access_token":"<value>",
"name":"<name_of_access_token>"
}
],
"<user_b>":[
{
"scope":"<scope>",
"access_token":"<value>",
"name":"<name_of_access_token>"
}
]
}
Los endpoints proporcionados aquí deben ser llamadas a la API basadas en GET, y también puedes incluir la consulta en el cuerpo JSON. En el siguiente ejemplo, el endpoint es /org/{orgs}/repos y la consulta es type=all. Para el endpoint /repos/{owner}/{repo}, no habrá consulta.
{
"/orgs/{org}/repos":{
"type":"all"
},
"/repos/{owner}/{repo}":{
}
}
Las variables de ruta se pueden proporcionar aquí, y el escáner generará todas las combinaciones a partir de los valores en las variables de ruta.
{
"org":[
"test-org"
],
"owner":[
"ngalongc",
"reconless"
],
"repo":[
"public-repo",
"private-repo"
]
}
En este caso, se generan las siguientes llamadas API combinadas, y todas serán llamadas por diferentes conjuntos de credenciales proporcionadas en OPENAPI_CREDS.
/orgs/test-org/repos?type=all
/repos/ngalongc/public-repo
/repos/ngalongc/private-repo
/repos/reconless/public-repo
/repos/reconless/private-repo
Ve a https://gitlab.com/-/profile/personal_access_tokens y crea un token de acceso api y reemplaza el valor aquí. Este token de acceso de GitLab se utiliza para descargar los resultados del escaneo desde el runner de GitLab.
<YOU_GITLAB_API_ACCESS_TOKEN>
Este debe ser el valor de la URL base de tu servidor API.
https://example.com/api/v3
Captura de pantalla de la notificación de Slack cuando se detectan cambios en la API
Captura de pantalla del resultado del escaneo en artifacts
Informe de muestra: https://ngalog-gitlab.gitlab.io/-/openapi_security_scanner/-/jobs/966841401/artifacts/sample.html
GET/users/{user_id}/activities, las respuestas son diferentes cada vez que se llaman, por lo que detectar cambios en este tipo de API no tiene sentidoLas contribuciones son lo que hace que la comunidad de código abierto sea un lugar tan increíble para aprender, inspirar y crear. Agradecemos enormemente cualquier contribución que hagas.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Distribuido bajo la Licencia MIT. Consulta LICENSE para más información.
Ron Chan - @ngalongc
Enlace del Proyecto: https://gitlab.com/ngalog-gitlab/openapi_security_scanner