Уязвимость в Glibc ld.so, позволяющая поднять свои привилегии в системе

Компания Qualys выявила две уязвимости в системной библиотеке GNU libc. Первая проблема (CVE-2017-1000408) проявляется начиная с glibc 2.1.1 и может привести к утечке содержимого памяти процессов через манипуляцию с переменной окружения LD_HWCAP_MASK. Вторая уязвимость (CVE-2017-1000409) затрагивает выпуски начиная с glibc 2.5 и может привести к повышению своих привилегий в системе.

Уязвимость вызвана переполнением буфера в компоновщике ld.so и может быть эксплуатирована через указание специально подобранных данных в переменной LD_LIBRARY_PATH перед запуском suid-программ. Для эксплуатации переполнения буфера локальный атакующий должен иметь возможность создания жесткой ссылки на исполняемый SUID-файл в каталог, содержащий двоеточие в имени. Также требуется, чтобы применяемая в дистрибутиве версия ld.so передавала переменную окружения LD_LIBRARY_PATH в функцию _dl_init_paths().

$ mkdir -p '/var/tmp/:/lib:/usr/lib:'
$ cd '/var/tmp/:/lib:/usr/lib:'
$ env -i LD_LIBRARY_PATH='$ORIGIN/../../../../../../../../$LIB' LD_PRELOAD='os-release:rootshell.so'
LD_HWCAP_MASK="$(((1<<25)-1))" ./su
ERROR: ld.so: object 'os-release' from LD_PRELOAD cannot be preloaded (invalid ELF header): ignored.
# id
uid=0(root) gid=0(root)

Уязвимость проявляется только если не активна опция /proc/sys/fs/protected_hardlinks, которая включена по умолчанию в большинстве дистрибутивов, но отключена в настройках ванильного ядра Linux. Проблема также не проявляется в Glibc 2.26 и системах, в которых установлены патчи для устранения летней уязвимости CVE-2017-1000366. Несмотря на то, что в дистрибутивах проблема CVE-2017-1000409 пока помечена как неисправленная, в большинстве систем она не проявляется, так как в обновлениях ещё летом были предложены патчи с устранением уязвимости CVE-2017-1000366 в Glibc, также блокирующие и нынешнюю проблему.