skip to content

A converted Sigma rule runs in your SIEM without error and matches nothing. Why?

level: middleimportance: must knowfreq 55%

answer

  1. silence is not evidence
  2. check the table before the logic
  3. a field can exist and mean something else
  4. add clauses back one at a time
  5. prove it with a known-true event

basics

~20 s

Usually the mapping, not the logic: the query was pointed at the wrong table, or a Sigma field was mapped onto a column that exists but carries something else - a bare file name where the rule expects a full path.

solid answer

~50 s

Start from the position that silence is not evidence: an unfiring rule is unproven, not reassuring. Work outward from the data rather than inward from the logic. Does the table the pipeline selected return any rows at all for that host and window? Then reduce the query to a single clause and add the others back one at a time - the clause that empties the result is almost always a field mapping. The failures that hurt are semantic, not syntactic: Sigma's `Image` is a full path while the target column may hold only a file name, so a `startswith` on a directory can never match; `ParentImage` may map to a column only one of your two sensors populates; case handling and wildcard escaping differ between the taxonomy and the backend operator. Finish by executing the behaviour on one instrumented host and confirming the rule fires. Until you have seen it fire on a known-true event, you do not know that it works.

go deeper

for a junior

Be ready to say why a detection that has never fired is not automatically good news, and to name the two obvious suspects: no data in that table, or the wrong field.

for a middle

Show the ladder - data present, record present, which clause empties it, then a deliberately generated true event. Interviewers want a method, not a guess.

for a senior

Demonstrate that you fix mapping in the pipeline rather than the generated query, and that you report a rule as validated or unvalidated rather than just deployed.

for a principal

Be able to say how the estate knows, in aggregate, which imported rules have ever fired on a real or generated event, and who is accountable when the answer is most of them have not.

### Why this is the characteristic failure of portable rules A rule that fails loudly gets fixed. A rule that converts cleanly, deploys cleanly and returns nothing looks exactly like a healthy detection over a quiet estate, and it can sit that way for a year. In a co-managed estate - a provider authoring detections in Sigma, the customer running the SIEM - it is the default outcome rather than an unlucky one, because neither party owns both ends of the mapping. ### The first discipline: silence proves nothing The absence of hits is compatible with at least four different worlds: the behaviour did not happen; it happened but the telemetry never arrived; it arrived in a table the query does not read; or it is in the table but in a column the query does not match. Only the first is good news, and it is the one you have the least evidence for. Treat a never-fired converted rule as unvalidated until you have made it fire deliberately. ### The diagnosis ladder, from the data upward **Is there data at all?** Query the table the pipeline chose, unfiltered, for one host and one hour. If it is empty, the problem is upstream of the rule - the logsource was resolved to the wrong table, or that data is not being collected from those hosts, or it lands somewhere else entirely. This is one query and it eliminates the largest class of causes. **Does the record you expect exist?** Find one raw event of the right kind by hand, without the rule. Look at the actual columns and the actual values. This is where most mapping bugs become visible in seconds. **Which clause kills it?** Take the generated query, strip it to its broadest single condition, confirm rows come back, then reintroduce clauses one at a time. The clause whose addition zeroes the result is your suspect. **Does the rule fire on a known-true event?** Execute the behaviour under controlled conditions on one instrumented host, in a window you have written down, and check each stage: the record arrived, the column holds what you expected, the query returns that record. A rule that will not fire on a deliberately produced true event is broken. This step is the only one that produces positive evidence, and it is the step people skip. ### The mapping failures that actually occur | Failure | What it looks like | | --- | --- | | Wrong table | Logsource resolved to a table that holds a different event class; query valid, always empty | | Name mapped, meaning not | Sigma `Image` is a full path; the target column holds only the leaf file name, so a path prefix match cannot succeed | | Column populated by a different sensor | The field exists in the schema but only rows from one agent carry it; hosts running the other agent are invisible | | Unparsed payload | The event arrives as a blob or nested structure and the columns the rule wants only exist after a parser or extraction step | | Case and escaping | The taxonomy defines case-insensitive matching; the backend operator chosen by the converter is case-sensitive, or a backslash or wildcard is escaped differently | | Value formatting | Paths, account names or hashes stored in a different form - short name versus domain-qualified, upper versus lower case hex | Notice that only the last two are properties of the conversion. The rest are properties of your environment, which is exactly why a rule can be simultaneously correct as published and useless as deployed. ### The fix goes in the pipeline, not the query It is tempting to edit the generated SPL or KQL until it matches, especially mid-incident, and as a stopgap that is fine. As the fix it is a trap: the edit lives in the SIEM, the next conversion of the same Sigma source will not contain it, and the two artefacts silently diverge. Push the correction into the processing pipeline instead - one mapping correction there fixes every rule that touches that field, which is the whole reason the pipeline exists as a separate thing from the rule. ### What you tell the person who asked Not "the rule is deployed". Either "the rule is deployed and I have seen it fire on a generated event", or "the rule is deployed and unvalidated, and here is what I still need to confirm". Those are different claims and only one of them is worth anything when someone asks whether you would have caught it.

  • How do you tell a mapping bug from a genuinely quiet estate?
    Generate the event yourself. Run the behaviour on one instrumented host in a window you have recorded, then walk it forward: did the raw record arrive in the table, does the column the rule reads hold what you expected, does the converted query return that record. Each stage that passes narrows the fault, and a rule that will not fire on a deliberate true event is broken rather than lucky.
  • Your provider authored the rule against one sensor's field names and your tenant collects another's. What breaks?
    The taxonomy lines up on paper and diverges in the values. Image and parent-process fields exist on both sides but differ in granularity - a full path versus a bare file name - and some columns are populated only on hosts running that specific sensor. The pipeline has to encode those differences. Map by name alone and you get a valid, permanently empty query.
  • Is it safe to hand-edit the converted query to fix a mapping problem?
    As a stopgap during an incident, yes. As the fix, no. The edit lives only in the target platform, and the next conversion of the same Sigma source will not reproduce it, so the two drift apart with nobody watching. Put the correction in the processing pipeline, where it repairs every rule using that field at once.

saying these in an interview costs you the question

  • Treats no alerts as proof nothing happened
  • Assumes a clean conversion means correct field mapping
  • Fixes mapping by editing the generated query permanently
  • Matches fields by name and ignores their semantics
  • Debugs the rule logic before checking the table has rows

context