From 32a347d35e6dfce582339465acb196d01907b8fb Mon Sep 17 00:00:00 2001 From: Jean-Vincent QUILICHINI Date: Tue, 29 Sep 2026 17:24:22 +0200 Subject: [PATCH] fix: [ismalicious] count threat listings only, read categories per listing, add docs The /check response has no top-level `categories` for IPs, domains and URLs: each listing in `sources` carries its own `category`/`categories`, so the summary always fell back to `classification.primary`. Categories are now collected from the listings. Listings also carry a `threatClass`. Only `threat` (the default when absent) says an indicator was seen doing something malicious; `infrastructure` (cloud and CDN ranges, Tor exits, DoH resolvers), `policy` and `allowlist` listings describe what it is. They no longer feed the categories or the source count, so a cloud egress IP is not reported as "sources=1". Also: - do not follow redirects (requests would resend X-API-KEY to the new location) and say so when api_url answers with one; - explicit messages for 401 (rejected key) and 429 (rate limit/quota); - User-Agent `ismalicious-misp/`; - module listed in README.md and the generated documentation, with logo. Co-Authored-By: Claude Opus 5.5 --- README.md | 1 + documentation/README.md | 29 ++++++ documentation/logos/ismalicious.png | Bin 0 -> 81598 bytes documentation/mkdocs/expansion.md | 29 ++++++ documentation/mkdocs/index.md | 1 + misp_modules/modules/expansion/ismalicious.py | 62 ++++++++++--- tests/test_ismalicious.py | 83 ++++++++++++++++-- 7 files changed, 187 insertions(+), 18 deletions(-) create mode 100644 documentation/logos/ismalicious.png diff --git a/README.md b/README.md index 98ea0697..21a6f02f 100644 --- a/README.md +++ b/README.md @@ -94,6 +94,7 @@ For further Information see the [license file](https://misp.github.io/misp-modul * [IPInfo.io Lookup](https://misp.github.io/misp-modules/expansion/#ipinfo.io-lookup) - An expansion module to query ipinfo.io to gather more information on a given IP address. * [IPQualityScore Lookup](https://misp.github.io/misp-modules/expansion/#ipqualityscore-lookup) - IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain,Malicious URL Scanner,Malicious File Scanner & Compromised username, Password, Email * [IPRep Lookup](https://misp.github.io/misp-modules/expansion/#iprep-lookup) - Module to query IPRep data for IP addresses. +* [isMalicious Lookup](https://misp.github.io/misp-modules/expansion/#ismalicious-lookup) - Query isMalicious for IP, domain, hostname, and URL reputation. * [Ninja Template Rendering](https://misp.github.io/misp-modules/expansion/#ninja-template-rendering) - Render the template with the data passed * [Joe Sandbox Import](https://misp.github.io/misp-modules/expansion/#joe-sandbox-import) - Query Joe Sandbox API with a submission url to get the json report and extract its data that is parsed and converted into MISP attributes and objects. * [Joe Sandbox Submit](https://misp.github.io/misp-modules/expansion/#joe-sandbox-submit) - A module to submit files or URLs to Joe Sandbox for an advanced analysis, and return the link of the submission. diff --git a/documentation/README.md b/documentation/README.md index 98fa674a..a4c3b2d1 100644 --- a/documentation/README.md +++ b/documentation/README.md @@ -1456,6 +1456,35 @@ Module to query IPRep data for IP addresses. ----- +#### [isMalicious Lookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ismalicious.py) + + + +Query isMalicious for IP, domain, hostname, and URL reputation. +[[source code](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ismalicious.py)] + +- **features**: +>The module takes an IP, domain, hostname or URL attribute (the domain side of a domain|ip) and queries GET /check on the isMalicious API. It returns a text summary with the malicious flag, risk score, categories and source count. Only threat listings are counted: listings that describe what an indicator is (cloud and CDN ranges, Tor exits, DoH resolvers, ad lists, allowlists) are left out of the categories and of the source count. Hover and expansion share the same handler. The queried indicator is sent over TLS; nothing else leaves the MISP instance besides the configured API key. + +- **config**: +> - api_key +> - api_url + +- **input**: +>An IP address, domain, hostname or URL. + +- **output**: +>Text attributes with the isMalicious reputation summary. + +- **references**: +> - https://ismalicious.com/integrations/misp +> - https://ismalicious.com/api-docs + +- **requirements**: +>An isMalicious API key (free accounts are available): the X-API-KEY value, Base64 of apiKey:apiSecret, shown under API credentials on the isMalicious account page. + +----- + #### [Ninja Template Rendering](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/jinja_template_rendering.py) Render the template with the data passed diff --git a/documentation/logos/ismalicious.png b/documentation/logos/ismalicious.png new file mode 100644 index 0000000000000000000000000000000000000000..7d7995fb5637ba1404b1b3a1c63ba10276b5f388 GIT binary patch literal 81598 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%0D^VokUVo}}i{B^a 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�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 b>x^ZPF&9p#CS@=n;E&-Y(~A|zn^FGS literal 0 HcmV?d00001 diff --git a/documentation/mkdocs/expansion.md b/documentation/mkdocs/expansion.md index 4314af87..38530e35 100644 --- a/documentation/mkdocs/expansion.md +++ b/documentation/mkdocs/expansion.md @@ -1452,6 +1452,35 @@ Module to query IPRep data for IP addresses. ----- +#### [isMalicious Lookup](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ismalicious.py) + + + +Query isMalicious for IP, domain, hostname, and URL reputation. +[[source code](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/ismalicious.py)] + +- **features**: +>The module takes an IP, domain, hostname or URL attribute (the domain side of a domain|ip) and queries GET /check on the isMalicious API. It returns a text summary with the malicious flag, risk score, categories and source count. Only threat listings are counted: listings that describe what an indicator is (cloud and CDN ranges, Tor exits, DoH resolvers, ad lists, allowlists) are left out of the categories and of the source count. Hover and expansion share the same handler. The queried indicator is sent over TLS; nothing else leaves the MISP instance besides the configured API key. + +- **config**: +> - api_key +> - api_url + +- **input**: +>An IP address, domain, hostname or URL. + +- **output**: +>Text attributes with the isMalicious reputation summary. + +- **references**: +> - https://ismalicious.com/integrations/misp +> - https://ismalicious.com/api-docs + +- **requirements**: +>An isMalicious API key (free accounts are available): the X-API-KEY value, Base64 of apiKey:apiSecret, shown under API credentials on the isMalicious account page. + +----- + #### [Ninja Template Rendering](https://github.com/MISP/misp-modules/tree/main/misp_modules/modules/expansion/jinja_template_rendering.py) Render the template with the data passed diff --git a/documentation/mkdocs/index.md b/documentation/mkdocs/index.md index 23e94dc6..b79bc2f1 100644 --- a/documentation/mkdocs/index.md +++ b/documentation/mkdocs/index.md @@ -64,6 +64,7 @@ For more information: [Extending MISP with Python modules](https://www.misp-proj * [IPInfo.io Lookup](https://misp.github.io/misp-modules/expansion/#ipinfo.io-lookup) - An expansion module to query ipinfo.io to gather more information on a given IP address. * [IPQualityScore Lookup](https://misp.github.io/misp-modules/expansion/#ipqualityscore-lookup) - IPQualityScore MISP Expansion Module for IP reputation, Email Validation, Phone Number Validation, Malicious Domain and Malicious URL Scanner. * [IPRep Lookup](https://misp.github.io/misp-modules/expansion/#iprep-lookup) - Module to query IPRep data for IP addresses. +* [isMalicious Lookup](https://misp.github.io/misp-modules/expansion/#ismalicious-lookup) - Query isMalicious for IP, domain, hostname, and URL reputation. * [Ninja Template Rendering](https://misp.github.io/misp-modules/expansion/#ninja-template-rendering) - Render the template with the data passed * [Joe Sandbox Import](https://misp.github.io/misp-modules/expansion/#joe-sandbox-import) - Query Joe Sandbox API with a submission url to get the json report and extract its data that is parsed and converted into MISP attributes and objects. * [Joe Sandbox Submit](https://misp.github.io/misp-modules/expansion/#joe-sandbox-submit) - A module to submit files or URLs to Joe Sandbox for an advanced analysis, and return the link of the submission. diff --git a/misp_modules/modules/expansion/ismalicious.py b/misp_modules/modules/expansion/ismalicious.py index 2a55410b..f6a44ae3 100644 --- a/misp_modules/modules/expansion/ismalicious.py +++ b/misp_modules/modules/expansion/ismalicious.py @@ -12,26 +12,33 @@ "format": "misp_standard", } moduleinfo = { - "version": "1.0", + "version": "1.1", "author": "isMalicious", "description": "Query isMalicious for IP, domain, hostname, and URL reputation.", "module-type": ["expansion", "hover"], "name": "isMalicious Lookup", - "logo": "", - "requirements": ["An isMalicious API key."], + "logo": "ismalicious.png", + "requirements": [ + "An isMalicious API key (free accounts are available): the X-API-KEY value, Base64 of apiKey:apiSecret," + " shown under API credentials on the isMalicious account page." + ], "features": ( - "The module takes an IP, domain, hostname or URL attribute and queries GET /check on the isMalicious API." - " It returns a text summary with the malicious flag, risk score, categories and source count. Hover and" - " expansion share the same handler. The queried indicator is sent over TLS; nothing else leaves the MISP" - " instance besides the configured API key." + "The module takes an IP, domain, hostname or URL attribute (the domain side of a domain|ip) and queries" + " GET /check on the isMalicious API. It returns a text summary with the malicious flag, risk score," + " categories and source count. Only threat listings are counted: listings that describe what an indicator" + " is (cloud and CDN ranges, Tor exits, DoH resolvers, ad lists, allowlists) are left out of the categories" + " and of the source count. Hover and expansion share the same handler. The queried indicator is sent over" + " TLS; nothing else leaves the MISP instance besides the configured API key." ), - "references": ["https://ismalicious.com/integrations/misp"], + "references": ["https://ismalicious.com/integrations/misp", "https://ismalicious.com/api-docs"], "input": "An IP address, domain, hostname or URL.", "output": "Text attributes with the isMalicious reputation summary.", } moduleconfig = ["api_key", "api_url"] DEFAULT_API_URL = "https://api.ismalicious.com" +# Identifies the module (and its version) to the API instead of a generic client string. +USER_AGENT = f"ismalicious-misp/{moduleinfo['version']} (+https://ismalicious.com)" def _query_from_attribute(attribute): @@ -51,8 +58,32 @@ def _risk_score(payload): return None +def _is_threat_source(source): + # Each listing in `sources` may carry a threatClass: "threat" (the default when absent), + # "infrastructure" (cloud ranges, Tor exits, DoH resolvers), "policy" (ads, tracking) or + # "allowlist". Only threat listings say that an indicator was seen doing something malicious. + if not isinstance(source, dict): + return True + return source.get("threatClass") in (None, "", "threat") + + +def _threat_sources(payload): + sources = payload.get("sources") or [] + if not isinstance(sources, list): + return [] + return [source for source in sources if _is_threat_source(source)] + + def _categories(payload): - categories = payload.get("categories") + # The /check response has no top-level categories for IPs, domains and URLs: they are carried by + # each listing. Fall back to the primary classification when no threat listing names one. + categories = [] + for source in _threat_sources(payload): + if not isinstance(source, dict): + continue + for value in [source.get("category"), *(source.get("categories") or [])]: + if value and value not in categories: + categories.append(value) if categories: return categories classification = payload.get("classification") or {} @@ -60,8 +91,7 @@ def _categories(payload): def _source_count(payload): - sources = payload.get("sources") or [] - return len(sources) if isinstance(sources, list) else sources + return len(_threat_sources(payload)) class IsMaliciousParser: @@ -114,16 +144,24 @@ def handler(q=False): api_url = str(config.get("api_url") or DEFAULT_API_URL).rstrip("/") try: + # Redirects are not followed: requests would resend the X-API-KEY header to the new location. response = requests.get( f"{api_url}/check", params={"query": query, "enrichment": "standard"}, - headers={"User-Agent": "misp-modules", "X-API-KEY": api_key, "Accept": "application/json"}, + headers={"User-Agent": USER_AGENT, "X-API-KEY": api_key, "Accept": "application/json"}, timeout=30, + allow_redirects=False, ) + if 300 <= response.status_code < 400: + return {"error": "isMalicious API answered with a redirect; check that api_url is the HTTPS API URL."} response.raise_for_status() payload = response.json() except requests.exceptions.HTTPError as http_error: status = http_error.response.status_code if http_error.response is not None else "unknown" + if status == 401: + return {"error": "isMalicious API rejected the API key (HTTP 401)."} + if status == 429: + return {"error": "isMalicious API rate limit or quota exceeded (HTTP 429)."} return {"error": f"isMalicious API returned HTTP status {status}."} except requests.exceptions.RequestException as request_error: return {"error": f"isMalicious API request failed: {request_error}."} diff --git a/tests/test_ismalicious.py b/tests/test_ismalicious.py index b6372090..e1f158fb 100644 --- a/tests/test_ismalicious.py +++ b/tests/test_ismalicious.py @@ -5,9 +5,18 @@ HIT_PAYLOAD = { "malicious": True, - "riskScore": {"score": 91}, - "categories": ["c2"], - "sources": [{"name": "feed-a"}, {"name": "feed-b"}], + "riskScore": {"score": 91, "level": "critical"}, + "sources": [ + {"name": "feed-a", "category": "c2"}, + {"name": "feed-b", "category": "botnet", "threatClass": "threat"}, + {"name": "feed-c", "category": "c2"}, + ], +} + +EXPECTED_HEADERS = { + "User-Agent": ismalicious.USER_AGENT, + "X-API-KEY": "k", + "Accept": "application/json", } @@ -31,6 +40,12 @@ def _query(value="1.2.3.4", type_="ip-src", config=None): return {"module": "ismalicious", "attribute": attribute, "config": config} +def _summary(payload): + with patch.object(ismalicious.requests, "get", return_value=MockResponse(payload)): + result = ismalicious.handler(json.dumps(_query())) + return [attribute["value"] for attribute in result["results"]["Attribute"]] + + def test_ismalicious_returns_summary_attribute(): with patch.object(ismalicious.requests, "get", return_value=MockResponse(HIT_PAYLOAD)) as mocked_get: result = ismalicious.handler(json.dumps(_query())) @@ -38,14 +53,40 @@ def test_ismalicious_returns_summary_attribute(): mocked_get.assert_called_once_with( "https://api.ismalicious.com/check", params={"query": "1.2.3.4", "enrichment": "standard"}, - headers={"User-Agent": "misp-modules", "X-API-KEY": "k", "Accept": "application/json"}, + headers=EXPECTED_HEADERS, timeout=30, + allow_redirects=False, ) values = [attribute["value"] for attribute in result["results"]["Attribute"]] - assert values == ["malicious=True score=91 categories=['c2'] sources=2"] + assert values == ["malicious=True score=91 categories=['c2', 'botnet'] sources=3"] assert result["results"]["Attribute"][0]["comment"] == "isMalicious reputation summary" +def test_ismalicious_counts_threat_listings_only(): + payload = { + "malicious": True, + "riskScore": {"score": 70}, + "sources": [ + {"name": "honeypot", "category": "attack"}, + {"name": "azure-ip-ranges", "category": "infrastructure", "threatClass": "infrastructure"}, + {"name": "ad hosts", "category": "ads", "threatClass": "policy"}, + {"name": "known good", "category": "allowlist", "threatClass": "allowlist"}, + {"name": "feed-b", "categories": ["botnet", "attack"], "threatClass": "threat"}, + ], + } + assert _summary(payload) == ["malicious=True score=70 categories=['attack', 'botnet'] sources=2"] + + +def test_ismalicious_falls_back_to_primary_classification(): + payload = { + "malicious": False, + "riskScore": {"score": 12}, + "classification": {"primary": "unknown"}, + "sources": [{"name": "azure-ip-ranges", "category": "infrastructure", "threatClass": "infrastructure"}], + } + assert _summary(payload) == ["malicious=False score=12 categories=unknown sources=0"] + + def test_ismalicious_uses_domain_side_of_composite_and_custom_api_url(): query = _query( value="evil.example|1.2.3.4", @@ -58,11 +99,16 @@ def test_ismalicious_uses_domain_side_of_composite_and_custom_api_url(): mocked_get.assert_called_once_with( "https://example.test/check", params={"query": "evil.example", "enrichment": "standard"}, - headers={"User-Agent": "misp-modules", "X-API-KEY": "k", "Accept": "application/json"}, + headers=EXPECTED_HEADERS, timeout=30, + allow_redirects=False, ) +def test_ismalicious_user_agent_names_the_module_version(): + assert ismalicious.USER_AGENT == f"ismalicious-misp/{ismalicious.version()['version']} (+https://ismalicious.com)" + + def test_ismalicious_missing_api_key(): with patch.object(ismalicious.requests, "get") as mocked_get: result = ismalicious.handler(json.dumps(_query(config={}))) @@ -79,6 +125,30 @@ def test_ismalicious_reports_http_error(): assert result == {"error": "isMalicious API returned HTTP status 500."} +def test_ismalicious_reports_rejected_key_and_quota(): + with patch.object(ismalicious.requests, "get", return_value=MockResponse({"error": "Unauthorized"}, 401)): + assert ismalicious.handler(json.dumps(_query())) == { + "error": "isMalicious API rejected the API key (HTTP 401)." + } + with patch.object(ismalicious.requests, "get", return_value=MockResponse({"error": "Too Many Requests"}, 429)): + assert ismalicious.handler(json.dumps(_query())) == { + "error": "isMalicious API rate limit or quota exceeded (HTTP 429)." + } + + +def test_ismalicious_does_not_follow_redirects(): + with patch.object(ismalicious.requests, "get", return_value=MockResponse(None, 301)): + result = ismalicious.handler(json.dumps(_query(config={"api_key": "k", "api_url": "http://example.test"}))) + assert "redirect" in result["error"] + + +def test_ismalicious_reports_transport_failure(): + error = ismalicious.requests.exceptions.ConnectionError("refused") + with patch.object(ismalicious.requests, "get", side_effect=error): + result = ismalicious.handler(json.dumps(_query())) + assert result["error"].startswith("isMalicious API request failed") + + def test_ismalicious_rejects_invalid_input(): assert ismalicious.handler(json.dumps({"module": "ismalicious"}))["error"].startswith( 'This module requires an "attribute" field' @@ -90,6 +160,7 @@ def test_ismalicious_introspection_and_version(): assert ismalicious.introspection() == ismalicious.mispattributes info = ismalicious.version() assert info["name"] == "isMalicious Lookup" + assert info["logo"] == "ismalicious.png" assert "api_key" in info["config"] assert "expansion" in info["module-type"] assert "hover" in info["module-type"]