[하루한줄] CVE-2021-3156 : heap overflow in sudo

URL

CVE-2021-3156 : heap-based buffer overflow in sudo

Target

sudo < 1.9.5p2

Explain

Qualys Research Team에서 CVE-2021-3156에 대한 세부 정보를 공개했습니다. sudo는 잠시 다른 유저의 권한을 갖고 프로그램을 실행할 수 있게 해주는 명령어로 거의 모든 Unix 계열 운영체제에서 사용합니다. sudo에 Heap-based Buffer Overlow 취약점이 존재하여 이를 통해 root 권한으로 상승할 수 있습니다.

sudo에 -s 옵션을 붙여 MODE_SHELL flag값을 설정하거나 -i 옵션을 붙여 MODE_LOGIN_SHELL flag값을 설정하면 sudo의 main()에서 argv를 재설정합니다. 모든 command line argument의 meta-character앞에 \(백슬래쉬)를 추가해 escape 한 뒤 하나의 문자열로 묶습니다(concatenate). 만약 하나로 묶인 command line argument가 \로 끝나면

...

if (ISSET(sudo_mode, MODE_SHELL|MODE_LOGIN_SHELL)) { 
... 
	for (to = user_args, av = NewArgv + 1; (from = *av); av++) { 
		while (*from) { 
			if (from[0] == '\\' && !isspace((unsigned char)from[1])) 
				from++; 
			*to++ = *from++; 
		} 
		*to++ = ' '; 
	} 
... 
}

이를 heap-based buffer(user_args)에 옮기는 작업 중 NULL-terminator를 무시하고 out-of-bound copy를 하게 됩니다.

Reference

https://www.gastonsanchez.com/r4strings/metacharacters.html