Skip to main content

Cómo encontrar y corregir referencias directas a objetos inseguras en Python

Escrito por

Keshav Malik

feature python linting

19 de julio de 2023

0 minutos de lectura

Una referencia directa a objetos insegura (IDOR) es una vulnerabilidad de seguridad que ocurre cuando la implementación de un sistema permite que los atacantes accedan directamente a objetos o recursos confidenciales y los manipulen sin verificar la autorización. Por ejemplo, puede haber una vulnerabilidad IDOR cuando una aplicación da acceso directo a objetos según datos proporcionados por el usuario, lo que permite que un atacante omita la autorización.

Comprender las vulnerabilidades IDOR

Debemos abordar las vulnerabilidades IDOR para mantener la confidencialidad, integridad y disponibilidad de los datos confidenciales que manejan tus aplicaciones de Python. Los desarrolladores deben comprender las vulnerabilidades IDOR para evitar el acceso no autorizado, mantener la confianza de los usuarios y evitar posibles consecuencias financieras y legales graves. 

Tipos de vulnerabilidades IDOR

Las vulnerabilidades IDOR adoptan distintas formas según la implementación y las funciones de la aplicación.

IDOR con referencias a objetos

Esta forma de vulnerabilidad IDOR ocurre cuando un atacante puede acceder a un objeto no autorizado o modificarlo. Un ejemplo común es cuando una aplicación web permite acceder a datos confidenciales, como cuentas bancarias, mediante una solicitud sencilla, por ejemplo, example.com/accounts?id={account_id}. Si la aplicación no verifica eficazmente los permisos del solicitante, los usuarios no autorizados pueden ver o manipular la información de la cuenta.

IDOR con referencias a archivos

Este tipo de vulnerabilidad IDOR implica la recuperación no autorizada de archivos. Por ejemplo, si una aplicación de chat almacena registros confidenciales de conversaciones en archivos numerados de forma consecutiva, un atacante podría acceder a conversaciones privadas mediante solicitudes con números similares: example.com/1.log, example.com/2.log, y así sucesivamente.

IDOR ciega

Una vulnerabilidad IDOR ciega se refiere a los casos en los que la explotación no es directamente visible en la respuesta del servidor, aunque se haya producido una modificación no autorizada. Con una IDOR ciega, un atacante puede cambiar los datos privados de otro usuario sin verlos. Por ejemplo, si una aplicación web permite que un usuario modifique la configuración de su perfil mediante una llamada a la API, como example.com/users/update?id={user_id}, un atacante podría manipular el user_id de la solicitud y cambiar la configuración del perfil de un usuario sin ver directamente sus datos.

Patrones comunes para detectar vulnerabilidades IDOR en el código

Para detectar vulnerabilidades IDOR en el código, hay que estar alerta y conocer los patrones comunes:

  • Falta de control de acceso: Es probable que una aplicación que usa datos proporcionados por el usuario para acceder directamente a los recursos, sin verificar su autorización, tenga una vulnerabilidad IDOR.

  • Identificadores fáciles de adivinar: Los identificadores fáciles de adivinar, como los enteros secuenciales (user_id=99001) o las cadenas cortas (user_id=user1), aumentan el riesgo de vulnerabilidades IDOR en una aplicación. Usar identificadores difíciles de adivinar, como los identificadores únicos universales (UUID), puede reducir este riesgo.

  • Acceso directo a archivos: Una aplicación que da a los usuarios acceso directo a cualquier recurso, como imágenes o archivos CSV, mediante URL o parámetros de solicitud es vulnerable a las vulnerabilidades IDOR. Debemos asegurarnos de que existan mecanismos de control adecuados para evitar dar a los usuarios acceso directo a los archivos.

Crear una aplicación de Python vulnerable a IDOR con FastAPI

En esta sección, crearemos una API web vulnerable a IDOR con FastAPI, un framework de Python. Después, veremos cómo corregir la vulnerabilidad.

Para seguir este tutorial práctico, asegúrate de tener Python 3.x instalado en tu máquina.

Primeros pasos

Primero, necesitamos una aplicación nueva. Crea un directorio para tu proyecto y accede a él:

mkdir fastapi-app; cd fastapi-app

