모든 리눅스 커널에 또 다른 보안 결함 발견
이번엔 SMP에 해당하는 내용이군요.
안녕하십니까? 오늘과내일의 홍석범입니다.지난주에 uselib() 함수에서의 보안 취약성을 통해서 로컬의 일반 유저가
root 권한을 획득할 수 있는 취약성에 대해 메일을 드린 적이 있었는데,
며칠 후 다른 종류의 심각한 취약성이 공개되었습니다.이 취약성은 커널의 page fault handler에서의 race condition 에 의한 것으로
본 취약성을 이용하여 로컬의 일반 유저가 root 권한을 쉽게 획득할 수 있습니다.
자세한 취약성 정보는 아래와 같습니다.* 취약한 커널
2.4.x 버전 : 2.4.29-rc1 이전 버전(2.4.28 포함)
2.6.x 버전 : 2.6.10
* 취약하지 않은 커널
2.4.x 버전 : 2.4.29-rc2 버전 또는 2.4.29
2.6.x 버전 : 1월 12일 이후의 -ac나 -rc 패치버전
* 취약한 시스템
i386 계열의 SMP(symmetric multiprocessing) 시스템
즉, 단일 CPU를 사용하는 시스템은 본 취약성에 해당하지 않습니다.
그러나, 단일 CPU라도 hyperthreading이 지원될 경우
본 취약성에 해당합니다.* 테스트 코드
http://packetstormsecurity.nl/0501-exploits/stackgrow.c
위 코드를 다운로드후 컴파일하여 실행하면 취약한지 여부를 확인할 수 있습니다.
## 취약한 경우
$ ./test
[+] in thread 1 (pid = 5791)
[+] in thread 2 (pid = 5792)
[+] rdtsc calibration: 32877
[+] exploiting race, wait...
[+] race won (shift: 572)
[+] kernel might be vulnerable.## 취약하지 않은 경우
$ ./test
[+] in thread 1 (pid = 731)
[+] in thread 2 (pid = 732)
[+] rdtsc calibration: 35668
[+] exploiting race, wait...아래는 커널 2.4.28인 SMP 시스템에서 실제 공격코드를 실행했을 때의 결과입니다.
$ ./exploit
[+] in thread 1 (pid = 7382)
[+] in thread 2 (pid = 7383)
[+] rdtsc calibration: 32596
[+] exploiting race, wait...
[+] race won (shift: 539)
bash# id
uid=0(root)
아래는 커널 2.4.29인 SMP 시스템에서 실제 공격코드를 실행했을 때의 결과입니다.
$ ./exploit[+] in thread 1 (pid = 787)
[+] in thread 2 (pid = 788)
[+] rdtsc calibration: 35626
[+] exploiting race, wait...
[-] unable to exploit race in 30s,
kernel patched or load too high.* 대응 방법
아래와 같은 3가지 방법이 있을 것 같습니다.
(1) 가급적 최신의 커널인 2.4.29 나 2.6.11-rc-1 등으로 패치/업그레이드 하십시오.
(2) 만약 커널 업그레이드가 여의치 않을 경우 임시로 /proc의 퍼미션을 일반 유저가
읽을 수 없도록 설정하십시오. 이와 같이 설정할 경우 exploit 실행을 막을 수 있습니다.
/proc의 디렉토리를 700 등으로 설정하면 됩니다.(3) 공격 코드가 실행시에는 root 소유의 suid/sgid 파일을 필요로 합니다.
따라서 시스템내 root 소유의 suid/sgid 파일이 있다면 이 파일의 s비트를 제거하십시오.
suid/sgid는 find / -type f -perm +6000 -ls 를 실행하면 찾을 수 있습니다.본 취약성에 대한 좀 더 자세한 내용은 아래의 URL 을 참고하시기 바랍니다.
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CAN-2005-0001
감사합니다.
안녕 LInux 는 해당 사항 없습니다.
테스트 결과
와 같이 그냥 죽어 버립니다 :-)
아무 생각 없이 s비트 제거를 하다가 su- 가 안되내요...ㅠㅠ
커널 컴파일이 여의치 않아 /proc 를 700으로 해주고 s비트를 제거를 하는중에 잠깐 딴 생각 중에 /bin/su 의 s비트를 제거를 해버렸내요...--;;; 그리고 나서 다시 아무생각 없어 로그아웃...--;;;
원격으로 su - 가 안먹내요...--;;;
콘솔에서 다시 되돌리기는 했지만요...--;;;
위의 보안 권고 사항은 시스템내의 모든 s비트를 제거를 하다고 되어 있는데요... 몇몇 파일은 이렇게 하면 실행에 문제가 있는 걸로 압니다만...
어떤 파일을 제외를 하고 s비트를 제거를 하는게 좋을까요...?
Re: 아무 생각 없이 s비트 제거를 하다가 su- 가 안되내요...ㅠ
s비트야 뭐 배포판에서 알아서 잘 붙여줬으리라 믿고있고요.문제는 s비
s비트야 뭐 배포판에서 알아서 잘 붙여줬으리라 믿고있고요.
문제는 s비트가 붙은, 실제론 쓰지도 않는 것들을 설치하는 것이겠죠.
Debian Sarge 쓰는 Hyper-threading 적용된 Single CPU 쓰는 기계에서
( 물론 잡히기는 Dual로 잡힙니다. 음, )
위 테스트를 수행해봤는데 안녕리눅스의 경우처럼 나오네요.
이슈에 대한 답글을 잘못 작성하여 자진 삭제 합니다.
이슈에 대한 답글을 잘못 작성하여 자진 삭제 합니다.
죄송...