È vero che a livello di JavaScript i browser sono progettati per eseguire il sandboxing del codice in esecuzione (principalmente non esponendo alcuna API pericolosa), ma JavaScript è un linguaggio molto complesso da analizzare e eseguire .
ECMAScript è lo standard dietro JavaScript, a causa dell'enorme inflazione di marketing intorno ai linguaggi di programmazione per principianti che stiamo sperimentando oggi, ECMAScript si aggiorna rapidamente e introduce funzionalità sempre più complesse da implementare per un runtime. Questo, a sua volta, amplia la superficie di attacco e consente agli insetti di insinuarsi .
Un meraviglioso esempio è il recente lavoro di Patrick Biernat , Markus Gaasedelen , Amy Burnett per il pwn2own 2018.
http://blog.ret2.io/2018/06/05/pwn2own-2018-exploit-development/
Il blog descrive la scoperta di uno 0day che consente l'esecuzione di codice arbitrario in WebKit e come viene utilizzato per sfruttare un altro 0day nel Window Manager di macOS per sfuggire al sanbox in cui Safari è in esecuzione (è un sandbox macOS, non di Safari) per passare a "root" e possedere il sistema.
Per farla breve, semplicemente visitando un collegamento mentre JavaScript è abilitato, un sistema macOS può essere totalmente compromesso senza un singolo problema tecnico visibile all'utente. Ecco quanto può essere sicuro JavaScript: sicuro come un software complesso come può esserlo JSCore di WebKit.
Ecco perché si consiglia agli utenti che richiedono un'elevata sicurezza di disabilitare JavaScript (questo è un requisito abbastanza comune nel DarkWeb, ad esempio ).
Il vulnerab ility in WebKit scoperto dagli autori sopra è una condizione di competizione tra il Garbage Collector appena introdotto e la funzione array.reverse
: se il GC inizia a contrassegnare un array mentre viene invertito, potrebbe portare a un UAF (Usa dopo gratis) exploit.
Il segno viene eseguito in sequenza sull'array, supponiamo che il GC sia proprio al centro dell'array quando questo viene invertito, quindi la seconda metà non viene mai contrassegnata e quindi eletta per la raccolta, risultando in un UAF (l'oggetto dell'array stesso non viene raccolto, solo il suo elemento).
Il modo in cui un UAF viene utilizzato per rendere più potenti primitive di exploit che possono portare all'esecuzione di codice arbitrario è più o meno una variazione delle stesse tecniche: prima un oggetto interessante viene allocato nello spazio appena liberato (ad esempio un array) quindi viene creata una primitiva RW (ad es. alterando il confine dell'array) e infine gli opcode arbitrari vengono scritti in memoria (ad es. in una pagina JITted).
I dettagli per questo particolare 0day sono nel blog collegato.
La parte interessante è il modo in cui è stato trovato questo 0day: poiché WebKit è così grande, una revisione approfondita del codice è impossibile senza un'enorme quantità di sforzo, quindi è stato impostato il jitter automatico.
Questo deve fare riflettiamo sul fatto che quando abbiamo centomila o milioni di righe di codice, è molto difficile fare in modo che ognuna si comporti bene rispetto alle altre.