mirror of
https://github.com/Cisco-Talos/clamav.git
synced 2026-05-19 13:55:12 -04:00
libclamunrar_iface, libclamav: improve detection of encrypted RAR archives (bb#1134)
git-svn: trunk@4117
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -38,6 +38,7 @@
|
||||
|
||||
#define UNRAR_OK 0
|
||||
#define UNRAR_BREAK 1
|
||||
#define UNRAR_PASSWD 2
|
||||
#define UNRAR_EMEM -1
|
||||
#define UNRAR_ERR -2
|
||||
|
||||
|
||||
Reference in New Issue
Block a user