У меня есть мантра, нельзя сломать то, что нельзя построить, ну конечно можно, но гораздо проще, если умеешь это строить. Возьмем веб-приложения. Много лет назад у меня был RCE на Redis, потому что я знал, как его настраивать; возьмем AD — поскольку я рано развернулся в Azure, я знал несколько ошибок, которые позволили мне перенять традиционную AD из Azure, и, наконец, создав свою собственную систему Unix, я смог определить ряд приватных. escs, просто смонтировав файловые системы или изменив основные стартовые библиотеки и т. д. Дело в том, что если вы можете это сделать, вы можете сломать это.

Частью создания чего-то является понимание этого, сегодня мы попытаемся понять основной компонент Unix, Glibc, что он делает, и рассмотрим предыдущие проблемы безопасности, которые затронули их, и другие эксплойты, которые злоупотребляют им. Я надеюсь, что все перечисленные двоичные файлы, библиотеки и каталоги будут полезны для людей, которые ищут хорошие цели для фаззинга или места для статического анализа кода.

Glibc

Пакет Glibc содержит основную библиотеку C. Эта библиотека предоставляет базовые процедуры для выделения памяти, поиска в каталогах, открытия и закрытия файлов, чтения и записи файлов, обработки строк, сопоставления с образцом, арифметики и т.д.

Установленные двоичные файлы

пойматьсегв

Может использоваться для создания трассировки стека, когда программа завершается с ошибкой сегментации.

генкат

Генерирует каталоги сообщений

getconf

Отображает значения конфигурации системы для конкретных переменных файловой системы.

получить

Получает записи из административной базы данных

значок

Выполняет преобразование набора символов

iconconfig

Создает быстро загружаемые файлы конфигурации модуля icon

ldconfig

Настраивает привязки среды выполнения динамического компоновщика.

лдд

Отчеты о том, какие общие библиотеки требуются каждой данной программе или общей библиотеке.

lddlibc4

Помогает ldd с объектными файлами

регион

Выводит различную информацию о текущей локали

localedef

Компилирует спецификации локали

сделаноb

Создает простую базу данных из текстового ввода

мтрейс

Читает и интерпретирует файл трассировки памяти и отображает сводку в удобочитаемом формате.

nscd

Демон, обеспечивающий кеширование наиболее распространенных запросов службы имен.

pldd

Перечисляет динамические общие объекты, используемые запущенными процессами.

слн

Статически связанная программа ln

сотрусс

Отслеживает вызовы процедур общей библиотеки указанной команды

sprof

Читает и отображает данные профилирования общих объектов.

tzselect

Спрашивает пользователя о местоположении системы и сообщает соответствующее описание часового пояса.

xtrace

Отслеживает выполнение программы, печатая текущую выполняемую функцию

сдамп

Дампер часовых поясов

Зик

Компилятор часового пояса

Установленные библиотеки

ld-2.28.so

Вспомогательная программа для исполняемых файлов общей библиотеки

libBrokenLocale

Используется внутри Glibc как грубый взлом для запуска сломанных программ (например, некоторых приложений Motif). См. комментарии в glibc-2.28/locale/broken_cur_max.cдля получения дополнительной информации

libSegFault

Обработчик сигнала ошибки сегментации, используемый catchsegv.

libanl

Библиотека асинхронного поиска имен

libc

Основная библиотека C

libcidn

Используется внутри Glibc для обработки интернационализированных доменных имен в функции getaddrinfo().

libcrypt

Библиотека криптографии

libdl

Библиотека интерфейса динамической компоновки

libg

Пустая библиотека, не содержащая функций. Раньше это была библиотека времени выполнения для g++.

libieee

Связывание в этом модуле устанавливает правила обработки ошибок для математических функций, определенные Институтом инженеров по электротехнике и электронике (IEEE). По умолчанию используется обработка ошибок POSIX.1.

libm

Математическая библиотека

libmcheck

Включает проверку выделения памяти при подключении к

libmemusage

Используется memusage для сбора информации об использовании памяти программой.

libnsl

Библиотека сетевых сервисов

libnss

Библиотеки коммутатора службы имен, содержащие функции для разрешения имен хостов, имен пользователей, имен групп, псевдонимов, служб, протоколов и т. д.

libpthread

Библиотека потоков POSIX

libresolv

Содержит функции для создания, отправки и интерпретации пакетов на серверы доменных имен в Интернете.

librpcsvc

Содержит функции, предоставляющие различные службы RPC.

librt

Содержит функции, предоставляющие большинство интерфейсов, указанных в расширении реального времени POSIX.1b.

libthread_db

Содержит функции, полезные для создания отладчиков многопоточных программ.

libutil

Содержит код для «стандартных» функций, используемых во многих различных утилитах Unix.

Каталоги

/usr/include/arpa
/usr/include/bits
/usr/include/gnu
/usr/include/net
/usr/include/netash
/usr/include/netatalk
/usr/include/netax25
/usr/include/neteconet
/usr/include/netinet
/usr/include/netipx
/usr/include/netiucv
/usr/include/netpacket
/usr/include/netrom
/usr/include/netrose
/usr/include/nfs
/usr/include/protocols
/usr/include/rpc
/usr/include/rpcsvc
/usr/include/sys
/usr/lib/audit
/usr/lib/gconv
/usr/lib/locale
/usr/libexec/getconf
/usr/share/i18n
/usr/share/zoneinfo
/var/cache/nscd
/var/lib/nss_db