Luego, instala FastAPI, Uvicorn, SQLAlchemy y SQLite con el siguiente comando:

pip install fastapi uvicorn sqlalchemy

Por último, crea un archivo llamado main.py en el directorio del proyecto.

Crear una API vulnerable con FastAPI

Ahora que configuramos la estructura de directorios y los requisitos, escribamos el código que contiene una vulnerabilidad IDOR. Primero, copia el código de abajo en main.py:

from fastapi import FastAPI, HTTPException, Depends
from sqlalchemy import create_engine, Column, Integer, String
from sqlalchemy.ext.declarative import declarative_base
from sqlalchemy.orm import sessionmaker, Session

app = FastAPI()

# SQLite database configuration
DATABASE_URL = "sqlite:///./test.db"
engine = create_engine(DATABASE_URL)
SessionLocal = sessionmaker(autocommit=False, autoflush=False, bind=engine)

Base = declarative_base()

# User model
class User(Base):
    __tablename__ = "users"

    id = Column(Integer, primary_key=True, index=True)
    uuid = Column(String, unique=True, index=True)
    username = Column(String, unique=True, index=True)
    email = Column(String, unique=True, index=True)

Base.metadata.create_all(bind=engine)

# Dependency for database session
def get_db():
    db = SessionLocal()
    try:
        yield db
    finally:
        db.close()

@app.get("/users/{user_id}")
async def get_user_by_id(user_id: int, db: Session = Depends(get_db)):
    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

La vulnerabilidad IDOR está en el endpoint /users/user_id. Como la aplicación no tiene controles de acceso, cualquier usuario puede ver los datos de otros usuarios si cambia el user_id en la URL.

Cómo identificar y corregir vulnerabilidades IDOR

Ahora, encontremos y corrijamos la falla de seguridad IDOR en nuestra aplicación FastAPI.

Cómo encontrar vulnerabilidades

Para identificar vulnerabilidades IDOR, debemos buscar patrones específicos en el código. En la aplicación FastAPI, debemos examinar el endpoint /users/{user_id}, que representa una posible vulnerabilidad IDOR por los siguientes motivos:

  • Referencias directas a objetos sin protección: En la función get_user_by_id, el parámetro user_id hace referencia directamente al objeto User de la base de datos. Cualquier cliente podría manipular el valor de user_id en la solicitud para acceder a los datos de otros usuarios, ya que ningún mecanismo de control de acceso protege esta referencia directa.

  • Falta de autorización: En la misma función get_user_by_id, no hay verificaciones que confirmen si el usuario que realiza la solicitud está autorizado para acceder a los datos del usuario solicitado. Cualquier usuario puede acceder a los datos de cualquier otro usuario si manipula el parámetro user_id.

Cómo corregir el código vulnerable

Para corregir la vulnerabilidad IDOR, debemos actualizar el endpoint /users/{user_id} e incorporar verificaciones adecuadas de control de acceso. 

Simulemos un usuario autenticado y permitamos el acceso solo si el user_id de la URL coincide con el ID del usuario autenticado. Para esta demostración, supongamos que el usuario autenticado tiene el ID 1. Este es el código actualizado:

@app.get("/users/{user_id}")
async def get_secure_user(user_id: int, db: Session = Depends(get_db)):
    # Assume user authentication and authorization are performed here
    authenticated_user_id = "hbecec-edeek-wxwexe-cdcece" # better to use UUIDs

    if authenticated_user_id != user_id:
        raise HTTPException(status_code=403, detail="Not authorized to access this user")

    user = db.query(User).filter(User.id == user_id).first()
    if user is None:
        raise HTTPException(status_code=404, detail="User not found")
    return user

En este bloque de código, agregamos una verificación de control de acceso que compara el user_id de la URL con el authenticated_user_id. La aplicación genera un error HTTP 403 Forbidden si los ID no coinciden. Este error impide que los usuarios no autorizados accedan a la información de otros usuarios y corrige la vulnerabilidad IDOR.

Cómo detectar y corregir problemas de seguridad con Snyk

Snyk es una solución de seguridad con funciones de análisis de composición de software (SCA) y pruebas de seguridad de aplicaciones estáticas (SAST). Usemos Snyk para encontrar y corregir problemas de seguridad en nuestra aplicación FastAPI. 

