
에이전트, 스킬, 도구(Gmail, Calendar)를 갖춘 자체 호스팅 AI 워크스페이스로, 전적으로 자신의 프로바이더 API 키(BYOK)로 실행됩니다. 자신의 키를 가져오세요 — Groq, OpenRouter, NVIDIA, Hugging Face, Google AI.
org.asynchttpclient:async-http-client(AsyncHttpClient, "AHC")의 저장소 수준 보안 권고 21건에 대한
오프라인 검사기.
사용 중인 jar가 실제로 어떤 권고에 노출되어 있는지 알려주고, Dependabot과 OSV가
볼 수 없는 권고를 표시하며, 한 줄에 하나의 답을 제시합니다: 3.0.13(3.x) / 2.16.1(2.x).
단일 jar, 런타임 의존성 없음, 완전 오프라인, Java 17+.
2026-08-09에 AsyncHttpClient 유지관리자들은 프로젝트 자체 저장소
(AsyncHttpClient/async-http-client → Security → Advisories)에 17건의 보안 권고를 게시했습니다.
Dependabot과 OSV는 그 페이지를 읽지 않습니다. 이들은 GitHub 전역 권고 데이터베이스를 읽습니다.
2026-09-19 기준으로 해당 데이터베이스에는 17건 중 4건만 들어 있습니다(CVE-2026-85716, CVE-2026-85717,
CVE-2026-85720, CVE-2026-85721, 모두 2026-09-17에 추가됨). 나머지 13건은
GET /advisories/<GHSA>에서 404를 반환합니다. 그중 2건은 CVE ID까지 있습니다(CVE-2026-85718, CVE-2026-85719).
더 오래된 권고 4건(CVE-2024-53990, CVE-2026-40490, CVE-2026-45300,
CVE-2026-55688)을 포함하면 저장소에는 21건이 나열되어 있고, 전역 데이터베이스에는 8건이 있습니다.
전역 데이터베이스를 기준으로 "모든 것을 해결하는 버전"을 계산하면 3.x의 답은
**3.0.12**입니다. OSV도 동일합니다: 3.0.12에 대한 POST /v1/query는 취약점 0건을 반환합니다.
저장소 권고에 따르면 3.0.12는 여전히 다음 5건의 범위 안에 있습니다:
두 개의 high 등급 권고에 대해 정확히 말하자면: 이들은 자격 증명을 유출하지만, 자격 증명을 구성한 경우에만
(Realm, Digest/NTLM 또는 프록시) 해당되며, GHSA-jmqq는 추가로 다른 호스트로의 재전송이 필요합니다.
인증 없는 일반 GET만 수행하는 클라이언트는 이들에 노출되지 않습니다. 이 도구는 클라이언트를 어떻게 사용하는지 알지 못하며,
버전 범위가 말하는 바를 보고할 뿐 판단은 사용자에게 맡깁니다.
유지관리자들은 CVE-2026-85721의 본문에서 직접 이렇게 말합니다:
3.0.12 자체가 별도의 문제인 GHSA-rqf5-2wxv-rjf4의 영향을 받는다는 점에 유의하십시오 … 두 수정 사항을 모두 반영하려면 3.0.13으로 업그레이드하십시오.
따라서 3.x에서는: Dependabot은 3.0.12라고 말하고, 업그레이드 후에는 초록색으로 표시합니다. 실제 답은
3.0.13입니다. 2.x에서는 어느 쪽이든 답이 2.16.1이지만, 그 뒤에 있는 권고 13건은
여전히 스캐너에 보이지 않습니다.
CVE-2026-85721(high)은 기본 설정에 적용되는 항목입니다: 자동 응답
압축 해제가 기본으로 켜져 있고, 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에 나타나지 않을 수 있습니다. 이 도구는 실제로 배포되는 jar 내부의
META-INF/maven/org.asynchttpclient/async-http-client/pom.properties를 읽습니다 — Spring Boot fat-jar(BOOT-INF/lib)나
WAR(WEB-INF/lib)에 중첩된 jar도 포함합니다. 레거시 1.x 좌표 com.ning:async-http-client는 동일한 artifactId를
가지며, 나열되지만 판정되지는 않습니다.
java -jar async-http-client-check.jar target/ # 빌드 출력 스캔
java -jar async-http-client-check.jar myapp.jar # fat-jar / war, 중첩 jar 포함
java -jar async-http-client-check.jar --version-of 3.0.12 # 버전을 직접 판정
각 적중은 ID(CVE가 있으면 CVE, 없으면 GHSA), 심각도, 제목, 수정 버전, 그리고 해당되는 경우
Dependabot/全局库:未收录("전역 데이터베이스에 없음")를 출력합니다. 출력은 중국어입니다.
| 코드 | 의미 |
|---|
"읽을 수 없었다"와 "안전하다"는 서로 다른 문장이어야 합니다. 정당하게 비어 있는 jar
(순수한 22바이트 EOCD 레코드)는 읽기 실패가 아닙니다. 어떤 파일이 영향을 받았고 동시에 다른 파일을 읽을 수 없다면,
종료 코드는 1로 유지됩니다.
async-http-client만 해당합니다. AHC가 의존하는 Netty jar의 Netty CVE는
포함되지 않습니다.tools/recheck_before_publish.py가 그것이 여전히 존재하는지 확인합니다.src/main/java/dev/mikko/ahccheck/RuleTable.java는 생성되며, 절대 손으로 편집하지 않습니다:
python tools/gen_rules.py --dry # 어서션만 실행
python tools/gen_rules.py # 테이블 재생성
이 스크립트는 저장소 수준 권고(vulnerable_version_range, patched_versions)를 읽고, 각각을 전역 데이터베이스에서
조회하며, "Dependabot에 보임: 예/아니오"를 모든 규칙의 필드로 기록합니다. 일곱 개의 어서션이 통과해야 하며,
그렇지 않으면 아무것도 기록되지 않습니다: 권고 수와 전역 데이터베이스에서 누락된 정확히 13건의 집합이 여전히
기준선과 일치; 교집합이 여전히 3.0.13 / 2.16.1(그리고 전역 데이터베이스만으로 계산할 때는 3.0.12); 해당 버전들이
Maven Central에서 200을 반환하고 센티널 버전은 404를 반환; 3.0.12가 여전히 최소 하나의 high
권고에 해당하고 그중 어느 것도 전역 데이터베이스에 없음; 모든 연산자 스타일이 존재하고
경계 사례가 여전히 뒤집힘; 그리고 저장소/전역 불일치가 여전히 정확히 알려진 그 하나임.
실제 jar 엔드투엔드 검사는 tools/e2e_real_jars.py에 있습니다(Maven Central의 실제 jar,
fat-jar와 WAR 포함). tools/recheck_before_publish.py는 격차를 재검증합니다 —
전역 데이터베이스, OSV, Maven Central 각각에 양성 대조와 센티널을 두고 — 무언가 바뀌면
비영(非零)으로 종료합니다.
Apache License 2.0 — LICENSE 참조.
| 권고 | 심각도 | 내용 | 필요 조건 |
|---|
GHSA-rqf5-2wxv-rjf4 | high | 사용 가능한 nonce가 없는 Digest challenge에 Authorization: Basic으로 응답, 즉 비밀번호가 base64로 전송됨 | Digest Realm(서버 또는 프록시 인증) |
GHSA-jmqq-x5g9-9p2w | high | 요청이 다른 호스트로 재전송될 때, 첫 번째 호스트의 요청/자격 증명이 두 번째 호스트로 전달됨 | 다른 호스트로의 재전송(장애 조치 ResponseFilter 또는 IOException 재시도 경로) 및 자격 증명 또는 프록시 |
GHSA-vvp4-63h8-v5pm | medium | NTLM / Negotiate 연결이 주체(principal) 간에 재사용됨 | 요청별 자격 증명을 사용하는 NTLM 또는 Negotiate |
GHSA-f9m8-cv68-674w | medium | 쿠키 Domain이 공개 접미사 목록과 대조되지 않음(Domain=co.uk) | 출처 간 공유 CookieStore |
GHSA-qhv6-3pmh-95q4 | low | qop="auth-int"가 Digest 상호 인증을 비활성화함(3.0.12에만 해당) | Digest 인증 |
0 | 21건 중 어디에도 영향받지 않음, 그리고 모든 파일을 실제로 읽음 |
1 | 영향받음 |
2 | 판정할 수 없음 — 잘못된 인수, AHC jar를 찾지 못함, 인식할 수 없는 버전, 또는 게시된 범위를 벗어나는 사전 릴리스 버전 |
4 | 일부 파일을 읽을 수 없음 — zip이 아니거나, 잘렸거나, I/O 실패 |