Big Fish exploit su OpenBSD 7.9

OpenBSD, exploit root da un bug di 37 anni supera KARL, SMAP e SMEP

🛡️ Executive Summary

  • Calif ha pubblicato un exploit funzionante che porta un utente locale non privilegiato a root su OpenBSD 7.9 concatenando due vulnerabilità del kernel.
  • Il primo bug nasce da un contatore signed a 16 bit ereditato dal BSD del 1988; la catena supera KARL, SMAP e SMEP senza richiedere una vulnerabilità separata di information disclosure.
  • OpenBSD aveva già corretto i problemi con le errata 018 e 026 di settembre: non risultano attacchi reali e non sono stati assegnati CVE alla catena descritta.

Un contatore del kernel rimasto praticamente invariato dal BSD del 1988 diventa il primo anello di una catena capace di trasformare un normale utente locale in root su OpenBSD 7.9. La società di sicurezza Calif ha pubblicato Big Fish, proof of concept che combina un integer overflow nella gestione della memoria condivisa System V con un secondo errore di reference counting e una primitive di scrittura fuori limite. Il risultato supera alcune delle protezioni più caratteristiche di OpenBSD — KARL, SMAP e SMEP — pur partendo da vulnerabilità già corrette dal progetto a settembre. Il caso non descrive un attacco remoto né una zero-day attualmente sfruttabile su sistemi aggiornati: serve un accesso locale iniziale e, secondo le informazioni disponibili, non esistono evidenze di exploitation in-the-wild.

Un signed short del 1988 porta il contatore oltre 32.767

Annuncio

Nella ricerca tecnica Big Fish, Andrew Griffiths ricostruisce l’origine del primo problema nel campo shm_nattch, utilizzato per contare quanti processi hanno collegato un segmento di memoria condivisa System V. Il valore è definito come signed short a 16 bit, con massimo 32.767, una scelta presente nelle sorgenti BSD già nel 1988 e sopravvissuta per decenni. L’exploit crea 127 segmenti di memoria condivisa e utilizza centinaia di processi fino a spingere il contatore oltre il limite, facendolo tornare a un valore negativo.

Non basta l’overflow per ottenere root. Calif sfrutta successivamente una race condition collegata al reference counting, inducendo il kernel a liberare memoria ancora utilizzata da altri processi. È il classico scenario nel quale una debolezza apparentemente limitata diventa pericolosa soltanto quando può essere concatenata con un secondo primitive. Il principio ricorda il problema emerso con Polkit, dove una vulnerabilità vecchia di dodici anni aveva permesso escalation locale su Linux: l’età del codice non riduce automaticamente la rilevanza di un errore rimasto raggiungibile.

Leggi anche: CrackArmor: una falla nascosta per nove anni permette escalation a root su Linux

La catena modifica le page table e supera SMAP e SMEP

La parte più sofisticata arriva dopo il use-after-free. I ricercatori ottengono una scrittura fuori limite capace di alterare contatori relativi alle membership multicast del kernel. La successiva chiusura di un socket provoca decrementi che vengono utilizzati per modificare indirettamente una page-table entry, trasformando una mappatura controllata dall’utente in memoria accessibile in modalità supervisor. È il passaggio che permette alla catena di superare SMAP, progettata per impedire al kernel di accedere impropriamente alla memoria userspace, e SMEP, che impedisce l’esecuzione in kernel mode di codice collocato nelle pagine utente. A quel punto l’exploit può modificare un function pointer del kernel e ottenere l’esecuzione necessaria per raggiungere root. Il risultato assume particolare valore perché OpenBSD è progettato attorno a una strategia aggressiva di hardening. Superare una singola mitigazione non equivale a compromettere il sistema; concatenare abbastanza primitive da neutralizzarne diverse contemporaneamente cambia invece il livello del problema.

KARL randomizza il kernel ma non tutti gli indirizzi necessari all’exploit

