[하루한줄] CVE-2021-32606: CAN ISOTP 로컬 권한 상승 취약점

URL

CAN ISOTP local privilege escalation

Target

Linux Kernel 5.11 through 5.12.2

Explain

net/can/isopt.c의 함수 iso_setsockopt()에 use-after-free로 인한 권한상승 취약점이 발견되었습니다. 취약점은 CAN network subsystem 내부의 ISOTP CAN network 프로토콜에 있습니다. Race condition으로 Socket이 bound 된 이후에도 socket 옵션을 수정할 수 있고 이로 인해 use-after-free가 발생합니다.

CAN ISOTP 프로토콜은 기본 쉘이 아닌 다른 socket 옵션이 사용되면 isotp_setsockopt()를 호출해 socket 옵션을 적용시킵니다. isotp_setsockopt()는 ISOPT socket이 이미 바인드 된 상태라면 리턴, 바인드 되지 않은 상태라면 isotp_bind()를 호출해 바인드 작업을 거치고 user space로부터 socket 옵션 데이터를 복사합니다.

isotp_bind()가 ISOTP socket을 바인드 할 때 해당 socket 옵션의 flag값이 CAN_ISOTP_SF_BROADCAST가 아닐 때만 CAN 수신기를 등록합니다. 만약 isotp_bind()가 socket을 바인드 한 직후 user space로부터 socket 옵션 데이터를 복사하기 직전에 race condition을 발생시킨다면 flag값이 CAN_ISOTP_SF_BROADCAST이면서 CAN 수신기가 등록된 socket을 생성할 수 있습니다.

이후에 함수 isotp_release()가 호출되어 socket을 해제할 때 flag값이 CAN_ISOTP_SF_BROADCAST이므로 등록된 CAN 수신기를 그대로 남겨놓습니다. 이를 통해 이미 해제된 socket에 접근할 수 있게 되고 use-after-free가 발생합니다. 해커는 이 취약점을 악용해 로컬 권한 상승을 할 수 있습니다.