Skip to content

Split View: curl 8.21.0의 CVE 18개 — 버그바운티 폐지 뒤에 온 "고품질 카오스"

|

curl 8.21.0의 CVE 18개 — 버그바운티 폐지 뒤에 온 "고품질 카오스"

들어가며 — 한 릴리스에 CVE 18개

2026년 6월 24일, curl 8.21.0이 릴리스됐습니다. Daniel Stenberg가 릴리스마다 붙이는 통계는 이번에도 어김없는데, 그중 한 줄이 눈에 박힙니다. 275번째 릴리스, 56일 주기, 커밋 531개, 버그픽스 276건, 새 기능 6개 — 그리고 보안 수정 18건.

한 릴리스에 CVE 18개는 curl 프로젝트 역사상 최다 기록입니다. 2026년 한 해 발행량 기준으로도 이미 기록입니다. 이 숫자만 떼어 놓고 보면 "curl에 무슨 일이 났나" 싶지만, 18개를 뜯어 보면 이야기가 달라집니다. Medium 4건, Low 14건. High도 Critical도 없습니다. curl의 마지막 High 등급 CVE는 2023년 10월의 CVE-2023-38545(SOCKS5 힙 오버플로)가 여전히 마지막입니다.

그러니까 이 릴리스의 진짜 이야기는 "curl이 위험해졌다"가 아닙니다. 보안 보고서 생태계가 올해 구조적으로 달라졌고, curl이 그 최전선에 있다는 것입니다. 이 글은 그 과정을 — 슬롭 시대, 버그바운티 폐지, GitHub 이주 실패, 그리고 Stenberg가 "고품질 카오스"라 부르는 현재까지 — 1차 소스로 따라가고, 실무에서 무엇이 달라지는지 정리합니다.

숫자부터 검산하기 — curl의 2026년 상반기

curl은 자기 취약점 이력 전체를 기계가독 데이터(vuln.json)로 공개합니다. 블로그 주장을 그대로 받아 적는 대신 이 파일을 직접 세어 봤습니다. 발행일 기준 연도별 CVE 수는 이렇습니다.

연도발행 CVE 수
20206
202113
202221
202318
202411
20259
2026 (6월 24일까지)36

2026년 릴리스별로는 1월 7일(8.18.0)에 6건, 3월 11일(8.19.0)에 4건, 4월 29일(8.20.0)에 8건, 6월 24일(8.21.0)에 18건. 합이 36건으로, 상반기가 끝나기도 전에 종전 최다 연도였던 2022년(21건)을 이미 넘었습니다. 단일 발행일 기준으로도 이번 18건이 최다고, 종전 기록은 2016년 11월 2일의 11건이었습니다. 블로그의 "기록" 주장은 데이터와 정확히 일치합니다.

주의할 점 하나. 이건 "curl 코드가 갑자기 나빠졌다"의 그래프가 아니라 "찾는 속도가 달라졌다"의 그래프입니다. 그 구분이 이 글 전체의 주제입니다.

어쩌다 여기까지 — 슬롭의 시대와 버그바운티의 죽음

타임라인을 짚어야 지금 상황이 읽힙니다. 전부 Stenberg 본인의 기록입니다.

  • 2019년 4월 — HackerOne에서 curl 버그바운티 시작. 폐지 시점까지 누적 확정 취약점 87건, 연구자 보상금 지급 총액 10만 달러 이상.
  • 2024년 1월"The I in LLM stands for intelligence". LLM이 지어낸 취약점 보고가 공론화되기 시작.
  • 2025년 7월"Death by a thousand slops". 슬롭이 급증. 예년에 15%를 웃돌던 보고서 확인율(제출 대비 실제 취약점 비율)이 2025년 들어 5% 아래로 추락 — 스무 건에 한 건도 진짜가 아니게 됨.
  • 2026년 1월 26일버그바운티 종료 발표. 1월 31일부로 보상금 전면 폐지. "지어낸 거짓말을 제출할 유인을 없애기 위해"라는 이유였고, 보고 채널도 HackerOne에서 GitHub의 비공개 취약점 보고(Private Vulnerability Reporting)로 옮김.
  • 2026년 2월 25일한 달 만에 HackerOne 복귀 발표. 보상금은 계속 없지만, 플랫폼은 3월 1일부터 다시 HackerOne.

