
源构建的 nginx 1.25.5 容器,包含回溯移植的 CVE-2026-42945 修复、OpenSSL 版本升级、完整的溯源链和 VEX 证明。
| CVE | Компонент | Серьёзность | Метод | Модель проверки |
|---|
| CVE-2024-6119 | OpenSSL / libssl3 | Высокий | Обновление версии зависимости | Проверяемо сканером: libssl3 3.0.20 видна в базе данных dpkg |
| CVE-2026-42945 | nginx ngx_http_rewrite_module | Критический | Перенесённый патч исходного кода | Проверяемо по происхождению: вывод патча + регрессионное тестирование + аттестация сборки + VEX |
Они представляют две различные модели устранения:
Аргументы конфигурации nginx -V этого образа совпадают с аргументами nginx:1.25-bookworm (сравниваются посимвольно после нормализации пути сборки -ffile-prefix-map; проверено в test/compat.py::test_nginx_version). Набор тестов (make test) проверяет 89 утверждений, охватывающих метаданные образа, динамические модули, структуру файловой системы, поведение точки входа, упаковку dpkg и обработку HTTP-запросов, по сравнению с образом upstream.
Известные отличия от upstream (не проверены как идентичные):
built with OpenSSL X.X.X в nginx -V отражает версию libssl-dev сборщика, которая может отличаться от версии OpenSSL во время компиляции upstream.debian:bookworm-slim вместо унаследованного дерева пакетов официального образа.libssl3 во время выполнения — это то, что в данный момент предоставляет bookworm (на момент написания 3.0.20), а не фиксированная версия в образе upstream.make image
make test
make test-cve
make verify-patch
make scan
Одна команда для сборки, тестирования и сканирования:```bash
make all
build/ Dockerfile.build Builder image (debian:bookworm-slim + compilation deps) build.sh Fetch → verify → patch → compile → package nginx generate-vex.sh Generate OpenVEX document for backported CVE verify-patch.sh Re-derive patch from upstream tarballs (audit tool) patches/ CVE-2026-42945.patch Backported one-line fix from nginx 1.30.1 CVE-2026-42945.provenance.json Machine-readable patch provenance and derivation metadata
test/ compat.py 89-assertion compatibility test suite (runs against live upstream) test_cve_2026_42945.py CVE-specific regression test (exercises vulnerable code path)
artifacts/
patch-attestation.json Build-time patch attestation (tracked)
nginx_*.deb Compiled package (gitignored - rebuilt via make build-source)
nginx Compiled binary (gitignored)
Containerfile Final runtime image definition
Makefile Orchestrates build → test → scan pipeline
vex.json Generated OpenVEX v0.2.0 document
baseline-trivy.txt Point-in-time Trivy scan of nginx:1.25-bookworm
baseline-grype.txt Point-in-time Grype scan of nginx:1.25-bookworm
fixed-trivy.txt Trivy scan of the fixed image
fixed-grype.txt Grype scan of the fixed image (without VEX)
fixed-grype-vex.txt Grype scan of the fixed image (with VEX applied)
## Сборка
### Архитектура```
debian:bookworm-slim (builder)
└─ build.sh
├─ curl nginx-1.25.5.tar.gz (SHA256-verified)
├─ curl njs-0.8.4 from github.com/nginx/njs
├─ patch -p1 < CVE-2026-42945.patch
├─ ./configure (flags identical to upstream nginx -V)
├─ make: release binary, debug binary, 4 dynamic module families (×2 release/debug)
├─ make: NJS modules (×2 release/debug) + njs CLI binary
└─ dpkg-deb → nginx_1.25.5-1~bookworm+echo1_<arch>.deb
debian:bookworm-slim (runtime)
├─ apt-get install runtime deps (libssl3 ≥ 3.0.14 enforced)
├─ dpkg -i nginx_*.deb
└─ COPY --from=upstream /docker-entrypoint.sh + /docker-entrypoint.d/
Контейнерный файл НЕ копирует /etc/nginx из вышестоящего образа. Все конфигурационные
файлы поставляются внутри .deb-пакета и отслеживаются механизмом conffiles dpkg.
Это необходимо для скрипта точки входа 10-listen-on-ipv6-by-default.sh,
который использует dpkg-query для проверки, был ли default.conf изменён пользователем.
./configure && make внутри чистого контейнера Debian.
Никаких бинарников из вышестоящих образов, ни apt install nginx.build.sh загружает только закреплённые исходные архивы.Сборка в основном воспроизводима, но не герметична:
Dockerfile.build, но не закреплены по версиям.Для улучшения воспроизводимости закрепите дайджест базового образа:```bash docker pull debian:bookworm-slim docker inspect debian:bookworm-slim --format='{{index .RepoDigests 0}}'
---
## Сведения об устранении CVE
### CVE-2024-6119 — Обновление версии OpenSSL
| Поле | Значение |
| -------------------- | ---------------------------------------------------- |
| **Компонент** | OpenSSL / libssl3 |
| **Серьёзность** | Высокая (CVSS 7.5) |
| **Тип** | Отказ в обслуживании через проверку имён X.509 |
| **Базовая версия** | 3.0.11-1~deb12u2 |
| **Исправленная версия** | 3.0.14-1~deb12u2 (или новее) |
| **Наша версия** | 3.0.20-1~deb12u1 |
| **NVD** | https://nvd.nist.gov/vuln/detail/CVE-2024-6119 |
| **Уведомление** | https://openssl-library.org/news/secadv/20240903.txt |
**Как работает исправление:**
Пакет `.deb` объявляет `Depends: libssl3 (>= 3.0.14)`, что вынуждает
`apt-get install` загрузить версию OpenSSL, содержащую исправление. Текущие
репозитории Debian bookworm предоставляют версию 3.0.20, которая устраняет CVE-2024-6119 и
десятки других CVE OpenSSL относительно базовой версии (CVE-2024-2511, CVE-2024-5535,
CVE-2024-4741, CVE-2023-5678, CVE-2023-6129, CVE-2023-6237, CVE-2024-9143,
CVE-2025-15467, CVE-2025-69420).
**Поведение сканеров:** Grype и Trivy видят `libssl3 3.0.20` в базе данных
dpkg и распознают, что 3.0.20 ≥ 3.0.14, поэтому CVE-2024-6119 больше не
сообщается. VEX не требуется — обновление версии говорит само за себя.
**Проверка:**```bash
grep "CVE-2024-6119" baseline-grype.txt # present
grep "CVE-2024-6119" fixed-grype.txt # absent
| Поле | Значение |
|---|---|
| Компонент | nginx ngx_http_rewrite_module |
| Серьёзность | Средняя (классификация nginx.org) |
| Базовая версия | nginx 1.25.5 |
| Исправлено в | nginx 1.30.1 (выпущен 2026-05-13) |
| NVD | https://nvd.nist.gov/vuln/detail/CVE-2026-42945 |
| Рекомендация | https://my.f5.com/manage/s/article/K000161019 |
| Изменения в вышестоящем репозитории | nginx 1.30.1 CHANGES: "переполнение буфера кучи в модуле rewrite" |
Уязвимость:
ngx_http_script_regex_end_code() в src/http/ngx_http_script.c не сбрасывал e->is_args при обработке результата регулярного выражения rewrite. Если is_args был установлен предыдущей операцией скриптового движка, последующие вычисления длины буфера в пути перенаправления/rewrite были бы неверными, что приводило к переполнению буфера кучи контролируемого атакующим размера через специально созданные URI запросов.
Исправление (одна строка):```c // Added before the existing e->quote = 0; at line 1205 e->is_args = 0;
**Происхождение патча:**
| Доказательство | Расположение / Значение |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Коммит в апстриме | [`2046b45aa0c6e712c216b9075886f3f26e9b4ca9`](https://github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9) |
| Автор апстрима | Roman Arutyunyan (arut), внесён Sergey Kandaurov (pluknet), 2026-05-13 |
| PR в апстриме | [nginx/nginx#1350](https://github.com/nginx/nginx/pull/1350) |
| Теги апстрима | `release-1.31.0`, `release-1.30.1` |
| Связанное предыдущее исправление | [`74d9399`](https://github.com/nginx/nginx/commit/74d939974d430a2c2e71b0134114d2a7b04dcc20) (2012, аналогичная проблема экранирования `is_args`) |
| Файл патча | `build/patches/CVE-2026-42945.patch` |
| Метаданные происхождения | `build/patches/CVE-2026-42945.provenance.json` |
| Исходный тарболл (уязвимый) | `https://nginx.org/download/nginx-1.25.5.tar.gz` SHA256:`2fe2294f8af4144e7e842eaea884182a84ee7970e...` |
| Исходный тарболл (исправленный) | `https://nginx.org/download/nginx-1.30.1.tar.gz` SHA256:`99765000d974896b31ca5882d8c279ce3fe7ef6f...` |
| SHA256 уязвимого файла | `c4b10c95b00e43d731a61f2380d406155e037f3cfb40a3bf58711ecefddc799a` |
| SHA256 исправленного файла | `a6182175a22d88f66b9a61ae051bdcfece10d1bb2e643f7f175eb07589143403` |
| Метод получения | `diff src/http/ngx_http_script.c` между двумя тарболлами (подтверждено совпадение с коммитом апстрима) |
| Изменено строк | 1 (только добавление) |
| Патч применяется чисто | Проверено: `patch --dry-run -p1 < build/patches/CVE-2026-42945.patch` завершается с кодом 0 |
| Проверка во время сборки | `build.sh` проверяет, что `e->is_args = 0` присутствует в исходном коде после наложения патча, и прерывает сборку, если это не так |
| Подтверждение во время сборки | Записывается в `artifacts/patch-attestation.json` во время сборки |
| Регрессионный тест | `test/test_cve_2026_42945.py` - проверяет уязвимый путь выполнения |
| Скрипт проверки патча | `make verify-patch` - независимо восстанавливает патч из тарболлов апстрима |
**Как был создан патч:**
1. Загружен `nginx-1.25.5.tar.gz` (SHA256 проверен по закреплённому хэшу)
2. Загружен `nginx-1.30.1.tar.gz` (SHA256 проверен: `99765000d974896b31ca5882d8c279ce3fe7ef6f5c6f9f0a967ed7fd3407f9cc`)
3. Запущена команда `diff src/http/ngx_http_script.c` между двумя деревьями
4. Команда diff выдала ровно одну строку - добавление `e->is_args = 0;`
5. Извлечён в виде унифицированного патча diff с контекстными строками
6. Проверено, что патч чисто применяется к nginx 1.25.5
7. Оба исходных дерева сохранены в `research/` для независимой проверки
**Регрессионное тестирование:**
Набор тестов `test/test_cve_2026_42945.py` проверяет уязвимый путь выполнения, отправляя запросы через правила перезаписи, которые манипулируют состоянием строки запроса (`is_args`). Он проверяет:
- Перенаправления перезаписи с завершающим `?` (очистка запроса) создают корректные ответы
- Цепочки перезаписи, переключающие состояние `is_args`, не вызывают краш рабочего процесса
- Длинные строки запроса (4 КБ+) не вызывают артефактов переполнения буфера (нулевые байты, чрезмерно длинные заголовки Location)
- 100 быстрых смешанных запросов не вызывают крашей рабочего процесса
- Рабочий процесс выдерживает все тестовые случаи без SIGSEGV или повреждения кучи
Запуск: `make test-cve`
**Поведение сканера:**
Поскольку версия пакета остаётся `1.25.5`, сканеры будут отмечать CVE-2026-42945, когда уведомление присутствует в их базе данных. Это ожидаемо - сканеры сопоставляют по `(имя-пакета, версия-апстрима)` и не могут проверить, был ли исходный код пропатчен. Документ VEX подавляет это обнаружение с помощью машиночитаемого обоснования. Подавление сканером - это механизм коммуникации, а не основное доказательство устранения уязвимости. Основное доказательство - это цепочка происхождения патча и регрессионный тест выше.
---
## VEX (Обмен сведениями об эксплуатации уязвимостей)
### Зачем нужен VEX
Сканеры идентифицируют пакеты по `(имя, версия)` из базы данных dpkg. Наш пакет - `nginx 1.25.5-1~bookworm+echo1` - сканеры интерпретируют это как версию апстрима 1.25.5 и отмечают все CVE, затрагивающие nginx ≤ 1.25.5.
Для бэкпортированных исправлений сканер не может определить, что уязвимый код был пропатчен. Версия намеренно остаётся 1.25.5 для сохранения совместимости пакета. VEX предоставляет машиночитаемое подтверждение того, что CVE устранён, с привязкой к проверяемым доказательствам.
### Цепочка доверия VEX
Утверждение VEX для CVE-2026-42945 — НЕ простая формальность. Оно подкреплено:
1. **Происхождение патча** — `build/patches/CVE-2026-42945.provenance.json` документирует точный исходный апстрим, метод получения и хэши файлов
2. **Проверка во время сборки** — `build.sh` проверяет наличие маркера исправления в скомпилированном исходном коде, прерывая сборку при неудаче
3. **Подтверждение сборки** — `artifacts/patch-attestation.json` записывает хэши файлов до и после наложения патча, сгенерированные во время сборки
4. **Регрессионный тест** — `test/test_cve_2026_42945.py` проверяет уязвимый путь выполнения без крашей или повреждений
5. **Независимое восстановление** — `make verify-patch` загружает оба тарболла апстрима и демонстрирует, что переданный патч является минимальным исправлением безопасности
### Что покрывает VEX
| CVE | Статус | Обоснование | Доказательство |
| -------------- | ------- | ----------------------------- | ---------------------------------------------------------- |
| CVE-2026-42945 | `fixed` | `vulnerable_code_not_present` | Бэкпортированный патч + происхождение + регрессионный тест + проверка сборки |
Область VEX намеренно узкая: покрываются только те CVE, которые этот проект активно устранил с проверяемыми доказательствами. Находки, которые лишь "ожидаются как смягчённые" поставленной версией, не подавляются — это позволяет избежать использования VEX как инструмента всеобщего подавления.
### Как это работает
Скрипт `build/generate-vex.sh` создаёт документ OpenVEX версии 0.2.0. Команда сканера для его применения:```bash
# Without VEX - CVE is reported (version-based match):
grype nginx-fixed > fixed-grype.txt
# With VEX - CVE is suppressed with justification:
grype nginx-fixed --vex vex.json > fixed-grype-vex.txt
Подавление VEX можно наблюдать в сохранённых артефактах сканирования. Обратите внимание, что базы данных сканера периодически перестраиваются, и наличие CVE может различаться между запусками.
Сохранённые файлы baseline-grype.txt и fixed-grype.txt являются доказательствами на момент времени. Достоверность документа VEX НЕ зависит от состояния базы данных сканера — её можно независимо проверить через цепочку происхождения выше.
Пакет называется nginx (не nginx-custom). Это критически важно, потому что:
nginx позволяет ему удовлетворять зависимости и управляться стандартными инструментами Debian.Базы данных рекомендаций сканера периодически перестраиваются. CVE, присутствующий на одной неделе, может отсутствовать на следующей. Этот проект НЕ полагается на вывод сканера как основное доказательство исправления. Цепочка доказательств такова:
Сохранённые файлы сканирования являются только доказательствами на момент времени.
| Package | Version | CVE-2024-6119 | CVE-2026-42945 |
|---|---|---|---|
| libssl3 | 3.0.20-1~deb12u1 | Не сообщается (исправлено версией) | н/д |
| nginx | 1.25.5-1~bookworm+echo1 | н/д | Сообщается, когда в БД (бэкпорт невидим для сканера) |
С --vex vex.json находка CVE-2026-42945 (если присутствует в БД сканера) подавляется. Достоверность документа VEX устанавливается цепочкой происхождения (вывод патча, подтверждение сборки, регрессионный тест), а не только выводом сканера.
Набор тестов (test/compat.py) запускает оба контейнера Docker nginx:1.25-bookworm и nginx-fixed и сравнивает поведение. Каждое утверждение напрямую проверяет живой исправленный образ против живого вышестоящего образа.
89 утверждений. Все проходят.
Дополнительно, test/test_cve_2026_42945.py предоставляет ~20 утверждений, специально нацеленных на исправление бэкпортированного CVE (см. "Регрессионное тестирование" выше).
| Category | Что сравнивается | Количество утверждений |
|---|---|---|
| Image metadata | Entrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels | 7 |
| nginx -V arguments | Флаги конфигурации идентичны (нормализованы для пути -ffile-prefix-map) | 1 |
| Dynamic modules | Все 12 вышестоящих файлов .so присутствуют + символическая ссылка /etc/nginx/modules | 13 |
| nginx-debug binary | --with-debug и --with-http_v3_module присутствуют в debug -V | 2 |
| Filesystem layout | ~20 ключевых путей, символические ссылки журналов на /dev/stdout и /dev/stderr | ~20 |
| User/group config | Вывод getent passwd/group nginx идентичен | 2 |
| dpkg conffiles | dpkg-query сообщает default.conf и nginx.conf как файлы конфигурации | 1 |
| Package provides | dpkg -s nginx показывает Provides: nginx-r1.25.5 | 1 |
| NJS binary | njs -v возвращает 0.8.4 | 1 |
| IPv6 entrypoint | 10-listen-on-ipv6-by-default.sh изменяет default.conf идентично | 1 |
| Envsubst templates | Подстановка шаблона NGINX_ENVSUBST даёт одинаковый вывод | 1 |
| Startup logs | Все строки журнала точки входа соответствуют формату вышестоящего образа | 1 |
| HTTP GET/HEAD/POST | Тело ответа, статус, заголовки совпадают для нескольких конечных точек | ~10 |
| Malformed request | Сырой TCP ответ об ошибке идентичен | 1 |
| Static file serving | Примонтированный файл обслуживается с правильным содержимым | 1 |
| TLS termination | HTTPS с самоподписанным сертификатом работает идентично | 1 |
| Graceful shutdown | SIGQUIT даёт чистый выход (код 0) | 1 |
| Config reload | SIGHUP применяет новую конфигурацию без перезапуска | 1 |
--with-http_v3_module; UDP/QUIC трафик не отправляется).so на дискеRun:```bash make test
---
## Размер образа
| Образ | Размер (arm64, `docker images`) |
| --------------------- | ----------------------------- |
| `nginx:1.25-bookworm` | ~278 MB |
| `nginx-fixed` | ~332 MB |
Фиксированный образ больше, чем оригинальный. Это ожидаемо: официальный образ использует предварительно скомпилированные бинарные файлы в оптимизированных слоях, в то время как наш устанавливает артефакты сборки и полные зависимости времени выполнения (включая библиотеки для всех 12 динамических модулей) в базовый образ `debian:bookworm-slim`. Разница в размере является компромиссом ради контроля над сборкой на уровне исходного кода, а не регрессией функциональности.
---
## Оценка остаточного риска
### Оставшиеся CVE в фиксированном образе
Фиксированный образ всё ещё содержит уязвимости в системных библиотеках, не устранённые данным проектом (на данный момент; выполните `make scan` для текущего состояния):
| Уровень риска | Пакет | CVE | Примечания |
| ---------- | -------------- | ------------------------------------------- | ---------------------------------------------------------------------------------------------------------------- |
| High | nginx | CVE-2023-44487 | Устранено в nginx ≥ 1.25.3 согласно upstream; сканер всё ещё помечает, так как трекер Debian не закрыл уведомление |
| Critical | libgnutls30 | CVE-2026-42010, CVE-2026-33845 | Нет исправления в bookworm |
| Critical | libc6/libc-bin | CVE-2026-5450 | Не будет исправлено в этом релизе Debian |
| High | libc6/libc-bin | CVE-2026-5928, CVE-2026-5435, CVE-2026-4437 | glibc не будет исправлено для bookworm |
| High | dpkg | CVE-2025-6297, CVE-2026-2219 | Исправимо (обновление до 1.21.23) |
| High | libldap-2.5-0 | CVE-2023-2953 | Не будет исправлено |
| High | curl/libcurl4 | CVE-2026-5773, CVE-2026-6276 | Не будет исправлено |
| High | ncurses | CVE-2025-69720 | Не будет исправлено |
Они наследуются от `debian:bookworm-slim` и выходят за рамки CVE-исправлений данного проекта, ориентированных на nginx.
### Ограничения данного подхода
1. **Не герметичный.** Базовый образ и пакеты apt разрешаются во время сборки из живых репозиториев Debian. Фиксация SHA базового образа и использование снимков apt повысили бы воспроизводимость.
2. **Нет поведенческого тестирования QUIC.** Поддержка HTTP/3 встроена (проверено по флагу), но QUIC-трафик не используется в наборе тестов.
3. **Нет проверки производительности.** Тест с 50 параллельными запросами доказывает корректность, но не эквивалентность пропускной способности или задержки.
4. **Только загрузка модулей.** Динамические модули (GeoIP, image_filter, XSLT) проверены на наличие и загружаемость, но их функциональное поведение не тестируется за пределами базовой загрузки.
5. **Доказательства для одной архитектуры.** Тесты запускаются только на архитектуре хоста сборки (arm64 в разработке; для мульти-архитектуры потребуется CI).
### Будущие улучшения (не реализованы)
1. Фиксировать дайджест базового образа и использовать URL-адреса снимков apt для герметичных сборок.
2. Удалить ненужные пакеты (ncurses, util-linux), извлекаемые как транзитивные зависимости.
3. Генерировать SBOM (цель `make sbom` существует, использует `syft`) и связывать с VEX через purl SBOM.
4. Подписать образ с помощью `cosign` и прикрепить VEX + SBOM + подтверждение патча как аттестации OCI.
5. Добавить конвейер CI (GitHub Actions) для автоматической сборки → тестирования → сканирования → отправки.
6. Добавить тест протокола HTTP/3 (QUIC-клиент, настройка сертификата, UDP-порт).
7. Рассмотреть использование дистрибутива без лишнего (distroless) для полного устранения шума CVE на уровне ОС.
8. Добавить вариант сборки с ASan (AddressSanitizer) для доказательства отсутствия повреждения кучи при тестовой нагрузке.
---
## Флаги сборки по сравнению с upstream
Флаги `./configure` в `build.sh` идентичны тем, что сообщаются `nginx -V` в официальном образе `nginx:1.25-bookworm`. Это подтверждается тестом `test/compat.py::test_nginx_version`, который нормализует различие `-ffile-prefix-map=<path>` и сравнивает остальные флаги посимвольно.
Примечательные флаги (все присутствуют в обоих образах):
| Флаг / функция | Назначение |
| ----------------------- | ----------------------------------------------------------------------------- |
| `--prefix=/etc/nginx` | Соглашение для Docker-образов (не `/usr/share/nginx` в Debian) |
| `--with-http_v3_module` | Встроенный стек QUIC (независимый от API QUIC OpenSSL) |
| `--with-pcre` (PCRE2) | Линковка с `libpcre2-8-0` (не устаревший PCRE1) |
| `--with-stream` | Модуль прокси TCP/UDP (динамический) |
| Усиление безопасности | `-fstack-protector-strong`, `FORTIFY_SOURCE=2`, RELRO, PIE |
| Динамические модули (×12) | geoip, stream_geoip, image_filter, xslt, http_js, stream_js (релиз + отладка) |
| `--with-debug` (отладка) | бинарный файл nginx-debug собирается отдельно с идентичными флагами + отладка |
---
## Пакет Debian
Метаданные пакета `.deb`:```
Package: nginx
Version: 1.25.5-1~bookworm+echo1
Depends: libc6 (>= 2.34), libcrypt1 (>= 1:4.1.0), libpcre2-8-0 (>= 10.22),
libssl3 (>= 3.0.14), zlib1g (>= 1:1.2.11), libgeoip1 (>= 1.6.12),
libgd3 (>= 2.1.0~alpha~), libxml2 (>= 2.7.4), libxslt1.1 (>= 1.1.25),
lsb-base (>= 3.0-6), adduser
Provides: httpd, nginx, nginx-r1.25.5
Conflicts: nginx-common, nginx-core
Replaces: nginx-common, nginx-core
Ключевые решения по упаковке:
libssl3 (>= 3.0.14) — явно требует исправленную версию OpenSSL (вышестоящий проект
указывает >= 3.0.0). Это механизм, обеспечивающий исправление CVE-2024-6119.Provides: nginx-r1.25.5 — удовлетворяет зависимости динамических модулей,
которые зависят от этого виртуального пакета./etc/nginx/nginx.conf и
/etc/nginx/conf.d/default.conf. Это необходимо для проверки в скрипте точки входа IPv6
через dpkg-query --showformat./bin/false
(соответствует вышестоящему проекту — проверено в тестовом наборе)..so, полное дерево
конфигурации /etc/nginx, файлы init.d/systemd/logrotate, man-страницу, HTML-файлы
по умолчанию и символическую ссылку /etc/nginx/modules → /usr/lib/nginx/modules.Пакет назван nginx, а не nginx-custom. Если переименовать, сканеры
не будут сопоставлять его с уведомлениями по nginx — все CVE для nginx, включая
неисправленные, бесшумно исчезнут из отчётов. Сохранение имени nginx обеспечивает
честную отчётность сканеров и делает VEX осмысленным.
VEX требует видимости CVE. Смысл VEX — подавить CVE, который уже обнаружен. Если сканер не находит CVE (из-за переименования пакета или задержек в базе данных), VEX нечего подавлять.
libssl3 (>= 3.0.14) как зависимость пакета. Вместо надежды на то, что
в среде выполнения случайно окажется исправленный OpenSSL, .deb жёстко
требует версию, содержащую исправление для CVE-2024-6119.
Нестабильность баз данных сканеров. Базы уведомлений перестраиваются периодически. CVE, присутствующий на одной неделе, может отсутствовать на следующей. Сохранённые в этом репозитории файлы сканирования являются свидетельством на момент времени; текущие сканирования могут отличаться.
Использование ИИ-инструментов. GitHub Copilot помогал с анализом патчей (сравнение исходных деревьев nginx 1.25.5 и 1.30.1), структурой тестового набора, выявлением проблемы уклонения сканера при переименовании пакета и составлением VEX-документа. Детали упаковки Debian и эвристики сопоставления версий Grype потребовали ручной проверки.
| Concurrent requests |
| 50 параллельных запросов все возвращают 200 |
| 1 |