[ QMAIL ] 메일 첨부파일 바이러스 악성 코드 탐지 simscan #2 용-ILE/잡다구리2012. 3. 30. 16:55
1. clamav 연동
simscan 설치할때 인터넷 http://www.qmailwiki.org/Simscan/README 보고 설치시
configure 를 나는
$ ./configure --enable-user=simscan --enable-received=y --enable-attach=y --enable-clamav=y --enable-custom-smtp-reject=y 이렇게 주고 컴파일해서 설치 하고 나서
clamav 잘되는지 해보니 에러 발생!~~ 에러내용은
"simscan: clamdscan: /var/qmail/simscan/1332399138.49738.5987: lstat() failed: Permission denied. ERROR"
이런 디렉토리 접근 퍼미션 문제였는데 clamav 설치방법도 여러가지이고 암튼 구글링해보면
chown 등으로 simscan 폴더를 줘야한다 글이 많은데
내경우는 clamav 설정 파일 기존에 qmail-scanner와 연동 되었던 clamav의 설정파일
/usr/local/etc/clamd.conf 파일에서 User , LocalSocketGroup 값을
simscan 설치 계정의 소유자와 그룹권한으로 변경후 lstat 오류 사라짐 (/etc/password)
ex) LocalSocketGroup qmail .... User simscan
2. 첨부파일만 추출해서 별도의 바이러스 체크시 simscan 에서 체크시 추가/수정해본거
2-1 . 첨부파일이 zip 압축경우 한번 풀기 (clamav 의 clamdscan 은 자동으로 해줌 ~.~)
int run_unzip()
{
DIR *mydir_unzip;
struct dirent *mydirent;
char fileNameBuf[256]={'\0',};
int i=0;
mydir_unzip = opendir( ATTACH_DIR );
if ( mydir_unzip==NULL) {
return -1;
}
for(i=0; (mydirent=readdir(mydir_unzip))!=NULL; i++) {
strcpy(fileNameBuf,mydirent->d_name);
lowerit(fileNameBuf);
if ( str_rstr(fileNameBuf,".zip") == 0 ) {
if ( DebugFlag > 3 ) {
fprintf(stderr, "Exist zip file [%s]\n",mydirent->d_name);
}
unzipFile(mydirent->d_name, ".");
}
}
closedir(mydir_unzip);
return 0;
}
unzipFile() 함수는 http://www.zlib.net/ 여기서받은 소스 코드에서 압축을 푸는 바이러리
/zlib-1.2.5/contrib/minizip/miniunz.c 함수에서 main() 을 unzipfile() 변경해서 호출 사용
2-2 int check_attach() 기존 함수 수정
첨부파일은 int run_ripmime() 에서 이미 ripmime 으로 /var/qmail/simscan 디렉토리에 만들어줌
int detect_attach(char *directory)
{
struct stat stbuf;
DIR *mydir;
struct dirent *mydirent;
char paramDir[256]={'\0'};
char bufMD5[33]={'\0',};
char tmpFileName[256]={'\0',};
int len=0;
const int TEMP_FILE_LEN = strlen(OUTLOOK_TEMP_NAME) + 1; // ex) textfile0 , textfile1 ...
char scan_sql[256]={'\0'};
mydir = opendir(directory);
if ( mydir==NULL){
return -1;
}
while((mydirent=readdir(mydir))!=NULL) {
/* skip . and .. */
if ( mydirent->d_name[0] == '.' &&
(mydirent->d_name[1] == '.' || mydirent->d_name[1] == 0) ) {
continue;
}
// get subdirectory
lstat(mydirent->d_name, &stbuf);
if( S_ISDIR(stbuf.st_mode)) {
sprintf(paramDir, "%s/%s", directory, mydirent->d_name);
detect_attach(paramDir); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로
continue;
}
// skip.. simscan temp file
if( strstr(mydirent->d_name,PREFIX_MSG) || strstr(mydirent->d_name,PREFIX_ADDR)){
if ( DebugFlag > 5 ) {
fprintf(stderr, "simscan: skip [%s] or [%s] file [%s]\n",PREFIX_MSG, PREFIX_ADDR, mydirent->d_name);
}
continue;
}
if ( DebugFlag > 5 ) fprintf(stderr, "simscan: checking attachment [%s/%s] \n", directory, mydirent->d_name);
getMD5(mydirent->d_name, bufMD5); // 첨부파일에서 MD5 추출
sprintf(scan_sql,"SELECT hash FROM VIRUS_TABLE WHERE hash='%s'",bufMD5);
... .... ... ...
if( isMalwareByDB(scan_sql) > 0 ){
if ( DebugFlag > 1 ){
fprintf(stderr, "[Malware] MailFrom:<%s>, RcptTo:<%s>, FileName %s , MD5:%s\n", MailFrom, RcptTo[0], mydirent->d_name, bufMD5);
}
strncpy(AttachName, mydirent->d_name, sizeof(AttachName)-1);
closedir(mydir);
return -1;
}
}
closedir(mydir);
return 0;
}
~~~~~~~~~~~~~~~ simscan.c ~~~~~~~~~~~~~~~~~~~~~~~~
// extract zip (one time);
run_unzip();
detect_attach( ATTACH_DIR ); // 파일 및 폴더 모두 검색 하기위해 재귀 함수로
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
뭐 이런식으로 하면 메일내에 첨부파일을 clamav 외 다른 안티바이러스 등과 연동하기 쉽다 MD5 추출 또는 SHA1 으로 추출등 인터넷에서 구글링해서 붙이면됨!~
'용-ILE > 잡다구리' 카테고리의 다른 글
[ QMAIL ] 메일 첨부파일 바이러스 악성 코드 탐지 simscan #1 (0) | 2012.03.26 |
---|---|
[OOD] 객체 지향 설계중 LSP , ISP JAVA 예제 코드 (0) | 2011.11.24 |
ascii vi 대응표 (0) | 2010.01.27 |
[ Domino / Notes ] Begin MIME to CD Conversion - Domino log 안보이게 하는거 (0) | 2010.01.12 |
[ Notes ] API 계층 설명 잘되어있는 그림 DIIOP , C API C++ , NRPC (0) | 2010.01.04 |