Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
nginx-cve-fix — Quellgebauter nginx 1.25.5 Container mit zurückportiertem CVE-2026-42945 Fix, OpenSSL-Update, vollständiger Provenienzkette und VEX-Attestierung. | Kitploit
Tools/GitHubGitHub/barappteam/nginx-cve-fix
SchwachstellenscannerContainer-SicherheitSchwachstellenanalyseKonfigurationsprüfungDevSecOpsLieferkettensicherheit
GitHubbarappteam/nginx-cve-fix

nginx-cve-fix

Quellgebauter nginx 1.25.5 Container mit zurückportiertem CVE-2026-42945 Fix, OpenSSL-Update, vollständiger Provenienzkette und VEX-Attestierung.

Repository anzeigen
3vor 3 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

Nginx CVE Fix - Aus dem Quellcode erstelltes Drop-in für nginx:1.25-bookworm

Ein aus dem Quellcode erstelltes nginx 1.25.5 Container-Image, das zwei CVE-Korrekturen aus dem offiziellen nginx:1.25-bookworm-Image behebt, während das Upstream-Laufzeitverhalten erhalten bleibt.

CVEKomponenteSchweregradTechnikVerifikationsmodell
CVE-2024-6119OpenSSL / libssl3HochVersionsanhebungScanner-verifizierbar: libssl3 3.0.20 sichtbar in der dpkg-Datenbank
CVE-2026-42945nginx ngx_http_rewrite_moduleKritischQuellcode-BackportHerkunftsverifizierbar: Patch-Ableitung + Regressionstest + Build-Attestation + VEX

Diese repräsentieren zwei unterschiedliche Behebungsmodelle:

  1. Versionsanhebung (CVE-2024-6119) – die behobene Bibliotheksversion ist direkt für Scanner über die dpkg-Datenbank sichtbar. Keine zusätzliche Attestation erforderlich.
  2. Quellcode-Backport (CVE-2026-42945) – die Paketversion bleibt auf 1.25.5, sodass Scanner das gepatchte Binärprogramm nicht von einem ungepatchten unterscheiden können. Die Korrektur wird durch Quellcode-Herkunft, Build-Zeit-Verifikation und Regressionstests nachgewiesen. VEX liefert das Signal auf Scanner-Ebene.

Paritätsstatus

Die nginx -V-Konfigurationsargumente dieses Images stimmen mit denen von nginx:1.25-bookworm überein (verglichen Zeichen für Zeichen nach Normalisierung des Build-Pfades -ffile-prefix-map; verifiziert in test/compat.py::test_nginx_version). Die Testsuite (make test) validiert 89 Assertions, die Imagemetadaten, dynamische Module, Dateisystemlayout, Entrypoint-Verhalten, dpkg-Paketierung und HTTP-Anfragebearbeitung gegenüber dem Live-Upstream-Image abdecken.

Bekannte Unterschiede zum Upstream (nicht als identisch validiert):

  • Die Zeile built with OpenSSL X.X.X in nginx -V spiegelt die libssl-dev-Version des Builders wider, die sich vom compile-time OpenSSL des Upstreams unterscheiden kann.
  • Der Binärinhalt ist nicht byteweise identisch (unterschiedliche Kompilierungsumgebung, unterschiedliche Zeitstempel des Toolchain-Aufrufs).
  • Das Imagesatz unterscheidet sich – debian:bookworm-slim Basis anstelle des vom offiziellen Image geerbten Paketbaums.
  • Die Laufzeitversion von libssl3 ist die, die bookworm derzeit bietet (3.0.20 zum Zeitpunkt des Schreibens), nicht die festgelegte Version im Upstream-Image.

Schnellstart```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:~
Ein Befehl zum Erstellen, Testen und Scannen:```bash
make all

Repository-Struktur```

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:~
## Build-Prozess

### Architektur```
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/

