Red Hot Cyber

La cybersecurity è condivisione.
Riconosci il rischio, combattilo, condividi le tue esperienze ed 
incentiva gli altri a fare meglio di te.

Cerca
Crowdstrike

A01 OWASP Broken Access Control: Sicurezza e Gestione degli Accessi

Alessandro Molinari : 25 Giugno 2024 08:00

Il Broken Access Control è la principale vulnerabilità nella sicurezza delle applicazioni web secondo l’OWASP Top 10 del 2021. Questa vulnerabilità si verifica quando le restrizioni su quali utenti possono vedere o usare le risorse non sono correttamente applicate, rendendo possibile a malintenzionati accedere, modificare, o distruggere dati a cui non dovrebbero avere accesso. Questo tipo di controllo è fondamentale per garantire che solo utenti autorizzati possano accedere a determinate funzioni o dati sensibili.

Un esempio comune di Broken Access Control è la manipolazione di metadati come un JSON Web Token (JWT) o i cookie per elevare i privilegi dell’utente. Queste manipolazioni possono consentire l’accesso non autorizzato a dati o funzionalità critiche. Configurazioni scorrette di CORS possono permettere accessi API da origini non autorizzate, esponendo ulteriormente le applicazioni a rischi di sicurezza.

Per prevenire il Broken Access Control, è essenziale adottare strategie di mitigazione come il principio del deny by default, che nega l’accesso a tutto se non specificamente consentito. È anche importante disabilitare la lista delle directory del server web e assicurarsi che i file metadati e di backup non siano presenti nelle root del web. Monitorare e limitare i fallimenti nei controlli di accesso può aiutare a minimizzare il danno causato dagli attacchi automatizzati.

In poche parole:

  • Il Broken Access Control è la principale vulnerabilità nella sicurezza delle applicazioni web.
  • Manipolazioni di JWT e configurazioni scorrette di CORS sono esempi comuni di abuso.
  • Strategie di mitigazione includono deny by default e monitoraggio dei controlli di accesso.

Comprensione del Broken Access Control

Definizione e Significato

Il Broken Access Control si verifica quando un’applicazione non gestisce correttamente le autorizzazioni degli utenti. Ciò può permettere a utenti non autorizzati di accedere a funzionalità o dati riservati. Questo sbaglio può verificarsi in diversi modi, tra cui la manipolazione dei metadati come JSON Web Token (JWT), la modifica degli URL, e l’uso improprio delle configurazioni CORS.

Ad esempio, un utente malevolo potrebbe manipolare un cookie o un campo nascosto per elevare i suoi privilegi. Le applicazioni devono implementare controlli di accesso rigorosi per prevenire tale abuso.

Rilevazione e Identificazione di Vulnerabilità

Rilevare le vulnerabilità di broken access control richiede un’analisi approfondita. Gli strumenti di test automatizzati possono essere utili, ma verifiche manuali da parte di esperti di sicurezza sono spesso necessarie. Controllare le autorizzazioni dopo l’autenticazione è cruciale per garantire che solo gli utenti autorizzati possano accedere a certe funzioni.

Analisti della sicurezza cercano segnali di manipolazione dei parametri, modifiche degli URL, e accessi non autorizzati tramite richieste API. Questi test devono coprire tutti i metodi HTTP, inclusi POST, PUT e DELETE, per identificare correttamente i potenziali punti deboli.

Esempi Comuni

Un esempio comune di broken access control è il bypass dei controlli di accesso tramite manipolazione dell’URL. Un utente potrebbe cambiare l’ID in un URL per accedere a informazioni che non dovrebbe vedere. In siti mal configurati, la mancata verifica sui permessi degli utenti permette a chiunque di modificare o eliminare dati sensibili.

Un’altra pratica pericolosa è la configurazione errata di CORS, che permette accessi API da origini non autorizzate. Questo scenario può esporre dati critici a terzi non attendibili. Implementare politiche di sicurezza robuste è essenziale per proteggere le applicazioni contro tali minacce.

Nel complesso, prevenire il broken access control richiede una combinazione di controlli di sicurezza stretti e una verifica continua delle autorizzazioni utente.

Impatto ed abuso del controll degli accessi

Conseguenze di Accesso Non Autorizzato

L’accesso non autorizzato a informazioni sensibili può causare furto di dati. Quando gli attaccanti ottengono dati personali o aziendali, possono utilizzarli per scopi malevoli, come il furto di identità o il ricatto.

Perdita di fiducia è un’altra conseguenza. Se i clienti scoprono che i loro dati non sono sicuri, possono decidere di non utilizzare più il servizio. Questo può portare a una perdita significativa per l’azienda.

La compromissione della sicurezza delle applicazioni può anche portare a ulteriori exploit da altri attaccanti, aumentando il rischio complessivo per l’organizzazione.

Metodi di Sfruttamento

Gli attaccanti utilizzano vari metodi per abusare del controllo di accesso. Un metodo comune è modificare l’URL o i parametri per bypassare i controlli di accesso. Questo può essere realizzato facilmente attraverso la manipolazione diretta dell’URL nel browser.

