Эксплуатация уязвимостей параллельной обработки данных в обработчиках системных вызовов

Эксплуатация уязвимостей параллельной обработки данных в обработчиках системных вызовов

В этой статье мы обсудим теорию и практику уязвимостей параллельной обработки данных в обработчике системных вызовов и продемонстрируем техники эксплуатации GSWTK, Systrace, и CerbNG.

Robert N. M. Watson
Computer Laboratory
University of Cambridge
Перевод www.SecurityLab.ru

Аннотация
Наличие системного вызова позволяет расширить модель безопасности ядра. В то же время в современных операционных системах он подвержен уязвимостям параллельного выполнения процессов, что может привести к повышению привилегий и обходу аудита. В этой статье мы обсудим теорию и практику уязвимостей параллельной обработки данных в обработчике системных вызовов и продемонстрируем техники эксплуатации GSWTK, Systrace, и CerbNG.

Введение
Системный вызов является расширением ядра, используемым для усиления политики безопасности системы без модификации кода ядра. Он широко используется в исследовательских системах и коммерческих антивирусных решениях, не смотря на рекомендации экспертов по безопасности и проблемы со стабильностью. Garfinkel [14], Ghormley [15], и автор [23] описывают потенциал параллельных уязвимостей в системах обработчиков. Эти описания весьма поверхностны, уязвимости в обработчиках к атакам параллельной обработки данных требует дальнейшего изучения. Мы провели исследование уязвимостей и техник эксплуатации для реально работающих систем, демонстрируя существующие проблемы параллелизма, которые ведут непосредственно к эксплуатации уязвимостей. Мы считаем, что на основании этого исследования необходимо переосмыслить архитектуру расширений безопасности.

В этой статье мы сперва представим параллелизм в ядрах операционных систем и технику обработки системных вызовов. Затем мы обсудим структуру параллельных уязвимостей, применяемость параллельных атак на обработчики и практические техники эксплуатации. Мы исследуем уязвимости повышения привилегий и обхода аудита в трех системах обработки системных вызовов: Generic Software Wrappers Toolkit (GSWTK) [12], Systrace [20] и CerbNG [7]. И, наконец, мы предложим временные решения и возможные архитектурные изменения систем для устранения уязвимостей.
Все эксперименты и измерения проводились на 3.2 GHz Intel Xeon.

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

В ядре операционной системы источниками параллелизма являются прерывания и многопроцессорность. Ядра предлагают внутренний функционал трединга для подсистем ядра (файловая систем, сетевой стек и т.д.) и распространяют параллелизм на приложения посредством процессов, трединга, сигналов и асинхронного ввода/вывода данных. Программисты используют это для маскирования I/O латентности и эксплуатации аппаратного параллелизма. Параллелизм является фундаментальной чертой операционной системы и должен использоваться с осторожностью по отношению к безопасным службам.


Рис. 1
Ошибочное визуальное соответствие моделей Reference Monitor и обработчика системных вызовов.

 

3. Обработчики для безопасности
Посредничество системных вызовов предоставляет Reference монитору контроль над службами ядра путем перехвата системных вызовов (Рис.1). Андерсон [4] утверждает, что Reference монитор должен обладать следующими качествами:

  • быть устойчив к вмешательству
  • быть всегда в активном состоянии
  • быть достаточно маленького размера для анализа и тестов на корректность.

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

Далее (см. UNIX API по обработчикам), разрешается использование портирования некоторых пакетов обработчиков на многие операционные системы. Обработчики системных вызовов компилируются в ядро или загружаются в качестве модуля и перехватывают системные вызовы (Рис. 2). Мы позаимствуем терминологию из GSWTK:

  • предварительный перехват (precondition hook) происходит до передачи управления ядру, позволяя обработчику проверить или изменить аргументы до того, как их увидит ядро.
  • постусловный перехват (postcondition hook) происходит до возвращения контроля в пользовательское пространство, позволяя обработчику проследить и записать лог результатов, преобразовать возвращаемые значение и т.д.

 