OpenBSD utilizza Kernel Address Randomized Link, KARL, per rilinkare il kernel e cambiare la disposizione di funzioni e dati a ogni boot. Big Fish dimostra però che la randomizzazione non copre ogni proprietà utile all’attaccante. Secondo Calif, gli allocator utilizzati in alcune fasi del boot rimangono sufficientemente deterministici da collocare determinate strutture a indirizzi prevedibili sulla stessa macchina. L’exploit può quindi individuare function pointer utili senza disporre di una separata information leak. È probabilmente l’aspetto più importante della ricerca: una mitigazione può funzionare esattamente come progettato e lasciare comunque abbastanza determinismo nel resto del sistema da permettere la costruzione di una catena. Per questo Calif propone ulteriori difese, comprese randomizzazione degli allocator, protezione delle linked list, randomizzazione del mapping autoreferenziale delle page table e controlli compiler-based sui limiti.

OpenBSD aveva già corretto entrambe le vulnerabilità

La pagina ufficiale delle errata di OpenBSD 7.9 mostra che il progetto aveva già distribuito le correzioni prima della pubblicazione del proof of concept. L’errata 018 del 14 settembre impedisce l’integer overflow in shmat(4) ed è curiosamente classificata come reliability fix, non come security fix. L’errata 026 del 30 settembre corregge invece esplicitamente un reference-counting bug capace di generare un use-after-free nel kernel ed è classificata come aggiornamento di sicurezza. Le correzioni sono disponibili attraverso syspatch per tutte le architetture interessate. Anche OpenBSD 7.8 ha ricevuto la modifica relativa all’overflow. Al momento della pubblicazione non risultano CVE assegnati alle due vulnerabilità utilizzate nella chain e non sono stati documentati attacchi reali. È quindi scorretto trasformare Big Fish in una nuova emergenza Internet: il rischio riguarda soprattutto sistemi non aggiornati nei quali un attaccante disponga già della possibilità di eseguire codice come utente locale.

Un reliability fix può essere il primo anello di un exploit root

Il dettaglio più istruttivo riguarda proprio la classificazione dell’errata 018. Preso isolatamente, l’overflow poteva apparire come un problema di affidabilità. Inserito nella catena costruita da Calif diventa invece l’abilitatore di un percorso completo verso root. È la dimostrazione pratica del limite di una gestione delle vulnerabilità basata esclusivamente sul punteggio o sulla gravità attribuita al singolo bug. La gestione moderna delle vulnerabilità deve considerare sfruttabilità, contesto e capacità di concatenazione, soprattutto sui componenti kernel dove un errore di reference counting può trasformare un problema apparentemente circoscritto in una primitive molto più potente.

Continua con:

Linux compie 35 anni e resta una delle infrastrutture invisibili del digitale

SUDO Killer verifica l’escalation locale CVE-2019-14287 su sistemi Unix-like

Big Fish non dimostra che OpenBSD sia insicuro, ma che l’hardening non finisce mai

Il caso Big Fish è significativo proprio perché non smentisce il modello OpenBSD: mostra il tipo di avversario per il quale quel modello deve continuare a evolvere. KARL, SMAP e SMEP costringono il ricercatore a costruire una catena molto più complessa; non impediscono matematicamente che più errori possano essere combinati fino a trovare un percorso alternativo. L’aspetto operativo resta molto più semplice della ricerca: i sistemi aggiornati dispongono già delle correzioni. Per gli amministratori OpenBSD il controllo prioritario è quindi verificare che le errata di settembre siano state effettivamente installate tramite syspatch. Il valore di Big Fish sta soprattutto nel ricordare che il codice più pericoloso non è necessariamente quello appena scritto: può essere anche una decisione apparentemente innocua rimasta nel kernel per 37 anni in attesa che qualcuno trovi abbastanza pezzi da costruirci intorno un exploit completo.

Iscriviti alla Newsletter

Non perdere le analisi settimanali: Entra nella Matrice Digitale.

Matrice Digitale partecipa al Programma Affiliazione Amazon EU. In qualità di Affiliato Amazon, ricevo un guadagno dagli acquisti idonei. Questo non influenza i prezzi per te.

Torna in alto