Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

ModSecurity 2.7.5 for Nginx 1.4.2 duplicate charset headers #568

Closed
rcbarnett-zz opened this issue Oct 17, 2013 · 11 comments
Closed

ModSecurity 2.7.5 for Nginx 1.4.2 duplicate charset headers #568

rcbarnett-zz opened this issue Oct 17, 2013 · 11 comments
Assignees

Comments

@rcbarnett-zz
Copy link
Contributor

MODSEC-420: When I disable ModSecurity from nginx.conf my backend provides charset header correctly

sec-176:~ wellu$ curl --head http://111.111.111.111/interface/ShopName?ffg
HTTP/1.1 200 OK
Server: nginx/1.4.2
Date: Thu, 29 Aug 2013 14:34:18 GMT
Content-Type: text/html; charset=UTF-8
Connection: keep-alive
Vary: Accept-Encoding
Set-Cookie: MCFS=b4v6gu0c0fsmdtj52rla35eg06; expires=Mon, 28-May-2057 05:09:58 GMT; path=/; domain=.111.111; HttpOnly
Cache-Control: no-cache
Pragma: no-cache
Expires: -1
X-Content-Type-Options: nosniff
XSS-Protection: 1; mode=block
X-Varnish: 579266232

When I enable ModSecurity for this server and just use the basic modsecurity.conf I get duplicate charset headers and also the X-headers are removed. Also the char after UTF-8 depends on how many chars after '?' I use in the URL

sec-176:~ wellu$ curl --head http://111.111.111.111/interface/ShopName?ffg
HTTP/1.1 200 OK
Server: nginx/1.4.2
Date: Thu, 29 Aug 2013 14:35:18 GMT
Content-Type: text/html; charset=UTF-8; charset=UTF-8?
Connection: keep-alive
Set-Cookie: MCFS=rknbdjna7m1oi5qh9pk6uqmrm7; expires=Mon, 28-May-2057 05:12:00 GMT; path=/; domain=.111.111; HttpOnly
Cache-Control: no-cache
Expires: -1

modsecurity.conf

-- Rule engine initialization ----------------------------------------------

Enable ModSecurity, attaching it to every transaction. Use detection

only to start with, because that minimises the chances of post-installation

disruption.

SecRuleEngine DetectionOnly

-- Request body handling ---------------------------------------------------

Allow ModSecurity to access request bodies. If you don't, ModSecurity

won't be able to see any POST parameters, which opens a large security

hole for attackers to exploit.

SecRequestBodyAccess On

Enable XML request body parser.

Initiate XML Processor in case of xml content-type

SecRule REQUEST_HEADERS:Content-Type "text/xml"
"id:'200000',phase:1,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"

Maximum request body size we will accept for buffering. If you support

file uploads then the value given on the first line has to be as large

as the largest file you are willing to accept. The second value refers

to the size of data, with files excluded. You want to keep that value as

low as practical.

SecRequestBodyLimit 13107200

SecRequestBodyLimit 22020096
SecRequestBodyNoFilesLimit 131072

Store up to 128 KB of request body data in memory. When the multipart

parser reachers this limit, it will start using your hard disk for

storage. That is slow, but unavoidable.

SecRequestBodyInMemoryLimit 131072

What do do if the request body size is above our configured limit.

Keep in mind that this setting will automatically be set to ProcessPartial

when SecRuleEngine is set to DetectionOnly mode in order to minimize

disruptions when initially deploying ModSecurity.

SecRequestBodyLimitAction Reject

Verify that we've correctly processed the request body.

As a rule of thumb, when failing to process a request body

you should reject the request (when deployed in blocking mode)

or log a high-severity alert (when deployed in detection-only mode).

SecRule REQBODY_ERROR "!@eq 0"
"id:'200001', phase:2,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:'%{reqbody_error_msg}',severity:2"

By default be strict with what we accept in the multipart/form-data

request body. If the rule below proves to be too strict for your

environment consider changing it to detection-only. You are encouraged

not to remove it altogether.

