Sebbene JavaScript e HTML come lingue siano privi di use-after-free by design (a causa della mancanza di accesso alla memoria di basso livello), possono ancora essere utilizzati per sfruttare UAF nei motori che interpretano ed eseguono JavaScript / HTML .
Ecco come si trovano le vulnerabilità UAF:
- Fornire un input che provoca l'arresto anomalo dell'applicazione o il comportamento anomalo dell'applicazione. Per esempio. di fuzzing o un'ipotesi basata sull'analisi del programma.
- Riduci l'input a un esempio minimo che provoca l'arresto anomalo.
- Analizza perché il campione genera un arresto anomalo. Per esempio. passando attraverso un debugger o studiando il codice sorgente. Gli esempi più importanti di applicazioni che interpretano JavaScript sono i browser Web, e quelli più popolari sono open-source ( ChakraCore per Microsoft Edge . < a href="https://developers.google.com/v8/"> V8 / Chromium , Firefox ) (tutto con C ++), che semplifica questo passaggio.
Per iniziare, puoi studiare segnalazioni di bug pubbliche (ad es. Chrome di criticità di livello medio / alto / critico ( linee guida sulla severità ), Firef bug ad alta / critica di ox ( linee guida sulla severità ), qualsiasi CVE). JavaScript è un linguaggio altamente dinamico, a volte puoi fare cose che i progettisti / implementatori di una determinata funzione non hanno previsto o aspettato, con conseguenti vulnerabilità della sicurezza (ad esempio un serializzatore JSON che non ha tenuto conto del fatto che i callback personalizzati possono modificare l'input ). La maggior parte degli errori non si trova nel motore JavaScript stesso, ma nell'implementazione delle API disponibili (ad esempio DOM non fa parte di JavaScript).
Se disponibile, utilizza AddressSanitizer perché rende più facile rilevare e classificare il tipo di bug di memoria. Puoi crearlo dal sorgente, o usare i binari pre-costruiti (vedi ad esempio Firefox o Chrome ).
Nota: Trovare l'UAF è il passo più facile, in realtà sfruttarlo è molto più difficile. I programmi moderni utilizzano ogni sorta di misure preventive per contrastare le vulnerabilità (ad esempio ASLR , stack non eseguibili, stack / heap protectors, < a href="https://wiki.ubuntu.com/Security/Features"> e altro ).