Espace de travail IA auto-hébergé avec agents, compétences et outils (Gmail, Calendar) qui fonctionne entièrement avec vos propres clés API de fournisseur (BYOK). Apportez vos propres clés — Groq, OpenRouter, NVIDIA, Hugging Face, Google AI.
Vérificateur hors ligne pour les 21 avis de sécurité au niveau du dépôt de
org.asynchttpclient:async-http-client (AsyncHttpClient, « AHC »).
Il vous indique auxquels votre jar est réellement exposé, signale ceux que Dependabot et OSV
ne peuvent pas voir, et donne une réponse par ligne : 3.0.13 (3.x) / 2.16.1 (2.x).
Jar unique, zéro dépendance à l'exécution, entièrement hors ligne, Java 17+.
Le 2026-08-09, les mainteneurs d'AsyncHttpClient ont publié 17 avis de sécurité sur le dépôt
du projet lui-même (AsyncHttpClient/async-http-client → Security → Advisories).
Dependabot et OSV ne lisent pas cette page. Ils lisent la . Au 2026-09-19, cette base ne contient que des 17 (, , , , tous ajoutés le 2026-09-17). Les autres renvoient depuis ; deux de ces 13 ont même des identifiants CVE (, ).
CVE-2026-85716CVE-2026-85717CVE-2026-85720CVE-2026-85721404GET /advisories/<GHSA>CVE-2026-85718CVE-2026-85719En incluant les quatre avis plus anciens (CVE-2024-53990, CVE-2026-40490, CVE-2026-45300,
CVE-2026-55688), le dépôt en liste 21 ; la base de données globale en contient 8.
Calculez « la version qui règle tout » à partir de la base de données globale et la réponse en 3.x
est 3.0.12. OSV est d'accord : POST /v1/query pour 3.0.12 renvoie zéro
vulnérabilité.
Les avis du dépôt disent que 3.0.12 se trouve encore dans la plage de cinq d'entre eux :
| Avis | Sévérité | Quoi | Nécessite |
|---|---|---|---|
GHSA-rqf5-2wxv-rjf4 | élevée | Un challenge Digest sans nonce utilisable reçoit une réponse Authorization: Basic, c'est-à-dire le mot de passe en base64 | Un Realm Digest (authentification serveur ou proxy) |
GHSA-jmqq-x5g9-9p2w | élevée | Lorsqu'une requête est rejouée vers un hôte différent, la requête / les identifiants du premier hôte partent vers le second hôte | Un rejeu vers un autre hôte (un ResponseFilter de basculement ou le chemin de nouvelle tentative sur IOException) et des identifiants ou un proxy |
GHSA-vvp4-63h8-v5pm | moyenne | Les connexions NTLM / Negotiate sont réutilisées entre principaux | NTLM ou Negotiate avec des identifiants par requête |
GHSA-f9m8-cv68-674w | moyenne | Le Domain du cookie n'est pas vérifié par rapport à la liste des suffixes publics (Domain=co.uk) | Un CookieStore partagé entre origines |
GHSA-qhv6-3pmh-95q4 | faible | qop="auth-int" désactive l'authentification mutuelle Digest (3.0.12 uniquement) | Authentification Digest |
Soyez précis au sujet des deux avis de sévérité élevée : ils divulguent des identifiants, mais
uniquement si vous avez configuré des identifiants (un Realm, Digest/NTLM, ou un proxy) — et
GHSA-jmqq nécessite en plus un rejeu vers un hôte différent. Un client effectuant de simples GET
non authentifiés n'y est pas exposé. Cet outil ne sait pas comment vous utilisez le client ; il
rapporte ce que dit la plage de versions et vous laisse décider.
Les mainteneurs le disent eux-mêmes dans le texte de CVE-2026-85721 :
Notez que 3.0.12 est elle-même affectée par un problème distinct, GHSA-rqf5-2wxv-rjf4 … Passez à 3.0.13 pour bénéficier des deux correctifs.
Donc en 3.x : Dependabot dit 3.0.12, et après votre mise à niveau il affiche du vert. La vraie
réponse est 3.0.13. En 2.x, la réponse est 2.16.1 dans les deux cas — mais 13 des avis
derrière cela restent invisibles pour votre scanner.
CVE-2026-85721 (élevée) est celui qui s'applique aux paramètres par défaut : la décompression
automatique des réponses est activée par défaut, et le chemin HTTP/1.1 gonfle le corps sans limite
sur la taille totale. Un serveur malveillant ou compromis — ou toute personne capable de modifier la
réponse en transit — peut envoyer un petit corps gzip/deflate qui épuise le tas. Affectés :
<= 3.0.11 et <= 2.16.0. Celui-ci est dans la base de données globale, donc Dependabot alerte
bien dessus.
Les plages mélangent >=, <=, <, un = 3.0.12 explicite, et un 3.0.0 nu. Le même 3.0.11
est sûr pour CVE-2026-55688 (< 3.0.11) et affecté pour GHSA-v9f2-7rw2-gr2x
(<= 3.0.11). La table de règles conserve chaque opérateur exactement tel qu'écrit ; une assertion
dans tools/gen_rules.py et un test unitaire échouent si la borne cesse de se comporter ainsi. Tout
fragment de plage que l'analyseur ne reconnaît pas est une erreur — jamais « non affecté ».
Lorsque le dépôt et la base de données globale portent tous deux un avis mais sont en désaccord, la
table de règles prend l'union. Aujourd'hui, c'est un seul cas : CVE-2024-53990 — le dépôt ne
liste que la version 3.x 3.0.0, la base de données globale liste aussi la 2.x >= 2.1.0, < 2.12.4.
Se fier à un seul côté sous-signalerait.
pom.xml — volontairementAHC est généralement une dépendance transitive, tirée par un SDK ou une bibliothèque cliente.
L'artifactId peut ne jamais apparaître dans votre pom.xml. Cet outil lit
META-INF/maven/org.asynchttpclient/async-http-client/pom.properties à l'intérieur des jars qui
sont réellement livrés — y compris les jars imbriqués dans un fat-jar Spring Boot (BOOT-INF/lib)
ou un WAR (WEB-INF/lib). La coordonnée héritée 1.x com.ning:async-http-client a le même
artifactId ; elle est listée mais non jugée.
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
Chaque correspondance affiche l'ID (CVE s'il y en a un, sinon GHSA), la sévérité, le titre, la
version corrigée, et Dependabot/全局库:未收录 (« absent de la base de données globale ») le
cas échéant. La sortie est en chinois.
| Code | Signification |
|---|---|
0 | Non affecté par aucun des 21, et chaque fichier a bien été lu |
1 | Affecté |
2 | Impossible de juger — arguments invalides, aucun jar AHC trouvé, version non reconnue, ou version préliminaire hors des plages publiées |
4 | Un fichier n'a pas pu être lu — pas un zip, tronqué, ou une erreur d'E/S |
« Je n'ai pas pu le lire » et « vous êtes en sécurité » doivent être deux phrases différentes. Un
jar légitimement vide (un simple enregistrement EOCD de 22 octets) n'est pas un échec de lecture. Si
un fichier est affecté et qu'un autre est illisible, le code de sortie reste 1.
async-http-client. Les CVE Netty dans les jars Netty dont
dépend AHC ne sont pas couvertes.tools/recheck_before_publish.py vérifie s'il existe encore.src/main/java/dev/mikko/ahccheck/RuleTable.java est généré, jamais modifié à la main :
python tools/gen_rules.py --dry # run the assertions only
python tools/gen_rules.py # regenerate the table
Il lit les avis au niveau du dépôt (vulnerable_version_range, patched_versions), recherche
chacun dans la base de données globale, et enregistre « visible par Dependabot : oui/non » comme
champ de chaque règle. Sept assertions doivent passer sinon rien n'est écrit : le nombre d'avis et
l'ensemble exact des 13 manquants dans la base de données globale correspondent toujours à la
référence ; les intersections sont toujours 3.0.13 / 2.16.1 (et 3.0.12 lorsqu'elles sont
calculées à partir de la base de données globale seule) ; ces versions renvoient 200 depuis Maven
Central tandis qu'une version sentinelle renvoie 404 ; 3.0.12 touche toujours au moins un avis de
sévérité élevée et aucun de ceux-ci n'est dans la base de données globale ; tous les styles
d'opérateurs sont présents et le cas limite bascule toujours ; et le désaccord dépôt/global est
toujours exactement celui connu.
Les vérifications de bout en bout sur de vrais jars se trouvent dans tools/e2e_real_jars.py (de
vrais jars de Maven Central, y compris un fat-jar et un WAR). tools/recheck_before_publish.py
revérifie l'écart — base de données globale, OSV et Maven Central, chacun avec un contrôle positif
et une sentinelle — et se termine avec un code non nul si quoi que ce soit a bougé.
Apache License 2.0 — voir LICENSE.