Mod-Security Rules

Rund um die Sicherheit des Systems und die Applikationen
caput
Posts: 48
Joined: 2005-06-08 02:06

Mod-Security Rules

Post by caput » 2005-07-29 13:44

Mein kleiner Beitrag zu einem ModSecurity Rules-Set was nicht so aufgebläht ist und die Performance nicht in den Keller zieht. Eventuell gibt es ja den ein oder anderen Verbesserungsvorschlag, was man zum Beispiel ändern sollte usw. Kritik aller Art ist willkommen! :wink:

Status: Experimentell
Last Update: 14.08.2005

Neu: http://www.modsecurity.org/projects/rules/ (Offizielle ModSecurity Rules)

Siehe auch: http://rootiewiki.de/index.php?pagename ... rityRegeln

Referenz und Quelle für das Rules-Set:
- http://www.modsecurity.org/documentatio ... mples.html
- http://www.modsecurity.org/documentatio ... -rules.txt
- http://www.gotroot.com/downloads/ftp/mod_security/
- http://www.eth0.us/?q=mod_security

Offtopic Anmerkungen zu ModSecurity:
- http://www.rootforum.org/forum/viewtopic.php?t=13531
- http://www.rootforum.org/forum/viewtopic.php?t=34213

Offizielle Dokumentation und weiterführende Links: http://www.modsecurity.org/documentation/index.html

Rules-Set (filter.conf):

Code: Select all

# (bewusst Zeilenumbrüche eingebaut damit es das Boardlayout nicht sprengt.)

# -----------------------------------------------------------------------------
#  Start Rules (Gerneric)
# -----------------------------------------------------------------------------

# Enforce proper HTTP requests
SecFilterSelective THE_REQUEST "!HTTP/(0.9|1.0|1.1)$"

# check for bad meta characters in User-Agent field
SecFilterSelective HTTP_USER_AGENT ".*'"

# Require Content-Length to be provided with every POST request
SecFilterSelective REQUEST_METHOD "^POST$" chain
SecFilterSelective HTTP_Content-Length "^$"

# Don't accept transfer encodings we know we don't handle (and you don't need it anyway)
SecFilterSelective HTTP_Transfer-Encoding "!^$"

# Don't accept chunked encodings
SecFilterSelective HTTP_Transfer-Encoding "chunked"

# must have a useragent string
SecFilterSelective "HTTP_USER_AGENT|HTTP_HOST" "^$"

# Again, this is better protected by removing these functions in php.ini
SecFilterSelective ARGS "(system|exec|passthru|popen|shell_exec|proc_open|fopen|fwrite)s*("

# Prevent path traversal (..) attacks
SecFilter "../"

# generic recursion signature
SecFilterSelective THE_REQUEST "../../"

# generic attack sig
SecFilterSelective THE_REQUEST "cdx20*;(cd|;|echo|perl|python|rpm|yum|apt-get|emerge|lynx|links|mkdir|elinks|cmd|pwd|
wget|id|uname|cvs|svn|(s|r)(cp|sh)|rexec|smbclient|t?ftp|ncftp|curl|telnet|gcc|cc|g++|./)"

# generic filter to prevent SQL injection attacks
SecFilter "[[:space:]]+(select|grant|delete|insert|drop|alter|replace|truncate|update|create|rename|
describe)[[:space:]]+[A-Z|a-z|0-9|*| |,]+[[:space:]]+(from|into|table|database|index|view)[[:space:]]+[A-Z|a-z|0-9|*| |,]"

# generic PHP remote file inclusion attack
SecFilter ".php?" chain
SecFilter "(http|https|ftp):/" chain
SecFilter "cmd=(cd|;|perl|python|rpm|yum|apt-get|emerge|lynx|links|mkdir|elinks|cmd|pwd|wget|id|
uname|cvs|svn|(s|r)(cp|sh)|rexec|smbclient|t?ftp|ncftp|curl|telnet|gcc|cc|g++|./)"

# generic sig for more bad PHP functions
SecFilterSelective THE_REQUEST "chr(([0-9]{1,3}))"
SecFilterSelective THE_REQUEST "chr([0-9a-fA-Fx]+)"