SecRule MULTIPART_STRICT_ERROR "!@eq 0"
"id:'200002',phase:2,t:none,log,deny,status:44,
msg:'Multipart request body failed strict validation:
PE %{REQBODY_PROCESSOR_ERROR},
BQ %{MULTIPART_BOUNDARY_QUOTED},
BW %{MULTIPART_BOUNDARY_WHITESPACE},
DB %{MULTIPART_DATA_BEFORE},
DA %{MULTIPART_DATA_AFTER},
HF %{MULTIPART_HEADER_FOLDING},
LF %{MULTIPART_LF_LINE},
SM %{MULTIPART_MISSING_SEMICOLON},
IQ %{MULTIPART_INVALID_QUOTING},
IP %{MULTIPART_INVALID_PART},
IH %{MULTIPART_INVALID_HEADER_FOLDING},
FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"

Did we see anything that might be a boundary?

SecRule MULTIPART_UNMATCHED_BOUNDARY "!@eq 0"
"id:'200003',phase:2,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"

PCRE Tuning

We want to avoid a potential RegEx DoS condition

SecPcreMatchLimit 1000
SecPcreMatchLimitRecursion 1000

Some internal errors will set flags in TX and we will need to look for these.

All of these are prefixed with "MSC_". The following flags currently exist:

MSC_PCRE_LIMITS_EXCEEDED: PCRE match limits were exceeded.

SecRule TX:/^MSC_/ "!@Streq 0"
"id:'200004',phase:2,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'"

-- Response body handling --------------------------------------------------

Allow ModSecurity to access response bodies.

You should have this directive enabled in order to identify errors

and data leakage issues.

Do keep in mind that enabling this directive does increases both

memory consumption and response latency.

SecResponseBodyAccess Off

Which response MIME types do you want to inspect? You should adjust the

configuration below to catch documents but avoid static files

(e.g., images and archives).

SecResponseBodyMimeType text/plain text/html text/xml

Buffer response bodies of up to 512 KB in length.

SecResponseBodyLimit 524288

What happens when we encounter a response body larger than the configured

limit? By default, we process what we have and let the rest through.

That's somewhat less secure, but does not break any legitimate pages.

SecResponseBodyLimitAction ProcessPartial

-- Filesystem configuration ------------------------------------------------

The location where ModSecurity stores temporary files (for example, when

it needs to handle a file upload that is larger than the configured limit).

This default setting is chosen due to all systems have /tmp available however,

this is less than ideal. It is recommended that you specify a location that's private.

SecTmpDir /var/log/modsecurity_workdir/

The location where ModSecurity will keep its persistent data. This default setting

is chosen due to all systems have /tmp available however, it

too should be updated to a place that other users can't access.

SecDataDir /var/log/modsecurity_workdir/

-- File uploads handling configuration -------------------------------------

The location where ModSecurity stores intercepted uploaded files. This

location must be private to ModSecurity. You don't want other users on

the server to access the files, do you?

SecUploadDir /var/log/modsecurity_workdir/

By default, only keep the files that were determined to be unusual

in some way (by an external inspection script). For this to work you

will also need at least one file inspection rule.

SecUploadKeepFiles RelevantOnly

Uploaded files are by default created with permissions that do not allow

any other user to access them. You may need to relax that if you want to

interface ModSecurity to an external program (e.g., an anti-virus).

SecUploadFileMode 0600

-- Debug log configuration -------------------------------------------------

The default debug log configuration is to duplicate the error, warning

and notice messages from the error log.

SecDebugLog /var/log/nginx/modsecurity/debug.log

SecDebugLogLevel 0

-- Audit log configuration -------------------------------------------------

Log the transactions that are marked by a rule, as well as those that

trigger a server error (determined by a 5xx or 4xx, excluding 404,

level response status codes).

SecAuditEngine RelevantOnly
SecAuditLogRelevantStatus "^(?:5|4(?!04))"

Log everything we know about a transaction.

SecAuditLogParts ABIJDEFHZ

Use a single file for logging. This is much easier to look at, but

assumes that you will use the audit log only ocassionally.

