
Looney Tunables: практикум по локальному повышению привилегий (CVE-2023-4911)
Локальное повышение привилегий Looney Tunables (CVE-2023-4911) практикум (только в образовательных целях)
В вычислительной технике динамический компоновщик — это часть операционной системы, которая загружает и связывает общие библиотеки, необходимые исполняемому файлу при его выполнении, копируя содержимое библиотек из постоянного хранилища в оперативную память, заполняя таблицы переходов и перемещая указатели.
Например, у нас есть программа, которая использует библиотеку openssl для вычисления хеша md5:``` $ head md5_hash.c #include <stdio.h> #include <string.h> #include <openssl/md5.h>
ld.so анализирует двоичный файл и пытается найти библиотеку, связанную с <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)
Как мы видим, он находит необходимую криптобиблиотеку по адресу /lib/x86_64-linux-gnu/libcrypto.so.3 Во время запуска программы он помещает код этой библиотеки в оперативную память процесса и связывает все ссылки на эту библиотеку.
Когда программа запускается, этот загрузчик сначала проверяет программу, чтобы определить, какие общие библиотеки ей требуются. Затем он ищет эти библиотеки, загружает их в память и связывает с исполняемым файлом во время выполнения. В процессе динамический загрузчик разрешает ссылки на символы, такие как ссылки на функции и переменные, гарантируя, что все готово для выполнения программы. Учитывая его роль, динамический загрузчик является очень чувствительным с точки зрения безопасности, так как его код выполняется с повышенными привилегиями, когда локальный пользователь запускает программу с установленным битом set-user-ID или set-group-ID.