Das Containerfile kopiert /etc/nginx NICHT von upstream. Alle Konfigurationsdateien werden innerhalb des .deb ausgeliefert und vom Conffile-Mechanismus von dpkg verfolgt. Dies ist erforderlich für das Einstiegspunkt-Skript 10-listen-on-ipv6-by-default.sh, das dpkg-query verwendet, um zu erkennen, ob default.conf vom Benutzer geändert wurde.

Integritätsgarantien

  • Quell-Tarballs: Alle Quellarchive (nginx, NJS) werden vor der Extraktion gegen fest codierte SHA256-Hashes verifiziert. Der Build bricht bei Abweichung ab.
  • Build aus Quellcode: ./configure && make in einem sauberen Debian-Container. Keine Upstream-Binärdateien, kein apt install nginx.
  • Kein Netzwerkzugriff während der Kompilierung: Abhängigkeiten werden in der Builder-Docker-Image-Ebene installiert; build.sh ruft nur festgelegte Quellarchive ab.

Reproduzierbarkeit

Der Build ist größtenteils reproduzierbar, aber nicht hermetisch:

  • Die nginx-Quellversion und SHA256 sind festgelegt und werden vor der Extraktion verifiziert.
  • NJS-Version und SHA256 sind festgelegt und werden vor der Extraktion verifiziert.
  • Builder-Abhängigkeiten sind in Dockerfile.build aufgelistet, aber nicht versioniert festgelegt.
  • Debian-Laufzeitpakete werden zur Build-Zeit aus den Live-Bookworm-Repositories aufgelöst, sodass Nebenversionen zwischen Builds abweichen können.

Um die Reproduzierbarkeit zu verbessern, fixieren Sie den Digest des Basis-Images:```bash docker pull debian:bookworm-slim docker inspect debian:bookworm-slim --format='{{index .RepoDigests 0}}'

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

root@kitploit:~
---

## Details zur CVE-Behebung

### CVE-2024-6119 - OpenSSL-Versionssprung

| Feld                  | Wert                                                 |
| -------------------- | ---------------------------------------------------- |
| **Komponente**       | OpenSSL / libssl3                                    |
| **Schweregrad**      | Hoch (CVSS 7.5)                                      |
| **Typ**              | Denial-of-Service durch X.509-Namensprüfungen        |
| **Basisversion**     | 3.0.11-1~deb12u2                                     |
| **Behobene Version** | 3.0.14-1~deb12u2 (oder später)                       |
| **Unsere Version**   | 3.0.20-1~deb12u1                                     |
| **NVD**              | https://nvd.nist.gov/vuln/detail/CVE-2024-6119       |
| **Advisory**         | https://openssl-library.org/news/secadv/20240903.txt |

**Wie der Fix funktioniert:**

Das `.deb`-Paket deklariert `Depends: libssl3 (>= 3.0.14)`, was erzwingt, dass
`apt-get install` eine OpenSSL-Version zieht, die den Fix enthält. Die aktuellen
Debian-Bookworm-Repositories bieten 3.0.20, das CVE-2024-6119 sowie Dutzende
anderer OpenSSL-CVEs gegenüber der Basisversion behebt (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).

**Scanner-Verhalten:** Grype und Trivy sehen `libssl3 3.0.20` in der dpkg-Datenbank und erkennen, dass 3.0.20 ≥ 3.0.14 ist, sodass CVE-2024-6119 nicht mehr gemeldet wird. Kein VEX nötig – der Versionssprung ist selbsterklärend.

**Überprüfung:**```bash
grep "CVE-2024-6119" baseline-grype.txt  # present
grep "CVE-2024-6119" fixed-grype.txt     # absent

CVE-2026-42945 – Rückportierter Patch

FeldWert
Komponentenginx ngx_http_rewrite_module
SchweregradMittel (Klassifizierung nginx.org)
Basisversionnginx 1.25.5
Behoben innginx 1.30.1 (veröffentlicht 2026-05-13)
NVDhttps://nvd.nist.gov/vuln/detail/CVE-2026-42945
Advisoryhttps://my.f5.com/manage/s/article/K000161019
Upstream-Änderungennginx 1.30.1 CHANGES: „heap memory buffer overflow in rewrite module“