SecAuditLogType Serial

SecAuditLogType Concurrent
SecAuditLog /var/log/nginx/modsecurity/modsec_audit.log

Specify the path for concurrent audit logging.

SecAuditLogStorageDir /var/log/nginx/modsecurity/

-- Miscellaneous -----------------------------------------------------------

Use the most commonly used application/x-www-form-urlencoded parameter

separator. There's probably only one application somewhere that uses

something else so don't expect to change this value.

SecArgumentSeparator &

Settle on version 0 (zero) cookies, as that is what most applications

use. Using an incorrect cookie version may open your installation to

evasion attacks (against the rules that examine named cookies).

SecCookieFormat 0

Specify your Unicode Code Point.

This mapping is used by the t:urlDecodeUni transformation function

to properly map encoded data to your language. Properly setting

these directives helps to reduce false positives and negatives.

SecUnicodeCodePage 20127

SecUnicodeMapFile unicode.mapping

Include csr/modsecurity_crs_10_setup.conf

Include csr/activated_rules/*.conf

@rcbarnett-zz
Copy link
Contributor Author

Original reporter: wellumies

@ghost ghost assigned zimmerle Oct 17, 2013
@rcbarnett-zz
Copy link
Contributor Author

wellumies: In addition to the header problem no files over 8k are passed to the backend :( input filter's nbytes=-1 is interesting

[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Initialising transaction (txid Ac7cAcAKAcAcZHAcAcAwAcAc).
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request cookie: name "MCFS", value "5t139psi2k234a3c00562k8ra7"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request cookie: name "__utma", value "263481119.1250092366.1377775789.1377788001.1377842359.4"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request cookie: name "__utmc", value "263481119"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request cookie: name "__utmz", value "263481119.1377775789.1.1.utmcsr=(direct)|utmccn=(direct)|utmcmd=(none)"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request cookie: name "_utmb", value "263481119.11.10.1377842359"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request cookie: name "NRAGENT", value "tk=49369effad5b6c5d"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Transaction context created (dcfg 7f1f5f9fe550).
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Starting phase REQUEST_HEADERS.
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Recipe: Invoking rule 7f1f5f9fc760; [file "/etc/nginx/./modsecurity.conf"] [line "23"] [id "200000"].
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Rule 7f1f5f9fc760: SecRule "REQUEST_HEADERS:Content-Type" "@rx text/xml" "phase:1,auditlog,id:200000,t:none,t:lowercase,pass,nolog,ctl:requestBodyProcessor=XML"
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Transformation completed in 2 usec.
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Executing operator "rx" with param "text/xml" against REQUEST_HEADERS:Content-Type.
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Operator completed in 3 usec.
[30/Aug/2013:09:33:38 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Rule returned 0.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Second phase starting (dcfg 7f1f5f9fe550).
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Reading request body.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Multipart: Created temporary file 1 (mode 0600): /var/log/modsecurity_workdir//20130830-093339-Ac7cAcAKAcAcZHAcAcAwAcAc-file-N0BkPn
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Request too large to store in memory, switching to disk.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Created temporary file to store request body: /var/log/modsecurity_workdir//20130830-093339-Ac7cAcAKAcAcZHAcAcAwAcAc-request_body-P4eQuq
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Wrote 131072 bytes from memory to disk.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request argument (BODY): name "products[1994][product_id]", value "2037"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request argument (BODY): name "products[1994][options][13][]", value "ProductChoice-13"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Adding request argument (BODY): name "products[1994][quantity]", value "1"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Request body no files length: 356
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Completed receiving request body (length 199291).
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Starting phase REQUEST_BODY.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Recipe: Invoking rule 7f1f5f9f9618; [file "/etc/nginx/./modsecurity.conf"] [line "55"] [id "200001"].
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Rule 7f1f5f9f9618: SecRule "REQBODY_ERROR" "!@eq 0" "phase:2,auditlog,id:200001,t:none,log,deny,status:400,msg:'Failed to parse request body.',logdata:%{reqbody_error_msg},severity:2"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Transformation completed in 1 usec.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Executing operator "!eq" with param "0" against REQBODY_ERROR.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Operator completed in 2 usec.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Rule returned 0.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Recipe: Invoking rule 7f1f5f9fa878; [file "/etc/nginx/./modsecurity.conf"] [line "76"] [id "200002"].
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Rule 7f1f5f9fa878: SecRule "MULTIPART_STRICT_ERROR" "!@eq 0" "phase:2,auditlog,id:200002,t:none,log,deny,status:44,msg:'Multipart request body failed strict validation: PE %{REQBODY_PROCESSOR_ERROR}, BQ %{MULTIPART_BOUNDARY_QUOTED}, BW %{MULTIPART_BOUNDARY_WHITESPACE}, DB %{MULTIPART_DATA_BEFORE}, DA %{MULTIPART_DATA_AFTER}, HF %{MULTIPART_HEADER_FOLDING}, LF %{MULTIPART_LF_LINE}, SM %{MULTIPART_MISSING_SEMICOLON}, IQ %{MULTIPART_INVALID_QUOTING}, IP %{MULTIPART_INVALID_PART}, IH %{MULTIPART_INVALID_HEADER_FOLDING}, FL %{MULTIPART_FILE_LIMIT_EXCEEDED}'"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Transformation completed in 0 usec.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Executing operator "!eq" with param "0" against MULTIPART_STRICT_ERROR.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Operator completed in 1 usec.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Rule returned 0.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Recipe: Invoking rule 7f1f5f9f6968; [file "/etc/nginx/./modsecurity.conf"] [line "81"] [id "200003"].
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Rule 7f1f5f9f6968: SecRule "MULTIPART_UNMATCHED_BOUNDARY" "!@eq 0" "phase:2,auditlog,id:200003,t:none,log,deny,msg:'Multipart parser detected a possible unmatched boundary.'"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Transformation completed in 1 usec.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Executing operator "!eq" with param "0" against MULTIPART_UNMATCHED_BOUNDARY.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Operator completed in 6 usec.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Rule returned 0.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Recipe: Invoking rule 7f1f5f9f15f8; [file "/etc/nginx/./modsecurity.conf"] [line "95"] [id "200004"].
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][5] Rule 7f1f5f9f15f8: SecRule "TX:/^MSC
/" "!@Streq 0" "phase:2,log,auditlog,id:200004,t:none,deny,msg:'ModSecurity internal error flagged: %{MATCHED_VAR_NAME}'"
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Rule returned 0.
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Hook insert_filter: Adding input forwarding filter (r 7f1f5f9af0a0).
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Hook insert_filter: Adding output filter (r 7f1f5f9af0a0).
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Forwarding input: mode=0, block=0, nbytes=-1 (f 7f1f5f9b02b0, r 7f1f5f9af0a0).
[30/Aug/2013:09:33:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Forwarded 8192 bytes.
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Initialising logging.
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Starting phase LOGGING.
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Recording persistent data took 0 microseconds.
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Audit log: Ignoring a non-relevant request.
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Multipart: Cleanup started (remove files 1).
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Multipart: Deleted file (part) "/var/log/modsecurity_workdir//20130830-093339-Ac7cAcAKAcAcZHAcAcAwAcAc-file-N0BkPn"
[30/Aug/2013:09:34:39 +0300] [/sid#7f1f5fa160a0][rid#7f1f5f9af0a0][/cart/][4] Input filter: Removed temporary file: /var/log/modsecurity_workdir//20130830-093339-Ac7cAcAKAcAcZHAcAcAwAcAc-request_body-P4eQuq

@rcbarnett-zz
Copy link
Contributor Author

wellumies: Is there any comment on this? Our client is waiting with their Nginx LBs ready and only thing missing is a working ModSec

@rcbarnett-zz
Copy link
Contributor Author

wellumies: There really should be way to toggle if you don't want ModSec to add the charset-header or not

BUG: Garbage at the end of content_type header.

REASON: Ngx_snprintf does not terminate the string. Neither does
modsecurity.

PROPOSED FIX:

diff --git a/nginx/modsecurity/ngx_http_modsecurity.c
b/nginx/modsecurity/ngx_http_modsecurity.c
index 26112a6..c1350c0 100644
--- a/nginx/modsecurity/ngx_http_modsecurity.c
+++ b/nginx/modsecurity/ngx_http_modsecurity.c
@@ -618,6 +618,7 @@
ngx_http_modsecurity_load_headers_out(ngx_http_request_t *r)
"%V; charset=%V",
&r->headers_out.content_type,
&r->headers_out.charset);

  •    content_type[content_type_len-1] = 0; // ngx_snprintf does not
    

    terminate the string

      r->headers_out.content_type.data = content_type;
      r->headers_out.content_type.len = content_type_len;
    

@rcbarnett-zz
Copy link
Contributor Author

wellumies: Files over 8k are not send to backend.

BUG: Requests in excess of 8k are not forwarded.

REASON: It seems only the first chunk is forwarded--there's no logic to
forward the rest of the chunks.

PROPOSED FIX:
diff --git a/apache2/apache2_io.c b/apache2/apache2_io.c
index 88f1903..6629c4a 100644
--- a/apache2/apache2_io.c
+++ b/apache2/apache2_io.c
@@ -66,6 +66,7 @@ apr_status_t input_filter(ap_filter_t *f,
apr_bucket_brigade *bb_out,
" (f %pp, r %pp).", mode, block, nbytes, f, f->r);
}

+again:
if (msr->if_started_forwarding == 0) {
msr->if_started_forwarding = 1;
rc = modsecurity_request_body_retrieve_start(msr, &my_error_msg);
@@ -154,6 +155,8 @@ apr_status_t input_filter(ap_filter_t *f,
apr_bucket_brigade *bb_out,
if (msr->txcfg->debuglog_level >= 4) {
msr_log(msr, 4, "Input filter: Input forwarding complete.");
}

  • } else {

  •    goto again;
    

    }

    return APR_SUCCESS;

@rcbarnett-zz
Copy link
Contributor Author

zimmerle: Hi Veli,

Just placed a pull request to fix the bug that you have reported, the pull request is available at:
#148

Thanks,
F.

@rcbarnett-zz
Copy link
Contributor Author

rbarnett: This will be part of our next release - v2.7.6.

@leonelr
Copy link

leonelr commented Jan 17, 2014

Hi there,
A related issue with the "double charset-header".

Is there a way to prevent MODSEC from adding the charset-header at all (assuming this is expected behaviour)? If we can actually do that ... are we going to break some modsec functionality ?
I am running version 2.7.7 (latest) and I can not find a way to toggle this on / off .... not even sure if this is possible (sorry.. I am pretty new to modsec).

At the moment I have an issue where with modsecurity enabled we appear to be seeing duplicate charset attributes... for example, Content-Type: text/xml; Charset=UTF-8; charset=UTF-8;.... browsers will ignore the duplicate "Charset=UTF-8; charset=UTF-8"; but this is breaking one of my applications (we think that possibly MSXML is choking on it (when it retrieves such content using a document() call)).. just doesn't like that double charset.... the page throws the following error: "....System does not support the specified encoding......"

MORE INFO:
Running latest NGINX version 1.4.4

Thanks.

Leonel

@zimmerle
Copy link
Contributor

Hi @leonelr,

There was an update on the way that we have set this header. It is fixed under our development tree.
Can you check at branch "master"? By using "master" you will end up by having only one Charset, as you expected.

Br.,
F.

@leonelr
Copy link

leonelr commented Jan 19, 2014

THE update using the branch "Master" did not work. Perhaps you can send me the actual link for the download?
(I may be looking at the wrong place!)

@leonelr
Copy link

leonelr commented Jan 21, 2014

Sorry to be a pain, but I really need to sort this one out .... can anyone give me an update / confirm that this has been resolved ?
I have checked the code from the 'master' branch in 2 different loadbalancers (NGINX) and I still see the double headers.
Any help would be much appreciated.

L.R.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

3 participants