From 37977f4e01654c2a0425e2d87bc43e0f43286b61 Mon Sep 17 00:00:00 2001 From: ecrou-exact Date: Wed, 7 Oct 2026 10:00:13 +0200 Subject: [PATCH] add: [rulezet] Rulezet rule validator expansion module Validate the syntax of detection rules through the public Rulezet API (/api/rule/public/validate) and return the result as a rule-validation MISP object referencing the validated attribute or object (validates). Supported inputs: yara, sigma, snort, zeek, bro and kusto-query attributes, and the rule objects exported by Rulezet (yara, sigma, suricata, zeek, nse, nse-script, nova-rule, wazuh-rule, kunai-rule, owasp-crs-rule, splunk-rule, elastic-detection-rule, kql-analytics-rule, atr, plum, sagan, rulezet-metadata). --- documentation/logos/rulezet.png | Bin 0 -> 92842 bytes .../modules/expansion/rulezet_validator.py | 185 ++++++++++++++++++ tests/test_expansions.py | 19 ++ 3 files changed, 204 insertions(+) create mode 100644 documentation/logos/rulezet.png create mode 100644 misp_modules/modules/expansion/rulezet_validator.py diff --git a/documentation/logos/rulezet.png b/documentation/logos/rulezet.png new file mode 100644 index 0000000000000000000000000000000000000000..f14ecf48a26808067aa8349eae511b8839c16cfb GIT binary patch literal 92842 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 Rulezet format +ATTRIBUTE_FORMATS = { + "yara": "yara", + "sigma": "sigma", + "snort": "suricata", + "zeek": "zeek", + "bro": "zeek", + "kusto-query": "kql", +} + +# MISP object name -> (object relation holding the rule, Rulezet format), following the +# objects Rulezet itself exports. A None format means it is read from the "format" relation. +OBJECT_FORMATS = { + "yara": ("yara", "yara"), + "sigma": ("sigma", "sigma"), + "suricata": ("suricata", "suricata"), + "zeek": ("zeek", "zeek"), + "nse": ("nse", "nse"), + "nse-script": ("nse", "nse"), + "nova-rule": ("raw-rule", "nova"), + "wazuh-rule": ("wazuh-rule", "wazuh"), + "kunai-rule": ("kunai", "kunai"), + "owasp-crs-rule": ("raw-rule", "crs"), + "splunk-rule": ("spl", "splunk"), + "elastic-detection-rule": ("query", "elastic"), + "kql-analytics-rule": ("query", "kql"), + "atr": ("atr", "atr"), + "plum": ("plum", "plum"), + "sagan": ("sagan", "sagan"), + "rulezet-metadata": ("to-string", None), +} + +mispattributes = { + "input": list(dict.fromkeys(list(ATTRIBUTE_FORMATS) + list(OBJECT_FORMATS))), + "format": "misp_standard", +} +moduleinfo = { + "version": "0.1", + "author": "Theo Geffe", + "description": ( + "Validate the syntax of detection rules (YARA, Sigma, Suricata, Zeek, NOVA, Wazuh, Kunai, NSE, CRS," + " Splunk, Elastic, KQL, ATR, PLUM, Sagan) with the Rulezet API." + ), + "module-type": ["expansion", "hover"], + "name": "Rulezet Rule Validator", + "logo": "rulezet.png", + "requirements": ["Access to a Rulezet instance (https://rulezet.org by default)"], + "features": ( + "This module sends a rule, taken from an attribute (yara, sigma, snort, zeek, bro, kusto-query) or from an" + " object (yara, sigma, suricata, zeek, nse, nse-script, nova-rule, wazuh-rule, kunai-rule, owasp-crs-rule," + " splunk-rule, elastic-detection-rule, kql-analytics-rule, atr, plum, sagan, rulezet-metadata), to the" + " public validation endpoint of Rulezet (/api/rule/public/validate). Nothing is stored on Rulezet: it is" + " a dry run of the syntax check Rulezet performs on rule creation.\n\n" + "The result is returned as a `rule-validation` MISP object holding the format, the validity, and each" + " error and warning reported by the validator, referencing the validated attribute or object." + ), + "references": ["https://rulezet.org", "https://github.com/rulezet/rulezet-core"], + "input": ( + "A rule attribute (yara, sigma, snort, zeek, bro, kusto-query) or a rule object as exported by Rulezet" + " (yara, sigma, suricata, nova-rule, wazuh-rule, owasp-crs-rule, splunk-rule, rulezet-metadata...)." + ), + "output": "A rule-validation MISP object.", +} +moduleconfig = ["url"] + +DEFAULT_URL = "https://rulezet.org" +TIMEOUT = 30 + +# Not yet bundled with pymisp's misp-objects: without a template, MISP refuses the object +# (empty meta-category, no template_uuid). Must stay in sync with misp-objects. +RULE_VALIDATION_TEMPLATE = { + "name": "rule-validation", + "uuid": "55712239-ddd6-4235-9848-5f103ebde55b", + "version": 1, + "meta-category": "misc", + "description": "Result of the syntax validation of a detection rule (YARA, Sigma, Suricata, Zeek...).", + "required": ["format", "valid"], + "attributes": { + "error": {"description": "Syntax error reported by the validator", "misp-attribute": "text", "multiple": True}, + "format": {"description": "Format of the validated rule", "misp-attribute": "text"}, + "valid": {"description": "Whether the rule is syntactically valid", "misp-attribute": "boolean"}, + "validation-date": {"description": "Date of the validation", "misp-attribute": "datetime"}, + "validator": {"description": "Name of the validator used", "misp-attribute": "text"}, + "validator-url": {"description": "URL of the validator instance used", "misp-attribute": "link"}, + "warning": {"description": "Warning reported by the validator", "misp-attribute": "text", "multiple": True}, + }, +} + + +def _extract_rule(request): + """Return (rule content, Rulezet format, uuid of the source) or an error message.""" + attribute = request.get("attribute") + if attribute: + rule_format = ATTRIBUTE_FORMATS.get(attribute.get("type")) + if rule_format is None: + return f"Unsupported attribute type: {attribute.get('type')}" + return attribute.get("value"), rule_format, attribute.get("uuid") + + misp_object = request.get("object") + if misp_object: + if misp_object.get("name") not in OBJECT_FORMATS: + return f"Unsupported object: {misp_object.get('name')}" + relation, rule_format = OBJECT_FORMATS[misp_object["name"]] + values = { + attribute.get("object_relation"): attribute.get("value") + for attribute in misp_object.get("Attribute", []) + } + if not values.get(relation): + return f"No '{relation}' attribute in the {misp_object['name']} object" + if rule_format is None: + rule_format = (values.get("format") or "").lower() + if not rule_format: + return f"No 'format' attribute in the {misp_object['name']} object" + return values[relation], rule_format, misp_object.get("uuid") + + return "This module requires an attribute or an object as input" + + +def _build_object(result, base_url, source_uuid): + validation = MISPObject("rule-validation", misp_objects_template_custom=RULE_VALIDATION_TEMPLATE) + validation.add_attribute("format", type="text", value=result["format"]) + validation.add_attribute("valid", type="boolean", value="1" if result.get("valid") else "0") + for error in result.get("errors", []): + validation.add_attribute("error", type="text", value=error) + for warning in result.get("warnings", []): + validation.add_attribute("warning", type="text", value=warning) + validation.add_attribute("validator", type="text", value="Rulezet") + validation.add_attribute("validator-url", type="link", value=base_url) + validation.add_attribute( + "validation-date", type="datetime", value=datetime.now(timezone.utc).isoformat() + ) + if source_uuid: + validation.add_reference(source_uuid, "validates") + return validation + + +def handler(q=False): + if q is False: + return False + request = json.loads(q) + + extracted = _extract_rule(request) + if isinstance(extracted, str): + return {"error": extracted} + rule_content, rule_format, source_uuid = extracted + if not rule_content: + return {"error": "Rule content missing"} + + base_url = (request.get("config") or {}).get("url") or DEFAULT_URL + base_url = base_url.rstrip("/") + try: + response = requests.post( + f"{base_url}/api/rule/public/validate", + json={"format": rule_format, "content": rule_content}, + timeout=TIMEOUT, + ) + result = response.json() + except requests.RequestException as e: + return {"error": f"Unable to reach Rulezet: {e}"} + except ValueError: + return {"error": f"Invalid response from Rulezet (HTTP {response.status_code})"} + if "error" in result: + return {"error": f"Rulezet: {result['error']}"} + + event = MISPEvent() + event.add_object(_build_object(result, base_url, source_uuid)) + event = json.loads(event.to_json()) + return {"results": {"Object": event["Object"]}} + + +def introspection(): + return mispattributes + + +def version(): + moduleinfo["config"] = moduleconfig + return moduleinfo diff --git a/tests/test_expansions.py b/tests/test_expansions.py index c14819af..87246b46 100644 --- a/tests/test_expansions.py +++ b/tests/test_expansions.py @@ -572,6 +572,25 @@ def test_reversedns(self): response = self.misp_modules_post(query) self.assertEqual(self.get_values(response), "dns.google") + def test_rulezet_validator(self): + query = { + "module": "rulezet_validator", + "attribute": { + "type": "yara", + "uuid": "ea89a33b-4ab7-4515-9f02-922a0bee333d", + "value": "rule test { condition: tru }", + }, + } + response = self.misp_modules_post(query) + self.assertEqual(self.get_first_object_type(response), "rule-validation") + attributes = { + attribute["object_relation"]: attribute["value"] + for attribute in response.json()["results"]["Object"][0]["Attribute"] + } + self.assertEqual(attributes["format"], "yara") + self.assertEqual(attributes["valid"], "0") + self.assertIn("undefined identifier", attributes["error"]) + def test_securitytrails(self): module_name = "securitytrails" query_types = ("ip-src", "domain")