Skip to content
Please update to the latest release 0.77.3 to address Multiple CVEs.
Server.Enrichment.IsMalicious

Server.Enrichment.IsMalicious

Look up one IP address, domain, URL or MD5/SHA-1/SHA-256 hash with IsMalicious. Runs on the server and retains the raw reputation report, evidence verdict, risk score, confidence and provenance where available. This is enrichment only: it does not block devices or apply a clean verdict when an indicator is unknown. A false malicious flag does not prove safety.

Before running, create a managed secret of type HTTP Secrets named ismalicious (or set SecretName). Configure its URL as https://api.ismalicious.com/check, method GET, and extra_headers as:

{"Authorization":"Basic <Base64(apiKey:apiSecret)>",
 "Accept":"application/json"}

Create your own account/key pair at https://ismalicious.com/app/account. Grant secret access only to the server analyst who runs this artifact. Keep TLS verification enabled. The credential remains in the secret store and is not an artifact parameter. IsMalicious accepts HTTP Basic with the key/secret pair; the API key component alone is insufficient.

Run from a server notebook, for example:

SELECT * FROM Artifact.Server.Enrichment.IsMalicious(
  Indicator="192.0.2.1")

Replace the documentation IP with an IOC from your investigation. To enrich hunt results, deduplicate first and pace requests according to your account:

SELECT * FROM foreach(
  row={SELECT Indicator FROM source() GROUP BY Indicator},
  query={SELECT * FROM Artifact.Server.Enrichment.IsMalicious(
    Indicator=Indicator) WHERE sleep(time=1)})

Each indicator consumes one API lookup. No automatic retries are made. HTTP errors are returned as Error/HTTPStatus, rather than clean reports. Missing secrets and transport failures also generate collection diagnostics. Set a collection timeout suitable for your notebook or batch. The native HTTP client handles redirects and transport; Basic authentication is used to avoid forwarding a custom API-key header to an unrelated redirect host.

Interpret evidence.verdict and reasons/contradictions in Report. Unknown hashes stay unknown even with a risk score of zero. Risk score and confidence are separate; contextual source rows are not a count of threat detections. Standard enrichment is requested. This artifact does not consume or redistribute TAXII feeds. API reference: https://ismalicious.com/api-docs.


name: Server.Enrichment.IsMalicious
author: Jean-Vincent, IsMalicious
description: |
  Look up one IP address, domain, URL or MD5/SHA-1/SHA-256 hash with
  IsMalicious. Runs on the server and retains the raw reputation report,
  evidence verdict, risk score, confidence and provenance where available.
  This is enrichment only: it does not block devices or apply a clean verdict
  when an indicator is unknown. A false malicious flag does not prove safety.

  Before running, create a managed secret of type HTTP Secrets named
  `ismalicious` (or set SecretName). Configure its URL as
  https://api.ismalicious.com/check, method GET, and extra_headers as:

      {"Authorization":"Basic <Base64(apiKey:apiSecret)>",
       "Accept":"application/json"}

  Create your own account/key pair at https://ismalicious.com/app/account.
  Grant secret access only to the server analyst who runs this artifact.
  Keep TLS verification enabled. The credential remains in the secret store
  and is not an artifact parameter. IsMalicious accepts HTTP Basic with the
  key/secret pair; the API key component alone is insufficient.

  Run from a server notebook, for example:

      SELECT * FROM Artifact.Server.Enrichment.IsMalicious(
        Indicator="192.0.2.1")

  Replace the documentation IP with an IOC from your investigation. To enrich
  hunt results, deduplicate first and pace requests according to your account:

      SELECT * FROM foreach(
        row={SELECT Indicator FROM source() GROUP BY Indicator},
        query={SELECT * FROM Artifact.Server.Enrichment.IsMalicious(
          Indicator=Indicator) WHERE sleep(time=1)})

  Each indicator consumes one API lookup. No automatic retries are made.
  HTTP errors are returned as Error/HTTPStatus, rather than clean reports.
  Missing secrets and transport failures also generate collection diagnostics.
  Set a collection timeout suitable for your notebook or batch. The native
  HTTP client handles redirects and transport; Basic authentication is used
  to avoid forwarding a custom API-key header to an unrelated redirect host.

  Interpret evidence.verdict and reasons/contradictions in Report. Unknown
  hashes stay unknown even with a risk score of zero. Risk score and confidence
  are separate; contextual source rows are not a count of threat detections.
  Standard enrichment is requested. This artifact does not consume or
  redistribute TAXII feeds. API reference: https://ismalicious.com/api-docs.

type: SERVER

parameters:
  - name: Indicator
    type: string
    description: Indicator to look up. The API detects the type.
  - name: SecretName
    type: string
    default: ismalicious
    description: Name of the server-managed HTTP Secrets credential.

sources:
  - precondition: SELECT * FROM scope() WHERE Indicator =~ "\\S"
    query: |
      LET Result = SELECT Response AS HTTPStatus,
          if(condition=Response = 200,
             then=parse_json(data=Content)) AS Report
      FROM if(condition=Indicator =~ "\\S", then={
          SELECT * FROM http_client(
              url="https://api.ismalicious.com/check",
              secret=SecretName,
              method="GET",
              params=dict(query=Indicator, enrichment="standard"))
      })

      SELECT Indicator, HTTPStatus,
          if(condition=HTTPStatus != 200,
             then=format(format="IsMalicious returned HTTP %v; check authentication or quota.",
                         args=[HTTPStatus]),
             else=if(condition=Report.malicious = NULL,
                     then="IsMalicious returned an invalid JSON report.")) AS Error,
          Report.evidence.verdict AS Verdict,
          Report.riskScore.score AS RiskScore,
          Report.confidence AS Confidence,
          Report,
          url(scheme="https", host="ismalicious.com", path="/report",
              query=dict(query=Indicator)).String AS ReportURL
      FROM Result