# SQL injection attacks
SecFilter "delete[[:space:]]+from"
SecFilter "insert[[:space:]]+into"
SecFilter "select.+from"

# SQL injection in cookies
SecFilterSelective COOKIE_sessionid ".*(select|grant|delete|insert|drop|do|alter|replace|truncate|update|create|rename|
describe)[[:space:]]+[A-Z|a-z|0-9|*||,]+[[:space:]]+(from|into|table|database|index|view)"

# -----------------------------------------------------------------------------
#  Start Rules (experimental)
# -----------------------------------------------------------------------------

# experimental generic remote download sig foo IP or FQDN or foo http/https/ftp://whatever
SecFilterSelective THE_REQUEST "(perl|t?ftp|links|elinks|lynx|ncftp|(s|r)(cp|sh)|wget|curl|cvs|svn).*x20((http|https|ftp):/|
[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}|.*[A-Za-z|0-9].[a-zA-Z]{2,4}/)"
SecFilterSelective THE_REQUEST "( |;|/|'|,|&|=|.)((s|r)(sh|cp)) *(.*@.*|(http|https|ftp):/|[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3}|.*[A-Za-z|
0-9].[a-zA-Z]{2,4}/)"

# XSS atacks (HTML/Javascript injection)
# SecFilter "<(.|n)+>"
# deactivated since it causes problems with Serendipity when creating new entries
# this is the error message: mod_security-message: Access denied with code 406. Pattern match "<(.|n)+>" at POST_PAYLOAD.
# ff@nodomain.cc, 02.08.2005

# (bewusst Zeilenumbrüche eingebaut damit es das Boardlayout nicht sprengt.)
Apache Modul Config:

Code: Select all

<IfModule mod_security.c>

    # Only inspect dynamic requests
    # (YOU MUST TEST TO MAKE SURE IT WORKS AS EXPECTED)
    # SecFilterEngine DynamicOnly

    # Turn the filtering engine On or Off
    SecFilterEngine On

    # Reject requests with status 404
    SecFilterDefaultAction "deny,log,status:404"

    # Some sane defaults
    SecServerResponseToken Off
    SecFilterScanPOST Off
    SecFilterCheckURLEncoding On
    SecFilterCheckCookieFormat On
    SecFilterCheckUnicodeEncoding Off

    # If you want to scan the output, uncomment these
    # SecFilterScanOutput On
    # SecFilterOutputMimeTypes "(null) text/html text/plain"

    # Accept almost all byte values
    SecFilterForceByteRange 1 255

    # Only record the interesting stuff
    SecAuditEngine RelevantOnly
    SecAuditLog /var/log/apache/audit_log

    # You normally won't need debug logging
    SecFilterDebugLevel 0
    SecFilterDebugLog /var/log/apache/modsec_debug_log

    # Include rules
    Include /etc/apache/modsecurity/filter.conf

</IfModule>
e-History:
e1: kleinen Fehler hier sowohl im Wiki korrigiert. :oops:
e2: XSS atacks (HTML/Javascript injection) Regelsatz vorerst als 'experimental' eingestuft, weil es anscheinend bei dem ein oder anderen Probleme gab/gibt.
e3: Modul configuration und Link zum RootieWiki hinzugefügt.
e4: Struktur des Beitrags geändert und Links hinzugefügt, entfernt und korrigiert.
Last edited by caput on 2006-01-23 22:28, edited 4 times in total.

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: Mod-Security Rules

Post by captaincrunch » 2005-08-01 08:43

Wäre ein Wiki für diese Aufgabe nicht etwas besser geeignet? ;)
DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

lufthansen
Posts: 390
Joined: 2002-09-24 17:31
Location: NRW

Re: Mod-Security Rules

Post by lufthansen » 2005-08-01 13:05

ich finde die idee cool solche regelsätze zusammeln und public zu machen, gerade für die phpbb expl. wäre das echt nicht schlecht ...

captaincrunch
Userprojekt
Userprojekt
Posts: 7066
Joined: 2002-10-09 14:30
Location: Dorsten

Re: Mod-Security Rules

Post by captaincrunch » 2005-08-01 13:53

