En el mundo actual, las APIs juegan un papel importante en la creación de aplicaciones y servicios robustos y flexibles. Sin embargo, con la expansión de las APIs, también surge la necesidad de abordar los desafíos de seguridad asociados.
En esta charla, exploraremos en detalle el OWASP Top 10 de Seguridad en APIs, una lista de las principales vulnerabilidades que los desarrolladores y equipos de seguridad deben tener en cuenta al diseñar, desarrollar y asegurar sus APIs. Por último, comentaremos las mejores prácticas para mitigar los riesgos y garantizar la seguridad de tus APIs. Entre los puntos a tratar podemos destacar:
1.Introducir el concepto de seguridad en las APIs
2.OWASP Top 10 y su importancia para la seguridad en APIs
3.Actualización del OWASP Top 10 security en 2023
4.Herramientas para evaluar y mejorar la seguridad de tus APIs.
5.Estrategias y mejores prácticas para garantizar la seguridad de tus APIs.
2. Welcome to Commit Conf
∘ Introducir el concepto de seguridad en las APIs
∘ OWASP Top 10 y su importancia para la seguridad en
APIs
∘ Actualización del OWASP Top 10 security en 2023
∘ Herramientas para evaluar y mejorar la seguridad de
tus APIs.
∘ Estrategias y mejores prácticas para garantizar la
seguridad de tus APIs.
3. Introducir el concepto de seguridad en las APIs
● Amenazas comunes a la seguridad de las API
○ Ataques de inyección
○ Ataques man-in-the-middle (MITM)
○ Ataques denegación de servicio distribuida
(DDoS)
○ Ataques de control de acceso a las aplicaciones
7. Actualización del OWASP Top 10 security en 2023
1.Broken Object Level Authorization – Autorización a nivel de
objeto rota
https://api.example.com/v1.1/users/payment/show?user_id=12
https://api.example.com/v1.1/messages/show?id=d0c240ea139206
019f692d
8. Actualización del OWASP Top 10 security en 2023
1.Broken Object Level Authorization – Autorización a nivel de
objeto rota
9. Actualización del OWASP Top 10 security en 2023
1.Broken Object Level Authorization
# Inicializar el gestor de archivos
gestor_archivos = GestorArchivos()
# Subir algunos archivos
archivo1 = Archivo("archivo1.txt", id_usuario=1)
archivo2 = Archivo("archivo2.txt", id_usuario=2)
gestor_archivos.subir_archivo(archivo1)
gestor_archivos.subir_archivo(archivo2)
# Un atacante intenta acceder a un archivo que no le pertenece
id_usuario_atacante = 3
nombre_archivo_a_acceder = "archivo1.txt"
archivo_a_acceder =
gestor_archivos.obtener_archivo(nombre_archivo_a_acceder,
id_usuario_atacante)
class Archivo:
def __init__(self, nombre_archivo, id_usuario):
self.nombre_archivo = nombre_archivo
self.id_usuario = id_usuario
class GestorArchivos:
def __init__(self):
self.archivos = []
def subir_archivo(self, archivo):
self.archivos.append(archivo)
def obtener_archivo(self, nombre_archivo,
id_usuario):
for archivo in self.archivos:
if archivo.nombre_archivo == nombre_archivo:
return archivo
return None
10. Actualización del OWASP Top 10 security en 2023
1.Broken Object Level Authorization
def obtener_archivo(self, nombre_archivo, id_usuario):
for archivo in self.archivos:
if archivo.nombre_archivo == nombre_archivo and archivo.id_usuario ==
id_usuario:
return archivo
return None
11. Actualización del OWASP Top 10 security en 2023
2.Broken Authentication – Autenticación rota
● La autenticación podría verse comprometida de muchas
maneras. Por ejemplo, si la autenticación permite la fuerza
bruta, contraseñas débiles o un control de identidad no
verificable, podría romperse fácilmente.
12. Actualización del OWASP Top 10 security en 2023
2.Broken Authentication – Autenticación rota
POST /graphql
{
"query":"mutation {
login (username:"<username>",password:"<password>") {
token
}
}"
}
13. Actualización del OWASP Top 10 security en 2023
2.Broken Authentication – Autenticación rota
● Tokens leaks
https://api.example.com/v1.1/users/payment/show?user_id=12
&access_token=360f91d065e56a15a0d9a0b4e170967b
14. Actualización del OWASP Top 10 security en 2023
2.Broken Authentication – Autenticación rota
● Json Web Tokens
15. Actualización del OWASP Top 10 security en 2023
3.Broken Object Property Level Authorization – Autorización
de nivel de propiedad de objeto rota
● Expone propiedades de un objeto consideradas sensibles y a
las que no debe acceder el usuario.
● Permite al usuario cambiar, añadir y o eliminar el valor de una
propiedad sensible, para la que no debería tener acceso.
16. Actualización del OWASP Top 10 security en 2023
3.Broken Object Property Level Authorization – Autorización
de nivel de propiedad de objeto rota
● https://api.example.com/v1.1/users/show?user_id=12
{
"id": 6253282,
"username": "vickieli7",
"screen_name": "Vickie",
"location": "San Francisco, CA",
"bio": "Infosec nerd. Hacks and secures. Creates god awful infographics.",
"api_token": "8a48c14b04d94d81ca484e8f32daf6dc",
"phone_number": "123-456-7890",
"address": "1 Main St, San Francisco, CA, USA"
}
17. Actualización del OWASP Top 10 security en 2023
3.Broken Object Property Level Authorization
note1 = Note("Nota privada de Juan", user_id=1)
note2 = Note("Nota secreta de María", user_id=2)
note_manager = NoteManager()
note_manager.add_note(note1)
note_manager.add_note(note2)
# Supongamos que un usuario intenta ver las notas de otro
usuario (un atacante)
usuario_malicioso_id = 3
notas_usuario_malicioso =
note_manager.get_notes_for_user(usuario_malicioso_id)
for nota in notas_usuario_malicioso:
print(nota.content)
class Note:
def __init__(self, content, user_id):
self.content = content
self.user_id = user_id
class NoteManager:
def __init__(self):
self.notes = []
def add_note(self, note):
self.notes.append(note)
def get_notes_for_user(self, user_id):
return [note for note in self.notes if
note.user_id == user_id]
18. Actualización del OWASP Top 10 security en 2023
3.Broken Object Property Level Authorization
def get_notes_for_user(self, user_id, request_user_id):
# Verificar si el usuario solicitante tiene permiso para ver
las notas del usuario especificado
if user_id == request_user_id:
return [note for note in self.notes if note.user_id ==
user_id]
else:
return None
19. Actualización del OWASP Top 10 security en 2023
4.Unrestricted Resource Consumption – Consumo de
recursos sin restricciones
● La explotación de esta vulnerabilidad por atacantes mediante
un ataque de denegación de servicio (DoS), ante la falta de
suficientes recursos para atender a todas las peticiones que se
realizan a la API.
● Un aumento sustancial de los costes operativos asociado al
incremento de los recursos que se deben emplear, por
ejemplo, más almacenamiento en la nube.
20. Actualización del OWASP Top 10 security en 2023
5.Broken Function Level Authorization – Autorización rota a
nivel de función
21. Actualización del OWASP Top 10 security en 2023
5.Broken Function Level Authorization – Autorización rota a
nivel de función
22. Actualización del OWASP Top 10 security en 2023
5.Broken Function Level Authorization
def actualizar_perfil_usuario(id_usuario, nuevos_datos):
# Obtener datos del usuario (asumiendo una conexión a la base de datos)
datos_usuario = obtener_datos_usuario(id_usuario)
# Actualizar datos (asumiendo la manipulación de datos)
datos_usuario.update(nuevos_datos)
# Guardar datos actualizados (asumiendo interacción con la base de datos)
guardar_datos_usuario(datos_usuario)
return {"mensaje": "Perfil actualizado correctamente"}
23. Actualización del OWASP Top 10 security en 2023
5.Broken Function Level Authorization
def actualizar_perfil_usuario(usuario_actual, id_usuario, nuevos_datos):
# Compruebe si el usuario actual tiene permiso para actualizar el perfil objetivo
if not esta_autorizado(usuario_actual, id_usuario):
return {"error": "No autorizado para actualizar el perfil"}
def esta_autorizado(usuario_actual, id_usuario_objetivo):
"""
Esta función determina si el usuario actual está autorizado para actualizar el perfil objetivo.
(Reemplace con su lógica de autorización basada en roles y permisos de usuario)
"""
return usuario_actual.id == id_usuario_objetivo # Ejemplo: Permitir solo actualizaciones de
uno mismo
# Uso (asumiendo un objeto de usuario 'usuario_actual' que ha iniciado sesión)
actualizar_perfil_usuario(usuario_actual, usuario_actual.id, {"nombre": "Juana Pérez"})
24. Actualización del OWASP Top 10 security en 2023
6. Unrestricted Access to Sensitive Business Flows-Acceso
sin restricciones a flujos empresariales sensibles
● OWASP señala que cuando se crea un endpoint de API, se
expone un flujo de negocio y es fundamental entender que hay
flujos de negocio más sensibles que otros y el acceso excesivo
a ellos puede resultar perjudicial para la empresa.
● Ejemplos de estos flujos pueden ser los de compra de un
producto, el de publicación de comentarios o el de reservas.
● La vulnerabiliadd se produce cuando se expone un flujo de
negocio sensible sin contar con mecanismos que restrinjan el
acceso de forma adecuada.
25. Actualización del OWASP Top 10 security en 2023
7.Server Side Request Forgery – Falsificación de peticiones
del lado del servidor
26. Actualización del OWASP Top 10 security en 2023
7.Server Side Request Forgery – Falsificación de peticiones
del lado del servidor
● Validación de entrada de usuario
● Listas blancas de direcciones y recursos permitidos
● Limitar permisos y aplicar el principio de mínimo
privilegio.
27. Actualización del OWASP Top 10 security en 2023
8.Security Misconfiguration – Configuración incorrecta o no
segura
● Faltan parches de seguridad
● Configuraciones por defecto
● Funciones innecesarias que están activadas
● La aplicación no utiliza seguridad de la capa de transporte
(TLS) ni una política de intercambio de recursos entre orígenes
(CORS).
● Los mensajes de error que exponen información confidencial
28. Actualización del OWASP Top 10 security en 2023
8.Security Misconfiguration – Configuración incorrecta o no
segura
● Poner en marcha un proceso de hardening
● Revisar y actualizar las configuraciones de la API
● Automatizar la evaluación de la configuración y los
ajustes en todos los entornos
29. Actualización del OWASP Top 10 security en 2023
9.Improper Asset Management – Gestión inadecuada de
activos
30. Actualización del OWASP Top 10 security en 2023
10.Unsafe Consumption of APIs – Consumo no seguro de
APIs
● Una API interactúa con otras a través de un canal no cifrado.
● No se validan ni sanean los datos obtenidos de otras API antes de
procesarlos y trasladarlos a componentes de la API.
● No se validan las redirecciones.
● No se limitan los recursos que se pueden emplear para procesar
respuestas de servicios de terceros.
● No se implementan tiempos de espera en las interacciones con
servicios de terceros.
43. Herramientas para evaluar y mejorar la seguridad
crAPI https://github.com/OWASP/crAPI Completely
Ridiculous
API (crAPI)
Pixi https://github.com/DevSlop/Pixi Vulnerable REST
API based on the
MEAN stack
VAmPI https://github.com/erev0s/VAmPI OWASP API Top
10 vulnerabilities
vAPI https://github.com/roottusk/vapi OWASP API Top
10-based exercises
BankGround https://gitlab.com/karelhusa/bankg
round
Open source project to
learn
REST and GraphQL
security
44. Estrategias y mejores prácticas para garantizar la
seguridad de tus APIs
● Implementar comprobaciones de autorización a nivel de objeto y
considerar la posibilidad de utilizar ID de objetos generados
aleatoriamente.
● Asignar y aplicar privilegios en funciones que requieran
confidencialidad.
● Establecer límites al tamaño de las peticiones, las frecuencias y a
qué pueden acceder los usuarios.
● Imponer restricciones a los flujos de llamdas que podrían ser el
origen de un ataque si se usan en exceso.
● Evitar configuraciones inseguras cuando sea posible.
● Documentar los servicios y actualizar estos catálogos
periódicamente.
45. Estrategias y mejores prácticas para garantizar la
seguridad de tus APIs
● Mejorar la gobernanza de las APIs
● Utilizar herramientas de descubrimiento de APIs
● Desplegar una pasarela API
● Añadir un firewall de aplicaciones web (WAF)
● Cifrar todos los datos (mediante TLS, por ejemplo)
● Utilizar OAuth para controlar el acceso de la APIs
● Aplicar la limitación de velocidad para restringir la frecuencia con
la que se puede llamar a su API.
● Considerar un enfoque de confianza cero o zero trust