惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

K
Kaspersky official blog
P
Privacy International News Feed
Simon Willison's Weblog
Simon Willison's Weblog
V
Vulnerabilities – Threatpost
Know Your Adversary
Know Your Adversary
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
P
Palo Alto Networks Blog
NISL@THU
NISL@THU
C
Cybersecurity and Infrastructure Security Agency CISA
S
Securelist
Scott Helme
Scott Helme
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
Google Online Security Blog
Google Online Security Blog
G
GRAHAM CLULEY
Project Zero
Project Zero
P
Privacy & Cybersecurity Law Blog
I
Intezer
T
Threatpost
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
Y
Y Combinator Blog
大猫的无限游戏
大猫的无限游戏
S
Schneier on Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
博客园 - Franky
小众软件
小众软件
S
Security Affairs
人人都是产品经理
人人都是产品经理
量子位
Help Net Security
Help Net Security
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
PCI Perspectives
PCI Perspectives
雷峰网
雷峰网
A
Arctic Wolf
Apple Machine Learning Research
Apple Machine Learning Research
罗磊的独立博客
博客园 - 聂微东
H
Hacker News: Front Page
Jina AI
Jina AI
博客园 - 叶小钗
C
CXSECURITY Database RSS Feed - CXSecurity.com
L
LINUX DO - 最新话题
Latest news
Latest news
The Last Watchdog
The Last Watchdog
W
WeLiveSecurity
酷 壳 – CoolShell
酷 壳 – CoolShell

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Кто решает судьбу вашего проекта? Разбираем заинтересованные стороны. BABOK #1 Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как Фалькон Тех меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Автоматизация SBOM в большом legacy-проекте: опыт LibreOffice и Collabora Online
Артем Максимов · 2026-06-10 · via Все публикации подряд на Хабре

Вот уже более 20 лет проходит масштабная конференция разработчиков свободного и открытого ПО – FOSDEM. Для CodeScoring она примечательна тем, что с 2021 года на ней регулярно представлен тематический деврум "SBOMS and supply chains", посвященный составу программного обеспечения и цепочкам поставок.

Эта статья – адаптация доклада "LibreOffice and Collabora Online – how we managed to automate SBOM generation for a large legacy project", с которым Торстен Беренц выступил на конференции в 2026 году. Специально для вас мы перевели выступление и превратили его в статью, оригинал доклада на английском языке – по ссылке.

Закон о киберустойчивости (Cyber Resilience Act, CRA, новые европейские требования к созданию ПО) поэтапно вступает в силу, и многим из европейских компаний нужно срочно разбираться со списками компонентов ПО (ППК/SBOM).

В России тема SBOM также встроена в контекст безопасной разработки: ГОСТ Р 56939-2024 относит композиционный анализ к обязательным процессам контроля сторонних компонентов и известных уязвимостей. То есть SBOM становится не просто документом, а частью регулярной работы с составом ПО.

Для продуктов с повышенным уровнем доверия или сертификацией правила формальнее – в рамках требований ФСТЭК России необходимо предоставлять перечень заимствованных компонентов в установленном формате.

Вернемся же к Collabora и истории о том, как в компании обзавелись своим собственным опытом создания SBOM для достаточно сложного продукта — Collabora Online, онлайн-офисного пакета с открытым исходным кодом, построенного на ядре LibreOffice.

Заголовок доклада обещает полностью автоматизированную генерацию SBOM, но реальность, как всегда, внесла свои коррективы. Автор доклада и его коллеги достигли определенных успехов, но это история о начале большого пути, а не о финише.

Передаем слово Торстену!

Об авторе: Торстен — эксперт LibreOffice и Collabora, глубоко разбирающийся в отраслевых стандартах. За свои 25 лет в проекте он успел покопаться в самых разных уголках кода: от системы сборки и библиотек абстракции платформы до Impress и Writer.

По образованию Торстен — программист, по призванию — фанат свободного ПО. Начинал ещё в Sun Microsystems, работал над известной альтернативой Microsoft Office, OpenOffice.org, а затем стал одним из основателей The Document Foundation и проекта LibreOffice.

Сейчас в его повседневной работе много проектного менеджмента и общения с заказчиками, но это не мешает ему время от времени всё ещё возиться с кодом. Недавно он объединил свою компанию с Collabora, чтобы с новыми силами помогать заказчикам переходить на суверенное открытое ПО.