DebianHowTo
echo "[q]sa[ln0=aln256%Pln256/snlbx]sb729901041524823122snlbxq"|dc

as-n
Posts: 196
Joined: 2002-12-19 17:42

Re: Mod-Security Rules

Post by as-n » 2005-08-02 08:30

@caput

Kannst du mal bitte den gesamten

<IfModule mod_security.c>

...

</IfModule>

Bereich posten, rein Interessehalber. Danke.

Ciao
AS-N

caput
Posts: 48
Joined: 2005-06-08 02:06

Re: Mod-Security Rules

Post by caput » 2005-08-02 12:35

Jep, kann ich.. :)

Siehe oben
Last edited by caput on 2005-08-14 22:41, edited 3 times in total.

as-n
Posts: 196
Joined: 2002-12-19 17:42

Re: Mod-Security Rules

Post by as-n » 2005-08-02 17:28

Dankeschön.

Kann man mod_security auch irgend wie testen, ob es auch richtig läuft?

Ciao
AS-N

legato
Posts: 115
Joined: 2004-06-03 12:40

Re: Mod-Security Rules

Post by legato » 2005-08-02 20:08

Naja, einen ganz simplen Test kannst mit

http://www.deine-url.tld/verbotenes-wort-wie-wget

machen. Dann sollte je nach Konfiguration ein 403 und ein entsprechender Log Eintrag vorhanden sein.

chaosad
Posts: 137
Joined: 2005-05-06 15:48

Re: Mod-Security Rules

Post by chaosad » 2005-08-02 20:14

vielleicht eine doofe Frage aber wo kann ich eine Regel definieren was nicht geblockt werden soll? nagios hat nämlich unter anderem ein Problem mit mod-security. Aber auch ganz normale Seitenaufrufe landen bei mir in der audit.log Das sollte doch eigentlich nicht sein? Muß mir das ganze aber später nochmal in Ruhe anschauen. Die Links sind auf jeden Fall nicht schlecht

caput
Posts: 48
Joined: 2005-06-08 02:06

Re: Mod-Security Rules

Post by caput » 2005-08-02 23:19

chaosad wrote:vielleicht eine doofe Frage aber wo kann ich eine Regel definieren was nicht geblockt werden soll? nagios hat nämlich unter anderem ein Problem mit mod-security. Aber auch ganz normale Seitenaufrufe landen bei mir in der audit.log Das sollte doch eigentlich nicht sein? Muß mir das ganze aber später nochmal in Ruhe anschauen. Die Links sind auf jeden Fall nicht schlecht
Nagios sagt mir nichts, aber kann möglich sein das die ein oder anderen Probleme mit dem 'SecFilterScanPOST On' auftreten können, gegebnenfalls kann man diese Funktion bei dem jeweiligen Vhost deaktivieren. Kannst ja mal den entsprechenden Logauszu posten. Ansonsten habe ich bei mir Problemlos einige Sachen laufen bzw. getestet, zB wie phpBB, vBulletin, Textpattern, Mambo CMS, Xoops, Wordpress, Drupal (was allerdings auch nicht den vollem Spektrum an beliebter s/Software/Scripte entspricht).

Aber wie gesagt Feedback aller Art ist erwünscht! Testen kann man das ganze indem man sich an einem Händler seines vertrauens wendet der das Kinderspielzeug vertreibt oder an irgendwelchen Securityticker mit POCs/Exploits bedient. Allerdings möchte ich auch an dieser Stelle erwähnen das die Regelsätze allein mit Mod-Security kein 99%iger Schutz gegen irgendwelche SQL-Injection und Cross Site Scripting (XSS) Attacken ist! :o

chaosad
Posts: 137
Joined: 2005-05-06 15:48

Re: Mod-Security Rules

Post by chaosad » 2005-08-02 23:55

Das spuckt mir audit.log aus:

Request: XXX.XXX.XXX.XXX - - [02/Aug/2005:23:45:35 +0200] "GET / HTTP/1.0" 500 618
Handler: (null)
----------------------------------------
GET / HTTP/1.0
Host: XXX.XXX.XXX.XXX
User-Agent: check_http/1.24.2.4 (nagios-plugins )
mod_security-message: Access denied with code 500. Pattern match "!(mod_security|mozilla)" at HEADER
mod_security-action: 500

