From b94800ff9a4cbb79c3fa32b11b5c22b985c5491b Mon Sep 17 00:00:00 2001 From: Juliana Fajardini Date: Tue, 5 Nov 2024 22:54:50 -0300 Subject: [PATCH] userguide: explain rule types and categorization Add documentation about the rule types introduced by 2696fda04168cb82. Add doc tags around code definitions that are referenced in the docs. Task #https://redmine.openinfosecfoundation.org/issues/7031 --- doc/userguide/rules/intro.rst | 223 ++++++++++++++++++ .../OverallAlgoHorizontal-v1-20241108.png | Bin 0 -> 68631 bytes src/detect-engine.c | 2 + src/detect.h | 2 + 4 files changed, 227 insertions(+) create mode 100644 doc/userguide/rules/intro/OverallAlgoHorizontal-v1-20241108.png diff --git a/doc/userguide/rules/intro.rst b/doc/userguide/rules/intro.rst index 56df9ab49437..3af6be95c4bc 100644 --- a/doc/userguide/rules/intro.rst +++ b/doc/userguide/rules/intro.rst @@ -349,3 +349,226 @@ reassembled streams, TLS-, SSL-, SSH-, FTP- and dcerpc-buffers. Note that there are some exceptions, e.g. the ``http_raw_uri`` keyword. See :ref:`rules-http-uri-normalization` for more information. + + +Rule Types and Categorization +----------------------------- + +Once parsed, Suricata rules are categorized for performance and further +processing (as different rule types will be handled by specific engine modules). +The signature types are defined in `src/detect.h +`_: + +.. literalinclude:: ../../../src/detect.h + :caption: src/detect.h + :language: c + :start-after: // rule types documentation tag start: SignatureType + :end-before: // rule types documentation tag end: SignatureType + +The rule type will impact: + + - To what does the signature action apply, in case of a match (`Action Scope`) + - When is the rule matched against traffic (`Inspected`) + - Against what the rule matches (`Matches`) + +This categorization is done taking into consideration the presence or absence of +certain rule elements, as well as the type of keywords used. The categorization +currently takes place in `src/detect-engine-build.c:void SignatureSetType() +`_. + +The ``SignatureSetType()`` overall flow is described below: + +.. image:: intro/OverallAlgoHorizontal-v1-20241108.png + :width: 600 + :alt: A flowchart representing the SignatureSetType function. + +The following table lists all Suricata signature types, and how they impact the +aspects aforementioned. + +.. list-table:: Suricata Rule Types + :header-rows: 1 + + * - Type + - Action Scope + - Inspected + - Matches + - Keyword Examples (non-exhaustive) + * - Decoder Events Only + - Packet + - Per-packet basis + - Packets that are broken on an IP level + - 'decode-event' + * - Packet + - Packet + - Per-packet basis + - Packet-level info (e.g.: header info) + - 'itype', 'tcp.hdr', 'tcp.seq', 'ttl' etc. + * - IP Only + - Flow + - Once per direction + - On IP addresses on the flow + - Source/ Destination field of a rule + * - IP Only (contains a negated address)(*) + - Flow + - Once per direction + - On the flow, on IP address level (negated addresses) + - Source/ Destination field of a rule, containing negated address + * - Protocol Detection Only + - Flow + - Once per direction, when protocol detection is done + - On protocol detected for the flow + - 'app-layer-protocol' + * - Packet-Stream + - Flow, if stateful (**) + - Flow, if stateful, per-packet if not + - Against the reassembled stream. If stream unavailable, match per-packet + (packet payload and stream payload) + - 'content' with 'startswith' or 'depth' + * - Stream + - Flow, if stateful (**) + - Per stream chunk, if stateful, per-packet if not + - Against the reassembled stream. If stream unavailable, match per-packet + - 'tcp-stream' in protocol field; simple 'content'; 'byte_extract' + * - Application Layer Protocol + - Flow + - Per-packet basis + - On 'protocol' field + - `Protocol field `_ of a rule + * - Application Layer Protocol Transactions + - Flow + - Per transaction update + - On buffer keywords + - Application layer protocol-related, e.g. 'http.host', 'rfb.secresult', + 'dcerpc.stub_data', 'frame' keywords + +.. note:: + (*) IP Only signatures with negated addresses are `like` IP-only signatures, but + currently handled differently due to limitations of the algorithm processing + IP Only rules. + +.. note:: Action Scope: `Flow, if stateful` + + (**) Apply to the flow. If a segment isn't accepted into a stream for any + reason (such as packet anomalies, errors, memcap reached etc), the rule will + be applied on a packet level. + +Signature Properties +~~~~~~~~~~~~~~~~~~~~ + +The `Action Scope` mentioned above relates to the Signature Properties, as seen in +`src/detect-engine.c `_: + +.. literalinclude:: ../../../src/detect-engine.c + :caption: src/detect-engine.c + :language: c + :start-after: // rule types documentation tag start: SignatureProperties + :end-before: // rule types documentation tag end: SignatureProperties + +Signature Examples per Type +~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +Decoder Events Only +^^^^^^^^^^^^^^^^^^^ + +For more examples check https://github.com/OISF/suricata/blob/master/rules/decoder-events.rules. + +.. container:: example-rule + + alert pkthdr any any -> any any (msg:"SURICATA IPv4 malformed option"; :example-rule-emphasis:`decode-event:ipv4.opt_malformed;` classtype:protocol-command-decode; sid:2200006; rev:2;) + +Packet +^^^^^^ + +.. container:: example-rule + + alert udp any any -> any any (msg:"UDP with flow direction"; flow:to_server; sid:1001;) + +.. container:: example-rule + + alert tcp any any -> any any (msg:"ttl"; :example-rule-emphasis:`ttl:123;` sid:701;) + +IP Only +^^^^^^^ + +.. container:: example-rule + + alert tcp-stream any any -> any any (msg:"tcp-stream, no content"; sid:101;) + + +.. container:: example-rule + + alert tcp-pkt [192.168.0.0/16,10.0.0.0/8,172.16.0.0/12] any -> any any (msg:"tcp-pkt, no content"; sid:201;) + +IP Only (contains negated address) +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. container:: example-rule + + alert tcp 192.168.0.0/16,10.0.0.0/8,172.16.0.0/12 any -> :example-rule-emphasis:`![192.168.0.0/16,10.0.0.0/8,172.16.0.0/12]` any (msg:"tcp, has negated IP address"; sid:304;) + +.. container:: example-rule + + alert tcp :example-rule-emphasis:`[10.0.0.0/8,!10.10.10.10]` any -> :example-rule-emphasis:`[10.0.0.0/8,!10.10.10.10]` any (msg:"tcp, has negated IP address"; sid:305;) + +Protocol Detection Only +^^^^^^^^^^^^^^^^^^^^^^^ + +.. container:: example-rule + + alert tcp any any -> any any (msg:"tcp, pd negated"; :example-rule-emphasis:`app-layer-protocol:!http;` sid:401;) + + +.. container:: example-rule + + alert tcp any any -> any any (msg:"tcp, pd positive"; :example-rule-emphasis:`app-layer-protocol:http;` sid:402;) + + +Packet-Stream +^^^^^^^^^^^^^ + +.. container:: example-rule + + alert tcp any any -> any any (msg:"tcp, anchored content"; :example-rule-emphasis:`content:"abc"; startswith;` sid:303;) + +.. container:: example-rule + + alert http any any -> any any (msg:"http, anchored content"; :example-rule-emphasis:`content:"abc"; startswith;` sid:603;) + + +Stream +^^^^^^ + +.. container:: example-rule + + alert :example-rule-emphasis:`tcp-stream` any any -> any any (msg:"tcp-stream, simple content"; :example-rule-emphasis:`content:"abc";` sid:102;) + +.. container:: example-rule + + alert :example-rule-emphasis:`http` any any -> any any (msg:"http, simple content"; :example-rule-emphasis:`content:"abc";` sid:602;) + +.. container:: example-rule + + alert tcp any any -> any any (msg:"byte_extract with dce"; byte_extract:4,0,var,dce; byte_test:4,>,var,4,little; sid:901;) + + +Application Layer Protocol +^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. container:: example-rule + + alert :example-rule-emphasis:`http` any any -> any any (msg:"http, no content"; sid:601;) + +Application Layer Protocol Transactions +^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ + +.. container:: example-rule + + alert tcp any any -> any any (msg:"http, pos event"; :example-rule-emphasis:`app-layer-event:http.file_name_too_long;` sid:501;) + +.. container:: example-rule + + alert http any any -> any any (msg:"Test"; flow:established,to_server; :example-rule-emphasis:`http.method; content:"GET"; http.uri; content:".exe";` endswith; :example-rule-emphasis:`http.host; content:!".google.com";` endswith; sid:1102;) + +.. container:: example-rule + + alert udp any any -> any any (msg:"DNS UDP Frame"; flow:to_server; :example-rule-emphasis:`frame:dns.pdu;` content:"\|01 20 00 01\|"; offset:2; content:"suricata"; offset:13; sid:1402; rev:1;) diff --git a/doc/userguide/rules/intro/OverallAlgoHorizontal-v1-20241108.png b/doc/userguide/rules/intro/OverallAlgoHorizontal-v1-20241108.png new file mode 100644 index 0000000000000000000000000000000000000000..40ee2bf2188ff9e83a90f726d4e969ade5734a1b GIT binary patch literal 68631 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