Sicherheitslücke:

ngx_http_script_regex_end_code() in src/http/ngx_http_script.c setzte e->is_args beim Verarbeiten eines Rewrite-Regex-Ergebnisses nicht zurück. Falls is_args durch eine vorherige Script-Engine-Operation gesetzt worden war, wären nachfolgende Berechnungen der Pufferlänge im Redirect-/Rewrite-Pfad inkorrekt, was einen Heap-Buffer-Overflow mit von einem Angreifer kontrollierter Größe über präparierte Anfrage-URIs verursachen würde.

Der Fix (eine Zeile):```c // Added before the existing e->quote = 0; at line 1205 e->is_args = 0;

root@kitploit:~
**Patch-Herkunft:**

| Nachweis                    | Ort / Wert                                                                                                                           |
| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------ |
| Upstream-Commit             | [`2046b45aa0c6e712c216b9075886f3f26e9b4ca9`](https://github.com/nginx/nginx/commit/2046b45aa0c6e712c216b9075886f3f26e9b4ca9)         |
| Upstream-Autor             | Roman Arutyunyan (arut), committed von Sergey Kandaurov (pluknet), 2026-05-13                                                         |
| Upstream-PR                 | [nginx/nginx#1350](https://github.com/nginx/nginx/pull/1350)                                                                         |
| Upstream-Tags               | `release-1.31.0`, `release-1.30.1`                                                                                                   |
| Verwandter früherer Fix           | [`74d9399`](https://github.com/nginx/nginx/commit/74d939974d430a2c2e71b0134114d2a7b04dcc20) (2012, ähnliches `is_args` Escape-Problem) |
| Patch-Datei                  | `build/patches/CVE-2026-42945.patch`                                                                                                 |
| Provenienz-Metadaten         | `build/patches/CVE-2026-42945.provenance.json`                                                                                       |
| Quell-Tarball (anfällig) | `https://nginx.org/download/nginx-1.25.5.tar.gz` SHA256:`2fe2294f8af4144e7e842eaea884182a84ee7970e...`                               |
| Quell-Tarball (behoben)      | `https://nginx.org/download/nginx-1.30.1.tar.gz` SHA256:`99765000d974896b31ca5882d8c279ce3fe7ef6f...`                                |
| SHA256 der anfälligen Datei      | `c4b10c95b00e43d731a61f2380d406155e037f3cfb40a3bf58711ecefddc799a`                                                                   |
| SHA256 der behobenen Datei           | `a6182175a22d88f66b9a61ae051bdcfece10d1bb2e643f7f175eb07589143403`                                                                   |
| Ableitungsmethode           | `diff src/http/ngx_http_script.c` zwischen den beiden Tarballs (bestätigt identisch mit dem Upstream-Commit)                                  |
| Geänderte Zeilen               | 1 (nur Hinzufügung)                                                                                                                    |
| Patch lässt sich sauber anwenden       | Verifiziert: `patch --dry-run -p1 < build/patches/CVE-2026-42945.patch` beendet mit 0                                                         |
| Build-Zeit-Überprüfung     | `build.sh` überprüft, ob `e->is_args = 0` nach dem Patchen im Quellcode vorhanden ist, bricht Build ab, wenn nicht                                        |
| Build-Zeit-Bescheinigung      | Geschrieben in `artifacts/patch-attestation.json` während des Builds                                                                             |
| Regressionstest             | `test/test_cve_2026_42945.py` - testet den anfälligen Codepfad                                                                   |
| Patch-Überprüfungsskript   | `make verify-patch` - leitet den Patch unabhängig von den Upstream-Tarballs erneut ab                                                      |

**Wie der Patch erstellt wurde:**

