Prevenire exploit come ROP e Return-to-libc nei moderni sistemi operativi

1

Mentre leggevo degli exploit avanzati come Return Oriented Programming (ROP) , Retun-to-libc , ecc., mi sono imbattuto in molte difese a questi attacchi che includono tecniche come ASLR , kBouncer , ROP Defender , ecc. Ma quando sono entrato nei dettagli di ciascuna di queste tecniche, ho scoperto che ciascuna di queste difese può essere superata apportando alcune modifiche al nostro approccio.

Sono molto curioso di sapere come in realtà i sistemi operativi moderni si stanno prendendo cura di questo tipo di exploit avanzati. Chiunque abbia conoscenze approfondite su questo argomento?

    
posta Rahil Arora 20.10.2013 - 19:14
fonte

2 risposte

2

Credo che l'impostazione standard anti-exploit sia (su Windows e Linux almeno): DEP, Stack Guard, hardened heap e ASLR (mi dispiace, non ho un riferimento per questo). Come sottolinei, tutte queste tecniche possono essere aggirate, con vari gradi di difficoltà, e il ROP è una delle tecniche principali. ASLR fornisce qualche difesa contro il ROP, ma credo che tutte le altre difese ROP che menzioni siano sperimentali e non usate come standard. Possono esistere in alcuni prodotti anti-virus e host hardening.

Lavoro con uno sviluppatore di exploit molto abile e di solito è in grado di creare un exploit affidabile per un difetto di corruzione della memoria, anche con queste difese in atto. Tenere presente che molti attacchi in questi giorni sono fughe di sandbox Java / JavaScript in cui viene esposta una superficie di attacco di grandi dimensioni rispetto a un sovraccarico del buffer di rete. Inoltre, un sacco di exploit sono difetti use-after-free che bypassano Stack Guard e l'hardened heap.

    
risposta data 20.10.2013 - 23:14
fonte
2

Hai ragione a evitare che tecniche come DEP o ASLR possano essere eluse con sufficiente sforzo.

Tuttavia, ti manca il fatto che queste tecniche servono a mitigare qualsiasi danno si sia già verificato. Lo fa rendendo difficile per un utente malintenzionato ottenere l'esecuzione del codice. La causa root dei problemi che hai elencato sono cattivi codice. Ad esempio, un overflow del buffer è causato da un pezzo di codice che tenta di scrivere più dati in un buffer di quanto è stato assegnato. Il modo appropriato per risolvere questi problemi è assicurarsi che tali eventi non si verifichino mai. Ovviamente, questo è piuttosto difficile da fare in una base di codice di grandi dimensioni. Puoi comunque risolvere il problema codificando in una lingua che ti protegge da problemi di memoria come Java, Python o Ruby. Non usare C o C ++ a meno che tu non sappia assolutamente cosa stai facendo.

    
risposta data 21.10.2013 - 01:21
fonte

Leggi altre domande sui tag