С чего мы начинали и с чем столкнулись

Наша цель — полная прозрачность и отслеживаемость всех артефактов продукта, чтобы соответствовать требованиям CRA. Для контейнерных образов мы уже многое умеем, но Collabora Online — это особый случай, так как под капотом у нас технологический микс:

  • ядро: LibreOffice Core (колоссальный проект на C++);

  • фронтенд: JavaScript и TypeScript со своей экосистемой;

  • нативные зависимости: более 100 библиотек на C/C++;

  • «пограничники»: шрифты, словари, для которых нет готовых автоматических решений.

Вдобавок ко всему стандарты CRA до сих пор формируются, так что процесс напоминает ремонт автомобиля на полном ходу.

Первые шаги: ручной труд и выбор инструмента

Аудит текущего состояния SBOM выявил печальную картину — не было ничего. Мы изучили вопрос, пообщались с экспертами и, чтобы сдвинуться с мертвой точки, выбрали формат SPDX (без особых причин, просто надо было с чего-то начинать).

Первая и самая очевидная задача — собрать информацию о лицензиях. Для Collabora Online мы решили сделать это вручную, так как количество прямых зависимостей было управляемым. Мы составили список JavaScript-зависимостей (к счастью, там не было типичного npm-ада с тысячами вложенных пакетов), затем добавили шрифты, которые неожиданно обнаружились в консоли администратора.

С зависимостями C++ на верхнем уровне все было не очень хорошо — несколько десятков библиотек и сам LibreOffice Core. Мы добавили их вручную, но для автоматизации версий подключили систему сборки, чтобы она могла хотя бы подтягивать автоматически номера версий.

Шрифты, словари и прочие «простые» вещи

Казалось бы, шрифт — это просто картинка. Но нет. У него есть лицензия, значит, он должен быть в SBOM. Более того, это бинарный артефакт. А если копнуть глубже — механизмы хинтинга в шрифтах содержат настоящий код, выполняющийся в виртуальной машине. Это уже потенциальная поверхность для атаки. И для полной безопасности нам нужно знать версию шрифта, его хэш и проверять наличие CVE.

Со словарями ситуация немного проще (в основном лицензия), но и они должны быть в списке. В итоге, помимо кода, нам нужно учитывать еще 50 словарей и сотни шрифтов. Мы надеялись, что кто-то уже автоматизировал учет шрифтов в SBOM, но, к сожалению, на практике эта проблема не решена и соответствующие баг-репорты до сих пор открыты. Чуда не произошло.

LibreOffice Core

Итак, что у нас есть по состоянию на январь 2025 года? Для Collabora Online есть система, которая генерирует список лицензий для прямых зависимостей. Мы можем видеть 26 взаимосвязей и версии, полученные из системы сборки.

LibreOffice — это огромная, сложная и проблемная часть проекта, которую нельзя игнорировать и с которой трудно работать: с историей, 10 миллионами строк кода, более чем 100 сторонними C/C++ библиотеками и кучей шрифтов. Ручное описание всех его внутренних зависимостей — это титанический и неблагодарный труд, который устареет быстрее, чем мы его закончим. Это нужно автоматизировать любой ценой.

В поисках автоматизации для C/C++

Проблема в том, что для C и C++ нет единого стандарта сборки и менеджера пакетов, как, например, в Go, Java или Python*. Каждая библиотека может использовать свою легаси-систему. Но есть и хорошая новость: система сборки самого LibreOffice (довольно специфичная и основанная на OpenOffice, релиз которой состоялся в 2002 году) знает всё, что она собирает. Она динамическая, позволяет включать и отключать функции, и именно она в итоге упаковывает все в форматы DEB, RPM или MSI.

Мы решили пойти этим путем и написали патч, который вытаскивает из системы сборки линейный список всех зависимостей, которые реально попадают в продукт. Это позволило нам сгенерировать минимальный SBOM, включающий все сторонние компоненты и их лицензии.

*Прим. ред. Конечно, для C/C++ существуют менеджеры зависимостей, например, Conan и vcpkg. Но далеко не все проекты готовы переходить на них из-за исторически сложившихся систем сборки, требований к совместимости и устоявшихся процессов разработки. Поэтому в таких проектах часто приходится работать с тем, что уже знает их собственная сборочная система.