Рис. 2
Обработчики системного вызова реализую предварительную и постусловную обработку системного вызова.

 

Обработчики производят проверки политики номера системного вызова с атрибутами и доступа к структурам данных ядра, таких как информация о процессе. В функционале контроля доступа обработчики могут остановит вызов, преобразовать аргументы, изменить личные данные, записать данные в лог файл или произвести другие действия. Изменяя аргумент и возвращаемое значение, обработчики системного вызова могут изменить пространство имен системного объекта, видимого приложению, т.е. обработчик может перенаправить запросы на открытие файла или изменить IP адрес, ограниченный приложением. Источники политик включают скомпилированные политики (LOMAC [11]), языки политик конфигурации (GSWTK, CerbNG), и даже сообщение, передаваемое пользовательскому процессу (Systrace).

 

4. Уязвимости параллельной обработки данных
Уязвимости параллельной обработки данных присутствуют там, где недостаточный контроль параллелизма ПО может привести к нарушению политики безопасности. Они могут быть результатом некорректного планирования параллелизма, ошибок реализации в контроле параллелизма, или несоответствия данных в реализации разработчика и условиях запуска.

Аббот описал ряд категорий уязвимостей операционных систем в ROSIS отчете [2], в том числе и уязвимости параллельной обработки данных, возникающих вследствие асинхронной проверки и неадекватной синхронизации. Бисби и Холингворт [5] подчеркивают важность последовательности во времени для защиты информации, сложности в изменении привязки имени объекта во времени, общие ошибки сериализации, прерванные атомарные операции, в которых некорректное предположение об эффекте параллельности на операциях приводит к уязвимостям. Фитен [10] перечисляет возможные результаты ошибок параллельности:

  • Замирание (deadlock): потоки блокируются изначально.
  • Потеря данных: данные перезаписываются другим потоком.
  • Потеря целостности данных: данные, записанные различными потоками, могут произвольно накладываться друг на друга.
  • Потеря живучести (Loss of liveness): несбалансированный доступ к общим ресурсам приводит к проблемам производительности.

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

5 Параллельные атаки на обработчики
Высокопараллельное программное обеспечение, защищающие важные данные, ядра операционных систем, является превосходной платформой для обнаружения уязвимостей параллелизма. В сравнении с предположением об атомарных системных вызовах, сделанных в предыдущих обсуждениях по отношения уязвимостей состояния операции [8], ключевым моментом в нашем исследовании является неатомарность между ядром и обработчиками системного вызова. Мы обнаружили и удачно проэксплуатировали три формы уязвимостей параллельной обработки данных в обработчиках:

  • Ошибки синхронизации в логике обработчика, приводящие к некорректным действиям, например, блокированию данных
  • Отсутствие синхронизации между обработчиком и ядром при копировании аргументов системного вызова, т.е. аргументы, обрабатываемые обработчиком и ядром, отличаются. Мы называем это синтаксическими ошибками состояния операции, т.к. атакующий меняет буквенные значения.
  • Отсутствие синхронизации между обработчиком и ядром при интерпретации аргументов системного вызова. Мы называем это семантической ошибкой состояния операции, поскольку атакующий управляет интерпретацией значений.

Последние две формы описывают не изолированный обработчик, а скорее его неполноценность по отношению к охраняемой им службе. Мы сфокусируемся на синтаксических ошибках состояния операции, которые не зависят от ядра и внутренней части обработчиков и являются переносимыми между различными фреймворками обработчиков и операционными системами. Наиболее обнаруживаемые и эксплуатируемые уязвимости можно разделить на три категории:

  • Time-of-check-to-time-of-use (TOCTTOU) (время проверки ко времени использования) – уязвимости, в которых проверки контроля доступа являются неатомарными с действиями, которые защищаются, что позволяет атакующему обойти правила контроля доступа.
  • Time-of-audit-to-time-of-use (TOATTOU) (время аудита ко времени использования) – уязвимости, в которых данные зависят от наличия доступа как результата неатомарности, нарушая требования правильности. Это позволяет атакующему скрыть свою активность и обойти триггеры IDS.
  • Time-of-replacement-to-time-of-use (TORTTOU) (время замены ко времени использования) – уязвимости, уникальные для обработчиков, в которых атакующий меняет аргументы системного вызова, после того, как обработчик уже их изменил, но до того, как ядро получило к ним доступ, таким образом нарушая политику безопасности.

