
Workshop sull'escalation dei privilegi locali di Looney Tunables (CVE-2023-4911)
Workshop Looney Tunables sull'escalation dei privilegi locali (CVE-2023-4911) (solo a scopo educativo)
In informatica, un linker dinamico è la parte del sistema operativo che carica e collega le librerie condivise necessarie a un eseguibile quando viene eseguito, copiando il contenuto delle librerie dalla memoria persistente alla RAM, riempiendo le tabelle di salto e riallocando i puntatori.
Ad esempio, abbiamo un programma che utilizza la libreria openssl per calcolare l'hash md5:``` $ head md5_hash.c #include <stdio.h> #include <string.h> #include <openssl/md5.h>
ld.so analizza il binario e cerca di trovare la libreria relativa a <openssl/md5.h>```
$ ldd md5_hash
linux-vdso.so.1 (0x00007fffa530b000)
libcrypto.so.3 => /lib/x86_64-linux-gnu/libcrypto.so.3 (0x00007f19cda00000)
libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f19cd81e000)
/lib64/ld-linux-x86-64.so.2 (0x00007f19ce032000)
Come possiamo vedere, trova la libreria crittografica necessaria in /lib/x86_64-linux-gnu/libcrypto.so.3 Durante l'avvio del programma, inserisce il codice di questa libreria nella RAM del processo e collega tutti i riferimenti a questa libreria.
Quando un programma viene avviato, questo loader esamina prima il programma per determinare le librerie condivise di cui ha bisogno. Quindi cerca queste librerie, le carica in memoria e le collega all'eseguibile in fase di esecuzione. In questo processo, il caricatore dinamico risolve i riferimenti ai simboli, come riferimenti a funzioni e variabili, assicurando che tutto sia pronto per l'esecuzione del programma. Dato il suo ruolo, il caricatore dinamico è altamente sensibile alla sicurezza, poiché il suo codice viene eseguito con privilegi elevati quando un utente locale avvia un programma set-user-ID o set-group-ID.