1. `nginx-1.25.5.tar.gz` heruntergeladen (SHA256 gegen festgelegten Hash verifiziert)
2. `nginx-1.30.1.tar.gz` heruntergeladen (SHA256 verifiziert: `99765000d974896b31ca5882d8c279ce3fe7ef6f5c6f9f0a967ed7fd3407f9cc`)
3. `diff src/http/ngx_http_script.c` zwischen den beiden Bäumen ausgeführt
4. Der Diff erzeugte genau eine Zeile - die `e->is_args = 0;`-Hinzufügung
5. Als Unified-Diff-Patch mit Kontextzeilen extrahiert
6. Verifiziert, dass der Patch sauber auf nginx 1.25.5 angewendet werden kann
7. Beide Quellbäume werden in `research/` zur unabhängigen Überprüfung aufbewahrt

**Regressionstests:**

Die Testsuite `test/test_cve_2026_42945.py` testet den anfälligen Codepfad, indem sie Anfragen durch Rewrite-Regeln sendet, die den Query-String-Zustand (`is_args`) manipulieren. Sie validiert:

- Rewrite-Weiterleitungen mit nachgestelltem `?` (Query-Entfernung) erzeugen wohlgeformte Antworten
- Verkettete Rewrites, die den `is_args`-Zustand umschalten, lassen den Worker nicht abstürzen
- Lange Query-Strings (4KB+) verursachen keine Pufferüberlauf-Artefakte (Null-Bytes, überlange Location-Header)
- 100 schnelle gemischte Anfragen verursachen keine Worker-Abstürze
- Der Worker-Prozess überlebt alle Testfälle ohne SIGSEGV oder Heap-Korrruption

Ausführen: `make test-cve`

**Scanner-Verhalten:**

Da die Paketversion `1.25.5` bleibt, werden Scanner CVE-2026-42945 melden, wenn das Advisory in ihrer Datenbank vorhanden ist. Dies ist erwartet - Scanner gleichen nach `(package-name, upstream-version)` ab und können nicht überprüfen, ob der Quellcode gepatcht wurde. Das VEX-Dokument unterdrückt diesen Befund mit maschinenlesbarer Begründung. Die Scanner-Unterdrückung ist ein Kommunikationsmechanismus, nicht der primäre Nachweis der Behebung. Der primäre Nachweis ist die Patch-Provenienz-Kette und der Regressionstest oben.

---

## VEX (Vulnerability Exploitability eXchange)

### Warum VEX benötigt wird

Scanner identifizieren Pakete anhand von `(name, version)` aus der dpkg-Datenbank. Unser Paket ist `nginx 1.25.5-1~bookworm+echo1` - Scanner parsen dies als Upstream-Version 1.25.5 und melden alle CVEs, die nginx ≤ 1.25.5 betreffen.

Bei zurückportierten Fixes kann der Scanner nicht feststellen, dass der anfällige Code gepatcht wurde. Die Version bleibt absichtlich 1.25.5, um die Paketkompatibilität zu wahren. VEX bietet eine maschinenlesbare Bescheinigung, dass das CVE behoben wurde, verknüpft mit überprüfbaren Beweisen.

### VEX-Glaubwürdigkeitskette

Die VEX-Aussage für CVE-2026-42945 ist KEIN bloßes Papierkram. Sie wird gestützt durch:

1. **Patch-Provenienz** - `build/patches/CVE-2026-42945.provenance.json` dokumentiert die genaue Upstream-Quelle, Ableitungsmethode und Datei-Hashes
2. **Build-Zeit-Überprüfung** - `build.sh` stellt sicher, dass der Fix-Marker im kompilierten Quellcode vorhanden ist, und bricht den Build bei Fehlschlag ab
3. **Build-Bescheinigung** - `artifacts/patch-attestation.json` zeichnet die Datei-Hashes vor/nach dem Patchen auf, die während des Builds erzeugt werden
4. **Regressionstest** - `test/test_cve_2026_42945.py` testet den anfälligen Codepfad ohne Absturz oder Korruption
5. **Unabhängige Neuableitung** - `make verify-patch` lädt beide Upstream-Tarballs herunter und zeigt, dass der eingereichte Patch der minimale Sicherheits-Diff ist

### Was das VEX abdeckt