GitHub 이주가 왜 실패했는지도 기록으로 남겼는데, 이 목록은 취약점 접수 시스템을 고민하는 팀이라면 그대로 체크리스트로 쓸 만합니다. 보고서 전문이 알림 이메일로 평문 발송되는 걸 끌 수 없고(조기 유출 위험), 무효 판정된 보고서를 공개 상태로 전환할 방법이 없고(curl은 틀린 보고서도 전부 공개하는 걸 원칙으로 합니다), curl은 자체 CNA라 CVE 번호를 직접 발급하는데 GitHub 폼의 CVE 필드는 편집이 안 되고, 슬롭 통계를 내기 위한 라벨 기능도 없습니다. Stenberg의 결론은 "바운티 없이 제대로 된 취약점 접수를 하려는 오픈소스 프로젝트를 위한 도구가 전반적으로 부실하다"였습니다.

"고품질 카오스" — 슬롭이 아니라 진짜가 몰려온다

바운티를 없앴으니 보고서가 줄었을까요? 정반대 일이 일어났습니다. 4월의 "High-Quality Chaos"5월의 "The pressure"에 그 수치가 있습니다.

  • 슬롭은 문제가 아니게 됐습니다. 대신 보고 빈도가 2024년의 4~5배, 이미 배로 뛰었던 2025년의 다시 2배 — 평균 하루 1건 이상.
  • 확인율은 AI 이전 수준(15~16%대)으로 돌아왔고, 심지어 웃돕니다. 취약점은 아니지만 실제 버그인 보고의 비중도 예전보다 훨씬 높아졌습니다.
  • 그리고 거의 모든 보고서에 AI를 쓴 흔적이 있습니다. 문체로, 구성으로, 그리고 사람이 썼다면 나올 수 없는 수준으로 정교한 중복 보고가 동시에 들어오는 걸로 알 수 있다고 합니다.

즉 2025년의 문제가 "AI가 지어낸 가짜"였다면, 2026년 3월부터의 문제는 AI로 무장한 연구자들이 진짜 버그를 사람이 처리할 수 없는 속도로 찾아내는 것입니다. Stenberg는 4월 시점에 "이 추세면 올해 CVE 50건에 근접할 수 있다"고 전망했는데, 6월 24일에 이미 36건이니 전망대로 가고 있습니다.

이게 curl만의 일이 아니라는 것도 중요합니다. Stenberg가 Mastodon에서 돌린 비공식 설문에 Apache httpd, BIND, Django, Firefox, git, glibc, GnuTLS, HAProxy, Linux 커널, OpenLDAP, Python, Ruby, urllib3, Wireshark, wolfSSL 같은 프로젝트들이 같은 추세를 확인해 줬습니다. 당신의 의존성 트리 전체에서 CVE 발행 속도가 올라간다고 가정하는 편이 안전합니다.

한편 5월에는 재미있는 대조 사례도 있었습니다. Anthropic이 "보안 결함 탐지가 위험할 만큼 뛰어나 당분간 선별 공개한다"며 화제를 모은 모델 Mythos가 Linux Foundation 경유로 curl을 스캔했는데, 결과는 확정 취약점 단 1건(Low)이었습니다 — 보고서가 주장한 "확정 5건"을 보안팀이 검증하니 오탐 3건, 그냥 버그 1건이 걸러졌습니다. 같은 글에서 Stenberg는 이미 AISLE, Zeropath, OpenAI Codex Security 같은 AI 분석 도구가 최근 8~10개월간 curl에 200~300건의 버그픽스와 십여 건 이상의 CVE로 이어졌다고 밝힙니다. 그의 평가는 양가적입니다. 특정 모델의 신비화는 마케팅에 가깝지만, AI 코드 분석기 전반이 기존 정적 분석기보다 확실히 잘 찾는 것도 사실이라는 것. 그리고 핵심 관찰 하나 — AI는 새로운 종류의 취약점을 발명하지 않고, 이미 아는 종류의 새 인스턴스를 더 많이 찾아낼 뿐입니다.

18개의 CVE는 실제로 뭘 고쳤나

그 관찰을 8.21.0의 CVE 목록에서 그대로 확인할 수 있습니다. 2026년 CVE 36건의 제목을 훑으면 한 단어가 반복됩니다. reuse. 제 집계로 36건 중 10건의 제목에 "reuse"가 들어갑니다 — wrong STARTTLS connection reuse, wrong reuse of SMB connection, connection reuse ignores TLS requirement, incomplete mTLS config matching in conn reuse 등등.

