원래 제대로 깊게 분석해보려고 했는데... 급 귀찮음을 느껴서 단순히 소개만..


이 취약점은 2013년 5월 14일에 발표되었다.

그래서, 현재 대부분의 기본 커널에서 적용되는 취약점이다.

(Ubuntu 13.04 64bit에서도 확인해보았는데, 루트가 따였다.)

상당히 심각한 취약점이니, 꼭 패치를 해야한다.


tunz@ubuntu:~/cve-2013-2094$ cat /etc/os-release

NAME="Ubuntu"

VERSION="13.04, Raring Ringtail"

...

tunz@ubuntu:~/cve-2013-2094$ uname -a

Linux ubuntu 3.8.0-19-generic #29-Ubuntu SMP Wed Apr 17 18:16:28 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

tunz@ubuntu:~/cve-2013-2094$ ./a.out

Searchin...

detected CONFIG_JUMP_LABEL

perf_swevent_enabled is at 0xffffffff81ef31c0

IDT at 0xffffffff81df4000

Using interrupt 128

Shellcode at 0x81000000

Triggering sploit

Got signal

Launching shell

# id

uid=0(root) gid=1000(tunz) groups=0(root),4(adm),24(cdrom),27(sudo),30(dip),33(www-data),46(plugdev),108(lpadmin),124(sambashare),1000(tunz) 



이 취약점은 kernel/events/core.c의 perf_swevent_init 함수에서 발생하는 취약점이다.


static int perf_swevent_init(struct perf_event *event)

{

- int event_id = event->attr.config;

+ u64 event_id = event->attr.config;


event_id를 int형으로 받았다.

그 결과, 음수의 값도 받을수가 있게 되었고, 그다음의


 static_key_slow_inc(&perf_swevent_enabled[event_id]);


위 부분에서 문제가 발생한다.

위의 어레이에서 음수를 넣으면, 해당 어레이 뒤쪽의 값들을 조작할수가 있게 된다.


그 후로 이러쿵 저러쿵 해서, idt를 조작한후, 인터럽트 핸들러에 쉘코드를 덮어쓴후, 인터럽트를 이용해 루트를 따는듯하다.



**

우분투 기준 커널 업데이트방법

sudo apt-get update

sudo apt-get upgrade

sudo apt-get dist-upgrade



posted by tunz
  • 2013.09.07 15:07

    비밀댓글입니다

    • tunz 2013.09.08 16:31 신고

      함수 콜을 할때 인자를 어떤식으로 넘기는지 알아보시면, 이해가 가실거같아요.
      대략적으로 말씀드리자면, gcc같은 경우는 첫번째 인자는 esp, 두번째 인자는 esp+4, ... 이런식으로 옮겨놓은다음에, 함수콜을 하게되면,
      [ret][arg1][arg2]... 이 상태가 되거든요, 그래서 ebp+8, ebp+c와 같은 방법으로 인자에 접근하게 됩니다.
      ROP를 할때는, ret을 이용해서 콜을 하기때문에, [call 할거][ret][arg1][arg2]... 로 세팅을 하게되면,
      call을 한 후에 [ret][arg1][arg2]와 같은 상태가 되니, 함수콜을 한것과 마찬가지가 되는거죠

  • 2013.09.08 19:31

    비밀댓글입니다

  • 2013.09.11 23:15

    비밀댓글입니다

    • tunz 2013.09.12 01:53 신고

      음..... 딱히 어떤 문서 하나만 보고 한게 아니라서 잘 모르겠네요.
      BOF원정대 페도라성 풀면서 그 write up들이랑, 이것저것 문서 찾아보면서 공부했던것같아요

  • levs 2013.10.07 21:04

    음 여기랑은 관련 없지만 질문하나 하겠습니다
    elf 디버깅 할때 보면 리눅스 elf 파일을 윈도우 아이다로 까주던데
    어떻게 리눅스에서 윈도우로 파일을 가져와 줄수 있나요?

    • tunz 2013.10.08 01:22 신고

      winscp나 단순히 ftp등을 이용해서 가져올수 있습니다.