| CVE            | Status  | Begründung                     | Beweise                                                    |
| -------------- | ------- | ----------------------------- | ---------------------------------------------------------- |
| CVE-2026-42945 | `fixed` | `vulnerable_code_not_present` | Backport-Patch + Provenienz + Regressionstest + Build-Gate |

Der VEX-Bereich ist bewusst eng gefasst: Nur CVEs, die dieses Projekt aktiv mit überprüfbaren Beweisen behoben hat, werden abgedeckt. Befunde, die lediglich "voraussichtlich gemildert" von der ausgelieferten Version werden, werden nicht unterdrückt - dies vermeidet die Verwendung von VEX als pauschales Unterdrückungswerkzeug.

### Wie es funktioniert

Das Skript `build/generate-vex.sh` erzeugt ein OpenVEX v0.2.0-Dokument. Der Scanner-Befehl zum Anwenden:```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

Scanner-Nachweise

Die VEX-Unterdrückung ist in gespeicherten Scan-Artefakten beobachtbar. Beachten Sie, dass Scanner-Datenbanken regelmäßig neu aufgebaut werden und das Vorhandensein von CVEs zwischen den Läufen variieren kann. Die gespeicherten Dateien baseline-grype.txt und fixed-grype.txt sind punktuelle Beweise. Die Gültigkeit des VEX-Dokuments hängt NICHT vom Zustand der Scanner-Datenbank ab – sie ist unabhängig über die oben genannte Provenienzkette verifizierbar.


Scanner-Integrität

Entscheidung zur Paketbenennung

Das Paket heißt nginx (nicht nginx-custom). Dies ist kritisch, weil:

  1. Ehrliche Berichterstattung: Wenn das Paket umbenannt würde, würden Scanner es nicht als nginx erkennen und ALLE nginx-CVEs würden stillschweigend verschwinden – einschließlich ungefixter. Das ist ein falsches Sicherheitsgefühl.
  2. VEX-Demonstration: VEX kann nur ein CVE unterdrücken, das der Scanner tatsächlich meldet. Umbenannte Pakete machen VEX unnötig (und nicht testbar).
  3. Paketverwaltung: Die Benennung als nginx ermöglicht es, Abhängigkeiten zu erfüllen und mit standardmäßigen Debian-Werkzeugen verwaltet zu werden.

Volatilität der Scanner-Datenbank

Scanner-Beratungsdatenbanken werden regelmäßig neu aufgebaut. Ein CVE, das eine Woche vorhanden ist, kann nächste Woche fehlen. Dieses Projekt verlässt sich NICHT auf die Scanner-Ausgabe als primären Nachweis der Behebung. Die Beweiskette ist:

  1. Patch-Provenienz (unabhängig von jedem Scanner verifizierbar)
  2. Build-Zeit-Attestierung (während der Kompilierung erzeugt)
  3. Regressionstest (übt den anfälligen Codepfad aus)
  4. VEX-Unterdrückung (Bestätigung auf Scanner-Ebene)

Gespeicherte Scan-Dateien sind nur punktuelle Beweise.

Was Scanner sehen (fixiertes Image)

PackageVersionCVE-2024-6119CVE-2026-42945
libssl33.0.20-1~deb12u1Nicht gemeldet (durch Version behoben)n/a
nginx1.25.5-1~bookworm+echo1n/aGemeldet, wenn in DB (Backport für Scanner unsichtbar)

Mit --vex vex.json wird der CVE-2026-42945-Fund (falls in der Scanner-DB vorhanden) unterdrückt. Die Gültigkeit des VEX-Dokuments wird durch die Provenienzkette (Patch-Ableitung, Build-Attestierung, Regressionstest) festgestellt, nicht allein durch die Scanner-Ausgabe.


Kompatibilitätstest

Die Testsuite (test/compat.py) startet sowohl nginx:1.25-bookworm als auch nginx-fixed als Docker-Container und vergleicht das Verhalten. Jede Behauptung testet direkt das live fixierte Image gegen das live Upstream-Image.

89 Tests. Alle bestanden.

Zusätzlich bietet test/test_cve_2026_42945.py ~20 Assertions speziell für den zurückportierten CVE-Fix (siehe "Regressionstest" oben).

KategorieWas verglichen wirdAnzahl der Assertions
Image-MetadatenEntrypoint, Cmd, ExposedPorts, User, StopSignal, Env, Labels7
nginx -V-ArgumenteKonfigurationsflags identisch (normalisiert für -ffile-prefix-map-Pfad)1
Dynamische ModuleAlle 12 upstream .so-Dateien vorhanden + Symlink /etc/nginx/modules13
nginx-debug-Binärdatei--with-debug und --with-http_v3_module in debug -V vorhanden2
Dateisystemlayout~20 wichtige Pfade, Log-Symlinks zu /dev/stdout und /dev/stderr~20
Benutzer-/Gruppenkonfigurationgetent passwd/group nginx Ausgabe identisch2
dpkg-Konfigurationsdateiendpkg-query meldet default.conf und nginx.conf als Konfigurationsdateien1
Paket bietetdpkg -s nginx zeigt Provides: nginx-r1.25.51
NJS-Binärdateinjs -v gibt 0.8.4 zurück1
IPv6-Entrypoint10-listen-on-ipv6-by-default.sh ändert default.conf identisch1
Envsubst-VorlagenTemplate-Substitution von NGINX_ENVSUBST erzeugt gleiche Ausgabe1
StartprotokolleAlle Entrypoint-Logzeilen stimmen mit dem Upstream-Format überein1
HTTP GET/HEAD/POSTAntwortkörper, Status, Header stimmen für mehrere Endpunkte überein~10
Fehlerhafte AnfrageRohe TCP-Fehlerantwort identisch1
Statische DateiauslieferungEingehängte Datei mit korrektem Inhalt ausgeliefert1
TLS-TerminierungHTTPS mit selbstsigniertem Zertifikat funktioniert identisch1
Sanftes HerunterfahrenSIGQUIT erzeugt sauberen Exit (Code 0)1
KonfigurationsneuladungSIGHUP wendet neue Konfiguration ohne Neustart an1

Was NICHT getestet wird

  • HTTP/3 QUIC-Protokollverhalten (nur das Vorhandensein des Flags --with-http_v3_module wird überprüft; es wird kein UDP/QUIC-Verkehr gesendet)
  • Leistungs- oder Latenzcharakteristiken unter Last
  • Alle möglichen nginx-Konfigurationsdirektiven
  • Verhalten selten genutzter dynamischer Module (GeoIP, image_filter, XSLT) über die Überprüfung hinaus, ob die .so-Dateien auf der Platte vorhanden sind

Run:```bash make test