Нам не известно о более ранних исследованиях TOATTOU и TORTTOU уязвимостей.

6. Техника эксплуатации
Уязвимости параллельной обработки данных присутствуют там, где имеет место неадекватная синхронизация общедоступных ресурсов, которая приводит к нарушению политики безопасности. Первым шагом при обнаружении уязвимости, является определение ресурсов, относящихся к контролю доступа, аудиту или другому функционалу безопасности, которые запрашиваются параллельно доверенным приложением. Соответствующими ресурсами могут быть объекты файловой системы, общедоступная память, сокеты и косвенно запрашиваемые объекты ядра (nodes/inodes, буферы ядра). Мы будем использовать память процессора, сохраняющую аргументы системного вызова, которые запрашиваются пользовательским процессом, обработчиком и ядром. К пользовательской памяти мы получаем доступ из ядра с помощью функций копирования, например, BSD copyin() и copyout(), которые проверяют адреса и страничную память как требуется.

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

Косвенные аргументы ссылаются с помощью указателей, часто передаются в качестве прямых аргументов, и копируются по запросу служб ядра; например пути файла копируются и резолвятся с помощью namei(). Косвенные аргументы копируются после предварительно перехвата, т.е обработчик копирует их независимо из яра, открывая окно состояния между двумя операциями копирования. Эти состояния ограничены косвенными аргументами, многие из которых важны для безопасности, например, адрес сокета, путь к файлу, аргументы к ioctl() и sysctl(), списки идентификаторов групп, лимиты ресурсов и I/O данные.

6.1 Параллелизм
Параллельное выполнение программы на UNIX системе происходит посредством сигналов, асинхронного I/O, потоков и процессов. Операции в отдельном процессе обязательно поддерживают общедоступную память; процессы могут делать память общей с помощью minherit(), rfork() и clone(), явной общедоступной памяти и интерфейсов отладки. Мы делаем память общедоступной для процессов по наследству, т.к. другие методы не совместимы с различными системами. В ранее опубликованных работах обсуждались ошибки состояния операции между пользовательскими процессами, но нам интересны ошибки состояния операции между пользовательскими потоками и самим ядром. Это требует одновременной работы пользовательского потока и ядра, что является возможным посредством чередования по расписанию (interleaved scheduling) или аппаратного параллелизма.

6.2 Эксплуатация ошибок состояния операции на однопроцессорных системах
На однопроцессорных системах атакующий должен заставить ядро уступить пользовательскому процессу между выполнением системного вызова и обработчиком предварительного и постусловного перехватов. Уступка может произойти добровольно (поток запрашивает блокирование I/O для сокета или диска) или принужденно (поток ядра запрашивает память, что приводит к ошибке страницы (page fault) на диске). Оба варианта могут использоваться для эксплуатации ошибки состоянии операции для предварительного и постусловного перехвата обработчика системного вызова.

Ошибки страницы на косвенных аргументах системного вызова эффективны при открытии окон состояния операции. Результирующее ожидание от I/O диска предоставляет окну расписания несколько миллионов циклов инструкций, что более чем достаточно во времени для того, чтобы атакующий поток подменил содержимое памяти страницы. На большинстве систем очень просто организовать сохранение пользовательских данных в странице на диске, свопе или файле памяти путем увеличения потребления памяти.