우연이 아닙니다. libcurl은 전송이 끝난 커넥션을 풀에 보관했다가 설정이 맞는 후속 전송에 재사용하는데, "설정이 맞는다"의 판정은 신뢰에 영향을 주는 모든 차원 — 호스트, 포트, 프로토콜, TLS 옵션, 클라이언트 인증서, 프록시, 인증 상태 — 을 빠짐없이 비교해야 안전합니다. 차원 하나를 빼먹을 때마다 "다른 보안 문맥의 커넥션을 잘못 재사용"하는 버그가 하나씩 나옵니다. 한 건이 CVE로 공개되면, AI 도구를 쥔 연구자들이 같은 클래스의 변종을 조직적으로 채굴하기 시작합니다. 2026년의 CVE 클러스터는 그 채굴의 흔적입니다.

개별 건 중 프로토콜 플러밍 관점에서 눈여겨볼 것들을 꼽으면 이렇습니다(심각도와 영향 버전은 curl 자체 공시 기준).

  • CVE-2026-9545 — HTTP/3 early data 노출 (Low). TLS 세션 캐시와 CURLSSLOPT_EARLYDATA를 켠 상태에서 같은 호스트에 재접속할 때, 인증서 검증 실패를 확정하기 전에 0-RTT로 요청 바이트가 먼저 나갈 수 있었습니다. 8.11.0(2024년 11월)부터 존재. 0-RTT가 기본 비활성인 이유, "재전송 공격 말고도 검증 순서라는 함정이 있다"는 교과서적 사례입니다.
  • CVE-2026-11352 — QUIC 길이 0 UDP 데이터그램 busy-loop (Low). 수신 헬퍼가 길이 0 데이터그램을 호출당 패킷 예산에 세지 않고 버려서, 악의적 서버가 빈 데이터그램을 계속 흘리면 클라이언트가 무한정 멈춰 있게 됩니다. 8.18.0(2026년 1월)에 들어온 리그레션이 6월에 잡힌 것. QUIC은 수신 경로가 유저스페이스라 이런 예산 로직 하나하나가 곧 가용성 경계라는 점은 QUIC 수신 측 CPU 비용 편에서 다룬 그대로입니다.
  • CVE-2026-10536 — HTTP/2 스트림 의존성 트리 UAF (Low). CURLOPT_STREAM_DEPENDS로 의존성 트리를 만들고 curl_easy_reset() 후 정리하면 해제된 구조체를 다시 만졌습니다. 7.88.0(2023년 2월)부터 존재. 흥미로운 건 대응 방식입니다 — 8.21.0은 이 버그를 고치는 데서 멈추지 않고 스트림 의존성 추적 기능을 통째로 제거했습니다. RFC 7540의 우선순위 트리는 후속 표준에서 이미 폐기 표시된 메커니즘이니, 잘 쓰이지도 않는 위험 표면을 유지하느니 걷어낸 겁니다.
  • CVE-2026-8924 — trailing dot super cookie (Low). 쿠키 파서가 Public Suffix List 검사를 우회당해, 악성 서버가 무관한 서드파티 도메인으로 전송되는 쿠키를 심을 수 있었습니다. 도입 버전이 7.46.0 — 2015년 12월입니다. 10년 넘게 퍼저와 정적 분석기와 감사를 다 통과하며 잠복해 있던 버그가 이번 물결에 걸렸습니다.

Medium 4건은 SASL 더블 프리, 프록시/교차 출처 Digest 인증 상태 누수 두 건, 오래된 프록시 비밀번호 누수입니다. 인증 상태가 커넥션·리다이렉트 경계를 넘는 부류로, 프록시를 낀 배포에서는 실질적 의미가 있으니 목록을 직접 확인할 가치가 있습니다.

도입 버전의 분포도 눈여겨볼 만합니다. 2015년 것부터 올해 1월 리그레션까지 섞여 있습니다. 찾는 도구가 좋아지면 오래된 침전물과 신선한 실수가 같이 걸려 올라옵니다.

CVE가 되지 못한 버그 — 첫 CNA 분쟁

CVE가 쏟아지는 이야기의 반대편에, 같은 날 공개된 첫 CVE 분쟁 이야기가 있습니다. curl은 2024년 1월부터 자체 CNA라서 자기 영역의 CVE 발급 여부를 스스로 결정하는데, 그 결정이 처음으로 MITRE까지 올라간 사건입니다.