Un altro metodo è l’uso di strumenti di attacco API. Gli attaccanti possono inviare richieste con metodi HTTP come POST, PUT e DELETE senza le corrette verifiche di autorizzazione. Questo permette loro di eseguire azioni privilegiate senza autorizzazione.

Modifiche allo stato dell’applicazione sono utilizzate per aggirare i controlli di accesso interni, permettendo agli attaccanti di ottenere accesso non autorizzato.

Casi noti

Uno studio di caso noto è l’attacco a un’applicazione bancaria che ha condotto a una violazione dei dati. Gli attaccanti sono stati in grado di modificare i parametri dell’URL, accedendo ai conti bancari di altri utenti e trasferendo denaro senza autorizzazione.

Un’altra situazione riguarda un’applicazione di e-commerce. Gli attaccanti hanno usato strumenti di attacco API per modificare ordini e prezzi, causando perdite finanziarie all’azienda.

Un esempio comune è anche l’accesso non autorizzato a sistemi aziendali interni, dove gli attaccanti compromettono le credenziali e accedono a documenti riservati, mettendo a rischio la sicurezza dell’intera organizzazione.

Strategie di Mitigazione e Principi Fondamentali

Per affrontare il problema del Broken Access Control, è essenziale implementare strategie di mitigazione efficaci che comprendano i principi di sicurezza del controllo di accesso, le migliori pratiche di sviluppo e implementazione, e l’uso di strumenti e tecniche di test.

Principi di Sicurezza del Controllo di Accesso

Nel controllo di accesso, il principio del minimum privilege richiede che gli utenti abbiano solo i permessi necessari per svolgere le loro attività. Questo riduce i rischi se vengono compromessi.

La politica deny by default implica che gli accessi siano vietati, a meno che non siano esplicitamente consentiti. Ogni accesso deve essere verificato e approvato.

Le liste di controllo degli accessi (ACL) e i modelli di controllo di accesso come il Role-Based Access Control (RBAC), sono utili per segmentare i permessi in modo accurato e gestibile, garantendo che solo utenti specifici possano accedere a risorse particolari.

Esempio pratico di Broken Access Control

Immaginiamo di avere una piccola applicazione web dove ci sono due pagine principali: una pagina utente normale e una pagina di amministrazione. La pagina di amministrazione dovrebbe essere accessibile solo agli amministratori, ma a causa di un errore di controllo degli accessi, qualsiasi utente autenticato può accedervi.

Esempio di codice

  1. Applicazione Web con Flask (Python)
pythonCopy codefrom flask import Flask, request, redirect, url_for, render_template, session

app = Flask(__name__)
app.secret_key = 'supersecretkey'

# Simuliamo un database di utenti
users = {
    'admin': {'password': 'adminpass', 'role': 'admin'},
    'user1': {'password': 'user1pass', 'role': 'user'}
}

@app.route('/')
def home():
    if 'username' in session:
        return f"Ciao {session['username']}!
Vai alla pagina di amministrazione
Logout" return "Ciao!
Login" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users and users[username]['password'] == password: session['username'] = username session['role'] = users[username]['role'] return redirect(url_for('home')) return 'Credenziali non valide' return render_template('login.html') @app.route('/admin') def admin(): # Problema di Broken Access Control: non controlliamo se l'utente è un admin if 'username' in session: return f"Pagina di Amministrazione - Solo per admin.
Ciao {session['username']}!
Logout" return redirect(url_for('login')) @app.route('/logout') def logout(): session.pop('username', None) session.pop('role', None) return redirect(url_for('home')) if __name__ == '__main__': app.run(debug=True)
  1. Pagina di login (login.html)
htmlCopy code

  
    Login
  
  
    

Login





Descrizione del problema

Il problema qui è che chiunque si logga può accedere alla pagina /admin, anche se non è un amministratore. Non c’è nessun controllo per verificare se l’utente ha il ruolo di admin.

Come risolvere il problema

Per risolvere il problema di Broken Access Control, dobbiamo aggiungere un controllo nella funzione admin per assicurarci che solo gli amministratori possano accedere a quella pagina:

pythonCopy code@app.route('/admin')
def admin():
    if 'username' in session and session.get('role') == 'admin':
        return f"Pagina di Amministrazione - Solo per admin.
Ciao {session['username']}!
Logout" return redirect(url_for('login'))

Dettagli tecnici

  1. Controllo della sessione: La funzione admin verifica se c’è una sessione attiva controllando 'username' in session.
  2. Verifica del ruolo: La funzione aggiunge una condizione per verificare se il ruolo dell’utente (session.get('role')) è 'admin'. Solo se entrambe le condizioni sono vere, l’utente può accedere alla pagina di amministrazione.

Questa modifica garantisce che solo gli utenti con il ruolo di amministratore possano accedere alla pagina di amministrazione, risolvendo così il problema di Broken Access Control.

Migliori Pratiche di Sviluppo e Implementazione

