Группа исследователей из Амстердамского свободного университета опубликовала инструментарий Kasper, предназначенный для выявления в ядре Linux отрывков кода, которые можно использовать для эксплуатации уязвимостей класса Spectre, вызванных спекулятивным выполнением кода процессором. Исходные тексты инструментария распространяются под лицензией Apache 2.0.
Напомним, что для проведения таких атак, как Spectre v1, дающих возможность определить содержимое памяти, требуется наличие в привилегированном коде определённой последовательности команд (гаджетов), приводящей к спекулятивному выполнению инструкций. В целях оптимизации процессор начинает выполнять подобные гаджеты в спекулятивном режиме, потом определяет, что предсказание ветвления не оправдалось и откатывает операции в исходное состояние, но обработанные в процессе спекулятивного выполнения данные оседают в кэше и микроархитектурных буферах и доступны для извлечения из них с использованием различных методов определения остаточных данных по сторонним каналам.
Ранее доступные инструменты для сканирования гаджетов для уязвимости Spectre, основанные на поиске типовых шаблонов, показывали очень высокий уровень ложных срабатываний, пропуская при этом много реальных гаджетов (эксперименты показали, что 99% выявленных подобными инструментами гаджетов не могли использоваться для атак, а 33% рабочих гаджетов, способных привести к атаке, не были замечены).
Для повышения качества определения проблемных гаджетов Kasper моделирует уязвимости, которые атакующий может использовать на каждом шаге осуществления атак класса Spectre - моделируются проблемы, позволяющие контролировать данные (например, подстановка данных атакующего в микроархитектурные структуры для влияния на последующее спекулятивное выполнения при помощи атак класса LVI), получать доступ к конфиденциальной информации (например, при выходе за границы буфера или использовании памяти после её освобождения) и организовывать утечку конфиденциальной информации (например, анализируя состояние процессорного кэша или используя метод MDS).
При тестировании ядро связывается с runtime-библиотеками Kasper и проверками, работающими на уровне LLVM. В процессе проверки производится эмуляция спекулятивного выполнения кода, реализованная при помощи механизма checkpoint-restore, который специально выполняет неверно предсказанную ветвь кода, после чего откатывается к исходному состоянию до начала ветвления. Kasper также пытается моделировать различные программные и аппаратные уязвимости, анализирует влияние архитектурных и микроархитектурных эффектов, и выполняет fuzzing-тестирование возможных действия атакующего. Для анализа потоков исполнения используется порт DataFlowSanitizer для ядра Linux, а для fuzzing-тестирования модифицированная версия пакета syzkaller.
В ходе сканирования ядра Linux при помощи Kasper выявлено 1379 ранее неизвестных гаджетов, потенциально приводящих к утечке данных в ходе спекулятивного выполнения инструкций. Отмечается, что возможно лишь часть из них может представлять реальные проблемы, но для демонстрации того, что имеется и реальная опасность, а не только теоретическая, для одного из проблемных отрывков кода был разработан рабочий прототип эксплоита, приводящий к утечке информации из памяти ядра.
Напомним, что для проведения таких атак, как Spectre v1, дающих возможность определить содержимое памяти, требуется наличие в привилегированном коде определённой последовательности команд (гаджетов), приводящей к спекулятивному выполнению инструкций. В целях оптимизации процессор начинает выполнять подобные гаджеты в спекулятивном режиме, потом определяет, что предсказание ветвления не оправдалось и откатывает операции в исходное состояние, но обработанные в процессе спекулятивного выполнения данные оседают в кэше и микроархитектурных буферах и доступны для извлечения из них с использованием различных методов определения остаточных данных по сторонним каналам.
Ранее доступные инструменты для сканирования гаджетов для уязвимости Spectre, основанные на поиске типовых шаблонов, показывали очень высокий уровень ложных срабатываний, пропуская при этом много реальных гаджетов (эксперименты показали, что 99% выявленных подобными инструментами гаджетов не могли использоваться для атак, а 33% рабочих гаджетов, способных привести к атаке, не были замечены).
Для повышения качества определения проблемных гаджетов Kasper моделирует уязвимости, которые атакующий может использовать на каждом шаге осуществления атак класса Spectre - моделируются проблемы, позволяющие контролировать данные (например, подстановка данных атакующего в микроархитектурные структуры для влияния на последующее спекулятивное выполнения при помощи атак класса LVI), получать доступ к конфиденциальной информации (например, при выходе за границы буфера или использовании памяти после её освобождения) и организовывать утечку конфиденциальной информации (например, анализируя состояние процессорного кэша или используя метод MDS).
При тестировании ядро связывается с runtime-библиотеками Kasper и проверками, работающими на уровне LLVM. В процессе проверки производится эмуляция спекулятивного выполнения кода, реализованная при помощи механизма checkpoint-restore, который специально выполняет неверно предсказанную ветвь кода, после чего откатывается к исходному состоянию до начала ветвления. Kasper также пытается моделировать различные программные и аппаратные уязвимости, анализирует влияние архитектурных и микроархитектурных эффектов, и выполняет fuzzing-тестирование возможных действия атакующего. Для анализа потоков исполнения используется порт DataFlowSanitizer для ядра Linux, а для fuzzing-тестирования модифицированная версия пакета syzkaller.
В ходе сканирования ядра Linux при помощи Kasper выявлено 1379 ранее неизвестных гаджетов, потенциально приводящих к утечке данных в ходе спекулятивного выполнения инструкций. Отмечается, что возможно лишь часть из них может представлять реальные проблемы, но для демонстрации того, что имеется и реальная опасность, а не только теоретическая, для одного из проблемных отрывков кода был разработан рабочий прототип эксплоита, приводящий к утечке информации из памяти ядра.