Alessandro : 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.
Acquista il corso Dark Web & Cyber Threat Intelligence (e-learning version)
Il Dark Web e la Cyber Threat Intelligence rappresentano aree critiche per comprendere le minacce informatiche moderne. Tra ransomware, data breach e attività illecite, le organizzazioni devono affrontare sfide sempre più complesse per proteggere i propri dati e le infrastrutture. Il nostro corso “Dark Web & Cyber Threat Intelligence” ti guiderà attraverso i meccanismi e le strategie utilizzate dai criminali informatici, fornendoti competenze pratiche per monitorare, analizzare e anticipare le minacce.
Accedi alla pagina del corso condotto dall'Prof. Pietro Melillo sulla nostra Academy e segui l'anteprima gratuita.
Per un periodo limitato, potrai utilizzare il COUPON CTI-16253 che ti darà diritto ad uno sconto del 20% sul prezzo di copertina del corso
Per ulteriori informazioni, scrivici ad [email protected] oppure scrivici su Whatsapp al 379 163 8765
Supporta RHC attraverso:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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)
htmlCopy code
Login
Login
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.
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'))
admin
verifica se c’è una sessione attiva controllando 'username' in session
.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.
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.
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
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.
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)
htmlCopy code
Login
Login
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.
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'))
admin
verifica se c’è una sessione attiva controllando 'username' in session
.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.