From: rm4dillo D <[email protected]<mailto:[email protected]>>
Date: Wed, 28 Sep 2011 12:18:17 -0500
To: 
"[email protected]<mailto:[email protected]>"
 
<[email protected]<mailto:[email protected]>>
Subject: [Owasp-modsecurity-core-rule-set] 981176's last matched data issues

I have three questions concerning the changes that have been applied to the 
rule 981176 in order to add the last matched data in the log line.

Yeah, these rules in the 49 inbound blocking file can certainly be improved 
upon.


First, when ModSecurity is in "DetectionOnly" mode, the chained rule ( SecRule 
TX:/^\d/ "(.*)" ) that has been added is triggered as many times as the number 
of variable names in the transaction collection that match the "^\d" regular 
expression. This makes ModSecurity log only one entry when it's in the 
"Blocking" mode and lots of entries when in "DetectionOnly" mode.

This is true however you can control how you want the rules to log by editing 
the SecDefaultAction within the 10 config file.  If you wan to run in anomaly 
scoring mode with blocking and less logging, then you can set SecDefaultAction 
to "pass,nolog,auditlog" and this will mean that each individual SecRule will 
log an entry to the audit log but only the rules in the 40 inbound blocking 
file will log to the Apache error_log.  This will give you the overall anomaly 
score and data on the last rule match.

If you want to run in anomaly scoring mode with blocking but to have more 
logging in the Apache error log, then simply change the SecDefaultAction to 
"pass,log" and this means that all rules will log to both the audit and error 
logs.  This is more chatty obviously but you will still have all logging.


The second issue with this chained rule is that the "^\d" regular expression is 
not discriminant enough as it matches the "capture" action variables "TX:0", 
"TX:1", ... and "TX:9" when in "DetectionOnly" mod. A quick fix to avoid that 
would be replacing the regular expression by "^/d{2}".

Agreed.  I updated it to this and it seems to work better -

SecRule TX:/^\d+\-/ "(.*)"


The last issue (still related to this chained rule; I think that I don't like 
it much ;-) ) is that the "matched_var" variable does not really contain the 
"Last Matched Data". In "DetectionOnly" mode, it will only be valid for the 
last logged line as it corresponds to the last matched rule and erroneous for 
all the other lines (Cf. first issue). In "Blocking" mode (as we log only once 
then the request is rejected if the score has exceeded) it will contain the 
matched data of the first rule that matched and the message (tx.msg) of the 
last one.
This produces misleading logs as the one below:

        [Wed Sep 28 18:44:53 2011] [error] [client ::1] ModSecurity: Warning. 
Pattern match "(.*)" at TX:959073-WEB_ATTACK/SQL_INJECTION-ARGS:test. [file 
"/etc/modsecurity/activated_rules/modsecurity_crs_49_inbound_blocking.conf"] 
[line "26"] [id "981176"] [msg "Inbound Anomaly Score Exceeded (Total Score: 
44, SQLi=15, XSS=30): Last Matched Message: IE XSS Filters - Attack Detected"] 
[data "Last Matched Data: benchmark("] [hostname "localhost"] [uri "/"]

As most rules use the "capture" action, why don't we replace the chained rule 
"hack?" with a simple "logdata:'Last Matched Data: %{tx.0}". This still would 
be better but still not perfect as the content will sometimes be erronuous 
because some rules can't capture. Or, even cleaner, why don't we add a 
"setvar:'tx.last_matched_data=..." in every rule?

I updated the rules to use the following.  Let me know if this is any better -

# Alert and Block based on Anomaly Scores
#
SecRule TX:ANOMALY_SCORE "@gt 0" \
    "chain,phase:2,id:'981176',t:none,deny,log,msg:'Inbound Anomaly Score 
Exceeded (Total Score: %{TX.ANOMALY_SCORE}, SQLi=%{TX.SQL_INJECTION_SCORE}, 
XSS=%{TX.XSS_SCORE}): 
%{tx.msg}',logdata:'%{tx.0}',setvar:tx.inbound_tx_msg=%{tx.msg},setvar:tx.inbound_anomaly_score=%{tx.anomaly_score}"
        SecRule TX:ANOMALY_SCORE "@ge %{tx.inbound_anomaly_score_level}" chain
                SecRule TX:ANOMALY_SCORE_BLOCKING "@streq on" chain
                        SecRule TX:/^\d+\-/ "(.*)" "capture"

-Ryan




Cheers,

Rm4dillo

________________________________
This transmission may contain information that is privileged, confidential, 
and/or exempt from disclosure under applicable law. If you are not the intended 
recipient, you are hereby notified that any disclosure, copying, distribution, 
or use of the information contained herein (including any reliance thereon) is 
STRICTLY PROHIBITED. If you received this transmission in error, please 
immediately contact the sender and destroy the material in its entirety, 
whether in electronic or hard copy format.

_______________________________________________
Owasp-modsecurity-core-rule-set mailing list
[email protected]
https://lists.owasp.org/mailman/listinfo/owasp-modsecurity-core-rule-set

Reply via email to