ГОСТ
====
1 апреля 2024 года был введён в действие ГОСТ Р 71206-2024 «Защита
информации. Разработка безопасного программного обеспечения. Безопасный
компилятор языков С/С++. Общие требования».
SAFEC выполняет требования, предъявляемые этим стандартом к безопасному
компилятору третьего, второго и первого классов.
База данных компиляции по ГОСТ: опция --dump-sbom
=================================================
ГОСТ Р 71206-2024 требует, чтобы для безопасного компилятора была
реализована функция по журналированию процесса трансляции. Результат
журналирования — база данных компиляции. В ней должны фиксироваться
имена файлов—единиц трансляции и подключаемых файлов, их хэш-коды по
ГОСТ 34.11-2018, команды компиляции. Также должна быть включена
информация, позволяющая идентифицировать программы, задействованные в
трансляции исходных текстов в исполняемый код, их настройки и
конфигурационные файлы.
Для создания подробной базы данных компиляции в виде JSON файлов
безопасный компилятор предоставляет опцию --dump-sbom <DIR>.
https://safecompiler.pages.ispras.ru/changelog/gcc/#introduce-sbom
Подробное описание опции с примером работы можно найти в руководстве
пользователя (README) безопасного компилятора в разделе «Журналирование
процесса трансляции: --dump-sbom».
Скрипт comp_db_parser из поставки SAFEC позволяет проанализировать
«состав» ПО на уровне отдельных файлов. Он обходит полученную с помощью
--dump-sbom базу данных компиляции от заданного результирующего файла и
выводит множество «листовых» файлов, участвовавших в качестве входных
при компиляции, и их хэши.
Эта реализация журналирования выполнена на уровне драйвера (программа
gcc) и компилятора (вспомогательные программы cc1/cc1plus). При этом
она имеет ограничения — случаи, которые не поддержаны или принципиально
не могут быть учтены в таком подходе. Например:
- Если утилиты (ассемблер/компоновщик) вызываются напрямую, а не через
gcc, эти команды не будут учтены.
- Для генерируемых исходных файлов с точки зрения получаемой базы данных
компиляции исходными будут считаться результаты генерации.
- Если при компоновке используется linker script, меняющий имя выходного
файла, оно будет учтено неправильно.
- В режиме создания precompiled header'ов (.pch/.gch файлов) выходные
файлы не учитываются правильно. (Пока не поддерживается.)
- Набор конфигурационных файлов утилит в некоторой степени «угадывается»
т.е. строится на основе наших знаний о тулчейне. Если потребуется его
расширить, нужно будет внести изменения в компилятор.
Sbom-trace — отдельная утилита, не зависящая от компилятора
===========================================================
Перечисленные выше ограничения побудили нас создать инструмент, решающий
задачу в общем виде. Рабочее название этого инструмента — sbom-trace.
Он учитывает требования ГОСТ Р 71206-2024 в части журналирования
процесса трансляции.
Этот инструмент не зависит от компилятора и используемых языков
программирования. Принцип его работы основан на перехвате системных
вызовов с помощью ptrace. Его использование выглядит таким образом:
sbom-tracer -p sbom-postprocessor.py <build...>
где <build...> — команда сборки, sbom-postprocessor.py — скрипт,
входящий в состав инструмента.
Этот инструмент имеет свои ограничения: работает только под Linux, и его
не получится применить, если в процессе сборки уже используется ptrace.
Артемий Гранат представит этот инструмент в докладе «Идентификация
реквизитов сборки через отслеживание системных вызовов» 21 июня на
конференции OS DAY 2024. Аннотация и тезиcы:
https://osday.ru/granat.html
Выход safe-13.3 и закрытие safe-13.2
====================================
Вышли первые релизы safe-13.3 — ветки безопасного компилятора SAFEC на основе
GCC 13.3. Согласно схеме версионирования, принятой в GCC, этот релиз содержит
исправления ошибок относительно 13.2 [1]. Переход на более высокую minor версию
(число после точки) не должен приводить к несовместимости.
В соответсвии с этим ветка safe-13.3 безопасного компилятора заменяет safe-13.2.
Ветка safe-13.2 закрыта, мы перестаём распространять и поддерживать релизы,
сделанные с неё, и рекомендуем перейти на новую версию.
RHash для хэширования при журналировании трансляции
===================================================
Для идентификации файлов функция журналирования процесса трансляции в безопасном
компиляторе вычисляет контрольные суммы, используя хэш-функцию, определённую
ГОСТ 34.11-2018 (ГОСТ Р 34.11-2012). В качестве реализации использовался
модифицированный код проекта streebog [2]. В новых версиях компилятора вместо
него используется RHash [3].
Это изменение никак не отражается на потребителях бинарных сборок, поставляемых
ИСП РАН. Как и ранее, функции хэширования статически скомпонованы с компилятором.
Для сборки из исходных кодов достаточно установить в систему пакет, содержащий
библиотеку и заголовочный файл rhash версии не ниже 1.38 т.е. имеющей реализацию
GOST R 34.11-2012. (Пакет имеет разное название в зависимости от дистрибутива:
rhash-devel, librhash-dev, rhash...)
Дополнительно предусмотрена опция конфигурации --with-rhash=PATH.
[1]: https://gcc.gnu.org/pipermail/gcc-announce/2024/000181.html
[2]: https://github.com/adegtyarev/streebog
[3]: https://github.com/rhash/RHash