root@kitploit:~
## Bildgröße

| Bild                | Größe (arm64, `docker images`) |
| ------------------- | ------------------------------ |
| `nginx:1.25-bookworm` | ~278 MB                        |
| `nginx-fixed`         | ~332 MB                        |

Das feste Image ist größer als das offizielle. Das ist zu erwarten: das offizielle Image verwendet vorkompilierte Binärdateien in optimierten Layern, während unseres Build-Artefakte und vollständige Laufzeitabhängigkeiten (einschließlich Bibliotheken für alle 12 dynamischen Module) in eine `debian:bookworm-slim`-Basis installiert. Der Größenunterschied ist ein Kompromiss für Build-Kontrolle auf Quellcode-Ebene, keine Regression in der Funktionalität.

---

## Restrisikobewertung

### Im festen Image verbleibende CVEs

Das feste Image enthält immer noch Schwachstellen in Systembibliotheken, die von diesem Projekt nicht behoben werden (Stand; führen Sie `make scan` für den aktuellen Stand aus):

| Risikostufe | Paket           | CVE(s)                                      | Anmerkungen                                                                                                           |
| ----------- | --------------- | ------------------------------------------- | --------------------------------------------------------------------------------------------------------------------- |
| Hoch        | nginx           | CVE-2023-44487                              | Im nginx ≥ 1.25.3 pro Upstream gemildert; Scanner markiert immer noch, da der Debian-Tracker den Sicherheitshinweis nicht geschlossen hat |
| Kritisch    | libgnutls30     | CVE-2026-42010, CVE-2026-33845              | Kein Fix in bookworm verfügbar                                                                                        |
| Kritisch    | libc6/libc-bin  | CVE-2026-5450                               | Wird in dieser Debian-Version nicht behoben                                                                           |
| Hoch        | libc6/libc-bin  | CVE-2026-5928, CVE-2026-5435, CVE-2026-4437 | glibc wird nicht behoben für bookworm                                                                                 |
| Hoch        | dpkg            | CVE-2025-6297, CVE-2026-2219                | Behebbar (Upgrade auf 1.21.23)                                                                                        |
| Hoch        | libldap-2.5-0   | CVE-2023-2953                               | Wird nicht behoben                                                                                                    |
| Hoch        | curl/libcurl4   | CVE-2026-5773, CVE-2026-6276                | Wird nicht behoben                                                                                                    |
| Hoch        | ncurses         | CVE-2025-69720                              | Wird nicht behoben                                                                                                    |

