Vercel과 Hacktron이 협력해 sharp, libvips, libheif를 거쳐 Next.js 이미지 최적화까지 영향을 미친 원격 코드 실행 취약점을 수정한 전 과정을 소개합니다.
2026년 8월, Hacktron은 Next.js 이미지 최적화에서 원격 코드 실행(RCE) 취약점으로 의심되는 문제를 제보했습니다. 조사 결과, 취약한 코드는 Next.js 자체가 아니라 상위 의존성인 libheif에 있었습니다. libheif는 Next.js를 비롯해 ImageMagick, WordPress, sharp 등 웹 생태계 전반에서 널리 쓰이는 AVIF 이미지 디코더입니다.
Hacktron으로부터 제보를 받은 직후, 저희는 함께 현재 Next.js 빌드에서 RCE를 재현했고, sharp, libvips, libheif 메인테이너들에게 취약점을 공개했습니다. 이후 Vercel 플랫폼 전체에 완화 조치를 배포하고, 메인테이너들과 함께 수정 작업에 착수했습니다.
Next.js 이미지 최적화는 컴포넌트(next/image)를 통해 애플리케이션이 이미지를 리사이즈하고 최적화할 수 있도록 합니다. AVIF 이미지의 경우, 이미지 처리 의존성 체인은 다음과 같습니다.
가 /_next/image를 호출합니다.
/_next/image가 sharp를 호출합니다.
sharp가 libvips를 호출합니다.
libvips가 libheif를 통해 이미지를 디코딩합니다.
즉, 취약한 코드는 Next.js에 있지 않지만, Next.js 이미지 최적화를 통해 충분히 도달 가능한 상태였습니다. 이미지 최적화 엔드포인트로 악성 AVIF 이미지를 전송하면, sharp와 libvips를 거쳐 libheif까지 호출되는 구조였습니다.
따라서 가장 명확한 완화 방법은 Next.js에서 AVIF 최적화를 비활성화하는 것이었습니다. 그렇게 하면 악성 AVIF 이미지가 이미지 최적화 엔드포인트에서 차단되어 sharp와 libvips를 거쳐 libheif로 전달되지 않고, 익스플로잇이 상위 의존성으로 전파되지 않습니다.
그러나 상위 의존성 수정 없이 Next.js만 완화하면 공개 방식에 문제가 생길 수밖에 없었습니다.
Hacktron과 함께 문제를 성공적으로 재현한 후, Vercel 플랫폼 전체에 완화 조치를 적용하고 sharp, libvips, libheif 메인테이너들에게 취약점을 공개하며 수정 작업을 시작했습니다.
타임라인은 다음과 같습니다.
8월 11~12일: Hacktron이 Vercel에 문제를 제보했고, Hacktron과 Vercel이 동작하는 개념 증명(PoC)으로 RCE를 재현했습니다.
8월 13일: Vercel이 이미지 최적화 서비스를 통해 플랫폼 완화 조치를 적용했습니다.
8월 19일: Next.js 팀이 libvips 메인테이너와 미팅을 갖고 sharp, libvips, libheif 간 조율을 시작했습니다.
8월 24일: Next.js가 보안 파트너들에게 관련 사실을 공지했습니다.
8월 25일: Next.js가 AVIF 최적화를 비활성화하는 보안 릴리스를 배포했습니다.
Vercel 보안팀은 이메일로 sharp와 libvips 메인테이너에게 연락하고, GitHub Security Advisory를 통해 libheif와 조율을 시작했습니다. Hacktron도 libheif에 취약점 및 익스플로잇 세부 내용을 제출한 상태였습니다. 8월 19일에는 Next.js 팀이 libvips 메인테이너와 미팅을 갖고 sharp, libvips, libheif 전반에 걸친 향후 방향을 조율했습니다. libheif 메인테이너는 Hacktron의 GitHub Security Advisory를 통해 수정 작업을 이어나갔습니다.
8월 24일에는 Next.js가 보안 파트너들에게 libheif 취약점과 Next.js에 미치는 영향을 공지했습니다(파트너 공지는 Next.js 보안 릴리스 프로세스의 일환입니다).
8월 25일, 8월 19일 미팅으로부터 엿새 만에 libheif 메인테이너가 RCE를 수정한 v1.23.2를 릴리스했습니다.
Vercel과 고객을 보호하는 방법은 비교적 단순했습니다. Vercel의 모든 Next.js 이미지 최적화 요청은 중앙 이미지 최적화 서비스를 거치기 때문에, 해당 중앙 서비스에서 AVIF 최적화 및 리사이즈를 비활성화했습니다. 이후 유입되는 AVIF 이미지는 libheif로 전달되지 않아 Vercel에서는 RCE가 불가능해졌습니다.
셀프 호스팅 애플리케이션을 보호하려면 Next.js 릴리스가 필요했습니다. 8월 25일, Next.js는 원래 별도의 문제를 해결하기 위해 계획했던 보안 릴리스를 배포했습니다. 상위 의존성 수정을 조율한 후 AVIF 완화 조치를 해당 릴리스에 함께 포함시켜 당초 예정보다 하루 앞당겨 배포했습니다. 수정된 libheif 버전이 아직 하위 의존성으로 전파되는 중이었기 때문에, AVIF 최적화 및 리사이즈를 비활성화하는 것이 가장 신속한 선택이었습니다. 또한 취약점의 심각도를 알리기 위해 보안 권고문도 함께 공개했습니다.
오픈소스 소프트웨어(OSS) 취약점 발견 건수는 계속 늘어나고 있으며, 그 규모도 만만치 않습니다.
2026년에 CVE 프로그램은 3만 5천 건 이상의 CVE를 등록했습니다.
GitHub의 비공개 취약점 제보 건수는 1월 주당 500건에서 5월 주당 3,000건으로 증가했습니다.
GitHub은 2026년 5월에 검토된 보안 권고문이 1,560건에 달했다고 발표했는데, 이는 권고문 데이터베이스 역사상 월간 기준 최대치입니다.
LLM이 취약점 연구를 가속화하면서, libheif RCE와 같은 상위 의존성 취약점이 OSS 생태계 전반에서 더 빈번하게 발견될 것으로 예상됩니다. 최근 몇 달간 Next.js 보안 릴리스 횟수가 증가했으며, 저희와 보안 연구 커뮤니티가 새로운 취약점을 계속 발견하는 만큼 이 추세는 앞으로도 이어질 것으로 보입니다.
저희는 공격자보다 먼저 취약점을 선제적으로 발견하고, 발견한 모든 내용을 책임감 있게 공개하며, 연구자 및 메인테이너들과 협력해 수정해 나갈 것을 약속합니다.
AVIF 취약점을 책임감 있게 제보하고, 문제 재현에 함께해 주었으며, 상위 메인테이너들과의 수정 조율 과정 전반에서 협력해 준 Hacktron에 감사드립니다.
또한 sharp, libvips, libheif 메인테이너들께도 감사드립니다. 이미지 처리 의존성 체인 전반에 걸친 조율된 수정이 가능했던 것은 이분들의 상위 의존성 수정 작업 덕분입니다.
저희는 Vercel 오픈소스 버그 바운티를 통해 Next.js와 다른 오픈소스 프레임워크의 보안을 강화하기 위해 뛰어난 연구자들과 함께하고 있습니다. 대상 프레임워크의 보안에 기여하고 싶은 분이라면 누구든지 참여를 환영합니다.