[하루한줄] 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가 발생합니다. 해커는 이 취약점을 악용해 로컬 권한 상승을 할 수 있습니다.
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.