Создание специализированных UEFI-прошивок 

  • Добавление Measured Boot с привлечением TPM для запуска операционных систем на базе Linux и других.
  • Исследование и применение Intel Boot Guard и иных методов обеспечения корня доверия к платформе.
  • Добавление защиты от DMA атак на ранних стадиях запуска прошивки UEFI и расширение профилей DMAR для изоляции устройств.
  • Классификация и создание профилей доступа к подключаемым устройствам.
  • Использование WIM-образов для проверки целостности и запуска изолированных базовых образов с Windows.
  • Добавление LLVM Sanitizers (ASan, MSan, UBSan) в UEFI код на базе EDK II.
  • Расширение возможностей статического анализа кода UEFI и написание моделей функций для лучшего выявления ошибок, включая Taint-анализ.
  • Создание минимального образа операционной системы для конфигурирования возможностей UEFI-прошивки.
  • Разработка и исследование безопасности драйверов файловых систем для EDK II: BTRFS, EXT4, ExFAT и др.
  • Добавление поддержки нового формата исполняемых файлов в прошивке UEFI на базе EDK II.

Низкоуровневые компоненты встраиваемых ОС

  • Разработка кода начальной загрузки платформы (bare metal firmware/loader) для встраиваемых систем с построением корня доверия (главным образом для платформ на базе ARM, PowerPC и RISC-V).
  • Разработка модулей поддержки платформы (PSP/ASP/BSP) на базе архитектур MIPS, SPARC, PowerPC64 и других.
  • Расширение списка поддерживаемых платформ на ARM, таких как одноплатные компьютеры общего назначения, и более глубокая их интеграция.
  • Добавление поддержки доступа к таймерам из userspace с минимальными накладными расходами и изоляцией.
  • Добавление поддержки BSP на базе CHERI (Capability Hardware Enhanced RISC Instructions).
  • Добавление поддержки внешнего контроллера кэшей на ARMv7-A, а также других механизмов кэширования на различных архитектурах.
  • Обеспечение защиты памяти W^X с момента начального запуска загрузчика встраиваемой операционной системы.
  • Написание драйверов для эффективной работы с различными видами флеш-памяти и проектирование интерфейсов к ним.
  • Обеспечение лучшей изоляции процессов при переключении задач посредством гибкой конфигурации механизмов кэширования на процессоре.
  • Реализация гипервизора для аппаратного разделения доступа между параллельно запущенными операционными системами на одном устройстве для различных архитектур.
  • Разработка детерминированной реализации Thread Local Storage для разных архитектур.
  • Реализация стековых канареек, явной очистки стека после обработки системного вызова и других механизмов контроля потока управления программного кода на различных платформах.
  • Добавление поддержки механизма обработки исключений при выполнении операций с плавающей точкой на различных архитектурах.
  • Добавление поддержки DSP-ускорителей для снижения нагрузки на основной процессор.
  • Добавление поддержки GDB stub на различных архитектурах. Расширение возможностей по просмотру содержимого памяти и операции step.
  • Выявление и обход ошибок округления при вычислениях с плавающей запятой на различных процессорах или при использовании отдельных конфигураций компиляторов.
  • Оптимизация реализации системных вызовов и обработчиков прерываний на различных архитектурах.

Архитектурно-независимые компоненты встраиваемых ОС

  • Разработка минимальной верифицируемой библиотеки встроенных функций компилятора (compiler builtins) и её оптимизация для разных архитектур.
  • Разработка интегрируемого модуля извлечения данных и конфигурации из работающей программы в пользовательском пространстве на лету с целью последующего её обновления с переиспользованием исходного состояния.
  • Разработка тестов и доработка концепции обеспечения встроенного диагностирования корректной работы ОСРВ и оборудования (BITE, BIST) на разных этапах функционирования.
  • Реализация и оптимизация компонентов стандартной библиотеки языка C 2018 года и их последующее тестирование и верификация:
    • поддержка многобайтовых строк и юникода;
    • печать чисел с плавающей точкой с гарантированной точностью;
    • оптимизация libm по точности и под целевые платформы;
    • интеграция аллокаторов памяти с различными стратегиями и их интеграция с LLVM Sanitizers;
    • расширение поддержки POSIX и BSD расширений.
  • Расширение языковой поддержки ADA/SPARK, С++, Modula 2, Rust и др.
  • Интерактивный монитор для контроля состояния операционной системы и выполнения операций управления в отладочном режиме.
  • Реализация файловой системы как хранилища данных в отладочном режиме с прозрачным обновлением, например, через сетевой стек.
  • Создание конфигурируемого монитора состояний для обработки пользовательских ошибок с большей гранулярностью, чем классический монитор состояний ARINC 653.
  • Добавление поддержки профилирования при использовании нескольких разделов в ARINC 653 окружении.
  • Разработка механизмов сетевого обновления операционной системы. Реализация поддержки TFTP-клиента и механизмов аутентификации обновления.
  • Разработка интерфейса ARINC 653 на языке C++.

