[하루한줄] CVE-2021-27365: Linux 커널에서 발견된 15년간 존재한 권한상승 취약점

URL

New Old Bugs in the Linux Kernel

Target

  • Linux 배포판(RHEL 8.1, 8.2 및 8.3에서 테스트됨)

Explain

Linux 커널의 하위 시스템인 SCSI (Small Computer System Interface)이 포함된 배포판에서 heap buffer overflow을 통한 권한 상승 취약점이 발견되었습니다. 해당 취약점은 15년간 존재했던 것으로 알려졌습니다.

취약점은 iscsi_session_get_param 함수에 존재합니다. 유저는 호스트 이름, 유저 이름과 같은 iSCSI 연결과 관련된 속성을 설정하는 iSCSI 하위 시스템에 netlink 메시지를 보낼 수 있습니다. netlink 메시지의 최대 길이는 시스템에 따라 2^32 또는 2^16 크기입니다.

switch(param) {
...
	case ISCSI_PARAM_USERNAME:
		len = sprintf(buf, "%s\\n", session->username);
		break;
	case ISCSI_PARAM_USERNAME_IN:
		len = sprintf(buf, "%s\\n", session->username_in);
		break;
	case ISCSI_PARAM_PASSWORD:
		len = sprintf(buf, "%s\\n", session->password);
		break;
	case ISCSI_PARAM_PASSWORD_IN:
		len = sprintf(buf, "%s\\n", session->password_in);
		break;
	case ISCSI_PARAM_IFACE_NAME:
		len = sprintf(buf, "%s\\n", session->ifacename);
		break;
	case ISCSI_PARAM_INITIATOR_NAME:
		len = sprintf(buf, "%s\\n", session->initiatorname);
		break;
...

메시지의 각 속성은 sprintf 함수로 처리되고 할당되는 버퍼 크기는 커널의 PAGE_SIZE로 설정되며 크기에 대한 검사가 없습니다. 따라서 속성을 PAGE_SIZE보다 많이 입력하면 buffer overflow를 트리거할 수 있습니다.

현재까지 확인된 취약한 배포판은 libiscsi 커널 모듈을 자동 로드하는 CentOS 및 RHEL 버전 8.1, 8.2, 8.3이며 다른 배포판 또한 해당 모듈이 로드되어 있으면 공격 조건을 만족합니다. 그 외 CVE-2021-27363(커널 포인터 유출 취약점), CVE-2021-27364(커널 OOB read 취약점) 또한 동일한 SCSI 라이브러리에서 발견되었습니다.

취약점의 패치 히스토리는 torvalds/linux 에서 확인할 수 있습니다.