Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
nginx-cve-fix — 源构建的 nginx 1.25.5 容器,包含回溯移植的 CVE-2026-42945 修复、OpenSSL 版本升级、完整的溯源链和 VEX 证明。 | Kitploit
Инструменты/GitHubGitHub/barappteam/nginx-cve-fix
Сканеры уязвимостейБезопасность контейнеровАнализ уязвимостейАудит конфигурацииDevSecOpsБезопасность Цепочки Поставок
GitHubbarappteam/nginx-cve-fix

nginx-cve-fix

源构建的 nginx 1.25.5 容器,包含回溯移植的 CVE-2026-42945 修复、OpenSSL 版本升级、完整的溯源链和 VEX 证明。

Репозиторий
33 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Исправление CVE Nginx - Drop-in сборка из исходников для nginx:1.25-bookworm

Образ контейнера nginx 1.25.5, собранный из исходников, устраняет две CVE, присутствующие в официальном образе nginx:1.25-bookworm, сохраняя поведение upstream во время выполнения.

CVEКомпонентСерьёзностьМетодМодель проверки
CVE-2024-6119OpenSSL / libssl3ВысокийОбновление версии зависимостиПроверяемо сканером: libssl3 3.0.20 видна в базе данных dpkg
CVE-2026-42945nginx ngx_http_rewrite_moduleКритическийПеренесённый патч исходного кодаПроверяемо по происхождению: вывод патча + регрессионное тестирование + аттестация сборки + VEX

Они представляют две различные модели устранения:

  1. Обновление версии (CVE-2024-6119) — исправленная версия библиотеки напрямую видна сканерам через базу данных dpkg. Дополнительная аттестация не требуется.
  2. Перенос патча из исходников (CVE-2026-42945) — версия пакета остаётся 1.25.5, поэтому сканеры не могут отличить исправленный бинарный файл от неисправленного. Устранение демонстрируется через происхождение исходного кода, проверку во время сборки и регрессионное тестирование. 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.

Быстрый старт```bash

Build everything (builder → .deb → final image)

make image

Run automated compatibility tests

make test

Run CVE-2026-42945 regression test

make test-cve

Verify patch provenance (re-derives from upstream tarballs)

make verify-patch

Scan and demonstrate VEX

make scan

root@kitploit:~
Одна команда для сборки, тестирования и сканирования:```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)

root@kitploit:~
## Сборка

### Архитектура```
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 изменён пользователем.

Гарантии целостности

  • Исходные архивы: все исходные архивы (nginx, NJS) проверяются по SHA256 с жестко заданными хешами перед распаковкой. Сборка прерывается при несовпадении.
  • Сборка из исходников: ./configure && make внутри чистого контейнера Debian. Никаких бинарников из вышестоящих образов, ни apt install nginx.
  • Отсутствие сетевого доступа во время компиляции: зависимости устанавливаются в слое образа сборщика Docker; build.sh загружает только закреплённые исходные архивы.

Воспроизводимость

Сборка в основном воспроизводима, но не герметична:

  • Версия исходного кода nginx и SHA256 закреплены и проверяются перед распаковкой.
  • Версия NJS и SHA256 закреплены и проверяются перед распаковкой.
  • Зависимости сборщика перечислены в Dockerfile.build, но не закреплены по версиям.
  • Пакеты среды выполнения Debian разрешаются из живых репозиториев bookworm во время сборки, поэтому минорные версии могут отличаться между сборками.

Для улучшения воспроизводимости закрепите дайджест базового образа:```bash docker pull debian:bookworm-slim docker inspect debian:bookworm-slim --format='{{index .RepoDigests 0}}'

Then use: FROM debian:bookworm-slim@sha256:

root@kitploit:~
---

## Сведения об устранении 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

CVE-2026-42945 - Обратно портированный патч

ПолеЗначение
Компонентnginx ngx_http_rewrite_module
СерьёзностьСредняя (классификация nginx.org)
Базовая версияnginx 1.25.5
Исправлено вnginx 1.30.1 (выпущен 2026-05-13)
NVDhttps://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;

root@kitploit:~
**Происхождение патча:**

| Доказательство                    | Расположение / Значение                                                                                                                     |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Коммит в апстриме             | [`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). Это критически важно, потому что:

  1. Честное отображение: Если бы пакет был переименован, сканеры не распознали бы его как nginx, и ВСЕ CVE nginx бесшумно исчезли бы — включая неисправленные. Это ложное чувство безопасности.
  2. Демонстрация VEX: VEX может подавлять только тот CVE, который сканер действительно сообщает. Переименованные пакеты делают VEX ненужным (и непроверяемым).
  3. Управление пакетами: Именование как nginx позволяет ему удовлетворять зависимости и управляться стандартными инструментами Debian.

