Disabilitazione di SMEP su x86_64

2

Recentemente ho fatto alcune ricerche sull'utilizzo del kernel su X86_64. Un problema a cui mi sono imbattuto è che ho trovato che lo SMEP di Intel stava uccidendo il mio esempio forzato di un dereferenziamento del puntatore del kernel NULL su cui stavo lavorando.

Puoi / come disabiliti SMEP su linux? Sono riuscito a rimuovere SMAP (Security Mode Access Protection) sul kernel Linux 3.8.x disabilitando la funzionalità nel file .config ma il mio problema persiste ancora. Presumo che SMEP debba essere disabilitato in modo diverso da SMAP, dato che dopo averlo disabilitato, l'esecuzione della mia pagina NULL mappata viene ancora istantaneamente uccisa non appena l'esecuzione viene deviata nello spazio del kernel.

Ho già impostato mmap_min_addr su 0 quindi per favore nessun commento mi dice di modificare questo valore in / proc / sys / vm:).

    
posta A.Smith 28.10.2013 - 10:57
fonte

3 risposte

3

Sembra che SMEP possa essere disabilitato (su linux) usando un parametro di avvio. Mentre sono certo che il suggerimento sopra funziona (disabilitare il codice di kernel-land è una scelta ovvia che avrei voluto fare prima: P) il seguente potrebbe essere un modo più semplice per ottenere lo stesso risultato finale.

Ho trovato informazioni qui su come eseguire questa operazione.

Sembra che aggiungendo il parametro di avvio del kernel nosmep ai parametri di avvio come spiegato nel link sopra, SMEP può essere disabilitato. Ho anche trovato il questo link alla documentazione di kernel.org che ci sono altri parametri che può essere utilizzato per disattivare altri vari meccanismi di protezione come NX o apparmour.

Per confermare se SMEP è stato disabilitato puoi digitare il seguente comando nel tuo terminale:

cat /proc/cpuinfo | grep smep

Questo comando stampa il contenuto del file /proc/cpuinfo e convoglia l'output in grep per cercare di trovare il flag smep nell'output.

Se il comando restituisce un valore (molto probabilmente smep sarà il valore restituito, se abilitato) allora SMEP è abilitato, altrimenti se non viene restituito alcun valore (cioè grep non restituisce nulla al terminale), SMEP è stato eseguito con successo Disabilitato.

Spero che questo aiuti chiunque altro nella mia posizione. Intendo fare una recensione sul mio blog per quanto riguarda le specifiche di SMEP e su come aggirarlo / disabilitarlo. Pubblicherò il link qui dopo aver scritto il post:).

Grazie a tutto ciò che ha aiutato!

A.

    
risposta data 28.10.2013 - 19:04
fonte
4

SMEP è attivato da bit 20 del registro di controllo CR4 mentre SMAP è bit 21. Disabilitarlo può quindi essere fatto, almeno, rattoppando il codice del kernel per rimuovere l'impostazione di questo bit.

Il codice pertinente sembra essere nel file arch/x86/kernel/cpu/common.c , intorno alla riga 269:

    if (cpu_has(c, X86_FEATURE_SMEP))
            set_in_cr4(X86_CR4_SMEP);

Basta commentare, ricompilare, riavviare. (Non l'ho provato.)

    
risposta data 28.10.2013 - 12:20
fonte
0

È possibile disabilitare SMEP usando una catena ROP nel kernel, che non è stata detta dagli altri utenti qui. Non c'è bisogno di patch o ricompilare o riavviare. Basta cercare nel kernel binario per i gadget ROP. Un esempio di codice che disabiliterebbe SMEP sarebbe: (Penso che sarebbe facile trovare variazioni di questo su tutti i kernel) (Avviso, Sintassi Intel )

mov eax , cr4
and eax , 0xfff ; This disables both SMAP and SMEP, as the higher 20 bits are cleared
mov cr4 , eax

Un esempio di una catena ROP che ho trovato su un kernel reale (ho sfruttato questo per passare a un utente):

0xaddr1: mov eax, cr4 ; pop ebp ; ret
0xaddr2: and eax, 0xfff ; ret
0xaddr3: mov cr4, eax ; pop ebp ; ret

Ci sono molte risorse su Google .

    
risposta data 21.01.2018 - 10:03
fonte

Leggi altre domande sui tag