Изначально предполагалось, что эта техника ограничена системными вызовами с различным и косвенными аргументами, как, например, rename(). Нам удачно удалось поэксплуатировать этот случай путем записи в страницу на диск целевого пути rename(), что позволило подменить исходный путь между проверкой и использованием. В итоге мы поняли, что операции копирования сами по себе не являются атомарными, что позволяет атаковать системные вызова даже с одним аргументом. Это прекрасно работает, т.к. последний байт большинства косвенных аргументов не является обязательным: строки терминируются и большинство структур данных содержат пустышки. Ошибки страниц могут эксплуатироваться и постусловно, единственное ограничение – существует возможность для большинства системных вызовов создать лишь один раз страницу ошибки для каждой страницы.

Произвольные деактивации потоков также могут быть полезными: во время TCP connect(), вызывающий поток будет ожидать в ядре TCP ACK для подтверждения соединения, что позволяет пользовательскому потоку выполниться после того, как аргументы скопировались в ядро и произвести постусловную атаку на аудит.

6.3 Эксплуатация состояния операции на многопроцессорных системах
Под многопроцессорными системами мы понимаем любую систему параллельной обработки данных, включая SMT и многоядерные системы.
Однопользовательские системы уязвимы к ошибке состояния операции, но требуют управления расписанием ядра посредством ограниченного числа возможностей. На многопользовательских системах, ошибки состояния операции происходят между потоками ядра и могут быть эксплуатированы не полагаясь на переход ядра в спящий режим, поскольку пользовательские потоки могут работать одновременно на других процессорах. Эксплуатация уязвимости на процессорах Intel немного ограничена тем, что ошибка состояния операции происходит со скоростью памяти (10K – 100K циклов) а не со скоростью дисковой подсистемы или сетевой (>1M циклов).

Мы используем два подхода для идентификации тайминга для замены аргумента. В случае, когда аргумент копируется без замены, бинарный поиск для Time Stamp Counter (TSC) окна операции может быть произведен путем анализа результатов системного вызова. В случае, когда аргумент копируется с заменой обработчиком, возможно просто проследить за заменой и затем модифицировать аргумент.

Мы обнаружили, что длина окна операции варьируется в зависимости от систем обработчиков. Для аргументов в GSWTK, который запускается только в ядре, длина составляет от 5К до 15К циклов. Systrace передает контроль в пространство пользователя, что производит опциональные копии в и из целевого процесса, открывая окно операции более 100K. Изменение размеров величины окна операции приводит к измеряемым отличиям в атаке: у нас была 100% эксплуатация уязвимостей состояния операции в различных пакетах.

7. Испытываем настоящие уязвимости
7.1 Generic Software Wrappers Toolkit
GSWTK является системой контроля доступа к ядру, которая позволяет определенным обработчикам системного вызова проверять и изменять аргументы и возвращаемые значения. Обработчики написаны на расширении языка C с внедренной поддержкой SQL базы. GSWTK доступен в качестве пакета стороннего производителя для платформ Solaris, FreeBSD, BSD/OS, и Linux; мы тестировали GSWTK 1.6.3 на FreeBSD 4.11. Доступны множество обработчиков – от политик контроля доступа до обнаружения вторжения.

Нам удалось успешно подменить значения, используемые в предварительном контроле доступа, постусловном аудите и обнаружении вторжения на однопроцессорных системах посредством страниц (Рис. 3) и на многопроцессорных системах посредством второго процессора. После экспериментального подтверждения уязвимостей в интересующих нас обработчиках мы проверили остальные обработчики, входящие в состав GSWTK. Из 23 доступных обработчиков для UNIX платформ у 16 были обнаружены одна или более уязвимостей (Таблица 1). Интересной для ознакомления является работа Ко [18], иллюстрирующая потенциальное влияние TOATTOU уязвимостей.

 


Рис 3.

 