Инструментарий для работы со встраиваемыми ОС

  • Расширение возможностей встроенного ассемблера компиляторов clang и gcc для поддержки новых инструкций или вариаций кодирования существующих инструкций.
  • Добавление поддержки PowerPC SPE в компилятор gcc и последующая интеграция с upstream.
  • Добавление поддержки механизмов обхода errata в процессорах MIPS на уровне компилятора и их интеграция в upstream для gcc и clang.
  • Расширение конфигураций gcc для лучшей поддержки bare-metal платформ (targets) на базе AArch64, PowerPC64 и других.
  • Обеспечение детерминизма эмуляции в QEMU и обеспечение сходной производительности для процессоров с тривиальным устройством конвейера и отсутствием нелинейного исполнения на архитектуре MIPS.
  • Адаптация инструмента вычисления размера стека в наихудшем случае (WCSU) для работы с бинарными компонентами и при использовании кода с неявной передачей управления.
  • Автоматическое и полуавтоматическое вычисление времени наихудшего выполнения кода (WCET). Анализ времени работы в худшем случае с учётом кэширования, периферийных устройств и независимо работающих ОС на различных ядрах.
  • Выявление недетерминированного поведения при эмуляции целевой платформы с помощью QEMU и иных инструментов и их устранению с целью обеспечения воспроизводимых результатов, в том числе при использовании многоядерного ПО (AMP и SMP).
  • Разработка сервера преобразования данных с последовательного порта (UART/COM) в TCP/IP, устойчивого к помехам и разрывам соединения.
  • Создание средств автоматического развёртывания окружения разработчика на инструментальной машине по декларативному описанию.
  • Создание инструмента для автоматизации проведения инспекций кода для непроверяемых через тестирование сценариев.
  • Улучшение интеграции с gdbserver на JTAG устройствах и в эмуляторах: поддержка inferior, получение класса памяти по его адресу в условиях статической конфигурацией памяти.

Тестирование и верификация встраиваемых ОС

  • Адаптация инструментов автоматической верификации для специализированных операционных систем.
  • Создание инструмента поиска потенциально проблемных мест в конфигурации интеграционного проекта ARINC 653.
  • Добавление поддержки фаззинга различных компонентов операционной системы: системных вызовов, сетевых драйверов и других компонентов, в том числе с привлечением символьного выполнения.
  • Разработка методики тестирования и реализация тестового набора для интерфейса файловых систем ARINC 653 Part II с поиском узких мест производительности.
  • Добавление поддержки инструментов поиска гонок во встраиваемых системах на базе ThreadSanitizer в ядре и пользовательском режиме.
  • Добавление поддержки инструментов поиска ошибок работы с памятью (AddressSanitizer, MemorySanitizer) на платформых с малым количеством ОЗУ (несколько мегабайт).
  • Формализация требований стандарта на кодирование и проведение статического анализа на их соответствие с помощью различных инструментов, включая libTooling и Clang, а также дальнейший автоматический рефакторинг кодовых баз.
  • Расширение возможностей механизмов сбора покрытия. Оптимизация передачи данных по собранному покрытию. Реализация сбора покрытия по MC/DC и другим техникам.
  • Моделирование поведения кода операционной системы в функциях на ассемблере или на стыке уровней привилегий процессора для улучшения эффективности статического анализа.
  • Кодогенерация встроенных проверок через assert и средства LLVM Sanitizers на основе требований, написанных на полуформальном языке.
  • Сбор трасс выполнения кода по моделям для применения в статических анализаторах.
  • Проектирование архитектуры и тестирование сетевого стека нижнего уровня для AFDX сетей в ARINC-совместимой ОСРВ на примере DPAA/DTSEC и GRETH.
  • Автоматизация создания и тестирования дистрибутивов виртуальных машин разработчика ОСРВ в CI на базе Buildbot.

Обеспечение безопасности ядра Linux

  • Unit-тестирование отдельных подсистем.
  • Тестирование на основе моделей.
  • Фаззинг системных вызовов, протоколов, драйверов, отдельных «библиотечных» компонентов, в том числе с написанием грамматик.
  • Написание полносистемных тестов для проверки конформности реализации стандарта POSIX и других.
  • Статический анализ с написанием моделей.
  • Разработка средств автоматической верификации отдельных компонентов.

К.ф.-м.н. Алексей Хорошилов, Виталий Чепцов