Diese werden von `debian:bookworm-slim` geerbt und liegen außerhalb des Rahmens der nginx-fokussierten CVE-Behebung dieses Projekts.

### Einschränkungen dieses Ansatzes

1. **Nicht hermetic.** Basis-Image und apt-Pakete werden zur Build-Zeit aus Live-Debian-Repositories aufgelöst. Das Pinnen des Basis-Image-SHA und die Verwendung von apt-Snapshots würden die Reproduzierbarkeit verbessern.
2. **Keine verhaltensbezogenen QUIC-Tests.** HTTP/3-Unterstützung ist kompiliert (durch Flag verifiziert), aber es wird kein QUIC-Verkehr in der Testsuite durchgeführt.
3. **Keine Leistungsvalidierung.** Der Test mit 50 gleichzeitigen Anfragen beweist die Korrektheit, nicht den Durchsatz oder die Latenzäquivalenz.
4. **Nur Modulladung.** Dynamische Module (GeoIP, image_filter, XSLT) werden als vorhanden und ladbar verifiziert, aber ihr Funktionsverhalten wird über das grundlegende Laden hinaus nicht getestet.
5. **Nur Single-Architektur-Nachweise.** Tests werden nur auf der Build-Host-Architektur ausgeführt (arm64 in der Entwicklung; CI für Multi-Arch wäre nötig).

### Zukünftige Verbesserungen (nicht implementiert)

1. Basis-Image-Digest pinnen und apt-Snapshot-URLs für hermetic Builds verwenden.
2. Unnötige Pakete (ncurses, util-linux) entfernen, die als transitive Abhängigkeiten hereinkommen.
3. SBOM generieren (`make sbom`-Ziel existiert, verwendet `syft`) und über SBOM-Purl mit VEX verknüpfen.
4. Das Image mit `cosign` signieren und VEX + SBOM + Patch-Attestation als OCI-Attestationen anhängen.
5. CI-Pipeline (GitHub Actions) für automatisiertes Build → Test → Scan → Push hinzufügen.
6. HTTP/3-Protokolltest (QUIC-Client, Zertifikatseinrichtung, UDP-Port) hinzufügen.
7. Distroless-Basis in Betracht ziehen, um OS-Level-CVE-Rauschen vollständig zu eliminieren.
8. ASan (AddressSanitizer)-Build-Variante hinzufügen, um zu beweisen, dass es unter Testlast keine Heap-Korruption gibt.

---

## Build-Flags vs. Upstream

Die `./configure`-Flags in `build.sh` sind identisch mit denen, die von `nginx -V` im offiziellen `nginx:1.25-bookworm`-Image gemeldet werden. Dies wird durch `test/compat.py::test_nginx_version` überprüft, das den `-ffile-prefix-map=<Pfad>`-Unterschied normalisiert und die verbleibenden Flags zeichenweise vergleicht.

Bemerkenswerte Flags (alle in beiden Images vorhanden):

