Александр Попов, ведущий специалист отдела исследований безопасности операционных систем и аппаратных решений, Positive Technologies.
В 2011 году с отличием окончил Российский университет транспорта (МИИТ) по специальности "Компьютерная безопасность". Во время обучения в университете открыл для себя операционную систему GNU/Linux и решил связать с ней свой профессиональный путь. Начал с системного администрирования Linux, затем в 2012 году стал разработчиком ядра. С начала 2015 года работает в компании Positive Technologies, где занимается вопросами поиска уязвимостей в ядре Linux, методами их эксплуатации и средствами защиты. На данный момент более 20 патчей Александра приняты в ванильное ядро (Linux kernel mainline). В том числе исправление уязвимости CVE-2017-2636, которую он обнаружил и устранил весной 2017 года.
STACKLEAK - это функция безопасности ядра Linux, изначально разработанная специалистами Grsecurity/PaX. Александр решил довести STACKLEAK до официального ванильного ядра (Linux kernel mainline). В докладе будет рассказано о внутреннем устройстве данной функции безопасности и ее свойствах.
STACKLEAK защищает от нескольких классов уязвимостей в ядре Linux, а именно:
1. сокращает полезную для атакующего информацию, которую могут выдать утечки из
ядерного стека в пользовательское пространство;
2. блокирует некоторые атаки на неинициализированные переменные в стеке ядра;
3. предоставляет средства динамического обнаружения переполнения ядерного стека.
Данную работу Александр ведет уже год. Он поделится своим опытом взаимодействия с сообществом разработки ядра Linux.
STACKLEAK - это функция безопасности ядра Linux, изначально разработанная специалистами Grsecurity/PaX. Я решил довести STACKLEAK до официального ванильного ядра (Linux kernel mainline). В докладе я расскажу о внутреннем устройстве данной функции безопасности, ее свойствах и моем опыте взаимодействия с сообществом разработки Linux.
STACKLEAK защищает от нескольких классов уязвимостей в ядре Linux, а именно:
1. сокращает полезную для атакующего информацию, которую могут выдать утечки из ядерного стека в пользовательское пространство;
2. блокирует некоторые атаки на неинициализированные переменные в стеке ядра;
3. предоставляет средства динамического обнаружения переполнения ядерного стека.
Данная функция безопасности отлично укладывается в концепцию проекта Kernel Self Protection Project (KSPP)1: безопасность - это больше, чем только исправление ошибок. Абсолютно все ошибки в коде исправить невозможно, и поэтому ядро Linux должно безопасно отрабатывать в ошибочных ситуациях, в том числе при попытках эксплуатации уязвимостей. Это реализуется с помощью механизмов самозащиты ядра. Данный подход безусловно повышает безопасность и надежность операционной системы.
Порядок моей работы
STACKLEAK присутствует как PAX_MEMORY_STACKLEAK в grsecurity/PaX патче. Однако grsecurity/PaX патч перестал распространяться свободно с апреля 2017 года. Поэтому появление STACKLEAK в ванильном ядре было бы ценным для пользователей Linux с повышенными требованиями к информационной безопасности и надежности.
1. выделить STACKLEAK из grsecurity/PaX патча,
2. тщательно изучить код и сформировать патч,
3. отправить в LKML, получить обратную связь, улучшить, повторять заново до принятия в mainline.
На момент написания данного документа (11.04.2018) была отправлена 11 версия серии патчей для x86_64 и x86_322. В ней 24 файла изменено, 896 строк добавлено, 19 строк удалено. В серии 6 патчей:
1. gcc-plugins: Clean up the cgraph_create_edge* macros.
2. x86/entry: Add STACKLEAK erasing the kernel stack at the end of syscalls.
3. gcc-plugins: Add STACKLEAK plugin for tracking the kernel stack.
4. lkdtm: Add a test for STACKLEAK.
5. fs/proc: Show STACKLEAK metrics in the /proc file system.
6. doc: self-protection: Add information about STACKLEAK feature.
STACKLEAK: свойства безопасности
В первую очередь это очистка стека ядра в конце системного вызова. Данная мера сокращает полезную информацию, которую могут выдать некоторые утечки из ядерного стека в пользовательское пространство.
Как следствие, STACKLEAK блокирует некоторые атаки на неинициализированные переменные в стеке ядра. Примеры таких уязвимостей: CVE-2017-17712, CVE-2010-2963. Наконец, в ванильном ядре (Linux kernel mainline) STACKLEAK эффективен против переполнения стека «в глубину» (kernel stack depth overflow) в сочетании с CONFIG_THREAD_INFO_IN_TASK и CONFIG_VMAP_STACK.
Для объяснения сути перечисленных атак и методов их предотвращения в докладе будут представлены подробные схемы.
Внутреннее устройство STACKLEAK
STACKLEAK состоит из:
1. архитектурно зависимого кода, очищающего стек ядра в конце системного вызова,
2. GCC плагина для инструментации кода ядра на этапе компиляции.
В докладе будут детально разобраны принципы работы данных компонентов и влияние STACKLEAK на производительность системы.
Заключение
STACKLEAK - очень полезная функция безопасности ядра Linux, блокирующая эксплуатацию сразу несколько типов уязвимостей. Помимо этого изначальный автор PaX Team смог сделать ее быстрой и красивой в инженерном плане. Поэтому появление STACKLEAK в ванильном ядре было бы ценным для пользователей Linux с повышенными требованиями к информационной безопасности и надежности. Более того, моя работа в данном направлении привлекает внимание сообщества разработчиков Linux к средствам самозащиты ядра.
1 - http://www.kernsec.org/wiki/index.php/Kernel_Self_Protection_Project
2 - http://www.openwall.com/lists/kernel-hardening/2018/04/06/2