Cisco Secure Malware Analytics

Secure Malware Analytics (formerly Threat Grid) combines advanced sandboxing with threat intelligence into one unified solution to protect organizations from malware.

Data Enrichment & Threat Intelligence · Cisco Secure Malware Analytics · Feed

Details

IDCisco Secure Malware Analytics
ProviderCisco Systems
CategoryData Enrichment & Threat Intelligence
From Version5.5.0
Docker Imagedemisto/python3:3.12.13.10116658
Supported ModulesAgentix XSIAM EDR Cortex Cloud Cloud Runtime Security

README

Secure Malware Analytics (formerly Threat Grid) combines advanced sandboxing with threat intelligence into one unified solution to protect organizations from malware.

Configure Cisco Secure Malware Analytics in Cortex

Parameter Description Required
API Key The Cisco Secure Malware Analytics API key. True
Feed Name The feed name to fetch. True
First fetch The date or number of days from when to start fetching indicators. False
Fetch indicators Whether to fetch indicators. False
Indicator Reputation Indicators from this integration instance will be marked with this reputation. False
Traffic Light Protocol Color The Traffic Light Protocol (TLP) designation to apply to indicators fetched from the feed. False
Tags Supports CSV values. False
Source Reliability Reliability of the source providing the intelligence data. True
Feed Fetch Interval The feed fetch interval. False
Bypass exclusion list When selected, the exclusion list is ignored for indicators from this feed. This means that if an indicator from this feed is on the exclusion list, the indicator might still be added to the system. False
Use system proxy settings Whether to use the system proxy settings. False
Trust any certificate Whether to trust any certificate (not secure). False

Commands

You can execute these commands from the CLI, as part of an automation, or in a playbook.
After you successfully execute a command, a DBot message appears in the War Room with the command details.

cisco-sma-get-indicators


Retrieves indicators.

Base Command

cisco-sma-get-indicators

Input

Argument Name Description Required
limit The maximum number of indicators to retrieve. Optional

Context Output

Path Type Description
CiscoSMA.value String The indicator value.
CiscoSMA.type Unknown The indicator type.
CiscoSMA.Tags String Tags that are associated with the indicator.
CiscoSMA.Description String The feed description.
CiscoSMA.FeedRelatedIndicators.type String The type of the indicators that are associated with the domain.
CiscoSMA.FeedRelatedIndicators.value String Indicators that are associated with the domain.

Command Example

!cisco-sma-get-indicators limit=1

Context Example

{
    "CiscoSMA": {
        "fields": {
            "Description": "DNS response information from requests made by document samples performing network communications.",
            "FirstSeenBySource": "2021-04-13T12:47:34Z",
            "Tags": [
                "doc-net-com-dns"
            ],
            "reportedby": "CiscoSMA",
            "trafficlightprotocol": "GREEN"
        },
        "rawJSON": {
            "description": "DNS response information from requests made by document samples performing network communications.",
            "domain": "example.com",
            "info": "example.com/feeds/doc-net-com-dns/domain",
            "ips": [
                "0.0.0.0"
            ],
            "sample": "example",
            "sample_md5": "1234556",
            "sample_sha1": "1234556",
            "sample_sha256": "1234556",
            "timestamp": "2021-04-13T12:47:34Z"
        },
        "type": "IP",
        "value": "0.0.0.0"
    }
}

Human Readable Output

CiscoSMA Indicators

value type
o.o.o.o IP

cisco-sma-reset-fetch-indicators


WARNING: This command will reset your fetch history.

Base Command

cisco-sma-reset-fetch-indicators

Input

There are no input arguments for this command.

Context Output

There is no context output for this command.

Command Example

!cisco-sma-reset-fetch-indicators

Human Readable Output

Fetch history deleted successfully

Configuration parameters

  • base_url — URL
  • api_key — API Key (Leave empty. Fill in the API Key in the password field.)
  • feed_name — Feed Name (required)
  • first_fetch — First fetch
  • feed — Fetch indicators
  • feedReputation — Indicator Reputation
  • tlp_color — Traffic Light Protocol Color
  • feedTags — Tags
  • feedReliability — Source Reliability (required)
  • feedExpirationPolicy
  • feedExpirationInterval
  • feedFetchInterval — Feed Fetch Interval
  • feedBypassExclusionList — Bypass exclusion list
  • proxy — Use system proxy settings
  • insecure — Trust any certificate (not secure)
  • create_relationships — Create Relationships

Commands (2)

  • cisco-sma-get-indicators

    Retrieves indicators.

  • cisco-sma-reset-fetch-indicators

    WARNING: This command will reset your fetch history.

