
Содержание
С развитием архитектуры компьютеров современные процессоры стали уязвимы для широкого спектра атак, использующих низкоуровневые аппаратные особенности. Микроархитектурные каналы — включая сторонние и скрытые каналы — трансформировались из теоретических курьезов в практические угрозы безопасности, позволяя атакующим утекать конфиденциальной информации, не вызывая классические сигналы тревоги о безопасности.
Особо тревожным случаем использования является создание высокоемких скрытых каналов, которые могут надежно передавать большие объемы секретной информации между двумя находящимися в сговоре процессами, даже через границы процессов или безопасности. Как было обнаружено и проанализировано в Understanding and Improving High Capacity Covert Channels via Microarchitectural Channel Engineering (HPCA 2015) и последующих исследованиях, эти векторы атак имеют реальное влияние и требуют тщательного анализа.
Этот пост объясняет микроархитектурные каналы от начинающих до продвинутых уровней, углубляется в то, как проектируются высокоемкие каналы, предоставляет примеры кода для выявления и измерения, рассматривает существующие меры по предотвращению и подробно описывает важность этой темы в современной кибербезопасности.
Микроархитектурные каналы возникают из физической реализации архитектуры процессора — так называемой "микроархитектуры". В то время как архитектура описывает, что делает процессор (набор команд), микроархитектура описывает, как он этого достигает (конвейеры, кэши, буферы, таблицы предсказателей и т.д.).
Процессоры разрабатываются для повышения производительности, а не для изоляции безопасности на уровне микроархитектуры. Общие ресурсы ведут к вариациям времени, доступности или поведения, которые могут быть использованы для утечки секретов.
Основная идея: Даже если два процесса не разделяют память, они могут разделять аппаратные средства, что позволяет им общаться.
Различие:
Сторонние каналы неумышленно утечают секреты; скрытые каналы строятся специально для коммуникации между конспирацией через границы безопасности.
Современные скрытые каналы могут быть разработаны для надежности и высокой емкости (пропускной способности), способной утекать значительные объемы данных за короткий промежуток времени. Давайте разберем, как это делают атакующие.
Для работы скрытых каналов необходимы общие микроархитектурные ресурсы. Как описано в AutoCC: Automatic Discovery of Covert Channels in Time-Division Multiplexed Processors (Princeton, 2023):
| Тип ресурса | Механизм примера | Вектор атаки |
|---|---|---|
| Кэши | Данные и инструкции кэша L1/L2/L3 | Prime+Probe, Flush+Reload |
| Предсказатели ветвлений | Таблицы истории направления, BTB, RSB | BranchShadowing |
| TLBs | Поделенные буферы поиска преобразований | Атаки типа TLBleed |
| Шины памяти | Банки DRAM, буферы строк | Каналы строк DRAM |
| Буферы предвыборки | Аппаратные предсказатели, жертвы предвыборки | Варианты Spectre |
Процесс отправителя может подготавливать набор кэша (загружать конкретные адреса). Получатель, работающий позже, проверяет время доступа к тем же адресам:
Описание:
Отправитель заполняет (подготавливает) набор кэша. Если зонд получателя показывает медленные чтения, он делает вывод, что кэш был заменен между зондами (что указывает на определенный бит).
Используется для:
Утечки данных из защищенных или песочниц (например, JavaScript в браузере) в недоброжелательные процессы.
Пропускная способность:
В зависимости от оборудования возможно несколько сотен килобит в секунду, как показано в HPCA 2015.
Описание:
Опирается на общую память, такую как библиотеки кода, отображаемые в тех же местах в нескольких процессах (например, через общие библиотеки в Linux).
Выявление является сложной задачей, поскольку операции скрытого канала имитируют безобидные паттерны доступа к ресурсам. Однако при тщательном измерении каналы можно обнаружить и охарактеризовать.
rdtsc на x86).Давайте рассмотрим практические шаги для исследователей по безопасности.
hwloc, lscpu, dmidecode# Печать топологии кэша и CPU
lscpu
hwloc-ls
dmidecode --type cache
import time
start = time.perf_counter_ns()
# Доступ к памяти/вызов функции
end = time.perf_counter_ns()
print(f"Время (нс): {end - start}")
Используйте rdtsc для измерения времени доступа.
#include <stdio.h>
#include <x86intrin.h>
int main() {
volatile int данные = 0;
unsigned long t1, t2;
int итерации = 1000;
for (int i = 0; i < итерации; i++) {
t1 = __rdtsc();
данные += i; // Доступ к памяти
t2 = __rdtsc();
printf("%lu\n", t2 - t1); // Печать количества тактов на доступ
}
return 0;
}
Предположим, у вас есть файл timings.txt (из верхнего примера C):
# Печать минимального, максимального, среднего времени
awk '{sum+=$1; if(min==""||$1<min) min=$1; if($1>max) max=$1} END {print "Мин:", min, "Мах:", max, "Сред:", sum/NR}' timings.txt
# Использование perf для мониторинга событий кэша (требуется root)
sudo perf stat -e cache-misses,cache-references -p <pid>
Как обсуждается в Prevention of Microarchitectural Covert Channels on an SoC (Wistoff et al. 2020):
perf, статические анализаторы и фирменные функции безопасности (например, Intel CAT, AMD SEV).Микроархитектурные скрытые каналы представляют собой сложный и продолжающийся класс угроз в кибербезопасности. По мере того как атакующие разрабатывают надежные и высокоемкие каналы, использующие совместное использование аппаратных ресурсов, защитники должны сочетать аппаратные, ОС и программные стратегии для предотвращения этих каналов.
Понимание как и почему этих уязвимостей позволяет практикам выявлять, предотвращать и минимизировать риск. С продолжающимися исследованиями, от HPCA 2015 до инструментов, таких как AutoCC, и современных работ, борьба между атакующими и защитниками продолжается на самых низких уровнях вычислительной техники.
Автор [Ваше Имя], Исследователь кибербезопасности — [Ваш сайт/контакт]
Если вы нашли этот контент ценным, представьте, чего вы могли бы достичь с нашей комплексной 47-недельной элитной обучающей программой. Присоединяйтесь к более чем 1200 студентам, которые изменили свою карьеру с помощью техник Подразделения 8200.