| Flag / Feature            | Zweck                                                                            |
| ------------------------- | -------------------------------------------------------------------------------- |
| `--prefix=/etc/nginx`     | Docker-Image-Konvention (nicht Debians `/usr/share/nginx`)                       |
| `--with-http_v3_module`   | Integrierter QUIC-Stack (unabhängig von der OpenSSL-QUIC-API)                    |
| `--with-pcre` (PCRE2)      | Verknüpft mit `libpcre2-8-0` (nicht veraltetem PCRE1)                            |
| `--with-stream`           | TCP/UDP-Proxy-Modul (dynamisch)                                                  |
| Sicherheitshärtung        | `-fstack-protector-strong`, `FORTIFY_SOURCE=2`, RELRO, PIE                       |
| Dynamische Module (×12)  | geoip, stream_geoip, image_filter, xslt, http_js, stream_js (release + debug)   |
| `--with-debug` (debug)   | nginx-debug-Binärdatei separat mit identischen Flags + Debug gebaut              |

---

## Debian-Paket

Die `.deb`-Paket-Metadaten:```
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) – erfordert explizit ein gepatchtes OpenSSL (Upstream deklariert >= 3.0.0). Dies ist der Mechanismus, der den Fix für CVE-2024-6119 erzwingt.
  • Provides: nginx-r1.25.5 – erfüllt die Abhängigkeiten dynamischer Modulpakete, die von diesem virtuellen Paket abhängen.
  • Conffiles registriert bei dpkg: /etc/nginx/nginx.conf und /etc/nginx/conf.d/default.conf. Dies wird für die Überprüfung des IPv6-Entrypoint-Skripts mittels dpkg-query --showformat benötigt.
  • postinst erstellt den Benutzer/die Gruppe nginx mit uid/gid 101 und Shell /bin/false (entspricht dem Upstream – im Testsuite verifiziert).
  • Enthält: nginx-Binärdatei, nginx-debug-Binärdatei, alle 12 .so-Module, vollständigen /etc/nginx-Konfigurationsbaum, init.d/systemd/logrotate-Dateien, Handbuchseite, HTML-Standardseiten und den Symlink /etc/nginx/modules → /usr/lib/nginx/modules.

Entwurfsentscheidungen und Abwägungen

  1. Paketname nginx, nicht nginx-custom. Bei einer Umbenennung würden Scanner es nicht mit nginx-Advisories abgleichen – alle nginx-CVEs würden stillschweigend aus den Berichten verschwinden, einschließlich ungefixter. Die Beibehaltung des Namens nginx gewährleistet ehrliche Scannerberichte und macht VEX sinnvoll.
  2. VEX erfordert CVE-Sichtbarkeit. Der Zweck von VEX ist es, eine bereits gemeldete CVE zu unterdrücken. Wenn der Scanner die CVE nicht findet (aufgrund von Paketumbenennung oder DB-Timing), gibt es nichts zu unterdrücken.
  3. libssl3 (>= 3.0.14) als Paketabhängigkeit. Anstatt darauf zu hoffen, dass die Laufzeitumgebung zufällig ein gepatchtes OpenSSL enthält, erzwingt das .deb eine Version, die den Fix für CVE-2024-6119 enthält.
  4. Volatilität der Scannerdatenbanken. Advisory-Datenbanken werden regelmäßig neu aufgebaut. Eine in einer Woche vorhandene CVE kann in der nächsten fehlen. Die gespeicherten Scan-Dateien in diesem Repository sind Momentaufnahmen; aktuelle Scans können abweichen.
  5. Verwendete KI-Werkzeuge. GitHub Copilot half bei der Patch-Analyse (Vergleich der nginx 1.25.5 und 1.30.1 Quellbäume), der Testsuite-Struktur, der Identifizierung des Problems der Scanner-Umgehung durch Paketumbenennung und der Erstellung des VEX-Dokuments. Debian-Paketierungsdetails und Grype-Version-Matching-Heuristiken erforderten manuelle Überprüfung.
Tool herunterladen
Gleichzeitige Anfragen50 parallele Anfragen geben alle 200 zurück1