7.2 Systrace
Systrace является системой контроля доступа, которая позволяет пользовательскому процессу контролировать целевой процесс путем проверки и изменения аргументов системного вызова и возвращаемых значений. Systrace входит в состав операционных систем OpenBSD и NetBSD и поставляется с портами для Mac OS X, FreeBSD и Linux. Для нашего исследования мы использовали Systrace на NetBSD 3.1, 4.0 (январь 2007) и OpenBSD 4.0. Поскольку Systrace является системой программируемых политик, мы использовали 2 политики: режим мониторинга Sudo и Sysjail [16]. Мы сумели обойти защиту обоих, нарушая политику доступа и целостность аудита.

7.2.1 Sudo
Sudo является широко используемым инструментом управления привилегиями, позволяющий пользователям выполнять авторизованные команды с привилегиями другого пользователя. Предшествующая релизу версия Sudo содержит режим мониторинга, основанного на Systrace, который ведет аудит выполненных команд из Sudo-процессов. Sudo перехватывает execve(), который принимает путь к приложению, аргументы командной строки и переменные окружения в качестве косвенных аргументов, и таким образом, является уязвимым к атаке. Из-за того, что источником политики является пространство пользователя, Systrace требует дополнительные контекстные переключатели для принятия решений контроля доступа, что увеличивает окно операции. Для Sudo на многопроцессорных системах, окно для execve() аргументов было более 430К циклов. Нам удалось удачно поэксплуатировать эту уязвимость, заменяя командные строки таким образом, что они некорректно логировались, что позволило скрыть всю дальнейшую активность атакующего.

7.2.2 Sysjail
Sysjail [16] является портом FreeBSD, реализующим возможности jail окружения с использованием Systrace фреймворка от NetBSD и OpenBSD. Sysjail «цепляется» ко всем процессам, запущенным в jail окружении, и проверяет, а также, в некоторых случаях, перезаписывает аргументы системного вызова с целью управления ограничением. Sysjail представляет интерес тем, что работает с процессами, запущенными с привилегиями root, увеличивая опасность для существующей уязвимости.

Обработчик

Описание

Уязвимости

callcount

Ведет подсчет системных вызовов

Отсутствуют: полагается на номер системного вызова

conwatch

Следит за IP соединениями по процессу

Постусловная TOATTOU ошибка состояния операции в connect() и bind() позволяет скрыть используемые адрес/порт.

dbfencrypt

Шифрует файлы с символом ‘$’ в именах; предотвращает переименование, таким образом политика шифрования файла не может быть изменена.

Постусловная TOCTTOU ошибка состояния операции позволяет использовать некорректное имя при проверке политики; предварительная TORTTOU ошибка состояния операции для I/O записывает незашифрованные данные и обходит проверку переименования файла.

dbexec

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

Предварительная TOCTTOU ошибка состояния операции позволяет обойти проверку имени во время проверки обработчиком.

dbsynthetic

Синтетическая песочница файловой системы, подменяющая имена путей согласно базе данных

Предварительная TORTTOU ошибка состояния операции позволяет обойти замену пути; постусловная TORTTOU ошибка состояния операции устраняет проверку корректности пути.

life

Публикует жизненный цикл процесса

Предварительная TOATTOU ошибка состояния операции заменяет exec() пути

noadmin

Запрещает все привилегированные операции

Отсутствуют: полагается на привилегии процесса ядра

aks.wr

Ведет аудит операций с файлами

Предварительные и постусловные TOATTOU ошибки состояния операции позволяют обойти аудит.

seq-kernel.wr

Последовательное обнаружение вторжения

Отсутствует: полагается на номер системного вызова

imapd.wr

Определяет аномальный доступ через imapd

Постусловная TOATTOU позволяет подмену путей и предупреждает сообщение об ошибке.

Таблица 1. Выборка уязвимостей параллельной обработки данных в GSWTK и ID обработчиках

 


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

 

Sysjail обрабатывает несколько косвенных аргументов, включая IP адрес, передаваемый в bind(). Sysjail накладывает два ограничения: IP адрес должен быть сконфигурирован для jail, или должен быть INADDR ANY, в последнем случае он будет заменен на адрес jail. Эксплуатируя Sysjail мы способны сменить IP адрес и обойти сетевое ограничение.