От лицензий к безопасности: требования BSI

CRA требует не просто наличие списка лицензий, а возможности оценивать уязвимости. Немецкое ведомство по безопасности BSI выпустило подробные рекомендации, которые, хоть и не являются обязательным, задают высокую планку.

Если следовать ему, то нам нужно для каждого файла на диске (включая скрипты Python, макросы и, возможно, шрифты) понимать его происхождение. А именно:

  1. Имя компонента.

  2. Контрольная сумма (для проверки целостности).

  3. Идентификатор CPE (Common Platform Enumeration), чтобы привязать к нему CVE. Проблема в том, что для большинства старых C++ библиотек CPE просто не существует.*

  4. Заявленная и фактическая лицензия (они могут отличаться).

  5. Информация о системных библиотеках, с которыми слинкован бинарный файл (это ответственность дистрибутива, но мы должны это идентифицировать).

Это внушительный объем работы, который к тому же зависит от платформы: SBOM для Windows будет отличаться от SBOM для Linux.

*Прим.ред.: формально CPE-строку можно составить самостоятельно: это структурированный формат именования продуктов, а не идентификатор, который обязательно должен быть заранее зарегистрирован для каждой библиотеки. Однако для автоматического сопоставления с уязвимостями важна не только корректность строки, но и ее совпадение с тем, как компонент описан в публичных базах. Для старых C/C++ библиотек такой надежной привязки часто нет, поэтому самостоятельно составленный CPE может не помочь найти связанные CVE или, наоборот, привести к ложным совпадениям.

Что дальше?

Наш план — выжимать всю информацию из системы сборки. И если с прямыми зависимостями мы справились, то для получения полной картины (включая динамические связи и данные о сторонних библиотеках внутри Core) нам придется копаться в системах сборки. Это серьезная задача.

Самое печальное, что мы находимся на вершине стека. Мы не можем просто сказать «пусть авторы библиотек делают SBOM». Многие из этих библиотек поддерживаются одним человеком, и просить их еще и генерировать SPDX или CycloneDX — нереальная задача без дополнительного финансирования.

Заключение

Мы прошли путь от полного отсутствия SBOM до минимально рабочего процесса, который закрывает вопросы лицензионной чистоты. Главный вывод, который мы сделали – формировать SBOM необходимо на этапе сборки: во-первых, содержимое компонентов ПО напрямую зависит от текущих параметров конфигурации, а во-вторых, поддерживать список компонентов вручную после сборки слишком трудоемко.

Впереди — самый сложный этап: детализация гигантской кодовой базы LibreOffice Core для выполнения требований безопасности CRA».

___

Если вы решали или сейчас решаете похожие задачи – обязательно расскажите о своем опыте в комментариях под этой статьей!

Почему мы решили перевести этот текст? CodeScoring – это российское решение для безопасной работы с open source, проверки совместимости лицензий, поиска секретов и анализа качества разработки. Например, мы единственные в России умеем разбирать зависимости C/C++ через анализ сборки. Подробнее об этом можно почитать вот здесь.

Узнать больше о том, что мы делаем, вы можете на сайте CodeScoring.

А мы продолжим переводить для вас SBOM-доклады со свежего FOSDEM, и вы можете выбрать, какой доклад выйдет в блоге следующим, голосуйте в форме ниже!

Только зарегистрированные пользователи могут участвовать в опросе. Войдите, пожалуйста.

0%«How to create the SBOM for the Linux kernel» (Как создать SBOM для ядра Linux).0

100%«Beyond SBOM: Integrating VEX into Open Source Workflows» (За пределами SBOM, интеграция VEX в процессы Open Source).1

0%«Deutsche Bahn's Approach to Large-Scale SBOM Collection and Use» (Подход Deutsche Bahn к сбору SBOM: практический кейс по управлению огромной коллекцией компонентов от крупной корпорации).0

0%«C/C++ Build-time SBOMs with pkgconf» (SBOM для C/C++ во время сборки с помощью pkgconf).0

0%«Forget SBOMs, use PURLs» (Забудьте о SBOM, используйте PURL).0

0%«Contextual SBOMs and impact on vulnerability management» (Контекстные SBOM: влияние на управление уязвимостями).0

Проголосовал 1 пользователь. Воздержавшихся нет.