
Самостоятельно размещаемое рабочее пространство ИИ с агентами, навыками и инструментами (Gmail, Calendar), которое полностью работает на ваших собственных API-ключах провайдера (BYOK). Используйте свои ключи — Groq, OpenRouter, NVIDIA, Hugging Face, Google AI.
Автономный офлайн-сканер для 21 рекомендации по безопасности уровня репозитория
org.asynchttpclient:async-http-client (AsyncHttpClient, "AHC").
Он сообщает, каким из них реально подвержен ваш jar, отмечает те, которые Dependabot и OSV
не видят, и даёт один ответ на строку: 3.0.13 (3.x) / 2.16.1 (2.x).
Один jar, ноль runtime-зависимостей, полностью офлайн, Java 17+.
2026-08-09 сопровождающие AsyncHttpClient опубликовали 17 рекомендаций по безопасности в
собственном репозитории проекта (AsyncHttpClient/async-http-client → Security → Advisories).
Dependabot и OSV не читают эту страницу. Они читают глобальную базу рекомендаций GitHub. По состоянию на 2026-09-19 в этой базе содержится только из 17 (, , , , все добавлены 2026-09-17). Остальные возвращают на ; у двух из этих 13 даже есть CVE-идентификаторы (, ).
CVE-2026-85716CVE-2026-85717CVE-2026-85720CVE-2026-85721404GET /advisories/<GHSA>CVE-2026-85718CVE-2026-85719Включая четыре более старые рекомендации (CVE-2024-53990, CVE-2026-40490, CVE-2026-45300,
CVE-2026-55688), репозиторий перечисляет 21; в глобальной базе есть 8.
Вычислите "версию, которая закрывает всё" по глобальной базе, и ответ для 3.x будет
3.0.12. OSV соглашается: POST /v1/query для 3.0.12 возвращает ноль уязвимостей.
Рекомендации репозитория говорят, что 3.0.12 всё ещё входит в диапазон пяти:
| Рекомендация | Критичность | Что | Требуется |
|---|---|---|---|
GHSA-rqf5-2wxv-rjf4 | высокая | На Digest-запрос без пригодного nonce отвечают Authorization: Basic, то есть пароль в base64 | Digest Realm (аутентификация сервера или прокси) |
GHSA-jmqq-x5g9-9p2w | высокая | Когда запрос повторяется к другому хосту, запрос / учётные данные первого хоста уходят второму хосту | Повтор к другому хосту (failover ResponseFilter или путь повторной попытки при IOException) и учётные данные или прокси |
GHSA-vvp4-63h8-v5pm | средняя | Соединения NTLM / Negotiate переиспользуются между разными принципалами | NTLM или Negotiate с учётными данными на каждый запрос |
GHSA-f9m8-cv68-674w | средняя | Cookie Domain не проверяется по списку публичных суффиксов (Domain=co.uk) | Общий CookieStore между источниками |
GHSA-qhv6-3pmh-95q4 | низкая | qop="auth-int" отключает взаимную аутентификацию Digest (только 3.0.12) | Digest-аутентификация |
Будьте точны насчёт двух высоких: они утекают учётные данные, но только если вы настроили
учётные данные (Realm, Digest/NTLM или прокси) — а GHSA-jmqq дополнительно требует повтора к
другому хосту. Клиент, выполняющий обычные неаутентифицированные GET-запросы, им не подвержен. Этот инструмент не
знает, как вы используете клиент; он сообщает то, что говорит диапазон версий, и оставляет решение за вами.
Сопровождающие сами говорят это в тексте 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.
Итак, для 3.x: Dependabot говорит 3.0.12, и после обновления он показывает зелёный. Реальный ответ —
3.0.13. Для 2.x ответ в любом случае 2.16.1 — но 13 рекомендаций за ним
всё ещё невидимы для вашего сканера.
CVE-2026-85721 (высокая) — та, что применяется к настройкам по умолчанию: автоматическая
декомпрессия ответа включена по умолчанию, а путь HTTP/1.1 раздувает тело без ограничения общего размера.
Вредоносный или скомпрометированный сервер — или любой, кто способен изменить ответ в пути, — может отправить
небольшое тело gzip/deflate, которое исчерпает кучу. Затронуты: <= 3.0.11 и <= 2.16.0.
Эта есть в глобальной базе, поэтому Dependabot о ней предупреждает.
Диапазоны смешивают >=, <=, <, явное = 3.0.12 и голое 3.0.0. Одна и та же 3.0.11
безопасна для CVE-2026-55688 (< 3.0.11) и затронута для GHSA-v9f2-7rw2-gr2x
(<= 3.0.11). Таблица правил сохраняет каждый оператор точно как написано; утверждение в
tools/gen_rules.py и модульный тест падают, если граница перестаёт вести себя так. Любой фрагмент диапазона,
который не распознаёт парсер, — это ошибка, а не "не затронуто".
Там, где репозиторий и глобальная база оба содержат рекомендацию, но расходятся, таблица правил
берёт объединение. Сегодня это один случай: CVE-2024-53990 — репозиторий перечисляет только версию 3.x
3.0.0, глобальная база также перечисляет 2.x >= 2.1.0, < 2.12.4. Доверие только одной стороне
привело бы к неполному отчёту.
pom.xml — намеренноAHC обычно является транзитивной зависимостью, подтягиваемой SDK или клиентской библиотекой. artifactId
может вообще не появляться в вашем pom.xml. Этот инструмент читает
META-INF/maven/org.asynchttpclient/async-http-client/pom.properties внутри jar-файлов, которые фактически
поставляются — включая jar-файлы, вложенные в Spring Boot fat-jar (BOOT-INF/lib) или WAR (WEB-INF/lib).
Устаревшая координата 1.x com.ning:async-http-client имеет тот же artifactId; она перечислена, но не
оценивается.
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
Каждое попадание выводит ID (CVE, если есть, иначе GHSA), критичность, заголовок, исправленную версию и
Dependabot/全局库:未收录 ("не в глобальной базе"), где применимо. Вывод на
китайском языке.
| Код | Значение |
|---|---|
0 | Не затронут ни одной из 21, и каждый файл действительно был прочитан |
1 | Затронут |
2 | Не удалось оценить — неверные аргументы, AHC jar не найден, нераспознанная версия или предрелизная версия, выходящая за пределы опубликованных диапазонов |
4 | Некоторый файл не удалось прочитать — не zip, усечён или сбой ввода-вывода |
"Я не смог прочитать" и "вы в безопасности" должны быть двумя разными предложениями. Законно пустой jar
(голая 22-байтовая запись EOCD) не является ошибкой чтения. Если один файл затронут и другой нечитаем,
код выхода остаётся 1.
async-http-client. CVE в Netty, от которых зависят jar-файлы Netty, используемые AHC,
не покрываются.tools/recheck_before_publish.py проверяет, существует ли он ещё.src/main/java/dev/mikko/ahccheck/RuleTable.java генерируется, никогда не редактируется вручную:
python tools/gen_rules.py --dry # run the assertions only
python tools/gen_rules.py # regenerate the table
Он читает рекомендации уровня репозитория (vulnerable_version_range, patched_versions), ищет
каждую в глобальной базе и записывает "видно Dependabot: да/нет" как поле каждой
правила. Семь утверждений должны пройти, иначе ничего не записывается: количество рекомендаций и точный набор 13
отсутствующих в глобальной базе всё ещё совпадают с базовым; пересечения всё ещё 3.0.13 /
2.16.1 (и 3.0.12 при вычислении только по глобальной базе); эти версии возвращают 200
из Maven Central, тогда как контрольная версия возвращает 404; 3.0.12 всё ещё попадает как минимум в одну высокую
рекомендацию, и ни одна из них не в глобальной базе; все стили операторов присутствуют, и
пограничный случай всё ещё переключается; и расхождение репозитория/глобальной базы всё ещё точно известное.
Сквозные проверки на реальных jar-файлах находятся в tools/e2e_real_jars.py (настоящие jar-файлы из Maven Central,
включая fat-jar и WAR). tools/recheck_before_publish.py повторно проверяет пробел —
глобальную базу, OSV и Maven Central, каждую с положительным контролем и контрольной версией — и завершается
с ненулевым кодом, если что-то изменилось.
Apache License 2.0 — см. LICENSE.