From 24b5c96c20ae5faadfd6f277fca6ed504fe1b85f Mon Sep 17 00:00:00 2001 From: brenosilva Date: Thu, 14 Jun 2012 13:54:05 +0000 Subject: [PATCH 01/64] update CHANGES --- CHANGES | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/CHANGES b/CHANGES index e9239d56..a181be40 100644 --- a/CHANGES +++ b/CHANGES @@ -91,9 +91,8 @@ * Added build system support for KfreeBSD and HURD. - * In 2009, Stefan Esser published an evasion technique that relies on the use of single quotes and PHP. - The trick was treating a request parameter as a file. A patch was applied into ModSecurity 2.5.11 by Brian Rectanus. - Ivan Ristic reported that the patch was imcomplete. We added extra checks for this evasion. + * Fixed a multipart bypass issue related to quote parsing + Credits to Qualys Vulnerability & Malware Research Labs (VMRL). 20 Mar 2012 - 2.6.5 ------------------- From 563017fce6ea07041da293d14c63186efe908d0f Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 12:13:32 +0000 Subject: [PATCH 02/64] Fix loop into getkey --- apache2/msc_crypt.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index 07ba5fd0..03aa33b0 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -132,7 +132,7 @@ unsigned char *getkey(apr_pool_t *mp) { srand((unsigned int) time(0)); while(length--) { - output[length-1] = (rand() % 94 + 33); + output[length] = (rand() % 94 + 33); srand(rand()); } From 39fcad45661754f8d7d0d7feb90b87365d01344d Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 12:43:29 +0000 Subject: [PATCH 03/64] Improve random number generator --- apache2/msc_crypt.c | 10 ++++++++-- apache2/msc_crypt.h | 7 +++++++ 2 files changed, 15 insertions(+), 2 deletions(-) diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index 03aa33b0..89a8ed5c 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -125,15 +125,21 @@ char *normalize_path(modsec_rec *msr, char *input) { */ unsigned char *getkey(apr_pool_t *mp) { unsigned short int length = 12; + struct glinear data; + uint64_t seed; char output[13]; char *key = NULL; output[length] = '\0'; - srand((unsigned int) time(0)); + seed = data.seed; + srand(data.seed); while(length--) { + seed *= data.mul; + seed += data.add; + data.seed = seed % data.mod; output[length] = (rand() % 94 + 33); - srand(rand()); + srand(data.seed + rand() + time(0)); } key = apr_psprintf(mp,"%s",output); diff --git a/apache2/msc_crypt.h b/apache2/msc_crypt.h index c5f6e8d8..3286fa8f 100644 --- a/apache2/msc_crypt.h +++ b/apache2/msc_crypt.h @@ -27,6 +27,13 @@ #define INT32_MAX (2147483647) #endif +struct glinear { + uint32_t seed; + uint32_t mod; + uint32_t mul; + uint32_t add; +}; + char DSOLOCAL *hmac(modsec_rec *msr,const unsigned char *key, int key_len, char *msg, int msglen); unsigned char DSOLOCAL *do_hash_link(modsec_rec *msr, char *link, From f72ba4d36fd6760c227a1d6df6fa00c0ec5f2019 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 13:15:51 +0000 Subject: [PATCH 04/64] Improve random number generator --- apache2/msc_crypt.c | 54 ++++++++++++++++++++++++++++++++++++++++++++- apache2/msc_crypt.h | 5 +++++ 2 files changed, 58 insertions(+), 1 deletion(-) diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index 89a8ed5c..46b5d591 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -116,6 +116,58 @@ char *normalize_path(modsec_rec *msr, char *input) { return apr_pstrdup(msr->mp, input); } +/** + * \brief Create a random number + * + * \retval seed random seed + */ +unsigned long prng() { + short num_matrix1[10]; num_matrix2[10]; + unsigned long num, num1, num2; + short n, *p; + unsigned short seed_num; + unsigned long seed; + + seed_num = seed & 16BITS_MASK; + num = seed & 31BITS_MASK; + + p = num_matrix1; + + for(n = 18; n-- ; ) { + num = 30903*seed_num + (num>>16); + *p++ = seed_num = num & 16BITS_MASK; + if (n == 9) + p = num_matrix2; + } + + num_matrix1[0] &= 15BITS_MASK; + num_matrix2[0] &= 15BITS_MASK; + memcpy((char*)num_matrix1+2,(char*)num_matrix1+1,8*sizeof(short)); + memcpy((char*)num_matrix2+2,(char*)num_matrix2+1,8*sizeof(short)); + + num1 = num_matrix1[0]; + num2 = num_matrix2[0]; + + num1 += 1941 * num_matrix1[2] + 1860 * num_matrix1[3] + + 1812 * num_matrix1[4] + 1776 * num_matrix1[5] + + 1492 * num_matrix1[6] + 1215 * num_matrix1[7] + + 1066 * num_matrix1[8] + 12013 * num_matrix1[9]; + + num2 += 1111 * num_matrix2[2] + 2222 * num_matrix2[3] + + 3333 * num_matrix2[4] + 4444 * num_matrix2[5] + + 5555 * num_matrix2[6] + 6666 * num_matrix2[7] + + 7777 * num_matrix2[8] + 9272 * num_matrix2[9]; + + num_matrix1[0] = num1/16BITS_MASK; + num_matrix2[0] = num2/16BITS_MASK; + num_matrix1[1] = 16BITS_MASK&num1; + num_matrix2[1] = 16BITS_MASK&num2; + + seed = (((long)num_matrix1[1])<<16)+(long)num_matrix2[1]; + + return seed; +} + /** * \brief Create a random password * @@ -139,7 +191,7 @@ unsigned char *getkey(apr_pool_t *mp) { seed += data.add; data.seed = seed % data.mod; output[length] = (rand() % 94 + 33); - srand(data.seed + rand() + time(0)); + srand(data.seed + prng()); } key = apr_psprintf(mp,"%s",output); diff --git a/apache2/msc_crypt.h b/apache2/msc_crypt.h index 3286fa8f..70192ecc 100644 --- a/apache2/msc_crypt.h +++ b/apache2/msc_crypt.h @@ -34,6 +34,11 @@ struct glinear { uint32_t add; }; +#define 16BITS_MASK 65536L +#define 16BITS_MASK 0xFFFF +#define 15BITS_MASK 0x7FFF +#define 31BITS_MASK 0x7FFFFFFF + char DSOLOCAL *hmac(modsec_rec *msr,const unsigned char *key, int key_len, char *msg, int msglen); unsigned char DSOLOCAL *do_hash_link(modsec_rec *msr, char *link, From 4ef3cc8ebab907fae219eb16405dffa9eadb6e4f Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 16:56:50 +0000 Subject: [PATCH 05/64] Improve random number generator --- apache2/msc_crypt.c | 18 +++++++++--------- apache2/msc_crypt.h | 8 ++++---- 2 files changed, 13 insertions(+), 13 deletions(-) diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index 46b5d591..fc02b987 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -128,20 +128,20 @@ unsigned long prng() { unsigned short seed_num; unsigned long seed; - seed_num = seed & 16BITS_MASK; - num = seed & 31BITS_MASK; + seed_num = seed & N16BITS_MASK; + num = seed & N31BITS_MASK; p = num_matrix1; for(n = 18; n-- ; ) { num = 30903*seed_num + (num>>16); - *p++ = seed_num = num & 16BITS_MASK; + *p++ = seed_num = num & N16BITS_MASK; if (n == 9) p = num_matrix2; } - num_matrix1[0] &= 15BITS_MASK; - num_matrix2[0] &= 15BITS_MASK; + num_matrix1[0] &= N15BITS_MASK; + num_matrix2[0] &= N15BITS_MASK; memcpy((char*)num_matrix1+2,(char*)num_matrix1+1,8*sizeof(short)); memcpy((char*)num_matrix2+2,(char*)num_matrix2+1,8*sizeof(short)); @@ -158,10 +158,10 @@ unsigned long prng() { 5555 * num_matrix2[6] + 6666 * num_matrix2[7] + 7777 * num_matrix2[8] + 9272 * num_matrix2[9]; - num_matrix1[0] = num1/16BITS_MASK; - num_matrix2[0] = num2/16BITS_MASK; - num_matrix1[1] = 16BITS_MASK&num1; - num_matrix2[1] = 16BITS_MASK&num2; + num_matrix1[0] = num1/N16BITS_MASK; + num_matrix2[0] = num2/N16BITS_MASK; + num_matrix1[1] = N16BITS_MASK&num1; + num_matrix2[1] = N16BITS_MASK&num2; seed = (((long)num_matrix1[1])<<16)+(long)num_matrix2[1]; diff --git a/apache2/msc_crypt.h b/apache2/msc_crypt.h index 70192ecc..d40d7225 100644 --- a/apache2/msc_crypt.h +++ b/apache2/msc_crypt.h @@ -34,10 +34,10 @@ struct glinear { uint32_t add; }; -#define 16BITS_MASK 65536L -#define 16BITS_MASK 0xFFFF -#define 15BITS_MASK 0x7FFF -#define 31BITS_MASK 0x7FFFFFFF +#define N16BITS_MASK 65536L +#define N16BITS_MASK 0xFFFF +#define N15BITS_MASK 0x7FFF +#define N31BITS_MASK 0x7FFFFFFF char DSOLOCAL *hmac(modsec_rec *msr,const unsigned char *key, int key_len, char *msg, int msglen); From 575356f10cba6c8f5b82d7badeeaeda654e7e1d4 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 17:06:10 +0000 Subject: [PATCH 06/64] Fix PRNG code --- apache2/msc_crypt.c | 10 +++++----- apache2/msc_crypt.h | 2 +- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index fc02b987..e831f729 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -122,20 +122,20 @@ char *normalize_path(modsec_rec *msr, char *input) { * \retval seed random seed */ unsigned long prng() { - short num_matrix1[10]; num_matrix2[10]; + short num_matrix1[10], num_matrix2[10]; unsigned long num, num1, num2; short n, *p; unsigned short seed_num; unsigned long seed; - seed_num = seed & N16BITS_MASK; + seed_num = seed & N16BITS_MAX; num = seed & N31BITS_MASK; p = num_matrix1; for(n = 18; n-- ; ) { num = 30903*seed_num + (num>>16); - *p++ = seed_num = num & N16BITS_MASK; + *p++ = seed_num = num & N16BITS_MAX; if (n == 9) p = num_matrix2; } @@ -160,8 +160,8 @@ unsigned long prng() { num_matrix1[0] = num1/N16BITS_MASK; num_matrix2[0] = num2/N16BITS_MASK; - num_matrix1[1] = N16BITS_MASK&num1; - num_matrix2[1] = N16BITS_MASK&num2; + num_matrix1[1] = N16BITS_MAX & num1; + num_matrix2[1] = N16BITS_MAX & num2; seed = (((long)num_matrix1[1])<<16)+(long)num_matrix2[1]; diff --git a/apache2/msc_crypt.h b/apache2/msc_crypt.h index d40d7225..8bd74d6d 100644 --- a/apache2/msc_crypt.h +++ b/apache2/msc_crypt.h @@ -35,7 +35,7 @@ struct glinear { }; #define N16BITS_MASK 65536L -#define N16BITS_MASK 0xFFFF +#define N16BITS_MAX 0xFFFF #define N15BITS_MASK 0x7FFF #define N31BITS_MASK 0x7FFFFFFF From 4ab785c192215b0df0879df856c5e1ec4655f977 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 19:27:59 +0000 Subject: [PATCH 07/64] Fix PRNG code and windows compilation errors --- apache2/apache2_config.c | 5 +++-- apache2/msc_crypt.c | 20 +++----------------- apache2/msc_crypt.h | 7 ------- apache2/msc_tree.h | 33 ++++++++++++++++++++------------- 4 files changed, 26 insertions(+), 39 deletions(-) diff --git a/apache2/apache2_config.c b/apache2/apache2_config.c index 78f46660..13393e5f 100644 --- a/apache2/apache2_config.c +++ b/apache2/apache2_config.c @@ -686,6 +686,7 @@ void init_directory_config(directory_config *dcfg) /* Encryption */ if (dcfg->crypto_key == NOT_SET_P) dcfg->crypto_key = getkey(dcfg->mp); + if (dcfg->crypto_key_len == NOT_SET) dcfg->crypto_key_len = strlen(dcfg->crypto_key); if (dcfg->crypto_key_add == NOT_SET) dcfg->crypto_key_add = ENCRYPTION_KEYONLY; if (dcfg->crypto_param_name == NOT_SET_P) dcfg->crypto_param_name = "crypt"; if (dcfg->encryption_is_enabled == NOT_SET) dcfg->encryption_is_enabled = ENCRYPTION_DISABLED; @@ -2315,9 +2316,9 @@ static const char *cmd_encryption_key(cmd_parms *cmd, void *_dcfg, const char *_ char *p1 = NULL; if (dcfg == NULL) return NULL; + if (_p1 == NULL) return NULL; - if (p1 == NULL) return NULL; - if (strcasecmp(p1, "Rand") == 0) { + if (strcasecmp(_p1, "Rand") == 0) { p1 = apr_pstrdup(cmd->pool, getkey(cmd->pool)); dcfg->crypto_key = p1; dcfg->crypto_key_len = strlen(dcfg->crypto_key); diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index e831f729..1838bf9f 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -177,24 +177,10 @@ unsigned long prng() { */ unsigned char *getkey(apr_pool_t *mp) { unsigned short int length = 12; - struct glinear data; - uint64_t seed; - char output[13]; - char *key = NULL; + unsigned char *key = NULL; + unsigned long int seed = time(NULL); - output[length] = '\0'; - - seed = data.seed; - srand(data.seed); - while(length--) { - seed *= data.mul; - seed += data.add; - data.seed = seed % data.mod; - output[length] = (rand() % 94 + 33); - srand(data.seed + prng()); - } - - key = apr_psprintf(mp,"%s",output); + key = apr_psprintf(mp,"%lu%lu",prng(),seed); return key; } diff --git a/apache2/msc_crypt.h b/apache2/msc_crypt.h index 8bd74d6d..bf0cfc8f 100644 --- a/apache2/msc_crypt.h +++ b/apache2/msc_crypt.h @@ -27,13 +27,6 @@ #define INT32_MAX (2147483647) #endif -struct glinear { - uint32_t seed; - uint32_t mod; - uint32_t mul; - uint32_t add; -}; - #define N16BITS_MASK 65536L #define N16BITS_MAX 0xFFFF #define N15BITS_MASK 0x7FFF diff --git a/apache2/msc_tree.h b/apache2/msc_tree.h index 04d96444..7c4d9009 100644 --- a/apache2/msc_tree.h +++ b/apache2/msc_tree.h @@ -16,6 +16,13 @@ #define __MSC_TREE_H__ #include "modsecurity.h" +#include + +typedef struct CPTData CPTData; +typedef struct TreePrefix TreePrefix; +typedef struct TreeNode TreeNode; +typedef struct CPTTree CPTTree; +typedef struct TreeRoot TreeRoot; #define IPV4_TREE 0x1 #define IPV6_TREE 0x2 @@ -37,36 +44,36 @@ #define NETMASK_4 0x4 #define NETMASK_2 0x2 -typedef struct CPTData_ { +struct CPTData { uint8_t netmask; - struct CPTData_ *next; -} CPTData; + struct CPTData *next; +}; -typedef struct TreePrefix_ { +struct TreePrefix { uint8_t *buffer; uint16_t bitlen; CPTData *prefix_data; -} TreePrefix; +}; -typedef struct TreeNode_ { +struct TreeNode { uint16_t bit; int count; uint8_t *netmasks; TreePrefix *prefix; - struct TreeNode_ *left, *right; - struct TreeNode_ *parent; -} TreeNode; + struct TreeNode *left, *right; + struct TreeNode *parent; +}; -typedef struct CPTTree_ { +struct CPTTree { int count; apr_pool_t *pool; TreeNode *head; -} CPTTree; +}; -typedef struct TreeRoot_ { +struct TreeRoot { CPTTree *ipv4_tree; CPTTree *ipv6_tree; -} TreeRoot; +}; DSOLOCAL CPTTree *CPTCreateRadixTree(apr_pool_t *pool); DSOLOCAL TreeNode *CPTIpMatch(modsec_rec *, uint8_t *, CPTTree *, int); From 04fa8bbd0eb4a33e6d59195e1406e09b0000903d Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 19:59:16 +0000 Subject: [PATCH 08/64] Fix windows error compilation --- apache2/msc_tree.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/apache2/msc_tree.c b/apache2/msc_tree.c index 0451fab2..3a3cded2 100644 --- a/apache2/msc_tree.c +++ b/apache2/msc_tree.c @@ -16,7 +16,9 @@ #include #include #include +#if !defined(WIN32) || !defined(WINNT) #include +#endif #include "apr_lib.h" #include "msc_util.h" #include "msc_tree.h" From 22e20c6997c5626cc4a5ab8a9da2c962292c8da8 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 20:27:21 +0000 Subject: [PATCH 09/64] Fix windows error compilation --- apache2/msc_crypt.c | 1 + apache2/msc_tree.h | 6 +++--- apache2/persist_dbm.c | 2 +- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index 1838bf9f..1ad85dee 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -18,6 +18,7 @@ #include "acmp.h" #include "libxml/HTMLtree.h" #include "libxml/uri.h" +#include /** * \brief Normalize path in URI diff --git a/apache2/msc_tree.h b/apache2/msc_tree.h index 7c4d9009..96b9fa57 100644 --- a/apache2/msc_tree.h +++ b/apache2/msc_tree.h @@ -75,8 +75,8 @@ struct TreeRoot { CPTTree *ipv6_tree; }; -DSOLOCAL CPTTree *CPTCreateRadixTree(apr_pool_t *pool); -DSOLOCAL TreeNode *CPTIpMatch(modsec_rec *, uint8_t *, CPTTree *, int); -DSOLOCAL TreeNode *TreeAddIP(const char *, CPTTree *, int); +CPTTree DSOLOCAL *CPTCreateRadixTree(apr_pool_t *pool); +TreeNode DSOLOCAL *CPTIpMatch(modsec_rec *, uint8_t *, CPTTree *, int); +TreeNode DSOLOCAL *TreeAddIP(const char *, CPTTree *, int); #endif /*__MSC_TREE_H__ */ diff --git a/apache2/persist_dbm.c b/apache2/persist_dbm.c index 215ebcda..4bb6a3e1 100644 --- a/apache2/persist_dbm.c +++ b/apache2/persist_dbm.c @@ -586,7 +586,7 @@ int collections_remove_stale(modsec_rec *msr, const char *col_name) { goto error; } - if(strcasestr(col_name,"user") || strcasestr(col_name,"session") || strcasestr(col_name,"resource")) + if(strstr(col_name,"USER") || strstr(col_name,"SESSION") || strstr(col_name, "RESOURCE")) dbm_filename = apr_pstrcat(msr->mp, msr->txcfg->data_dir, "/", msr->txcfg->webappid, "_", col_name, NULL); else dbm_filename = apr_pstrcat(msr->mp, msr->txcfg->data_dir, "/", col_name, NULL); From 780db20398931e31b1e0803bdb825a98b6d32d65 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 20:44:10 +0000 Subject: [PATCH 10/64] Add inet_pton for windows --- apache2/msc_util.c | 35 +++++++++++++++++++++++++++++++++++ apache2/msc_util.h | 4 ++++ 2 files changed, 39 insertions(+) diff --git a/apache2/msc_util.c b/apache2/msc_util.c index 900da363..f8505eb8 100644 --- a/apache2/msc_util.c +++ b/apache2/msc_util.c @@ -570,6 +570,41 @@ char *file_basename(apr_pool_t *mp, const char *filename) { return d; } +#ifdef WIN32 +int inet_pton(int family, const char *src, void *dst) { + struct addrinfo addr; + struct sockaddr_in *in = NULL; + struct sockaddr_in6 *in6 = NULL; + struct addrinfo *addr_info = NULL; + + memset(&addr, 0, sizeof(struct addrinfo)); + addr.ai_family = family; + + if (getaddrinfo(src, NULL, &addr, &addr_info) != 0) + return -1; + + if (addr_info) { + if (addr_info->ai_family == AF_INET) { + in = (struct sockaddr_in*)addr_info->ai_addr; + memcpy(dst, &in->sin_addr, 4); + } + else if (addr_info->ai_family == AF_INET6) { + in6 = (struct sockaddr_in6*)addr_info->ai_addr; + memcpy(dst, &in6->sin6_addr, 16); + } + else { + freeaddrinfo(addr_info); + return -1; + } + + freeaddrinfo(addr_info); + return 1; + } + + return -1; +} +#endif + /** * */ diff --git a/apache2/msc_util.h b/apache2/msc_util.h index f32cce22..9a7b2fdd 100644 --- a/apache2/msc_util.h +++ b/apache2/msc_util.h @@ -28,6 +28,10 @@ #include "modsecurity.h" #include "re.h" +#if WIN32 +int DSOLOCAL inet_pton(int family, const char *src, void *dst) +#endif + int DSOLOCAL normalize_path_inplace(unsigned char *input, int len, int win, int *changed); int DSOLOCAL parse_boolean(const char *input); From de56a8bcf412b7a57e6f9deb0d259d22146f9ecc Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 20:45:54 +0000 Subject: [PATCH 11/64] Add inet_pton for windows --- apache2/msc_util.c | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/apache2/msc_util.c b/apache2/msc_util.c index f8505eb8..ac4ecd4f 100644 --- a/apache2/msc_util.c +++ b/apache2/msc_util.c @@ -586,11 +586,13 @@ int inet_pton(int family, const char *src, void *dst) { if (addr_info) { if (addr_info->ai_family == AF_INET) { in = (struct sockaddr_in*)addr_info->ai_addr; - memcpy(dst, &in->sin_addr, 4); + if(in != NULL) + memcpy(dst, &in->sin_addr, 4); } else if (addr_info->ai_family == AF_INET6) { in6 = (struct sockaddr_in6*)addr_info->ai_addr; - memcpy(dst, &in6->sin6_addr, 16); + if(in6 != NULL) + memcpy(dst, &in6->sin6_addr, 16); } else { freeaddrinfo(addr_info); From e2d0715c14cd8150dcb2a776af659f1551998328 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 15 Jun 2012 20:58:35 +0000 Subject: [PATCH 12/64] Update CHANGES --- CHANGES | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/CHANGES b/CHANGES index a181be40..ef30dac6 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,11 @@ +NN Jun 2012 - 2.7.0-rc2 +------------------- + + * Fix compilation errors unders Windows platform. + + * Fix SecEncryptionKey was not working as expected. + + 08 Jun 2012 - 2.7.0-rc1 ------------------- From 35d97d586908dddca4efb3907af211ee345b9dcd Mon Sep 17 00:00:00 2001 From: brenosilva Date: Sat, 16 Jun 2012 16:31:09 +0000 Subject: [PATCH 13/64] Fix code for windows --- apache2/msc_util.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/apache2/msc_util.h b/apache2/msc_util.h index 9a7b2fdd..a7b765d5 100644 --- a/apache2/msc_util.h +++ b/apache2/msc_util.h @@ -28,8 +28,8 @@ #include "modsecurity.h" #include "re.h" -#if WIN32 -int DSOLOCAL inet_pton(int family, const char *src, void *dst) +#ifdef WIN32 +int DSOLOCAL inet_pton(int family, const char *src, void *dst); #endif int DSOLOCAL normalize_path_inplace(unsigned char *input, int len, int win, int *changed); From 81b74ba6334e21502a89865a40bf7ac5d0dbd075 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Sat, 16 Jun 2012 19:33:22 +0000 Subject: [PATCH 14/64] Fix code for windows --- apache2/msc_tree.c | 64 +++++++++++++++++++++--------------------- apache2/msc_tree.h | 17 ++++++----- apache2/msc_util.c | 18 ++++++++++++ apache2/msc_util.h | 2 ++ apache2/re_operators.c | 4 +-- 5 files changed, 62 insertions(+), 43 deletions(-) diff --git a/apache2/msc_tree.c b/apache2/msc_tree.c index 3a3cded2..8dae4e24 100644 --- a/apache2/msc_tree.c +++ b/apache2/msc_tree.c @@ -37,7 +37,7 @@ CPTTree *CPTCreateRadixTree(apr_pool_t *pool) { return tree; } -void ConvertIPNetmask(uint8_t *buffer, uint8_t netmask, uint16_t ip_bitmask) { +void ConvertIPNetmask(unsigned char *buffer, unsigned char netmask, unsigned int ip_bitmask) { int aux = 0, bytes = 0; int mask = 0, mask_bit = 0; @@ -72,7 +72,7 @@ TreeNode *CPTCreateNode(apr_pool_t *pool) { return node; } -CPTData *CPTCreateCPTData(uint8_t netmask, apr_pool_t *pool) { +CPTData *CPTCreateCPTData(unsigned char netmask, apr_pool_t *pool) { CPTData *prefix_data = apr_palloc(pool, sizeof(CPTData)); @@ -87,8 +87,8 @@ CPTData *CPTCreateCPTData(uint8_t netmask, apr_pool_t *pool) { return prefix_data; } -TreePrefix *InsertDataPrefix(TreePrefix *prefix, uint8_t *ipdata, uint16_t ip_bitmask, - uint8_t netmask, apr_pool_t *pool) { +TreePrefix *InsertDataPrefix(TreePrefix *prefix, unsigned char *ipdata, unsigned int ip_bitmask, + unsigned char netmask, apr_pool_t *pool) { if(prefix == NULL) return NULL; @@ -104,8 +104,8 @@ TreePrefix *InsertDataPrefix(TreePrefix *prefix, uint8_t *ipdata, uint16_t ip_bi return prefix; } -TreePrefix *CPTCreatePrefix(uint8_t *ipdata, uint16_t ip_bitmask, - uint8_t netmask, apr_pool_t *pool) { +TreePrefix *CPTCreatePrefix(unsigned char *ipdata, unsigned int ip_bitmask, + unsigned char netmask, apr_pool_t *pool) { TreePrefix *prefix = NULL; int bytes = ip_bitmask/8; @@ -162,7 +162,7 @@ void CPTAppendToCPTDataList(CPTData *new, CPTData **list) { return; } -int TreePrefixContainNetmask(TreePrefix *prefix, uint8_t netmask) { +int TreePrefixContainNetmask(TreePrefix *prefix, unsigned char netmask) { CPTData *prefix_data = NULL; if (prefix == NULL) { @@ -179,7 +179,7 @@ int TreePrefixContainNetmask(TreePrefix *prefix, uint8_t netmask) { return 0; } -int CheckBitmask(uint8_t netmask, uint16_t ip_bitmask) { +int CheckBitmask(unsigned char netmask, unsigned int ip_bitmask) { switch(netmask) { @@ -198,7 +198,7 @@ int CheckBitmask(uint8_t netmask, uint16_t ip_bitmask) { return 0; } -TreeNode *CPTCreateHead(TreePrefix *prefix, TreeNode *node, CPTTree *tree, uint8_t netmask, uint16_t ip_bitmask) { +TreeNode *CPTCreateHead(TreePrefix *prefix, TreeNode *node, CPTTree *tree, unsigned char netmask, unsigned int ip_bitmask) { if(tree == NULL) return NULL; @@ -216,7 +216,7 @@ TreeNode *CPTCreateHead(TreePrefix *prefix, TreeNode *node, CPTTree *tree, uint8 return node; node->count++; - node->netmasks = apr_palloc(tree->pool, (node->count * sizeof(uint8_t))); + node->netmasks = apr_palloc(tree->pool, (node->count * sizeof(unsigned char))); if(node->netmasks) node->netmasks[0] = netmask; @@ -243,7 +243,7 @@ TreeNode *SetParentNode(TreeNode *node, TreeNode *new_node, CPTTree *tree) { } int InsertNetmask(TreeNode *node, TreeNode *parent, TreeNode *new_node, - CPTTree *tree, uint8_t netmask, uint8_t bitlen) { + CPTTree *tree, unsigned char netmask, unsigned char bitlen) { int i; if (netmask != NETMASK_256-1 && netmask != NETMASK_128) { @@ -258,7 +258,7 @@ int InsertNetmask(TreeNode *node, TreeNode *parent, TreeNode *new_node, } node->count++; - node->netmasks = apr_palloc(tree->pool, (node->count * sizeof(uint8_t))); + node->netmasks = apr_palloc(tree->pool, (node->count * sizeof(unsigned char))); if(node->netmasks == NULL) return 0; @@ -286,12 +286,12 @@ int InsertNetmask(TreeNode *node, TreeNode *parent, TreeNode *new_node, return 0; } -TreeNode *CPTAddElement(uint8_t *ipdata, uint16_t ip_bitmask, CPTTree *tree, uint8_t netmask) { - uint8_t *buffer = NULL; - uint8_t bitlen = 0; +TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree *tree, unsigned char netmask) { + unsigned char *buffer = NULL; + unsigned char bitlen = 0; int bit_validation = 0, test_bit = 0; int i = 0, j = 0, temp = 0; - uint16_t x, y; + unsigned int x, y; TreeNode *node = NULL, *new_node = NULL; TreeNode *parent = NULL, *i_node = NULL; TreeNode *bottom_node = NULL; @@ -407,7 +407,7 @@ TreeNode *CPTAddElement(uint8_t *ipdata, uint16_t ip_bitmask, CPTTree *tree, uin node->count++; new_node = node; - node->netmasks = apr_palloc(tree->pool, (node->count * sizeof(uint8_t))); + node->netmasks = apr_palloc(tree->pool, (node->count * sizeof(unsigned char))); if ((node->count -1) == 0) { node->netmasks[0] = netmask; @@ -474,7 +474,7 @@ TreeNode *CPTAddElement(uint8_t *ipdata, uint16_t ip_bitmask, CPTTree *tree, uin i++; } - i_node->netmasks = apr_palloc(tree->pool, (node->count - i) * sizeof(uint8_t)); + i_node->netmasks = apr_palloc(tree->pool, (node->count - i) * sizeof(unsigned char)); if(i_node->netmasks == NULL) { return NULL; @@ -514,7 +514,7 @@ TreeNode *CPTAddElement(uint8_t *ipdata, uint16_t ip_bitmask, CPTTree *tree, uin return new_node; } -int TreeCheckData(TreePrefix *prefix, CPTData *prefix_data, uint16_t netmask) { +int TreeCheckData(TreePrefix *prefix, CPTData *prefix_data, unsigned int netmask) { for(prefix_data != NULL; ; prefix_data = prefix_data->next) { if (prefix_data->netmask == netmask) { @@ -525,7 +525,7 @@ int TreeCheckData(TreePrefix *prefix, CPTData *prefix_data, uint16_t netmask) return 0; } -int TreePrefixNetmask(modsec_rec *msr, TreePrefix *prefix, uint16_t netmask, int flag) { +int TreePrefixNetmask(modsec_rec *msr, TreePrefix *prefix, unsigned int netmask, int flag) { CPTData *prefix_data = NULL; int ret = 0; @@ -564,8 +564,8 @@ int TreePrefixNetmask(modsec_rec *msr, TreePrefix *prefix, uint16_t netmask, int return ret; } -TreeNode *CPTRetriveNode(modsec_rec *msr, uint8_t *buffer, uint16_t ip_bitmask, TreeNode *node) { - uint16_t x, y; +TreeNode *CPTRetriveNode(modsec_rec *msr, unsigned char *buffer, unsigned int ip_bitmask, TreeNode *node) { + unsigned int x, y; if(node == NULL) { if (msr->txcfg->debuglog_level >= 9) { @@ -610,7 +610,7 @@ TreeNode *CPTRetriveParentNode(TreeNode *node) { return node; } -TreeNode *CPTFindElementIPNetblock(modsec_rec *msr, uint8_t *ipdata, uint8_t ip_bitmask, TreeNode *node) { +TreeNode *CPTFindElementIPNetblock(modsec_rec *msr, unsigned char *ipdata, unsigned char ip_bitmask, TreeNode *node) { TreeNode *netmask_node = NULL; int mask = 0, bytes = 0; int i = 0, j = 0; @@ -690,10 +690,10 @@ TreeNode *CPTFindElementIPNetblock(modsec_rec *msr, uint8_t *ipdata, uint8_t ip_ return CPTFindElementIPNetblock(msr, ipdata, ip_bitmask, netmask_node->parent); } -TreeNode *CPTFindElement(modsec_rec *msr, uint8_t *ipdata, uint16_t ip_bitmask, CPTTree *tree) { +TreeNode *CPTFindElement(modsec_rec *msr, unsigned char *ipdata, unsigned int ip_bitmask, CPTTree *tree) { TreeNode *node = NULL; int mask = 0, bytes = 0; - uint8_t temp_data[NETMASK_256-1]; + unsigned char temp_data[NETMASK_256-1]; if (tree == NULL) { if (msr->txcfg->debuglog_level >= 9) { @@ -771,7 +771,7 @@ TreeNode *CPTFindElement(modsec_rec *msr, uint8_t *ipdata, uint16_t ip_bitmask, return CPTFindElementIPNetblock(msr, temp_data, ip_bitmask, node); } -TreeNode *CPTIpMatch(modsec_rec *msr, uint8_t *ipdata, CPTTree *tree, int type) { +TreeNode *CPTIpMatch(modsec_rec *msr, unsigned char *ipdata, CPTTree *tree, int type) { if(tree == NULL) { if (msr->txcfg->debuglog_level >= 9) { @@ -807,8 +807,8 @@ TreeNode *CPTIpMatch(modsec_rec *msr, uint8_t *ipdata, CPTTree *tree, int type) } TreeNode *TreeAddIP(const char *buffer, CPTTree *tree, int type) { - uint32_t ip, ret; - uint8_t netmask_v4 = NETMASK_32, netmask_v6 = NETMASK_128; + unsigned long ip, ret; + unsigned char netmask_v4 = NETMASK_32, netmask_v6 = NETMASK_128; char ip_strv4[NETMASK_32], ip_strv6[NETMASK_128]; struct in_addr addr4; struct in6_addr addr6; @@ -820,7 +820,7 @@ TreeNode *TreeAddIP(const char *buffer, CPTTree *tree, int type) { switch(type) { case IPV4_TREE: - bzero(&addr4, sizeof(addr4)); + memset(&addr4, 0, sizeof(addr4)); memset(ip_strv4, 0x0, NETMASK_32); strncpy(ip_strv4, buffer, sizeof(ip_strv4) - 2); @@ -849,10 +849,10 @@ TreeNode *TreeAddIP(const char *buffer, CPTTree *tree, int type) { tree->count++; - return CPTAddElement((uint8_t *)&ip, NETMASK_32, tree, netmask_v4); + return CPTAddElement((unsigned char *)&ip, NETMASK_32, tree, netmask_v4); case IPV6_TREE: - bzero(&addr6, sizeof(addr6)); + memset(&addr6, 0, sizeof(addr6)); memset(ip_strv6, 0x0, NETMASK_128); strncpy(ip_strv6, buffer, sizeof(ip_strv6) - 2); @@ -878,7 +878,7 @@ TreeNode *TreeAddIP(const char *buffer, CPTTree *tree, int type) { tree->count++; - return CPTAddElement((uint8_t *)&addr6.s6_addr, NETMASK_128, tree, netmask_v6); + return CPTAddElement((unsigned char *)&addr6.s6_addr, NETMASK_128, tree, netmask_v6); default: return NULL; } diff --git a/apache2/msc_tree.h b/apache2/msc_tree.h index 96b9fa57..6bda085f 100644 --- a/apache2/msc_tree.h +++ b/apache2/msc_tree.h @@ -16,7 +16,6 @@ #define __MSC_TREE_H__ #include "modsecurity.h" -#include typedef struct CPTData CPTData; typedef struct TreePrefix TreePrefix; @@ -45,20 +44,20 @@ typedef struct TreeRoot TreeRoot; #define NETMASK_2 0x2 struct CPTData { - uint8_t netmask; + unsigned char netmask; struct CPTData *next; }; struct TreePrefix { - uint8_t *buffer; - uint16_t bitlen; + unsigned char *buffer; + unsigned int bitlen; CPTData *prefix_data; }; struct TreeNode { - uint16_t bit; + unsigned int bit; int count; - uint8_t *netmasks; + unsigned char *netmasks; TreePrefix *prefix; struct TreeNode *left, *right; struct TreeNode *parent; @@ -75,8 +74,8 @@ struct TreeRoot { CPTTree *ipv6_tree; }; -CPTTree DSOLOCAL *CPTCreateRadixTree(apr_pool_t *pool); -TreeNode DSOLOCAL *CPTIpMatch(modsec_rec *, uint8_t *, CPTTree *, int); -TreeNode DSOLOCAL *TreeAddIP(const char *, CPTTree *, int); +CPTTree DSOLOCAL *CPTCreateRadixTree(apr_pool_t *pool); +TreeNode DSOLOCAL *CPTIpMatch(modsec_rec *msr, unsigned char *ipdata, CPTTree *tree, int type); +TreeNode DSOLOCAL *TreeAddIP(const char *buffer, CPTTree *tree, int type); #endif /*__MSC_TREE_H__ */ diff --git a/apache2/msc_util.c b/apache2/msc_util.c index ac4ecd4f..a3ecc701 100644 --- a/apache2/msc_util.c +++ b/apache2/msc_util.c @@ -571,6 +571,24 @@ char *file_basename(apr_pool_t *mp, const char *filename) { } #ifdef WIN32 +char *strcasestr(const char *haystack, const char *needle) { + char aux, lower_aux; + int length; + + if ((aux = *needle++) != 0) { + aux = (char)tolower((unsigned char)aux); + length = strlen(needle); + do { + do { + if ((lower_aux = *haystack++) == 0) + return NULL; + } while ((char)tolower((unsigned char)lower_aux) != aux); + } while (strncasecmp(haystack, needle, length) != 0); + haystack--; + } + return ((char *)haystack); +} + int inet_pton(int family, const char *src, void *dst) { struct addrinfo addr; struct sockaddr_in *in = NULL; diff --git a/apache2/msc_util.h b/apache2/msc_util.h index a7b765d5..80c8cadf 100644 --- a/apache2/msc_util.h +++ b/apache2/msc_util.h @@ -29,7 +29,9 @@ #include "re.h" #ifdef WIN32 +#include int DSOLOCAL inet_pton(int family, const char *src, void *dst); +char DSOLOCAL *strcasestr(const char *haystack, const char *needle); #endif int DSOLOCAL normalize_path_inplace(unsigned char *input, int len, int win, int *changed); diff --git a/apache2/re_operators.c b/apache2/re_operators.c index 86d91dc8..f12a8c96 100644 --- a/apache2/re_operators.c +++ b/apache2/re_operators.c @@ -333,7 +333,7 @@ static int msre_op_ipmatchFromFile_execute(modsec_rec *msr, msre_rule *rule, msr return 0; } - if (CPTIpMatch(msr, (uint8_t *)&in.s_addr, rtree->ipv4_tree, IPV4_TREE) != NULL) { + if (CPTIpMatch(msr, (unsigned char *)&in.s_addr, rtree->ipv4_tree, IPV4_TREE) != NULL) { *error_msg = apr_psprintf(msr->mp, "IPmatchFromFile \"%s\" matched at %s.", var->value, var->name); return 1; } @@ -347,7 +347,7 @@ static int msre_op_ipmatchFromFile_execute(modsec_rec *msr, msre_rule *rule, msr return 0; } - if (CPTIpMatch(msr, (uint8_t *)&in6.s6_addr, rtree->ipv6_tree, IPV6_TREE) != NULL) { + if (CPTIpMatch(msr, (unsigned char *)&in6.s6_addr, rtree->ipv6_tree, IPV6_TREE) != NULL) { *error_msg = apr_psprintf(msr->mp, "IPmatchFromFile \"%s\" matched at %s.", var->value, var->name); return 1; } From 21be05c7fa674ed57342769ec54cc9555883275b Mon Sep 17 00:00:00 2001 From: brenosilva Date: Sat, 16 Jun 2012 19:41:18 +0000 Subject: [PATCH 15/64] change release to 2.7.0-rc2 --- apache2/msc_release.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache2/msc_release.h b/apache2/msc_release.h index b99585fc..b2dbc9aa 100644 --- a/apache2/msc_release.h +++ b/apache2/msc_release.h @@ -40,7 +40,7 @@ #define MODSEC_VERSION_MINOR "7" #define MODSEC_VERSION_MAINT "0" #define MODSEC_VERSION_TYPE "-rc" -#define MODSEC_VERSION_RELEASE "1" +#define MODSEC_VERSION_RELEASE "2" #define MODSEC_VERSION_SUFFIX MODSEC_VERSION_TYPE MODSEC_VERSION_RELEASE From 3bb931e18818e1432ea88269b468a42dda1dfd0a Mon Sep 17 00:00:00 2001 From: brenosilva Date: Sun, 17 Jun 2012 13:32:07 +0000 Subject: [PATCH 16/64] Fix warnings --- apache2/modsecurity.h | 2 +- apache2/msc_crypt.c | 47 ++++++++++++++++++----------------- apache2/msc_crypt.h | 8 +++--- apache2/msc_multipart.c | 2 +- apache2/msc_release.h | 2 +- apache2/msc_tree.h | 4 +-- apache2/re.c | 4 +-- apache2/re_actions.c | 4 +++ apache2/re_operators.c | 55 ++++++++++++++++++++++++++++++++--------- 9 files changed, 82 insertions(+), 46 deletions(-) diff --git a/apache2/modsecurity.h b/apache2/modsecurity.h index 30661a8f..81317d18 100644 --- a/apache2/modsecurity.h +++ b/apache2/modsecurity.h @@ -569,7 +569,7 @@ struct directory_config { /* Encryption */ apr_array_header_t *encryption_method; - const char *crypto_key; + const char *crypto_key; int crypto_key_len; const char *crypto_param_name; int encryption_is_enabled; diff --git a/apache2/msc_crypt.c b/apache2/msc_crypt.c index 1ad85dee..49cfe51c 100644 --- a/apache2/msc_crypt.c +++ b/apache2/msc_crypt.c @@ -70,7 +70,7 @@ char *normalize_path(modsec_rec *msr, char *input) { xmlNormalizeURIPath(uri->path); Uri = apr_pstrdup(msr->mp, uri->path); - for(i = 0; i < strlen(Uri); i++) { + for(i = 0; i < (int)strlen(Uri); i++) { if(Uri[i] != '.' && Uri[i] != '/') { if (i - 1 < 0) i = 0; @@ -84,7 +84,7 @@ char *normalize_path(modsec_rec *msr, char *input) { } } - if(bytes >= strlen(uri->path)) + if(bytes >= (int)strlen(uri->path)) return NULL; content = apr_psprintf(msr->mp, "%s", uri->path+bytes); @@ -126,8 +126,8 @@ unsigned long prng() { short num_matrix1[10], num_matrix2[10]; unsigned long num, num1, num2; short n, *p; - unsigned short seed_num; - unsigned long seed; + unsigned short seed_num = 0; + unsigned long seed = 0; seed_num = seed & N16BITS_MAX; num = seed & N31BITS_MASK; @@ -176,9 +176,8 @@ unsigned long prng() { * * \retval key random key */ -unsigned char *getkey(apr_pool_t *mp) { - unsigned short int length = 12; - unsigned char *key = NULL; +char *getkey(apr_pool_t *mp) { + char *key = NULL; unsigned long int seed = time(NULL); key = apr_psprintf(mp,"%lu%lu",prng(),seed); @@ -197,8 +196,8 @@ unsigned char *getkey(apr_pool_t *mp) { * * \retval hex_digest The MAC */ -char *hmac(modsec_rec *msr, const unsigned char *key, int key_len, - char *msg, int msglen) { +char *hmac(modsec_rec *msr, const char *key, int key_len, + unsigned char *msg, int msglen) { apr_sha1_ctx_t ctx; unsigned char digest[APR_SHA1_DIGESTSIZE]; unsigned char hmac_ipad[HMAC_PAD_SIZE], hmac_opad[HMAC_PAD_SIZE]; @@ -294,7 +293,7 @@ int init_response_body_html_parser(modsec_rec *msr) { msr_log(msr, 4, "init_response_body_html_parser: assuming ISO-8859-1."); msr->crypto_html_tree = htmlReadMemory(msr->resbody_data, msr->resbody_length, NULL, "ISO-8859-1", HTML_PARSE_RECOVER | HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); - htmlSetMetaEncoding ((htmlDocPtr) msr->crypto_html_tree, "ISO-8859-1"); + htmlSetMetaEncoding ((htmlDocPtr) msr->crypto_html_tree, (const xmlChar *) "ISO-8859-1"); } else{ charset+=8; @@ -310,7 +309,7 @@ int init_response_body_html_parser(modsec_rec *msr) { "init_response_body_html_parser: Charset[%s]",charset); msr->crypto_html_tree = htmlReadMemory(msr->resbody_data, msr->resbody_length, NULL, charset, HTML_PARSE_RECOVER| HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); - htmlSetMetaEncoding ((htmlDocPtr) msr->crypto_html_tree, charset); + htmlSetMetaEncoding ((htmlDocPtr) msr->crypto_html_tree, (const xmlChar *)charset); if(final_charset != NULL) *final_charset=sep; } @@ -320,7 +319,7 @@ int init_response_body_html_parser(modsec_rec *msr) { msr_log(msr, 4,"init_response_body_html_parser: Enconding[%s].",msr->r->content_encoding); msr->crypto_html_tree = htmlReadMemory(msr->resbody_data, msr->resbody_length, NULL, msr->r->content_encoding, HTML_PARSE_RECOVER | HTML_PARSE_NOBLANKS | HTML_PARSE_NOERROR | HTML_PARSE_NOWARNING); - htmlSetMetaEncoding ((htmlDocPtr) msr->crypto_html_tree, msr->r->content_encoding); + htmlSetMetaEncoding ((htmlDocPtr) msr->crypto_html_tree, (const xmlChar *)msr->r->content_encoding); } if(msr->crypto_html_tree == NULL){ if (msr->txcfg->debuglog_level >= 4) @@ -356,7 +355,6 @@ int do_encryption_method(modsec_rec *msr, char *link, int type) { char *my_error_msg = NULL; int ovector[33]; int rc; - const char *ret; if(msr == NULL) return -1; @@ -997,8 +995,7 @@ int inject_encrypted_response_body(modsec_rec *msr, int elts) { char *p = NULL; const char *ctype = NULL; const char *encoding = NULL; - char* new_ct = NULL; - int rc = 0; + char *new_ct = NULL, *content_value = NULL; if(msr == NULL) return -1; @@ -1081,7 +1078,7 @@ int inject_encrypted_response_body(modsec_rec *msr, int elts) { } msr->stream_output_length = output_buf->buffer->use; - msr->stream_output_data = (unsigned char *)malloc(msr->stream_output_length+1); + msr->stream_output_data = (char *)malloc(msr->stream_output_length+1); if (msr->stream_output_data == NULL) { xmlOutputBufferClose(output_buf); @@ -1110,7 +1107,7 @@ int inject_encrypted_response_body(modsec_rec *msr, int elts) { } msr->stream_output_length = output_buf->conv->use; - msr->stream_output_data = (unsigned char *)malloc(msr->stream_output_length+1); + msr->stream_output_data = (char *)malloc(msr->stream_output_length+1); if (msr->stream_output_data == NULL) { xmlOutputBufferClose(output_buf); @@ -1128,8 +1125,12 @@ int inject_encrypted_response_body(modsec_rec *msr, int elts) { xmlOutputBufferClose(output_buf); + content_value = (char*)apr_psprintf(msr->mp, "%"APR_SIZE_T_FMT, msr->stream_output_length); apr_table_unset(msr->r->headers_out,"Content-Length"); - apr_table_set(msr->r->headers_out, "Content-Length",(char*)apr_psprintf(msr->mp, APR_SIZE_T_FMT, msr->stream_output_length)); + + if (msr->txcfg->debuglog_level >= 4) + msr_log(msr, 4, "inject_encrypted_response_body: Setting new content value %s", content_value); + apr_table_set(msr->r->headers_out, "Content-Length", content_value); xmlFreeDoc(msr->crypto_html_tree); @@ -1149,10 +1150,10 @@ int inject_encrypted_response_body(modsec_rec *msr, int elts) { * \retval mac_link MACed link * \retval NULL on fail */ -unsigned char *do_hash_link(modsec_rec *msr, char *link, int type) { - unsigned char *mac_link = NULL; +char *do_hash_link(modsec_rec *msr, char *link, int type) { + char *mac_link = NULL; char *path_chunk = NULL; - unsigned char *hash_value = NULL; + char *hash_value = NULL; char *qm = NULL; if(msr == NULL) return NULL; @@ -1339,10 +1340,10 @@ unsigned char *do_hash_link(modsec_rec *msr, char *link, int type) { qm = strchr((char*)link,'?'); if(qm == NULL){ - mac_link= (unsigned char*)apr_psprintf(msr->mp, "%s?%s=%s", link, msr->txcfg->crypto_param_name, (char *)hash_value); + mac_link= (char*)apr_psprintf(msr->mp, "%s?%s=%s", link, msr->txcfg->crypto_param_name, (char *)hash_value); } else{ - mac_link= (unsigned char*)apr_psprintf(msr->mp, "%s&%s=%s", link, msr->txcfg->crypto_param_name, (char*)hash_value); + mac_link= (char*)apr_psprintf(msr->mp, "%s&%s=%s", link, msr->txcfg->crypto_param_name, (char*)hash_value); } return mac_link; diff --git a/apache2/msc_crypt.h b/apache2/msc_crypt.h index bf0cfc8f..94bb9931 100644 --- a/apache2/msc_crypt.h +++ b/apache2/msc_crypt.h @@ -32,11 +32,11 @@ #define N15BITS_MASK 0x7FFF #define N31BITS_MASK 0x7FFFFFFF -char DSOLOCAL *hmac(modsec_rec *msr,const unsigned char *key, int key_len, - char *msg, int msglen); -unsigned char DSOLOCAL *do_hash_link(modsec_rec *msr, char *link, +char DSOLOCAL *hmac(modsec_rec *msr, const char *key, int key_len, + unsigned char *msg, int msglen); +char DSOLOCAL *do_hash_link(modsec_rec *msr, char *link, int type); -unsigned char DSOLOCAL *getkey(apr_pool_t *mp); +char DSOLOCAL *getkey(apr_pool_t *mp); int DSOLOCAL init_response_body_html_parser(modsec_rec *msr); int DSOLOCAL encrypt_response_body_links(modsec_rec *msr); diff --git a/apache2/msc_multipart.c b/apache2/msc_multipart.c index 35eb6174..ae518953 100644 --- a/apache2/msc_multipart.c +++ b/apache2/msc_multipart.c @@ -20,7 +20,7 @@ #include "msc_util.h" #include "msc_parsers.h" -void validate_quotes(modsec_rec *msr, unsigned char *data) { +void validate_quotes(modsec_rec *msr, char *data) { int i, len; if(msr == NULL) diff --git a/apache2/msc_release.h b/apache2/msc_release.h index b2dbc9aa..b99585fc 100644 --- a/apache2/msc_release.h +++ b/apache2/msc_release.h @@ -40,7 +40,7 @@ #define MODSEC_VERSION_MINOR "7" #define MODSEC_VERSION_MAINT "0" #define MODSEC_VERSION_TYPE "-rc" -#define MODSEC_VERSION_RELEASE "2" +#define MODSEC_VERSION_RELEASE "1" #define MODSEC_VERSION_SUFFIX MODSEC_VERSION_TYPE MODSEC_VERSION_RELEASE diff --git a/apache2/msc_tree.h b/apache2/msc_tree.h index 6bda085f..a6df488f 100644 --- a/apache2/msc_tree.h +++ b/apache2/msc_tree.h @@ -31,8 +31,8 @@ typedef struct TreeRoot TreeRoot; #define TREE_CHECK(x, y) ((x) & (y)) #define MASK_BITS(x) ((x + 1) * 8) -#define SHIFT_LEFT_MASK(x) (-1 << x) -#define SHIFT_RIGHT_MASK(x,y) (x >> y) +#define SHIFT_LEFT_MASK(x) ((-1) << (x)) +#define SHIFT_RIGHT_MASK(x,y) ((x) >> (y)) #define NETMASK_256 0x100 #define NETMASK_128 0x80 diff --git a/apache2/re.c b/apache2/re.c index 677bef08..1b94fffe 100644 --- a/apache2/re.c +++ b/apache2/re.c @@ -1459,7 +1459,7 @@ static apr_status_t msre_ruleset_process_phase_(msre_ruleset *ruleset, modsec_re int do_process = 1; const char *range = NULL; rule_exception *re = NULL; - char *my_error_msg, *error_msg; + char *my_error_msg; const apr_array_header_t *tag_tarr = NULL; const apr_table_entry_t *tag_telts = NULL; @@ -2165,7 +2165,7 @@ msre_rule *msre_rule_create(msre_ruleset *ruleset, int type, msre_rule *rule; char *my_error_msg; const char *argsp; - int rc, idx; + int rc; if (error_msg == NULL) return NULL; *error_msg = NULL; diff --git a/apache2/re_actions.c b/apache2/re_actions.c index 5b114905..92257129 100644 --- a/apache2/re_actions.c +++ b/apache2/re_actions.c @@ -990,6 +990,7 @@ static apr_status_t msre_action_ctl_execute(modsec_rec *msr, apr_pool_t *mptmp, if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "Ctl: Set EncryptionEnforcement to %s.", value); } + return 1; } else if (strcasecmp(name, "EncryptionEngine") == 0) { if (strcasecmp(value, "on") == 0) { @@ -1003,6 +1004,7 @@ static apr_status_t msre_action_ctl_execute(modsec_rec *msr, apr_pool_t *mptmp, if (msr->txcfg->debuglog_level >= 4) { msr_log(msr, 4, "Ctl: Set EncryptionEngine to %s.", value); } + return 1; } else if (strcasecmp(name, "ruleRemoveById") == 0) { *(const char **)apr_array_push(msr->removed_rules) = (const char *)apr_pstrdup(msr->mp, value); @@ -1274,6 +1276,8 @@ static apr_status_t msre_action_ctl_execute(modsec_rec *msr, apr_pool_t *mptmp, msr_log(msr, 1, "Internal Error: Unknown ctl action \"%s\".", name); return -1; } + + return -1; } /* xmlns */ diff --git a/apache2/re_operators.c b/apache2/re_operators.c index f12a8c96..39bf5ad1 100644 --- a/apache2/re_operators.c +++ b/apache2/re_operators.c @@ -304,8 +304,6 @@ static int msre_op_ipmatchFromFile_param_init(msre_rule *rule, char **error_msg) static int msre_op_ipmatchFromFile_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, char **error_msg) { TreeRoot *rtree = rule->op_param_data; - TreeNode *node; - apr_sockaddr_t *sa; struct in_addr in; struct in6_addr in6; @@ -736,7 +734,11 @@ static int msre_op_validateEncryption_param_init(msre_rule *rule, char **error_m int erroffset; msc_regex_t *regex; const char *pattern = rule->op_param; + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT int rc, jit; + #endif + #endif if (error_msg == NULL) return -1; *error_msg = NULL; @@ -795,10 +797,14 @@ static int msre_op_validateEncryption_execute(modsec_rec *msr, msre_rule *rule, unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; - int rc, jit; - char *qspos = NULL; - const char *parm = NULL, *pattern = NULL; - msc_parm *mparm = NULL; + int rc; + const char *pattern = NULL; + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT + int jit; + #endif + #endif + if (error_msg == NULL) return -1; *error_msg = NULL; @@ -968,7 +974,11 @@ static int msre_op_rx_param_init(msre_rule *rule, char **error_msg) { int erroffset; msc_regex_t *regex; const char *pattern = rule->op_param; + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT int rc, jit; + #endif + #endif if (error_msg == NULL) return -1; *error_msg = NULL; @@ -1019,10 +1029,16 @@ static int msre_op_rx_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, c int capture = 0; int matched_bytes = 0; int matched = 0; - int rc, jit; + int rc; char *qspos = NULL; const char *parm = NULL, *pattern = NULL; msc_parm *mparm = NULL; + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT + int jit; + #endif + #endif + if (error_msg == NULL) return -1; *error_msg = NULL; @@ -2644,14 +2660,18 @@ static int msre_op_verifyCC_execute(modsec_rec *msr, msre_rule *rule, msre_var * unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; - int rc, jit; + int rc; int is_cc = 0; int offset; int matched_bytes = 0; char *qspos = NULL; const char *parm = NULL; msc_parm *mparm = NULL; - + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT + int jit; + #endif + #endif if (error_msg == NULL) return -1; *error_msg = NULL; @@ -2946,13 +2966,19 @@ static int msre_op_verifyCPF_execute(modsec_rec *msr, msre_rule *rule, msre_var unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; - int rc, jit; + int rc; int is_cpf = 0; int offset; int matched_bytes = 0; char *qspos = NULL; const char *parm = NULL; msc_parm *mparm = NULL; + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT + int jit; + #endif + #endif + if (error_msg == NULL) return -1; *error_msg = NULL; @@ -3235,13 +3261,19 @@ static int msre_op_verifySSN_execute(modsec_rec *msr, msre_rule *rule, msre_var unsigned int target_length; char *my_error_msg = NULL; int ovector[33]; - int rc, jit; + int rc; int is_ssn = 0; int offset; int matched_bytes = 0; char *qspos = NULL; const char *parm = NULL; msc_parm *mparm = NULL; + #ifdef WITH_PCRE_STUDY + #ifdef WITH_PCRE_JIT + int jit; + #endif + #endif + if (error_msg == NULL) return -1; *error_msg = NULL; @@ -3534,7 +3566,6 @@ static int msre_op_rbl_execute(modsec_rec *msr, msre_rule *rule, msre_var *var, unsigned int high8bits = 0; char *name_to_check = NULL; char *target = NULL; - char *target2 = NULL; apr_sockaddr_t *sa = NULL; apr_status_t rc; int capture = 0; From c22376aa5bea19a9531d5bc2285b88dacdeba153 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Sun, 17 Jun 2012 13:49:33 +0000 Subject: [PATCH 17/64] Fix warnings --- apache2/msc_tree.c | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/apache2/msc_tree.c b/apache2/msc_tree.c index 8dae4e24..6dab16fc 100644 --- a/apache2/msc_tree.c +++ b/apache2/msc_tree.c @@ -18,6 +18,7 @@ #include #if !defined(WIN32) || !defined(WINNT) #include +#include #endif #include "apr_lib.h" #include "msc_util.h" @@ -171,9 +172,10 @@ int TreePrefixContainNetmask(TreePrefix *prefix, unsigned char netmask) { prefix_data = prefix->prefix_data; - for(prefix_data != NULL; ; prefix_data = prefix_data->next) { + while (prefix_data != NULL) { if (prefix_data->netmask == netmask) return 1; + prefix_data = prefix_data->next; } return 0; @@ -386,9 +388,10 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree prefix_data = node->prefix->prefix_data; - for(prefix_data != NULL; ; prefix_data = prefix_data->next) { + while(prefix_data != NULL) { if (prefix_data->netmask == netmask) ++found; + prefix_data = prefix_data->next; } if (found != 0) { @@ -516,10 +519,11 @@ TreeNode *CPTAddElement(unsigned char *ipdata, unsigned int ip_bitmask, CPTTree int TreeCheckData(TreePrefix *prefix, CPTData *prefix_data, unsigned int netmask) { - for(prefix_data != NULL; ; prefix_data = prefix_data->next) { + while(prefix_data != NULL) { if (prefix_data->netmask == netmask) { return 1; } + prefix_data = prefix_data->next; } return 0; From 245f6dc61958ce0f9e3949997a1c0ea0097c9912 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 22 Jun 2012 03:15:49 +0000 Subject: [PATCH 18/64] Release 2.7.0-rc2 --- CHANGES | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGES b/CHANGES index ef30dac6..d8f1604a 100644 --- a/CHANGES +++ b/CHANGES @@ -1,10 +1,9 @@ -NN Jun 2012 - 2.7.0-rc2 +22 Jun 2012 - 2.7.0-rc2 ------------------- - * Fix compilation errors unders Windows platform. - - * Fix SecEncryptionKey was not working as expected. + * Fixed compilation errors and warnings under Windows platform. + * Fixed SecEncryptionKey was not working as expected. 08 Jun 2012 - 2.7.0-rc1 ------------------- From 21e21b23a4666cc06d76be9dbafef25be3ebbc6d Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 22 Jun 2012 03:16:16 +0000 Subject: [PATCH 19/64] Release 2.7.0-rc2 --- apache2/msc_release.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache2/msc_release.h b/apache2/msc_release.h index b99585fc..b2dbc9aa 100644 --- a/apache2/msc_release.h +++ b/apache2/msc_release.h @@ -40,7 +40,7 @@ #define MODSEC_VERSION_MINOR "7" #define MODSEC_VERSION_MAINT "0" #define MODSEC_VERSION_TYPE "-rc" -#define MODSEC_VERSION_RELEASE "1" +#define MODSEC_VERSION_RELEASE "2" #define MODSEC_VERSION_SUFFIX MODSEC_VERSION_TYPE MODSEC_VERSION_RELEASE From 3a05349e0afd0faed9c69c6584afe2b002748b73 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Fri, 22 Jun 2012 12:58:46 +0000 Subject: [PATCH 20/64] Fix setting key len for child conf --- apache2/apache2_config.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apache2/apache2_config.c b/apache2/apache2_config.c index 13393e5f..fb755a14 100644 --- a/apache2/apache2_config.c +++ b/apache2/apache2_config.c @@ -136,6 +136,7 @@ void *create_directory_config(apr_pool_t *mp, char *path) dcfg->col_timeout = NOT_SET; dcfg->crypto_key = NOT_SET_P; + dcfg->crypto_key_len = NOT_SET; dcfg->crypto_key_add = NOT_SET; dcfg->crypto_param_name = NOT_SET_P; dcfg->encryption_is_enabled = NOT_SET; @@ -554,6 +555,8 @@ void *merge_directory_configs(apr_pool_t *mp, void *_parent, void *_child) /* Encryption */ merged->crypto_key = (child->crypto_key == NOT_SET_P ? parent->crypto_key : child->crypto_key); + merged->crypto_key_len = (child->crypto_key_len == NOT_SET + ? parent->crypto_key_len : child->crypto_key_len); merged->crypto_key_add = (child->crypto_key_add == NOT_SET ? parent->crypto_key_add : child->crypto_key_add); merged->crypto_param_name = (child->crypto_param_name == NOT_SET_P From f4d446574c009ac77deac78e913236797f1c1306 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Tue, 3 Jul 2012 19:12:51 +0000 Subject: [PATCH 21/64] Fix pcre version mismatch warning --- apache2/mod_security2.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apache2/mod_security2.c b/apache2/mod_security2.c index e3177079..275a4e33 100644 --- a/apache2/mod_security2.c +++ b/apache2/mod_security2.c @@ -89,7 +89,7 @@ static void version(apr_pool_t *mp) { ap_log_error(APLOG_MARK, APLOG_WARNING, 0, NULL, "ModSecurity: Loaded APR do not match with compiled!"); } - pcre_vrs = apr_psprintf(mp,"%d.%d", PCRE_MAJOR, PCRE_MINOR); + pcre_vrs = apr_psprintf(mp,"%d.%02d", PCRE_MAJOR, PCRE_MINOR); ap_log_error(APLOG_MARK, APLOG_NOTICE, 0, NULL, "ModSecurity: PCRE compiled version=\"%s\"; " From 71c1e7813c383f9a06000f3b0fe0b9202e5f0a59 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Tue, 3 Jul 2012 19:18:45 +0000 Subject: [PATCH 22/64] Fix replacing targets --- apache2/re.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) diff --git a/apache2/re.c b/apache2/re.c index 1b94fffe..a3d3d11a 100644 --- a/apache2/re.c +++ b/apache2/re.c @@ -140,7 +140,7 @@ char *update_rule_target_ex(modsec_rec *msr, msre_ruleset *ruleset, msre_rule *r char *name = NULL, *value = NULL; char *opt = NULL, *param = NULL; char *target_list = NULL, *replace = NULL; - int i, rc, match = 0; + int i, rc, match = 0, var_appended = 0; if(rule != NULL) { @@ -221,10 +221,14 @@ char *update_rule_target_ex(modsec_rec *msr, msre_ruleset *ruleset, msre_rule *r strncasecmp(targets[i]->param,value,strlen(targets[i]->param)) == 0) { memset(targets[i]->name,0,strlen(targets[i]->name)); memset(targets[i]->param,0,strlen(targets[i]->param)); + targets[i]->is_counting = 0; + targets[i]->is_negated = 1; match = 1; } } else if (value == NULL && targets[i]->param == NULL){ memset(targets[i]->name,0,strlen(targets[i]->name)); + targets[i]->is_counting = 0; + targets[i]->is_negated = 1; match = 1; } else continue; @@ -251,13 +255,15 @@ char *update_rule_target_ex(modsec_rec *msr, msre_ruleset *ruleset, msre_rule *r goto end; } if(msr) { - msr_log(msr, 9, "Successfuly replaced variable"); + msr_log(msr, 9, "Successfully replaced variable"); } #if !defined(MSC_TEST) else { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, " ModSecurity: Successfuly replaced variable"); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, " ModSecurity: Successfully replaced variable"); } #endif + var_appended = 1; + } else { if(msr) { msr_log(msr, 9, "Cannot find variable to replace"); @@ -361,11 +367,12 @@ char *update_rule_target_ex(modsec_rec *msr, msre_ruleset *ruleset, msre_rule *r } #if !defined(MSC_TEST) else { - ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, " ModSecurity: Error parseing rule targets to append variable"); + ap_log_error(APLOG_MARK, APLOG_ERR, 0, NULL, " ModSecurity: Error parsing rule targets to append variable"); } #endif goto end; } + var_appended = 1; } else { if(msr) { msr_log(msr, 9, "Skipping variable, already appended"); @@ -381,15 +388,16 @@ char *update_rule_target_ex(modsec_rec *msr, msre_ruleset *ruleset, msre_rule *r p = apr_strtok(NULL,",",&savedptr); } - if(match == 0) { + if(var_appended == 1) { current_targets = msre_generate_target_string(ruleset->mp, rule); rule->unparsed = msre_rule_generate_unparsed(ruleset->mp, rule, current_targets, NULL, NULL); + rule->p1 = apr_pstrdup(ruleset->mp, current_targets); if(msr) { - msr_log(msr, 9, "Successfuly appended variable"); + msr_log(msr, 9, "Successfully appended variable"); } #if !defined(MSC_TEST) else { - ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, " ModSecurity: Successfuly appended variable"); + ap_log_error(APLOG_MARK, APLOG_INFO, 0, NULL, " ModSecurity: Successfully appended variable"); } #endif } From 1c3efe02f0dcbb87d796e87bd51e62780afa5b55 Mon Sep 17 00:00:00 2001 From: brenosilva Date: Mon, 23 Jul 2012 18:02:29 +0000 Subject: [PATCH 23/64] Update Reference Manual --- CHANGES | 12 ++++ doc/Reference_Manual.html | 147 +++++++++++++++++++++----------------- 2 files changed, 95 insertions(+), 64 deletions(-) diff --git a/CHANGES b/CHANGES index d8f1604a..f1c004df 100644 --- a/CHANGES +++ b/CHANGES @@ -1,3 +1,15 @@ +23 Jul 2012 - 2.6.7 +------------------- + + * Fixed PCRE mismtach version warning message (Thanks Victor Julien). + + * Fixed explicit target replacement using SecUpdateTargetById was broken. + + * The ctl:ruleUpdateTargetById is deprecated and will be removed for future versions since + there is no safe way to use it per-request. + + * Added ctl:ruleRemoveTargetById that can be used to exclude targets to be processed per-request. + 22 Jun 2012 - 2.7.0-rc2 ------------------- diff --git a/doc/Reference_Manual.html b/doc/Reference_Manual.html index c7a72c24..ba98326b 100644 --- a/doc/Reference_Manual.html +++ b/doc/Reference_Manual.html @@ -9,26 +9,30 @@ lang="en"> - + + + +href="https://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Special:RecentChanges&feed=rss"> +href="https://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Special:RecentChanges&feed=atom"> SourceForge.net: Reference Manual - mod-security - - @@ -41,7 +45,7 @@ type="text/css"> var wgScript = "/apps/mediawiki/mod-security/index.php"; var wgVariantArticlePath = false; var wgActionPaths = {}; - var wgServer = "http://sourceforge.net"; + var wgServer = "https://sourceforge.net"; var wgCanonicalNamespace = ""; var wgCanonicalSpecialPageName = false; var wgNamespaceNumber = 0; @@ -50,12 +54,12 @@ type="text/css"> var wgAction = "view"; var wgArticleId = "12"; var wgIsArticle = true; - var wgUserName = null; - var wgUserGroups = null; + var wgUserName = "Brenosilva"; + var wgUserGroups = ["admin", "editor", "*", "user", "autoconfirmed"]; var wgUserLanguage = "en"; var wgContentLanguage = "en"; var wgBreakFrames = false; - var wgCurRevisionId = 502; + var wgCurRevisionId = 507; var wgVersion = "1.15.1"; var wgEnableAPI = true; var wgEnableWriteAPI = true; @@ -63,11 +67,13 @@ type="text/css"> var wgDigitTransformTable = ["", ""]; var wgRestrictionEdit = []; var wgRestrictionMove = []; + var wgAjaxWatch = {"watchMsg": "Watch", "unwatchMsg": "Unwatch", "watchingMsg": "Watching…", "unwatchingMsg": "Unwatching…"}; /*]]>*/ + @@ -2604,6 +2610,9 @@ example, lets say you want to only inspect ARGS for a particular URL:

SecRule REQUEST_FILENAME "@streq /path/to/file.php" "phase:1,t:none,nolog,pass,ctl:ruleUpdateTargetById=958895;REQUEST_URI;REQUEST_FILENAME"
 
+
Note 
This ctl is deprecated and will be removed +from the code, since we cannot use it per-transaction. +

SecRuleUpdateTargetByMsg

Description: Updates the target (variable) list of the @@ -2653,18 +2662,6 @@ target to the end of the variable list as follows: "phase:2,rev:'2.1.1',capture,t:none,t:htmlEntityDecode,t:compressWhitespace,t:lowercase,ctl:auditLogParts=+E,block,msg:'System Command Injection',id:'958895',tag:'WEB_ATTACK/COMMAND_INJECTION',tag:'WASCTC/WASC-31',tag:'OWASP_TOP_10/A1',tag:'PCI/6.5.2',logdata:'%{TX.0}',severity:'2',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.command_injection_score=+%{tx.critical_anomaly_score},setvar:tx.%{rule.id}-WEB_ATTACK/COMMAND_INJECTION-%{matched_var_name}=% {tx.0}"" -

Conditionally Appending Targets -

You could also do the same by using the ctl action. This is -useful if you want to only update the targets for a particular URL -

-
SecRule REQUEST_FILENAME "@streq /path/to/file.php" "phase:1,t:none,nolog,pass,ctl:ruleUpdateTargetByMsg='System Command Injection';!ARGS:email"
-
-

Conditionally Replacing Targets -

You could also replace targets using the ctl action. For -example, lets say you want to only inspect ARGS for a particular URL: -

-
SecRule REQUEST_FILENAME "@streq /path/to/file.php" "phase:1,t:none,nolog,pass,ctl:ruleUpdateTargetByMsg='System Command Injection';REQUEST_URI;REQUEST_FILENAME"
-

SecRuleUpdateTargetByTag

Description: Updates the target (variable) list of the @@ -2714,18 +2711,6 @@ target to the end of the variable list as follows: "phase:2,rev:'2.1.1',capture,t:none,t:htmlEntityDecode,t:compressWhitespace,t:lowercase,ctl:auditLogParts=+E,block,msg:'System Command Injection',id:'958895',tag:'WEB_ATTACK/COMMAND_INJECTION',tag:'WASCTC/WASC-31',tag:'OWASP_TOP_10/A1',tag:'PCI/6.5.2',logdata:'%{TX.0}',severity:'2',setvar:'tx.msg=%{rule.msg}',setvar:tx.anomaly_score=+%{tx.critical_anomaly_score},setvar:tx.command_injection_score=+%{tx.critical_anomaly_score},setvar:tx.%{rule.id}-WEB_ATTACK/COMMAND_INJECTION-%{matched_var_name}=% {tx.0}"" -

Conditionally Appending Targets -

You could also do the same by using the ctl action. This is -useful if you want to only update the targets for a particular URL -

-
SecRule REQUEST_FILENAME "@streq /path/to/file.php" "phase:1,t:none,nolog,pass,ctl:ruleUpdateTargetByMsg='WASCTC/WASC-31';!ARGS:email"
-
-

Conditionally Replacing Targets -

You could also replace targets using the ctl action. For -example, lets say you want to only inspect ARGS for a particular URL: -

-
SecRule REQUEST_FILENAME "@streq /path/to/file.php" "phase:1,t:none,nolog,pass,ctl:ruleUpdateTargetByMsg='WASCTC/WASC-31';REQUEST_URI;REQUEST_FILENAME"
-

SecServerSignature

Description: Instructs ModSecurity to change the data @@ -2932,7 +2917,7 @@ five phases of the Apache request cycle:

Below is a diagram of the standard Apache Request Cycle. In the diagram, the 5 ModSecurity processing phases are shown.

@@ -4511,9 +4496,10 @@ SecRule REQUEST_CONTENT_TYPE ^text/xml "nolog,pass,ctl:requestBodyProcessor=XML"

  • ruleRemoveById - since this action us triggered at run time, it should be specified before the rule in which it is disabling. -
  • ruleUpdateTargetById -
  • ruleUpdateTargetByMsg -
  • ruleUpdateTargetByTag +
  • ruleUpdateTargetById - This is deprecated and will be +removed from the code. Use ruleRemoveTargetById for per-request +exceptions. +
  • ruleRemoveTargetById
  • ruleRemoveByMsg
  • encryptionEngine
  • encryptionEnforcement @@ -6247,16 +6233,16 @@ SecCookieFormat 0 - + +href="https://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference_Manual">https://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Reference_Manual"
    @@ -6269,18 +6255,30 @@ href="http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Referen @@ -6290,6 +6288,24 @@ href="http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Referen
    @@ -6297,7 +6313,7 @@ cellspacing="0"> @@ -6306,24 +6322,24 @@ href="http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Main_Pa @@ -6348,22 +6364,25 @@ value="Search" title="Search the pages for this text" type="submit"> @@ -6375,15 +6394,15 @@ href="http://sourceforge.net/apps/mediawiki/mod-security/index.php?title=Referen src="Reference_Manual_files/poweredby_mediawiki_88x31.png" alt="Powered by MediaWiki">
      -
    • This page was last modified on 8 June 2012, at -12:36.
    • -
    • This page has been accessed 130,792 times.
    • +
    • This page was last modified on 23 July 2012, at +17:54.
    • +
    • This page has been accessed 142,275 times.
    - +