Представлен релиз системной библиотеки GNU C Library (glibc) 2.20, которая полностью следует требованиям стандартов ISO C11 и POSIX.1-2008. В подготовке нового выпуска использованы патчи от 69 разработчиков.

Новый выпуск ознаменовал собой завершение процесса слияния с проектом Eglibc (Embedded GLIBC), который развивался синхронно с Glibc и был полностью совместим с ней на уровне API и ABI, отличаясь интеграцией некоторых дополнительных наработок для встраиваемых систем, более низкими системными требованиями, возможностью гибкой настройки компонентов, улучшенной поддержкой кросс-компиляции и кросс-тестирования. Последние два года проекты двигались в сторону возвращения в Glibc наработок Eglibc, к моменту выхода Glibc 2.20 данный процесс завершился и отныне пользователям и разработчикам Eglibc рекомендовано вернуться на Glibc. Выпуск Eglibc 2.19 был последним, версия Eglibc 2.20 не будет выпущена. Ранее применявшие Eglibc дистрибутивы OpenWrt, Mandriva, Debian и Ubuntu уже наметили возвращение на Glibc.

Из добавленных в Glibc 2.20 улучшений можно отметить:

  • Требования к минимально поддерживаемому выпуску ядра Linux повышены до 2.6.32 (ранее поддерживались выпуски ядра, начиная с 2.6.16);
  • Для систем на основе ядра Linux добавлена поддержка блокировки на уровне описаний файлов (file descriptions, используется для обмена файловыми дескрипторами между процессами и нитями). Штатный интерфейс установки блокировок на файлы расширен средствами для блокировки на уровне описаний файлов (не путать с файловыми дескрипторами) с использованием опций F_OFD_GETLK, F_OFD_SETLK и F_OFD_SETLKW. Блокировка на уровне описания файлов ассоциируются с открытым файлом, а не процессом, т.е. корректно обрабатывает передачу открытого заблокированного файла другому процессу и использование блокировки в многопоточных программах;
  • Реализация функции strchr оптимизирована для архитектуры AArch64;
  • Реализация функции strcmp оптимизирована для архитектуры ARMv7;
  • Изменена логика выполнения тестового набора - процесс тестирования больше не прерывается после первой ошибки и выполняется полностью. Лог всех выявленных при тестировании сбоев сохраняется в файл tests.sum. После завершения тестирования на экран выводится сводка проблем. Для возврата старого поведения следует запускать "make check stop-on-test-failure=y";
  • Прекращена поддержка порта am33, который находится в неработоспособном состоянии уже несколько лет;
  • Прекращена поддержка макросов тестирования _BSD_SOURCE и _SVID_SOURCE, которые теперь действуют как _DEFAULT_SOURCE с выводом предупреждения;
  • Для архитектур s390 и s390x в реализации мьютексов pthread добавлена поддержка аппаратных механизмов проведения транзакций в памяти, определённых в составе набора расширений TX (Transactional Extensions). Внесённое улучшение позволяет увеличить масштабируемость блокировок для существующих программ, при их запуске на системах, поддерживающих расширения TX;
  • Отменены изменения структур данных ABI, внесённые для архитектур s390 и s390x (в glibc 2.19 был увеличен размер структур ucontext и jmp_buf);
  • Все поддерживаемые архитектуры отныне используют основную директорию sysdeps из состава glibc вместо отдельных директорий в иерархии ports;
  • NPTL-реализация POSIXpthreads больше не позиционируется как дополнение и используется по умолчанию в конфигурациях, поддерживающих NPTL, независимо от включения опции "--enable-add-ons";
  • Реализация "ленивого" динамического связывания на архитектуре x86-64 приведена к совместимости с кодом приложений, в которых используются инструкции Intel MPX (состояние регистров MPX теперь сохраняется перед обращением к библиотеке);
  • Внесено 4 изменения, связанных с безопасностью:
    • Прекращена поддержка загружаемых модулей транслитерации gconv, которые не применяются уже более десяти лет. Поддержка обычных модулей преобразования gconv сохранена без изменений, в том числе возможно использовании транслитерации через опцию "//TRANSLIT" и применение спецификатора "//IGNORE".

      Удаление кода связано с выявлением уязвимости CVE-2014-5119, первые сообщения о которой были опубликованы ещё в 2005 году. Уязвимость вызвана ошибкой, приводящей к перезаписи одного байта за границей буфера при обработке некорректных данных функцией "__gconv_translit_find()" (iconv/gconv_trans.c). В июле 2014 года проблема вновь всплыла в системе отслеживания ошибок, но участники команды устранения уязвимостей из компании Red Hat скептически отнеслись к этой ошибке и заявили, что она не подлежит эксплуатации, так как встроенные в реализацию malloc средства защиты должны блокировать проявление проблемы. Участники созданной компанией Google команды "Проект Zero" показали, что поверхностный анализ потенциальных уязвимостей не всегда адекватен и подготовили рабочий эксплоит, который может быть применён для организации запуска кода атакующего.

    • CVE-2014-0475 - добавлены дополнительные проверки на использование символов "/" и ".." в именах локалей, полученных через переменные окружения группы LC_*. Вызов setlocale при наличии таких имён отныне приводит к ошибке, а также при размещении очень длинных имён;
    • CVE-2014-4043 - проблема в реализации posix_spawn_file_actions_addopen, позволяла осуществить подмену аргумента с файловым путём, через разыменования связанной с ним ссылки в последующем вызове posix_spawn;
    • CVE-2014-6040 - ошибка в коде iconv, используемом для декодирования набора символов в кодировках IBM933, IBM935, IBM937, IBM939 и IBM1364, могла привести к чтению данных из области за пределами выделенного буфера;
  • Исправлено около 150 ошибок.


Источник: http://www.opennet.ru/opennews/art.shtml?num=40537