Filtraggio automatico delle chiamate di sistema per la sicurezza dei server
Un nuovo sistema migliora la sicurezza filtrando le chiamate di sistema non necessarie nelle applicazioni server.
― 6 leggere min
Indice
Le applicazioni server comunicano col sistema operativo tramite Chiamate di Sistema, che sono richieste all'OS per svolgere compiti. Col tempo, il numero di queste chiamate è aumentato, dato che le applicazioni sono diventate più complesse. Questa crescita porta a rischi per la Sicurezza, dato che applicazioni senza privilegi possono sfruttare vulnerabilità in queste chiamate.
Per combattere questi rischi, alcune strategie mirano a limitare il numero di chiamate di sistema che un'applicazione può usare in base alle sue esigenze. Restriggendo chiamate inutili, possiamo ridurre le possibilità di attacchi al kernel e migliorare la sicurezza complessiva.
Questo documento introduce un sistema di Filtraggio automatico progettato per le applicazioni server. A differenza dei metodi precedenti, questo sistema funziona senza bisogno di accedere al codice sorgente dell'applicazione, il che significa che può operare su binari compilati. Questo è cruciale per migliorare la sicurezza del server senza dover modificare il codice sorgente originale dell'applicazione.
Il Problema con le Chiamate di Sistema
Ogni applicazione ha bisogno di varie chiamate di sistema per funzionare correttamente. Tuttavia, molte di queste chiamate diventano superflue dopo che l'applicazione è partita. Ad esempio, un server web potrebbe necessitare di un diverso set di permessi una volta che inizia a gestire le richieste dei clienti rispetto a quando sta avviandosi.
Le soluzioni attuali spesso si basano sulla conoscenza di come categorizzare queste chiamate in fasi: inizializzazione e servizio. Tuttavia, questi metodi richiedono spesso l'accesso al codice sorgente dell'applicazione, che non è sempre disponibile. Questa realtà ne limita l'efficacia.
Inoltre, i metodi esistenti solitamente richiedono che un utente identifichi manualmente quando l'applicazione passa da una fase all'altra. Questo processo può essere soggetto a errori, portando a una comprensione incompleta di quali chiamate dovrebbero essere autorizzate in un dato momento.
Il Nostro Approccio
Presentiamo un nuovo sistema che automatizza l'identificazione delle fasi di un'applicazione server senza bisogno di accesso al codice sorgente. La nostra soluzione combina Analisi Statica e dinamica per determinare quali chiamate di sistema sono necessarie durante la fase di servizio dell'applicazione.
Tecniche Chiave
Identificazione delle Fasi: Il nostro sistema rileva automaticamente la fase di servizio dell'applicazione osservando dinamicamente i suoi schemi di esecuzione. Cerchiamo strutture di loop specifiche che indicano dove avviene il lavoro principale dell'applicazione.
Analisi Statica: Analizziamo il codice binario per creare un grafo di chiamata di funzioni. Questo grafo ci aiuta a identificare come interagiscono le diverse funzioni e quali chiamate di sistema potrebbero invocare.
Analisi Dinamica: Mentre la nostra analisi statica ci fornisce un buon punto di partenza, osserviamo anche le esecuzioni reali dell'applicazione. Questo ci fornisce dati in tempo reale su quali chiamate stiano venendo effettuate durante la fase di servizio.
Filtraggio Automatico: Una volta raccolti sufficienti dati, creiamo un filtro che assicura che solo le chiamate di sistema necessarie siano autorizzate durante la fase di servizio. Questo aiuta a prevenire potenziali sfruttamenti limitando le capacità di qualsiasi applicazione compromessa.
Valutazione
Abbiamo testato il nostro sistema di filtraggio usando applicazioni server popolari su x86-64 Linux. Attraverso vari esperimenti, abbiamo dimostrato che il nostro sistema identifica efficacemente le fasi di servizio, genera filtri per le chiamate di sistema accurati e riduce la superficie di attacco per ogni applicazione.
Risultati
I nostri risultati hanno mostrato che:
- Il nostro sistema supera i precedenti metodi basati solo su binari.
- Otteniamo risultati comparabili ai metodi che si basano sul codice sorgente.
- Il nostro filtro consente circa l'8,33% in più di chiamate di sistema rispetto alle soluzioni basate su codice sorgente, filtrando però chiamate critiche per la sicurezza nell'88,23% dei casi.
Riduzione della Superficie di Attacco
I miglioramenti nella sicurezza sono stati evidenti nei nostri test. Abbiamo valutato quante vulnerabilità del kernel conosciute potrebbero essere sfruttate senza il nostro filtraggio in atto. I risultati hanno confermato che il nostro filtraggio riduce significativamente il rischio bloccando potenziali attacchi.
Gestione delle Librerie Dinamiche
Un'altra sfida nel filtraggio è gestire le librerie caricate dinamicamente. Molte applicazioni caricano componenti aggiuntivi a runtime, che possono richiedere le loro chiamate di sistema. Il nostro sistema identifica con successo queste librerie e risolve le loro dipendenze, assicurando che tutte le chiamate necessarie siano considerate.
Importanza delle Librerie Dinamiche
Le librerie dinamiche aggiungono flessibilità alle applicazioni ma complicano la sicurezza. Se queste librerie non sono adeguatamente filtrate, possono portare a vulnerabilità.
La Nostra Soluzione
Il nostro approccio incorpora sia analisi statica per prevedere quali librerie potrebbero essere caricate, sia analisi dinamica per tracciare le chiamate effettive fatte durante l'esecuzione. Questo approccio ibrido ci consente di filtrare efficacemente le chiamate necessarie.
Metodologia di Filtraggio delle Chiamate di Sistema
Il nostro metodo prevede diversi passaggi per garantire l'accuratezza nel filtraggio delle chiamate di sistema.
1. Costruzione del Grafo di Chiamata di Funzioni
Iniziamo costruendo un grafo di chiamata di funzioni per l'applicazione. Questo grafo rappresenta come diverse funzioni sono connesse e quali chiamate potrebbero effettuare.
2. Identificazione delle Chiamate di Sistema Raggiungibili
Successivamente, determiniamo quali chiamate di sistema sono raggiungibili dal punto di transizione identificato in precedenza. Questo comporta il tracciamento di tutti i potenziali percorsi nel grafo di chiamata di funzioni per vedere quali chiamate possono essere fatte.
3. Generazione del Filtro
Infine, utilizzando le informazioni raccolte, generiamo un filtro che specifica quali chiamate di sistema sono autorizzate durante la fase di servizio. Questo filtro viene poi implementato nell'applicazione per assicurarsi che utilizzi solo le chiamate necessarie.
Valutazione della Sicurezza
Abbiamo condotto una valutazione approfondita della sicurezza del nostro sistema di filtraggio testandolo contro vulnerabilità e metodi di attacco noti.
Blocco degli Sfruttamenti
Nei nostri test, il nostro sistema ha bloccato con successo una percentuale significativa di tentativi di sfruttamento filtrando le chiamate di sistema critiche.
Mitigazione delle Vulnerabilità
Abbiamo anche esaminato quanto bene il nostro filtraggio aiuti a mitigare le vulnerabilità del kernel. I risultati hanno indicato un miglioramento netto della sicurezza, con il nostro sistema che impedisce sfruttamenti che potrebbero avvalersi di chiamate di sistema non filtrate.
Conclusione
La nostra soluzione di filtraggio automatico delle chiamate di sistema rappresenta un significativo passo avanti nella sicurezza delle applicazioni server. Eliminando chiamate di sistema inutili durante la fase di servizio e gestendo correttamente le librerie caricate dinamicamente, forniamo una robusta difesa contro potenziali attacchi.
Questo approccio non solo migliora la sicurezza, ma semplifica anche il processo di affinamento delle autorizzazioni dell'applicazione, rendendo più facile per gli sviluppatori proteggere il loro software senza dover alterare il codice originale.
I nostri risultati sottolineano il potenziale dei sistemi di filtraggio automatico nella sicurezza delle applicazioni server, mentre pongono le basi per futuri miglioramenti in quest'area critica.
Titolo: SYSPART: Automated Temporal System Call Filtering for Binaries
Estratto: Restricting the system calls available to applications reduces the attack surface of the kernel and limits the functionality available to compromised applications. Recent approaches automatically identify the system calls required by programs to block unneeded ones. For servers, they even consider different phases of execution to tighten restrictions after initialization completes. However, they require access to the source code for applications and libraries, depend on users identifying when the server transitions from initialization to serving clients, or do not account for dynamically-loaded libraries. This paper introduces SYSPART, an automatic system-call filtering system designed for binary-only server programs that addresses the above limitations. Using a novel algorithm that combines static and dynamic analysis, SYSPART identifies the serving phases of all working threads of a server. Static analysis is used to compute the system calls required during the various serving phases in a sound manner, and dynamic observations are only used to complement static resolution of dynamically-loaded libraries when necessary. We evaluated SYSPART using six popular servers on x86-64 Linux to demonstrate its effectiveness in automatically identifying serving phases, generating accurate system-call filters, and mitigating attacks. Our results show that SYSPART outperforms prior binary-only approaches and performs comparably to source-code approaches.
Autori: Vidya Lakshmi Rajagopalan, Konstantinos Kleftogiorgos, Enes Göktaş, Jun Xu, Georgios Portokalidis
Ultimo aggiornamento: 2023-09-27 00:00:00
Lingua: English
URL di origine: https://arxiv.org/abs/2309.05169
Fonte PDF: https://arxiv.org/pdf/2309.05169
Licenza: https://creativecommons.org/licenses/by/4.0/
Modifiche: Questa sintesi è stata creata con l'assistenza di AI e potrebbe presentare delle imprecisioni. Per informazioni accurate, consultare i documenti originali collegati qui.
Si ringrazia arxiv per l'utilizzo della sua interoperabilità ad accesso aperto.