Как заразить видео. Поиск уязвимостей в декодерах H.264
Современные стандарты сжатия видео — настоящее чудо скрытой сложности и результат десятилетий научной работы. Спецификация H.264 — это около 800 страниц правил, определяющих, как декодировать видео. Но чем больше сложности, тем выше риски для безопасности, легче пропустить ошибку в битовом потоке, который слишком труден для понимания и декодирования.
Если посмотреть на экосистему декодирования, то здесь в связке работают инструменты на нескольких уровнях из аппаратных ускорителей на CPU и GPU (список производителей аппаратных декодеров), драйверов и привилегированных программных компонентов. Все вместе они образуют сложнейший неоднородный коктейль привилегированного, практически нетестируемого и уязвимого кода.
В итоге мы приближаемся к тому, что вирусы можно будет незаметно интегрировать в видеоролики и распространять через популярные видеоплатформы, эксплуатируя уязвимости в аппаратных декодерах на смартфонах и в программных декодерах браузеров на ПК.
Группа исследователей Вилли Васкес (Willy R. Vasquez), Стивен Чеквей (Stephen Checkoway) и Ховав Шахам (Hovav Shacham) из университета Остина (США) и Оберлинского колледжа (США) поставили целью изучить безопасность современной инфраструктуры распространения видео, а конкретно — видеодекодеров H.264 как самого популярного формата видео на сегодняшний день. Они разработали специальный фреймворк H26Forge для анализа, генерации и манипуляции синтаксически корректными, но семантически не стандартными видеороликами. Такие видеоролики формально соответствуют формату H.264, но вызывают различные сбои в работе декодеров.
Рис. 1. Архитектура H26Forge (30 000 строк кода на Rust)
С помощью этого фреймворка исследователи обнаружили ряд багов в системе декодирования H.264 на разных платформах, включая повреждение памяти ядра в iOS, повреждение памяти в Firefox и VLC под Windows, а также ошибки в памяти видеоускорителей и в памяти приложений ядра процессора в нескольких устройствах Android.
Рис. 2
Все уязвимости официально задокументированы в бюллетенях CVE-2022–3266, CVE-2022–32939, CVE-2022–42846, CVE-2022–42850 и CVE-2022–22675.
Кодек H.264 работает, находя сходство между кадрами видео и кодируя эту информацию, а затем отправляя инструкции о том, как воссоздать изображение в конечной точке. Эти инструкции известны как элементы синтаксиса, а значения, которые они принимают, называются семантикой. Значения кодируются энтропией с помощью таких алгоритмов, как exp-Golomb, CABAC или CAVLC.
Вот некоторые элементы синтаксиса H.264:
С помощью изменения перечисленных параметрами можно манипулировать поведением декодера, чтобы он прочитал память за пределами выделенного массива. Например, на следующей иллюстрации схематично показан механизм эксплуатации уязвимости CVE-2022–22675.
Рис. 3. Эксплуатация уязвимости CVE-2022–22675. Слева правильно упорядоченный битовый поток H.264, считанный сверху вниз, а справа — декодированное содержимое в памяти по мере заполнения. Во второй строчке форсируется перезапись PPS значением num_ref_idx_ l0_active_minus1
, что приводит в итоге к записи в память значения произвольной длины путём регулировки смещения в каждом последующем фрагменте, записывая значения в обратном порядке. Код для эксплуатации уязвимости опубликован в листинге 2 на стр. 17–18
Результаты работы оформлены в научной статье, а в более популярной форме опубликованы в мастодон-треде одного из авторов.
Новый канал распространения вирусов
Можно вспомнить, какой дырой для безопасности всей компьютерной инфраструктуры был Adobe Flash, через плагины интегрированный во все браузеры и операционные системы. По сути, один и тот же монолитный плагин стоял на всех компьютерах в мире — и это делало его привлекательной мишенью для взлома. Единственная 0day-уязвимость открывает перед злоумышленниками все двери.
Есть опасность, что такой же универсальной отмычкой для злоумышленников станут кодеки H.264, а распространение вирусов начнётся через YouTube и другие популярные видеоплатформы — и через уязвимости в декодерах браузеров.
Рис. 4. Уязвимость CVE-2022–3266 с чтением памяти из-за границ выделенного диапазона в процессе некорректного программного рендеринга видео в браузере Firefox (исправлено в версии 105). Реализовано путём уменьшения значения SPS во фрейме H.264, что сломало декодер
Хотя на практике таких массовых атак мы ещё не встречали, но экосистема видео в интернете уже созрела для вирусов нового типа, считают исследователи. На форумах HN говорят, что цветная рябь на видео как массовая инфекция — это самое близкое к классической «лавине» (snowcrash), которую мы помним по культовому киберпанковскому произведению Стивенсона, придумавшему понятие «Метавселенная» в 1992 году.
Примечание. Перечисленные в данной статье уязвимости исправлены в последних версиях iOS, VLC и Firefox. Производители аппаратных декодеров H.264 для смартфонов уведомлены о проблеме. Авторы отмечают, что аналогичные уязвимости также присутствуют также в декодерах H.265, но разработанный фреймворк H26Forge не способен сгенерировать видеопоследовательности для их эксплуатации.