HTTP/1.0 500 Internal Server Error
Content-Length: 618
Connection: close
Content-Type: text/html; charset=iso-8859-1

Aber es werden auch ganz normale Aufrufe ins log geschrieben und das sollte doch normal nicht sein?


PS klar das es keine Wunderwaffe ist aber ist sicher ne nette ergänzung

caput
Posts: 48
Joined: 2005-06-08 02:06

Re: Mod-Security Rules

Post by caput » 2005-08-03 00:03

chaosad wrote:User-Agent: check_http/1.24.2.4 (nagios-plugins )
mod_security-message: Access denied with code 500. Pattern match "!(mod_security|mozilla)" at HEADER
Schaut so aus als hättest du folgenden Regelsatz in deiner Config

Code: Select all

# Only allow our own test utility to send requests (or Mozilla)
SecFilterSelective HTTP_USER_AGENT "!(mod_security|mozilla)"
Der allerdings nicht von mir aufgeführt ist sondern auf der Mod-Security Seite unter denn Quick examples ist allerdings vollkommen sinnfrei.. :roll:

chaosad
Posts: 137
Joined: 2005-05-06 15:48

Re: Mod-Security Rules

Post by chaosad » 2005-08-03 00:18

jetzt funktioniert es. Danke dümmer könnte ich mich wohl gar nicht anstellen :-( Sorry

ffl
Userprojekt
Userprojekt
Posts: 269
Joined: 2002-10-23 08:28
Location: Karlsruhe

Re: Mod-Security Rules

Post by ffl » 2005-08-03 02:57

Hi,

danke für die Regeln :)... habs g leich mal ausprobiert und schon das erste Problem festgestellt: Der XSS Filter macht Probleme mit Serendipity bei Erstellen eines Eintrages, da der Text des Eintrags über POST gesendet wird. Außerdem war das Unicode Encoding kaputt.

Code: Select all

# XSS atacks (HTML/Javascript injection)
# SecFilter "<(.|n)+>"
# deactivated since it causes problems with Serendipity when creating new entries
# this is the error message: mod_security-message: Access denied with code 406. Pattern match "<(.|n)+>" at POST_PAYLOAD.
# ff@nodomain.cc, 02.08.2005
Any other ideas außer den Filter zu deaktivieren?

Danke
ff

as-n
Posts: 196
Joined: 2002-12-19 17:42

Re: Mod-Security Rules

Post by as-n » 2005-08-03 09:02

Hier auch eine Unverträglichkeit mit dem osCommerce Shop:

Code: Select all

Request: 84.180.17.29 - - [03/Aug/2005:08:49:13 +0200] "POST /catalog/checkout_confirmation.php?osCsid=51ed26478ba03b4accf833eccb6991cb HTTP/1.1" 404 1438
Handler: type-map
----------------------------------------
POST /catalog/checkout_confirmation.php?osCsid=51ed26478ba03b4accf833eccb6991cb HTTP/1.1
Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
Referer: https://meinedomain.de/catalog/checkout_payment.php?osCsid=51ed26478ba03b4accf833eccb6991cb
Accept-Language: de
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; (R1 1.5); .NET CLR 1.1.4322)
Host: meinedomain.de
Content-Length: 8897
Connection: Keep-Alive
Cache-Control: no-cache
Cookie: elmar_debug_level=all; osCsid=51ed26478ba03b4accf833eccb6991cb; sid=cbd2bae54e375b779759ca781c36601d; osCAdminsID=59dffc353e543f3b2a7e1b12a4dab44a
mod_security-message: Error parsing POST parameters: Error normalizing parameter value: Invalid Unicode encoding: invalid byte value
mod_security-action: 404
Die Filterregeln scheinen es nicht zu sein, die habe ich mal alle deaktiviert.

Es ist folgendes:

Code: Select all

SecFilterScanPOST On 
Ist jetzt auf Off und der Shop läuft wieder, auf was prüft er denn da ganz genau?

Ciao
AS-N

caput
Posts: 48
Joined: 2005-06-08 02:06

Re: Mod-Security Rules