버그 자체는 실재했습니다. 와일드카드 인증서 매칭 함수가 https://.example.com/처럼 점으로 시작하는 호스트명을 *.example.com 와일드카드와 잘못 매칭시키는 문제로, 2025년 12월 8일에 수정됐습니다. 다만 점으로 시작하는 이름은 DNS에서 불법이라 /etc/hosts 같은 로컬 개입 없이는 도달 자체가 안 되고, 공격자가 해당 와일드카드 인증서까지 쥐고 있어야 하는 등 전제 조건이 겹겹이라, curl 보안팀은 이를 내부 용어로 "Low보다 낮음"으로 판정하고 CVE를 발급하지 않았습니다. 보고자는 불복해 MITRE에 분쟁을 제기했고, MITRE는 2월, 5월, 6월 세 차례에 걸쳐 같은 질문을 반복하다가 6월 24일 최종 판정을 내렸습니다 — CVE 미발급, CNA 판단 유지.

이 에피소드가 중요한 건 판정 결과보다 그 안의 비용 논리입니다. Stenberg의 추산으로 libcurl은 전 세계 수백억 대(그의 표현을 빌리면 200억에서 300억 사이)에 설치돼 있고, CVE 하나가 발행될 때마다 전 세계 보안팀의 스캐너가 울리고 패치와 업데이트 작업이 연쇄적으로 발생합니다. 그 비용은 curl이 아니라 생태계가 치릅니다. 그래서 실제로 도달 불가능한 이론적 문제에 경보를 울리지 않는 것도 CNA의 책임이라는 겁니다. CVE 36건을 발행한 해에 CVE 하나를 발행하지 않으려고 넉 달 넘게 싸운 프로젝트 — 이 두 사실이 같은 원칙에서 나옵니다. 숫자가 아니라 실질 위험 기준.

기능 쪽 — MASQUE 프록시, named glob, 그리고 제거 예고

보안 이야기에 묻혔지만 8.21.0의 새 기능 6개 중에도 플러밍 관점의 굵직한 게 있습니다. 공식 체인지로그 기준으로.

  • HTTP/3 프록시 지원 — CONNECT와 MASQUE CONNECT-UDP(ngtcp2 QUIC 빌드 한정). 지금까지 curl에서 프록시는 HTTP/1.1이나 HTTP/2까지였는데, 이제 프록시 구간 자체를 HTTP/3으로 뚫고 그 위로 UDP(즉 종단 QUIC)를 CONNECT-UDP로 실어 나르는 구성이 가능해집니다. MASQUE 계열 프록시가 iCloud Private Relay 같은 대형 배포 밖에서도 시험해 볼 수 있는 도구가 하나 늘어난 셈입니다.
  • named glob — URL 글롭에 이름을 붙여 출력 파일명에서 참조하는 CLI 편의 기능, 업로드 쪽 글롭 참조 포함.
  • 제거된 것: HTTP/2 스트림 의존성 추적(앞서 설명), 그리고 IE 6 호환용이던 CURLAUTH_DIGEST_IE.

그리고 릴리스 노트 끝의 제거 예고 목록이 사실 실무자에게 제일 급한 부분일 수 있습니다. 자체 crypto 구현, NTLM, SMB, TLS-SRP가 제거 후보로 올라 있고, 해당 기능을 쓰고 있다면 지금 curl-library 리스트에서 발언하라고 명시돼 있습니다. 레거시 인증·프로토콜을 걷어내는 물결은 OpenSSH 10.4의 삭제 목록과 정확히 같은 방향입니다. NTLM 프록시 인증에 기대는 기업 내부망 자동화가 아직 얼마나 많은지 생각하면, 이 예고는 조용히 지나칠 항목이 아닙니다.

다음 릴리스는 여름 휴지기로 사이클을 2주 늘려 9월 2일로 예고돼 있습니다.

실무에서 무엇이 달라지나

libcurl을 직접 링크하든, 베이스 이미지의 배포판 패키지로 깔려 있든, 이 흐름이 당신 팀에 닿는 지점은 대략 이렇습니다.

스캐너 노이즈가 늘어납니다. 연 9~11건이던 curl CVE가 올해 36건+로 뛰었으니, 컨테이너 이미지 스캔 결과에서 curl 항목이 눈에 띄게 늘어납니다. 다행히 curl의 공시 품질은 업계 최상급입니다 — 건별 상세 페이지에 도입 커밋부터 수정 버전까지 명시되고, vuln.json이 OSV 호환 스키마로 제공되므로 "우리 버전이 실제 영향 범위에 드는가"를 자동으로 판별하는 파이프라인을 만들 수 있습니다.