Уязвимости



Топ 10 критических

  • CVE-2015–0235: переполнение буфера динамической памяти в функции __nss_hostname_digits_dots в glibc 2.2 и других версиях 2.x до 2.18 позволяет злоумышленникам, зависящим от контекста, выполнять произвольный код с помощью векторов, связанных с функция (1) gethostbyname или (2) gethostbyname2, также известная как GHOST.
  • CVE-2017–16997: elf/dl-load.c в библиотеке GNU C (также известной как glibc или libc6) 2.19–2.26 неправильно обрабатывает RPATH и RUNPATH, содержащие $ORIGIN для привилегированного (setuid или AT_SECURE). ), которая позволяет локальным пользователям получать привилегии через библиотеку троянского коня в текущем рабочем каталоге, связанные с функциями fillin_rpath и decompose_rpath. Это связано с неверным истолкованием пустого токена RPATH/RUNPATH как каталога ./. ПРИМЕЧАНИЕ: эта конфигурация RPATH/RUNPATH для привилегированной программы, по-видимому, очень необычна; скорее всего, такая программа не входит ни в один распространенный дистрибутив Linux.
  • CVE-2014–9402: реализация getnetbyname nss_dns в библиотеке GNU C (она же glibc) до версии 2.21, когда серверная часть DNS включена в конфигурации переключателя службы имен, позволяет удаленным злоумышленникам вызывать отказ в обслуживании (бесконечный цикл) путем отправки положительного ответа во время обработки сетевого имени.
  • CVE-2017–8804: Функции xdr_bytes и xdr_string в библиотеке GNU C (она же glibc или libc6) 2.25 неправильно обрабатывают ошибки десериализации буфера, что позволяет удаленным злоумышленникам вызвать отказ в обслуживании (виртуальный выделение памяти или потребление памяти, если параметр overcommit не используется) через созданный UDP-пакет на порт 111, проблема, связанная с CVE-2017–8779.
  • CVE-2000–0335: преобразователь в glibc 2.1.3 использует предсказуемые идентификаторы, что позволяет локальному злоумышленнику подделывать результаты DNS-запроса.
  • CVE-2002–0684:Переполнение буфера в функциях преобразователя DNS, выполняющих поиск сетевых имен и адресов, которые используются в BIND 4.9.8 и перенесены в glibc 2.2.5 и более ранние версии, позволяет удаленно DNS-серверы для выполнения произвольного кода через подпрограмму, используемую такими функциями, как getnetbyname и getnetbyaddr.
  • CVE-2003–0028: Целочисленное переполнение в функции xdrmem_getbytes() и, возможно, других функциях библиотек XDR (внешнее представление данных), производных от SunRPC, включая libnsl, libc, glibc и dietlibc. , позволяет удаленным злоумышленникам выполнять произвольный код с помощью определенных целочисленных значений в полях длины, что является другой уязвимостью, чем CVE-2002–0391.
  • CVE-2010–0015: nis/nss_nis/nis-pwd.c в библиотеке GNU C (она же glibc или libc6) 2.7 и Embedded GLIBC (EGLIBC) 2.10.2 добавляет информацию из пароля .adjunct.byname сопоставляется с записями в карте passwd, что позволяет удаленным злоумышленникам получать зашифрованные пароли учетных записей NIS, вызывая функцию getpwnam.
  • CVE-2012–4412: Целочисленное переполнение в string/strcoll_l.c в библиотеке GNU C (она же glibc или libc6) 2.17 и более ранних версий позволяет контекстно-зависимым злоумышленникам вызвать отказ в обслуживании (сбой ) или, возможно, выполнить произвольный код через длинную строку, которая вызывает переполнение буфера кучи.
  • CVE-2014–4043: функция posix_spawn_file_actions_addopen в glibc до версии 2.20 не копирует свой аргумент пути в соответствии со спецификацией POSIX, что позволяет злоумышленникам, зависящим от контекста, запускать уязвимости использования после освобождения.

Использование GLibC в наших интересах

Атака возврат к libc — это атака компьютерной безопасности, обычно начинающаяся с переполнения буфера, при котором подпрограмма возврат адреса в стеке вызовов заменяется адресом подпрограммы, которая уже присутствует в исполняемой памяти процесса, обходя функцию неисполняемого бита (если она есть) и избавляя злоумышленника от необходимости внедрять собственный код. Первый пример этой атаки в дикой природе был предоставлен Александром Песляком в списке рассылки Bugtraq в 1997 году.

В POSIX-совместимых операционных системах стандартная библиотека C (libc) обычно используется для обеспечения стандартной среды выполнения для программ, написанных на языке программирования C. Хотя злоумышленник может заставить код возвращаться куда угодно, наиболее вероятной целью является libc, так как он почти всегда связан с программой и предоставляет злоумышленнику полезные вызовы (такие как функция system, используемая для выполнения команд оболочки).