[하루한줄] 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 설정을 할 수 있습니다.