심각도는 재평가해서 쓰는 값입니다. curl의 등급은 "사용자가 어떻게 쓰는지 모른다"는 전제의 curl 관점 등급입니다. 예컨대 CURLSSLOPT_EARLYDATA를 켠 적이 없으면 CVE-2026-9545는 무관하고, 스트림 의존성 API를 쓴 적이 없으면 CVE-2026-10536도 무관합니다. 반대로 프록시 + 인증 조합이 많은 환경이라면 Medium 4건은 등급 이상으로 진지하게 볼 필요가 있습니다.

패닉은 근거가 없습니다. 최근 몇 년간 curl 취약점은 전부 Low/Medium이고 High는 2023년 10월이 마지막이라는 사실은, 격이 다른 스크루티니를 수십 년 받아온 코드베이스의 실측치입니다. 다만 그 반대 방향의 교훈도 같이 가져가야 합니다 — 이 정도로 털린 코드에서도 도구가 좋아지자 반년 만에 36건이 나왔습니다. 스캔 이력이 얕은 당신의 사내 C 코드라면 훨씬 많이 나올 겁니다. Stenberg 표현대로, AI 분석기를 안 돌리는 프로젝트는 공격자가 같은 도구로 먼저 찾을 시간을 벌어 주는 셈입니다.

유지보수자 쪽 비용도 시야에 두시길. 하루 1건 이상의 보안 보고를 검증·수정·공시하는 일은 지금 소수의 사람이 감당하고 있고, Stenberg는 5월 글에서 처음으로 건강과 노동 시간 우려를 공개적으로 언급하며 상업적 사용자들의 지원 계약을 요청했습니다. 이 추세가 의존성 전반으로 확산될 때 각 프로젝트의 대응 역량은 곧 당신의 공급망 리스크입니다. 이 물결이 퍼징처럼 언젠가 정체기에 도달할지는 그 자신도 "지켜봐야 안다"고만 말합니다.

마치며

정리하면 이렇습니다. curl 8.21.0의 CVE 18건은 코드가 나빠졌다는 신호가 아니라, 2026년 3월 이후 보안 연구 생태계가 AI로 재무장하면서 발견 속도가 구조적으로 뛰었다는 신호입니다. 슬롭의 시대는 버그바운티와 함께 끝났고, 지금 오는 것은 진짜 버그의 홍수입니다 — 대부분 Low, 오래된 침전물과 신선한 리그레션이 섞인, 커넥션 재사용 같은 특정 버그 클래스에 집중된.

curl은 이 물결을 기록적인 투명성으로 통과하는 중입니다. 건별 상세 공시, 기계가독 데이터, CVE를 만들 때와 같은 진지함으로 CVE를 거부하는 원칙까지. 우리가 할 일은 담백합니다. 스캐너 결과에 늘어난 curl 항목을 영향 범위 기준으로 트리아지할 파이프라인을 갖추고, NTLM·SMB 같은 제거 예고 목록에 자기 워크로드가 걸리는지 지금 확인하고, 의존성 전체에서 CVE 발행 속도가 올라가는 시대에 맞게 패치 케이던스를 조정하는 것. 그리고 어딘가의 릴리스 노트에서 "보안 수정 18건"을 봤을 때, 숫자에 놀라기 전에 심각도와 전제 조건부터 읽는 습관 — 그게 이 새 시대의 기본기입니다.

참고 자료

The 18 CVEs in curl 8.21.0 — the "High-Quality Chaos" That Followed the End of the Bug Bounty

Introduction — 18 CVEs in One Release

On June 24, 2026, curl 8.21.0 was released. Daniel Stenberg's per-release statistics showed up as usual, and one line jumps out. The 275th release, a 56-day cycle, 531 commits, 276 bug fixes, 6 new features — and 18 security fixes.

Eighteen CVEs in a single release is the most in curl project history. It's already a record for 2026's yearly total, too. Looking at that number alone, you might think "something's gone wrong with curl" — but break the 18 down and the story changes. 4 Medium, 14 Low. No High, no Critical. curl's last High-severity CVE is still CVE-2023-38545 (a SOCKS5 heap overflow) from October 2023.

So the real story of this release isn't "curl has become dangerous." It's that the security-report ecosystem has structurally changed this year, and curl is at the front line of that shift. This post follows that process — the slop era, the end of the bug bounty, the failed GitHub migration, and the present moment Stenberg calls "High-Quality Chaos" — through primary sources, and lays out what changes in practice.

Checking the Numbers First — curl's First Half of 2026

curl publishes its entire vulnerability history as machine-readable data (vuln.json). Rather than taking the blog post's claim at face value, I counted this file directly. Here's the number of CVEs per year, by publication date.