Durante lo sviluppo, è essenziale riutilizzare i meccanismi di controllo di accesso standardizzati in tutta l’applicazione, invece di crearli separatamente per ogni funzionalità. Questo riduce la possibilità di errori.

Implementare modelli di controllo che rafforzano la proprietà dei record, assicurando che solo i proprietari possano eseguire azioni complesse sui propri dati. Inserire session handling efficace, invalidando sessioni al logout.

Il rate limiting sugli accessi ai controlli API è un’altra strategia per limitare i danni causati da attacchi automatizzati, come menzionato su OWASP.

Strumenti e Tecniche di Test

Il codice deve essere sottoposto a revisione frequente per rilevare eventuali vulnerabilità nel controllo di accesso. Il OWASP Testing Guide fornisce linee guida dettagliate su come condurre questi test.

Usare strumenti di test automatici aiuta a identificare punti deboli e garantisce che i controlli di accesso siano correttamente implementati. Per esempio, strumenti come Burp Suite e OWASP ZAP sono molto apprezzati per testare le vulnerabilità di sicurezza.

P

Codice di esempio di Broken Access Control

Immagina di avere una piccola applicazione web dove ci sono due pagine principali: una pagina utente normale e una pagina di amministrazione. La pagina di amministrazione dovrebbe essere accessibile solo agli amministratori, ma a causa di un errore di controllo degli accessi, qualsiasi utente autenticato può accedervi.

Esempio di codice

  1. Applicazione Web con Flask (Python)
pythonCopy codefrom flask import Flask, request, redirect, url_for, render_template, session

app = Flask(__name__)
app.secret_key = 'supersecretkey'

# Simuliamo un database di utenti
users = {
    'admin': {'password': 'adminpass', 'role': 'admin'},
    'user1': {'password': 'user1pass', 'role': 'user'}
}

@app.route('/')
def home():
    if 'username' in session:
        return f"Ciao {session['username']}!
Vai alla pagina di amministrazione
Logout" return "Ciao!
Login" @app.route('/login', methods=['GET', 'POST']) def login(): if request.method == 'POST': username = request.form['username'] password = request.form['password'] if username in users and users[username]['password'] == password: session['username'] = username session['role'] = users[username]['role'] return redirect(url_for('home')) return 'Credenziali non valide' return render_template('login.html') @app.route('/admin') def admin(): # Problema di Broken Access Control: non controlliamo se l'utente è un admin if 'username' in session: return f"Pagina di Amministrazione - Solo per admin.
Ciao {session['username']}!
Logout" return redirect(url_for('login')) @app.route('/logout') def logout(): session.pop('username', None) session.pop('role', None) return redirect(url_for('home')) if __name__ == '__main__': app.run(debug=True)
  1. Pagina di login (login.html)
htmlCopy code

  
    Login
  
  
    

Login





Descrizione del problema

Il problema qui è che chiunque si logga può accedere alla pagina /admin, anche se non è un amministratore. Non c’è nessun controllo per verificare se l’utente ha il ruolo di admin.

Come risolvere il problema

Per risolvere il problema di Broken Access Control, dobbiamo aggiungere un controllo nella funzione admin per assicurarci che solo gli amministratori possano accedere a quella pagina:

pythonCopy code@app.route('/admin')
def admin():
    if 'username' in session and session.get('role') == 'admin':
        return f"Pagina di Amministrazione - Solo per admin.
Ciao {session['username']}!
Logout" return redirect(url_for('login'))

Dettagli tecnici

  1. Controllo della sessione: La funzione admin verifica se c’è una sessione attiva controllando 'username' in session.
  2. Verifica del ruolo: La funzione aggiunge una condizione per verificare se il ruolo dell’utente (session.get('role')) è 'admin'. Solo se entrambe le condizioni sono vere, l’utente può accedere alla pagina di amministrazione.

Questa modifica garantisce che solo gli utenti con il ruolo di amministratore possano accedere alla pagina di amministrazione, risolvendo così il problema di Broken Access Control.

Penetratio tests periodici sono cruciali per simulare attacchi reali e vedere come il sistema resiste agli stessi. Questi test devono essere eseguiti da esperti per massimizzare la loro efficacia.

Alessandro Molinari
Direttore di Crociera per 6 mesi all'anno, parla Italiano, Inglese, Tedesco, Francese, Spagnolo, Portoghese, Russo e sta attualmente studiando Giapponese. Detiene Comptia A+ , Network + , Security + e per ora sta studiando per Pentest + e CySa +. Nel tempo libero fa sport e legge/ascolta libri dai 60 ai 120 minuti al giorno. Sostiene che con grandi poteri arrivino grandi responsabilitá, come quelle di educare chi ha difficoltà a navigare il mondo digitale ed eventualmente difenderlo/a dai “pirati” e dalle entità che danneggiano il pianeta e la libertà delle persone. Sostiene inoltre che il futuro naturale della vita biologica sia la fusione ed integrazione con il digitale, transizione che tra l'altro è già iniziata con il movimento del transumanesimo del quale é sostenitore.