Post by caput » 2005-08-03 12:10

FFL wrote:Any other ideas außer den Filter zu deaktivieren?
Leider kann ich kein sinnvolles Workaround bieten ausser es zu deaktivieren, aber ich sehe auch keinen erheblichen Beinbruch darin. Muss man halt abwägen zwischen Funktionalität und Sicherheit. :wink:
AS-N wrote:Es ist folgendes:

Code: Select all

SecFilterScanPOST On 
Ist jetzt auf Off und der Shop läuft wieder, auf was prüft er denn da ganz genau?
POST scanning
Request body payload (or POST payload) scanning is disabled by default. To use it, you need
to turn it on: SecFilterScanPOST On
Wie im Post zuvor auch schon erwähnt macht die 'SecFilterScanPOST' Funktion einige Probleme, muss auch eingestehen danach nicht weit genug recherschiert zu haben! :oops:
Habe auch erstmal dementsprechend die Posts oben editiert..

as-n
Posts: 196
Joined: 2002-12-19 17:42

Re: Mod-Security Rules

Post by as-n » 2005-08-03 12:15

Jetzt hängt das nächste, Umlaute in der URL mag er gar nicht.
Die werden bei mir als Variablen übergeben.
Ich habe jetzt erst mal alles wieder deaktiviert udn werde mal nachlesen.

Ciao
AS-N

darki
Posts: 36
Joined: 2003-11-25 12:57
Location: Karlsruhe

Re: Mod-Security Rules

Post by darki » 2005-08-03 15:14

umlaute in der url? AUTSCH! bei php 'urlencode' benutzen ;)

Bei Ordnern und Dateien sollte man doch eigentlich auf Umlaute verzichten, oder nicht?(ae oe ue/&auml; &uuml; &ouml;/ phpfunktion urlencode) :roll:

as-n
Posts: 196
Joined: 2002-12-19 17:42

Re: Mod-Security Rules

Post by as-n » 2005-08-03 15:20

Ich habe den osCommerce Shop nicht geschrieben und wenn jemand Müller heißt, dann ist das jemand anderes als ein Herr Mueller.

Ciao
AS-N

chaosad
Posts: 137
Joined: 2005-05-06 15:48

Re: Mod-Security Rules

Post by chaosad » 2005-08-03 18:14

Wie verhält sich denn der Server bei einer etwas größeren Regelliste? Konnte jetzt bei meinem Testsystem nicht die großen Unterschiede bemerken. Allerdings ist hier natürlich auch nicht viel los.

superuser1
Posts: 291
Joined: 2003-11-26 18:43
Location: earth

Re: Mod-Security Rules

Post by superuser1 » 2005-08-03 18:34

Hi...
Ich habe den osCommerce Shop nicht geschrieben...
zur Not ließe sich sowas aber bestimmt mit wenigen Zeilen Code (urlencode/urldecode) nachrüsten...

:roll:

as-n
Posts: 196
Joined: 2002-12-19 17:42

Re: Mod-Security Rules

Post by as-n » 2005-08-03 18:39

Klar könnte ich den Shop umschreiben, wenn ich es könnte, php ist nicht soooo mein Gebiet, sorry.

Ciao
AS-N

rumpel
Posts: 16
Joined: 2004-09-08 10:44

Re: Mod-Security Rules

Post by rumpel » 2005-08-03 19:39

Ist das Modul mod_security auch für Webserver sinnvoll, wo kein PHP, Perl o.ä. läuft sprich der nur als reiner Downloadserver dient?

chaosad
Posts: 137
Joined: 2005-05-06 15:48

Re: Mod-Security Rules

Post by chaosad » 2005-08-05 20:27

Code: Select all

SecFilterScanPOST On 
Ist jetzt auf Off und der Shop läuft wieder, auf was prüft er denn da ganz genau

Wäre ganz interessant zu wissen. VHCS scheint hier nämlich auch ein Problem zu haben.

rudi
Posts: 69
Joined: 2004-12-08 19:10

Re: Mod-Security Rules

Post by rudi » 2005-08-05 23:56

Was haltet ihr von den gotroot.com modsec regeln?
(http://www.gotroot.com/tiki-index.php?p ... s#download)