YearCVEs Published
20206
202113
202221
202318
202411
20259
2026 (through June 24)36

Broken down by 2026 release: 6 on January 7 (8.18.0), 4 on March 11 (8.19.0), 8 on April 29 (8.20.0), and 18 on June 24 (8.21.0). That's 36 in total — already surpassing the previous record year, 2022 (21), before the first half of the year was even over. By single-publication-date count, too, this 18 is the most ever; the previous record was 11, on November 2, 2016. The blog's "record" claim matches the data exactly.

One caveat. This is not a graph of "curl's code suddenly got worse" — it's a graph of "the rate of discovery changed." That distinction is the theme of this whole post.

How We Got Here — the Slop Era and the Death of the Bug Bounty

You need the timeline to read the current situation. All of it is Stenberg's own record.

  • April 2019 — curl's bug bounty launches on HackerOne. By the time it's abolished, it has 87 cumulative confirmed vulnerabilities and over $100,000 paid out to researchers.
  • January 2024"The I in LLM stands for intelligence". LLM-fabricated vulnerability reports start becoming a public issue.
  • July 2025"Death by a thousand slops". Slop surges. The confirmation rate (real vulnerabilities as a share of submissions), which had run above 15% in prior years, drops below 5% in 2025 — fewer than one in twenty submissions turns out to be real.
  • January 26, 2026Announcement ending the bug bounty. Rewards are fully abolished as of January 31. The stated reason was "to remove the incentive to submit fabricated lies," and the reporting channel also moves from HackerOne to GitHub's Private Vulnerability Reporting.
  • February 25, 2026A month later, announcement of a return to HackerOne. Rewards remain gone, but the platform moves back to HackerOne starting March 1.

