
Selbstgehosteter KI-Arbeitsbereich mit Agenten, Skills und Tools (Gmail, Kalender), der vollständig mit deinen eigenen Provider-API-Schlüsseln (BYOK) läuft. Bring deine eigenen Schlüssel mit — Groq, OpenRouter, NVIDIA, Hugging Face, Google AI.
Offline-Prüfer für die 21 repository-basierten Sicherheitshinweise von
org.asynchttpclient:async-http-client (AsyncHttpClient, "AHC").
Er zeigt dir, welchen davon dein Jar tatsächlich ausgesetzt ist, markiert diejenigen, die Dependabot und OSV
nicht sehen können, und liefert eine Antwort pro Zeile: 3.0.13 (3.x) / 2.16.1 (2.x).
Ein einzelnes Jar, keine Laufzeitabhängigkeiten, vollständig offline, Java 17+.
Am 2026-08-09 veröffentlichten die AsyncHttpClient-Maintainer 17 Sicherheitshinweise im eigenen
Repository des Projekts (AsyncHttpClient/async-http-client → Security → Advisories).
Dependabot und OSV lesen diese Seite nicht. Sie lesen die globale GitHub-Advisory-Datenbank. Stand
2026-09-19 enthält diese Datenbank nur 4 der 17 (CVE-2026-85716, CVE-2026-85717,
CVE-2026-85720, CVE-2026-85721, alle am 2026-09-17 hinzugefügt). Die anderen 13 liefern 404
bei GET /advisories/<GHSA>; zwei dieser 13 haben sogar CVE-IDs (CVE-2026-85718, CVE-2026-85719).
Zählt man die vier älteren Hinweise dazu (CVE-2024-53990, CVE-2026-40490, CVE-2026-45300,
CVE-2026-55688), listet das Repository 21; die globale Datenbank hat 8.
Berechnet man „die Version, die alles bereinigt" aus der globalen Datenbank, lautet die 3.x-Antwort
3.0.12. OSV stimmt zu: POST /v1/query für 3.0.12 liefert null Schwachstellen.
Die Repository-Hinweise sagen, dass 3.0.12 noch im Bereich von fünf liegt:
| Hinweis | Schweregrad | Was | Benötigt |
|---|---|---|---|
GHSA-rqf5-2wxv-rjf4 | high | Eine Digest-Challenge ohne nutzbare Nonce wird mit Authorization: Basic beantwortet, d. h. das Passwort in base64 | Ein Digest-Realm (Server- oder Proxy-Authentifizierung) |
GHSA-jmqq-x5g9-9p2w | high | Wenn eine Anfrage an einen anderen Host erneut gesendet wird, gehen Anfrage / Anmeldedaten des ersten Hosts an den zweiten Host | Replay an einen anderen Host (ein Failover-ResponseFilter oder der IOException-Retry-Pfad) und Anmeldedaten oder ein Proxy |
GHSA-vvp4-63h8-v5pm | medium | NTLM-/Negotiate-Verbindungen werden über verschiedene Principals hinweg wiederverwendet | NTLM oder Negotiate mit Anmeldedaten pro Anfrage |
GHSA-f9m8-cv68-674w | medium | Cookie-Domain wird nicht gegen die Public-Suffix-Liste geprüft (Domain=co.uk) | Ein gemeinsamer CookieStore über Origins hinweg |
GHSA-qhv6-3pmh-95q4 | low | qop="auth-int" schaltet die gegenseitige Digest-Authentifizierung ab (nur 3.0.12) | Digest-Authentifizierung |
Sei präzise bei den beiden High-Hinweisen: Sie leaken Anmeldedaten, aber nur wenn du
Anmeldedaten konfiguriert hast (ein Realm, Digest/NTLM oder einen Proxy) — und GHSA-jmqq benötigt
zusätzlich ein Replay an einen anderen Host. Ein Client, der einfache unauthentifizierte GETs ausführt, ist ihnen nicht ausgesetzt. Dieses Tool
weiß nicht, wie du den Client verwendest; es meldet, was der Versionsbereich sagt, und überlässt dir die Entscheidung.
Die Maintainer sagen es selbst im Text von CVE-2026-85721:
Note that 3.0.12 is itself affected by a separate issue, GHSA-rqf5-2wxv-rjf4 … Upgrade to 3.0.13 to pick up both fixes.
Also bei 3.x: Dependabot sagt 3.0.12, und nach dem Upgrade zeigt es grün an. Die echte Antwort ist
3.0.13. Bei 2.x lautet die Antwort so oder so 2.16.1 — aber 13 der dahinterstehenden Hinweise sind
für deinen Scanner weiterhin unsichtbar.
CVE-2026-85721 (high) ist derjenige, der für Standardeinstellungen gilt: Die automatische
Antwort-Dekomprimierung ist standardmäßig aktiviert, und der HTTP/1.1-Pfad entpackt den Body ohne
Begrenzung der Gesamtgröße. Ein bösartiger oder kompromittierter Server — oder jeder, der die Antwort
unterwegs verändern kann — kann einen kleinen gzip/deflate-Body senden, der den Heap erschöpft.
Betroffen: <= 3.0.11 und <= 2.16.0.
Dieser ist in der globalen Datenbank, daher warnt Dependabot davor.
Die Bereiche mischen >=, <=, <, ein explizites = 3.0.12 und ein bloßes 3.0.0. Dasselbe 3.0.11 ist
sicher für CVE-2026-55688 (< 3.0.11) und betroffen für GHSA-v9f2-7rw2-gr2x
(<= 3.0.11). Die Regeltabelle behält jeden Operator exakt wie geschrieben bei; eine Assertion in
tools/gen_rules.py und ein Unit-Test schlagen fehl, wenn die Grenze aufhört, sich so zu verhalten. Jedes Bereichs-
fragment, das der Parser nicht erkennt, ist ein Fehler — niemals „nicht betroffen".
Wo das Repository und die globale Datenbank beide einen Hinweis führen, aber voneinander abweichen, nimmt die Regeltabelle
die Vereinigung. Heute ist das ein Fall: CVE-2024-53990 — das Repository listet nur die 3.x-
Version 3.0.0, die globale Datenbank listet zusätzlich 2.x >= 2.1.0, < 2.12.4. Nur einer Seite zu
vertrauen, würde zu wenig melden.
pom.xml nicht — absichtlichAHC ist normalerweise eine transitive Abhängigkeit, hereingezogen von einem SDK oder einer Client-Bibliothek. Die artifactId
taucht in deiner pom.xml möglicherweise nie auf. Dieses Tool liest
META-INF/maven/org.asynchttpclient/async-http-client/pom.properties in den Jars, die tatsächlich
ausgeliefert werden — einschließlich Jars, die in einem Spring-Boot-Fat-Jar (BOOT-INF/lib) oder einem WAR (WEB-INF/lib) verschachtelt sind.
Die Legacy-1.x-Koordinate com.ning:async-http-client hat dieselbe artifactId; sie wird aufgelistet, aber nicht
bewertet.
java -jar async-http-client-check.jar target/ # scan build output
java -jar async-http-client-check.jar myapp.jar # fat-jar / war, nested jars included
java -jar async-http-client-check.jar --version-of 3.0.12 # judge a version directly
Jeder Treffer gibt die ID (CVE, falls vorhanden, sonst GHSA), den Schweregrad, den Titel, die korrigierte Version und
Dependabot/全局库:未收录 („nicht in der globalen Datenbank") aus, wo zutreffend. Die Ausgabe ist auf
Chinesisch.
| Code | Bedeutung |
|---|---|
0 | Von keinem der 21 betroffen, und jede Datei wurde tatsächlich gelesen |
1 | Betroffen |
2 | Konnte nicht bewertet werden — ungültige Argumente, kein AHC-Jar gefunden, nicht erkannte Version oder eine Vorabversion, die außerhalb der veröffentlichten Bereiche liegt |
4 | Eine Datei konnte nicht gelesen werden — kein Zip, abgeschnitten oder ein I/O-Fehler |
„Ich konnte es nicht lesen" und „du bist sicher" müssen zwei verschiedene Sätze sein. Ein legitimes leeres Jar
(ein bloßer 22-Byte-EOCD-Datensatz) ist kein Lesefehler. Wenn eine Datei betroffen und eine andere unlesbar ist,
bleibt der Exit-Code 1.
async-http-client. Netty-CVEs in den Netty-Jars, von denen AHC abhängt,
sind nicht abgedeckt.tools/recheck_before_publish.py prüft, ob sie noch existiert.src/main/java/dev/mikko/ahccheck/RuleTable.java ist generiert, niemals von Hand bearbeitet:
python tools/gen_rules.py --dry # run the assertions only
python tools/gen_rules.py # regenerate the table
Sie liest die repository-basierten Hinweise (vulnerable_version_range, patched_versions), schlägt
jeden in der globalen Datenbank nach und zeichnet „für Dependabot sichtbar: ja/nein" als Feld jeder
Regel auf. Sieben Assertions müssen bestehen, sonst wird nichts geschrieben: die Anzahl der Hinweise und die exakte Menge der 13,
die in der globalen Datenbank fehlen, stimmen noch mit der Baseline überein; die Schnittmengen sind noch 3.0.13 /
2.16.1 (und 3.0.12, wenn allein aus der globalen Datenbank berechnet); diese Versionen liefern 200
von Maven Central, während eine Sentinel-Version 404 liefert; 3.0.12 trifft noch mindestens einen High-
Hinweis und keiner davon ist in der globalen Datenbank; alle Operator-Stile sind vorhanden und der
Grenzfall kippt noch; und die Abweichung zwischen Repository und globaler Datenbank ist noch exakt die bekannte.
End-to-End-Prüfungen mit echten Jars liegen in tools/e2e_real_jars.py (tatsächliche Jars von Maven Central,
einschließlich eines Fat-Jars und eines WAR). tools/recheck_before_publish.py verifiziert die Lücke erneut —
globale Datenbank, OSV und Maven Central, jeweils mit einer Positivkontrolle und einem Sentinel — und beendet sich
mit einem Nicht-Null-Code, wenn sich etwas geändert hat.
Apache License 2.0 — siehe LICENSE.