Instalar y autenticar Snyk CLI

Para comenzar, instala Snyk CLI en tu máquina siguiendo la guía de instalación de la documentación.

Después de instalar la CLI, debes autenticar tu cuenta de Snyk. Ejecuta el comando snyk auth en la terminal. Se abrirá una ventana del navegador donde podrás iniciar sesión con tu cuenta de GitHub o Google.

Analizar las dependencias en busca de vulnerabilidades

Para analizar el proyecto en busca de vulnerabilidades en bibliotecas de terceros, necesitamos un archivo requirements.txt. Crea requirements.txt con el siguiente comando:

pip freeze > requirements.txt

A continuación, analiza las dependencias del proyecto en busca de vulnerabilidades ejecutando el siguiente comando en la terminal:

snyk test --file=requirements.txt --skip-unresolved

Este comando analiza tus dependencias, identifica y describe las vulnerabilidades, detalla su gravedad y ofrece orientación para corregirlas. Por ejemplo, podrías encontrar una vulnerabilidad de denegación de servicio (DoS) de gravedad media en starlette@0.14.2.

Nota: Snyk no puede analizar el proyecto si falta un paquete requerido. La opción –skip-unresolved anula este comportamiento.

Cómo corregir vulnerabilidades con Snyk

Snyk también puede ayudarte a corregir vulnerabilidades. El comando snyk fix puede solucionar automáticamente algunos de los problemas detectados. Snyk actualizará o aplicará parches a las dependencias afectadas para que sean versiones seguras y mantendrá tus aplicaciones actualizadas y protegidas.

Usar Snyk Code para el análisis estático del código

Snyk también cuenta con una potente solución de pruebas de seguridad de aplicaciones estáticas (SAST). El comando snyk code puede analizar el código de tu aplicación, identificar problemas de seguridad y proporcionar información detallada sobre cómo corregirlos.

Para usar snyk code, ejecuta el siguiente comando en la terminal:

snyk code test

Snyk Code realizará un análisis profundo de tu base de código y destacará las vulnerabilidades de seguridad que encuentre. También ofrece recomendaciones para corregirlas, lo que te ayuda a mantener una aplicación segura y confiable.

Explicación de las vulnerabilidades IDOR

Como desarrolladores, debemos asegurarnos de que nuestras aplicaciones sean seguras. Las vulnerabilidades IDOR amenazan las aplicaciones web, por lo que debemos aprender a encontrarlas y corregirlas. Si comprendes bien las vulnerabilidades IDOR, podrás crear aplicaciones de Python eficientes y seguras. 

En este tutorial, aprendiste a encontrar y corregir vulnerabilidades IDOR en una aplicación de Python. También vimos cómo Snyk puede ayudarte a identificar y solucionar riesgos de seguridad en las dependencias de tu proyecto y en el código de la aplicación. Snyk es una potente herramienta de seguridad; integrarla en tu rutina de desarrollo agrega una capa adicional de protección para mantener tu código sólido.

Conoce mejor lo que Snyk ofrece con una prueba gratuita.

Empieza con Capture the Flag

Aprende a resolver desafíos de Capture the Flag viendo nuestro taller virtual introductorio a pedido.

Leer más

Blog

Los modelos de frontera encontraron las vulnerabilidades. Solo el atacante encontró las cadenas.

El análisis estático encontró las fallas, pero solo las pruebas de ataque en vivo demostraron cómo podían encadenarse para provocar brechas. Una comparación de Evo COS, Claude Security y Claude Code Security.

feature insights context
Blog

Los ataques autónomos ya están aquí. La defensa debe estar a su altura.

Los atacantes autónomos están reduciendo el tiempo disponible para defenderse. Descubre cómo el descubrimiento, la corrección, la validación y la prevención continuos pueden ayudar a los equipos de seguridad a seguirles el ritmo.

Blog

Por qué los agentes de programación con IA siguen generando fallas de control de acceso

Los agentes de programación con IA pueden generar lógica de autorización que compila y supera la revisión, pero expone los datos de un inquilino a otro. Descubre por qué es difícil detectar el control de acceso roto y cómo prevenirlo.