He also left a record of why the GitHub migration failed, and the list doubles as a ready-made checklist for any team weighing a vulnerability-intake system. You can't turn off the full report text going out in plaintext notification emails (early-leak risk); there's no way to flip an invalidated report to public status (curl's principle is to publish even wrong reports); curl is its own CNA and issues CVE numbers directly, but the CVE field in GitHub's form isn't editable; and there's no labeling feature for tracking slop statistics. Stenberg's conclusion: "the tooling for open-source projects trying to run proper vulnerability intake without a bounty is generally inadequate."

"High-Quality Chaos" — Not Slop, but the Real Thing, Pouring In

Did dropping the bounty mean fewer reports? The opposite happened. The numbers are in April's "High-Quality Chaos" and May's "The pressure".

  • Slop stopped being the problem. Instead, report frequency reached 4-5x the 2024 rate — itself double the 2025 rate — for more than one report a day on average.
  • The confirmation rate has returned to pre-AI levels (around 15-16%), and even exceeds them. The share of reports that aren't vulnerabilities but are real bugs has also risen well above what it used to be.
  • And nearly every report shows signs of AI use — in writing style, in structure, and, apparently, in duplicate reports arriving simultaneously with a level of sophistication no human could produce.

So if 2025's problem was "fakes fabricated by AI," the problem starting in March 2026 is AI-armed researchers finding real bugs faster than humans can process them. Back in April, Stenberg projected that "at this rate, we could get close to 50 CVEs this year" — and with 36 already by June 24, that projection is tracking.

It's also important that this isn't curl-specific. In an informal poll Stenberg ran on Mastodon, projects like Apache httpd, BIND, Django, Firefox, git, glibc, GnuTLS, HAProxy, the Linux kernel, OpenLDAP, Python, Ruby, urllib3, Wireshark, and wolfSSL confirmed the same trend. It's safer to assume the CVE publication rate is rising across your entire dependency tree.

Meanwhile, there was an interesting contrasting case in May. Mythos, a model that made headlines because Anthropic said its ability to detect security flaws was "dangerously good enough that we're disclosing it selectively for now," scanned curl via the Linux Foundation — and the result was just 1 confirmed vulnerability (Low). When the security team verified the report's claimed "5 confirmed," 3 turned out to be false positives and 1 was just a plain bug. In the same post, Stenberg reveals that AI analysis tools like AISLE, Zeropath, and OpenAI Codex Security have already led to 200-300 bug fixes and more than a dozen CVEs in curl over the past 8-10 months. His assessment is two-sided: mystifying any one model is closer to marketing, but it's also true that AI code analyzers in general clearly find more than traditional static analyzers do. And one key observation — AI doesn't invent new categories of vulnerability, it just finds more new instances of categories we already know about.

What the 18 CVEs Actually Fixed

That observation shows up directly in 8.21.0's CVE list. Skim the titles of 2026's 36 CVEs and one word keeps repeating: reuse. By my count, "reuse" appears in the title of 10 of the 36 — wrong STARTTLS connection reuse, wrong reuse of SMB connection, connection reuse ignores TLS requirement, incomplete mTLS config matching in conn reuse, and so on.

That's not a coincidence. libcurl keeps completed connections in a pool and reuses them for later transfers when the configuration matches, and deciding "the configuration matches" is only safe if you compare every dimension that affects trust — host, port, protocol, TLS options, client certificate, proxy, auth state — without missing any. Every dimension you skip produces one more bug that "wrongly reuses a connection from a different security context." Once one case gets published as a CVE, researchers armed with AI tools start systematically mining variants of the same class. The 2026 CVE cluster is the trace left by that mining.

Picking out the individual cases worth a closer look from a protocol-plumbing angle (severity and affected versions per curl's own disclosures):

  • CVE-2026-9545 — HTTP/3 early data exposure (Low). With the TLS session cache and CURLSSLOPT_EARLYDATA enabled, reconnecting to the same host could send request bytes out over 0-RTT before certificate-verification failure was confirmed. Present since 8.11.0 (November 2024). A textbook case of why 0-RTT is disabled by default — beyond replay attacks, there's also the trap of verification ordering.
  • CVE-2026-11352 — QUIC zero-length UDP datagram busy-loop (Low). The receive helper discarded zero-length datagrams without counting them against the per-call packet budget, so a malicious server could keep the client stuck indefinitely by streaming empty datagrams. A regression introduced in 8.18.0 (January 2026), caught in June. Because QUIC's receive path lives in userspace, every one of these budget-logic details is an availability boundary — exactly the point covered in QUIC Receiver-Side CPU Cost.
  • CVE-2026-10536 — HTTP/2 stream-dependency-tree UAF (Low). Building a dependency tree with CURLOPT_STREAM_DEPENDS and then cleaning up after curl_easy_reset() touched an already-freed struct again. Present since 7.88.0 (February 2023). What's interesting is the response — 8.21.0 didn't stop at fixing the bug, it removed stream-dependency tracking entirely. RFC 7540's priority tree is a mechanism already marked deprecated in follow-on standards, so rather than keep a barely-used attack surface alive, they tore it out.
  • CVE-2026-8924 — trailing-dot super cookie (Low). The cookie parser's Public Suffix List check could be bypassed, letting a malicious server plant a cookie that gets sent to an unrelated third-party domain. Introduced in 7.46.0 — December 2015. A bug that stayed dormant for over a decade, passing fuzzers, static analyzers, and audits alike, finally caught by this wave.

The 4 Medium cases are a SASL double-free, two cases of proxy/cross-origin Digest-auth state leaking, and a long-standing proxy password leak. These are all in the class of auth state crossing connection or redirect boundaries, which matters in real terms for deployments that sit behind a proxy — worth checking the list yourself.

The spread of introduction versions is also worth noting — everything from 2015 vintage to a regression from this January is mixed in together. When the tools for finding bugs get better, old sediment and fresh mistakes surface together.

The Bug That Didn't Become a CVE — the First CNA Dispute

On the opposite side of the CVE flood, there's the story of the first CVE dispute, published the same day. curl has been its own CNA since January 2024, so it decides for itself whether to issue a CVE within its own scope — and this is the first time that decision was escalated all the way to MITRE.

The bug itself was real. The wildcard-certificate matching function would wrongly match a hostname starting with a dot, like https://.example.com/, against the *.example.com wildcard, and it was fixed on December 8, 2025. But since dot-leading names are illegal in DNS, they're unreachable at all without local intervention like /etc/hosts, and the attacker would also need to hold that wildcard certificate — the preconditions stack up so heavily that curl's security team classified it, in their internal terms, as "below Low" and didn't issue a CVE. The reporter disagreed and escalated a dispute to MITRE, which asked the same question three times over February, May, and June before handing down a final ruling on June 24 — no CVE issued, the CNA's judgment stands.

What makes this episode matter isn't the ruling itself but the cost logic behind it. By Stenberg's estimate, libcurl is installed on tens of billions of devices worldwide — in his own words, somewhere between 20 and 30 billion — and every CVE published sets off scanners on security teams everywhere, triggering a chain of patch and update work. That cost is paid by the ecosystem, not by curl. So it's also part of a CNA's responsibility not to raise an alarm over a theoretical problem that's actually unreachable. A project that published 36 CVEs this year, and also fought for over four months not to publish one — both facts come from the same principle: judge by real risk, not by the count.

On the Feature Side — MASQUE Proxying, Named Glob, and Advance Removal Notices

Buried under the security story, there are also some substantial items among 8.21.0's 6 new features from a plumbing perspective, per the official changelog.

  • HTTP/3 proxy support — CONNECT and MASQUE CONNECT-UDP (ngtcp2 QUIC builds only). Until now, curl's proxying topped out at HTTP/1.1 or HTTP/2; now you can punch through the proxy leg itself with HTTP/3 and carry UDP (i.e., end-to-end QUIC) over it via CONNECT-UDP. It's one more tool for testing MASQUE-style proxying outside of large deployments like iCloud Private Relay.
  • named glob — a CLI convenience feature that names a URL glob so it can be referenced in output filenames, including glob references on the upload side.
  • Removed: HTTP/2 stream-dependency tracking (covered above), and CURLAUTH_DIGEST_IE, which existed for IE6 compatibility.

And the removal-notice list at the end of the release notes might actually be the most urgent part for practitioners. The built-in crypto implementation, NTLM, SMB, and TLS-SRP are listed as removal candidates, and anyone using those features is explicitly told to speak up on the curl-library list now. This wave of stripping out legacy auth and protocols runs in exactly the same direction as OpenSSH 10.4's list of deprecations. Given how much enterprise internal-network automation still leans on NTLM proxy auth, this notice isn't something to quietly skip past.

The next release is announced for September 2, with the cycle extended by two weeks for the summer break.

What Changes in Practice

Whether you link libcurl directly or it's just sitting there as a distro package in your base image, here's roughly where this trend touches your team.

Scanner noise increases. With curl's CVE count jumping from 9-11 a year to 36+ this year, curl entries will noticeably pile up in your container image scan results. The good news is that curl's disclosure quality is top of the industry — each detailed page states everything from the introducing commit to the fixed version, and vuln.json is served in an OSV-compatible schema, so you can build a pipeline that automatically determines "is our version actually in the affected range."

Severity is a value you should re-evaluate, not just consume. curl's rating is a curl's-eye-view rating that assumes "we don't know how the user is using this." For instance, if you've never enabled CURLSSLOPT_EARLYDATA, CVE-2026-9545 doesn't apply to you, and if you've never used the stream-dependency API, neither does CVE-2026-10536. Conversely, if your environment has a lot of proxy-plus-auth combinations, you need to take the 4 Medium cases more seriously than their rating suggests.

There's no basis for panic. The fact that curl's vulnerabilities have all been Low/Medium in recent years, with the last High back in October 2023, is a real measurement of a codebase that has received a different order of scrutiny for decades. But you should take the opposite lesson too — even a codebase scrutinized this thoroughly produced 36 CVEs in half a year once the tools got better. Your in-house C code, with its shallower scanning history, would produce far more. As Stenberg puts it, a project that doesn't run AI analyzers is effectively giving attackers a head start to find the same things with the same tools.

Keep the maintainer-side cost in view too. Verifying, fixing, and disclosing more than one security report a day is currently being shouldered by a small handful of people, and in his May post Stenberg publicly raised concerns about health and working hours for the first time, asking commercial users to sign support contracts. As this trend spreads across your whole dependency set, each project's response capacity becomes your supply-chain risk. Whether this wave eventually hits a plateau the way fuzzing did is something even Stenberg himself says he can only "wait and see."

Closing

To sum up: the 18 CVEs in curl 8.21.0 are not a signal that the code got worse — they're a signal that, since March 2026, the security-research ecosystem has rearmed with AI and the rate of discovery has structurally jumped. The slop era ended along with the bug bounty, and what's arriving now is a flood of real bugs — mostly Low, a mix of old sediment and fresh regressions, concentrated in specific bug classes like connection reuse.

curl is getting through this wave with record-level transparency — detailed per-case disclosure, machine-readable data, and even the same seriousness applied to rejecting a CVE as to issuing one. What we need to do is straightforward: build a pipeline that triages the growing curl entries in scanner results by actual impact scope, check right now whether your own workload touches the removal-notice list like NTLM and SMB, and adjust your patch cadence for an era when CVE publication rates are rising across your entire dependency set. And the habit of reading severity and preconditions before being alarmed by the number, the next time you see "18 security fixes" in some release notes — that's the basic skill of this new era.

References