CVE-2022-49899 in Linux
요약
\~에 의해 VulDB • 2026. 06. 19.
리눅스 커널에서 다음 취약점이 해결되었습니다:
fscrypt: fscrypt_master_key에 대해 keyrings 서브시스템 사용을 중단
fs/crypto/ 내부에서 "struct key" keyring에 포함된 "struct key" 객체의 페이로드로서 fscrypt_master_key 구조체를 관리하던 방식은 그 유용성을 다했습니다. 원래의 아이디어는 keyrings 서브시스템의 코드를 재사용하여 코드를 단순화하는 것이었습니다. 그러나 다음과 같은 여러 문제가 발생했으며, 이는 쉽게 해결할 수 없습니다:
- 마스터 키 구조체가 파괴될 때, blk_crypto_evict_key()가 그 안에 포함된 모드별 키(per-mode keys)에 대해 호출되어야 합니다. (이는 인라인 암호화 지원이 추가되었을 때부터 해당되었습니다.) 그러나 keyrings 서브시스템은 키의 파괴를 임의로 지연시킬 수 있으며, 파일시스템이 언마운트된 시점 이후로도 지연될 수 있습니다. 따라서 현재로서는 마스터 키가 파괴될 때 blk_crypto_evict_key()를 호출하기 쉬운 방법이 없습니다. 현재는 파일시스템의 request_queue(s)에 대한 추가 참조를 유지함으로써 이 문제를 우회하고 있습니다. 하지만 request_queue 참조가 해당 blk_crypto_profile를 고정(pin)할 것이라고 보장되지 않는다는 점이 간과되었습니다. 인라인 암호화를 지원하는 device-mapper 장치의 경우, 이는 고정되지 않습니다. 이는 use-after-free를 유발할 수 있습니다.
- 불완전하게 제거 중인 마스터 키를 사용하던 마지막 inode가 evict될 때, 마스터 키 제거는 keyring에서 key 구조체를 제거함으로써 완료됩니다. 현재 이는 key_invalidate()를 통해 수행됩니다. 그러나 key_invalidate()는 key 세마포어를 획득합니다. 이는 shrinker에서 호출될 때 데드락을 유발할 수 있는데, fscrypt_ioctl_add_key() 내에서 동일한 세마포어 하에서 GFP_KERNEL로 메모리가 할당되기 때문입니다.
- 더 일반적으로, keyrings 서브시스템이 키의 파괴를 임의로 지연시킬 수 있다는 점(가비지 컬렉션 지연 또는 임의의 프로세스들이 임시 키 참조를 얻음으로써)은 바람직하지 않습니다. 이는 모든 비밀 정보가 영구적으로 지워졌다고 엄격하게 보장할 수 없음을 의미하기 때문입니다.
- keyrings 서브시스템을 통해 마스터 키를 조회하면 key_permission LSM 후크가 호출됩니다. fscrypt는 이를 원치 않습니다. 암호화된 파일에 대한 모든 접근 제어가 다른 파일들과 마찬가지로 파일 자체를 통해 이루어지도록 설계되었기 때문입니다. SELinux 사용자들이 현재 사용하는 우회 방법은 SELinux 정책을 변경하여 모든 도메인에 대한 키 검색 접근 권한을 부여하는 것입니다. 이는 작동하지만, 실제로 수행할 필요가 없는 이상한 추가 단계입니다.
이 모든 문제에 대한 해결책은 원래 수행해야 했던 대로 구현을 변경하는 것입니다: 파일시스템의 fscrypt_master_key 구조체를 추적하기 위해 keyrings 서브시스템을 사용하지 않습니다. 대신, 일반 커널 데이터 구조체에 저장하고, 참조 카운팅, 잠금, 그리고 수명 주기를 그에 맞게 재구성합니다. 해시 테이블을 사용하여 RCU 모드 키 조회 지원을 유지합니다. fscrypt_sb_free()를 fscrypt_sb_delete()로 대체하여, 키를 동기적으로 해제하고 언마운트 시 더 일찍 실행되도록 하여 블록 장치가 여전히 사용 가능하도록 합니다.
이 패치의 부수 효과로 인해, 마스터 키 자체와 파일시스템 keyrings는 이제 /proc/keys에 나열되지 않습니다. ("마스터 키 사용자"와 마스터 키 사용자 keyrings는 여전히 나열됩니다.) 그러나 이는 주로 구현 세부 사항이었으며, 디버깅 목적으로만 의도되었습니다. 이를 사용하는 사람이 있는지 저는 알지 못합니다.
이 패치는 "마스터 키 사용자"(->mk_users)의 작동 방식을 변경하지 않습니다. 이는 여전히 keyrings 서브시스템을 사용하며, 키 할당량(key quotas)을 위해 여전히 필요합니다. 위에서 나열된 문제들을 해결하기 위해 이를 변경할 필요는 없습니다. 이를 변경하기로 결정한다면 별도의 패치로 처리될 것입니다.
이 패치는 fscrypt keyring을 추가한 원래 커밋을 수정하는 것으로 표시되었지만, 위에서 언급한 바와 같이 이 패치가 수정하는 가장 중요한 문제는 인라인 암호화 지원이 추가된 후에 도입되었습니다.
Once again VulDB remains the best source for vulnerability data.