DarkmonLevenshtein

Computes the minimum Levenshtein edit distance between a domain's root label and a list of brand names. Used by Darkmon - Brand-Targeted NRD Watch to flag typosquatting candidates.

python · Darkmon

Details

IDDarkmonLevenshtein
Languagepython
From Version6.8.0
Docker Imagedemisto/python3:3.12.13.10116658
Tagsdarkmon transformer

README

Computes the minimum Levenshtein edit distance between a domain’s root label
and a list of brand names. Used by Darkmon - Brand-Targeted NRD Watch to
flag typosquatting candidates.

Script Data


Name Description
Script Type python3
Tags darkmon, transformer
Cortex XSOAR Version 6.5.0

Used In


This script is used in the following playbooks and scripts.

  • DarkmonScoreNRDs

Inputs


Argument Name Description
domain The domain to compare (only the root label is used).
brands Comma-separated brand names to compare against.

Outputs


Path Description Type
Darkmon.Levenshtein.domain The input domain (lowercased). String
Darkmon.Levenshtein.brand The brand with the smallest distance to the domain root. String
Darkmon.Levenshtein.distance The minimum Levenshtein distance found. Number
import DarkmonLevenshtein
import demistomock as demisto  # noqa: F401


def test_levenshtein_identical():
    """
    Given:
        - Two identical strings

    When:
        - levenshtein() is called

    Then:
        - Distance is 0
    """
    assert DarkmonLevenshtein.levenshtein("acme", "acme") == 0


def test_levenshtein_single_substitution():
    """
    Given:
        - Two strings differing by one character

    When:
        - levenshtein() is called

    Then:
        - Distance is 1
    """
    assert DarkmonLevenshtein.levenshtein("acme", "acne") == 1


def test_main_returns_closest_brand(mocker):
    """
    Given:
        - A domain and a list of brand names

    When:
        - main() is called

    Then:
        - return_results is called with the closest brand and its distance
    """
    mocker.patch.object(demisto, "args", return_value={"domain": "acmee.com", "brands": "acme,google"})
    mock_return = mocker.patch.object(DarkmonLevenshtein, "return_results")

    DarkmonLevenshtein.main()

    mock_return.assert_called_once()
    result = mock_return.call_args[0][0]
    assert result["Contents"]["brand"] == "acme"
    assert result["Contents"]["distance"] == 1