from CommonServerPython import *
from FeedCiscoSecureMalwareAnalytics import Client, create_entity_relationships, fetch_indicators, fetch_indicators_command
from test_data.feed_data import banking_dns_response, sinkholed_ip_dns_response


def test_fetch_indicators(requests_mock):
    """Unit test
    Given
    - fetch incidents command
    - feed name
    - command raw response
    When
    - run the fetch indicators command.
    Then
    - Validate creates indicators and unifies if they are the same
    """
    first_fetch = arg_to_datetime(arg="today", arg_name="First fetch")
    client = Client(
        api_key="1234",
        verify=False,
        proxy=False,
        feed_name=["sinkholed-ip-dns"],
        first_fetch=first_fetch,
        tlp_color="",
        feed_tags="",
        create_relationships=True,
    )
    requests_mock.get(
        f"https://panacea.threatgrid.com/api/v3/feeds/sinkholed-ip-dns.json?api_key={client._api_key}",
        json=sinkholed_ip_dns_response,
    )
    indicators, status = fetch_indicators(client, None)
    assert len(indicators) == 15


def test_fetch_indicators_command_list(requests_mock, mocker):
    """Unit test
    Given
    - fetch incidents command
    - list of feed names
    - command raw response
    When
    - run the fetch indicators command with 2 feed names.
    Then
    - Validate creates indicators and unifies if they are the same
    _ Validate that the fields: 'FeedRelatedIndicators' and 'tags' have been updated properly
    """
    first_fetch = arg_to_datetime(arg="today", arg_name="First fetch")
    client = Client(
        api_key="1234",
        verify=False,
        proxy=False,
        feed_name=["sinkholed-ip-dns", "banking-dns"],
        first_fetch=first_fetch,
        tlp_color="",
        feed_tags="",
        create_relationships=True,
    )
    requests_mock.get(
        f"https://panacea.threatgrid.com/api/v3/feeds/sinkholed-ip-dns.json?api_key={client._api_key}",
        json=sinkholed_ip_dns_response,
    )
    requests_mock.get(
        f"https://panacea.threatgrid.com/api/v3/feeds/banking-dns.json?api_key={client._api_key}",
        json=banking_dns_response,
    )

    a = mocker.patch.object(demisto, "createIndicators")
    fetch_indicators_command(client)

    fetch_indicators_command(client)
    for indicator in a.call_args.args[0]:
        if indicator["value"] == "Example1.com":
            assert len(indicator["fields"]["FeedRelatedIndicators"]) == 14
            assert len(indicator["relationships"]) == 14
            assert len(indicator["fields"]["Tags"]) == 2
        if indicator["value"] == "Example3.com":
            assert len(indicator["fields"]["FeedRelatedIndicators"]) == 4
            assert len(indicator["relationships"]) == 4
            assert len(indicator["fields"]["Tags"]) == 1
    assert len(a.call_args.args[0]) == 28


def test_create_entity_relationships():
    """

    Given
    - indicator domain name
    - related indicators

    When
    - run the fetch incidents command

    Then
    - Validate created relationships

    """
    domain_name = "test.com"
    relevant_indicators = [{"type": "IP", "value": "1.1.1.1"}]
    relationships = create_entity_relationships(relevant_indicators, domain_name)

    assert relationships[0].get("entityB") == "1.1.1.1"
    assert relationships[0].get("entityBType") == "IP"
    assert relationships[0].get("entityA") == "test.com"
    assert relationships[0].get("entityAType") == "Domain"


def test_get_indicators_success(requests_mock):
    """
    Given a Client instance, valid key and a timestamp value
    When get_indicators is called
    Then the expected indicators are returned
    """

    client = Client("api_key", False, False, "first_fetch", ["feed"], "", "", False)
    requests_mock.get("https://panacea.threatgrid.com/api/v3/feeds/feed.json", json={"indicators": ["1.1.1.1"]})
    indicators = client.get_indicators("feed", None)
    assert indicators == {"indicators": ["1.1.1.1"]}


def test_get_indicators_with_timestamp(requests_mock):
    """
    Given a Client instance and a timestamp value
    When get_indicators is called with the timestamp
    Then the expected indicators are returned
    """

    client = Client("api_key", False, False, "first_fetch", ["feed"], "", "", False)
    requests_mock.get("https://panacea.threatgrid.com/api/v3/feeds/feed_timestamp.json", json={"indicators": ["1.1.1.1"]})
    indicators = client.get_indicators("feed", "timestamp")
    assert indicators == {"indicators": ["1.1.1.1"]}