[하루한줄] CVE-2022-0811: New Vulnerability in CRI-O Container Engine
URL
New Vulnerability in CRI-O Container Engine
Target
Kubernetes
CRI-O (Kubernetes container의 runtime engine) > 1.19+
Explain
cr8escape라는 이름이 붙여진 CVE-2022-0811 취약점에 대한 상세 정보가 공개되었습니다.
Kubernetes에 deploy 할 수 있는 가장 기초적인 최소 단위를 pod라고 부릅니다. 각 pod는 클러스터 내부에서 실행되고 있는 프로세스 하나를 뜻하며 각 pod에는 Docker container와 같은 container가 한 개 이상 포함되어 있습니다.
CVE-2022-0811는 Kubernetes의 runtime 엔진인 CRI-O에 존재하는 취약점으로, pod의 deploy 권한이 있는 사용자는 해당 취약점을 악용해 container로부터 escapse 할 수 있고 Host의 root 권한을 획득할 수 있습니다.
CRI-O는 각 pod의 커널 옵션을 설정하기 위해 pinn 유틸리티를 사용합니다. 1.19 버전부터 pinn 유틸리티는 sysctl을 지원하는데, 문제는 아무런 검증을 거치지 않기 때문에 pinn 유틸리티를 통해 kernel parameter를 제약 없이 조작할 수 있습니다.
아래 코드는 CRI-O로 전달되는 sysctl map을 pinn의 매개변수로 변환하는 함수입니다.
func getSysctlForPinns(sysctls map[string]string) string {
// this assumes there's no sysctl with a `+` in it
const pinnsSysctlDelim = "+"
g := new(bytes.Buffer)
for key, value := range sysctls {
fmt.Fprintf(g, "'%s=%s'%s", key, value, pinnsSysctlDelim)
}
return strings.TrimSuffix(g.String(), pinnsSysctlDelim)
}
sysctl 값에 대한 제약이나 검증이 없기 때문에 악성 사용자는 임의로 pod의 kernel 설정을 할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.