🇰🇷 한글 설명
Distribution 3.1.0 이전 버전에서 Redis 캐시와 delete 활성화 시 삭제된 blob 파일이 repo 간 캐시 재생성으로 인해 다시 접근 가능해지는 취약점. 명시적 삭제 후 stale repo-scoped membership이 남아있어 다른 저장소 접근 시 공유 descriptor가 재생성되면서 원본 저장소에서 deleted blob이 읽힐 수 있음.
💡 쉬운 설명
컨테이너 저장소에서 파일을 삭제해도 캐시 때문에 실제로는 지워지지 않는 문제입니다. 다른 컨테이너에서 같은 파일에 접근하면 캐시가 다시 생성되어 원래 저장소에서도 삭제된 파일을 읽을 수 있게 됩니다.
🇺🇸 원문 (English)
Distribution is a toolkit to pack, ship, store, and deliver container content. Prior to 3.1.0, distribution can restore read access in repo a after an explicit delete when storage.cache.blobdescriptor: redis and storage.delete.enabled: true are both enabled. The delete path clears the shared digest descriptor but leaves stale repo-scoped membership behind, so a later Stat or Get from repo b repopulates the shared descriptor and makes the deleted blob readable from repo a again. This vulnerability is fixed in 3.1.0.
📍 영향받는 시스템
Distribution < 3.1.0 (storage.cache.blobdescriptor=redis, storage.delete.enabled=true 설정된 환경)
⚔️ 공격 벡터
인증된 공격자가 의도적으로 blob을 삭제한 후 다른 저장소에서 접근하여 캐시 재생성 유도, 원래 저장소에서 삭제된 blob 접근
🛡️ 대응 방법
Distribution을 3.1.0 이상으로 업그레이드하거나 Redis 캐시 또는 delete 기능 중 하나 비활성화
🔧 검증 코드
Distribution 버전이 3.1.0 이상인지 확인하고, storage.cache.blobdescriptor와 storage.delete.enabled 설정값을 확인하여 둘 다 활성화되지 않았는지 검증
distribution --version 2>/dev/null | grep -oE '([0-9]+\.[0-9]+\.[0-9]+)' && docker inspect $(docker ps -q) 2>/dev/null | grep -i 'distribution' || echo 'Distribution not found'