Gitea setup: Core Rule Set blocks attacks, not ordinary Gitea traffic (closes #198)
check / check (push) Waiting to run
check / check (push) Waiting to run
The Gitea setup runs the Core Rule Set in block mode. Rules that refused ordinary Gitea requests are switched off only where they misfired: - deploy/gitea/crs-exclusions.conf, loaded through the new setting SWWAF_CORE_RULE_SET_EXCLUSIONS_FILE before the Core Rule Set's rules, covers Gitea's search, file-name and branch-name fields, Referer, file paths, API attachment names and Actions artifact uploads; - smallwebwaf's defaults gain a seventh change: the registry upload path's from parameter skips 932260. A file that cannot be read, does not parse or names an id from 900000 to 900999 stops servewaf at start, in every mode. internal/waf's tests and script/gitea-setup send the recorded requests in internal/waf/testdata/gitea-requests.txt and three attacks. Model: opus-5-5
This commit is contained in:
@@ -36,7 +36,8 @@ to them.
|
||||
- the state files;
|
||||
- a lookup database;
|
||||
- a `SWWAF_` setting given as a file;
|
||||
- the file `SWWAF_LOG_REMOTE_TLS_CA_FILE` names.
|
||||
- the file `SWWAF_LOG_REMOTE_TLS_CA_FILE` names;
|
||||
- the file `SWWAF_CORE_RULE_SET_EXCLUSIONS_FILE` names.
|
||||
|
||||
## Non-goals
|
||||
|
||||
@@ -81,7 +82,7 @@ to them.
|
||||
of bans is full.
|
||||
- `internal/rules`: reads the rule files at start and again when they
|
||||
change, and tells which rules a request matches.
|
||||
- `internal/waf`: the Core Rule Set, with the six changes listed under
|
||||
- `internal/waf`: the Core Rule Set, with the seven changes listed under
|
||||
"Attack detection", as Coraza directives.
|
||||
- `internal/lookup`: looks clients up through GeoJS or in the lookup
|
||||
database.
|
||||
@@ -325,9 +326,10 @@ Conventions:
|
||||
lists: `SWWAF_ADMIN_TOKEN_FILE` names the file that holds `SWWAF_ADMIN_TOKEN`.
|
||||
The file's contents are the value, less one newline at the end, and are
|
||||
checked as the value itself would be. Setting both forms stops the start, and
|
||||
so does naming a file that cannot be read. `SWWAF_LOG_REMOTE_TLS_CA_FILE`
|
||||
already holds a file name, so it has no `_FILE` form. No `SWRP_` setting has
|
||||
one, since `rproxy` never touches disk.
|
||||
so does naming a file that cannot be read. `SWWAF_LOG_REMOTE_TLS_CA_FILE` and
|
||||
`SWWAF_CORE_RULE_SET_EXCLUSIONS_FILE` already hold a file name, so they have
|
||||
no `_FILE` form. No `SWRP_` setting has one, since `rproxy` never touches
|
||||
disk.
|
||||
- Settings, files included, are read once at start. Changing one means
|
||||
restarting the container. The files `servewaf` watches while it runs are its
|
||||
state files, its rule files and the lookup database.
|
||||
@@ -583,6 +585,24 @@ sends it.
|
||||
probes these rules caught (see "Rule files"). A list you give replaces the
|
||||
default, so name these six ids in it to keep them off.
|
||||
|
||||
- `SWWAF_CORE_RULE_SET_EXCLUSIONS_FILE` names a file of exclusions, written as
|
||||
Coraza directives. An exclusion switches one rule off for some fields or paths
|
||||
only, where `SWWAF_WAF_DISABLED_RULES` switches it off everywhere.
|
||||
`deploy/gitea/crs-exclusions.conf` holds gitea's.
|
||||
- `servewaf` loads the file after `smallwebwaf`'s own setup rules and before
|
||||
the Core Rule Set's rules. The Core Rule Set puts its own file of
|
||||
exclusions that run before the rules in the same place.
|
||||
- So the file holds only `SecAction` and `SecRule` lines that exclude with
|
||||
`ctl:ruleRemoveTargetById` or `ctl:ruleRemoveById`. These run with each
|
||||
request, before the rules they exclude, those of phase 1 included.
|
||||
- A rule that `SWWAF_WAF_DISABLED_RULES` switches off and the file names is
|
||||
simply off.
|
||||
- The start stops on a file that cannot be read or does not parse, whatever
|
||||
`SWWAF_WAF_MODE` is.
|
||||
- It stops too on a file that names a number from 900000 to 900999, the ids
|
||||
of `smallwebwaf`'s own rules, alone or in a range. Comment lines are not
|
||||
checked.
|
||||
|
||||
- `SWWAF_WAF_BODY_LIMIT` switches body inspection on, up to that size. It takes
|
||||
at most `64K`, since `servewaf` gets no more of a body than that (see "The
|
||||
answer"). Form data and multipart bodies are read up to the size. JSON and XML
|
||||
@@ -612,7 +632,7 @@ sends it.
|
||||
scanner from an ordinary client. In front of gitea, registry and git clients
|
||||
get `404` and `401` by design, hundreds of times a minute.
|
||||
|
||||
`smallwebwaf` changes the Core Rule Set 4.25.0 in six ways, since in front of
|
||||
`smallwebwaf` changes the Core Rule Set 4.25.0 in seven ways, since in front of
|
||||
gitea it would otherwise refuse ordinary requests. The changes hold in front of
|
||||
every app, and no setting undoes them:
|
||||
|
||||
@@ -669,6 +689,10 @@ every app, and no setting undoes them:
|
||||
must check it itself.
|
||||
6. Responses are not inspected. A raw file from a repository, such as a shell
|
||||
script, looks to the response rules like source code leaking from the server.
|
||||
7. The `from` parameter of a container registry's upload path,
|
||||
`/v2/<image>/blobs/uploads/`, is not checked for command names (932260). When
|
||||
a push reuses a layer, `from` names the image the layer comes from. An image
|
||||
such as `owner/python3-app` would have that push refused.
|
||||
|
||||
The parameter and cookie names in these changes are matched without regard to
|
||||
case, as Coraza matches them.
|
||||
|
||||
Reference in New Issue
Block a user