위협 요약
CVE-2026-66066은 Rails Active Storage가 libvips를 사용하는 환경에서 발생할 수 있는 임의 파일 읽기 및 원격 코드 실행(RCE) 위험이다. CVSS v4.0 9.5(Critical)는 GitHub CNA가 산정한 평가이며, NVD는 이를 Secondary 항목으로 수록한다. 해당 벡터는 네트워크 접근·낮은 공격 복잡도·무권한·사용자 상호작용 없음으로 기재돼 있다.[^1]
영향 조건은 두 가지다. 애플리케이션이 Active Storage에서 libvips를 사용하고, 신뢰할 수 없는 사용자의 이미지 업로드를 허용하는 경우다. Rails 권고는 variant 생성이 별도의 요구사항이 아니라고 명시한다. 따라서 variant 생성 여부나 variant 요청 가능 여부를 별도 필수 조건으로 두지 말고, 두 조건을 기준으로 자산을 식별해야 한다.[^2]
취약점 개요
Rails 보안 권고에 따르면 문제는 Active Storage가 libvips의 비신뢰 콘텐츠용 비안전(unfuzzed) operation을 충분히 차단하지 않은 데서 비롯된다. 조작된 파일을 업로드한 공격자가 이러한 operation을 호출하도록 유도할 수 있다.[^2]
취약한 패키지는 Active Storage이며, 영향·수정 버전은 다음과 같다.[^2][^3]
| 패키지 | 영향 버전 | 수정 버전 |
|---|---|---|
| Active Storage | 7.2.3.2 미만 | 7.2.3.2 |
| Active Storage | 8.0.0.beta1 이상, 8.0.5.1 미만 | 8.0.5.1 |
| Active Storage | 8.1.0.beta1 이상, 8.1.3.1 미만 | 8.1.3.1 |
libvips 8.13 이상은 이 CVE의 수정 버전이 아니다. 이는 unfuzzed operation 차단 완화 기능을 사용하기 위한 최소 전제조건이다.[^2]
| libvips 상태 | 의미와 조치 |
|---|---|
| 8.13 이상 | VIPS_BLOCK_UNTRUSTED 또는 ruby-vips 2.2.1 이상의 Vips.block_untrusted(true)로 unfuzzed operation 차단을 사용할 수 있다. |
| 8.13 미만 | unfuzzed operation을 차단하는 workaround를 사용할 수 없다. 수정된 Active Storage는 이처럼 안전하게 구성할 수 없는 환경에서 부팅 중 예외를 발생시킬 수 있다. libvips를 8.13 이상으로 올리거나 ruby-vips 의존성을 제거해 libvips 경로를 사용하지 않는 방안을 검토해야 한다. |
Active Storage가 libvips를 사용하면서 외부의 신뢰할 수 없는 이미지 업로드를 허용하는 서비스가 우선 점검 대상이다. Rails 공식 발표는 특정 공격 사슬이 보고됐다고 밝혔지만, 세부 내용은 2026년 8월 28일 이전까지 공개하지 않겠다고 했다. 따라서 이 글은 공개 PoC 또는 대규모 실제 악용을 확인된 사실로 단정하지 않는다.[^4]
기술적 분석
Active Storage가 libvips 처리 경로에서 비신뢰 입력에 안전하지 않은 operation을 호출하도록 유도되면, Rails 프로세스 권한으로 파일과 환경 정보를 읽을 수 있는 조건이 만들어질 수 있다.[^2] Variant 생성은 별도 요구사항이 아니므로, 실제 자산 분류 때 이를 선행 조건으로 삼아서는 안 된다.
공격 성공 시 노출 가능성이 있는 값에는 애플리케이션이 읽을 수 있는 구성 파일, 환경변수, secret_key_base, Rails master key와 credentials, 오브젝트 스토리지·데이터베이스·외부 서비스 자격증명이 포함될 수 있다. 이 값들은 직접적인 파일 읽기 사고를 세션 위조, 추가 접근 또는 코드 실행으로 확장하는 발판이 될 수 있다. 실제 영향은 실행 계정의 파일 권한, 비밀 관리 방식, 네트워크 접근권한에 따라 달라진다.
NVD API에 수록된 SSVC v2.0.3 자료의 작성 역할은 CISA Coordinator다. 이 자료는 exploitation을 none, automatable을 yes, technical impact를 total로 기재한다.[^1] 이는 CISA Coordinator의 SSVC 분류에 따른 자동화 가능성과 잠재 영향 신호이며, 공개 악용이 확인됐다는 뜻은 아니다.
영향 범위
다음 환경은 우선순위를 높여 점검한다.
- Active Storage에서 libvips를 사용하고, 신뢰할 수 없는 사용자의 이미지 업로드를 허용하는 Rails 애플리케이션
- 컨테이너 이미지 또는
Gemfile.lock에 취약한 Active Storage 버전이 남아 있는 배포 환경 - 애플리케이션 프로세스가 광범위한 파일·비밀값·내부 네트워크 접근 권한을 가진 환경
반대로 libvips를 사용하지 않거나 신뢰할 수 없는 업로드를 처리하지 않는 환경은 해당 공격 경로의 직접 영향 가능성이 낮다. 다만 설정은 환경별로 다를 수 있으므로 소스만 보지 말고 실행 중인 컨테이너와 배포 설정까지 확인해야 한다.
대응 방안
- 즉시: 노출 조건 확인
Gemfile.lock, 배포 이미지, 실행 컨테이너에서 Active Storage와 libvips 버전을 확인한다.- Active Storage가 libvips를 사용하는지와 신뢰할 수 없는 사용자 이미지 업로드를 허용하는지를 확인한다. Variant 생성 여부는 별도 영향 조건으로 사용하지 않는다.
-
패치 전까지 불필요한 외부 이미지 업로드를 제한하고, 관련 요청·오류 로그를 보존한다.
-
우선: 패치 적용
- Rails를 7.2.3.2, 8.0.5.1, 8.1.3.1 이상 중 사용 중인 유지보수 계열의 수정 버전으로 올린다.[^2]
- libvips 8.13 이상은 CVE 패치가 아니라 unfuzzed operation 차단을 위한 최소 전제다. 해당 환경에서는
VIPS_BLOCK_UNTRUSTED를, ruby-vips 2.2.1 이상에서는Vips.block_untrusted(true)를 사용할 수 있다.[^2] -
libvips 8.13 미만에서는 이 차단 workaround를 사용할 수 없다. 수정된 Active Storage는 이 환경을 안전하게 구성할 수 없으므로 부팅 중 예외를 낼 수 있다. libvips를 업그레이드하거나
ruby-vips의존성을 제거해 libvips 경로를 사용하지 않는 방안을 검토한다.[^2] -
사후: 비밀값과 침해 흔적 점검
- 취약 기간의 업로드·variant 처리 로그, 예외 로그, 비정상 파일 접근 징후를 조사한다.
- 노출 가능성이 있는
secret_key_base, Rails master key/credentials, 스토리지·DB·외부 서비스 키를 교체한다.secret_key_base를 바꾸면 활성 세션과 서명·암호화 쿠키가 무효화될 수 있으므로 사용자 영향과 롤백 절차를 준비한다. - 교체한 자격증명의 사용 이력과 애플리케이션·클라우드 감사 로그를 함께 검토해 후속 접근 여부를 확인한다.
| Critical 대응 기한 | 우선 조치 | 완료 기준 |
|---|---|---|
| 24시간 내 | 자산을 식별하고, 불필요한 외부 이미지 업로드를 제한하며, 업로드·처리·오류 로그를 보존한다. | Active Storage의 libvips 사용 여부와 비신뢰 이미지 업로드 노출 여부를 확인하고 조사용 로그 보존을 시작한다. |
| 72시간 내 | 사용 중인 유지보수 계열의 Rails 수정 버전을 적용하고 libvips 8.13 이상 환경을 갖춘다. | Active Storage가 7.2.3.2·8.0.5.1·8.1.3.1 이상으로 올라가고, unfuzzed operation 차단 전제를 충족한다. |
| 1주 내 | 노출 가능 비밀값을 교체하고 침해 흔적을 검토한다. | secret_key_base, Rails credentials, 스토리지·DB·외부 서비스 키의 교체와 감사 로그 검토 결과가 기록된다. |
결론
이 취약점의 대응은 패치만 적용하고 끝나지 않는다. Active Storage가 libvips를 사용하면서 비신뢰 이미지 업로드를 허용하는 환경은 Critical 우선순위에 따라 노출을 줄이고, Rails 패치와 libvips 안전 조건을 적용한 뒤, 이미 노출됐을 수 있는 비밀값과 침해 흔적까지 함께 점검해야 한다. 특히 비밀값 교체는 파일 읽기 위험이 후속 접근으로 확대되는 것을 줄이는 필수 조치다.
참고문헌
[^1]: NVD CVE API, “CVE-2026-66066”, https://services.nvd.nist.gov/rest/json/cves/2.0?cveId=CVE-2026-66066 (2026-08-01 확인). cvssMetricV40은 source security-advisories@github.com, type Secondary로 GitHub CNA 평가를 수록하며, ssvcV203의 role은 CISA Coordinator로 기재한다.
[^2]: Rails GitHub Security Advisory, “Possible Arbitrary File Read and Remote Code Execution in Active Storage Variant Processing”, https://github.com/rails/rails/security/advisories/GHSA-xr9x-r78c-5hrm.
[^3]: CVE.org, “CVE-2026-66066”, https://www.cve.org/CVERecord?id=CVE-2026-66066.
[^4]: Ruby on Rails Discussions, “CVE-2026-66066: Possible Arbitrary File Read and Remote Code Execution in Active Storage Variant Processing”, https://discuss.rubyonrails.org/t/cve-2026-66066-possible-arbitrary-file-read-and-remote-code-execution-in-active-storage-variant-processing/91432.
본 콘텐츠는 AI 기술로 작성된 분석 리포트를 포함하고 있습니다. 내용 중 사실과 다르거나 보완이 필요한 정보를 발견하셨으면 댓글을 통해 의견을 부탁드립니다. 여러분의 피드백은 더 정확한 보안 정보 공유에 큰 도움이 됩니다.
댓글 (0)
댓글을 작성하려면 로그인이 필요합니다.
로그인아직 댓글이 없습니다.
첫 번째 댓글을 작성해보세요!