7.3 CerbNG
CerbNG является Фреймворком безопасности третьего производителя для FreeBSD 4.8, подобен GSWTK. Позволяет организовать контроль на основе правил над системными вызовами, проверяет и изменяет аргументы и возвращаемые значения, меняет свойства процесса и события логирования. Мы удачно поэксплуатировали TOATTOU и TOCTTOU уязвимости в правилах, входящих в состав системы, путем подмены командных строк для создания неверных записей аудита в log-exec.cb, который занимается аудитом execve(). CerbNG имеет в наличии несколько виртуальных способов защиты памяти, обсуждаемых в части 8.1.

 

8. Предотвращение уязвимостей в обработчиках
Эксплуатация уязвимостей состояния операции в обработчике системного вызова может привести к частичному или полному обходу контроля доступа и аудита. Для устранения такой ситуации необходимо корректное управление параллельными операциями. Мы предлагаем решение в трех областях:

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

8.1 Техники устранения уязвимостей
Ли Беджер (Lee Badger) предложил слабое решение: обнаружить и обезвредить изменения в состоянии ядра посредством постусловного перехвата, принимая корректирующие действия при возникновении нарушения политик. Мы считаем, что это решение может повлечь за собой побочные эффекты для некоторых системных вызовов (например, connect() и unlink()); обнаружение несовместимости приведет к тем же атомарным проблемам, что и в других случаях постусловности.
Давидек (Dawidek) экспериментировал с маркированием только для чтения страниц памяти, содержащих аргументы системного вызова на время самого вызова. При корректной реализации это предотвратит изменения аргументов, но нарушит программный параллелизм. Легитимный многопоточный процесс может хранить одновременно запрашиваемые данные на той же странице памяти, что и аргументы, что приведет к неожиданным ошибкам в приложении.

Защита виртуальной памяти не является тривиальной, так как все представления физической страницы должны быть защищены. Интересный случай с отраженными в памяти файлами: системы с объединенными VM/buffer кешами должны предотвращать записи через системные I/O вызовы, а не только отображенную память. Защита страниц также не полна: адресное пространство должно быть защищено от «ремапинга» защищенных страниц с привилегиями на запись. Мы обнаружили несколько уязвимостей в защите виртуальной памяти, производимой CerbNG, включая некорректную защиту от записи страниц и окна операции при копировании аргументов.

Провос (Provos) предлагает подобные возможности в Systrace, копируя косвенные аргументы в «окно стека» (зарезервированную область памяти процесса), позволяя обработчикам работать с косвенными аргументами большего размера. Также он предположил, что такой подход можно противопоставить атакам на общедоступную память, поскольку окно стека является уникальным для каждого процесса. Защита не является эффективной при наличии потоков, поскольку потоки используют единое адресное пространство. Эксперименты, поставленные на OpenBSD, показывают, что маппинг окна стека возможно заменить на общую память, доступную другим процессам, даже в случая отсутствия потоков. Это решение вызывает копирование дополнительных данных для любых защищенных аргументов.
Гормли (Ghormley) описывает ошибки состоянии операции в аргументах в SLIC фреймворке посредством встроенных в ядро буферов, которые расширяют адресное пространство пользователя. Каждый поток кеширует участки адресного пространства, скопированного расширением или ядром; в последующем доступ будет осуществляться только к Кешу, таким образом защищая от изменения данных пользовательскими потоками. Этот вариант решения требует замены механизмов копирования ядром, что бы не только обработчики но я ядро работало с кешем. Поскольку кешируемые буферы не сохраняются в страницах, появляется возможность устранения эффукта общего доступа к защищенным страницам; хотя такое решение будет слишком требовательным к производительности системы, т.к. все косвенные аргументы должны копироваться и кешироваться в памяти ядра.

Виртуальная память и схемы кеширования делают обработку косвенных аргументов (которые считываются и записываются системным вызовом – например, POSIX асинхронный I/O) более сложной. Ни одна система защиты не была способна корректно обработать этот случай, и также ни одна из простых политик не могла контролировать этот системный вызов.

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

 

