
Espaço de trabalho de IA auto-hospedado com agentes, habilidades e ferramentas (Gmail, Calendar) que funciona inteiramente com as suas próprias chaves de API de provedores (BYOK). Traga as suas próprias chaves — Groq, OpenRouter, NVIDIA, Hugging Face, Google AI.
Verificador offline para os 21 avisos de segurança em nível de repositório do
org.asynchttpclient:async-http-client (AsyncHttpClient, "AHC").
Ele informa a quais deles seu jar está realmente exposto, sinaliza os que o Dependabot e o OSV
não conseguem ver, e dá uma resposta por linha: 3.0.13 (3.x) / 2.16.1 (2.x).
Jar único, zero dependências de runtime, totalmente offline, Java 17+.
Em 2026-08-09, os mantenedores do AsyncHttpClient publicaram 17 avisos de segurança no próprio
repositório do projeto (AsyncHttpClient/async-http-client → Security → Advisories).
O Dependabot e o OSV não leem essa página. Eles leem o . Em 2026-09-19, esse banco contém apenas dos 17 (, , , , todos adicionados em 2026-09-17). Os outros retornam em ; dois desses 13 ainda têm IDs CVE (, ).
CVE-2026-85716CVE-2026-85717CVE-2026-85720CVE-2026-85721404GET /advisories/<GHSA>CVE-2026-85718CVE-2026-85719Incluindo os quatro avisos mais antigos (CVE-2024-53990, CVE-2026-40490, CVE-2026-45300,
CVE-2026-55688), o repositório lista 21; o banco de dados global tem 8.
Calcule "a versão que resolve tudo" a partir do banco de dados global e a resposta para 3.x é
3.0.12. O OSV concorda: POST /v1/query para 3.0.12 retorna zero vulnerabilidades.
Os avisos do repositório dizem que 3.0.12 ainda está dentro do intervalo de cinco:
| Aviso | Severidade | O quê | Requer |
|---|---|---|---|
GHSA-rqf5-2wxv-rjf4 | alta | Um desafio Digest sem nonce utilizável é respondido com Authorization: Basic, ou seja, a senha em base64 | Um Realm Digest (autenticação de servidor ou proxy) |
GHSA-jmqq-x5g9-9p2w | alta | Quando uma requisição é reproduzida para um host diferente, a requisição/credenciais do primeiro host vão para o segundo host | Reprodução para outro host (um ResponseFilter de failover ou o caminho de retry de IOException) e credenciais ou um proxy |
GHSA-vvp4-63h8-v5pm | média | Conexões NTLM / Negotiate são reutilizadas entre principals | NTLM ou Negotiate com credenciais por requisição |
GHSA-f9m8-cv68-674w | média | O Domain do cookie não é verificado contra a lista de sufixos públicos (Domain=co.uk) | Um CookieStore compartilhado entre origens |
GHSA-qhv6-3pmh-95q4 | baixa | qop="auth-int" desativa a autenticação mútua Digest (apenas 3.0.12) | Autenticação Digest |
Seja preciso sobre os dois de severidade alta: eles vazam credenciais, mas apenas se você
configurou credenciais (um Realm, Digest/NTLM ou um proxy) — e GHSA-jmqq adicionalmente
precisa de uma reprodução para um host diferente. Um cliente fazendo GETs simples não autenticados
não está exposto a eles. Esta ferramenta não sabe como você usa o cliente; ela relata o que o
intervalo de versões diz e deixa a decisão com você.
Os próprios mantenedores dizem isso no texto de CVE-2026-85721:
Note que 3.0.12 é ela mesma afetada por um problema separado, GHSA-rqf5-2wxv-rjf4 … Atualize para 3.0.13 para obter ambas as correções.
Então em 3.x: o Dependabot diz 3.0.12, e depois que você atualiza ele mostra verde. A resposta
real é 3.0.13. Em 2.x a resposta é 2.16.1 de qualquer forma — mas 13 dos avisos por trás
disso ainda são invisíveis para o seu scanner.
CVE-2026-85721 (alta) é o que se aplica a configurações padrão: a descompressão automática de
respostas está ativada por padrão, e o caminho HTTP/1.1 infla o corpo sem limite de tamanho total.
Um servidor malicioso ou comprometido — ou qualquer um capaz de modificar a resposta em trânsito —
pode enviar um corpo gzip/deflate pequeno que esgota o heap. Afetados: <= 3.0.11 e <= 2.16.0.
Este está no banco de dados global, então o Dependabot alerta sobre ele.
Os intervalos misturam >=, <=, <, um = 3.0.12 explícito e um 3.0.0 puro. O mesmo 3.0.11 é
seguro para CVE-2026-55688 (< 3.0.11) e afetado para GHSA-v9f2-7rw2-gr2x
(<= 3.0.11). A tabela de regras mantém cada operador exatamente como escrito; uma asserção em
tools/gen_rules.py e um teste unitário falham se o limite deixar de se comportar assim. Qualquer
fragmento de intervalo que o parser não reconheça é um erro — nunca "não afetado".
Onde o repositório e o banco de dados global ambos contêm um aviso mas discordam, a tabela de regras
usa a união. Hoje isso é um caso: CVE-2024-53990 — o repositório lista apenas a versão 3.x
3.0.0, o banco de dados global também lista 2.x >= 2.1.0, < 2.12.4. Confiar em apenas um lado
subnotificaria.
pom.xml — de propósitoO AHC geralmente é uma dependência transitiva, trazida por um SDK ou biblioteca cliente. O
artifactId pode nunca aparecer no seu pom.xml. Esta ferramenta lê
META-INF/maven/org.asynchttpclient/async-http-client/pom.properties dentro dos jars que realmente
são distribuídos — incluindo jars aninhados em um fat-jar do Spring Boot (BOOT-INF/lib) ou um WAR
(WEB-INF/lib). A coordenada legada 1.x com.ning:async-http-client tem o mesmo artifactId; ela é
listada mas não julgada.
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
Cada ocorrência imprime o ID (CVE se houver, caso contrário GHSA), severidade, título, versão
corrigida e Dependabot/全局库:未收录 ("não está no banco de dados global") quando aplicável. A
saída está em chinês.
| Código | Significado |
|---|---|
0 | Não afetado por nenhum dos 21, e todo arquivo foi realmente lido |
1 | Afetado |
2 | Não foi possível julgar — argumentos inválidos, nenhum jar do AHC encontrado, versão não reconhecida, ou uma versão pré-lançamento que fica fora dos intervalos publicados |
4 | Algum arquivo não pôde ser lido — não é um zip, truncado, ou uma falha de I/O |
"Não consegui ler" e "você está seguro" devem ser duas frases diferentes. Um jar legitimamente vazio
(um registro EOCD puro de 22 bytes) não é uma falha de leitura. Se um arquivo está afetado e outro
é ilegível, o código de saída permanece 1.
async-http-client. CVEs do Netty nos jars do Netty dos quais
o AHC depende não são cobertos.tools/recheck_before_publish.py verifica se ela ainda existe.src/main/java/dev/mikko/ahccheck/RuleTable.java é gerado, nunca editado à mão:
python tools/gen_rules.py --dry # run the assertions only
python tools/gen_rules.py # regenerate the table
Ele lê os avisos em nível de repositório (vulnerable_version_range, patched_versions), procura
cada um no banco de dados global, e registra "visível para o Dependabot: sim/não" como um campo de
cada regra. Sete asserções devem passar ou nada é escrito: a contagem de avisos e o conjunto exato
de 13 ausentes do banco de dados global ainda correspondem à linha de base; as interseções ainda são
3.0.13 / 2.16.1 (e 3.0.12 quando calculadas apenas a partir do banco de dados global); essas
versões retornam 200 do Maven Central enquanto uma versão sentinela retorna 404; 3.0.12 ainda
atinge pelo menos um aviso de severidade alta e nenhum deles está no banco de dados global; todos os
estilos de operador estão presentes e o caso de limite ainda inverte; e a discordância
repositório/global ainda é exatamente a conhecida.
Verificações ponta a ponta com jars reais ficam em tools/e2e_real_jars.py (jars reais do Maven
Central, incluindo um fat-jar e um WAR). tools/recheck_before_publish.py reverifica a lacuna —
banco de dados global, OSV e Maven Central, cada um com um controle positivo e uma sentinela — e
sai com código diferente de zero se algo mudou.
Apache License 2.0 — veja LICENSE.