Изменчивость базы данных сканера

Базы данных рекомендаций сканера периодически перестраиваются. CVE, присутствующий на одной неделе, может отсутствовать на следующей. Этот проект НЕ полагается на вывод сканера как основное доказательство исправления. Цепочка доказательств такова:

  1. Происхождение патча (проверяемо независимо от любого сканера)
  2. Подтверждение во время сборки (генерируется при компиляции)
  3. Регрессионный тест (проверяет уязвимый путь кода)
  4. Подавление VEX (подтверждение на уровне сканера)

Сохранённые файлы сканирования являются только доказательствами на момент времени.

Что видят сканеры (исправленный образ)

PackageVersionCVE-2024-6119CVE-2026-42945
libssl33.0.20-1~deb12u1Не сообщается (исправлено версией)н/д
nginx1.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 metadataEntrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels7
nginx -V argumentsФлаги конфигурации идентичны (нормализованы для пути -ffile-prefix-map)1
Dynamic modulesВсе 12 вышестоящих файлов .so присутствуют + символическая ссылка /etc/nginx/modules13
nginx-debug binary--with-debug и --with-http_v3_module присутствуют в debug -V2
Filesystem layout~20 ключевых путей, символические ссылки журналов на /dev/stdout и /dev/stderr~20
User/group configВывод getent passwd/group nginx идентичен2
dpkg conffilesdpkg-query сообщает default.conf и nginx.conf как файлы конфигурации1
Package providesdpkg -s nginx показывает Provides: nginx-r1.25.51
NJS binarynjs -v возвращает 0.8.41
IPv6 entrypoint10-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 terminationHTTPS с самоподписанным сертификатом работает идентично1
Graceful shutdownSIGQUIT даёт чистый выход (код 0)1
Config reloadSIGHUP применяет новую конфигурацию без перезапуска1

Что НЕ тестируется

  • Поведение протокола HTTP/3 QUIC (проверяется только наличие флага --with-http_v3_module; UDP/QUIC трафик не отправляется)
  • Характеристики производительности или задержки под нагрузкой
  • Все возможные директивы конфигурации nginx
  • Поведение редко используемых динамических модулей (GeoIP, image_filter, XSLT) помимо проверки наличия файлов .so на диске

Run:```bash make test

root@kitploit:~
---

## Размер образа

| Образ                 | Размер (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 — удовлетворяет зависимости динамических модулей, которые зависят от этого виртуального пакета.
  • Conffiles зарегистрированы в dpkg: /etc/nginx/nginx.conf и /etc/nginx/conf.d/default.conf. Это необходимо для проверки в скрипте точки входа IPv6 через dpkg-query --showformat.
  • postinst создаёт пользователя и группу nginx с uid/gid 101 и оболочкой /bin/false (соответствует вышестоящему проекту — проверено в тестовом наборе).
  • Включает: бинарные файлы nginx и nginx-debug, все 12 модулей .so, полное дерево конфигурации /etc/nginx, файлы init.d/systemd/logrotate, man-страницу, HTML-файлы по умолчанию и символическую ссылку /etc/nginx/modules → /usr/lib/nginx/modules.

Проектные решения и компромиссы

  1. Пакет назван nginx, а не nginx-custom. Если переименовать, сканеры не будут сопоставлять его с уведомлениями по nginx — все CVE для nginx, включая неисправленные, бесшумно исчезнут из отчётов. Сохранение имени nginx обеспечивает честную отчётность сканеров и делает VEX осмысленным.

  2. VEX требует видимости CVE. Смысл VEX — подавить CVE, который уже обнаружен. Если сканер не находит CVE (из-за переименования пакета или задержек в базе данных), VEX нечего подавлять.

  3. libssl3 (>= 3.0.14) как зависимость пакета. Вместо надежды на то, что в среде выполнения случайно окажется исправленный OpenSSL, .deb жёстко требует версию, содержащую исправление для CVE-2024-6119.

  4. Нестабильность баз данных сканеров. Базы уведомлений перестраиваются периодически. CVE, присутствующий на одной неделе, может отсутствовать на следующей. Сохранённые в этом репозитории файлы сканирования являются свидетельством на момент времени; текущие сканирования могут отличаться.

  5. Использование ИИ-инструментов. GitHub Copilot помогал с анализом патчей (сравнение исходных деревьев nginx 1.25.5 и 1.30.1), структурой тестового набора, выявлением проблемы уклонения сканера при переименовании пакета и составлением VEX-документа. Детали упаковки Debian и эвристики сопоставления версий Grype потребовали ручной проверки.

Скачать инструмент
Concurrent requests
50 параллельных запросов все возвращают 200
1