8.2 Системы передачи сообщения
Для управления моделью системного вызова не прибегая к техникам устранения уязвимости, следует изменить операцию ядра. Как вариант – перейти на модель передачи сообщений (message-passing model), в которой аргументы системного вызова передаются ядру все вместе, а не копируются по требованию. Это решение не устранит семантические ошибки состояния операции, но позволит решить проблему с синтаксическими уязвимостями, позволяя обработчику проверять те же значения аргументов, что и ядру. Недостатком этой модели является то, что обработчик трапов должен получить доступ ко всем аргументам; в данный момент эти данные разбросаны между различными уровнями ядра. Гарфинкель Остия [13] и Сиборн Плеш [21] внедрили решения на основе передачи сообщений, в которых доступ к именному пространству файловой системы происходит посредством «прокси» через монитор процессов, таким образом избегая ошибок состояния операции во время копирования аргументов и именного пространства, но позволяя дальнейший доступ непосредственно через дескриптор файла.

8.3 Интеграция безопасности и параллелизма
Более гибкое, если не более сложное решение – убрать состояния операции между расширениями безопасности и ядром путем внедрения проверок безопасности самим ядром. Вызовы расширений безопасности происходят в самом ядре, по отношению к объекту, который они контролируют. Например, проверки контроля доступа производились бы во время блокирования процесса во избежание изменений в объединенном контексте.

Поскольку системные вызовы разрабатывались с целью предотвращения изменений ОС, это может казаться противоречивым, хотя переход на системы с открытым кодом и адаптация к расширениям безопасности привели к созданию самими производителями фреймворков безопасности. Этот вариант был внедрен в FLASK в SELinux, SEBSD, и SEDarwin [22], TrustedBSD MAC Framework в FreeBSD и Mac OS X [23], kauth в NetBSD и Mac OS X [1, 9] и Linux Security Modules [24]. Уровень интеграции зависит от систем: на одних он экстремальный – TrustedBSD MAC Framework устанавливает блокировки объектов для каждой записи в ядре, позволяя политикам полагаться на блокировки ядра для защиты объединенных проверок контроля доступа. На других – kauth Фреймворк позволяет обратные вызовы в пространство пользователя, что защищает от удержания блокировок над проверкой.

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

9. Заключение
В данной статье мы исследовали уязвимости параллельной обработки данных в реализации системного вызова, споря о том, что корректность по отношению к параллельной обработке данных важно не только для предотвращения блокировок, но также и критично для контроля доступа и аудита. Мы продемонстрировали, что некоторые системные обработчики уязвимы к обычным классам уязвимостей параллельной обработки данных, позволяя повышение привилегий и обход обнаружения вторжения. Эти уязвимости возникают из фундаментального архитектурного разграничения обработчиков и стратегий синхронизации ядра. Мы также продемонстрировали, что большинство разработанных решений также подвержены уязвимостям, также как и семантическая или производительная деградация, и что архитектурные решения требуют более тесной интеграции безопасности в ядро.

 

Ссылки:

