libclamunrar_iface, libclamav: improve detection of encrypted RAR archives (bb#1134)

git-svn: trunk@4117
This commit is contained in:
Tomasz Kojm
2008-08-18 10:09:56 +00:00
parent 3eba9d8363
commit 06fd4ce982
4 changed files with 53 additions and 44 deletions

View File

@@ -1,3 +1,8 @@
Mon Aug 18 12:01:10 CEST 2008 (tk)
----------------------------------
* libclamunrar_iface, libclamav: improve detection of encrypted RAR archives
(bb#1134)
Sun Aug 17 19:30:25 CEST 2008 (tk)
----------------------------------
* clamd/server-th.c: add missing proto for cli_initengine() (bb#1136)

View File

@@ -292,10 +292,21 @@ static int cli_scanrar(int desc, cli_ctx *ctx, off_t sfx_offset, uint32_t *sfx_c
if(!cli_leavetemps_flag)
cli_rmdirs(dir);
free(dir);
if(ret == UNRAR_EMEM)
if(ret == UNRAR_PASSWD) {
cli_dbgmsg("RAR: Encrypted main header\n");
if(DETECT_ENCRYPTED) {
lseek(desc, 0, SEEK_SET);
ret = cli_scandesc(desc, ctx, 0, 0, NULL, AC_SCAN_VIR);
if(ret != CL_VIRUS)
*ctx->virname = "Encrypted.RAR";
return CL_VIRUS;
}
return CL_CLEAN;
} if(ret == UNRAR_EMEM) {
return CL_EMEM;
else
} else {
return CL_ERAR;
}
}
do {

View File

@@ -264,8 +264,42 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
if(!is_rar_archive(fd))
return UNRAR_ERR;
main_hdr = read_header(fd, MAIN_HEAD);
if(!main_hdr)
return UNRAR_ERR;
unrar_dbgmsg("UNRAR: Head CRC: %.4x\n", main_hdr->head_crc);
unrar_dbgmsg("UNRAR: Head Type: %.2x\n", main_hdr->head_type);
unrar_dbgmsg("UNRAR: Flags: %.4x\n", main_hdr->flags);
unrar_dbgmsg("UNRAR: Head Size: %.4x\n", main_hdr->head_size);
if(main_hdr->flags & MHD_PASSWORD) {
free(main_hdr);
return UNRAR_PASSWD;
}
snprintf(filename,1024,"%s/comments", dirname);
if(mkdir(filename,0700)) {
unrar_dbgmsg("UNRAR: Unable to create comment temporary directory\n");
free(main_hdr);
return UNRAR_ERR;
}
state->comment_dir = strdup(filename);
if(!state->comment_dir) {
free(main_hdr);
return UNRAR_EMEM;
}
if(main_hdr->head_size < SIZEOF_NEWMHD) {
free(main_hdr);
free(state->comment_dir);
return UNRAR_ERR;
}
unpack_data = (unpack_data_t *) malloc(sizeof(unpack_data_t));
if(!unpack_data) {
free(main_hdr);
free(state->comment_dir);
unrar_dbgmsg("UNRAR: malloc failed for unpack_data\n");
return UNRAR_EMEM;
}
@@ -276,48 +310,6 @@ int unrar_open(int fd, const char *dirname, unrar_state_t *state)
unpack_data->unp_crc = 0xffffffff;
ppm_constructor(&unpack_data->ppm_data);
main_hdr = read_header(fd, MAIN_HEAD);
if(!main_hdr) {
ppm_destructor(&unpack_data->ppm_data);
rar_init_filters(unpack_data);
unpack_free_data(unpack_data);
free(unpack_data);
return UNRAR_ERR;
}
unrar_dbgmsg("UNRAR: Head CRC: %.4x\n", main_hdr->head_crc);
unrar_dbgmsg("UNRAR: Head Type: %.2x\n", main_hdr->head_type);
unrar_dbgmsg("UNRAR: Flags: %.4x\n", main_hdr->flags);
unrar_dbgmsg("UNRAR: Head Size: %.4x\n", main_hdr->head_size);
snprintf(filename,1024,"%s/comments", dirname);
if(mkdir(filename,0700)) {
unrar_dbgmsg("UNRAR: Unable to create comment temporary directory\n");
free(main_hdr);
ppm_destructor(&unpack_data->ppm_data);
rar_init_filters(unpack_data);
unpack_free_data(unpack_data);
free(unpack_data);
return UNRAR_ERR;
}
state->comment_dir = strdup(filename);
if(!state->comment_dir) {
free(main_hdr);
ppm_destructor(&unpack_data->ppm_data);
rar_init_filters(unpack_data);
unpack_free_data(unpack_data);
free(unpack_data);
return UNRAR_EMEM;
}
if(main_hdr->head_size < SIZEOF_NEWMHD) {
free(main_hdr);
ppm_destructor(&unpack_data->ppm_data);
rar_init_filters(unpack_data);
unpack_free_data(unpack_data);
free(unpack_data);
free(state->comment_dir);
return UNRAR_ERR;
}
if(main_hdr->flags & MHD_COMMENT) {
unrar_comment_header_t *comment_header;

View File

@@ -38,6 +38,7 @@
#define UNRAR_OK 0
#define UNRAR_BREAK 1
#define UNRAR_PASSWD 2
#define UNRAR_EMEM -1
#define UNRAR_ERR -2