더 나은 세상

CVE-11176(2) 본문

컴퓨터 프로그래밍

CVE-11176(2)

leemark 2019. 3. 31. 13:50

Public information

mq_norify() : syscall인데 asynchronous notification을 등록/등록해제 하는데 쓰인다.

문제가 생기는 부분은 retry logic으로 들어갈 때, sock pointer를 mq_notify가 null로 만들지 않아서 인듯 하다.

mq_notify에 문제가 있고, retry logic, sock variable refcounting이 use after free를 만든다.

closed fd에 race condition이 존재한다.

netlink_attachskb() : struct sk_buff(nc)를 struct sock receive queue에 넣는 명령어

정상적으로 되었다면 ret값이 0이 되어 5-c로 넘어가야 한다.

5-a : receive buffer가 꽉 차서 retry label로 되돌아가서 다시하기

5-b : error가 생겨서 exit path로 간다.

 

race condition

retry path에서 race condition이 생기는 듯 하다.

두번째 loop에서 fget이 NULL을 return할 수 있다. (attack에서 설명0

 

attack scenario

두개의 thread가 한개의 fdt를 공유한다고 가정

하나의 thread가 close(TARGET_FD)를 하면 ref counter가 줄어서 struct file이 free상태가 될 수 있다. 그러면 file이 가리키고 있던 struct sock도 ref counter가 1 줄어든다. 그럼 struct sock도 free가 되고 그러면 struct file에서 sock을 가리키고 있던 sock pointer가 dangling pointer가 된다.

그리고 두번째 loop에서 file을 가리키는 fd가 free된 file을 가리키므로 use after free가 된다. closed fd란 결국 닫혀있다는 뜻이었다... 단 이때는 attach값이 1이어야 한다.

reaching retry logic

u_notification argument(0아님)을 이용하여 local copy를 kernel memory로 복사한다. (copy_from_user 함수 이용)

notification.sigev_notify를 세번 검사한다. notification.sigev_value.sival_ptr은 복사할 user영역이 read가능한 영역인지 검사한다.

결국 retry path로 가기 위해서는 3가지가 필요한데

1. u_notification이 null이 아니어야 한다.

2. u_notification.sigev_notify가 SIGEV_THREAD로 설정되어야 한다.

3. notification.sigev_value.sival_ptr이 최소한 32바이트(NOTIFY_COOKIE_LEN)만큼 readable한 data영역이어야 한다.

'컴퓨터 프로그래밍' 카테고리의 다른 글

ARM page table  (0) 2019.04.05
CVE-11176(3)  (0) 2019.03.31
CVE-11176(1)  (0) 2019.03.30
exe파일이란 무엇인가요?  (0) 2018.12.16
object 파일이란  (0) 2018.12.16