[1] Kernel Authorization. Technical Note TN2127, Apple Computer, Inc., 2007. http://developer.apple.com/technotes/tn2005/tn2127.html
[2] R. P. Abbott, J. S. Chin, J. E. Donnelley, W. L. Konigsford, S. Tokubo, and D. A. Webb. Security Analysis and Enhancements of Computer Operating Systems. Technical Report NBSIR 76-1041, National Bureau of Standards, April 1976.
[3] M. Accetta, R. Baron, D. Golub, R. Rashid, A. Tevanian, and M. Young. Mach: A New Kernel Foundation for UNIX Development. Technical report, August 1986.
[4] James P. Anderson. Computer Security Technology Planning Study. Technical report, Electronic Systems Division, Air Force Systems Command, Hanscom Field, Bedford, MA 01730, October 1972.
[5] Richard Bisbey and Dennis Hollingworth. Protection Analysis: Final Report. Technical Report ISI/SR-78-13, Information Sciences Institute, University of Southern California, May 1978.
[6] Matt Bishop and Michael Dilger. Checking for race conditions in file accesses. Computing Systems, 9(2):131–152, Spring 1996.
[7] Pawel Jakub Dawidek and Slawomir Zak. CerbNG: system firewall mechanism, 2007. http://cerber.sourceforge.net/
[8] Drew Dean and Alan J. Hu. Fixing Races for Fun and Profit: How to use access(2). In Proc. 13th USENIX Security Symposium, August 2004.
[9] Elad Efrat. kauth: kernel authorization framework. In NetBSD Kernel Developer’s Manual. January 2007. http://www.netbsd.org/_elad/recent/man/kauth.9.html
[10] William L. Fithen. Follow the Rules Regarding Concurrency Management. BuildSecurityIn, October 2005. https://buildsecurityin.us-cert.gov/daisy/bsi/articles/knowledge/guidelines/332.html
[11] Timothy Fraser. LOMAC: Low Water-Mark Integrity Protection for COTS Environments. In Proc. 2000 IEEE Symposium on Security and Privacy, 2000.
[12] Timothy Fraser, Lee Badger, and Mark Feldman. Hardening COTS Software with Generic Software Wrappers. In Proc. 1999 IEEE Symposium on Security and Privacy, May 1999.
[13] T. Garfinkel, B. Pfa, and M. Rosenblum. Ostia: A delegating architecture for secure system call interposition. In Proc. Internet Society 2003, 2003.
[14] Tal Garfinkel. Traps and Pitfalls: Practical Problems in in System Call Interposition Based Security Tools. In Proc. Network and Distributed Systems Security Symposium, February 2003.
[15] Douglas P. Ghormley, David Patrou, Steven H. Rodrigues, and Thomas E. Anderson. SLIC: An Extensibility System for Commodity Operating Systems. In Proc. USENIX Annual Technical Conference (NO 98), June 1998.
[16] Kristaps Johnson and Maikls Deksters. sysjail: systrace userland virtualization, 2007. http://sysjail.bsd.lv/
[17] Poul-Henning Kamp and Robert N. M. Watson. Jails: Confining the omnipotent root. In Proc. 2nd International SANE Conference, 2000.
[18] Calvin Ko, Timothy Fraser, Lee Badger, and Douglas Kilpatrick. Detecting and Countering System Intrusions Using Software Wrappers. In Proc. 9th Usenix Security Symposium, August 2000.
[19] Todd C. Miller. Sudo, 2007. http://www.gratisoft.us/sudo/
[20] Niels Provos. Improving Host Security with System Call Policies. In Proc. 12th USENIX Security Symposium, Washington, DC, August 2003.
[21] Mark Seaborn. Plash: tools for practical least privilege, 2007. http://plash.beasts.org/
[22] Ray Spencer, Stephen Smalley, Peter Loscocco, Mike Hibler, David Anderson, and Jay Lepreau. The Flask Security Architecture: System Support for Diverse Security Policies. In Proc. 8th USENIX Security Symposium, August 1999.
[23] Robert Watson, Brian Feldman, Adam Migus, and Chris Vance. Design and Implementation of the TrustedBSD MAC Framework. In Proc. Third DARPA Information Survivability Conference and Exhibition (DISCEX), IEEE, April 2003.
[24] Chris Wright, Crispan Cowan, James Morris, Stephen Smalley, and Greg Kroah-Hartman. Linux Security Modules: General Security Support for the Linux Kernel. In Proc. 11th USENIX Security Symposium, August 2002.
[25] Michal Zalewski. Delivering Signals for Fun and Profit: Understanding, exploiting and preventing signal-handling related vulnerabilities. 2001. http://www.bindview.com/Services/Razor/Papers/2001/signals.cfm

Ваша приватность умирает красиво, но мы можем спасти её.

Присоединяйтесь к нам!