Skip to content
This repository was archived by the owner on May 14, 2020. It is now read-only.

Commit dede1d1

Browse files
authored
Merge pull request #879 from fzipi/v3.1/dev-contributing
Added V3.1/dev contributing
2 parents 30bc65e + bb13a87 commit dede1d1

File tree

1 file changed

+151
-0
lines changed

1 file changed

+151
-0
lines changed

CONTRIBUTING.md

Lines changed: 151 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,151 @@
1+
# Contributing to the CRS
2+
3+
We value third-party contributions. To keep things simple for you and us,
4+
please adhere to the following contributing guidelines.
5+
6+
## Getting Started
7+
8+
* You will need a [GitHub account](https://github.com/signup/free).
9+
* Submit a [ticket for your issue](https://github.com/SpiderLabs/owasp-modsecurity-crs/issues), assuming one does not already exist.
10+
* Clearly describe the issue including steps to reproduce when it is a bug.
11+
* Make sure you specify the version that you know has the issue.
12+
* Bonus points for submitting a failing test along with the ticket.
13+
* If you don't have push access, fork the repository on GitHub.
14+
15+
## Making Changes
16+
17+
* Please base your changes on branch ```v3.1/dev```
18+
* Create a topic branch for your feature or bug fix.
19+
* Make commits of logical units.
20+
* Make sure your commits adhere to the rules guidelines below.
21+
* Make sure your commit messages are in the [proper format](http://tbaggery.com/2008/04/19/a-note-about-git-commit-messages.html): The first line of the message should have 50 characters or less, separated by a blank line from the (optional) body. The body should be wrapped at 70 characters and paragraphs separated by blank lines. Bulleted lists are also fine.
22+
23+
## General Formatting Guidelines for rules contributions
24+
25+
- 4 spaces per indentation level, no tabs
26+
- no trailing whitespace at EOL or trailing blank lines at EOF
27+
- comments are good, especially when they clearly explain the rule
28+
- try to adhere to a 80 character line length limit
29+
- if it is a [chained rule](https://github.com/SpiderLabs/ModSecurity/wiki/Reference-Manual#chain), alignment should be like
30+
```
31+
SecRule .. ..\
32+
"...."
33+
SecRule .. ..\
34+
"..."
35+
SecRule .. ..\
36+
".."
37+
```
38+
- use quotes even if there is only one action, it improves readability (e.g use `"chain"`, not `chain`, or `"ctl:requestBodyAccess=Off"` instead of `ctl:requestBodyAccess=Off`)
39+
- always use numbers for phases, instead of names
40+
- format your `SecMarker` between double quotes, using UPPERCASE and separating words using hyphens. Examples are
41+
```
42+
SecMarker "END-RESPONSE-959-BLOCKING-EVALUATION"
43+
SecMarker "END-REQUEST-910-IP-REPUTATION"
44+
```
45+
- the proposed order for actions is:
46+
```
47+
id
48+
phase
49+
disruptive-action
50+
status
51+
capture
52+
t:xxx
53+
log
54+
nolog
55+
auditlog
56+
noauditlog
57+
msg
58+
logdata
59+
tag
60+
sanitiseArg
61+
sanitiseRequestHeader
62+
sanitiseMatched
63+
sanitiseMatchedBytes
64+
ctl
65+
setenv
66+
rev
67+
ver
68+
severity
69+
setvar
70+
expirevar
71+
chain
72+
skip
73+
skipAfter
74+
```
75+
76+
## Variables naming conventions
77+
78+
* Variable names are lowercase using chars from `[a-z0-9_]`
79+
* To somewhat reflect the fact that the syntax for variable usage is different when you define it (using setvar) and when you use it, we propose the following visual distinction:
80+
* Lowercase letters for collection, dot as separator, variable name. E.g: `setvar:tx.foo_bar_variable`
81+
* Capital letters for collection, colon as separator, variable name. E.g: `SecRule TX:foo_bar_variable`
82+
83+
## Rules compliance with each Paranoia Level (PL)
84+
85+
Rules in the CRS are organized in Paranoia Levels, which allows you to choose the desired level of rule checks.
86+
87+
Please read file ```crs-setup.conf.example``` for introduction and a more detailed explanation of Paranoia Levels in the section `# -- [[ Paranoia Level Initialization ]]`.
88+
89+
**PL0:**
90+
91+
* Modsec installed, but almost no rules
92+
93+
**PL1:**
94+
95+
* Default level, keep in mind that most installations will normally use this one.
96+
* If there is a complex memory consuming/evaluation rule it surely will be on upper levels, not this one
97+
* Normally we will use atomic checks in single rules
98+
* Confirmed matches only, all scores are allowed
99+
* No false positives / Low FP (Try to avoid adding rules with potential false positives!)
100+
* False negatives could happen
101+
102+
**PL2:**
103+
104+
* Chains usage are OK
105+
* Confirmed matches use score critical
106+
* Matches that cause false positives are limited to use score notice or warning
107+
* Low False positive rates
108+
* False negatives are not desirable
109+
110+
**PL3:**
111+
112+
* Chains usage with complex regex look arounds and macro expansions
113+
* Confirmed matches use score warning or critical
114+
* Matches that cause false positives are limited to use score notice
115+
* False positive rates increased but limited to multiple matches (not single string)
116+
* False negatives should be a very unlikely accident
117+
118+
**PL4:**
119+
120+
* Every item is inspected
121+
* Variable creations allowed to avoid engine limitations
122+
* Confirmed matches use score notice, warning or critical
123+
* Matches that cause false positives are limited to use score notice and warning
124+
* False positive rates increased (even on single string)
125+
* False negatives should not happen here
126+
* Check everything against RFC and white listed values for most popular elements
127+
128+
129+
## ID Numbering Scheme
130+
131+
The CRS project used the numerical id rule namespace from 900,000 to 999,999 for the CRS rules as well as 9,000,000 to 9,999,999 for default CRS rule exclusion packages.
132+
133+
Rules applying to the incoming request use the id range 900,000 to 949,999.
134+
Rules applying to the outgoing response use the id range 950,000 to 999,999.
135+
136+
The rules are grouped by vulnerability class they address (SQLi, RCE, etc.) or functionality (initialization). These groups occupy blocks of thousands (e.g. SQLi: 942,000 - 942,999).
137+
The grouped rules are defined in files dedicated to a single group or functionality. The filename takes up the first three digits of the rule ids defined within the file (e.g. SQLi: REQUEST-942-APPLICATION-ATTACK-SQLI.conf).
138+
139+
The individual rule files for the vulnerability classes are organized by the paranoia level of the rules. PL 1 is first, then PL 2 etc.
140+
141+
The block from 9XX000 - 9XX099 is reserved for use by CRS helper functionality. There are no blocking or filtering rules in this block.
142+
143+
Among the rules serving a CRS helper functionality are rules that skip rules depending on the paranoia level. These rules always use the following reserved rule ids: 9XX011-9XX018 with very few exceptions.
144+
145+
The blocking or filter rules start with 9XX100 with a step width of 10. E.g. 9XX100, 9XX110, 9XX120 etc. The rule id does not correspond directly with the paranoia level of a rule. Given the size of a rule group and the organization by lower PL rules first, PL2 and above tend to have rule IDs with higher numbers.
146+
147+
Within a rule file / block, there are sometimes smaller groups of rules that belong to together. They are closely linked and very often represent copies of the original rules with a stricter limit (alternatively, they can represent the same rule addressing a different target in a second rule where this was necessary). These are stricter siblings of the base rule. Stricter siblings usually share the first five digits of the rule ID and raise the rule ID by one. E.g. Base rule at 9XX160, stricter sibling at 9XX161.
148+
149+
Stricter siblings often have a different paranoia level. This means that the base rule and the stricter sibling do not reside next to one another in the rule file. Instead they are ordered in their appropriate paranoia level and can be linked via the first digits of the rule id. It is a good practice to introduce stricter siblings together with the base rule in the comments of the base rule and to reference the base rule with the keyword stricter sibling in the comments of the stricter sibling. E.g. "... This is
150+
performed in two separate stricter siblings of this rule: 9XXXX1 and 9XXXX2", "This is a stricter sibling of rule 9XXXX0."
151+

0 commit comments

Comments
 (0)