In this article
Cómo prevenir el control de acceso roto en aplicaciones Python Flask
Algunas vulnerabilidades de seguridad se detectan fácilmente con herramientas de análisis estático, como Snyk, pero otras son problemas de lógica que pueden ser intencionales o accidentales. El control de acceso roto es uno de esos problemas y, si programas aplicaciones Python Flask para aplicaciones empresariales modernas similares a SaaS, esta vulnerabilidad sin duda te concierne.
El control de acceso es un aspecto fundamental de la seguridad de las aplicaciones. Garantiza que los usuarios solo puedan acceder a sus propios recursos o a aquellos para los que tienen permiso, y a nada más. Cuando los mecanismos de control de acceso en las aplicaciones Python son débiles o se implementan de forma incorrecta en la lógica de negocio, actores maliciosos pueden explotarlos para obtener acceso no autorizado, lo que provoca brechas de seguridad graves y aumenta los riesgos.
Para empezar, repasemos algunos términos de seguridad y entendamos mejor qué es el control de acceso roto desde una perspectiva de seguridad.
¿Qué es una falla en el control de acceso?
El control de acceso roto es una vulnerabilidad crítica de seguridad que ocurre cuando una aplicación no aplica restricciones (controles de autorización) sobre lo que pueden hacer los usuarios autenticados. Esta vulnerabilidad ocupa el primer lugar entre los riesgos de seguridad de OWASP Top 10 de 2021. Esta falla permite que los atacantes accedan a recursos no autorizados o realicen acciones fuera de los permisos previstos, como modificar, crear o eliminar registros.
Muy recomendado: ¡toma ahora en tu navegador la lección breve de Snyk sobre el control de acceso roto, gratis!
Ejemplo de control de acceso roto en una aplicación Python Flask
En esta sección se presenta un ejemplo común de control de acceso roto en una aplicación Python Flask. El fragmento de código muestra una vulnerabilidad causada por controles de acceso insuficientes en el código Python. En este ejemplo, las verificaciones de autorización no solo son insuficientes: no existen en absoluto. Si esta aplicación Python se implementara con acceso público, incluso los usuarios autenticados podrían explotar este tipo de vulnerabilidad para realizar acciones o acceder a datos sin autorización.
Código de ejemplo: una aplicación Python Flask vulnerable
A continuación, se muestra el código de una aplicación Flask sencilla en Python que contiene una vulnerabilidad de control de acceso roto:
from flask import Flask, render_template, request, redirect, url_for
app = Flask(__name__)
# Service to handle user account information
class AccountManager:
def retrieve_account_details(self, account_identifier):
"""Fetches the account details based on the provided identifier."""
# Database interaction to retrieve account data
pass
def save_account_changes(self, modified_account):
"""Persists the updated account information to the database."""
# Database interaction to update account data
pass
account_manager = AccountManager()
def is_user_logged_in():
"""Determines if a user is currently authenticated."""
# Logic to check user authentication status
return True # Replace with actual authentication check
@app.route('/update-account', methods=['POST'])
def update_account():
"""Handles the submission of updated account information."""
if not is_user_logged_in():
return redirect(url_for('login'))
account_name = request.form.get('username')
account_record = account_manager.retrieve_account_details(account_name)
if account_record.get_username() == account_name:
account_manager.save_account_changes(account_record)
return redirect(url_for('/user'))
@app.route('/user')
def user_home():
"""Displays the user's dashboard."""
return render_template('dashboard.html')
if __name__ == '__main__':
app.run(debug=False)Análisis de las vulnerabilidades en el código
La vulnerabilidad de autorización por uso indebido en este código Python se debe a la falta de verificaciones adecuadas de control de acceso al actualizar un perfil de usuario. La función `update-account` obtiene el nombre de usuario de los datos del formulario (mediante el campo `username`) y recupera el perfil correspondiente. Luego, comprueba que el nombre de usuario del formulario coincida con el del perfil recuperado antes de actualizarlo.
Sin embargo, esta comprobación no basta para garantizar que quien realiza la solicitud sea realmente el usuario autorizado para actualizar el perfil. Un atacante podría manipular los datos del formulario para especificar otro nombre de usuario y así obtener acceso no autorizado para actualizar el perfil de otra persona.
Para corregir esta vulnerabilidad, la aplicación debe implementar medidas de control de acceso más estrictas. Por ejemplo, debe verificar que quien realiza la solicitud sea el propietario del perfil que se va a actualizar. Esto se puede lograr asociando la sesión del usuario con el perfil y asegurándose de que solo el usuario autenticado pueda actualizar su propio perfil.
Vulnerabilidades comunes asociadas con el control de acceso roto
Como vimos, es fácil pasar por alto un error de autorización porque, en su mayoría, se trata de un problema de lógica. ¿Todos deberían poder ver o cambiar los datos de los demás, o se trata de un error? ¿En qué nivel debería aplicarse este control? Quizás la seguridad a nivel de filas en la base de datos ya proteja contra esto.
Veamos otras vulnerabilidades con un gran radio de impacto y riesgos de seguridad que se producen por el control de acceso roto:
Referencias directas inseguras a objetos (IDOR): Ocurren cuando una aplicación expone una referencia a un objeto de implementación interna, como un archivo o una clave de base de datos (por ejemplo, la clave primaria `id` de una tabla), sin las verificaciones de control de acceso adecuadas. Los atacantes pueden manipular estas referencias para acceder directamente a datos no autorizados, ya que pueden adivinar fácilmente el identificador.
Falta de control de acceso a nivel de función: Esta vulnerabilidad se produce cuando una aplicación no aplica controles de acceso a nivel de función o método, lo que permite que usuarios no autorizados ejecuten acciones restringidas.
Escalamiento de privilegios: Ocurre cuando un atacante obtiene permisos de nivel superior a los previstos, a menudo al explotar fallas en la lógica de control de acceso. Por ejemplo, si el atacante puede modificar las credenciales o el correo electrónico del usuario administrador, puede escalar el acceso de su propia cuenta a la cuenta de administrador y obtener mayores privilegios en el sistema vulnerable.
Falsificación de solicitudes entre sitios (CSRF): Aunque no es estrictamente un problema de control de acceso, la CSRF puede realizar acciones no autorizadas en nombre de un usuario autenticado.
Impacto del control de acceso roto en la seguridad de las aplicaciones
El impacto del control de acceso roto en la seguridad de las aplicaciones, en particular las aplicaciones Python Flask, puede ser devastador. El acceso no autorizado a datos sensibles puede provocar brechas, vulnerar la privacidad de los usuarios e incumplir requisitos normativos. Como muestran los ejemplos anteriores, los atacantes también pueden manipular o eliminar datos, interrumpir el funcionamiento de la aplicación e incluso tomar el control de toda su infraestructura.
Comprender y mitigar las vulnerabilidades de control de acceso roto es fundamental para que los desarrolladores mantengan la seguridad y la integridad de sus aplicaciones. Implementar mecanismos sólidos de control de acceso, realizar pruebas de seguridad exhaustivas y usar herramientas como Snyk Code para detectar patrones de código inseguro puede ayudar a identificar y corregir estas vulnerabilidades antes de que los actores maliciosos las exploten.
Próximos pasos para prevenir fallas en el control de acceso
Para obtener más información sobre cómo prevenir el control de acceso roto, consulta las pautas de OWASP y considera usar herramientas como Snyk Code para identificar y corregir vulnerabilidades de seguridad en tu código. Puedes registrarte en Snyk. ¡Es gratis!
Estos son algunos recursos educativos recomendados para prevenir el control de acceso roto y capacitar a tu equipo de desarrollo para protegerse contra el acceso no autorizado:
Explora la ruta de aprendizaje de Snyk Learn sobre OWASP Top 10, que comienza con un programa interactivo sobre el control de acceso roto, con información y prácticas recomendadas.
Los usuarios de JavaScript y Node.js pueden consultar la guía sobre cómo prevenir el control de acceso roto en aplicaciones Express de Node.js.
Si te preocupa la autenticación y la autorización, lo más probable es que estés creando backends relacionados con API. En ese caso, consulta los 10 principales riesgos de seguridad de API de OWASP.
Mejora tus habilidades de programación segura
Capacitación gratuita y de alta calidad en seguridad para desarrolladores, cuando y donde quieras.