jVCxKyMOU8v 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 WdLnhlRe}os(Nxt{c}chu{C@xhOMb%u literal 0 HcmV?d00001 diff --git a/src/detect-engine.c b/src/detect-engine.c index 77c25a1cf3a9..16241b4be777 100644 --- a/src/detect-engine.c +++ b/src/detect-engine.c @@ -110,6 +110,7 @@ static DetectEnginePktInspectionEngine *g_pkt_inspect_engines = NULL; static DetectEngineFrameInspectionEngine *g_frame_inspect_engines = NULL; // clang-format off +// rule types documentation tag start: SignatureProperties const struct SignatureProperties signature_properties[SIG_TYPE_MAX] = { /* SIG_TYPE_NOT_SET */ { SIG_PROP_FLOW_ACTION_PACKET, }, /* SIG_TYPE_IPONLY */ { SIG_PROP_FLOW_ACTION_FLOW, }, @@ -122,6 +123,7 @@ const struct SignatureProperties signature_properties[SIG_TYPE_MAX] = { /* SIG_TYPE_APPLAYER */ { SIG_PROP_FLOW_ACTION_FLOW, }, /* SIG_TYPE_APP_TX */ { SIG_PROP_FLOW_ACTION_FLOW, }, }; +// rule types documentation tag end: SignatureProperties // clang-format on /** \brief register inspect engine at start up time diff --git a/src/detect.h b/src/detect.h index fe755b7f0d14..1b6676480232 100644 --- a/src/detect.h +++ b/src/detect.h @@ -59,6 +59,7 @@ struct SCSigSignatureWrapper_; /* Forward declarations for structures from Rust. */ typedef struct SCDetectRequiresStatus SCDetectRequiresStatus; +// rule types documentation tag start: SignatureType enum SignatureType { SIG_TYPE_NOT_SET = 0, SIG_TYPE_IPONLY, // rule is handled by IPONLY engine @@ -76,6 +77,7 @@ enum SignatureType { SIG_TYPE_MAX, }; +// rule types documentation tag end: SignatureType enum SignaturePropertyFlowAction { SIG_PROP_FLOW_ACTION_PACKET,