From fb65316353e5ce718d2cd27e778f531655b242af Mon Sep 17 00:00:00 2001 From: Claude Date: Wed, 30 Sep 2026 11:47:59 +0000 Subject: [PATCH] Refresh reference data, add a threat-intel layer, triage-script builder and automation Reference data: - ATLAS 2026.09. The pin is now bucketed by object type (tactics, techniques, mitigations, case studies) and keeps no upstream free text. ATT&CK 19.2 groups and campaigns are pinned by id and name only. - OWASP LLM 2026 and Agentic 2026 lists in schema/owasp.json, with Appendix A's 2025 ids translated to 2026 ids. - CISA KEV status for every cited CVE (schema/cve-status.json), with a gate on KEV claims (cve_status.py). It corrected the Ray rule, which claimed CVE-2023-48022 is listed. - The id gate covers every surface. It remapped the retired AML.T0104 and AML.T0019, and fixed parser bugs that dropped MAPPINGS section 04 and atlas.aml-t tags and read ATT&CK ids as ATLAS. MAPPINGS gains an ASI column and generated index tables (sync_mappings.py). Threat intel: - 20 actor profiles (attributed groups and reporter-named clusters) and case studies AIRT-CS-0015 to -0022 from primary sources, including 131 indicators from Anthropic's September 2026 IOC release. Existing cases gain structured actor, victim and framework fields. - Closed schemas: case-study.schema.json, actor.schema.json and intel-vocab.json. - intel_graph.py derives the entity graph, per-actor hunt, detect and collect tables, coverage gaps, and analytics: IDF-weighted similarity, clustering, co-occurrence and a detection backlog. It exports intel.json, a STIX 2.1 bundle and Maltego CSVs, deterministically. - Two Sigma rules: AI CLIs started with their approval-bypass flag by a package manager (s1ngularity), and Claude Code settings or hooks writes. Site: - a cross-filtering Threat intel view with pivots, timeline, ATLAS matrix, victimology, heatmaps and similarity - a graph workbench (Cytoscape.js, vendored and hash-pinned, lazy-loaded) - a collection-plan triage-script generator (PowerShell or bash) that hashes rather than copies credentials, including ones swept up by a directory row, plus Velociraptor, KAPE and Python-collector commands - a wider, resizable drawer, and tabs that scroll instead of wrapping Automation: - framework-refresh.yml re-pins weekly and auto-merges only a diff confined to reference data (refresh_guard.py) - intel-watch.yml files intel-candidate issues from KEV, ATLAS, AVID, AIID (MIT risk domains), the OWASP ASI tracker, vendor feeds and GitHub advisories - forbidden_terms.py fails CI on terms held in a FORBIDDEN_TERMS secret, which are never committed or printed Docs: CLAUDE.md, CONTRIBUTING, the authoring skill, both READMEs, LICENSE-DATA (third-party facts policy) and the CHANGELOG. Co-Authored-By: Claude Opus 5.5 Claude-Session: https://claude.ai/code/session_01V2zNmjhpmRmMobbbDgSmSY --- .github/CODEOWNERS | 2 +- .github/ISSUE_TEMPLATE/config.yml | 4 +- .github/ISSUE_TEMPLATE/intel_candidate.yml | 57 + .github/workflows/artifacts.yml | 18 + .github/workflows/framework-refresh.yml | 127 + .github/workflows/intel-watch.yml | 40 + .github/workflows/pages.yml | 6 +- 02-mcp-attacks/README.md | 2 +- 02-mcp-attacks/mcp_tool_poisoning.yar | 8 +- 04-ai-infrastructure/ray_jobs_api_rce.rules | 7 +- CLAUDE.md | 125 +- CONTRIBUTING.md | 30 + MAPPINGS.md | 261 +- README.md | 57 +- artifacts/CHANGELOG.md | 44 + artifacts/LICENSE-DATA | 14 +- artifacts/README.md | 10 +- artifacts/case-studies/airt-cs-0001.yml | 3 + artifacts/case-studies/airt-cs-0002.yml | 9 +- artifacts/case-studies/airt-cs-0003.yml | 7 + artifacts/case-studies/airt-cs-0004.yml | 28 + artifacts/case-studies/airt-cs-0005.yml | 4 + artifacts/case-studies/airt-cs-0007.yml | 15 + artifacts/case-studies/airt-cs-0008.yml | 6 + artifacts/case-studies/airt-cs-0009.yml | 11 + artifacts/case-studies/airt-cs-0010.yml | 3 + artifacts/case-studies/airt-cs-0011.yml | 10 + artifacts/case-studies/airt-cs-0012.yml | 3 + artifacts/case-studies/airt-cs-0013.yml | 10 + artifacts/case-studies/airt-cs-0014.yml | 8 + artifacts/case-studies/airt-cs-0015.yml | 94 + artifacts/case-studies/airt-cs-0016.yml | 94 + artifacts/case-studies/airt-cs-0017.yml | 78 + artifacts/case-studies/airt-cs-0018.yml | 243 + artifacts/case-studies/airt-cs-0019.yml | 200 + artifacts/case-studies/airt-cs-0020.yml | 76 + artifacts/case-studies/airt-cs-0021.yml | 153 + artifacts/case-studies/airt-cs-0022.yml | 75 + artifacts/detections/README.md | 2 + .../sigma/ai_agent_credential_file_access.yml | 2 + .../ai_agent_hook_config_modification.yml | 41 + .../ai_cli_permission_bypass_invocation.yml | 55 + artifacts/docs/VERIFICATION.md | 44 + artifacts/docs/api/detections.json | 40 +- artifacts/docs/api/graph/maltego-entities.csv | 562 + artifacts/docs/api/graph/maltego-links.csv | 748 + artifacts/docs/api/intel.json | 18333 ++++++++++++++++ artifacts/docs/api/stix/ai-dfir-intel.json | 9105 ++++++++ artifacts/intel/actors/airt-ta-0001.yml | 67 + artifacts/intel/actors/airt-ta-0002.yml | 33 + artifacts/intel/actors/airt-ta-0003.yml | 51 + artifacts/intel/actors/airt-ta-0004.yml | 65 + artifacts/intel/actors/airt-ta-0005.yml | 51 + artifacts/intel/actors/airt-ta-0006.yml | 54 + artifacts/intel/actors/airt-ta-0007.yml | 60 + artifacts/intel/actors/airt-ta-0008.yml | 48 + artifacts/intel/actors/airt-ta-0009.yml | 45 + artifacts/intel/actors/airt-ta-0010.yml | 48 + artifacts/intel/actors/airt-ta-0011.yml | 37 + artifacts/intel/actors/airt-ta-0012.yml | 33 + artifacts/intel/actors/airt-ta-0013.yml | 42 + artifacts/intel/actors/airt-ta-0014.yml | 40 + artifacts/intel/actors/airt-ta-0015.yml | 43 + artifacts/intel/actors/airt-ta-0016.yml | 26 + artifacts/intel/actors/airt-ta-0017.yml | 22 + artifacts/intel/actors/airt-ta-0018.yml | 22 + artifacts/intel/actors/airt-ta-0019.yml | 22 + artifacts/intel/actors/airt-ta-0020.yml | 51 + artifacts/intel/watch-sources.yml | 95 + artifacts/schema/actor.schema.json | 308 + artifacts/schema/artifact.schema.json | 8 + artifacts/schema/case-study.schema.json | 366 + artifacts/schema/cve-status.json | 111 + artifacts/schema/intel-vocab.json | 127 + artifacts/schema/owasp.json | 243 + artifacts/schema/technique-ids.json | 9493 +++++++- artifacts/scripts/apply_mappings_update.py | 5 + artifacts/scripts/build_site.py | 219 +- artifacts/scripts/cve_status.py | 162 + artifacts/scripts/forbidden_terms.py | 55 + artifacts/scripts/intel_graph.py | 905 + artifacts/scripts/intel_watch.py | 351 + artifacts/scripts/refresh_guard.py | 154 + artifacts/scripts/remap_owasp_2026.py | 32 +- artifacts/scripts/site_data.py | 112 +- artifacts/scripts/site_intel.py | 922 + artifacts/scripts/site_scripts.py | 345 + artifacts/scripts/sync_mappings.py | 153 + artifacts/scripts/triage_spec.py | 145 + artifacts/scripts/validate_mappings.py | 25 +- artifacts/scripts/validate_techniques.py | 295 +- artifacts/scripts/vendor/VENDOR.json | 13 + artifacts/scripts/vendor/cytoscape.LICENSE | 19 + artifacts/scripts/vendor/cytoscape.min.js | 31 + docs/ai-dfir-investigation-guide.md | 94 +- playbooks/pb-mcp-compromise-containment.json | 6 +- skills/agent-artifact-catalog/SKILL.md | 23 + 97 files changed, 46220 insertions(+), 331 deletions(-) create mode 100644 .github/ISSUE_TEMPLATE/intel_candidate.yml create mode 100644 .github/workflows/framework-refresh.yml create mode 100644 .github/workflows/intel-watch.yml create mode 100644 artifacts/case-studies/airt-cs-0015.yml create mode 100644 artifacts/case-studies/airt-cs-0016.yml create mode 100644 artifacts/case-studies/airt-cs-0017.yml create mode 100644 artifacts/case-studies/airt-cs-0018.yml create mode 100644 artifacts/case-studies/airt-cs-0019.yml create mode 100644 artifacts/case-studies/airt-cs-0020.yml create mode 100644 artifacts/case-studies/airt-cs-0021.yml create mode 100644 artifacts/case-studies/airt-cs-0022.yml create mode 100644 artifacts/detections/sigma/ai_agent_hook_config_modification.yml create mode 100644 artifacts/detections/sigma/ai_cli_permission_bypass_invocation.yml create mode 100644 artifacts/docs/api/graph/maltego-entities.csv create mode 100644 artifacts/docs/api/graph/maltego-links.csv create mode 100644 artifacts/docs/api/intel.json create mode 100644 artifacts/docs/api/stix/ai-dfir-intel.json create mode 100644 artifacts/intel/actors/airt-ta-0001.yml create mode 100644 artifacts/intel/actors/airt-ta-0002.yml create mode 100644 artifacts/intel/actors/airt-ta-0003.yml create mode 100644 artifacts/intel/actors/airt-ta-0004.yml create mode 100644 artifacts/intel/actors/airt-ta-0005.yml create mode 100644 artifacts/intel/actors/airt-ta-0006.yml create mode 100644 artifacts/intel/actors/airt-ta-0007.yml create mode 100644 artifacts/intel/actors/airt-ta-0008.yml create mode 100644 artifacts/intel/actors/airt-ta-0009.yml create mode 100644 artifacts/intel/actors/airt-ta-0010.yml create mode 100644 artifacts/intel/actors/airt-ta-0011.yml create mode 100644 artifacts/intel/actors/airt-ta-0012.yml create mode 100644 artifacts/intel/actors/airt-ta-0013.yml create mode 100644 artifacts/intel/actors/airt-ta-0014.yml create mode 100644 artifacts/intel/actors/airt-ta-0015.yml create mode 100644 artifacts/intel/actors/airt-ta-0016.yml create mode 100644 artifacts/intel/actors/airt-ta-0017.yml create mode 100644 artifacts/intel/actors/airt-ta-0018.yml create mode 100644 artifacts/intel/actors/airt-ta-0019.yml create mode 100644 artifacts/intel/actors/airt-ta-0020.yml create mode 100644 artifacts/intel/watch-sources.yml create mode 100644 artifacts/schema/actor.schema.json create mode 100644 artifacts/schema/case-study.schema.json create mode 100644 artifacts/schema/cve-status.json create mode 100644 artifacts/schema/intel-vocab.json create mode 100644 artifacts/schema/owasp.json create mode 100644 artifacts/scripts/cve_status.py create mode 100644 artifacts/scripts/forbidden_terms.py create mode 100644 artifacts/scripts/intel_graph.py create mode 100644 artifacts/scripts/intel_watch.py create mode 100644 artifacts/scripts/refresh_guard.py create mode 100644 artifacts/scripts/site_intel.py create mode 100644 artifacts/scripts/site_scripts.py create mode 100644 artifacts/scripts/sync_mappings.py create mode 100644 artifacts/scripts/triage_spec.py create mode 100644 artifacts/scripts/vendor/VENDOR.json create mode 100644 artifacts/scripts/vendor/cytoscape.LICENSE create mode 100644 artifacts/scripts/vendor/cytoscape.min.js diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 71cc983..4382ae5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,4 @@ -# Code owners for ai-dfir-detections. +# Code owners for ai-dfir-toolkit. # These owners are requested for review on pull requests that touch matching # paths, and are required reviewers when branch protection enforces it. diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml index 051a019..f443845 100644 --- a/.github/ISSUE_TEMPLATE/config.yml +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -1,8 +1,8 @@ blank_issues_enabled: true contact_links: - name: Security or sensitive report - url: https://github.com/depalmar/ai-dfir-detections/blob/main/SECURITY.md + url: https://github.com/depalmar/ai-dfir-toolkit/blob/main/SECURITY.md about: For a rule that could be weaponized, or any sensitive security concern, follow the security policy instead of opening a public issue. - name: Contributing guide - url: https://github.com/depalmar/ai-dfir-detections/blob/main/CONTRIBUTING.md + url: https://github.com/depalmar/ai-dfir-toolkit/blob/main/CONTRIBUTING.md about: How to submit new rules, run validation, and format Sigma / YARA / Suricata content. diff --git a/.github/ISSUE_TEMPLATE/intel_candidate.yml b/.github/ISSUE_TEMPLATE/intel_candidate.yml new file mode 100644 index 0000000..35cf5dd --- /dev/null +++ b/.github/ISSUE_TEMPLATE/intel_candidate.yml @@ -0,0 +1,57 @@ +name: Threat-intel candidate +description: A report, incident or advisory that may belong in the actor profiles or case studies +title: "[intel] " +labels: ["intel-candidate"] +body: + - type: markdown + attributes: + value: | + Facts and links only. AIID and OWASP material is CC BY-SA 4.0 and this repository's data is CC BY 4.0, so record ids, dates, names and URLs - not copied prose. + - type: input + id: source + attributes: + label: Primary source URL + description: The reporting party's own page, not a news summary of it + validations: + required: true + - type: input + id: reporter + attributes: + label: Reporting party + placeholder: GTIG / CERT-UA / vendor research team + validations: + required: true + - type: textarea + id: claim + attributes: + label: What the source claims, in your words + validations: + required: true + - type: textarea + id: attribution + attributes: + label: Attribution as stated + description: Quote the attributing party's wording and stated confidence verbatim. Leave blank if unattributed. + - type: input + id: tools + attributes: + label: Catalogued tools involved + placeholder: AIRT-0001 + - type: textarea + id: indicators + attributes: + label: Published indicators + description: A case study needs at least one. Without any, this becomes an actor sighting. + - type: textarea + id: corroboration + attributes: + label: Independent corroboration + description: A second source that does not just repeat the first. Single-source is medium confidence at most. + - type: checkboxes + id: checks + attributes: + label: Before it reaches the catalog + options: + - label: Primary source read, not a summary + - label: Adversarial pass done (what would make this wrong?) + - label: Facts-only from CC BY-SA sources diff --git a/.github/workflows/artifacts.yml b/.github/workflows/artifacts.yml index 79281ce..f814111 100644 --- a/.github/workflows/artifacts.yml +++ b/.github/workflows/artifacts.yml @@ -28,6 +28,12 @@ jobs: run: pip install -r requirements.txt - name: Validate catalog and detections run: python scripts/validate.py + # Names the project deliberately does not publish, held in a secret so the + # list itself is never committed. Passes with a notice when unset. + - name: Check for forbidden terms + env: + FORBIDDEN_TERMS: ${{ secrets.FORBIDDEN_TERMS }} + run: python scripts/forbidden_terms.py # The schema checks technique ids by shape, so AML.T9999 and a technique # MITRE deprecated three releases ago both pass it. This resolves them # against pinned framework data. Offline on purpose: a gate that followed @@ -36,6 +42,17 @@ jobs: # change under test. Bump the pin with --refresh, which shows up in review. - name: Resolve ATLAS and ATT&CK technique ids run: python scripts/validate_techniques.py + # Same pattern for CISA KEV: "on KEV" is a claim a responder triages by, + # and two files once disagreed about it for the same CVE. + - name: Check KEV claims against the pinned CISA catalog + run: python scripts/cve_status.py + # MAPPINGS index tables are derived from the rows and the pinned titles. + - name: Check MAPPINGS indexes and rule tags + run: python scripts/sync_mappings.py --check + # Actor profiles and case studies against their closed schemas, and every + # cross-reference between them, the catalog and the rule corpus. + - name: Check threat-intel layer + run: python scripts/intel_graph.py --check # The Contents block is the first thing a reader sees and every number in # it was hand-typed and had drifted - 44 tools against 51, 258 artifacts # against 601. Derived and gated now, like the feeds. @@ -85,6 +102,7 @@ jobs: python scripts/export_forensicartifacts.py python scripts/export_kape.py python scripts/export_velociraptor.py + python scripts/intel_graph.py --export - name: Fail if feeds are stale run: | if ! git diff --quiet docs/api; then diff --git a/.github/workflows/framework-refresh.yml b/.github/workflows/framework-refresh.yml new file mode 100644 index 0000000..625032a --- /dev/null +++ b/.github/workflows/framework-refresh.yml @@ -0,0 +1,127 @@ +name: framework-refresh + +# Weekly re-pin of the reference data the gates validate against: MITRE ATLAS, +# Enterprise ATT&CK and the CISA KEV catalog. Every derived file is regenerated +# and every gate CI runs is run on the refreshed tree. If the diff is confined +# to pinned data and its derivatives (scripts/refresh_guard.py), the PR is set +# to auto-merge; anything else - or a gate that fails because upstream dropped +# an id something still cites - is left for a person. +# +# Auto-merge needs, once, in the repository settings: +# - Settings > General > Allow auto-merge +# - a branch protection rule on main requiring the artifact-catalog checks +# - an AUTOMATION_TOKEN secret (fine-grained PAT or GitHub App token with +# contents + pull-requests write). PRs opened with the default GITHUB_TOKEN +# do not trigger CI, so without it the PR is opened but never auto-merges. +# Optional: a FORBIDDEN_TERMS secret (comma-separated) that holds a refresh for +# review when an added line contains any of the terms. + +on: + schedule: + - cron: '17 6 * * 1' # Mondays 06:17 UTC + workflow_dispatch: + +permissions: + contents: write + pull-requests: write + issues: write + +concurrency: + group: framework-refresh + cancel-in-progress: false + +jobs: + refresh: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.11' + - name: Install dependencies + run: pip install -r artifacts/requirements.txt + + - name: Re-pin ATLAS, ATT&CK and CISA KEV + working-directory: artifacts + run: | + python scripts/validate_techniques.py --refresh + python scripts/cve_status.py --refresh + + - name: Regenerate everything derived from the pins + working-directory: artifacts + run: | + python scripts/sync_mappings.py + python scripts/export.py + python scripts/export_forensicartifacts.py + python scripts/export_kape.py + python scripts/export_velociraptor.py + python scripts/intel_graph.py --export + python ../collectors/gen_credential_targets.py + + - name: Run every gate on the refreshed tree + working-directory: artifacts + run: | + python scripts/validate.py + python scripts/validate_techniques.py + python scripts/cve_status.py + python scripts/sync_mappings.py --check + python scripts/intel_graph.py --check + python scripts/data_sources.py --check + python scripts/export_kape.py --check + python scripts/export_velociraptor.py --check + python scripts/normalize_notes.py --check + python scripts/readme_counts.py --check + python scripts/build_site.py --check + (cd .. && python artifacts/scripts/validate_mappings.py) + (cd .. && python collectors/gen_credential_targets.py --check) + (cd .. && python collectors/check_target_drift.py) + + - name: Classify the diff + id: guard + env: + FORBIDDEN_TERMS: ${{ secrets.FORBIDDEN_TERMS }} + run: | + set +e + python artifacts/scripts/refresh_guard.py --base HEAD --summary "$RUNNER_TEMP/refresh.md" + echo "code=$?" >> "$GITHUB_OUTPUT" + + - name: Open or update the refresh PR + id: cpr + if: steps.guard.outputs.code == '0' || steps.guard.outputs.code == '2' + uses: peter-evans/create-pull-request@84ae59a2cdc2258d6fa0732dd66352dddae2a412 # v7.0.9 + with: + token: ${{ secrets.AUTOMATION_TOKEN || secrets.GITHUB_TOKEN }} + branch: automation/framework-refresh + delete-branch: true + title: "Framework refresh: ATLAS, ATT&CK and CISA KEV pins" + body-path: ${{ runner.temp }}/refresh.md + labels: framework-refresh + commit-message: | + Refresh pinned ATLAS, ATT&CK and CISA KEV data + + Generated by .github/workflows/framework-refresh.yml. + + - name: Enable auto-merge + if: steps.guard.outputs.code == '0' && steps.cpr.outputs.pull-request-number != '' + env: + GH_TOKEN: ${{ secrets.AUTOMATION_TOKEN }} + PR: ${{ steps.cpr.outputs.pull-request-number }} + run: | + if [ -z "$GH_TOKEN" ]; then + echo "::notice::AUTOMATION_TOKEN is not set - PR #$PR is open for a person to merge." + exit 0 + fi + gh pr merge --auto --squash "$PR" --repo "$GITHUB_REPOSITORY" + + # A gate that fails on refreshed data is the case auto-merge must never + # paper over: usually upstream renamed or dropped an id that something + # here still cites. That needs a person, so it becomes an issue. + - name: Report a refresh that breaks a gate + if: failure() + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: | + gh label create framework-refresh --color 5319e7 --force --repo "$GITHUB_REPOSITORY" || true + gh issue create --repo "$GITHUB_REPOSITORY" --label framework-refresh \ + --title "Framework refresh needs attention ($(date -u +%Y-%m-%d))" \ + --body "The weekly refresh re-pinned upstream data and a gate failed on the result. See $GITHUB_SERVER_URL/$GITHUB_REPOSITORY/actions/runs/$GITHUB_RUN_ID. The usual cause is an upstream rename or removal of an id this repository cites - follow the ATLAS or ATT&CK changelog, update the citing files, and record the change in artifacts/docs/VERIFICATION.md." diff --git a/.github/workflows/intel-watch.yml b/.github/workflows/intel-watch.yml new file mode 100644 index 0000000..07a2936 --- /dev/null +++ b/.github/workflows/intel-watch.yml @@ -0,0 +1,40 @@ +name: intel-watch + +# Weekly poll of threat-intel sources (artifacts/intel/watch-sources.yml). New +# items become issues labelled intel-candidate, with facts and a link. Nothing +# here writes to the repository or merges anything: a new incident or actor +# needs a person to read the source, find corroboration and decide scope. + +on: + schedule: + - cron: '41 7 * * 3' # Wednesdays 07:41 UTC + workflow_dispatch: + inputs: + since: + description: 'ISO date to look back to (default: lookback_days in the config)' + required: false + +permissions: + contents: read + issues: write + +jobs: + watch: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@11bd71901bbe5b1630ceea73d27597364c9af683 # v4.2.2 + - uses: actions/setup-python@a26af69be951a213d495a4c3e4e4022e16d87065 # v5.6.0 + with: + python-version: '3.11' + - name: Install dependencies + run: pip install -r artifacts/requirements.txt + - name: Ensure labels exist + env: + GH_TOKEN: ${{ secrets.GITHUB_TOKEN }} + run: gh label create intel-candidate --color 0e8a16 --force --repo "$GITHUB_REPOSITORY" + - name: Poll sources and open issues + working-directory: artifacts + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + SINCE: ${{ github.event.inputs.since }} + run: python scripts/intel_watch.py ${SINCE:+--since "$SINCE"} diff --git a/.github/workflows/pages.yml b/.github/workflows/pages.yml index d611909..be19cbc 100644 --- a/.github/workflows/pages.yml +++ b/.github/workflows/pages.yml @@ -8,8 +8,10 @@ on: - 'artifacts/docs/api/**' - 'artifacts/case-studies/**' - 'artifacts/detections/**' - - 'artifacts/scripts/build_site.py' - - 'artifacts/scripts/site_data.py' + - 'artifacts/intel/**' + - 'artifacts/schema/**' + - 'artifacts/scripts/*.py' + - 'artifacts/scripts/vendor/**' - 'artifacts/requirements.txt' - 'docs/ai-dfir-investigation-guide.md' - 'MAPPINGS.md' diff --git a/02-mcp-attacks/README.md b/02-mcp-attacks/README.md index 61e11fd..7d2104d 100644 --- a/02-mcp-attacks/README.md +++ b/02-mcp-attacks/README.md @@ -6,7 +6,7 @@ Detects compromise of MCP servers and clients including tool poisoning, configur | Threat | ATLAS | OWASP | Reference | |--------|-------|-------|-----------| -| MCP tool poisoning (description hijack, published poisoned) | T0104 | LLM03 | Invariant Labs 2025 | +| MCP tool poisoning (description hijack, published poisoned) | T0115.002 | LLM03 | Invariant Labs 2025 | | MCP rug pull (post-install tool mutation) | T0110 | LLM04 | Invariant Labs 2025 | | Malicious MCP config injection | T0010 | LLM03 | CVE-2025-59536 | | MCP credential exfiltration | T0086 | LLM02 | Cyata 2025 | diff --git a/02-mcp-attacks/mcp_tool_poisoning.yar b/02-mcp-attacks/mcp_tool_poisoning.yar index 974b1d8..16a2d65 100644 --- a/02-mcp-attacks/mcp_tool_poisoning.yar +++ b/02-mcp-attacks/mcp_tool_poisoning.yar @@ -4,11 +4,13 @@ Date: 2026-04-15 Reference: https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks https://www.cve.org/CVERecord?id=CVE-2025-59536 - ATLAS: AML.T0104 (Publish Poisoned AI Agent Tool, Resource Development) + ATLAS: AML.T0115.002 (Publish Poisoned AI Artifacts: AI Agent Tools, + Resource Development - its own technique id until + ATLAS 2026.07 folded it in here) AML.T0110 (AI Agent Tool Poisoning, post-install mutation) Both, deliberately: this rule matches a poisoned tool description wherever it lands, and cannot tell a tool published poisoned from - one mutated after approval. T0104 and T0110 are distinct current + one mutated after approval. T0115.002 and T0110 are distinct current techniques, not alternative names - see docs/VERIFICATION.md. Detects malicious instructions embedded in MCP tool descriptions @@ -33,7 +35,7 @@ rule MCP_Tool_Poisoning_Hidden_Instructions description = "MCP tool description containing hidden LLM instructions" author = "Raymond DePalma (ai-dfir-toolkit)" date = "2026-04-15" - atlas = "AML.T0104, AML.T0110" + atlas = "AML.T0115.002, AML.T0110" owasp = "LLM03:2026" reference = "https://invariantlabs.ai/blog/mcp-security-notification-tool-poisoning-attacks" severity = "critical" diff --git a/04-ai-infrastructure/ray_jobs_api_rce.rules b/04-ai-infrastructure/ray_jobs_api_rce.rules index cdd8502..7c3aa7a 100644 --- a/04-ai-infrastructure/ray_jobs_api_rce.rules +++ b/04-ai-infrastructure/ray_jobs_api_rce.rules @@ -8,7 +8,8 @@ # - ShadowRay 2.0 (Nov 2025, self-propagating botnet, ~200K exposed servers) # # Anyscale disputes this CVE as a "design feature" — it remains exploitable -# in production. KEV-listed by CISA. +# in production. It is not in the CISA KEV catalog (CISA requires an +# available fix and Anyscale ships none); VulnCheck lists it in its own KEV. # # SID range: 9000200-9000299 reserved for Ray rules # @@ -48,7 +49,7 @@ alert http any any -> any any (msg:"AI-DFIR Ray Jobs API submission downloading http.request_body; pcre:"/(curl|wget)\s+(-[^\s]*\s+)*https?:\/\/(\d{1,3}\.){3}\d{1,3}/i"; \ classtype:web-application-attack; \ reference:cve,2023-48022; \ - metadata:atlas AML.T0011, atlas AML.T0019; \ + metadata:atlas AML.T0011, atlas AML.T0049; \ sid:9000202; rev:1;) # ========================================================================== @@ -74,7 +75,7 @@ alert http any any -> any 8265 (msg:"AI-DFIR Ray Job submission referencing Node classtype:trojan-activity; \ reference:cve,2023-48022; \ reference:url,oligo.security/blog/shadowray-2-0-attackers-turn-ai-against-itself-in-global-campaign-that-hijacks-ai-into-self-propagating-botnet; \ - metadata:atlas AML.T0011, atlas AML.T0019; \ + metadata:atlas AML.T0011, atlas AML.T0049; \ sid:9000204; rev:1;) alert http any any -> any any (msg:"AI-DFIR Ray Job entrypoint contains XMRig cryptominer indicator"; \ diff --git a/CLAUDE.md b/CLAUDE.md index 215fc84..1da79e5 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -24,6 +24,12 @@ write LF endings on every platform so the generated feeds stay byte-identical. ```bash python scripts/validate.py # schema + sigma + confidence gate python scripts/validate_techniques.py # ATLAS/ATT&CK ids exist (--refresh re-pins) +python scripts/cve_status.py # KEV claims match the pinned CISA catalog (--refresh) +python scripts/sync_mappings.py # MAPPINGS index tables from the pins (--check gates) +python scripts/intel_graph.py --check # actors + case studies, schemas and cross-refs +python scripts/intel_graph.py --export # intel.json, STIX 2.1 bundle, Maltego CSVs +python scripts/intel_watch.py --dry-run # what the weekly intel watcher would raise +python scripts/forbidden_terms.py # FORBIDDEN_TERMS env/secret; never prints the terms python scripts/readme_counts.py # README Contents block (--check gates it) python scripts/normalize.py # collapse vocabulary drift python scripts/export.py # regenerate docs/api feeds @@ -47,11 +53,13 @@ there rather than from `artifacts/`. `validate.py` is the gate CI runs. Never commit while it reports problems. Always regenerate the feeds in the same commit as a catalog change, or CI fails -the staleness check. "The feeds" is five scripts, not two: `export.py`, -`export_forensicartifacts.py`, `export_kape.py`, `export_velociraptor.py` and -`collectors/gen_credential_targets.py`. The last one is easy to forget because it -lives outside `artifacts/` — an entry that adds a credential location and skips it -passes every local check and fails CI. +the staleness check. "The feeds" is six scripts, not two: `export.py`, +`export_forensicartifacts.py`, `export_kape.py`, `export_velociraptor.py`, +`intel_graph.py --export` and `collectors/gen_credential_targets.py`. The last one +is easy to forget because it lives outside `artifacts/` — an entry that adds a +credential location and skips it passes every local check and fails CI. The +intel export regenerates from the catalog too, because actor profiles derive +their collect rows from it. `validate_techniques.py` resolves every `atlas_techniques` and `attack_techniques` id against pinned framework data in @@ -66,6 +74,16 @@ itself deprecated and carries fewer techniques than the current release, and the ATLAS YAML uses anchors, so grepping it undercounts by about sixteen techniques that never appear as literal text. +It checks every surface that carries an id, not only `catalog/*.yml` - rules, +MAPPINGS, case studies, actor profiles, playbooks, the guide. Checking only the +catalog let `AML.T0104` and `AML.T0019` sit in five files for a month after +ATLAS folded them into `AML.T0115`. It buckets the pin by object type (tactics, +techniques, mitigations, case studies); keeping every `AML.T*` id once pinned +sixteen tactics as techniques. `--atlas-dir` and `--attack-dir` read local clones +for runners that reach git but not raw.githubusercontent.com. The pin keeps +ATLAS case-study ids, names, dates and techniques, and deliberately **not** +upstream's free-text actor, target or reporter fields - see the employer rule. + ## Rules that are not negotiable **Entry IDs are permanent.** `AIRT-0011` stays `AIRT-0011` forever, including @@ -205,6 +223,44 @@ Splunk, purely to prove the rules parse. The backend choice there is arbitrary. **Defensive content only.** Document where artifacts live and what they prove. No exploit code, no working attack tooling, no step-by-step abuse instructions. +**Threat-intel rules.** The actor and case layer (`artifacts/intel/`, +`artifacts/case-studies/`, `scripts/intel_graph.py`) follows the catalog's rules +and adds these: + +- `AIRT-TA-NNNN` actor ids are permanent, like entry ids. +- Scope is **attributed groups and reporter-named clusters**. An unnamed operator + stays in its case study. Private individuals are not profiled: a handle an + actor used stays out, and so do company names from influence-operation + reporting. +- An actor link carries **two** confidences. `link_confidence` is ours and + measures provenance: one reporting party is `medium`, however authoritative. + `stated_confidence` is the attributing party's own words, verbatim. +- Techniques, victims, indicators, detections, dates and recovery are **derived** + on a profile, never authored, so a profile cannot contradict its cases. + Reported AI use with no indicators is a `sighting`, not a case study: "no IOCs, + no case study" still holds. +- **Facts only from CC BY-SA sources.** AIID and the OWASP documents are CC BY-SA + 4.0 and this repository's data is CC BY 4.0. Take ids, dates, names, category + mappings and URLs, and write summaries in our own words. Never paste their prose. +- Victims are only what the source states. A blank sector is a source that did + not say, not a sector nobody targeted. +- Analytics (similarity, clusters, co-occurrence) are descriptive, computed in + `intel_graph.py`, and labelled as triage aids. They are never evidence of + attribution. + +**The employer rule covers upstream text too.** Third-party reference data +names organisations, including the maintainer's employer, in free-text fields. +That is why the ATLAS pin drops case-study actor, target and reporter strings, +why one cluster whose only source is the employer's own research was left out, +and why the refresh workflow checks added lines against a `FORBIDDEN_TERMS` +secret before it will auto-merge. The terms live in the secret so they are never +committed. Before committing generated reference data, grep it. + +**"On CISA KEV" is gated.** `schema/cve-status.json` pins the KEV status of every +CVE the repository cites, and `cve_status.py` fails a line that calls a CVE +KEV-listed when the pin disagrees. The Ray rule said it was listed while the guide +said, correctly, that it was not. + ## What a restricted runner cannot verify A documentation pass is not a substitute for a host, but it is not available @@ -275,8 +331,16 @@ IDs changed meaning between 2025 and 2026, so an ID quoted from an older report names a different category here than it did there - `scripts/remap_owasp_2026.py` holds the mapping table and the reasoning. -Detection content totals 68 rule files / 159 signatures across the nine attack-class -directories plus `artifacts/detections/`, all indexed in `MAPPINGS.md`. +Detection content totals 70 rule files / 161 signatures across the nine attack-class +directories plus `artifacts/detections/` (14 endpoint Sigma rules), all indexed in +`MAPPINGS.md`. Every rule carries an OWASP Agentic (ASI01-ASI10) value, or a dash. +Those values are this project's assessment, because OWASP maps no detection +content. Frameworks pinned: ATLAS 2026.09, ATT&CK 19.2, CISA KEV 2026.09.29, +OWASP LLM 2026 and Agentic 2026 (`schema/owasp.json`). + +Threat intel: 20 actor profiles, 22 case studies (221 indicators, 163 atomic), +29 ATLAS techniques observed. 14 have a rule, 11 are off-host by nature, and the +detection backlog (`intel_graph.py` prints it as `[GAP]`) is the rest. Confidence: 27 high, 20 medium, 4 low. Provenance: 51/51 entries carry a reference. AIRT-0034 was the last holdout and @@ -336,7 +400,24 @@ detection rules, the ATLAS/OWASP indexes, case studies, the investigation guide handoff and why, including which findings were declined and the two places the review itself was wrong. Read it before re-opening any of those questions. -Three things worth not relearning: +The Threat intel, Graph and triage-script views live in `site_intel.py`; the +script templates live in `site_scripts.py`; `triage_spec.py` decides how each row +is collected, beside the KAPE and Velociraptor exporters so the three agree. +Cytoscape.js is vendored under `scripts/vendor/` with its sha256 in +`VENDOR.json`, and `--check` fails if the file changes without the record. It is +inlined as inert text and only evaluated when the Graph tab opens. + +Four things worth not relearning: + +- Every embedded data blob goes through `js_data()`, which escapes `` anywhere in a rule body or case summary would otherwise end the + script element early and the page would render as text. +- The generated triage scripts hash credentials instead of copying them. The + first version applied that only to credential rows, so a picked directory row + (`~/.claude/`) swept the token file into the copy. The script now carries every + credential path in the catalog for that OS, and anything matched in a directory + sweep is hashed only. Test the scripts against a fixture with `--home`, never + against a real profile - this container's own `~/.claude` holds live tokens. - `docs/api/artifacts.csv` is a published feed. Never change an existing column in place; add new ones. Display-only reshaping belongs in the site build. @@ -374,6 +455,28 @@ resolved by whoever picks this up next without asking. **Then, in order of value:** +0. **Threat-intel follow-through.** + - The first `intel_watch.py` run offline found five Langflow CVEs added to CISA + KEV this year that the catalog and `cve-status.json` do not cite: + CVE-2026-0770, -9198, -33017, -55255 and CVE-2025-34291. Research them into + AIRT-0044 and AIRT-CS-0003. + - Set up auto-merge: an `AUTOMATION_TOKEN` secret, branch protection on + `main`, and "Allow auto-merge". Without them the refresh PR opens but waits. + - Run the generated PowerShell triage script on a Windows host. The bash + variant was executed against a fixture here; the `.ps1` was reviewed but not + run, because no `pwsh` was available. + - Add a `FORBIDDEN_TERMS` repository secret (comma-separated). CI's + `forbidden_terms.py` step and the refresh guard both read it; until it + exists they pass with a notice and guard nothing. The threat-intel work + was squashed into one commit before any PR existed, because its first + versions republished upstream text and vendor alias lists that name the + employer or use its actor-naming scheme. A PR preserves every commit it + was opened with, so history like that has to be fixed before the PR, not + after. + - Research more actors and cases from a session with vendor egress: ATLAS + CS0068-CS0071, the OWASP ASI incident tracker and the OpenAI threat reports. + Only AIRT-TA ids with a case or a sighting belong. + 3. **Apply the rest of `docs/RESEARCH-2026-08-14.md`.** Roughly thirty candidate rows survived adversarial verification and were deliberately not committed, mostly for AIRT-0008, AIRT-0033 and AIRT-0018. Each carries its sourcing label @@ -418,3 +521,9 @@ previous day and had three wrong `high` paths. handoff, what was declined, and why - `artifacts/docs/EXTRACTION.md` — how to split this into its own repo, and when - `CONTRIBUTING.md` — submission rules for entries, detections, and case studies +- `artifacts/intel/` — actor profiles and the intel-watch source list +- `artifacts/schema/{case-study,actor}.schema.json`, `intel-vocab.json`, + `owasp.json`, `cve-status.json` — the closed shapes and pins behind the intel + layer +- `.github/workflows/framework-refresh.yml`, `intel-watch.yml` — the automation, + and what each needs set up once diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 3c3917c..e8fe0f3 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -114,6 +114,36 @@ Only for documented, dated, publicly reported incidents. Include concrete IOCs (paths, package names and versions, commit hashes, network destinations), response actions, and the transferable lesson. No IOCs, no case study. +Case studies validate against `artifacts/schema/case-study.schema.json`. +Structured fields are optional, but when you use them, stick to what the source +states: +- `actors`: links to profiles, each with our `link_confidence` and the + attributor's `stated_confidence`, verbatim +- `victims`: sector enum and ISO country codes +- `external_ids`: ATT&CK campaign, ATLAS case study, CVE, GHSA, AIID +- `owasp_agentic` +- phased `response_actions` (`contain`, `eradicate`, `recover`, `harden`) + +### Threat actor profiles + +`artifacts/intel/actors/airt-ta-NNNN.yml`, validated against +`artifacts/schema/actor.schema.json`. In scope are actors named by a government +or vendor report, and clusters a reporter designated. Unnamed operators stay in +their case study. Private individuals are not profiled. + +- Author only the identity: name, aliases with their source, kind, stated + nexus and motivation, summary, confidence, basis and references. +- Techniques, victims, indicators, detections and dates are derived by + `scripts/intel_graph.py` from the cases and `sightings` that cite the actor. +- A sighting is reported AI use that published no indicators. It carries the + reporter, the date, a summary in your words and the link. +- Sources licensed CC BY-SA 4.0 (the AI Incident Database, the OWASP documents) + contribute facts only: ids, dates, names and links. Do not paste their text. +- Run `python scripts/intel_graph.py --check` and `--export` before opening the PR. + +The weekly `intel-watch` workflow raises `intel-candidate` issues from public +sources. Picking one up and researching it is the easiest way in. + ### Reporting a catalog error Open an issue with the entry ID, the field, what it says, what it should say, and diff --git a/MAPPINGS.md b/MAPPINGS.md index f80e300..40ca93d 100644 --- a/MAPPINGS.md +++ b/MAPPINGS.md @@ -4,82 +4,82 @@ Per-rule mapping of detection content to MITRE ATLAS techniques, OWASP Top 10 fo All rules are in open formats (Sigma / YARA / Suricata). Convert Sigma to any SIEM query language using [pySigma](https://github.com/SigmaHQ/pySigma) backends. -**Scope:** 68 rule files / 159 individual signatures. Tables below are indexed by **rule file**; the ATLAS / OWASP counts at the bottom reflect per-file coverage (one rule file often tags multiple techniques and OWASP categories). +**Scope:** 70 rule files / 161 individual signatures. Tables below are indexed by **rule file**; the ATLAS / OWASP counts at the bottom reflect per-file coverage (one rule file often tags multiple techniques and OWASP categories). --- ## 01 — LLM Prompt Injection -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `prompt_injection_keywords.yml` | Sigma | T0051.000 | LLM01 | OWASP genai 2025, mapping updated to the 2026 list | -| `jailbreak_personas.yml` | Sigma | T0054 | LLM01 | jailbreakchat.com | -| `system_prompt_extraction.yml` | Sigma | T0054 | LLM08 | Leaked-system-prompts repo | -| `markdown_image_exfil.yml` | Sigma | T0024 | LLM02 | CVE-2025-32711, CVE-2025-59145 | -| `adversarial_suffix.yar` | YARA | T0051.000, T0029 | LLM01, LLM06 | Zou et al. 2023 (GCG) | -| `bedrock_high_token_usage.yml` | Sigma | T0029, T0051, T0054 | LLM01, LLM06 | OWASP LLM10:2025, now LLM06:2026 | -| `azure_openai_injection.yml` | Sigma | T0051, T0054 | LLM01, LLM08 | OWASP LLM01/LLM07:2025, now LLM01/LLM08:2026 | -| `llm_response_base64_exfil.yml` | Sigma | T0024 | LLM02 | embracethered.com | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `prompt_injection_keywords.yml` | Sigma | T0051.000 | LLM01 | ASI01 | OWASP genai 2025, mapping updated to the 2026 list | +| `jailbreak_personas.yml` | Sigma | T0054 | LLM01 | ASI01 | jailbreakchat.com | +| `system_prompt_extraction.yml` | Sigma | T0054 | LLM08 | — | Leaked-system-prompts repo | +| `markdown_image_exfil.yml` | Sigma | T0024 | LLM02 | ASI01 | CVE-2025-32711, CVE-2025-59145 | +| `adversarial_suffix.yar` | YARA | T0051.000, T0029 | LLM01, LLM06 | ASI01 | Zou et al. 2023 (GCG) | +| `bedrock_high_token_usage.yml` | Sigma | T0029, T0051, T0054 | LLM01, LLM06 | — | OWASP LLM10:2025, now LLM06:2026 | +| `azure_openai_injection.yml` | Sigma | T0051, T0054 | LLM01, LLM08 | ASI01 | OWASP LLM01/LLM07:2025, now LLM01/LLM08:2026 | +| `llm_response_base64_exfil.yml` | Sigma | T0024 | LLM02 | ASI01 | embracethered.com | ## 02 — MCP Attacks -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `mcp_tool_poisoning.yar` | YARA | T0104, T0110, T0086 | LLM03, LLM02 | Invariant Labs 2025 | -| `mcp_config_tampering.yml` | Sigma | T0010 | LLM04 | CVE-2025-59536 | -| `mcp_credential_access.yml` | Sigma | T0086 | LLM02 | Cyata 2025 | -| `mcp_outbound_unknown_domain.rules` | Suricata | T0011, T0086, T0110 | LLM02, LLM03 | CVE-2025-49596, CVE-2025-6514 | -| `claude_desktop_config_modify.yml` | Sigma | T0010 | — | CVE-2025-53109, CVE-2025-53110 | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `mcp_tool_poisoning.yar` | YARA | T0115.002, T0110, T0086 | LLM03, LLM02 | ASI04, ASI02 | Invariant Labs 2025 | +| `mcp_config_tampering.yml` | Sigma | T0010 | LLM04 | ASI04 | CVE-2025-59536 | +| `mcp_credential_access.yml` | Sigma | T0086 | LLM02 | ASI03 | Cyata 2025 | +| `mcp_outbound_unknown_domain.rules` | Suricata | T0011, T0086, T0110 | LLM02, LLM03 | ASI04, ASI05 | CVE-2025-49596, CVE-2025-6514 | +| `claude_desktop_config_modify.yml` | Sigma | T0010 | — | ASI04 | CVE-2025-53109, CVE-2025-53110 | ## 03 — Model & ML Supply Chain -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `pickle_malicious_opcodes.yar` | YARA | T0010.002, T0011, T0018, T0086 | LLM04 | CVE-2025-32444, Trail of Bits 2024 | -| `keras_lambda_layer_rce.yar` | YARA | T0018 | LLM04 | CVE-2025-1550 | -| `huggingface_token_exposure.yml` | Sigma | T0086 | — | Lasso Security 2024 | -| `mlflow_path_traversal.rules` | Suricata | T0010, T0011, T0086 | LLM04 | CVE-2023-6831, CVE-2024-0520, CVE-2024-2928, CVE-2023-43472 | -| `mlflow_unauth_api_access.yml` | Sigma | T0011 | LLM04 | CVE-2024-37059 | -| `pip_install_typosquat.yml` | Sigma | T0010.002 | LLM04 | torchtriton 2022, alibaba fakes 2024 | -| `huggingface_cache_unexpected_writer.yml` | Sigma | T0010.003 | LLM04 | HF cache architecture | -| `model_file_hash_mismatch.yml` | Sigma | T0010.003, T0018 | LLM04 | — | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `pickle_malicious_opcodes.yar` | YARA | T0010.002, T0011, T0018, T0086 | LLM04 | ASI04, ASI05 | CVE-2025-32444, Trail of Bits 2024 | +| `keras_lambda_layer_rce.yar` | YARA | T0018 | LLM04 | ASI04, ASI05 | CVE-2025-1550 | +| `huggingface_token_exposure.yml` | Sigma | T0086 | — | ASI03 | Lasso Security 2024 | +| `mlflow_path_traversal.rules` | Suricata | T0010, T0011, T0086 | LLM04 | — | CVE-2023-6831, CVE-2024-0520, CVE-2024-2928, CVE-2023-43472 | +| `mlflow_unauth_api_access.yml` | Sigma | T0011 | LLM04 | — | CVE-2024-37059 | +| `pip_install_typosquat.yml` | Sigma | T0010.002 | LLM04 | ASI04 | torchtriton 2022, alibaba fakes 2024 | +| `huggingface_cache_unexpected_writer.yml` | Sigma | T0010.003 | LLM04 | ASI04 | HF cache architecture | +| `model_file_hash_mismatch.yml` | Sigma | T0010.003, T0018 | LLM04 | ASI04 | — | ## 04 — AI Infrastructure -| Rule | Format | ATLAS | CVE / Reference | -|------|--------|-------|-----------------| -| `ray_jobs_api_rce.rules` | Suricata | T0011, T0019, T0029 | CVE-2023-48022, MITRE C0045, ShadowRay 2.0 | -| `ray_dashboard_exposure.rules` | Suricata | T0011 | CVE-2023-48022 | -| `shadowray_process_masquerading.yml` | Sigma | T0011, T0029 | Oligo Security 2025 | -| `gpu_unexpected_high_utilization.yml` | Sigma | T0029 | ShadowRay IOCs | -| `ssh_authorized_keys_injection.yml` | Sigma | T0011 | MITRE C0045 | -| `triton_inference_server_exploit.rules` | Suricata | T0011, T0086 | CVE-2025-23319, CVE-2025-23320, CVE-2025-23334 | -| `torchserve_shelltorch.rules` | Suricata | T0010, T0011, T0018 | CVE-2023-43654, CVE-2022-1471 | -| `nvidia_container_escape.yml` | Sigma | T1611 (ATT&CK) | CVE-2024-0132, CVE-2025-23266, CVE-2025-23359 | -| `ollama_vllm_unauth_exposure.rules` | Suricata | T0010, T0011, T0018, T0029 | CVE-2025-32444, AccuKnox 2025 | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `ray_jobs_api_rce.rules` | Suricata | T0011, T0049, T0029, T0086 | LLM06 | — | CVE-2023-48022, MITRE C0045, ShadowRay 2.0 | +| `ray_dashboard_exposure.rules` | Suricata | T0011 | — | — | CVE-2023-48022 | +| `shadowray_process_masquerading.yml` | Sigma | T0011, T0029 | LLM06 | — | Oligo Security 2025 | +| `gpu_unexpected_high_utilization.yml` | Sigma | T0029 | LLM06 | — | ShadowRay IOCs | +| `ssh_authorized_keys_injection.yml` | Sigma | T0011 | — | — | MITRE C0045 | +| `triton_inference_server_exploit.rules` | Suricata | T0010, T0011, T0086 | — | — | CVE-2025-23319, CVE-2025-23320, CVE-2025-23334 | +| `torchserve_shelltorch.rules` | Suricata | T0010, T0011, T0018 | — | — | CVE-2023-43654, CVE-2022-1471 | +| `nvidia_container_escape.yml` | Sigma | — | — | — | ATT&CK T1611, CVE-2024-0132, CVE-2025-23266, CVE-2025-23359 | +| `ollama_vllm_unauth_exposure.rules` | Suricata | T0010, T0011, T0018, T0029 | — | — | CVE-2025-32444, AccuKnox 2025 | ## 05 — Copilot & AI Assistant Abuse -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `m365_copilot_sensitive_label_access.yml` | Sigma | T0086 | LLM02 | CW1226324, CVE-2025-32711 | -| `m365_copilot_anomalous_aggregation.yml` | Sigma | T0024, T0086 | LLM02 | Concentric AI 2024-2025 | -| `github_copilot_yolo_mode_enabled.yml` | Sigma | T0010, T0011 | LLM03 | CVE-2025-53773 | -| `copilot_rules_file_backdoor.yar` | YARA | T0010, T0010.002 | LLM04 | Pillar Security 2025 | -| `cursor_settings_db_modification.yml` | Sigma | T0010 | LLM03 | Check Point MCPoison 2025, CVE-2025-54135 | -| `claude_session_jsonl_unexpected_access.yml` | Sigma | T0086 | — | Claude Code architecture | -| `chatgpt_paste_sensitive_data.yml` | Sigma | T0086 | LLM02 | Samsung 2023 incident | -| `ai_assistant_outbound_to_camo_proxy.rules` | Suricata | T0086 | LLM02 | CVE-2025-59145 (CamoLeak), CVE-2025-32711 (EchoLeak) | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `m365_copilot_sensitive_label_access.yml` | Sigma | T0086 | LLM02 | ASI03 | CW1226324, CVE-2025-32711 | +| `m365_copilot_anomalous_aggregation.yml` | Sigma | T0024, T0086 | LLM02 | ASI02 | Concentric AI 2024-2025 | +| `github_copilot_yolo_mode_enabled.yml` | Sigma | T0010, T0011 | LLM03 | ASI05, ASI01 | CVE-2025-53773 | +| `copilot_rules_file_backdoor.yar` | YARA | T0010, T0010.002 | LLM04 | ASI01, ASI04 | Pillar Security 2025 | +| `cursor_settings_db_modification.yml` | Sigma | T0010 | LLM03 | ASI04 | Check Point MCPoison 2025, CVE-2025-54135 | +| `claude_session_jsonl_unexpected_access.yml` | Sigma | T0086 | — | — | Claude Code architecture | +| `chatgpt_paste_sensitive_data.yml` | Sigma | T0086 | LLM02 | — | Samsung 2023 incident | +| `ai_assistant_outbound_to_camo_proxy.rules` | Suricata | T0086 | LLM02 | ASI01 | CVE-2025-59145 (CamoLeak), CVE-2025-32711 (EchoLeak) | ## 06 — RAG & Vector DB -| Rule | Format | ATLAS | OWASP | Reference | -|------|--------|-------|-------|-----------| -| `vector_db_unauth_exposure.rules` | Suricata | T0011, T0024 | LLM02, LLM09 | Shodan 2024 | -| `vector_db_bulk_exfil.yml` | Sigma | T0024 | LLM02, LLM09 | Princeton embedding-inversion | -| `rag_document_hidden_text.yar` | YARA | T0020, T0051.001 | LLM01, LLM09 | Greshake 2023, PoisonedRAG 2025 | -| `chroma_sqlite_unexpected_writer.yml` | Sigma | T0020 | LLM09 | ChromaDB architecture | -| `vector_db_query_anomaly.yml` | Sigma | T0020, T0024 | LLM02, LLM09 | — | +| Rule | Format | ATLAS | OWASP | ASI | Reference | +|------|--------|-------|-------|-----|-----------| +| `vector_db_unauth_exposure.rules` | Suricata | T0011, T0024 | LLM02, LLM09 | — | Shodan 2024 | +| `vector_db_bulk_exfil.yml` | Sigma | T0024 | LLM02, LLM09 | — | Princeton embedding-inversion | +| `rag_document_hidden_text.yar` | YARA | T0020, T0051.001 | LLM01, LLM09 | ASI06, ASI01 | Greshake 2023, PoisonedRAG 2025 | +| `chroma_sqlite_unexpected_writer.yml` | Sigma | T0020 | LLM09 | ASI06 | ChromaDB architecture | +| `vector_db_query_anomaly.yml` | Sigma | T0020, T0024, T0051 | LLM02, LLM09 | ASI06 | — | ## 07 — Runtime AI-Malware @@ -88,16 +88,16 @@ code ("just-in-time code creation", GTIG Nov 2025). The payload is not in the sample, so egress to the model provider and the host artifacts of the rewrite loop are the durable detection surface. -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `script_interpreter_llm_api_dns.yml` | Sigma | T0096, T0086 | LLM03 | PROMPTFLUX / PROMPTSTEAL (GTIG Nov 2025) | -| `promptflux_artifacts_fileevent.yml` | Sigma | T0096 | LLM01, LLM03 | PROMPTFLUX (GTIG Nov 2025) | -| `powershell_llm_api_command_generation.yml` | Sigma | T0096 | LLM03 | FRUITSHELL / PROMPTSTEAL (GTIG Nov 2025) | -| `runtime_ai_malware_correlation.yml` | Sigma | T0096 | LLM01, LLM03 | PROMPTFLUX kill-chain | -| `promptflux_thinking_robot.yar` | YARA | T0096 | LLM01, LLM03 | PROMPTFLUX | -| `promptsteal_lamehug.yar` | YARA | T0096 | LLM03 | PROMPTSTEAL / LAMEHUG (APT28) | -| `llm_api_prompt_in_script_generic.yar` | YARA | T0096 | LLM01, LLM03 | Just-in-time code creation (class heuristic) | -| `runtime_llm_api_c2.rules` | Suricata | T0096, T0086 | LLM03 | SesameOp-style AI-service C2 (AML.CS0042) | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `script_interpreter_llm_api_dns.yml` | Sigma | T0096, T0086 | LLM03 | — | PROMPTFLUX / PROMPTSTEAL (GTIG Nov 2025) | +| `promptflux_artifacts_fileevent.yml` | Sigma | T0096 | LLM01, LLM03 | — | PROMPTFLUX (GTIG Nov 2025) | +| `powershell_llm_api_command_generation.yml` | Sigma | T0096 | LLM03 | — | FRUITSHELL / PROMPTSTEAL (GTIG Nov 2025) | +| `runtime_ai_malware_correlation.yml` | Sigma | T0096 | LLM01, LLM03 | — | PROMPTFLUX kill-chain | +| `promptflux_thinking_robot.yar` | YARA | T0096 | LLM01, LLM03 | — | PROMPTFLUX | +| `promptsteal_lamehug.yar` | YARA | T0096 | LLM03 | — | PROMPTSTEAL / LAMEHUG (APT28) | +| `llm_api_prompt_in_script_generic.yar` | YARA | T0096 | LLM01, LLM03 | — | Just-in-time code creation (class heuristic) | +| `runtime_llm_api_c2.rules` | Suricata | T0096, T0086 | LLM03 | — | SesameOp-style AI-service C2 (AML.CS0042) | YARA string sets here are derived from public reporting rather than confirmed samples — see the category README before deploying them for blocking. @@ -109,11 +109,11 @@ C2. Different in kind from 01-07: every individual tool call here is legitimate, what betrays the intrusion is emergent - tempo, phase progression, breadth, and the ratio of agent actions to human decisions. -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `sesameop_assistants_api_c2.yml` | Sigma | T0096 | LLM03 | SesameOp, Microsoft DART Nov 2025 (AML.CS0042) | -| `agentic_orchestration_behavior.yml` | Sigma | T0086, T0054 | LLM03 | GTG-1002, Anthropic Nov 2025 | -| `ai_service_api_c2.rules` | Suricata | T0096, T0086 | LLM03 | SesameOp / agent-as-C2 egress | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `sesameop_assistants_api_c2.yml` | Sigma | T0096 | LLM03 | — | SesameOp, Microsoft DART Nov 2025 (AML.CS0042) | +| `agentic_orchestration_behavior.yml` | Sigma | T0086, T0054, T0053, T0096 | LLM03 | ASI02 | GTG-1002, Anthropic Nov 2025 | +| `ai_service_api_c2.rules` | Suricata | T0096, T0086 | LLM03 | — | SesameOp / agent-as-C2 egress | GTG-1002 is vendor-disclosed with no public IOCs, so these are behavioural rather than signature-based. `agentic_orchestration_behavior.yml` is threshold-driven and @@ -126,10 +126,10 @@ long-term memory survives conversation resets, process restarts, and the removal of whatever injection put it there - so eradication that does not purge memory leaves the adversary resident. -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `memory_poisoning.yml` | Sigma | T0080, T0080.000, T0081 | LLM01, LLM03 | MITRE/Zenity Labs Oct 2025 | -| `memory_poisoning_indicators.yar` | YARA | T0080.000, T0086 | LLM01, LLM02 | spAIware-class persistent exfiltration | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `memory_poisoning.yml` | Sigma | T0080, T0080.000, T0081, T0086 | LLM01, LLM03 | ASI06 | MITRE/Zenity Labs Oct 2025 | +| `memory_poisoning_indicators.yar` | YARA | T0080.000, T0086 | LLM01, LLM02 | ASI06 | spAIware-class persistent exfiltration | Also here: `analyze_agent_memory.py`, which parses memory stores and reports poisoning findings with severity and ATLAS mapping. @@ -140,20 +140,22 @@ Cross-tool endpoint rules generated alongside the artifact catalog (`artifacts/detections/sigma/`). Scoped to agent behaviour on a host rather than to a single attack class, so they apply across every tool in the catalog. -| Rule | Format | ATLAS | OWASP | CVE / Reference | -|------|--------|-------|-------|-----------------| -| `ai_agent_mcp_config_modification.yml` | Sigma | T0081 | LLM03 | — | -| `ai_agent_spawning_shell.yml` | Sigma | T0053 | LLM03 | — | -| `ai_agent_spawning_lolbin.yml` | Sigma | T0053 | LLM03 | LOLBAS via MCP marketplace audit 2025 | -| `local_llm_listener_non_loopback.yml` | Sigma | T0024, T0029 | LLM06 | Pillar Security 2026 (Operation Bizarre Bazaar) | -| `ai_agent_credential_file_access.yml` | Sigma | T0082 | LLM02 | — | -| `ai_inference_endpoint_redirection.yml` | Sigma | T0024 | LLM02 | — | -| `mcp_server_remote_code_fetch.yml` | Sigma | T0110 | LLM04 | postmark-mcp backdoor 2025 | -| `browser_agent_session_state_capture.yml` | Sigma | T0086 | LLM02, LLM03 | — | -| `ai_agent_autostart_persistence.yml` | Sigma | T0081 | LLM03 | — | -| `langflow_rce_exploitation_attempt.yml` | Sigma | T0053 | LLM04 | CVE-2025-3248 (CISA KEV), CVE-2026-5027 | -| `ai_agent_docker_socket_mount.yml` | Sigma | T0053 | LLM03 | OpenHands deployment docs | -| `ai_model_file_written_to_endpoint.yml` | Sigma | T0010.003 | LLM04 | — | +| Rule | Format | ATLAS | OWASP | ASI | CVE / Reference | +|------|--------|-------|-------|-----|-----------------| +| `ai_agent_mcp_config_modification.yml` | Sigma | T0081 | LLM03 | ASI04 | — | +| `ai_agent_spawning_shell.yml` | Sigma | T0053 | LLM03 | ASI05, ASI02 | — | +| `ai_agent_spawning_lolbin.yml` | Sigma | T0053 | LLM03 | ASI02, ASI05 | LOLBAS via MCP marketplace audit 2025 | +| `local_llm_listener_non_loopback.yml` | Sigma | T0024, T0029 | LLM06 | — | Pillar Security 2026 (Operation Bizarre Bazaar) | +| `ai_agent_credential_file_access.yml` | Sigma | T0083, T0055 | LLM02 | ASI03 | — | +| `ai_inference_endpoint_redirection.yml` | Sigma | T0024 | LLM02 | ASI04 | — | +| `mcp_server_remote_code_fetch.yml` | Sigma | T0110 | LLM04 | ASI04, ASI05 | postmark-mcp backdoor 2025 | +| `browser_agent_session_state_capture.yml` | Sigma | T0086 | LLM02, LLM03 | ASI03 | — | +| `ai_agent_autostart_persistence.yml` | Sigma | T0081 | LLM03 | — | — | +| `langflow_rce_exploitation_attempt.yml` | Sigma | T0053 | LLM04 | ASI05 | CVE-2025-3248 (CISA KEV), CVE-2026-5027 | +| `ai_agent_docker_socket_mount.yml` | Sigma | T0053 | LLM03 | ASI03, ASI05 | OpenHands deployment docs | +| `ai_model_file_written_to_endpoint.yml` | Sigma | T0010.003 | LLM04 | ASI04 | — | +| `ai_cli_permission_bypass_invocation.yml` | Sigma | T0053, T0098 | LLM03 | ASI05, ASI02 | s1ngularity / Nx GHSA-cxm3-wv7p-598c (AIRT-CS-0015) | +| `ai_agent_hook_config_modification.yml` | Sigma | T0081 | LLM03 | ASI04, ASI05 | GTIG Sep 2026, MIDNIGHT NEPTUNE (AIRT-CS-0017) | Also in this set: `artifacts/detections/osquery/ai-agent-artifacts.conf` — a six-query osquery pack for fleet inventory (running agents, listeners, MCP @@ -165,30 +167,34 @@ configs, plaintext credential files, model files, macOS autostart). It answers ## ATLAS Technique Index -| ATLAS ID | Title | Rule count | -|----------|-------|------------| -| T0010 | ML Supply Chain Compromise | 8 | -| T0010.002 | Software Supply Chain | 3 | -| T0010.003 | Model Supply Chain | 3 | -| T0011 | User Execution / Initial Access | 13 | -| T0018 | Poison AI Model | 5 | -| T0019 | Publish Poisoned Datasets | 1 | -| T0020 | Poison Training Data / RAG Corpus | 3 | -| T0024 | Exfiltration via API / Inference | 8 | -| T0029 | Denial of ML Service / Resource Hijacking | 7 | -| T0051 | LLM Prompt Injection | 2 | -| T0051.000 | Direct Prompt Injection | 2 | -| T0051.001 | Indirect Prompt Injection | 1 | -| T0053 | AI Agent Tool Invocation | 4 | -| T0054 | LLM Jailbreak | 5 | -| T0080 | AI Agent Context Poisoning | 1 | -| T0080.000 | AI Agent Context Poisoning: Memory | 2 | -| T0081 | Modify AI Agent Configuration | 3 | -| T0082 | RAG Credential Harvesting | 1 | -| T0086 | Exfiltration via AI Agent Tool Invocation | 18 | -| T0096 | AI Service API | 10 | -| T0104 | Publish Poisoned AI Agent Tool | 1 | -| T0110 | AI Agent Tool Poisoning | 3 | +Titles are ATLAS 2026.09 names, generated from `artifacts/schema/technique-ids.json` by `artifacts/scripts/sync_mappings.py`. + +| ATLAS ID | Title | Tactic | Rule count | +|----------|-------|--------|------------| +| T0010 | AI Supply Chain Compromise | Initial Access | 9 | +| T0010.002 | AI Supply Chain Compromise: Data | Initial Access | 3 | +| T0010.003 | AI Supply Chain Compromise: Model | Initial Access | 3 | +| T0011 | User Execution | Execution | 13 | +| T0018 | Manipulate AI Model | AI Attack Adaptation, Persistence | 5 | +| T0020 | Training Data Poisoning | Persistence | 3 | +| T0024 | Exfiltration via AI Inference API | Exfiltration | 8 | +| T0029 | Denial of AI Service | Impact | 7 | +| T0049 | Exploit Public-Facing Application | Initial Access | 1 | +| T0051 | LLM Prompt Injection | Execution | 3 | +| T0051.000 | LLM Prompt Injection: Direct | Execution | 2 | +| T0051.001 | LLM Prompt Injection: Indirect | Execution | 1 | +| T0053 | AI Agent Tool Invocation | Execution, Privilege Escalation, Lateral Movement | 6 | +| T0054 | LLM Jailbreak | Defense Evasion, Privilege Escalation | 5 | +| T0055 | Unsecured Credentials | Credential Access | 1 | +| T0080 | AI Agent Context Poisoning | Persistence | 1 | +| T0080.000 | AI Agent Context Poisoning: Memory | Persistence | 2 | +| T0081 | Modify AI Agent Configuration | Persistence, Defense Evasion | 4 | +| T0083 | Credentials from AI Agent Configuration | Credential Access | 1 | +| T0086 | Exfiltration via AI Agent Tool Invocation | Exfiltration | 20 | +| T0096 | AI Service API | Command and Control | 11 | +| T0098 | AI Agent Tool Credential Harvesting | Credential Access | 1 | +| T0110 | AI Agent Tool Poisoning | Persistence | 3 | +| T0115.002 | Publish Poisoned AI Artifacts: AI Agent Tools | Resource Development | 1 | ## OWASP Top 10 for LLM Applications 2026 Index @@ -202,11 +208,36 @@ visible rather than merely absent. |-------|-------|------------|-------------| | LLM01 | Prompt Injection | 12 | LLM01 | | LLM02 | Sensitive Information Disclosure | 16 | LLM02 | -| LLM03 | Excessive Agency | 22 | LLM06 | +| LLM03 | Excessive Agency | 24 | LLM06 | | LLM04 | Supply Chain | 12 | LLM03 | | LLM05 | Data and Model Poisoning | 0 | LLM04 | -| LLM06 | Unbounded Consumption | 3 | LLM10 | +| LLM06 | Unbounded Consumption | 6 | LLM10 | | LLM07 | Misinformation | 0 | LLM09 | | LLM08 | Hidden Context Exposure | 2 | LLM07, renamed and widened | | LLM09 | Vector and Embedding Weaknesses | 5 | LLM08 | | LLM10 | Improper Output Handling | 0 | LLM05 | + +## OWASP Top 10 for Agentic Applications 2026 Index + +The OWASP Top 10 for Agentic Applications (December 2025) names the risks that +exist because an application acts - holds tools, credentials and memory - rather +than only answers. The per-rule ASI values above are this project's assessment of +which risk a rule gives evidence of, not an OWASP mapping; OWASP publishes none +for detection content. A dash means the rule detects something the agentic list +does not cover, usually an adversary *using* AI rather than an agentic +application being attacked. The related LLM IDs are OWASP's own Appendix A cross- +map, which cites the 2025 list, translated to 2026 IDs through +`artifacts/schema/owasp.json`. + +| ASI | Title | Rule count | Related LLM (2026) | +|-----|-------|------------|--------------------| +| ASI01 | Agent Goal Hijack | 10 | LLM01, LLM03 | +| ASI02 | Tool Misuse and Exploitation | 6 | LLM03 | +| ASI03 | Identity and Privilege Abuse | 6 | LLM01, LLM02, LLM03 | +| ASI04 | Agentic Supply Chain Vulnerabilities | 16 | LLM04 | +| ASI05 | Unexpected Code Execution | 11 | LLM01, LLM10 | +| ASI06 | Memory and Context Poisoning | 5 | LLM01, LLM05, LLM09 | +| ASI07 | Insecure Inter-Agent Communication | 0 | LLM02, LLM03 | +| ASI08 | Cascading Failures | 0 | LLM01, LLM03, LLM05 | +| ASI09 | Human-Agent Trust Exploitation | 0 | LLM01, LLM03, LLM07, LLM10 | +| ASI10 | Rogue Agents | 0 | LLM02, LLM07 | diff --git a/README.md b/README.md index 92a2e88..a997c62 100644 --- a/README.md +++ b/README.md @@ -142,6 +142,35 @@ generated feeds in four downstream formats: | [Velociraptor](https://docs.velociraptor.app/) artifacts | Velociraptor hunts | | CSV / JSON | anything else — see [`artifacts/docs/api/`](artifacts/docs/api/) | +### Threat intel + +On top of the catalog sits a threat-intel layer: +- **Actor profiles:** 20 profiles, covering attributed groups and + reporter-named clusters. +- **Case studies:** 22, with 221 indicators. +- **Pinned frameworks:** ATLAS 2026.09, ATT&CK 19.2, CISA KEV, and the OWASP + LLM and Agentic 2026 lists. + +Each profile is derived from the cases and reported sightings that cite it. It +gives the techniques the actor uses, the rule in this repository that detects +each one, the catalogued tools the actor abused, and which of those tools' +artifacts to collect first. The site adds: +- a cross-filtering Threat intel view: ATLAS matrix with coverage gaps, + victimology, timeline, technique heatmap, detection backlog, actor similarity + and clusters +- a Maltego-style graph workbench +- a collection plan that generates a self-contained triage script (PowerShell or + bash) or the equivalent Velociraptor / KAPE command + +Feeds: [`intel.json`](artifacts/docs/api/intel.json), a +[STIX 2.1 bundle](artifacts/docs/api/stix/ai-dfir-intel.json) for OpenCTI or +MISP, and [Maltego import CSVs](artifacts/docs/api/graph/). Two scheduled +workflows keep it current: +- the framework pins refresh weekly and auto-merge when only reference data + changed +- new public reporting arrives as `intel-candidate` issues for a person to + research + For current counts — catalogued tools, documented artifacts, credential locations, MCP config paths, case studies, and the risk and confidence breakdowns — see the Contents table in [`artifacts/README.md`](artifacts/README.md). @@ -152,22 +181,22 @@ the one place those numbers are guaranteed current. ## Coverage overview -68 rule files containing 159 individual signatures — nine attack-class categories +70 rule files containing 161 individual signatures — nine attack-class categories plus a cross-tool endpoint set: -| Category | Files | Signatures | ATLAS Techniques | OWASP LLM | -|----------|-------|-----------:|------------------|-----------| -| LLM Prompt Injection | 8 | 10 | T0051, T0054, T0029 | LLM01, LLM07, LLM10 | -| MCP Attacks | 5 | 14 | T0010, T0104, T0110, T0086 | LLM03, LLM06 | -| Model Supply Chain | 8 | 23 | T0010, T0018, T0020 | LLM03, LLM04 | -| AI Infrastructure | 9 | 31 | T0011, T0017, T0019 | LLM10 | -| Copilot/Assistant Abuse | 8 | 19 | T0086, T0024 | LLM02, LLM06 | -| RAG / Vector DB | 5 | 17 | T0020 | LLM08 | -| Runtime AI-Malware | 8 | 16 | T0096, T0086 | LLM01, LLM06 | -| Agentic Orchestration & AI-Service C2 | 3 | 12 | T0096, T0086, T0054 | LLM06 | -| Agent Memory & Context Poisoning | 2 | 5 | T0080, T0080.000, T0086 | LLM01, LLM02, LLM06 | -| Endpoint (cross-tool) | 12 | 12 | T0053, T0081, T0082 | LLM02, LLM06, LLM03 | -| **Total** | **68** | **159** | | | +| Category | Files | Signatures | ATLAS Techniques | OWASP LLM 2026 | OWASP Agentic | +|----------|-------|-----------:|------------------|-----------|---------------| +| LLM Prompt Injection | 8 | 10 | T0051, T0054, T0029 | LLM01, LLM02, LLM06, LLM08 | ASI01 | +| MCP Attacks | 5 | 14 | T0010, T0115.002, T0110, T0086 | LLM02, LLM03, LLM04 | ASI02, ASI03, ASI04, ASI05 | +| Model Supply Chain | 8 | 23 | T0010, T0018, T0020 | LLM04 | ASI03, ASI04, ASI05 | +| AI Infrastructure | 9 | 31 | T0011, T0049, T0029 | LLM06 | — | +| Copilot/Assistant Abuse | 8 | 19 | T0086, T0024 | LLM02, LLM03, LLM04 | ASI01, ASI02, ASI03, ASI04, ASI05 | +| RAG / Vector DB | 5 | 17 | T0020 | LLM01, LLM02, LLM09 | ASI01, ASI06 | +| Runtime AI-Malware | 8 | 16 | T0096, T0086 | LLM01, LLM03 | — | +| Agentic Orchestration & AI-Service C2 | 3 | 12 | T0096, T0086, T0054 | LLM03 | ASI02 | +| Agent Memory & Context Poisoning | 2 | 5 | T0080, T0080.000, T0086 | LLM01, LLM02, LLM03 | ASI06 | +| Endpoint (cross-tool) | 14 | 14 | T0053, T0081, T0083, T0098 | LLM02, LLM03, LLM04, LLM06 | ASI02, ASI03, ASI04, ASI05 | +| **Total** | **70** | **161** | | | | The endpoint set lives in [`artifacts/detections/`](artifacts/detections/) and is scoped to agent behaviour on a host rather than to one attack class, so it applies diff --git a/artifacts/CHANGELOG.md b/artifacts/CHANGELOG.md index 6eb4981..7f225fa 100644 --- a/artifacts/CHANGELOG.md +++ b/artifacts/CHANGELOG.md @@ -2,6 +2,50 @@ Format based on Keep a Changelog. Entry IDs are permanent and never renumbered. +## [Unreleased] - 2026-09-30 + +### Added +- **Threat-intel layer.** + - 20 actor profiles (`artifacts/intel/actors/`, `AIRT-TA-0001` to `-0020`). + - Case studies `AIRT-CS-0015` to `-0022`: + - s1ngularity/Nx using the victim's AI CLIs + - UNC6780 DUSTMAKER and trojanised MCP servers + - MIDNIGHT NEPTUNE Claude Code hook poisoning + - five Anthropic September 2026 clusters, carrying 131 indicators from its + IOC release + - Closed schemas for case studies and actors, plus a sector and region + vocabulary. + - `scripts/intel_graph.py` derives the entity graph, per-actor + hunt, detect and collect tables, coverage gaps, and analytics: similarity, + clusters, co-occurrence and a detection backlog. +- **Feeds:** `docs/api/intel.json`, a STIX 2.1 bundle and Maltego import CSVs. +- **Reference data:** + - ATLAS 2026.09, pinned with tactics, mitigations and case studies. + - ATT&CK groups and campaigns. + - The OWASP LLM 2026 and Agentic 2026 lists (`schema/owasp.json`). + - CISA KEV status for every cited CVE (`schema/cve-status.json`), gated by + `cve_status.py`. + - OWASP Agentic (ASI) values on every rule in MAPPINGS. +- **Detections:** `ai_cli_permission_bypass_invocation.yml` and + `ai_agent_hook_config_modification.yml`. +- **Site:** + - a Threat intel view with cross-filtering, pivots, timeline, ATLAS matrix + and heatmaps + - a graph workbench (Cytoscape.js, vendored and hash-pinned) + - a per-OS triage script generator on the collection plan + - a resizable drawer +- **Automation:** `framework-refresh.yml`, a weekly re-pin that auto-merges when + guarded, and `intel-watch.yml`, weekly `intel-candidate` issues. + +### Fixed +- `AML.T0104` and `AML.T0019` were retired upstream in 2026.07 and have been + remapped. The id gate now covers every surface, not just the catalog. +- The Ray rule claimed CISA KEV listing, and CVE-2023-48022 is not listed. +- MAPPINGS section 04 was dropped by the site parser. +- `atlas.aml-tNNNN` tags were discarded. +- ATT&CK ids were read as ATLAS ids. +- The credential-access rule was mapped to T0082 instead of T0083. + ## [2.0.0] - 2026-08-11 ### Added diff --git a/artifacts/LICENSE-DATA b/artifacts/LICENSE-DATA index 0ba3e66..42fc4ca 100644 --- a/artifacts/LICENSE-DATA +++ b/artifacts/LICENSE-DATA @@ -2,7 +2,7 @@ Creative Commons Attribution 4.0 International (CC BY 4.0) Copyright (c) 2026 Raymond DePalma -Applies to: catalog/, case-studies/, docs/api/ +Applies to: catalog/, case-studies/, intel/, docs/api/ You are free to: Share - copy and redistribute the material in any medium or format @@ -27,7 +27,17 @@ Attribution format: DISCLAIMER This catalog is provided for defensive security research and incident response. Entries document publicly observable software artifacts. Presence of a -catalogued tool on a host is not evidence of compromise. The "risk" field +catalogued tool on a host is not evidence of compromise. + +THIRD-PARTY FACTS +Case studies and actor profiles cite third-party reporting. Where a source is +licensed CC BY-SA 4.0 (the AI Incident Database, OWASP GenAI Security Project +documents), only facts are taken from it - identifiers, dates, names, category +mappings and links - and every summary is original wording, so this data remains +CC BY 4.0. Indicators are republished from the cited reports. MITRE ATLAS data +is Apache-2.0; MITRE ATT&CK is used under its terms of use. An attribution +recorded here is the cited party's assessment, reported with its stated +confidence, not a finding of this project. The "risk" field describes exposure if a tool is misused or misconfigured, not a claim that any tool or vendor is malicious. No warranty is made as to accuracy or completeness; verify artifact locations in your own environment before relying diff --git a/artifacts/README.md b/artifacts/README.md index 330ea6f..6dd0df5 100644 --- a/artifacts/README.md +++ b/artifacts/README.md @@ -38,8 +38,8 @@ every field carries a `confidence` rating tied to how it was sourced. | Documented artifacts | **622** | | Credential locations | **164** | | MCP config locations | **66** | -| Sigma detection rules | **12** | -| Case studies | **14** | +| Sigma detection rules | **14** | +| Case studies | **22** | Artifacts counts every row the catalog yields, so it matches the site and `build_site.py --check`. Sigma rules counts `detections/sigma/` only - the @@ -60,6 +60,7 @@ Categories: llm-runtime (11), coding-agent-ide (10), agent-framework (9), coding artifacts/ ├── catalog/ one YAML file per tool ├── case-studies/ documented incidents with IOC blocks +├── intel/ threat actor profiles + intel-watch sources ├── detections/ vendor-neutral Sigma rules + osquery pack ├── schema/ JSON Schema + entry template ├── scripts/ validate, export, normalize @@ -78,6 +79,9 @@ format can change without breaking you: | `docs/api/collection-targets.txt` | High-value paths, for triage sweeps | | `docs/api/detections.json` | Sigma rule index with levels and tags | | `docs/api/forensicartifacts.yaml` | ForensicArtifacts format — Plaso / GRR / Timesketch | +| `docs/api/intel.json` | Actors with derived TTPs, victims, detections and collect rows; cases; the entity graph; stats and analytics | +| `docs/api/stix/ai-dfir-intel.json` | STIX 2.1 bundle - intrusion sets, reports, indicators, attack patterns, relationships (deterministic ids) | +| `docs/api/graph/maltego-*.csv` | Entity and link tables for Maltego's table import | ## Detections @@ -88,7 +92,7 @@ language anywhere: sigma convert -t splunk detections/sigma/ # or elasticsearch, sentinel, ... ``` -All 12 rules are verified in CI to compile against a real backend, so a rule that +All 14 rules are verified in CI to compile against a real backend, so a rule that would not convert cannot merge. See `detections/README.md` for the rule table and honest notes on tuning — several rules are deliberately `level: low` because on a developer estate they describe the product working correctly. diff --git a/artifacts/case-studies/airt-cs-0001.yml b/artifacts/case-studies/airt-cs-0001.yml index c6e22b0..8e79caf 100644 --- a/artifacts/case-studies/airt-cs-0001.yml +++ b/artifacts/case-studies/airt-cs-0001.yml @@ -55,3 +55,6 @@ references: url: https://www.stepsecurity.io/blog/pythagora-io-gpt-pilot-compromised-on-github-shai-hulud-credential-stealer-blocked-by-python-linter - title: "SafeDep Threat Intelligence - Pythagora-io/gpt-pilot IOC record" url: https://safedep.io/ti/ioc/github_repo/github_repo-5278c0f8c305/ + +owasp_agentic: + - ASI04 diff --git a/artifacts/case-studies/airt-cs-0002.yml b/artifacts/case-studies/airt-cs-0002.yml index ac0f014..8bea54b 100644 --- a/artifacts/case-studies/airt-cs-0002.yml +++ b/artifacts/case-studies/airt-cs-0002.yml @@ -4,7 +4,7 @@ id: AIRT-CS-0002 title: postmark-mcp npm Backdoor - First In-the-Wild Malicious MCP Server date_range: 2025-09-17 (published) to ~2025-09-25 (removed) -disclosed: 2025-09 +disclosed: "2025-09" affects: MCP ecosystem confidence: high basis: >- @@ -13,13 +13,13 @@ basis: >- registry record, and corroborated independently by Snyk and Qualys. atlas: - AML.T0010 - - AML.T0104 + - AML.T0115.002 summary: "npm package postmark-mcp v1.0.16, published by user 'phanpak', silently BCC'd every email processed through it to an attacker-controlled address. 1,643 downloads before removal. Koi Security called it the first real-world sighting of a malicious MCP server." iocs: - type: package value: "postmark-mcp@1.0.16" description: Backdoored version - - type: npm-user + - type: account value: phanpak description: Publishing account - type: email @@ -42,3 +42,6 @@ references: url: https://snyk.io/blog/malicious-mcp-server-on-npm-postmark-mcp-harvests-emails/ - title: "Dark Reading - Sneaky, Malicious MCP Server Exfiltrates Secrets via BCC" url: https://www.darkreading.com/application-security/malicious-mcp-server-exfiltrates-secrets-bcc + +owasp_agentic: + - ASI04 diff --git a/artifacts/case-studies/airt-cs-0003.yml b/artifacts/case-studies/airt-cs-0003.yml index 4454cb8..ac0667a 100644 --- a/artifacts/case-studies/airt-cs-0003.yml +++ b/artifacts/case-studies/airt-cs-0003.yml @@ -51,3 +51,10 @@ references: url: https://www.cisa.gov/known-exploited-vulnerabilities-catalog - title: "Trend Micro - Langflow CVE-2025-3248 exploited to deliver the Flodrix botnet" url: https://www.trendmicro.com/en_us/research/25/f/langflow-flodrix-botnet.html + +owasp_agentic: + - ASI05 +external_ids: + cve: + - CVE-2025-3248 + - CVE-2026-5027 diff --git a/artifacts/case-studies/airt-cs-0004.yml b/artifacts/case-studies/airt-cs-0004.yml index eb08822..59538d8 100644 --- a/artifacts/case-studies/airt-cs-0004.yml +++ b/artifacts/case-studies/airt-cs-0004.yml @@ -23,6 +23,8 @@ atlas: - AML.T0053 - AML.T0054 - AML.T0096 + - AML.T0116 + - AML.T0117 summary: >- Anthropic assessed with high confidence that a Chinese state-sponsored actor built an autonomous attack framework around Claude Code driving MCP servers and @@ -72,3 +74,29 @@ references: url: https://attack.mitre.org/campaigns/C0062/ - title: "BleepingComputer - Anthropic claims of Claude AI-automated cyberattacks met with doubt" url: https://www.bleepingcomputer.com/news/security/anthropic-claims-of-claude-ai-automated-cyberattacks-met-with-doubt/ + +owasp_agentic: + - ASI01 + - ASI02 +actors: + - ref: AIRT-TA-0002 + role: operator + link_confidence: medium + attributed_by: Anthropic + stated_confidence: '"We assess with high confidence" - a Chinese state-sponsored group' + reference: https://www.anthropic.com/news/disrupting-AI-espionage +victims: + sectors: + - information-technology + - financial-services + - chemical + - government + org_count: + value: 30 + qualifier: approx + basis: Anthropic names large tech companies, financial institutions, chemical manufacturers and government agencies; ATLAS AML.CS0069 records the same four sectors. No countries were named. +external_ids: + attack_campaign: + - C0062 + atlas_case_study: + - AML.CS0069 diff --git a/artifacts/case-studies/airt-cs-0005.yml b/artifacts/case-studies/airt-cs-0005.yml index 10f9b0b..bd11bb9 100644 --- a/artifacts/case-studies/airt-cs-0005.yml +++ b/artifacts/case-studies/airt-cs-0005.yml @@ -79,3 +79,7 @@ references: url: https://www.microsoft.com/en-us/security/blog/2025/11/03/sesameop-novel-backdoor-uses-openai-assistants-api-for-command-and-control/ - title: "The Hacker News - Microsoft Detects SesameOp Backdoor Using OpenAI's API as a Stealth Command Channel" url: https://thehackernews.com/2025/11/microsoft-detects-sesameop-backdoor.html + +external_ids: + atlas_case_study: + - AML.CS0042 diff --git a/artifacts/case-studies/airt-cs-0007.yml b/artifacts/case-studies/airt-cs-0007.yml index 0e762bf..0e4159b 100644 --- a/artifacts/case-studies/airt-cs-0007.yml +++ b/artifacts/case-studies/airt-cs-0007.yml @@ -79,3 +79,18 @@ references: url: https://www.catonetworks.com/blog/cato-ctrl-threat-research-analyzing-lamehug/ - title: "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)" url: https://services.google.com/fh/files/misc/advances-in-threat-actor-usage-of-ai-tools-en.pdf + +actors: + - ref: AIRT-TA-0001 + role: operator + link_confidence: medium + attributed_by: CERT-UA (UAC-0001); GTIG + stated_confidence: CERT-UA - moderate confidence; GTIG - "the Russian government-backed actor APT28 (aka FROZENLAKE)" + reference: https://cert.gov.ua/article/6284730 +victims: + sectors: + - government + - defense-industrial-base + countries: + - UA + basis: CERT-UA and GTIG both describe targeting of Ukraine's security and defence sector. diff --git a/artifacts/case-studies/airt-cs-0008.yml b/artifacts/case-studies/airt-cs-0008.yml index d01cf72..a8a6ea6 100644 --- a/artifacts/case-studies/airt-cs-0008.yml +++ b/artifacts/case-studies/airt-cs-0008.yml @@ -62,3 +62,9 @@ references: url: https://arxiv.org/abs/2509.10540 - title: "The Hacker News - Zero-Click AI Vulnerability Exposes Microsoft 365 Copilot Data Without User Interaction" url: https://thehackernews.com/2025/06/zero-click-ai-vulnerability-exposes.html + +owasp_agentic: + - ASI01 +external_ids: + cve: + - CVE-2025-32711 diff --git a/artifacts/case-studies/airt-cs-0009.yml b/artifacts/case-studies/airt-cs-0009.yml index 5c61435..81b173b 100644 --- a/artifacts/case-studies/airt-cs-0009.yml +++ b/artifacts/case-studies/airt-cs-0009.yml @@ -70,3 +70,14 @@ references: url: https://osv.dev/vulnerability/CVE-2025-49596 - title: "NVD - CVE-2025-54136 (MCPoison)" url: https://nvd.nist.gov/vuln/detail/CVE-2025-54136 + +owasp_agentic: + - ASI04 + - ASI05 +external_ids: + cve: + - CVE-2025-49596 + - CVE-2025-54136 + - CVE-2025-6514 + ghsa: + - GHSA-6xpm-ggf7-wc3p diff --git a/artifacts/case-studies/airt-cs-0010.yml b/artifacts/case-studies/airt-cs-0010.yml index a65ea3c..5a8b1b4 100644 --- a/artifacts/case-studies/airt-cs-0010.yml +++ b/artifacts/case-studies/airt-cs-0010.yml @@ -66,3 +66,6 @@ references: url: https://atlas.mitre.org/techniques/AML.T0080.000 - title: "The Hacker News - ChatGPT macOS Flaw Could've Enabled Long-Term Spyware via Memory Function" url: https://thehackernews.com/2024/09/chatgpt-macos-flaw-couldve-enabled-long.html + +owasp_agentic: + - ASI06 diff --git a/artifacts/case-studies/airt-cs-0011.yml b/artifacts/case-studies/airt-cs-0011.yml index 8673034..96d947f 100644 --- a/artifacts/case-studies/airt-cs-0011.yml +++ b/artifacts/case-studies/airt-cs-0011.yml @@ -59,3 +59,13 @@ references: url: https://www.helpnetsecurity.com/2026/02/11/ai-recommendation-memory-poisoning-attacks/ - title: "The Hacker News - Microsoft Finds Summarize with AI Prompts Manipulating Chatbot Recommendations" url: https://thehackernews.com/2026/02/microsoft-finds-summarize-with-ai.html + +owasp_agentic: + - ASI06 +victims: + sectors: + - consumers + basis: Users of assistants with persistent memory; ATLAS AML.CS0072 names Microsoft 365 Copilot, ChatGPT, Claude, Perplexity and Grok users. +external_ids: + atlas_case_study: + - AML.CS0072 diff --git a/artifacts/case-studies/airt-cs-0012.yml b/artifacts/case-studies/airt-cs-0012.yml index 60fd494..2d1dcbe 100644 --- a/artifacts/case-studies/airt-cs-0012.yml +++ b/artifacts/case-studies/airt-cs-0012.yml @@ -58,3 +58,6 @@ references: url: https://www.usenix.org/conference/usenixsecurity25/presentation/zou-poisonedrag - title: "USENIX - PoisonedRAG paper (PDF)" url: https://www.usenix.org/system/files/usenixsecurity25-zou-poisonedrag.pdf + +owasp_agentic: + - ASI06 diff --git a/artifacts/case-studies/airt-cs-0013.yml b/artifacts/case-studies/airt-cs-0013.yml index 0920688..0fdef76 100644 --- a/artifacts/case-studies/airt-cs-0013.yml +++ b/artifacts/case-studies/airt-cs-0013.yml @@ -66,3 +66,13 @@ references: url: https://cdn.prod.website-files.com/69944dd945f20ca4a27a7c47/69d8bb5aea59e31efb3b8a7f_Tech_Report_ai_breach_mex_gov.pdf - title: "Live Science - Hackers used AI to steal hundreds of millions of Mexican government and private citizen records" url: https://www.livescience.com/technology/artificial-intelligence/hackers-used-ai-to-steal-hundreds-of-millions-of-mexican-government-and-private-citizen-records-in-one-of-the-largest-cybersecurity-breaches-ever + +victims: + sectors: + - government + countries: + - MX + org_count: + value: 9 + qualifier: exact + basis: Nine Mexican federal and state government agencies, per the cited reporting. diff --git a/artifacts/case-studies/airt-cs-0014.yml b/artifacts/case-studies/airt-cs-0014.yml index f76a7e3..9d330e0 100644 --- a/artifacts/case-studies/airt-cs-0014.yml +++ b/artifacts/case-studies/airt-cs-0014.yml @@ -71,3 +71,11 @@ references: url: https://www.oligo.security/blog/shadowray-2-0-attackers-turn-ai-against-itself-in-global-campaign-that-hijacks-ai-into-self-propagating-botnet - title: "NVD - CVE-2023-48022" url: https://nvd.nist.gov/vuln/detail/CVE-2023-48022 + +external_ids: + attack_campaign: + - C0045 + atlas_case_study: + - AML.CS0023 + cve: + - CVE-2023-48022 diff --git a/artifacts/case-studies/airt-cs-0015.yml b/artifacts/case-studies/airt-cs-0015.yml new file mode 100644 index 0000000..bd990df --- /dev/null +++ b/artifacts/case-studies/airt-cs-0015.yml @@ -0,0 +1,94 @@ +# AI agent artifact case study +# AIRT-CS-0015 - s1ngularity: A Supply-Chain Payload That Used the Victim's Own AI CLIs + +id: AIRT-CS-0015 +title: "s1ngularity - A Supply-Chain Payload That Used the Victim's Own AI CLIs" +date_range: 2025-08-21 (workflow compromised) to 2025-08-26 (malicious versions live about four hours) +disclosed: "2025-08-26" +affects: + - AIRT-0001 + - AIRT-0037 + - AIRT-0008 +confidence: high +basis: >- + The Nx maintainers' own GitHub security advisory documents the affected + versions, the timeline, /tmp/inventory.txt, the s1ngularity-repository + exfiltration naming and the shell-profile change. The specific AI CLIs and the + flags used to invoke them are not stated in the advisory text retrieved for + this entry. They come from independent analyses by Wiz, Snyk and StepSecurity, + which agree with one another, so that part of the record is third-party + corroborated rather than vendor-documented. +atlas: + - AML.T0010 + - AML.T0053 + - AML.T0055 +attack: + - T1195.002 + - T1552.001 + - T1059 +owasp_agentic: + - ASI04 + - ASI05 + - ASI02 +summary: >- + A command-injection flaw in the Nx repository's pull-request workflow let an + attacker obtain the npm publish token and push trojanised versions of the nx + build system and several @nx plugins. Their postinstall script checked which AI + coding CLIs were installed. It then ran Claude Code, Gemini CLI and Amazon Q with + the flag that disables tool approval, and prompted them to search the + filesystem for configuration, key and wallet files. The results went to + /tmp/inventory.txt and were published, base64-encoded, to a public repository + under the victim's own GitHub account. It also appended a shutdown command to + the victim's shell profiles. The Nx Console VS Code extension installed the + latest nx during version checks, so some victims were infected without ever + running an npm install. +iocs: + - type: package + value: "nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0" + description: Affected versions per the Nx advisory + - type: file + value: /tmp/inventory.txt + description: Secret inventory written by the AI CLI run; its presence proves the payload executed + - type: pattern + value: GitHub repository name containing s1ngularity-repository + description: Exfiltration destination created under the victim's own account - check the GitHub audit log + - type: config + value: "sudo shutdown -h 0 appended to ~/.bashrc and ~/.zshrc" + description: Shell profile modification + - type: behavior + value: "claude --dangerously-skip-permissions, gemini --yolo, q --trust-all-tools started by node from an npm lifecycle script" + description: The AI CLIs did the reconnaissance; the parent process is the evidence +response_actions: + - phase: contain + action: Search every developer host and CI runner for /tmp/inventory.txt and for AI CLI processes whose parent was node, npm or the Nx Console extension host during the window. + - phase: contain + action: Search the organisation's GitHub audit log and every member account for repositories named s1ngularity-repository. + - phase: eradicate + action: Remove the added lines from .bashrc and .zshrc, uninstall the affected nx versions and clear the npm, yarn and pnpm caches. + - phase: recover + action: "Rotate everything the inventory could have reached: GitHub tokens and the GitHub CLI OAuth grant, npm tokens, SSH keys, cloud keys and every AI provider API key found by the catalog's credential rows." + - phase: harden + action: Treat an installed AI CLI as a capability any local process can borrow. Remove bypass flags from shell aliases and wrappers, and alert when a package manager starts one. +lesson: >- + The malware shipped no scanner. It borrowed the developer's agent, which + already had filesystem access, and passed it the one flag that removes the + human from the loop. That makes the agent's own session store part of the + crime scene. The prompt and every file the agent opened may sit in its + transcript, which is why the catalog's session-log rows for these three tools + belong in the collection order here. +detections: + - ai_cli_permission_bypass_invocation.yml + - ai_agent_spawning_shell.yml + - ai_agent_credential_file_access.yml +references: + - title: "Nx - Security advisory GHSA-cxm3-wv7p-598c: malicious versions of Nx and some supporting plugins were published" + url: https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c + - title: "Wiz - s1ngularity: supply chain attack leaks secrets on GitHub" + url: https://www.wiz.io/blog/s1ngularity-supply-chain-attack + - title: "Snyk - Weaponizing AI Coding Agents for Malware in the Nx Malicious Package Security Incident" + url: https://snyk.io/blog/weaponizing-ai-coding-agents-for-malware-in-the-nx-malicious-package/ + - title: "StepSecurity - s1ngularity: Popular Nx Build System Package Compromised with Data-Stealing Malware" + url: https://www.stepsecurity.io/blog/supply-chain-security-alert-popular-nx-build-system-package-compromised-with-data-stealing-malware +external_ids: + ghsa: + - GHSA-cxm3-wv7p-598c diff --git a/artifacts/case-studies/airt-cs-0016.yml b/artifacts/case-studies/airt-cs-0016.yml new file mode 100644 index 0000000..20601fa --- /dev/null +++ b/artifacts/case-studies/airt-cs-0016.yml @@ -0,0 +1,94 @@ +# AI agent artifact case study +# AIRT-CS-0016 - UNC6780 (TeamPCP): DUSTMAKER and Trojanised MCP Servers + +id: AIRT-CS-0016 +title: "UNC6780 (TeamPCP) - DUSTMAKER and Trojanised MCP Servers" +date_range: Mar 2026 (supply-chain activity begins) to 8 Sep 2026 (GTIG report) +disclosed: "2026-09-08" +affects: + - AIRT-0001 + - AIRT-0002 +confidence: medium +basis: >- + A single reporting party. GTIG attributes the operations to UNC6780, and in + May 2026 it also reported that TeamPCP claimed responsibility for supply-chain + compromises that included LiteLLM. The package and repository names and the + workspace-directory behaviour are GTIG's statements. They have not been + corroborated by a second analysis retrieved for this entry. +atlas: + - AML.T0010 + - AML.T0115.002 + - AML.T0081 + - AML.T0055 +attack: + - T1195.002 + - T1552.001 + - T1070 +owasp_agentic: + - ASI04 + - ASI03 +actors: + - ref: AIRT-TA-0005 + role: operator + link_confidence: medium + attributed_by: GTIG + stated_confidence: '"Operations attributed to the financially motivated threat actor UNC6780 (TeamPCP)"' + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +victims: + sectors: + - software-supply-chain + basis: GTIG describes compromises of PyPI, npm and Docker Hub packages and of organisational GitHub repositories. Downstream victims are whoever installed them. +summary: >- + GTIG reports that UNC6780 compromised developer accounts and published + trojanised forks of legitimate MCP servers to PyPI, including tiktoken_mcp. It + also injected code into official organisational repositories such as + azure-functions-mcp-extension. Its DUSTMAKER credential stealer detects CI/CD + environments, extracts OIDC tokens from GitHub Actions and deletes workflow + logs. On developer hosts it drops or modifies files in the hidden workspace + directories AI coding assistants read, .claude/, .cursor/ and .vscode/. That + turns the assistant's own configuration into the persistence and execution + point. Earlier in 2026 GTIG tied the same actor to compromises of Trivy, + Checkmarx and LiteLLM, the last of which exposed AI provider secrets. +iocs: + - type: package + value: tiktoken_mcp (PyPI) + description: Trojanised fork of a legitimate MCP server + - type: pattern + value: Injected code in azure-functions-mcp-extension + description: Official organisational repository compromised through a developer account + - type: malware + value: DUSTMAKER + description: Credential stealer with CI/CD and AI-workspace targeting + - type: directory + value: "/.claude/, /.cursor/, /.vscode/" + description: Files dropped or modified in hidden AI assistant workspace directories + - type: behavior + value: GitHub Actions workflow run logs deleted after execution + description: Anti-forensics; the absence of runs is the signal +response_actions: + - phase: contain + action: Inventory MCP servers installed from PyPI and npm across developer hosts and remove any trojanised fork. The catalog's MCP config rows give the files to read. + - phase: contain + action: Diff .claude/, .cursor/ and .vscode/ in every affected repository against the last known-good commit. A file there that no commit explains is the finding. + - phase: eradicate + action: Pin MCP servers and AI gateway libraries to verified versions and rebuild CI images. + - phase: recover + action: Rotate GitHub Actions OIDC trust, cloud credentials reachable from CI, and every AI provider key a compromised gateway library could have read. + - phase: harden + action: Retain workflow run logs outside GitHub so deletion from the API does not remove the record. +lesson: >- + The AI assistant's workspace directory is now a place attackers write. It is + read automatically, trusted implicitly and rarely reviewed in pull requests. + Collection has to include it as evidence, not skip it as editor noise. +detections: + - ai_agent_hook_config_modification.yml + - ai_agent_mcp_config_modification.yml + - mcp_tool_poisoning.yar +references: + - title: "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)" + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai + - title: "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)" + url: https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access +external_ids: + vendor_cluster: + - UNC6780 diff --git a/artifacts/case-studies/airt-cs-0017.yml b/artifacts/case-studies/airt-cs-0017.yml new file mode 100644 index 0000000..38fb08e --- /dev/null +++ b/artifacts/case-studies/airt-cs-0017.yml @@ -0,0 +1,78 @@ +# AI agent artifact case study +# AIRT-CS-0017 - MIDNIGHT NEPTUNE: Poisoned Repository Config and Claude Code Hooks + +id: AIRT-CS-0017 +title: "MIDNIGHT NEPTUNE - Poisoned Repository Config and Claude Code Hooks" +date_range: reported 8 Sep 2026; activity window not stated +disclosed: "2026-09-08" +affects: AIRT-0001 +confidence: medium +basis: >- + A single reporting party, and a short account. GTIG reports that the cluster + poisoned internal repository configurations, altered Claude CLI hooks and + deployed the SOMBERMEME backdoor on developer interaction. No hashes, paths or + hook contents were published, and nothing retrieved for this entry + corroborates it. It is recorded because the mechanism lands squarely on a + catalogued artifact, not because the detail is rich. +atlas: + - AML.T0081 + - AML.T0011 +attack: + - T1546 + - T1195.002 +owasp_agentic: + - ASI04 + - ASI05 +actors: + - ref: AIRT-TA-0004 + role: operator + link_confidence: medium + attributed_by: GTIG + stated_confidence: '"financially motivated North Korea-nexus threat clusters formerly tracked as UNC1069"' + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +victims: + sectors: + - cryptocurrency + basis: GTIG describes the cluster's AI use as supporting cryptocurrency theft. +summary: >- + GTIG reports that MIDNIGHT NEPTUNE, the DPRK-nexus financially motivated + cluster formerly tracked as UNC1069, poisoned internal repository + configurations and altered Claude CLI hooks. It then deployed the SOMBERMEME + backdoor once a developer interacted with the repository. A Claude Code hook is + a shell command the agent runs on its own lifecycle events, from settings that + can live inside the repository. A developer who opened the project with the + agent ran the attacker's command without ever executing the attacker's code + directly. +iocs: + - type: malware + value: SOMBERMEME + description: Backdoor delivered on developer interaction + - type: config + value: Hooks added to or altered in .claude/settings.json or .claude/settings.local.json + description: The persistence and trigger; compare against repository history + - type: behavior + value: Shell or interpreter child of the Claude Code process at session start, before any user prompt + description: A hook firing looks like this; an agent acting on a prompt does not +response_actions: + - phase: contain + action: Collect .claude/settings.json and settings.local.json from every clone of the affected repositories and from ~/.claude/, before anyone opens the project again. + - phase: eradicate + action: Remove hooks that no commit by a known developer explains, and hunt for SOMBERMEME on every host where the agent opened the repository. + - phase: recover + action: Rotate credentials that were in reach of a developer shell on those hosts, prioritising wallet keys and exchange API keys given the cluster's motivation. + - phase: harden + action: Review .claude/ in pull requests as executable code, not editor configuration. +lesson: >- + An agent's hook configuration is an autostart entry that travels with a git + clone. The catalog records where it lives. This case is why that row is + collected first and diffed against history, not just copied. +detections: + - ai_agent_hook_config_modification.yml + - ai_agent_spawning_shell.yml +references: + - title: "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)" + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +external_ids: + vendor_cluster: + - MIDNIGHT NEPTUNE + - UNC1069 diff --git a/artifacts/case-studies/airt-cs-0018.yml b/artifacts/case-studies/airt-cs-0018.yml new file mode 100644 index 0000000..7f77e0a --- /dev/null +++ b/artifacts/case-studies/airt-cs-0018.yml @@ -0,0 +1,243 @@ +# AI agent artifact case study +# AIRT-CS-0018 - GTG-20006 - Russian State-Nexus Espionage Run Through AI Workflows +# Indicators: Anthropic September 2026 IOC release, cyber-operations rows only, values as published (defanged). + +id: AIRT-CS-0018 +title: GTG-20006 - Russian State-Nexus Espionage Run Through AI Workflows +date_range: Dec 2025 to Aug 2026 +disclosed: '2026-09-10' +affects: Claude models and Claude Code skills on the actor's side - no catalogued tool on + victim hosts +confidence: medium +basis: A single reporting party, the provider whose models were used, with a published indicator + set of 55 domains, addresses, file names and hashes. The link to Midnight Blizzard is Anthropic's + statement that its attribution is consistent with public reporting. It is not an independent + attribution and is recorded as such. +contested: Anthropic ties the cluster to Midnight Blizzard only by consistency with public + reporting. Treat the Midnight Blizzard link as an assessment, not an identity. +atlas: +- AML.T0016.002 +- AML.T0103 +- AML.T0116 +- AML.T0117 +attack: +- T1566 +- T1528 +actors: +- ref: AIRT-TA-0016 + role: operator + link_confidence: medium + attributed_by: Anthropic + stated_confidence: '"Our attribution is consistent with public reporting linking the actor + to Midnight Blizzard."' + reference: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage +victims: + sectors: + - government + - defense-industrial-base + - ngo-think-tank + countries: + - UA + org_count: + value: 20 + qualifier: at-least + basis: 'Anthropic: more than 20 organisations, including government ministries, defence + and intelligence bodies, embassies and diplomatic missions, think tanks and defence-industrial + companies, with Ukrainian government bodies prominent.' +summary: 'Anthropic reports a Russian-speaking operator whose tradecraft and targeting it + assesses as consistent with Russian state-nexus espionage. Between December 2025 and August + 2026 the operator used Claude models across reconnaissance, device-code phishing infrastructure, + bulk collection and keeping access. The human operator mostly edited the Claude Code skills + that drove the workflows and let the workflows run. Victim-side artefacts are conventional: + Windows implants, phishing domains and device-code phishing infrastructure.' +iocs: +- type: domain + value: ad-g[.]org + description: C2 domain (role c2, handling detect-or-block) +- type: domain + value: cdncounter[.]net + description: Actor infrastructure domain (role infrastructure, handling detect-or-block) +- type: domain + value: chamber-ua[.]org + description: Lookalike of a Ukrainian chamber organization (role phishing, handling detect-or-block) +- type: domain + value: chathamhouse[.]eu + description: Lookalike of Chatham House (role phishing, handling detect-or-block) +- type: domain + value: docs-viewer[.]org + description: C2 nginx reverse proxy (role c2, handling detect-or-block) +- type: domain + value: itechx[.]tel + description: Actor identity domain (role infrastructure, handling detect-or-block) +- type: domain + value: m365-owa[.]com + description: Microsoft 365 Phishing (role phishing, handling detect-or-block) +- type: domain + value: meridian-protocol[.]org + description: Operator/lure infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: meridiangroup-corp[.]com + description: Operator/lure infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: metricwave[.]org + description: Operator/lure infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: mgsend[.]org + description: Operator/lure infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: ms365-device[.]com + description: Microsoft 365 Phishing (role phishing, handling detect-or-block) +- type: domain + value: ms365-live[.]com + description: Microsoft 365 Phishing (role phishing, handling detect-or-block) +- type: domain + value: my-invite[.]org + description: Actor phishing domain (role phishing, handling detect-or-block) +- type: domain + value: mygreatmarket[.]com + description: ClickFix cookie-exfil C2 (role c2, handling detect-or-block) +- type: domain + value: mygreatmarket[.]org + description: ClickFix cookie-exfil C2 (role c2, handling detect-or-block) +- type: domain + value: owa-ms365[.]com + description: Microsoft 365 Phishing (role phishing, handling detect-or-block) +- type: domain + value: projectnightcrawler[.]dev + description: Operator/lure infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: russianearabroad[.]com + description: ClickFix lure (role phishing, handling detect-or-block) +- type: domain + value: russianearabroad[.]org + description: Actor persona domain (role infrastructure, handling detect-or-block) +- type: domain + value: static-ms[.]live + description: Operator/lure infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: statistic-ms[.]live + description: Primary RAT C2 domain (role c2, handling detect-or-block) +- type: domain + value: stuseamandesilt[.]org + description: Campaign base domain (role infrastructure, handling detect-or-block) +- type: domain + value: ukrinform-share[.]net + description: Lookalike of Ukrinform (role phishing, handling detect-or-block) +- type: domain + value: wa-connect[.]eu + description: ClickFix cookie exfil C2 (role c2, handling detect-or-block) +- type: domain + value: wa-meeting[.]com + description: WhatsApp Web pairing code phishing domain (role phishing, handling detect-or-block) +- type: email + value: anna.manager@russianearabroad[.]net + description: Phishing persona address (role phishing, handling detect-or-block) +- type: email + value: events@embassy-protocol[.]int + description: Phishing persona address (role phishing, handling detect-or-block) +- type: file + value: WUEngine.exe + description: Malware file name. Windows malware (role malware, handling detect-or-block) +- type: file + value: client_20260507093021_4286d211_x64.exe + description: Malware build artifact (role malware, handling detect-or-block) +- type: file + value: fix_network.apk + description: Android malware payload (role malware, handling detect-or-block) +- type: file + value: msedgeupdate_v3.exe + description: Malware implant build (role malware, handling detect-or-block) +- type: domain + value: api.stuseamandesilt[.]org + description: Campaign C2 (role c2, handling detect-or-block) +- type: domain + value: cdn.stuseamandesilt[.]org + description: Campaign malware delivery (role malware_delivery, handling detect-or-block) +- type: domain + value: mslivetest.duckdns[.]org + description: Dynamic-DNS C2 (role c2, handling detect-or-block) +- type: domain + value: pdfviewer2024.b-cdn[.]net + description: Malware payload domain (role malware_delivery, handling detect-or-block) +- type: domain + value: static.cdncounter[.]net + description: Exploit/payload delivery hostname (role malware_delivery, handling detect-or-block) +- type: domain + value: teams.ms365-live[.]com + description: Microsoft 365 Phishing (role phishing, handling detect-or-block) +- type: domain + value: update.stuseamandesilt[.]org + description: Campaign subdomain (role malware_delivery, handling detect-or-block) +- type: ip + value: 104.145.210[.]184 + description: Embassy Kit device-code phishing VPS (role phishing, handling detect-or-block) +- type: ip + value: 104.194.149[.]228 + description: Phishing VPS (role phishing, handling detect-or-block) +- type: ip + value: 104.194.151[.]133 + description: Primary C2 VPS (role c2, handling detect-or-block) +- type: ip + value: 104.194.159[.]55 + description: C2 holding exfiltrated browser-data zips (role c2, handling detect-or-block) +- type: ip + value: 144.172.114[.]192 + description: C2 proxy IP / operator VPS (role c2, handling detect-or-block) +- type: ip + value: 148.135.195[.]111 + description: C2 Endpoint (role c2, handling detect-or-block) +- type: ip + value: 149.54.42[.]106 + description: Operator/operational infrastructure (role infrastructure, handling detect-or-block) +- type: ip + value: 185.198.234[.]101 + description: C2 server (role c2, handling detect-or-block) +- type: ip + value: 185.198.234[.]26 + description: Operator/operational infrastructure (role infrastructure, handling detect-or-block) +- type: ip + value: 2.26.53[.]194 + description: Operator/operational infrastructure (role infrastructure, handling detect-or-block) +- type: ip + value: 213.145.86[.]112 + description: Operator/operational infrastructure (role infrastructure, handling detect-or-block) +- type: ip + value: 31.57.243[.]154 + description: Phishing host (role phishing, handling detect-or-block) +- type: ip + value: 38.146.28[.]132 + description: Actor rogue DNS resolver (role infrastructure, handling detect-or-block) +- type: ip + value: 38.146.28[.]75 + description: Notifier C2 for the phishing console (role infrastructure, handling detect-or-block) +- type: hash + value: 918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593 + description: Windows Backdoor (role malware, handling detect-or-block) +- type: hash + value: be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c + description: Malware hash (role malware, handling detect-or-block) +response_actions: +- phase: contain + action: Block and hunt the published domains and addresses, and search mail logs for the + two phishing persona senders. +- phase: contain + action: Hunt for the published implant file names and SHA-256 hashes, including msedgeupdate_v3.exe + and WUEngine.exe. +- phase: eradicate + action: Review identity-provider sign-in logs for device-code authentication from unfamiliar + clients during the window, and revoke refresh tokens for affected accounts. +- phase: harden + action: Restrict the device-code authentication flow by Conditional Access where it has + no business use. +lesson: The AI sits on the operator's side here; the victim sees ordinary espionage artefacts, + just more of them, faster. The case belongs in this catalog because the operator's skill + files are what drove it. If an operator's workstation is ever seized, the agent's skills + directory and session store are its playbook, which is the reverse of the usual collection + problem. +detections: [] +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-20006 Russian espionage' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage +external_ids: + vendor_cluster: + - GTG-20006 diff --git a/artifacts/case-studies/airt-cs-0019.yml b/artifacts/case-studies/airt-cs-0019.yml new file mode 100644 index 0000000..11229cb --- /dev/null +++ b/artifacts/case-studies/airt-cs-0019.yml @@ -0,0 +1,200 @@ +# AI agent artifact case study +# AIRT-CS-0019 - GTG-50014 - ShinyHunters Affiliates Vibe-Hacking SaaS Estates +# Indicators: Anthropic September 2026 IOC release, cyber-operations rows only, values as published (defanged). + +id: AIRT-CS-0019 +title: GTG-50014 - ShinyHunters Affiliates Vibe-Hacking SaaS Estates +date_range: 2026 (activity window not stated) +disclosed: '2026-09-10' +affects: Claude models on the actor's side - no catalogued tool on victim hosts +confidence: medium +basis: A single reporting party with a published indicator set of 40 addresses, domains and + Telegram identifiers. The ShinyHunters link is Anthropic's suspicion of affiliation, not + an identification. +contested: Anthropic describes the operators as suspected affiliates of the ShinyHunters collective, + not as the group itself. +atlas: +- AML.T0103 +- AML.T0055 +- AML.T0126 +attack: +- T1552.001 +- T1567 +actors: +- ref: AIRT-TA-0006 + role: suspected + link_confidence: medium + attributed_by: Anthropic + stated_confidence: '"operators suspected to be affiliates of the ShinyHunters collective"' + reference: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists +victims: + sectors: + - information-technology + - transportation + - energy + - retail + - telecommunications + countries: + - FR + basis: 'Anthropic: a technology provider, an airline, an energy company, around 200 downstream + SaaS customers, a French retail chain and a French ISP dataset.' +summary: Anthropic reports operators suspected to be ShinyHunters affiliates running a vibe-hacking + loop. They gave Claude a general goal, such as using a stolen credential or retrieving data, + then let it evaluate the environment and write and run scripts until the goal was met. Reported + losses include more than 1 TB from one technology provider, tens of millions of passenger + records from an airline, and data from around 200 downstream SaaS customers. The operators + also ran credential-validation pipelines on EC2 workers, scanned decompiled mobile apps + for secrets with TruffleHog, and moved stolen data through Telegram. +iocs: +- type: account + value: https[:]//t[.]me/Soraki_Bot + description: Criminal storefront account on Telegram (role monetization, handling detect-or-block) +- type: domain + value: ari-chain[.]com + description: Crypto Themed Phishing Domain (role phishing, handling detect-or-block) +- type: domain + value: arichain[.]network + description: Crypto Themed Phishing Domain (role phishing, handling detect-or-block) +- type: domain + value: bitmart-mystery[.]com + description: Crypto Themed Phishing Domain (role phishing, handling detect-or-block) +- type: domain + value: defi-claim[.]xyz + description: Phishing Domain (role phishing, handling detect-or-block) +- type: domain + value: emailsecure[.]email + description: Actor email domain (role phishing, handling detect-or-block) +- type: domain + value: mozilla[.]ws + description: Mozilla brand-impersonation phishing (role phishing, handling detect-or-block) +- type: domain + value: on-pssword[.]com + description: 1Password typosquat phishing (role phishing, handling detect-or-block) +- type: domain + value: policenationale[.]cc + description: A domain name impersonating the French national police (though we believe this + served as branding for the criminal storefront rather than as a phishing lure) (role monetization, + handling detect-or-block) +- type: domain + value: service-infos[.]info + description: Phishing email domain (role phishing, handling detect-or-block) +- type: domain + value: signin-1psswoord[.]com + description: 1Password phishing (role phishing, handling detect-or-block) +- type: domain + value: soraki[.]cc + description: AutoShop carding storefront (role monetization, handling detect-or-block) +- type: domain + value: soraki[.]work + description: Actor infrastructure (role infrastructure, handling detect-or-block) +- type: domain + value: autoshop.policenationale[.]cc + description: Served as the web frontend for the actor's carding autoshop (role monetization, + handling detect-or-block) +- type: domain + value: esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun + description: Callback domain to confirm SSRF and out of band code execution (role infrastructure, + handling detect-or-block) +- type: domain + value: soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev + description: Cloudflare Workers proxy (role infrastructure, handling detect-or-block) +- type: domain + value: updatebeacon.duckdns[.]org + description: C2 callback domain (role c2, handling detect-or-block) +- type: ip + value: 104.193.135[.]207 + description: Attacker egress IP (seen 2026-04-05 to 2026-04-05; role egress, handling hunt) +- type: ip + value: 104.36.50[.]54 + description: Attacker egress IP (seen 2026-04-24 to 2026-04-24; role egress, handling hunt) +- type: ip + value: 162.128.129[.]106 + description: Attacker egress IP (seen 2026-02-20 to 2026-03-10; role egress, handling hunt) +- type: ip + value: 176.177.12[.]62 + description: Attacker egress IP (seen 2026-04-19 to 2026-04-20; role egress, handling hunt) +- type: ip + value: 185.65.134[.]199 + description: Attacker egress IP (seen 2026-04-19 to 2026-04-28; role egress, handling hunt) +- type: ip + value: 185.65.134[.]246 + description: Attacker egress IP (seen 2026-04-19 to 2026-05-04; role egress, handling hunt) +- type: ip + value: 193.32.249[.]161 + description: Attacker egress IP (seen 2026-03-21 to 2026-04-18; role egress, handling hunt) +- type: ip + value: 193.32.249[.]164 + description: Attacker egress IP (seen 2026-04-18 to 2026-05-06; role egress, handling hunt) +- type: ip + value: 193.32.249[.]170 + description: Attacker egress IP (seen 2026-03-20 to 2026-04-06; role egress, handling hunt) +- type: ip + value: 195.178.110[.]131 + description: VPS Host (seen 2026-03-12 to 2026-04-30; role infrastructure, handling hunt) +- type: ip + value: 45.148.10[.]242 + description: Attacker egress IP (seen 2026-04-06 to 2026-04-27; role egress, handling hunt) +- type: ip + value: 91.171.138[.]169 + description: Attacker egress IP (seen 2026-04-19 to 2026-04-21; role egress, handling hunt) +- type: ip + value: 92.118.39[.]3 + description: Attacker egress IP (seen 2026-04-10 to 2026-04-19; role egress, handling hunt) +- type: ip + value: 2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53 + description: Attacker egress IP (seen 2026-04-20 to 2026-04-21; role egress, handling hunt) +- type: ip + value: 2a04:cec0:1185:34f2:a150:7081:caed[:]448e + description: Attacker egress IP (seen 2026-04-06 to 2026-04-07; role egress, handling hunt) +- type: account + value: '8628746407' + description: Telegram bot delivering AWS SES credential-validation results directly to the + operator's user account (telegram bot id; role infrastructure, handling detect-or-block) +- type: account + value: '8632748474' + description: Telegram bot that posted stolen data. (telegram bot id; role exfiltration, + handling detect-or-block) +- type: account + value: '8664033117' + description: Telegram bot that posted stolen data. (telegram bot id; role exfiltration, + handling detect-or-block) +- type: account + value: '8709258476' + description: Telegram bot delivering AWS SNS SMS-abuse test results directly to the operator's + user account (telegram bot id; role infrastructure, handling detect-or-block) +- type: account + value: '-1003311614569' + description: Telegram group 'ChatMignon' that received stolen data. (telegram chat id; role + exfiltration, handling detect-or-block) +- type: account + value: '-1003893854338' + description: Telegram group 'ClintonHog' that received stolen data. (telegram chat id; role + exfiltration, handling detect-or-block) +- type: account + value: '8179098353' + description: Operator's Telegram account (telegram user id; role infrastructure, handling + detect-or-block) +- type: url + value: https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/ + description: Exfiltration URL (role exfiltration, handling detect-or-block) +response_actions: +- phase: contain + action: Block and hunt the published addresses and domains, and alert on outbound traffic + to the listed exfiltration storage URL. +- phase: contain + action: Inventory keys embedded in shipped mobile apps and any AWS SES or SNS credentials, + which the actor validated at scale and abused. +- phase: recover + action: Rotate SaaS integration tokens and cloud keys reachable from compromised tenants, + and notify downstream customers whose data transited them. +lesson: The operator supplied goals and the model supplied the hands-on-keyboard work. The + evidence that a tenant was worked this way is an unusually fast, unusually broad burst of + API calls and ad-hoc scripts from one credential, not any single call. +detections: [] +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50014 ShinyHunters smash-and-grab + opportunists' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists +external_ids: + vendor_cluster: + - GTG-50014 diff --git a/artifacts/case-studies/airt-cs-0020.yml b/artifacts/case-studies/airt-cs-0020.yml new file mode 100644 index 0000000..b02d9f2 --- /dev/null +++ b/artifacts/case-studies/airt-cs-0020.yml @@ -0,0 +1,76 @@ +# AI agent artifact case study +# AIRT-CS-0020 - GTG-50020 - From Hotel Booking Fraud to Probing AI Companies +# Indicators: Anthropic September 2026 IOC release, cyber-operations rows only, values as published (defanged). + +id: AIRT-CS-0020 +title: GTG-50020 - From Hotel Booking Fraud to Probing AI Companies +date_range: May to Jun 2026 (AI supply-chain phase) +disclosed: '2026-09-10' +affects: AI provider and AI company web estates - no catalogued endpoint tool +confidence: medium +basis: A single reporting party with eight published egress addresses. +atlas: +- AML.T0124 +- AML.T0017.001 +- AML.T0049 +attack: +- T1190 +actors: +- ref: AIRT-TA-0017 + role: operator + link_confidence: medium + attributed_by: Anthropic + stated_confidence: '"Russian-speaking, financially-motivated actor"' + reference: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain +victims: + sectors: + - commercial-facilities + - information-technology + basis: 'Anthropic: hotel booking platforms, then around 30 AI companies in about four days.' +summary: Anthropic reports a Russian-speaking, financially motivated actor with a history + of intrusions against hotel booking and fintech platforms. It built a containerised pentest + platform with a local model gateway and worker agents that tested injection, XSS, authentication + bypass and SSRF. It then turned the pipeline on around 30 AI companies in about four days, + with the stated goal of reaching a pre-release model. +iocs: +- type: ip + value: 141.133.125[.]208 + description: Attacker egress IP (seen 2026-05-21 to 2026-05-23; role egress, handling hunt) +- type: ip + value: 146.103.101[.]253 + description: Attacker egress IP (seen 2026-05-21 to 2026-06-13; role egress, handling hunt) +- type: ip + value: 146.103.97[.]169 + description: Attacker egress IP (seen 2026-05-21 to 2026-05-25; role egress, handling hunt) +- type: ip + value: 167.250.111[.]136 + description: Attacker egress IP (seen 2026-05-23 to 2026-06-03; role egress, handling hunt) +- type: ip + value: 178.16.54[.]141 + description: Attacker egress IP (seen 2026-05-21 to 2026-06-16; role egress, handling hunt) +- type: ip + value: 194.163.183[.]216 + description: Attacker egress IP (seen 2026-05-23 to 2026-05-24; role egress, handling hunt) +- type: ip + value: 202.66.167[.]230 + description: Attacker egress IP (seen 2026-05-21 to 2026-06-04; role egress, handling hunt) +- type: ip + value: 37.27.103[.]22 + description: Attacker egress IP (seen 2026-05-26 to 2026-06-13; role egress, handling hunt) +response_actions: +- phase: contain + action: Hunt the published egress addresses in web and WAF logs for the May to June 2026 + window. +- phase: harden + action: Treat model-gateway and evaluation endpoints as internet-exposed attack surface, + with the same testing and rate limits as the product itself. +lesson: AI companies are now a target class in their own right. What is being stolen is model + access and pre-release weights, which a victimology built only on data theft would miss. +detections: [] +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50020 From hotel bookings + to the AI supply chain' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain +external_ids: + vendor_cluster: + - GTG-50020 diff --git a/artifacts/case-studies/airt-cs-0021.yml b/artifacts/case-studies/airt-cs-0021.yml new file mode 100644 index 0000000..8126028 --- /dev/null +++ b/artifacts/case-studies/airt-cs-0021.yml @@ -0,0 +1,153 @@ +# AI agent artifact case study +# AIRT-CS-0021 - GTG-50029 - A Single Hacktivist Against European Political Targets +# Indicators: Anthropic September 2026 IOC release, cyber-operations rows only, values as published (defanged). + +id: AIRT-CS-0021 +title: GTG-50029 - A Single Hacktivist Against European Political Targets +date_range: Spring 2026 +disclosed: '2026-09-10' +affects: WordPress and SaaS estates of the targets - no catalogued endpoint tool +confidence: medium +basis: A single reporting party with a published indicator set of 22 addresses, domains and + onion services. +atlas: +- AML.T0016.002 +- AML.T0049 +- AML.T0055 +attack: +- T1190 +- T1505.003 +actors: +- ref: AIRT-TA-0018 + role: operator + link_confidence: medium + attributed_by: Anthropic + stated_confidence: '"single French-speaking actor"' + reference: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities +victims: + sectors: + - government + - media-entertainment + - ngo-think-tank + - information-technology + org_count: + value: 42 + qualifier: exact + basis: 'Anthropic: 42 tracked targets among European political parties, media, think tanks + and SaaS providers, with internal access to at least 14.' +summary: Anthropic reports a single French-speaking actor who used Claude to develop and debug + a WordPress re-installation race exploit, build a Rust scanner that validated exposed API + keys, and manage agents for reconnaissance and post-authentication work. Anthropic counts + 42 targets, internal access to at least 14, and 12 to 26 GB exfiltrated. The haul included + political membership and donor records. Reported persistence included web shells hidden + in font assets and credential-harvesting WordPress must-use plugins. +iocs: +- type: domain + value: fafwatch[.]xyz + description: Actor-registered doxing adjacent domain (seen 2026-04 to ?; role infrastructure, + handling detect-or-block) +- type: domain + value: prod-artfkt[.]com + description: Actor-registered operational domain (seen 2026-04 to ?; role infrastructure, + handling detect-or-block) +- type: domain + value: frntrs-analytics-863060591218.europe-west1.run[.]app + description: Cloud Run origin behind C2 domain (seen 2026-05-13 to 2026-06; role c2, handling + detect-or-block) +- type: domain + value: frntrs-analytics.dedyn[.]io + description: BeEF browser-C2 hostname (deSEC dynamic DNS, actor-held API token) (seen 2026-05-13 + to 2026-06; role c2, handling detect-or-block) +- type: ip + value: 103.124.165[.]199 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 103.141.60[.]144 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 103.216.220[.]19 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 136.144.242[.]56 + description: Staging & scan box used on EU political organizations (seen 2026-05-17 to 2026-05-21; + role staging, handling detect-or-block) +- type: ip + value: 138.199.6[.]208 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 138.199.60[.]29 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 139.59.2[.]243 + description: Key-validation box (DigitalOcean) (seen 2026-02-06 to 2026-06-12; role key_validation, + handling detect-or-block) +- type: ip + value: 146.70.116[.]131 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 149.22.83[.]6 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 158.173.46[.]118 + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 163.172.157[.]53 + description: Persistent dedicated server, Scaleway FR used in late-phase operations (seen + 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block) +- type: ip + value: 34.156.199[.]132 + description: Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role + exfiltration, handling hunt) +- type: ip + value: 34.156.95[.]176 + description: Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role + exfiltration, handling hunt) +- type: ip + value: 2001:ac8:27[:]89::a02d + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 2001:ac8:29[:]84::a01d + description: Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) + - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt) +- type: ip + value: 2001:bc8:711:5854:dc00:1ff:fe18[:]ba53 + description: Persistent dedicated server, Scaleway FR used in late-phase operations (seen + 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block) +- type: domain + value: 3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion + description: CRS credential-vault API (Tor onion service; seen 2026-05 to 2026-07; role + infrastructure, handling detect-or-block) +- type: domain + value: 6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion + description: Actor's Tor LLM-gateway (third-party model routing) (Tor onion service; seen + 2026-06 to 2026-06; role infrastructure, handling detect-or-block) +response_actions: +- phase: contain + action: Hunt the published addresses and onion services, and inspect wp-content/mu-plugins + and font asset directories on WordPress estates for unexpected PHP. +- phase: eradicate + action: Restore from backups verified clean. The actor poisoned backups, so check backup + integrity before relying on one. +- phase: recover + action: Rotate every API key found in public repositories or containers the actor's scanner + could have validated. +lesson: One operator with a model ran a campaign that used to need a team. The persistence + was ordinary, but its placement (fonts, must-use plugins, backups) was chosen to survive + a routine clean-up. +detections: [] +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50029 Hacktivists targeted + European political and affiliated entities' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities +external_ids: + vendor_cluster: + - GTG-50029 diff --git a/artifacts/case-studies/airt-cs-0022.yml b/artifacts/case-studies/airt-cs-0022.yml new file mode 100644 index 0000000..0918017 --- /dev/null +++ b/artifacts/case-studies/airt-cs-0022.yml @@ -0,0 +1,75 @@ +# AI agent artifact case study +# AIRT-CS-0022 - GTG-50021 - A Fraudulent AI Reseller Harvesting Customers' Credentials +# Indicators: Anthropic September 2026 IOC release, cyber-operations rows only, values as published (defanged). + +id: AIRT-CS-0022 +title: GTG-50021 - A Fraudulent AI Reseller Harvesting Customers' Credentials +date_range: 2026 (activity window not stated) +disclosed: '2026-09-10' +affects: +- AIRT-0001 +- AIRT-0041 +confidence: medium +basis: A single reporting party with six published domains. +atlas: +- AML.T0034 +- AML.T0055 +attack: +- T1557 +owasp_agentic: +- ASI03 +actors: +- ref: AIRT-TA-0019 + role: operator + link_confidence: medium + attributed_by: Anthropic + stated_confidence: '"Russian and Ukrainian speaking group"' + reference: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise +victims: + sectors: + - consumers + - information-technology + basis: 'Anthropic: customers seeking discounted Claude access, and downstream AI proxy resellers.' +summary: Anthropic reports a Russian- and Ukrainian-speaking group selling cheap Claude access + that silently proxied some traffic to a different model and harvested the credentials customers + supplied. The published domains include kiro[.]cheap and an AWS lookalike, aws-us-east-3[.]com. + On a victim host, the evidence is an agent whose API base URL points at a reseller rather + than the provider, which is the misconfiguration the catalog's endpoint-redirection rule + looks for. +iocs: +- type: domain + value: aws-us-east-3[.]com + description: AWS lookalike domain (role infrastructure, handling detect-or-block) +- type: domain + value: awstore[.]cloud + description: Fake Claude API reseller storefront (role monetization, handling detect-or-block) +- type: domain + value: holdboost[.]store + description: Malware platform domain (role c2, handling detect-or-block) +- type: domain + value: kiro[.]cheap + description: Fake Kiro API reseller storefront (role monetization, handling detect-or-block) +- type: domain + value: sys-tools[.]cfd + description: Malware C2 (role c2, handling detect-or-block) +- type: domain + value: iymkjuzymkapovrntoxy.supabase[.]co + description: Malware Supabase backend (role c2, handling detect-or-block) +response_actions: +- phase: contain + action: Search agent configurations and environment variables for API base URLs pointing + at the published domains, and block them. +- phase: recover + action: Rotate any provider API key or OAuth credential that was ever entered into a reseller. +- phase: harden + action: Alert when a coding agent's inference endpoint is changed away from the vendor default. +lesson: A cheap-access reseller is a man in the middle by construction. It sees every prompt, + every file the agent sends, and the credential itself. +detections: +- ai_inference_endpoint_redirection.yml +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50021' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise +external_ids: + vendor_cluster: + - GTG-50021 diff --git a/artifacts/detections/README.md b/artifacts/detections/README.md index be8e6b0..f44fc6c 100644 --- a/artifacts/detections/README.md +++ b/artifacts/detections/README.md @@ -41,6 +41,8 @@ osquery. | `langflow_rce_exploitation_attempt` | high | CVE-2025-3248 (CISA KEV) and CVE-2026-5027 exploitation | | `ai_agent_docker_socket_mount` | high | Agent container given host-root-equivalent daemon access | | `ai_model_file_written_to_endpoint` | low | Model weights landing on an endpoint - shadow AI signal | +| `ai_cli_permission_bypass_invocation` | high | AI CLI started with its approval-bypass flag by a package manager or runtime - the s1ngularity pattern | +| `ai_agent_hook_config_modification` | low | Claude Code settings or hooks file written - persistence that travels with a clone | ## On tuning, honestly diff --git a/artifacts/detections/sigma/ai_agent_credential_file_access.yml b/artifacts/detections/sigma/ai_agent_credential_file_access.yml index 1139af6..23d2283 100644 --- a/artifacts/detections/sigma/ai_agent_credential_file_access.yml +++ b/artifacts/detections/sigma/ai_agent_credential_file_access.yml @@ -12,6 +12,8 @@ date: 2026-08-11 tags: - attack.credential_access - attack.t1552.001 + - attack.atlas.t0083 + - attack.atlas.t0055 logsource: category: file_access detection: diff --git a/artifacts/detections/sigma/ai_agent_hook_config_modification.yml b/artifacts/detections/sigma/ai_agent_hook_config_modification.yml new file mode 100644 index 0000000..ecab217 --- /dev/null +++ b/artifacts/detections/sigma/ai_agent_hook_config_modification.yml @@ -0,0 +1,41 @@ +title: Claude Code Settings or Hooks File Created or Modified +id: cd43df78-2afd-585d-b6e5-74548a881311 +status: experimental +description: | + Detects a write to a Claude Code settings file. The file carries hooks: shell + commands the agent runs automatically on lifecycle events such as a session + start or a tool call. A hook fires with the developer's privileges every time + the agent is used, which makes it both a persistence mechanism and an + execution primitive. The repository-scoped copy travels with a clone. GTIG + reported in September 2026 that MIDNIGHT NEPTUNE (formerly UNC1069) poisoned + internal repository configurations and altered Claude CLI hooks, then deployed + the SOMBERMEME backdoor on developer interaction. It reported in the same + publication that UNC6780's DUSTMAKER drops files into .claude/ workspace + directories. Treat this as change tracking. Review a hooks block that appeared + or changed without a matching commit by the developer. +references: + - https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai + - https://github.com/depalmar/ai-dfir-toolkit/blob/main/artifacts/catalog/claude-code.yml +author: AI DFIR Toolkit contributors +date: 2026-09-30 +tags: + - attack.persistence + - attack.t1546 + - attack.execution + - attack.atlas.t0081 + - owasp.asi04 + - owasp.asi05 +logsource: + category: file_event +detection: + selection: + TargetFilename|endswith: + - '\.claude\settings.json' + - '\.claude\settings.local.json' + - '/.claude/settings.json' + - '/.claude/settings.local.json' + condition: selection +falsepositives: + - Developers editing their own agent settings + - Claude Code rewriting its own settings on upgrade or when the user approves a permission +level: low diff --git a/artifacts/detections/sigma/ai_cli_permission_bypass_invocation.yml b/artifacts/detections/sigma/ai_cli_permission_bypass_invocation.yml new file mode 100644 index 0000000..ee7c277 --- /dev/null +++ b/artifacts/detections/sigma/ai_cli_permission_bypass_invocation.yml @@ -0,0 +1,55 @@ +title: AI Coding CLI Invoked With Permission Bypass by a Script or Package Manager +id: bb0847db-e7dc-5690-ab79-68764f5a1f8c +status: experimental +description: | + Detects an AI coding CLI started with its approval-bypass flag by a runtime, + package manager or script interpreter, not by a person at a terminal. The + s1ngularity compromise of the Nx build system (August 2025) did exactly this + from an npm postinstall script. It looked for Claude Code, Gemini CLI and Amazon + Q on the host and ran each with the flag that suppresses tool approval + (--dangerously-skip-permissions, --yolo, --trust-all-tools). It then prompted + them to inventory secrets into /tmp/inventory.txt. The malware carried no + scanner of its own; the developer's agent was the scanner. A human running + these flags interactively is normal on some estates. The parent process is + what separates the two. +references: + - https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c + - https://github.com/depalmar/ai-dfir-toolkit/blob/main/artifacts/case-studies/airt-cs-0015.yml +author: AI DFIR Toolkit contributors +date: 2026-09-30 +tags: + - attack.execution + - attack.t1059 + - attack.credential_access + - attack.t1552.001 + - attack.atlas.t0053 + - attack.atlas.t0098 + - owasp.asi05 + - owasp.asi02 +logsource: + category: process_creation +detection: + selection_flag: + CommandLine|contains: + - '--dangerously-skip-permissions' + - '--yolo' + - '--trust-all-tools' + selection_parent: + ParentImage|endswith: + - '/node' + - '/npm' + - '/npx' + - '/pnpm' + - '/yarn' + - '/bun' + - '/python' + - '/python3' + - '\node.exe' + - '\npm.exe' + - '\bun.exe' + - '\python.exe' + condition: all of selection_* +falsepositives: + - CI pipelines that deliberately run an agent headless with approvals disabled - scope by host or service account + - Wrapper scripts a developer wrote around their own agent +level: high diff --git a/artifacts/docs/VERIFICATION.md b/artifacts/docs/VERIFICATION.md index bc19746..48bae3b 100644 --- a/artifacts/docs/VERIFICATION.md +++ b/artifacts/docs/VERIFICATION.md @@ -1063,3 +1063,47 @@ too - that is a lead, not a verified row, and it is left unstamped accordingly. The two credential directories remain unverified for mode and permissions. That needs an authenticated session, which needs the operator's own GitHub credentials, and is the obvious next step for whoever has them. + +## Framework refresh - 2026-09-30 + +ATLAS 2026.07 -> 2026.09, read from a clone of `mitre-atlas/atlas-data` rather +than a summary. The changelog summary this session started from was internally +inconsistent about how many techniques 2026.08 added, which is the reason the +pin is built by parsing the release file and never from release notes. ATT&CK is +unchanged at 19.2 (the newest Enterprise release in `attack-stix-data/index.json` +on this date). CISA KEV was read from `cisagov/kev-data`, catalog 2026.09.29. + +| Scope | Field | Was | Now | Basis | +|---|---|---|---|---| +| `technique-ids.json` | atlas.techniques | 194 ids, tactics mixed in | **208 techniques; 16 tactics, 40 mitigations, 73 case studies in their own keys** | CORRECTED. `--refresh` kept every id starting `AML.T`, which is also the prefix of every tactic (`AML.TA0000`-`AML.TA0015`). 194 was 178 techniques plus 16 tactics. It now buckets by object type. | +| `AML.TA0001` | name | AI Attack Staging | **AI Attack Adaptation** | ATLAS 2026.08 renamed the tactic. The id is unchanged. | +| `VERIFICATION.md` row 21 | C2 tactic id | AML.TA0015 | **AML.TA0014** | CORRECTED. In the pinned release, Command and Control is `AML.TA0014`, and `AML.TA0015` is Lateral Movement. The earlier row is left as written because this file is an audit trail. | +| `AIRT-CS-0002`, `mcp_tool_poisoning.yar`, MAPPINGS, playbook, guide | ATLAS | AML.T0104 | **AML.T0115.002** | CORRECTED. ATLAS 2026.07 folded "Publish Poisoned AI Agent Tool" (T0104) into Publish Poisoned AI Artifacts as sub-technique .002 (atlas-data CHANGELOG, 2026.07). The gate only read `catalog/*.yml`, so five surfaces carried a retired id for a month with CI green. | +| `ray_jobs_api_rce.rules`, MAPPINGS | ATLAS | AML.T0019 | **AML.T0049** | CORRECTED, not renamed. T0019 (Publish Poisoned Datasets) became T0115.000 in 2026.07. A mechanical remap would have kept a mapping that was already wrong: submitting a job that downloads a remote script poisons no dataset. ATLAS's own ShadowRay case study (`AML.CS0023`) maps that step to T0049 Exploit Public-Facing Application. | +| `ray_jobs_api_rce.rules` header | KEV status | "KEV-listed by CISA" | **Not in CISA KEV; VulnCheck KEV lists it** | CORRECTED. CVE-2023-48022 is absent from the CISA catalog (2026.09.29). The investigation guide already said so. `scripts/cve_status.py` now pins KEV status for all 33 cited CVEs, and gates any line that calls a CVE KEV-listed when the pin disagrees. | +| `site_data._norm_atlas` | tag parsing | `atlas.aml-tNNNN` -> "" | **-> AML.TNNNN** | CORRECTED. 18 tags in 07/08/09 were silently discarded, so those rules showed only what MAPPINGS said about them. | +| `site_data.parse_yara/parse_suricata` | ATLAS extraction | any `T\d{4}` | **`AML.T\d{4}` or `T0\d{3}`** | CORRECTED. ATT&CK T1190 in a Suricata metadata block was read as ATLAS `AML.T1190`, which does not exist. | +| `site_data.parse_sigma` | tags | first YAML document only | **all documents** | CORRECTED. Multi-rule files lost every tag after the first rule. | +| `site_data.load_mappings` | section 04 | 9 rows dropped | **read by header name** | CORRECTED. The parser required five cells, and section 04 had four (no OWASP column). Section 04 now has OWASP and ASI columns like every other section. | +| MAPPINGS rows | ATLAS | disagreed with rule tags on 8 rules | **superset of each rule's own tags** | RECONCILED. Missing ids were added to MAPPINGS (e.g. T0053 and T0096 on `agentic_orchestration_behavior.yml`, T0086 on `memory_poisoning.yml`, T0010 on the Triton rule). Nothing was removed. `sync_mappings.py --check` now fails if a rule tags an id its row omits. | +| MAPPINGS indexes | titles | hand-typed | **generated from the pins** | CORRECTED. Examples: T0010.002 "Software Supply Chain" -> "AI Supply Chain Compromise: Data"; T0018 "Poison AI Model" -> "Manipulate AI Model"; T0029 "Denial of ML Service / Resource Hijacking" -> "Denial of AI Service". | +| `nvidia_container_escape.yml` row | ATLAS | "T1611 (ATT&CK)" | **- (ATT&CK T1611 in the reference column)** | An ATT&CK id in the ATLAS column parsed as nothing at best and as a fake ATLAS id at worst. | +| MAPPINGS | ASI column | absent | **added to every row** | NEW. OWASP Top 10 for Agentic Applications (Dec 2025). These values are this project's assessment, because OWASP maps no detection content. Appendix A's LLM cross-map cites 2025 ids and is stored translated through the 2026 remap in `schema/owasp.json`. | +| `apply_mappings_update.py` | Langflow OWASP | LLM03 | **unchanged, annotated** | Not a defect. The whole table uses 2025 ids, and 2025 LLM03 Supply Chain is 2026 LLM04, which is what MAPPINGS shows. The script now says so, and warns against re-running it. | + +## Threat-intel layer - 2026-09-30 + +Sources were read directly where the runner could reach them: GTIG's four AI +Threat Tracker posts (Nov 2025; Feb, May, Sep 2026), Anthropic's August 2025, +November 2025 and September 2026 reports plus the September 2026 IOC release, +Microsoft's February 2024 post, the Nx GitHub advisory, and the ATLAS release +data. Claims that rest on a secondary summary, not on a fetched page, say so in +the case study's `basis`, never in `last_verified`. + +| Scope | Field | Was | Now | Basis | +|---|---|---|---|---| +| `ai_agent_credential_file_access.yml` | ATLAS | T0082 RAG Credential Harvesting | **T0083 Credentials from AI Agent Configuration, T0055 Unsecured Credentials** | CORRECTED. The rule watches reads of files like `~/.codex/auth.json`. That is credential theft from agent configuration, not harvesting from a RAG store. The mapping error surfaced when the new actor-coverage report found no rule for T0055. | +| `airt-cs-0002.yml` | ioc type | npm-user | **account** | IOC `type` is now a closed enum. `npm-user` was the one value used by a single case. | +| `airt-cs-0002.yml` | disclosed | 2025-09 (unquoted) | **"2025-09"** | YAML read the unquoted value as a string by accident. It is quoted like every other `disclosed` value. | +| `airt-cs-0004.yml` | ATLAS | T0053, T0054, T0096 | **+ T0116, T0117** | ATLAS's own case study for this campaign (`AML.CS0069`) maps it to Autonomous Reconnaissance and Autonomous Attack-Path Adaptation, both added in 2026.08. | +| Actor profiles | scope | - | **20 actors** | Attributed groups and reporter-named clusters only. One cluster was left out because its only public source is research published by the maintainer's employer, and the project's neutrality rule covers citing it as well as naming it. Anthropic's September 2026 influence-operation, surveillance and scam clusters are also left out. They leave no host artefacts, and several name private companies and individuals. | diff --git a/artifacts/docs/api/detections.json b/artifacts/docs/api/detections.json index 2870c92..6818ed4 100644 --- a/artifacts/docs/api/detections.json +++ b/artifacts/docs/api/detections.json @@ -20,7 +20,9 @@ "level": "high", "tags": [ "attack.credential_access", - "attack.t1552.001" + "attack.t1552.001", + "attack.atlas.t0083", + "attack.atlas.t0055" ], "logsource": { "category": "file_access" @@ -39,6 +41,23 @@ "category": "process_creation" } }, + { + "file": "detections/sigma/ai_agent_hook_config_modification.yml", + "id": "cd43df78-2afd-585d-b6e5-74548a881311", + "title": "Claude Code Settings or Hooks File Created or Modified", + "level": "low", + "tags": [ + "attack.persistence", + "attack.t1546", + "attack.execution", + "attack.atlas.t0081", + "owasp.asi04", + "owasp.asi05" + ], + "logsource": { + "category": "file_event" + } + }, { "file": "detections/sigma/ai_agent_mcp_config_modification.yml", "id": "3f1ea561-4da2-5dbb-adff-cabad3d44937", @@ -82,6 +101,25 @@ "category": "process_creation" } }, + { + "file": "detections/sigma/ai_cli_permission_bypass_invocation.yml", + "id": "bb0847db-e7dc-5690-ab79-68764f5a1f8c", + "title": "AI Coding CLI Invoked With Permission Bypass by a Script or Package Manager", + "level": "high", + "tags": [ + "attack.execution", + "attack.t1059", + "attack.credential_access", + "attack.t1552.001", + "attack.atlas.t0053", + "attack.atlas.t0098", + "owasp.asi05", + "owasp.asi02" + ], + "logsource": { + "category": "process_creation" + } + }, { "file": "detections/sigma/ai_inference_endpoint_redirection.yml", "id": "ef016b0c-7ce2-5366-925c-0337657af9f8", diff --git a/artifacts/docs/api/graph/maltego-entities.csv b/artifacts/docs/api/graph/maltego-entities.csv new file mode 100644 index 0000000..e0ace5f --- /dev/null +++ b/artifacts/docs/api/graph/maltego-entities.csv @@ -0,0 +1,562 @@ +EntityType,Value,Category,Label +maltego.Phrase,actor:AIRT-TA-0001,actor,APT28 +maltego.Phrase,actor:AIRT-TA-0002,actor,GTG-1002 +maltego.Phrase,actor:AIRT-TA-0003,actor,GTG-2002 +maltego.Phrase,actor:AIRT-TA-0004,actor,MIDNIGHT NEPTUNE +maltego.Phrase,actor:AIRT-TA-0005,actor,UNC6780 +maltego.Phrase,actor:AIRT-TA-0006,actor,ShinyHunters +maltego.Phrase,actor:AIRT-TA-0007,actor,APT42 +maltego.Phrase,actor:AIRT-TA-0008,actor,APT41 +maltego.Phrase,actor:AIRT-TA-0009,actor,Sandworm +maltego.Phrase,actor:AIRT-TA-0010,actor,APT31 +maltego.Phrase,actor:AIRT-TA-0011,actor,MuddyWater +maltego.Phrase,actor:AIRT-TA-0012,actor,UNC4899 +maltego.Phrase,actor:AIRT-TA-0013,actor,Kimsuky +maltego.Phrase,actor:AIRT-TA-0014,actor,UNC5673 +maltego.Phrase,actor:AIRT-TA-0015,actor,UNC6508 +maltego.Phrase,actor:AIRT-TA-0016,actor,GTG-20006 +maltego.Phrase,actor:AIRT-TA-0017,actor,GTG-50020 +maltego.Phrase,actor:AIRT-TA-0018,actor,GTG-50029 +maltego.Phrase,actor:AIRT-TA-0019,actor,GTG-50021 +maltego.Phrase,actor:AIRT-TA-0020,actor,GTG-10007 +maltego.File,artifact:AIRT-0001/credential/anthropic-api-key,artifact,ANTHROPIC_API_KEY +maltego.File,artifact:AIRT-0001/credential/anthropic-auth-token,artifact,ANTHROPIC_AUTH_TOKEN +maltego.File,artifact:AIRT-0001/credential/claude-code-oauth-token,artifact,CLAUDE_CODE_OAUTH_TOKEN +maltego.File,artifact:AIRT-0001/credential/claude-config-dir-credentials-json,artifact,$CLAUDE_CONFIG_DIR/.credentials.json +maltego.File,artifact:AIRT-0001/credential/claude-credentials-json,artifact,~/.claude/.credentials.json +maltego.File,artifact:AIRT-0001/credential/claude-json,artifact,~/.claude.json +maltego.File,artifact:AIRT-0001/credential/config-anthropic-configs,artifact,~/.config/anthropic/configs/ +maltego.File,artifact:AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db,artifact,macOS login Keychain (~/Library/Keychains/login.keychain-db) +maltego.File,artifact:AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials,artifact,macOS login Keychain (MCP remote-server OAuth credentials) +maltego.File,artifact:AIRT-0001/credential/project-mcp-json,artifact,/.mcp.json +maltego.File,artifact:AIRT-0001/disk/appdata-npm-claude-cmd,artifact,%APPDATA%\npm\claude.cmd +maltego.File,artifact:AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code,artifact,%APPDATA%\npm\node_modules\@anthropic-ai\claude-code\ +maltego.File,artifact:AIRT-0001/disk/claude,artifact,~/.claude/ +maltego.File,artifact:AIRT-0001/disk/claude-json,artifact,~/.claude.json +maltego.File,artifact:AIRT-0001/disk/local-bin-claude,artifact,~/.local/bin/claude +maltego.File,artifact:AIRT-0001/disk/repo-claude-md,artifact,/CLAUDE.md +maltego.File,artifact:AIRT-0001/disk/repo-claude-settings-json,artifact,/.claude/settings.json +maltego.File,artifact:AIRT-0001/disk/repo-mcp-json,artifact,/.mcp.json +maltego.File,artifact:AIRT-0001/disk/usr-local-bin-claude,artifact,/usr/local/bin/claude +maltego.File,artifact:AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0001/mcp-config/claude-json-mcpservers-user-scope,artifact,~/.claude.json → mcpServers (user scope) +maltego.File,artifact:AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers,artifact,/.claude/settings.local.json → enabledMcpjsonServers +maltego.File,artifact:AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope,artifact,/.mcp.json → mcpServers (project scope) +maltego.File,artifact:AIRT-0001/network/api-anthropic-com-443-tcp,artifact,api.anthropic.com :443/TCP +maltego.File,artifact:AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-,artifact,"claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP" +maltego.File,artifact:AIRT-0001/process/claude-node,artifact,claude / node +maltego.File,artifact:AIRT-0001/process/node-exe-claude,artifact,node.exe (claude) +maltego.File,artifact:AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro,artifact,"HKCU\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI" +maltego.File,artifact:AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall,artifact,HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\* → DisplayName contain +maltego.File,artifact:AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid,artifact,HKLM\SOFTWARE\Microsoft\Cryptography → MachineGuid +maltego.File,artifact:AIRT-0002/credential/appdata-cursor-user-globalstorage-state-vscdb,artifact,%APPDATA%\Cursor\User\globalStorage\state.vscdb +maltego.File,artifact:AIRT-0002/credential/config-cursor-auth-json,artifact,~/.config/cursor/auth.json +maltego.File,artifact:AIRT-0002/credential/config-cursor-user-globalstorage-state-vscdb,artifact,~/.config/Cursor/User/globalStorage/state.vscdb +maltego.File,artifact:AIRT-0002/credential/cursor-mcp-json,artifact,~/.cursor/mcp.json +maltego.File,artifact:AIRT-0002/credential/library-application-support-cursor-user-globalstorage-st,artifact,~/Library/Application Support/Cursor/User/globalStorage/state.vscdb +maltego.File,artifact:AIRT-0002/credential/macos-login-keychain-generic-password-service-cursor-saf,artifact,"macOS login Keychain: generic-password service 'Cursor Safe Storage', account 'C" +maltego.File,artifact:AIRT-0002/credential/macos-login-keychain-generic-password-services-cursor-ac,artifact,macOS login Keychain: generic-password services cursor-access-token / cursor-ref +maltego.File,artifact:AIRT-0002/credential/repo-cursor-mcp-json,artifact,/.cursor/mcp.json +maltego.File,artifact:AIRT-0002/disk/appdata-cursor-user,artifact,%APPDATA%\Cursor\User\ +maltego.File,artifact:AIRT-0002/disk/appdata-cursor-user-skills,artifact,%APPDATA%\Cursor\User\skills\ +maltego.File,artifact:AIRT-0002/disk/config-cursor-user,artifact,~/.config/Cursor/User/ +maltego.File,artifact:AIRT-0002/disk/cursor-mcp-json,artifact,~/.cursor/mcp.json +maltego.File,artifact:AIRT-0002/disk/library-application-support-cursor-user,artifact,~/Library/Application Support/Cursor/User/ +maltego.File,artifact:AIRT-0002/disk/localappdata-cursor-updater,artifact,%LOCALAPPDATA%\cursor-updater\ +maltego.File,artifact:AIRT-0002/disk/localappdata-programs-cursor,artifact,%LOCALAPPDATA%\Programs\cursor\ +maltego.File,artifact:AIRT-0002/disk/localappdata-programs-cursor-cursor-exe,artifact,%LOCALAPPDATA%\Programs\cursor\_\Cursor.exe +maltego.File,artifact:AIRT-0002/disk/localappdata-programs-cursor-resources-app-bin-cursor,artifact,%LOCALAPPDATA%\Programs\cursor\_\resources\app\bin\cursor +maltego.File,artifact:AIRT-0002/disk/repo-cursor-mcp-json,artifact,/.cursor/mcp.json +maltego.File,artifact:AIRT-0002/disk/repo-cursorrules-repo-cursor-rules-mdc,artifact,/.cursorrules | /.cursor/rules/*.mdc +maltego.File,artifact:AIRT-0002/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0002/mcp-config/cursor-mcp-json-mcpservers,artifact,~/.cursor/mcp.json → mcpServers +maltego.File,artifact:AIRT-0002/mcp-config/repo-cursor-mcp-json-mcpservers,artifact,/.cursor/mcp.json → mcpServers +maltego.File,artifact:AIRT-0002/network/cursor-sh-api2-cursor-sh-anysphere-co-443-tcp,artifact,"*.cursor.sh, api2.cursor.sh, *.anysphere.co :443/TCP" +maltego.File,artifact:AIRT-0002/process/cursor-exe,artifact,Cursor.exe +maltego.File,artifact:AIRT-0002/registry/hkcu-software-classes-cursor-shell-open-command-default,artifact,HKCU\Software\Classes\cursor\shell\open\command → (Default) +maltego.File,artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-run-curso,artifact,HKCU\Software\Microsoft\Windows\CurrentVersion\Run → Cursor +maltego.File,artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-uninstall,artifact,HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\ → Install +maltego.File,artifact:AIRT-0006/credential/appdata-windsurf-user-globalstorage-state-vscdb,artifact,%APPDATA%\Windsurf\User\globalStorage\state.vscdb +maltego.File,artifact:AIRT-0006/credential/codeium-config-json,artifact,~/.codeium/config.json +maltego.File,artifact:AIRT-0006/credential/codeium-windsurf-mcp-config-json,artifact,~/.codeium/windsurf/mcp_config.json +maltego.File,artifact:AIRT-0006/credential/config-windsurf-user-globalstorage-state-vscdb,artifact,~/.config/Windsurf/User/globalStorage/state.vscdb +maltego.File,artifact:AIRT-0006/credential/library-application-support-windsurf-user-globalstorage-,artifact,~/Library/Application Support/Windsurf/User/globalStorage/state.vscdb +maltego.File,artifact:AIRT-0006/credential/nvim-stdpath-cache-codeium-config-json,artifact,/codeium/config.json +maltego.File,artifact:AIRT-0006/credential/userprofile-codeium-windsurf-mcp-config-json,artifact,%USERPROFILE%\.codeium\windsurf\mcp_config.json +maltego.File,artifact:AIRT-0006/disk/codeium,artifact,~/.codeium/ +maltego.File,artifact:AIRT-0006/disk/codeium-version-language-server,artifact,~/.codeium//language_server_* +maltego.File,artifact:AIRT-0006/disk/codeium-windsurf-mcp-config-json,artifact,~/.codeium/windsurf/mcp_config.json +maltego.File,artifact:AIRT-0006/disk/repo-windsurf-settings-json,artifact,/.windsurf/settings.json +maltego.File,artifact:AIRT-0006/disk/repo-windsurfrules,artifact,/.windsurfrules +maltego.File,artifact:AIRT-0006/disk/userprofile-codeium-windsurf-mcp-config-json,artifact,%USERPROFILE%\.codeium\windsurf\mcp_config.json +maltego.File,artifact:AIRT-0006/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0006/mcp-config/codeium-mcp-config-json-mcpservers,artifact,~/.codeium/mcp_config.json → mcpServers +maltego.File,artifact:AIRT-0006/mcp-config/codeium-windsurf-mcp-config-json-mcpservers,artifact,~/.codeium/windsurf/mcp_config.json → mcpServers +maltego.File,artifact:AIRT-0006/network/server-codeium-com-codeium-com-windsurf-com-443-tcp,artifact,"server.codeium.com, *.codeium.com, *.windsurf.com :443/TCP" +maltego.File,artifact:AIRT-0006/process/windsurf-exe-language-server-windows-x64-exe,artifact,"Windsurf.exe, language_server_windows_x64.exe" +maltego.File,artifact:AIRT-0008/credential/aws-sso-cache-json,artifact,~/.aws/sso/cache/*.json +maltego.File,artifact:AIRT-0008/disk/aws-amazonq-cli-agents-json,artifact,~/.aws/amazonq/cli-agents/*.json +maltego.File,artifact:AIRT-0008/disk/local-share-amazon-q-data-sqlite3,artifact,~/.local/share/amazon-q/data.sqlite3 +maltego.File,artifact:AIRT-0008/disk/local-share-amazon-q-settings-json,artifact,~/.local/share/amazon-q/settings.json +maltego.File,artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-iam-bin,artifact,node .../language-server/build/aws-lsp-codewhisperer-iam-binary.js --stdio +maltego.File,artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-token-b,artifact,node .../language-server/build/aws-lsp-codewhisperer-token-binary.js --stdio +maltego.File,artifact:AIRT-0008/disk/repo-amazonq-cli-agents-json,artifact,/.amazonq/cli-agents/*.json +maltego.File,artifact:AIRT-0008/disk/repo-amazonq-rules-md,artifact,/.amazonq/rules/*.md +maltego.File,artifact:AIRT-0008/disk/userprofile-vscode-extensions-amazonwebservices-amazon-q,artifact,%USERPROFILE%\.vscode\extensions\amazonwebservices.amazon-q-vscode-* +maltego.File,artifact:AIRT-0008/disk/xdg-runtime-dir-qlog-cli-log,artifact,$XDG_RUNTIME_DIR/qlog/cli.log +maltego.File,artifact:AIRT-0008/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0008/mcp-config/aws-amazonq-default-json-agent-configuration-global-scop,artifact,"~/.aws/amazonq/default.json → Agent configuration, global scope in the IDE" +maltego.File,artifact:AIRT-0008/mcp-config/aws-amazonq-mcp-json-mcpservers,artifact,~/.aws/amazonq/mcp.json → mcpServers +maltego.File,artifact:AIRT-0008/mcp-config/repo-amazonq-default-json-mcpservers,artifact,/.amazonq/default.json → mcpServers +maltego.File,artifact:AIRT-0008/mcp-config/repo-amazonq-mcp-json-mcpservers,artifact,/.amazonq/mcp.json → mcpServers +maltego.File,artifact:AIRT-0008/network/q-us-east-1-amazonaws-com-codewhisperer-amazonaws-com-aw,artifact,"q.us-east-1.amazonaws.com, codewhisperer.*.amazonaws.com, *.awsapps.com/start :4" +maltego.File,artifact:AIRT-0008/process/node-aws-lsp-codewhisperer-token-binary-js,artifact,node (aws-lsp-codewhisperer-token-binary.js) +maltego.File,artifact:AIRT-0011/credential/appdata-claude,artifact,%APPDATA%\Claude\ +maltego.File,artifact:AIRT-0011/credential/claude-desktop-config-json-mcpservers-name-env,artifact,claude_desktop_config.json -> mcpServers..env +maltego.File,artifact:AIRT-0011/credential/config-claude,artifact,~/.config/Claude/ +maltego.File,artifact:AIRT-0011/credential/library-application-support-claude,artifact,~/Library/Application Support/Claude/ +maltego.File,artifact:AIRT-0011/disk/appdata-claude-claude-desktop-config-json,artifact,%APPDATA%\Claude\claude_desktop_config.json +maltego.File,artifact:AIRT-0011/disk/appdata-claude-logs-mcp-log,artifact,%APPDATA%\Claude\logs\mcp*.log +maltego.File,artifact:AIRT-0011/disk/applications-claude-app,artifact,/Applications/Claude.app +maltego.File,artifact:AIRT-0011/disk/applications-claude-app-2,artifact,~/Applications/Claude.app +maltego.File,artifact:AIRT-0011/disk/config-claude,artifact,~/.config/Claude/ +maltego.File,artifact:AIRT-0011/disk/config-claude-ant-did,artifact,~/.config/Claude/ant-did +maltego.File,artifact:AIRT-0011/disk/config-claude-claude-desktop-config-json,artifact,~/.config/Claude/claude_desktop_config.json +maltego.File,artifact:AIRT-0011/disk/config-claude-config-json,artifact,~/.config/Claude/config.json +maltego.File,artifact:AIRT-0011/disk/config-claude-logs-mcp-log,artifact,~/.config/Claude/logs/mcp*.log +maltego.File,artifact:AIRT-0011/disk/library-application-support-claude-claude-desktop-config,artifact,~/Library/Application Support/Claude/claude_desktop_config.json +maltego.File,artifact:AIRT-0011/disk/library-logs-claude-mcp-log,artifact,~/Library/Logs/Claude/mcp*.log +maltego.File,artifact:AIRT-0011/disk/library-preferences-com-anthropic-claudefordesktop-plist,artifact,~/Library/Preferences/com.anthropic.claudefordesktop.plist +maltego.File,artifact:AIRT-0011/disk/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro,artifact,%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_de +maltego.File,artifact:AIRT-0011/disk/mcpb-desktop-extension,artifact,*.mcpb (Desktop Extension) +maltego.File,artifact:AIRT-0011/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0011/mcp-config/appdata-claude-claude-desktop-config-json-mcpservers-nam,artifact,%APPDATA%\Claude\claude_desktop_config.json → mcpServers..command + .args +maltego.File,artifact:AIRT-0011/mcp-config/config-claude-claude-desktop-config-json-mcpservers,artifact,~/.config/Claude/claude_desktop_config.json → mcpServers +maltego.File,artifact:AIRT-0011/mcp-config/library-application-support-claude-claude-desktop-config,artifact,~/Library/Application Support/Claude/claude_desktop_config.json → mcpServers +maltego.File,artifact:AIRT-0011/mcp-config/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro,artifact,%LOCALAPPDATA%\Packages\Claude_pzs8sxrjxfjjc\LocalCache\Roaming\Claude\claude_de +maltego.File,artifact:AIRT-0011/mcp-config/mcpb-dxt-bundle-files-manifest-json-inside-archive,artifact,*.mcpb / *.dxt bundle files → manifest.json inside archive +maltego.File,artifact:AIRT-0011/network/api-anthropic-com-claude-ai-443-tcp,artifact,"api.anthropic.com, claude.ai :443/TCP" +maltego.File,artifact:AIRT-0011/network/registry-npmjs-org-npx-mcp-server-fetch-443-tcp,artifact,registry.npmjs.org (npx MCP server fetch) :443/TCP +maltego.File,artifact:AIRT-0011/process/claude,artifact,Claude +maltego.File,artifact:AIRT-0011/process/claude-exe,artifact,Claude.exe +maltego.File,artifact:AIRT-0011/registry/hkcu-software-classes-activatableclasses-package-claude-,artifact,HKCU\Software\Classes\ActivatableClasses\Package\Claude_pzs8sxrjxfjjc* → - +maltego.File,artifact:AIRT-0011/registry/hkcu-software-classes-claude-shell-open-command-default,artifact,HKCU\Software\Classes\claude\shell\open\command → (Default) +maltego.File,artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-run-claud,artifact,HKCU\Software\Microsoft\Windows\CurrentVersion\Run → Claude +maltego.File,artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-uninstall,artifact,HKCU\Software\Microsoft\Windows\CurrentVersion\Uninstall\Claude → InstallLocatio +maltego.File,artifact:AIRT-0016/credential/install-config-json,artifact,/config.json +maltego.File,artifact:AIRT-0016/credential/install-data-database-pythagora-db,artifact,/data/database/pythagora.db +maltego.File,artifact:AIRT-0016/credential/install-pilot-env,artifact,/pilot/.env +maltego.File,artifact:AIRT-0016/credential/openai-api-key-anthropic-api-key-groq-api-key,artifact,OPENAI_API_KEY | ANTHROPIC_API_KEY | GROQ_API_KEY +maltego.File,artifact:AIRT-0016/registry/hkcu-environment-openai-api-key-anthropic-api-key-groq-a,artifact,"HKCU\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, GROQ_API_KEY" +maltego.File,artifact:AIRT-0037/credential/gemini-env,artifact,~/.gemini/.env +maltego.File,artifact:AIRT-0037/credential/gemini-google-accounts-json,artifact,~/.gemini/google_accounts.json +maltego.File,artifact:AIRT-0037/credential/gemini-oauth-creds-json,artifact,~/.gemini/oauth_creds.json +maltego.File,artifact:AIRT-0037/disk/etc-gemini-cli-settings-json,artifact,/etc/gemini-cli/settings.json +maltego.File,artifact:AIRT-0037/disk/gemini-npm-g-google-gemini-cli,artifact,gemini (npm -g @google/gemini-cli) +maltego.File,artifact:AIRT-0037/disk/gemini-settings-json,artifact,~/.gemini/settings.json +maltego.File,artifact:AIRT-0037/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0037/mcp-config/gemini-settings-json-mcpservers,artifact,~/.gemini/settings.json → mcpServers +maltego.File,artifact:AIRT-0037/mcp-config/repo-gemini-settings-json-mcpservers,artifact,/.gemini/settings.json → mcpServers +maltego.File,artifact:AIRT-0037/network/generativelanguage-googleapis-com-oauth2-googleapis-com-,artifact,"generativelanguage.googleapis.com, oauth2.googleapis.com, accounts.google.com :4" +maltego.File,artifact:AIRT-0037/process/gemini-node,artifact,gemini / node +maltego.File,artifact:AIRT-0041/credential/aws-builder-id-iam-identity-center-token-cache,artifact,AWS Builder ID / IAM Identity Center token cache +maltego.File,artifact:AIRT-0041/credential/mcpservers-name-env-inside-kiro-settings-mcp-json,artifact,mcpServers..env inside ~/.kiro/settings/mcp.json +maltego.File,artifact:AIRT-0041/disk/kiro-mcp-logs-view-output-channel,artifact,Kiro - MCP Logs (View > Output channel) +maltego.File,artifact:AIRT-0041/disk/kiro-settings-mcp-json,artifact,~/.kiro/settings/mcp.json +maltego.File,artifact:AIRT-0041/disk/power-md-plugin-json-dev-kiro,artifact,POWER.md / plugin.json / dev.kiro/ +maltego.File,artifact:AIRT-0041/disk/repo-kiro-agents,artifact,/.kiro/agents/ +maltego.File,artifact:AIRT-0041/disk/repo-kiro-hooks-kiro-hook,artifact,/.kiro/hooks/*.kiro.hook +maltego.File,artifact:AIRT-0041/disk/repo-kiro-settings-mcp-json,artifact,/.kiro/settings/mcp.json +maltego.File,artifact:AIRT-0041/disk/repo-kiro-specs,artifact,/.kiro/specs/ +maltego.File,artifact:AIRT-0041/disk/repo-kiro-steering-md,artifact,/.kiro/steering/*.md +maltego.File,artifact:AIRT-0041/disk/vs-code-style-globalstorage-extensions-and-state-vscdb-p,artifact,"VS Code-style globalStorage, extensions, and state.vscdb paths" +maltego.File,artifact:AIRT-0041/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0041/mcp-config/kiro-settings-mcp-json-mcpservers,artifact,~/.kiro/settings/mcp.json → mcpServers +maltego.File,artifact:AIRT-0041/mcp-config/repo-kiro-settings-mcp-json-mcpservers,artifact,/.kiro/settings/mcp.json → mcpServers +maltego.File,artifact:AIRT-0041/network/kiro-dev-aws-kiro-service-endpoints-443-tcp,artifact,"kiro.dev, AWS Kiro service endpoints :443/TCP" +maltego.File,artifact:AIRT-0041/network/kiro-url-scheme-and-https-kiro-dev-launch-mcp-add-name-c,artifact,kiro:// URL scheme and https://kiro.dev/launch/mcp/add?name=&config= install lin +maltego.File,artifact:AIRT-0041/process/kiro-ide-kiro-cli,artifact,kiro (IDE); kiro (CLI) +maltego.File,artifact:AIRT-0044/credential/appdata-com-langflowdesktop-data-database-db,artifact,%APPDATA%\com.LangflowDesktop\data\database.db +maltego.File,artifact:AIRT-0044/credential/langflow-config-dir-private-key-pem-public-key-pem-along,artifact,/private_key.pem (public_key.pem alongside) +maltego.File,artifact:AIRT-0044/credential/langflow-config-dir-secret-key-default-home-cache-langfl,artifact,/secret_key (default /.cache/langflow/secret_key on +maltego.File,artifact:AIRT-0044/credential/langflow-data-database-db,artifact,~/.langflow/data/database.db +maltego.File,artifact:AIRT-0044/credential/langflow-database-url,artifact,LANGFLOW_DATABASE_URL +maltego.File,artifact:AIRT-0044/credential/langflow-db-pip-install-install-lib-python3-x-site-packa,artifact,langflow.db (pip install: /lib/python3.x/site-packages/langflow/langfl +maltego.File,artifact:AIRT-0044/credential/langflow-secret-key,artifact,LANGFLOW_SECRET_KEY +maltego.File,artifact:AIRT-0044/credential/langflow-superuser-langflow-superuser-password,artifact,LANGFLOW_SUPERUSER / LANGFLOW_SUPERUSER_PASSWORD +maltego.File,artifact:AIRT-0044/credential/project-env-path-passed-to-langflow-run-env-file,artifact,/.env (path passed to `langflow run --env-file`) +maltego.File,artifact:AIRT-0044/disk/exported-flow-json-files,artifact,Exported flow JSON files +maltego.File,artifact:AIRT-0044/disk/langflow,artifact,~/.langflow/ +maltego.File,artifact:AIRT-0044/disk/langflow-auto-login,artifact,LANGFLOW_AUTO_LOGIN +maltego.File,artifact:AIRT-0044/disk/langflow-db-sqlite-in-the-config-dir,artifact,"langflow.db (SQLite, in the config dir)" +maltego.File,artifact:AIRT-0044/disk/langflow-superuser-langflow-superuser-password,artifact,LANGFLOW_SUPERUSER / LANGFLOW_SUPERUSER_PASSWORD +maltego.File,artifact:AIRT-0044/eventlog/microsoft-windows-sysmon-operational-eid-1,artifact,Microsoft-Windows-Sysmon/Operational EID 1 +maltego.File,artifact:AIRT-0044/mcp-config/langflow-projects-published-as-mcp-tools-each-project-is,artifact,Langflow projects published as MCP tools - each project is added to Langflow's o +maltego.File,artifact:AIRT-0044/mcp-config/mcp-server-registrations-added-in-settings-mcp-servers-p,artifact,"MCP server registrations added in Settings - MCP Servers, persisted in langflow." +maltego.File,artifact:AIRT-0044/network/configured-llm-provider-endpoints-443-tcp,artifact,Configured LLM provider endpoints :443/TCP +maltego.File,artifact:AIRT-0044/network/langflow-web-ui-api-7860-tcp,artifact,Langflow web UI + API :7860/TCP +maltego.File,artifact:AIRT-0044/process/python-langflow-run-uvicorn,artifact,python (langflow run) / uvicorn +maltego.Phrase,asi:ASI01,asi,ASI01 Agent Goal Hijack +maltego.Phrase,asi:ASI02,asi,ASI02 Tool Misuse and Exploitation +maltego.Phrase,asi:ASI03,asi,ASI03 Identity and Privilege Abuse +maltego.Phrase,asi:ASI04,asi,ASI04 Agentic Supply Chain Vulnerabilities +maltego.Phrase,asi:ASI05,asi,ASI05 Unexpected Code Execution +maltego.Phrase,asi:ASI06,asi,ASI06 Memory and Context Poisoning +maltego.Phrase,atlas:AML.T0008,technique,AML.T0008 Acquire Infrastructure +maltego.Phrase,atlas:AML.T0008.000,technique,AML.T0008.000 AI Development Workspaces +maltego.Phrase,atlas:AML.T0010,technique,AML.T0010 AI Supply Chain Compromise +maltego.Phrase,atlas:AML.T0011,technique,AML.T0011 User Execution +maltego.Phrase,atlas:AML.T0016.002,technique,AML.T0016.002 Generative AI +maltego.Phrase,atlas:AML.T0016.004,technique,AML.T0016.004 AI Agent Tools +maltego.Phrase,atlas:AML.T0017.001,technique,AML.T0017.001 Autonomous Exploit Development +maltego.Phrase,atlas:AML.T0017.002,technique,AML.T0017.002 AI Agent Tools +maltego.Phrase,atlas:AML.T0024,technique,AML.T0024 Exfiltration via AI Inference API +maltego.Phrase,atlas:AML.T0034,technique,AML.T0034 Cost Harvesting +maltego.Phrase,atlas:AML.T0049,technique,AML.T0049 Exploit Public-Facing Application +maltego.Phrase,atlas:AML.T0051,technique,AML.T0051 LLM Prompt Injection +maltego.Phrase,atlas:AML.T0053,technique,AML.T0053 AI Agent Tool Invocation +maltego.Phrase,atlas:AML.T0054,technique,AML.T0054 LLM Jailbreak +maltego.Phrase,atlas:AML.T0055,technique,AML.T0055 Unsecured Credentials +maltego.Phrase,atlas:AML.T0080,technique,AML.T0080 AI Agent Context Poisoning +maltego.Phrase,atlas:AML.T0080.000,technique,AML.T0080.000 Memory +maltego.Phrase,atlas:AML.T0081,technique,AML.T0081 Modify AI Agent Configuration +maltego.Phrase,atlas:AML.T0082,technique,AML.T0082 RAG Credential Harvesting +maltego.Phrase,atlas:AML.T0086,technique,AML.T0086 Exfiltration via AI Agent Tool Invocation +maltego.Phrase,atlas:AML.T0087,technique,AML.T0087 Gather Victim Identity Information +maltego.Phrase,atlas:AML.T0096,technique,AML.T0096 AI Service API +maltego.Phrase,atlas:AML.T0102,technique,AML.T0102 Generate Malicious Commands +maltego.Phrase,atlas:AML.T0103,technique,AML.T0103 Deploy AI Agent +maltego.Phrase,atlas:AML.T0115.002,technique,AML.T0115.002 AI Agent Tools +maltego.Phrase,atlas:AML.T0116,technique,AML.T0116 Autonomous Reconnaissance +maltego.Phrase,atlas:AML.T0117,technique,AML.T0117 Autonomous Attack-Path Adaptation +maltego.Phrase,atlas:AML.T0124,technique,AML.T0124 Autonomous Attack Orchestration +maltego.Phrase,atlas:AML.T0126,technique,AML.T0126 Automated Collection +maltego.Phrase,attack:T1059,technique,T1059 Command and Scripting Interpreter +maltego.Phrase,attack:T1070,technique,T1070 Indicator Removal +maltego.Phrase,attack:T1190,technique,T1190 Exploit Public-Facing Application +maltego.Phrase,attack:T1195.002,technique,T1195.002 Compromise Software Supply Chain +maltego.Phrase,attack:T1505.003,technique,T1505.003 Web Shell +maltego.Phrase,attack:T1528,technique,T1528 Steal Application Access Token +maltego.Phrase,attack:T1546,technique,T1546 Event Triggered Execution +maltego.Phrase,attack:T1552.001,technique,T1552.001 Credentials In Files +maltego.Phrase,attack:T1557,technique,T1557 Adversary-in-the-Middle +maltego.Phrase,attack:T1566,technique,T1566 Phishing +maltego.Phrase,attack:T1567,technique,T1567 Exfiltration Over Web Service +maltego.Phrase,campaign:C0045,attack-campaign,C0045 ShadowRay +maltego.Phrase,campaign:C0062,attack-campaign,C0062 Anthropic AI-orchestrated Campaign +maltego.Phrase,case:AIRT-CS-0001,case,GPT Pilot core/telemetry Supply-Chain Credential Stealer +maltego.Phrase,case:AIRT-CS-0002,case,postmark-mcp npm Backdoor - First In-the-Wild Malicious MCP Server +maltego.Phrase,case:AIRT-CS-0003,case,Langflow CVE-2025-3248 Mass Exploitation and Flodrix Botnet Deployment +maltego.Phrase,case:AIRT-CS-0004,case,GTG-1002 - AI-Orchestrated Espionage Campaign +maltego.Phrase,case:AIRT-CS-0005,case,SesameOp - OpenAI Assistants API as a Covert C2 Relay +maltego.Phrase,case:AIRT-CS-0006,case,PROMPTFLUX - Malware That Asks an LLM to Rewrite Itself +maltego.Phrase,case:AIRT-CS-0007,case,PROMPTSTEAL / LAMEHUG - An LLM Writing Collection Commands at Runtime +maltego.Phrase,case:AIRT-CS-0008,case,EchoLeak (CVE-2025-32711) - Zero-Click Exfiltration from M365 Copilot +maltego.Phrase,case:AIRT-CS-0009,case,The MCP Vulnerability Cluster - RCE on Connect and the Rug-Pull +maltego.Phrase,case:AIRT-CS-0010,case,SpAIware - Prompt Injection That Persists in Assistant Memory +maltego.Phrase,case:AIRT-CS-0011,case,AI Recommendation Poisoning - Memory Manipulation for Profit +maltego.Phrase,case:AIRT-CS-0012,case,PoisonedRAG - Five Documents Against a Corpus of Millions +maltego.Phrase,case:AIRT-CS-0013,case,"Mexican Government Breach - AI-Accelerated, Not AI-Orchestrated" +maltego.Phrase,case:AIRT-CS-0014,case,ShadowRay - AI Compute Clusters Exploited in the Wild +maltego.Phrase,case:AIRT-CS-0015,case,s1ngularity - A Supply-Chain Payload That Used the Victim's Own AI CLIs +maltego.Phrase,case:AIRT-CS-0016,case,UNC6780 (TeamPCP) - DUSTMAKER and Trojanised MCP Servers +maltego.Phrase,case:AIRT-CS-0017,case,MIDNIGHT NEPTUNE - Poisoned Repository Config and Claude Code Hooks +maltego.Phrase,case:AIRT-CS-0018,case,GTG-20006 - Russian State-Nexus Espionage Run Through AI Workflows +maltego.Phrase,case:AIRT-CS-0019,case,GTG-50014 - ShinyHunters Affiliates Vibe-Hacking SaaS Estates +maltego.Phrase,case:AIRT-CS-0020,case,GTG-50020 - From Hotel Booking Fraud to Probing AI Companies +maltego.Phrase,case:AIRT-CS-0021,case,GTG-50029 - A Single Hacktivist Against European Political Targets +maltego.Phrase,case:AIRT-CS-0022,case,GTG-50021 - A Fraudulent AI Reseller Harvesting Customers' Credentials +maltego.Location,country:CA,country,CA +maltego.Location,country:FR,country,FR +maltego.Location,country:MX,country,MX +maltego.Location,country:UA,country,UA +maltego.Location,country:US,country,US +maltego.Phrase,group:G0007,attack-group,G0007 APT28 +maltego.Phrase,group:G0034,attack-group,G0034 Sandworm Team +maltego.Phrase,group:G0069,attack-group,G0069 MuddyWater +maltego.Phrase,group:G0094,attack-group,G0094 Kimsuky +maltego.Phrase,group:G0096,attack-group,G0096 APT41 +maltego.Phrase,group:G0128,attack-group,G0128 ZIRCONIUM +maltego.Phrase,group:G1044,attack-group,G1044 APT42 +maltego.Phrase,group:G1057,attack-group,G1057 ShinyHunters +maltego.Phrase,-1003311614569,ioc,-1003311614569 +maltego.Phrase,-1003893854338,ioc,-1003893854338 +maltego.Phrase,8179098353,ioc,8179098353 +maltego.Phrase,8628746407,ioc,8628746407 +maltego.Phrase,8632748474,ioc,8632748474 +maltego.Phrase,8664033117,ioc,8664033117 +maltego.Phrase,8709258476,ioc,8709258476 +maltego.Phrase,https://t.me/Soraki_Bot,ioc,https[:]//t[.]me/Soraki_Bot +maltego.Phrase,phanpak,ioc,phanpak +maltego.Phrase,bun,ioc,bun +maltego.Phrase,065ee8eb,ioc,065ee8eb +maltego.Phrase,%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup,ioc,%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup +maltego.Phrase,"/.claude/, /.cursor/, /.vscode/",ioc,"/.claude/, /.cursor/, /.vscode/" +maltego.Phrase,rt-*,ioc,rt-* +maltego.Domain,3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd.onion,ioc,3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion +maltego.Domain,6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad.onion,ioc,6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion +maltego.Domain,ad-g.org,ioc,ad-g[.]org +maltego.Domain,api-inference.huggingface.co,ioc,api-inference.huggingface.co +maltego.Domain,api.openai.com,ioc,api.openai.com +maltego.Domain,api.stuseamandesilt.org,ioc,api.stuseamandesilt[.]org +maltego.Domain,ari-chain.com,ioc,ari-chain[.]com +maltego.Domain,arichain.network,ioc,arichain[.]network +maltego.Domain,autoshop.policenationale.cc,ioc,autoshop.policenationale[.]cc +maltego.Domain,aws-us-east-3.com,ioc,aws-us-east-3[.]com +maltego.Domain,awstore.cloud,ioc,awstore[.]cloud +maltego.Domain,bitmart-mystery.com,ioc,bitmart-mystery[.]com +maltego.Domain,cdn.stuseamandesilt.org,ioc,cdn.stuseamandesilt[.]org +maltego.Domain,cdncounter.net,ioc,cdncounter[.]net +maltego.Domain,chamber-ua.org,ioc,chamber-ua[.]org +maltego.Domain,chathamhouse.eu,ioc,chathamhouse[.]eu +maltego.Domain,defi-claim.xyz,ioc,defi-claim[.]xyz +maltego.Domain,docs-viewer.org,ioc,docs-viewer[.]org +maltego.Domain,emailsecure.email,ioc,emailsecure[.]email +maltego.Domain,esvfecawvjmchjslqyemho2fiduc59wzn.oast.fun,ioc,esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun +maltego.Domain,fafwatch.xyz,ioc,fafwatch[.]xyz +maltego.Domain,frntrs-analytics-863060591218.europe-west1.run.app,ioc,frntrs-analytics-863060591218.europe-west1.run[.]app +maltego.Domain,frntrs-analytics.dedyn.io,ioc,frntrs-analytics.dedyn[.]io +maltego.Domain,generativelanguage.googleapis.com,ioc,generativelanguage.googleapis.com +maltego.Domain,holdboost.store,ioc,holdboost[.]store +maltego.Domain,itechx.tel,ioc,itechx[.]tel +maltego.Domain,iymkjuzymkapovrntoxy.supabase.co,ioc,iymkjuzymkapovrntoxy.supabase[.]co +maltego.Domain,kiro.cheap,ioc,kiro[.]cheap +maltego.Domain,m365-owa.com,ioc,m365-owa[.]com +maltego.Domain,meridian-protocol.org,ioc,meridian-protocol[.]org +maltego.Domain,meridiangroup-corp.com,ioc,meridiangroup-corp[.]com +maltego.Domain,metricwave.org,ioc,metricwave[.]org +maltego.Domain,mgsend.org,ioc,mgsend[.]org +maltego.Domain,mozilla.ws,ioc,mozilla[.]ws +maltego.Domain,ms365-device.com,ioc,ms365-device[.]com +maltego.Domain,ms365-live.com,ioc,ms365-live[.]com +maltego.Domain,mslivetest.duckdns.org,ioc,mslivetest.duckdns[.]org +maltego.Domain,my-invite.org,ioc,my-invite[.]org +maltego.Domain,mygreatmarket.com,ioc,mygreatmarket[.]com +maltego.Domain,mygreatmarket.org,ioc,mygreatmarket[.]org +maltego.Domain,on-pssword.com,ioc,on-pssword[.]com +maltego.Domain,owa-ms365.com,ioc,owa-ms365[.]com +maltego.Domain,pdfviewer2024.b-cdn.net,ioc,pdfviewer2024.b-cdn[.]net +maltego.Domain,policenationale.cc,ioc,policenationale[.]cc +maltego.Domain,prod-artfkt.com,ioc,prod-artfkt[.]com +maltego.Domain,projectnightcrawler.dev,ioc,projectnightcrawler[.]dev +maltego.Domain,russianearabroad.com,ioc,russianearabroad[.]com +maltego.Domain,russianearabroad.org,ioc,russianearabroad[.]org +maltego.Domain,service-infos.info,ioc,service-infos[.]info +maltego.Domain,signin-1psswoord.com,ioc,signin-1psswoord[.]com +maltego.Domain,soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers.dev,ioc,soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev +maltego.Domain,soraki.cc,ioc,soraki[.]cc +maltego.Domain,soraki.work,ioc,soraki[.]work +maltego.Domain,static-ms.live,ioc,static-ms[.]live +maltego.Domain,static.cdncounter.net,ioc,static.cdncounter[.]net +maltego.Domain,statistic-ms.live,ioc,statistic-ms[.]live +maltego.Domain,stuseamandesilt.org,ioc,stuseamandesilt[.]org +maltego.Domain,sys-tools.cfd,ioc,sys-tools[.]cfd +maltego.Domain,teams.ms365-live.com,ioc,teams.ms365-live[.]com +maltego.Domain,ukrinform-share.net,ioc,ukrinform-share[.]net +maltego.Domain,update.stuseamandesilt.org,ioc,update.stuseamandesilt[.]org +maltego.Domain,updatebeacon.duckdns.org,ioc,updatebeacon.duckdns[.]org +maltego.Domain,wa-connect.eu,ioc,wa-connect[.]eu +maltego.Domain,wa-meeting.com,ioc,wa-meeting[.]com +maltego.EmailAddress,anna.manager@russianearabroad.net,ioc,anna.manager@russianearabroad[.]net +maltego.EmailAddress,events@embassy-protocol.int,ioc,events@embassy-protocol[.]int +maltego.EmailAddress,phan@giftshop.club,ioc,phan@giftshop[.]club +maltego.File,%TEMP%\thinking_robot_log.txt,ioc,%TEMP%\thinking_robot_log.txt +maltego.File,/tmp/inventory.txt,ioc,/tmp/inventory.txt +maltego.File,.exe.config containing appDomainManagerAssembly,ioc,.exe.config containing appDomainManagerAssembly +maltego.File,"Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)",ioc,"Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)" +maltego.File,C:\Windows\Temp\*.Netapi64,ioc,C:\Windows\Temp\*.Netapi64 +maltego.File,C:\Windows\Temp\Netapi64.Exception,ioc,C:\Windows\Temp\Netapi64.Exception +maltego.File,C:\Windows\Temp\Netapi64.start,ioc,C:\Windows\Temp\Netapi64.start +maltego.File,Framework checkpoint stores (LangGraph SQLite and equivalents),ioc,Framework checkpoint stores (LangGraph SQLite and equivalents) +maltego.File,Netapi64.dll,ioc,Netapi64.dll +maltego.File,WUEngine.exe,ioc,WUEngine.exe +maltego.File,client_20260507093021_4286d211_x64.exe,ioc,client_20260507093021_4286d211_x64.exe +maltego.File,core/telemetry/.loader.lock,ioc,core/telemetry/.loader.lock +maltego.File,core/telemetry/__init__.py,ioc,core/telemetry/__init__.py +maltego.File,core/telemetry/_hooks.py,ioc,core/telemetry/_hooks.py +maltego.File,core/telemetry/_runtime.bin,ioc,core/telemetry/_runtime.bin +maltego.File,fix_network.apk,ioc,fix_network.apk +maltego.File,msedgeupdate_v3.exe,ioc,msedgeupdate_v3.exe +maltego.File,Додаток.pdf.zip,ioc,Додаток.pdf.zip +maltego.Hash,918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593,ioc,918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593 +maltego.Hash,be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c,ioc,be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c +maltego.IPv4Address,103.124.165.199,ioc,103.124.165[.]199 +maltego.IPv4Address,103.141.60.144,ioc,103.141.60[.]144 +maltego.IPv4Address,103.216.220.19,ioc,103.216.220[.]19 +maltego.IPv4Address,104.145.210.184,ioc,104.145.210[.]184 +maltego.IPv4Address,104.193.135.207,ioc,104.193.135[.]207 +maltego.IPv4Address,104.194.149.228,ioc,104.194.149[.]228 +maltego.IPv4Address,104.194.151.133,ioc,104.194.151[.]133 +maltego.IPv4Address,104.194.159.55,ioc,104.194.159[.]55 +maltego.IPv4Address,104.36.50.54,ioc,104.36.50[.]54 +maltego.IPv4Address,136.144.242.56,ioc,136.144.242[.]56 +maltego.IPv4Address,138.199.60.29,ioc,138.199.60[.]29 +maltego.IPv4Address,138.199.6.208,ioc,138.199.6[.]208 +maltego.IPv4Address,139.59.2.243,ioc,139.59.2[.]243 +maltego.IPv4Address,141.133.125.208,ioc,141.133.125[.]208 +maltego.IPv4Address,144.172.114.192,ioc,144.172.114[.]192 +maltego.IPv4Address,146.103.101.253,ioc,146.103.101[.]253 +maltego.IPv4Address,146.103.97.169,ioc,146.103.97[.]169 +maltego.IPv4Address,146.70.116.131,ioc,146.70.116[.]131 +maltego.IPv4Address,148.135.195.111,ioc,148.135.195[.]111 +maltego.IPv4Address,149.22.83.6,ioc,149.22.83[.]6 +maltego.IPv4Address,149.54.42.106,ioc,149.54.42[.]106 +maltego.IPv4Address,158.173.46.118,ioc,158.173.46[.]118 +maltego.IPv4Address,162.128.129.106,ioc,162.128.129[.]106 +maltego.IPv4Address,163.172.157.53,ioc,163.172.157[.]53 +maltego.IPv4Address,167.250.111.136,ioc,167.250.111[.]136 +maltego.IPv4Address,176.177.12.62,ioc,176.177.12[.]62 +maltego.IPv4Address,178.16.54.141,ioc,178.16.54[.]141 +maltego.IPv4Address,185.198.234.101,ioc,185.198.234[.]101 +maltego.IPv4Address,185.198.234.26,ioc,185.198.234[.]26 +maltego.IPv4Address,185.65.134.199,ioc,185.65.134[.]199 +maltego.IPv4Address,185.65.134.246,ioc,185.65.134[.]246 +maltego.IPv4Address,193.32.249.161,ioc,193.32.249[.]161 +maltego.IPv4Address,193.32.249.164,ioc,193.32.249[.]164 +maltego.IPv4Address,193.32.249.170,ioc,193.32.249[.]170 +maltego.IPv4Address,194.163.183.216,ioc,194.163.183[.]216 +maltego.IPv4Address,195.178.110.131,ioc,195.178.110[.]131 +maltego.IPv4Address,2.26.53.194,ioc,2.26.53[.]194 +maltego.IPv4Address,2001:ac8:27:89::a02d,ioc,2001:ac8:27[:]89::a02d +maltego.IPv4Address,2001:ac8:29:84::a01d,ioc,2001:ac8:29[:]84::a01d +maltego.IPv4Address,2001:bc8:711:5854:dc00:1ff:fe18:ba53,ioc,2001:bc8:711:5854:dc00:1ff:fe18[:]ba53 +maltego.IPv4Address,202.66.167.230,ioc,202.66.167[.]230 +maltego.IPv4Address,213.145.86.112,ioc,213.145.86[.]112 +maltego.IPv4Address,2a01:e0a:2e2:aa40:b15d:5d28:6f4a:8d53,ioc,2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53 +maltego.IPv4Address,2a04:cec0:1185:34f2:a150:7081:caed:448e,ioc,2a04:cec0:1185:34f2:a150:7081:caed[:]448e +maltego.IPv4Address,31.57.243.154,ioc,31.57.243[.]154 +maltego.IPv4Address,34.156.199.132,ioc,34.156.199[.]132 +maltego.IPv4Address,34.156.95.176,ioc,34.156.95[.]176 +maltego.IPv4Address,37.27.103.22,ioc,37.27.103[.]22 +maltego.IPv4Address,38.146.28.132,ioc,38.146.28[.]132 +maltego.IPv4Address,38.146.28.75,ioc,38.146.28[.]75 +maltego.IPv4Address,45.148.10.242,ioc,45.148.10[.]242 +maltego.IPv4Address,91.171.138.169,ioc,91.171.138[.]169 +maltego.IPv4Address,92.118.39.3,ioc,92.118.39[.]3 +maltego.Phrase,Netapi64,ioc,Netapi64 +maltego.Phrase,OpenAI APIS,ioc,OpenAI APIS +maltego.Phrase,"nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0",ioc,"nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0" +maltego.Phrase,postmark-mcp@1.0.16,ioc,postmark-mcp@1.0.16 +maltego.Phrase,tiktoken_mcp (PyPI),ioc,tiktoken_mcp (PyPI) +maltego.Phrase,OpenAIAgent.Netapi64,ioc,OpenAIAgent.Netapi64 +maltego.Phrase,XMRig or equivalent miner on a GPU host,ioc,XMRig or equivalent miner on a GPU host +maltego.URL,Assistant URL carrying a pre-filled prompt in a query parameter,ioc,Assistant URL carrying a pre-filled prompt in a query parameter +maltego.URL,https://s3.eu-central-1.s4.mega.io/fuckyoubasil/,ioc,https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/ +maltego.Phrase,malware:dustmaker,malware,DUSTMAKER +maltego.Phrase,malware:flodrix botnet,malware,Flodrix botnet +maltego.Phrase,malware:lamehug,malware,LAMEHUG +maltego.Phrase,malware:promptsteal,malware,PROMPTSTEAL +maltego.Phrase,malware:sandclock,malware,SANDCLOCK +maltego.Phrase,malware:sombermeme,malware,SOMBERMEME +maltego.Location,region:Americas,region,Americas +maltego.Location,region:Europe,region,Europe +maltego.File,rule:agentic_orchestration_behavior.yml,rule,agentic_orchestration_behavior.yml +maltego.File,rule:ai_agent_autostart_persistence.yml,rule,ai_agent_autostart_persistence.yml +maltego.File,rule:ai_agent_credential_file_access.yml,rule,ai_agent_credential_file_access.yml +maltego.File,rule:ai_agent_docker_socket_mount.yml,rule,ai_agent_docker_socket_mount.yml +maltego.File,rule:ai_agent_hook_config_modification.yml,rule,ai_agent_hook_config_modification.yml +maltego.File,rule:ai_agent_mcp_config_modification.yml,rule,ai_agent_mcp_config_modification.yml +maltego.File,rule:ai_agent_spawning_lolbin.yml,rule,ai_agent_spawning_lolbin.yml +maltego.File,rule:ai_agent_spawning_shell.yml,rule,ai_agent_spawning_shell.yml +maltego.File,rule:ai_assistant_outbound_to_camo_proxy.rules,rule,ai_assistant_outbound_to_camo_proxy.rules +maltego.File,rule:ai_cli_permission_bypass_invocation.yml,rule,ai_cli_permission_bypass_invocation.yml +maltego.File,rule:ai_inference_endpoint_redirection.yml,rule,ai_inference_endpoint_redirection.yml +maltego.File,rule:ai_service_api_c2.rules,rule,ai_service_api_c2.rules +maltego.File,rule:azure_openai_injection.yml,rule,azure_openai_injection.yml +maltego.File,rule:bedrock_high_token_usage.yml,rule,bedrock_high_token_usage.yml +maltego.File,rule:browser_agent_session_state_capture.yml,rule,browser_agent_session_state_capture.yml +maltego.File,rule:chatgpt_paste_sensitive_data.yml,rule,chatgpt_paste_sensitive_data.yml +maltego.File,rule:chroma_sqlite_unexpected_writer.yml,rule,chroma_sqlite_unexpected_writer.yml +maltego.File,rule:claude_desktop_config_modify.yml,rule,claude_desktop_config_modify.yml +maltego.File,rule:claude_session_jsonl_unexpected_access.yml,rule,claude_session_jsonl_unexpected_access.yml +maltego.File,rule:copilot_rules_file_backdoor.yar,rule,copilot_rules_file_backdoor.yar +maltego.File,rule:cursor_settings_db_modification.yml,rule,cursor_settings_db_modification.yml +maltego.File,rule:github_copilot_yolo_mode_enabled.yml,rule,github_copilot_yolo_mode_enabled.yml +maltego.File,rule:gpu_unexpected_high_utilization.yml,rule,gpu_unexpected_high_utilization.yml +maltego.File,rule:huggingface_cache_unexpected_writer.yml,rule,huggingface_cache_unexpected_writer.yml +maltego.File,rule:huggingface_token_exposure.yml,rule,huggingface_token_exposure.yml +maltego.File,rule:jailbreak_personas.yml,rule,jailbreak_personas.yml +maltego.File,rule:langflow_rce_exploitation_attempt.yml,rule,langflow_rce_exploitation_attempt.yml +maltego.File,rule:llm_api_prompt_in_script_generic.yar,rule,llm_api_prompt_in_script_generic.yar +maltego.File,rule:llm_response_base64_exfil.yml,rule,llm_response_base64_exfil.yml +maltego.File,rule:local_llm_listener_non_loopback.yml,rule,local_llm_listener_non_loopback.yml +maltego.File,rule:m365_copilot_anomalous_aggregation.yml,rule,m365_copilot_anomalous_aggregation.yml +maltego.File,rule:m365_copilot_sensitive_label_access.yml,rule,m365_copilot_sensitive_label_access.yml +maltego.File,rule:markdown_image_exfil.yml,rule,markdown_image_exfil.yml +maltego.File,rule:mcp_config_tampering.yml,rule,mcp_config_tampering.yml +maltego.File,rule:mcp_credential_access.yml,rule,mcp_credential_access.yml +maltego.File,rule:mcp_outbound_unknown_domain.rules,rule,mcp_outbound_unknown_domain.rules +maltego.File,rule:mcp_server_remote_code_fetch.yml,rule,mcp_server_remote_code_fetch.yml +maltego.File,rule:mcp_tool_poisoning.yar,rule,mcp_tool_poisoning.yar +maltego.File,rule:memory_poisoning.yml,rule,memory_poisoning.yml +maltego.File,rule:memory_poisoning_indicators.yar,rule,memory_poisoning_indicators.yar +maltego.File,rule:mlflow_path_traversal.rules,rule,mlflow_path_traversal.rules +maltego.File,rule:mlflow_unauth_api_access.yml,rule,mlflow_unauth_api_access.yml +maltego.File,rule:model_file_hash_mismatch.yml,rule,model_file_hash_mismatch.yml +maltego.File,rule:ollama_vllm_unauth_exposure.rules,rule,ollama_vllm_unauth_exposure.rules +maltego.File,rule:pickle_malicious_opcodes.yar,rule,pickle_malicious_opcodes.yar +maltego.File,rule:pip_install_typosquat.yml,rule,pip_install_typosquat.yml +maltego.File,rule:powershell_llm_api_command_generation.yml,rule,powershell_llm_api_command_generation.yml +maltego.File,rule:prompt_injection_keywords.yml,rule,prompt_injection_keywords.yml +maltego.File,rule:promptflux_artifacts_fileevent.yml,rule,promptflux_artifacts_fileevent.yml +maltego.File,rule:promptflux_thinking_robot.yar,rule,promptflux_thinking_robot.yar +maltego.File,rule:promptsteal_lamehug.yar,rule,promptsteal_lamehug.yar +maltego.File,rule:rag_document_hidden_text.yar,rule,rag_document_hidden_text.yar +maltego.File,rule:ray_dashboard_exposure.rules,rule,ray_dashboard_exposure.rules +maltego.File,rule:ray_jobs_api_rce.rules,rule,ray_jobs_api_rce.rules +maltego.File,rule:runtime_ai_malware_correlation.yml,rule,runtime_ai_malware_correlation.yml +maltego.File,rule:runtime_llm_api_c2.rules,rule,runtime_llm_api_c2.rules +maltego.File,rule:script_interpreter_llm_api_dns.yml,rule,script_interpreter_llm_api_dns.yml +maltego.File,rule:sesameop_assistants_api_c2.yml,rule,sesameop_assistants_api_c2.yml +maltego.File,rule:shadowray_process_masquerading.yml,rule,shadowray_process_masquerading.yml +maltego.File,rule:ssh_authorized_keys_injection.yml,rule,ssh_authorized_keys_injection.yml +maltego.File,rule:system_prompt_extraction.yml,rule,system_prompt_extraction.yml +maltego.File,rule:torchserve_shelltorch.rules,rule,torchserve_shelltorch.rules +maltego.File,rule:triton_inference_server_exploit.rules,rule,triton_inference_server_exploit.rules +maltego.File,rule:vector_db_bulk_exfil.yml,rule,vector_db_bulk_exfil.yml +maltego.File,rule:vector_db_query_anomaly.yml,rule,vector_db_query_anomaly.yml +maltego.File,rule:vector_db_unauth_exposure.rules,rule,vector_db_unauth_exposure.rules +maltego.Phrase,sector:chemical,sector,chemical +maltego.Phrase,sector:commercial-facilities,sector,commercial-facilities +maltego.Phrase,sector:consumers,sector,consumers +maltego.Phrase,sector:critical-manufacturing,sector,critical-manufacturing +maltego.Phrase,sector:cryptocurrency,sector,cryptocurrency +maltego.Phrase,sector:defense-industrial-base,sector,defense-industrial-base +maltego.Phrase,sector:education,sector,education +maltego.Phrase,sector:emergency-services,sector,emergency-services +maltego.Phrase,sector:energy,sector,energy +maltego.Phrase,sector:financial-services,sector,financial-services +maltego.Phrase,sector:government,sector,government +maltego.Phrase,sector:healthcare,sector,healthcare +maltego.Phrase,sector:information-technology,sector,information-technology +maltego.Phrase,sector:media-entertainment,sector,media-entertainment +maltego.Phrase,sector:ngo-think-tank,sector,ngo-think-tank +maltego.Phrase,sector:religious-institutions,sector,religious-institutions +maltego.Phrase,sector:research,sector,research +maltego.Phrase,sector:retail,sector,retail +maltego.Phrase,sector:software-supply-chain,sector,software-supply-chain +maltego.Phrase,sector:telecommunications,sector,telecommunications +maltego.Phrase,sector:transportation,sector,transportation +maltego.Phrase,tactic:AML.TA0001,tactic,AML.TA0001 AI Attack Adaptation +maltego.Phrase,tactic:AML.TA0002,tactic,AML.TA0002 Reconnaissance +maltego.Phrase,tactic:AML.TA0003,tactic,AML.TA0003 Resource Development +maltego.Phrase,tactic:AML.TA0004,tactic,AML.TA0004 Initial Access +maltego.Phrase,tactic:AML.TA0005,tactic,AML.TA0005 Execution +maltego.Phrase,tactic:AML.TA0006,tactic,AML.TA0006 Persistence +maltego.Phrase,tactic:AML.TA0007,tactic,AML.TA0007 Defense Evasion +maltego.Phrase,tactic:AML.TA0009,tactic,AML.TA0009 Collection +maltego.Phrase,tactic:AML.TA0010,tactic,AML.TA0010 Exfiltration +maltego.Phrase,tactic:AML.TA0011,tactic,AML.TA0011 Impact +maltego.Phrase,tactic:AML.TA0012,tactic,AML.TA0012 Privilege Escalation +maltego.Phrase,tactic:AML.TA0013,tactic,AML.TA0013 Credential Access +maltego.Phrase,tactic:AML.TA0014,tactic,AML.TA0014 Command and Control +maltego.Phrase,tactic:AML.TA0015,tactic,AML.TA0015 Lateral Movement +maltego.Phrase,tool:AIRT-0001,tool,Claude Code +maltego.Phrase,tool:AIRT-0002,tool,Cursor +maltego.Phrase,tool:AIRT-0006,tool,Codeium / Windsurf +maltego.Phrase,tool:AIRT-0008,tool,Amazon Q Developer (ex-CodeWhisperer) +maltego.Phrase,tool:AIRT-0011,tool,Claude Desktop (MCP host) +maltego.Phrase,tool:AIRT-0016,tool,GPT Pilot +maltego.Phrase,tool:AIRT-0037,tool,Google Gemini CLI +maltego.Phrase,tool:AIRT-0041,tool,Kiro +maltego.Phrase,tool:AIRT-0044,tool,Langflow diff --git a/artifacts/docs/api/graph/maltego-links.csv b/artifacts/docs/api/graph/maltego-links.csv new file mode 100644 index 0000000..47c6dd1 --- /dev/null +++ b/artifacts/docs/api/graph/maltego-links.csv @@ -0,0 +1,748 @@ +SourceType,SourceValue,TargetType,TargetValue,Relationship +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,atlas:AML.T0102,uses +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,case:AIRT-CS-0007,attributed-to +maltego.Phrase,actor:AIRT-TA-0001,maltego.Location,country:UA,targets +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,group:G0007,same-as +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,malware:lamehug,uses +maltego.Phrase,actor:AIRT-TA-0001,maltego.Phrase,malware:promptsteal,uses +maltego.Phrase,actor:AIRT-TA-0002,maltego.Phrase,case:AIRT-CS-0004,attributed-to +maltego.Phrase,actor:AIRT-TA-0002,maltego.Phrase,tool:AIRT-0001,abuses +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,asi:ASI02,maps-to +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,atlas:AML.T0103,uses +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,atlas:AML.T0116,uses +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,sector:emergency-services,targets +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,sector:government,targets +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,sector:healthcare,targets +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,sector:religious-institutions,targets +maltego.Phrase,actor:AIRT-TA-0003,maltego.Phrase,tool:AIRT-0001,abuses +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,asi:ASI05,maps-to +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,atlas:AML.T0081,uses +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,case:AIRT-CS-0017,attributed-to +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,malware:sombermeme,uses +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,sector:cryptocurrency,targets +maltego.Phrase,actor:AIRT-TA-0004,maltego.Phrase,tool:AIRT-0001,abuses +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,atlas:AML.T0010,uses +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,case:AIRT-CS-0016,attributed-to +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,malware:dustmaker,uses +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,malware:sandclock,uses +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,sector:software-supply-chain,targets +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,tool:AIRT-0001,abuses +maltego.Phrase,actor:AIRT-TA-0005,maltego.Phrase,tool:AIRT-0002,abuses +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,asi:ASI02,maps-to +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,atlas:AML.T0103,uses +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,atlas:AML.T0126,uses +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,case:AIRT-CS-0019,attributed-to +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,group:G1057,same-as +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,actor:AIRT-TA-0006,maltego.Phrase,tool:AIRT-0001,abuses +maltego.Phrase,actor:AIRT-TA-0007,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0007,maltego.Phrase,atlas:AML.T0017.002,uses +maltego.Phrase,actor:AIRT-TA-0007,maltego.Phrase,atlas:AML.T0087,uses +maltego.Phrase,actor:AIRT-TA-0007,maltego.Phrase,group:G1044,same-as +maltego.Phrase,actor:AIRT-TA-0008,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0008,maltego.Phrase,group:G0096,same-as +maltego.Phrase,actor:AIRT-TA-0009,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0009,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,actor:AIRT-TA-0009,maltego.Location,country:UA,targets +maltego.Phrase,actor:AIRT-TA-0009,maltego.Phrase,group:G0034,same-as +maltego.Phrase,actor:AIRT-TA-0010,maltego.Phrase,asi:ASI02,maps-to +maltego.Phrase,actor:AIRT-TA-0010,maltego.Phrase,atlas:AML.T0016.004,uses +maltego.Phrase,actor:AIRT-TA-0010,maltego.Phrase,atlas:AML.T0054,uses +maltego.Phrase,actor:AIRT-TA-0010,maltego.Location,country:US,targets +maltego.Phrase,actor:AIRT-TA-0010,maltego.Phrase,group:G0128,same-as +maltego.Phrase,actor:AIRT-TA-0011,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0011,maltego.Phrase,atlas:AML.T0054,uses +maltego.Phrase,actor:AIRT-TA-0011,maltego.Phrase,group:G0069,same-as +maltego.Phrase,actor:AIRT-TA-0012,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0013,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0013,maltego.Phrase,group:G0094,same-as +maltego.Phrase,actor:AIRT-TA-0013,maltego.Phrase,sector:education,targets +maltego.Phrase,actor:AIRT-TA-0013,maltego.Phrase,sector:ngo-think-tank,targets +maltego.Phrase,actor:AIRT-TA-0014,maltego.Phrase,atlas:AML.T0008,uses +maltego.Phrase,actor:AIRT-TA-0014,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,actor:AIRT-TA-0014,maltego.Phrase,sector:government,targets +maltego.Phrase,actor:AIRT-TA-0015,maltego.Phrase,atlas:AML.T0008.000,uses +maltego.Phrase,actor:AIRT-TA-0015,maltego.Phrase,atlas:AML.T0034,uses +maltego.Phrase,actor:AIRT-TA-0015,maltego.Location,country:CA,targets +maltego.Phrase,actor:AIRT-TA-0015,maltego.Location,country:US,targets +maltego.Phrase,actor:AIRT-TA-0015,maltego.Phrase,sector:defense-industrial-base,targets +maltego.Phrase,actor:AIRT-TA-0015,maltego.Phrase,sector:education,targets +maltego.Phrase,actor:AIRT-TA-0015,maltego.Phrase,sector:healthcare,targets +maltego.Phrase,actor:AIRT-TA-0015,maltego.Phrase,sector:research,targets +maltego.Phrase,actor:AIRT-TA-0016,maltego.Phrase,case:AIRT-CS-0018,attributed-to +maltego.Phrase,actor:AIRT-TA-0017,maltego.Phrase,case:AIRT-CS-0020,attributed-to +maltego.Phrase,actor:AIRT-TA-0018,maltego.Phrase,case:AIRT-CS-0021,attributed-to +maltego.Phrase,actor:AIRT-TA-0019,maltego.Phrase,case:AIRT-CS-0022,attributed-to +maltego.Phrase,actor:AIRT-TA-0019,maltego.Phrase,tool:AIRT-0001,abuses +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,atlas:AML.T0017.001,uses +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,atlas:AML.T0116,uses +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,atlas:AML.T0124,uses +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:critical-manufacturing,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:education,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:energy,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:financial-services,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:government,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:healthcare,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,actor:AIRT-TA-0020,maltego.Phrase,sector:retail,targets +maltego.Phrase,atlas:AML.T0008,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0008.000,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0010,maltego.Phrase,tactic:AML.TA0004,in-tactic +maltego.Phrase,atlas:AML.T0011,maltego.Phrase,tactic:AML.TA0005,in-tactic +maltego.Phrase,atlas:AML.T0016.002,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0016.004,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0017.001,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0017.002,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0024,maltego.Phrase,tactic:AML.TA0010,in-tactic +maltego.Phrase,atlas:AML.T0034,maltego.Phrase,tactic:AML.TA0011,in-tactic +maltego.Phrase,atlas:AML.T0049,maltego.Phrase,tactic:AML.TA0004,in-tactic +maltego.Phrase,atlas:AML.T0051,maltego.Phrase,tactic:AML.TA0005,in-tactic +maltego.Phrase,atlas:AML.T0053,maltego.Phrase,tactic:AML.TA0005,in-tactic +maltego.Phrase,atlas:AML.T0053,maltego.Phrase,tactic:AML.TA0012,in-tactic +maltego.Phrase,atlas:AML.T0053,maltego.Phrase,tactic:AML.TA0015,in-tactic +maltego.Phrase,atlas:AML.T0054,maltego.Phrase,tactic:AML.TA0007,in-tactic +maltego.Phrase,atlas:AML.T0054,maltego.Phrase,tactic:AML.TA0012,in-tactic +maltego.Phrase,atlas:AML.T0055,maltego.Phrase,tactic:AML.TA0013,in-tactic +maltego.Phrase,atlas:AML.T0080,maltego.Phrase,tactic:AML.TA0006,in-tactic +maltego.Phrase,atlas:AML.T0080.000,maltego.Phrase,tactic:AML.TA0006,in-tactic +maltego.Phrase,atlas:AML.T0081,maltego.Phrase,tactic:AML.TA0006,in-tactic +maltego.Phrase,atlas:AML.T0081,maltego.Phrase,tactic:AML.TA0007,in-tactic +maltego.Phrase,atlas:AML.T0082,maltego.Phrase,tactic:AML.TA0013,in-tactic +maltego.Phrase,atlas:AML.T0086,maltego.Phrase,tactic:AML.TA0010,in-tactic +maltego.Phrase,atlas:AML.T0087,maltego.Phrase,tactic:AML.TA0002,in-tactic +maltego.Phrase,atlas:AML.T0096,maltego.Phrase,tactic:AML.TA0014,in-tactic +maltego.Phrase,atlas:AML.T0102,maltego.Phrase,tactic:AML.TA0001,in-tactic +maltego.Phrase,atlas:AML.T0103,maltego.Phrase,tactic:AML.TA0005,in-tactic +maltego.Phrase,atlas:AML.T0115.002,maltego.Phrase,tactic:AML.TA0003,in-tactic +maltego.Phrase,atlas:AML.T0116,maltego.Phrase,tactic:AML.TA0002,in-tactic +maltego.Phrase,atlas:AML.T0117,maltego.Phrase,tactic:AML.TA0001,in-tactic +maltego.Phrase,atlas:AML.T0124,maltego.Phrase,tactic:AML.TA0001,in-tactic +maltego.Phrase,atlas:AML.T0126,maltego.Phrase,tactic:AML.TA0009,in-tactic +maltego.Phrase,case:AIRT-CS-0001,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,case:AIRT-CS-0001,maltego.Phrase,atlas:AML.T0010,uses +maltego.Phrase,case:AIRT-CS-0001,maltego.Phrase,bun,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.Phrase,065ee8eb,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.Phrase,rt-*,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.File,core/telemetry/.loader.lock,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.File,core/telemetry/__init__.py,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.File,core/telemetry/_hooks.py,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.File,core/telemetry/_runtime.bin,indicator +maltego.Phrase,case:AIRT-CS-0001,maltego.File,rule:ai_agent_credential_file_access.yml,detected-by +maltego.Phrase,case:AIRT-CS-0001,maltego.Phrase,tool:AIRT-0016,affects +maltego.Phrase,case:AIRT-CS-0002,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,case:AIRT-CS-0002,maltego.Phrase,atlas:AML.T0010,uses +maltego.Phrase,case:AIRT-CS-0002,maltego.Phrase,atlas:AML.T0115.002,uses +maltego.Phrase,case:AIRT-CS-0002,maltego.Phrase,phanpak,indicator +maltego.Phrase,case:AIRT-CS-0002,maltego.EmailAddress,phan@giftshop.club,indicator +maltego.Phrase,case:AIRT-CS-0002,maltego.Phrase,postmark-mcp@1.0.16,indicator +maltego.Phrase,case:AIRT-CS-0002,maltego.File,rule:ai_agent_mcp_config_modification.yml,detected-by +maltego.Phrase,case:AIRT-CS-0002,maltego.File,rule:mcp_config_tampering.yml,detected-by +maltego.Phrase,case:AIRT-CS-0002,maltego.File,rule:mcp_outbound_unknown_domain.rules,detected-by +maltego.Phrase,case:AIRT-CS-0002,maltego.File,rule:mcp_tool_poisoning.yar,detected-by +maltego.Phrase,case:AIRT-CS-0003,maltego.Phrase,asi:ASI05,maps-to +maltego.Phrase,case:AIRT-CS-0003,maltego.Phrase,atlas:AML.T0011,uses +maltego.Phrase,case:AIRT-CS-0003,maltego.Phrase,malware:flodrix botnet,uses +maltego.Phrase,case:AIRT-CS-0003,maltego.File,rule:langflow_rce_exploitation_attempt.yml,detected-by +maltego.Phrase,case:AIRT-CS-0003,maltego.File,rule:local_llm_listener_non_loopback.yml,detected-by +maltego.Phrase,case:AIRT-CS-0003,maltego.Phrase,tool:AIRT-0044,affects +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,asi:ASI01,maps-to +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,asi:ASI02,maps-to +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,atlas:AML.T0053,uses +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,atlas:AML.T0054,uses +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,atlas:AML.T0116,uses +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,atlas:AML.T0117,uses +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,campaign:C0062,same-as +maltego.Phrase,case:AIRT-CS-0004,maltego.File,rule:agentic_orchestration_behavior.yml,detected-by +maltego.Phrase,case:AIRT-CS-0004,maltego.File,rule:ai_agent_spawning_lolbin.yml,detected-by +maltego.Phrase,case:AIRT-CS-0004,maltego.File,rule:ai_agent_spawning_shell.yml,detected-by +maltego.Phrase,case:AIRT-CS-0004,maltego.File,rule:mcp_server_remote_code_fetch.yml,detected-by +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,sector:chemical,targets +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,sector:financial-services,targets +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,sector:government,targets +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,case:AIRT-CS-0004,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0005,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,case:AIRT-CS-0005,maltego.Domain,api.openai.com,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.File,.exe.config containing appDomainManagerAssembly,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.File,C:\Windows\Temp\*.Netapi64,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.File,C:\Windows\Temp\Netapi64.Exception,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.File,C:\Windows\Temp\Netapi64.start,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.File,Netapi64.dll,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.Phrase,Netapi64,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.Phrase,OpenAI APIS,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.Phrase,OpenAIAgent.Netapi64,indicator +maltego.Phrase,case:AIRT-CS-0005,maltego.File,rule:ai_service_api_c2.rules,detected-by +maltego.Phrase,case:AIRT-CS-0005,maltego.File,rule:sesameop_assistants_api_c2.yml,detected-by +maltego.Phrase,case:AIRT-CS-0006,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,case:AIRT-CS-0006,maltego.Phrase,%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup,indicator +maltego.Phrase,case:AIRT-CS-0006,maltego.Domain,generativelanguage.googleapis.com,indicator +maltego.Phrase,case:AIRT-CS-0006,maltego.File,%TEMP%\thinking_robot_log.txt,indicator +maltego.Phrase,case:AIRT-CS-0006,maltego.File,rule:llm_api_prompt_in_script_generic.yar,detected-by +maltego.Phrase,case:AIRT-CS-0006,maltego.File,rule:promptflux_artifacts_fileevent.yml,detected-by +maltego.Phrase,case:AIRT-CS-0006,maltego.File,rule:promptflux_thinking_robot.yar,detected-by +maltego.Phrase,case:AIRT-CS-0006,maltego.File,rule:runtime_ai_malware_correlation.yml,detected-by +maltego.Phrase,case:AIRT-CS-0006,maltego.File,rule:script_interpreter_llm_api_dns.yml,detected-by +maltego.Phrase,case:AIRT-CS-0007,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,case:AIRT-CS-0007,maltego.Location,country:UA,targets +maltego.Phrase,case:AIRT-CS-0007,maltego.Domain,api-inference.huggingface.co,indicator +maltego.Phrase,case:AIRT-CS-0007,maltego.File,Додаток.pdf.zip,indicator +maltego.Phrase,case:AIRT-CS-0007,maltego.File,rule:llm_api_prompt_in_script_generic.yar,detected-by +maltego.Phrase,case:AIRT-CS-0007,maltego.File,rule:promptsteal_lamehug.yar,detected-by +maltego.Phrase,case:AIRT-CS-0007,maltego.File,rule:runtime_llm_api_c2.rules,detected-by +maltego.Phrase,case:AIRT-CS-0007,maltego.Phrase,sector:defense-industrial-base,targets +maltego.Phrase,case:AIRT-CS-0007,maltego.Phrase,sector:government,targets +maltego.Phrase,case:AIRT-CS-0008,maltego.Phrase,asi:ASI01,maps-to +maltego.Phrase,case:AIRT-CS-0008,maltego.Phrase,atlas:AML.T0024,uses +maltego.Phrase,case:AIRT-CS-0008,maltego.Phrase,atlas:AML.T0051,uses +maltego.Phrase,case:AIRT-CS-0008,maltego.File,rule:ai_assistant_outbound_to_camo_proxy.rules,detected-by +maltego.Phrase,case:AIRT-CS-0008,maltego.File,rule:m365_copilot_anomalous_aggregation.yml,detected-by +maltego.Phrase,case:AIRT-CS-0008,maltego.File,rule:m365_copilot_sensitive_label_access.yml,detected-by +maltego.Phrase,case:AIRT-CS-0008,maltego.File,rule:markdown_image_exfil.yml,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,case:AIRT-CS-0009,maltego.Phrase,asi:ASI05,maps-to +maltego.Phrase,case:AIRT-CS-0009,maltego.File,rule:ai_agent_mcp_config_modification.yml,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.File,rule:claude_desktop_config_modify.yml,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.File,rule:mcp_config_tampering.yml,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.File,rule:mcp_credential_access.yml,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.File,rule:mcp_server_remote_code_fetch.yml,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.File,rule:mcp_tool_poisoning.yar,detected-by +maltego.Phrase,case:AIRT-CS-0009,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0009,maltego.Phrase,tool:AIRT-0002,affects +maltego.Phrase,case:AIRT-CS-0009,maltego.Phrase,tool:AIRT-0006,affects +maltego.Phrase,case:AIRT-CS-0009,maltego.Phrase,tool:AIRT-0011,affects +maltego.Phrase,case:AIRT-CS-0010,maltego.Phrase,asi:ASI06,maps-to +maltego.Phrase,case:AIRT-CS-0010,maltego.Phrase,atlas:AML.T0080,uses +maltego.Phrase,case:AIRT-CS-0010,maltego.Phrase,atlas:AML.T0080.000,uses +maltego.Phrase,case:AIRT-CS-0010,maltego.Phrase,atlas:AML.T0086,uses +maltego.Phrase,case:AIRT-CS-0010,maltego.File,"Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)",indicator +maltego.Phrase,case:AIRT-CS-0010,maltego.File,Framework checkpoint stores (LangGraph SQLite and equivalents),indicator +maltego.Phrase,case:AIRT-CS-0010,maltego.File,rule:copilot_rules_file_backdoor.yar,detected-by +maltego.Phrase,case:AIRT-CS-0010,maltego.File,rule:markdown_image_exfil.yml,detected-by +maltego.Phrase,case:AIRT-CS-0010,maltego.File,rule:memory_poisoning.yml,detected-by +maltego.Phrase,case:AIRT-CS-0010,maltego.File,rule:memory_poisoning_indicators.yar,detected-by +maltego.Phrase,case:AIRT-CS-0011,maltego.Phrase,asi:ASI06,maps-to +maltego.Phrase,case:AIRT-CS-0011,maltego.Phrase,atlas:AML.T0080,uses +maltego.Phrase,case:AIRT-CS-0011,maltego.URL,Assistant URL carrying a pre-filled prompt in a query parameter,indicator +maltego.Phrase,case:AIRT-CS-0011,maltego.File,rule:memory_poisoning.yml,detected-by +maltego.Phrase,case:AIRT-CS-0011,maltego.File,rule:memory_poisoning_indicators.yar,detected-by +maltego.Phrase,case:AIRT-CS-0011,maltego.Phrase,sector:consumers,targets +maltego.Phrase,case:AIRT-CS-0012,maltego.Phrase,asi:ASI06,maps-to +maltego.Phrase,case:AIRT-CS-0012,maltego.Phrase,atlas:AML.T0082,uses +maltego.Phrase,case:AIRT-CS-0012,maltego.File,rule:chroma_sqlite_unexpected_writer.yml,detected-by +maltego.Phrase,case:AIRT-CS-0012,maltego.File,rule:rag_document_hidden_text.yar,detected-by +maltego.Phrase,case:AIRT-CS-0012,maltego.File,rule:vector_db_bulk_exfil.yml,detected-by +maltego.Phrase,case:AIRT-CS-0012,maltego.File,rule:vector_db_query_anomaly.yml,detected-by +maltego.Phrase,case:AIRT-CS-0013,maltego.Phrase,atlas:AML.T0054,uses +maltego.Phrase,case:AIRT-CS-0013,maltego.Phrase,atlas:AML.T0096,uses +maltego.Phrase,case:AIRT-CS-0013,maltego.Location,country:MX,targets +maltego.Phrase,case:AIRT-CS-0013,maltego.File,rule:agentic_orchestration_behavior.yml,detected-by +maltego.Phrase,case:AIRT-CS-0013,maltego.File,rule:ai_agent_spawning_shell.yml,detected-by +maltego.Phrase,case:AIRT-CS-0013,maltego.Phrase,sector:government,targets +maltego.Phrase,case:AIRT-CS-0013,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0014,maltego.Phrase,campaign:C0045,same-as +maltego.Phrase,case:AIRT-CS-0014,maltego.Phrase,XMRig or equivalent miner on a GPU host,indicator +maltego.Phrase,case:AIRT-CS-0014,maltego.File,rule:gpu_unexpected_high_utilization.yml,detected-by +maltego.Phrase,case:AIRT-CS-0014,maltego.File,rule:ray_dashboard_exposure.rules,detected-by +maltego.Phrase,case:AIRT-CS-0014,maltego.File,rule:ray_jobs_api_rce.rules,detected-by +maltego.Phrase,case:AIRT-CS-0014,maltego.File,rule:shadowray_process_masquerading.yml,detected-by +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,asi:ASI02,maps-to +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,asi:ASI05,maps-to +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,atlas:AML.T0010,uses +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,atlas:AML.T0053,uses +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,attack:T1059,uses +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,attack:T1195.002,uses +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,attack:T1552.001,uses +maltego.Phrase,case:AIRT-CS-0015,maltego.File,/tmp/inventory.txt,indicator +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,"nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0",indicator +maltego.Phrase,case:AIRT-CS-0015,maltego.File,rule:ai_agent_credential_file_access.yml,detected-by +maltego.Phrase,case:AIRT-CS-0015,maltego.File,rule:ai_agent_spawning_shell.yml,detected-by +maltego.Phrase,case:AIRT-CS-0015,maltego.File,rule:ai_cli_permission_bypass_invocation.yml,detected-by +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,tool:AIRT-0008,affects +maltego.Phrase,case:AIRT-CS-0015,maltego.Phrase,tool:AIRT-0037,affects +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,asi:ASI03,maps-to +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,atlas:AML.T0010,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,atlas:AML.T0081,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,atlas:AML.T0115.002,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,attack:T1070,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,attack:T1195.002,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,attack:T1552.001,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,"/.claude/, /.cursor/, /.vscode/",indicator +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,tiktoken_mcp (PyPI),indicator +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,malware:dustmaker,uses +maltego.Phrase,case:AIRT-CS-0016,maltego.File,rule:ai_agent_hook_config_modification.yml,detected-by +maltego.Phrase,case:AIRT-CS-0016,maltego.File,rule:ai_agent_mcp_config_modification.yml,detected-by +maltego.Phrase,case:AIRT-CS-0016,maltego.File,rule:mcp_tool_poisoning.yar,detected-by +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,sector:software-supply-chain,targets +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0016,maltego.Phrase,tool:AIRT-0002,affects +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,asi:ASI04,maps-to +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,asi:ASI05,maps-to +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,atlas:AML.T0011,uses +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,atlas:AML.T0081,uses +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,attack:T1195.002,uses +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,attack:T1546,uses +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,malware:sombermeme,uses +maltego.Phrase,case:AIRT-CS-0017,maltego.File,rule:ai_agent_hook_config_modification.yml,detected-by +maltego.Phrase,case:AIRT-CS-0017,maltego.File,rule:ai_agent_spawning_shell.yml,detected-by +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,sector:cryptocurrency,targets +maltego.Phrase,case:AIRT-CS-0017,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,atlas:AML.T0103,uses +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,atlas:AML.T0116,uses +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,atlas:AML.T0117,uses +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,attack:T1528,uses +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,attack:T1566,uses +maltego.Phrase,case:AIRT-CS-0018,maltego.Location,country:UA,targets +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,ad-g.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,api.stuseamandesilt.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,cdn.stuseamandesilt.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,cdncounter.net,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,chamber-ua.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,chathamhouse.eu,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,docs-viewer.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,itechx.tel,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,m365-owa.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,meridian-protocol.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,meridiangroup-corp.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,metricwave.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,mgsend.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,ms365-device.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,ms365-live.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,mslivetest.duckdns.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,my-invite.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,mygreatmarket.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,mygreatmarket.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,owa-ms365.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,pdfviewer2024.b-cdn.net,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,projectnightcrawler.dev,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,russianearabroad.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,russianearabroad.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,static-ms.live,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,static.cdncounter.net,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,statistic-ms.live,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,stuseamandesilt.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,teams.ms365-live.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,ukrinform-share.net,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,update.stuseamandesilt.org,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,wa-connect.eu,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Domain,wa-meeting.com,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.EmailAddress,anna.manager@russianearabroad.net,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.EmailAddress,events@embassy-protocol.int,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.File,WUEngine.exe,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.File,client_20260507093021_4286d211_x64.exe,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.File,fix_network.apk,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.File,msedgeupdate_v3.exe,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Hash,918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Hash,be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,104.145.210.184,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,104.194.149.228,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,104.194.151.133,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,104.194.159.55,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,144.172.114.192,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,148.135.195.111,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,149.54.42.106,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,185.198.234.101,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,185.198.234.26,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,2.26.53.194,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,213.145.86.112,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,31.57.243.154,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,38.146.28.132,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.IPv4Address,38.146.28.75,indicator +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,sector:defense-industrial-base,targets +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,sector:government,targets +maltego.Phrase,case:AIRT-CS-0018,maltego.Phrase,sector:ngo-think-tank,targets +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,atlas:AML.T0103,uses +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,atlas:AML.T0126,uses +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,attack:T1552.001,uses +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,attack:T1567,uses +maltego.Phrase,case:AIRT-CS-0019,maltego.Location,country:FR,targets +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,-1003311614569,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,-1003893854338,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,8179098353,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,8628746407,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,8632748474,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,8664033117,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,8709258476,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,https://t.me/Soraki_Bot,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,ari-chain.com,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,arichain.network,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,autoshop.policenationale.cc,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,bitmart-mystery.com,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,defi-claim.xyz,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,emailsecure.email,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,esvfecawvjmchjslqyemho2fiduc59wzn.oast.fun,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,mozilla.ws,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,on-pssword.com,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,policenationale.cc,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,service-infos.info,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,signin-1psswoord.com,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers.dev,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,soraki.cc,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,soraki.work,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Domain,updatebeacon.duckdns.org,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,104.193.135.207,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,104.36.50.54,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,162.128.129.106,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,176.177.12.62,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,185.65.134.199,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,185.65.134.246,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,193.32.249.161,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,193.32.249.164,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,193.32.249.170,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,195.178.110.131,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,2a01:e0a:2e2:aa40:b15d:5d28:6f4a:8d53,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,2a04:cec0:1185:34f2:a150:7081:caed:448e,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,45.148.10.242,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,91.171.138.169,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.IPv4Address,92.118.39.3,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.URL,https://s3.eu-central-1.s4.mega.io/fuckyoubasil/,indicator +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,sector:energy,targets +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,sector:retail,targets +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,sector:telecommunications,targets +maltego.Phrase,case:AIRT-CS-0019,maltego.Phrase,sector:transportation,targets +maltego.Phrase,case:AIRT-CS-0020,maltego.Phrase,atlas:AML.T0017.001,uses +maltego.Phrase,case:AIRT-CS-0020,maltego.Phrase,atlas:AML.T0049,uses +maltego.Phrase,case:AIRT-CS-0020,maltego.Phrase,atlas:AML.T0124,uses +maltego.Phrase,case:AIRT-CS-0020,maltego.Phrase,attack:T1190,uses +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,141.133.125.208,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,146.103.101.253,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,146.103.97.169,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,167.250.111.136,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,178.16.54.141,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,194.163.183.216,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,202.66.167.230,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.IPv4Address,37.27.103.22,indicator +maltego.Phrase,case:AIRT-CS-0020,maltego.Phrase,sector:commercial-facilities,targets +maltego.Phrase,case:AIRT-CS-0020,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,atlas:AML.T0016.002,uses +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,atlas:AML.T0049,uses +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,attack:T1190,uses +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,attack:T1505.003,uses +maltego.Phrase,case:AIRT-CS-0021,maltego.Domain,3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd.onion,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.Domain,6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad.onion,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.Domain,fafwatch.xyz,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.Domain,frntrs-analytics-863060591218.europe-west1.run.app,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.Domain,frntrs-analytics.dedyn.io,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.Domain,prod-artfkt.com,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,103.124.165.199,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,103.141.60.144,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,103.216.220.19,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,136.144.242.56,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,138.199.60.29,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,138.199.6.208,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,139.59.2.243,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,146.70.116.131,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,149.22.83.6,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,158.173.46.118,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,163.172.157.53,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,2001:ac8:27:89::a02d,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,2001:ac8:29:84::a01d,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,2001:bc8:711:5854:dc00:1ff:fe18:ba53,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,34.156.199.132,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.IPv4Address,34.156.95.176,indicator +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,sector:government,targets +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,sector:media-entertainment,targets +maltego.Phrase,case:AIRT-CS-0021,maltego.Phrase,sector:ngo-think-tank,targets +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,asi:ASI03,maps-to +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,atlas:AML.T0034,uses +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,atlas:AML.T0055,uses +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,attack:T1557,uses +maltego.Phrase,case:AIRT-CS-0022,maltego.Domain,aws-us-east-3.com,indicator +maltego.Phrase,case:AIRT-CS-0022,maltego.Domain,awstore.cloud,indicator +maltego.Phrase,case:AIRT-CS-0022,maltego.Domain,holdboost.store,indicator +maltego.Phrase,case:AIRT-CS-0022,maltego.Domain,iymkjuzymkapovrntoxy.supabase.co,indicator +maltego.Phrase,case:AIRT-CS-0022,maltego.Domain,kiro.cheap,indicator +maltego.Phrase,case:AIRT-CS-0022,maltego.Domain,sys-tools.cfd,indicator +maltego.Phrase,case:AIRT-CS-0022,maltego.File,rule:ai_inference_endpoint_redirection.yml,detected-by +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,sector:consumers,targets +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,sector:information-technology,targets +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,tool:AIRT-0001,affects +maltego.Phrase,case:AIRT-CS-0022,maltego.Phrase,tool:AIRT-0041,affects +maltego.Location,country:CA,maltego.Location,region:Americas,in-region +maltego.Location,country:FR,maltego.Location,region:Europe,in-region +maltego.Location,country:MX,maltego.Location,region:Americas,in-region +maltego.Location,country:UA,maltego.Location,region:Europe,in-region +maltego.Location,country:US,maltego.Location,region:Americas,in-region +maltego.File,rule:agentic_orchestration_behavior.yml,maltego.Phrase,atlas:AML.T0053,detects +maltego.File,rule:agentic_orchestration_behavior.yml,maltego.Phrase,atlas:AML.T0054,detects +maltego.File,rule:agentic_orchestration_behavior.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:agentic_orchestration_behavior.yml,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:ai_agent_autostart_persistence.yml,maltego.Phrase,atlas:AML.T0081,detects +maltego.File,rule:ai_agent_credential_file_access.yml,maltego.Phrase,atlas:AML.T0055,detects +maltego.File,rule:ai_agent_docker_socket_mount.yml,maltego.Phrase,atlas:AML.T0053,detects +maltego.File,rule:ai_agent_hook_config_modification.yml,maltego.Phrase,atlas:AML.T0081,detects +maltego.File,rule:ai_agent_mcp_config_modification.yml,maltego.Phrase,atlas:AML.T0081,detects +maltego.File,rule:ai_agent_spawning_lolbin.yml,maltego.Phrase,atlas:AML.T0053,detects +maltego.File,rule:ai_agent_spawning_shell.yml,maltego.Phrase,atlas:AML.T0053,detects +maltego.File,rule:ai_assistant_outbound_to_camo_proxy.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:ai_cli_permission_bypass_invocation.yml,maltego.Phrase,atlas:AML.T0053,detects +maltego.File,rule:ai_inference_endpoint_redirection.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:ai_service_api_c2.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:ai_service_api_c2.rules,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:azure_openai_injection.yml,maltego.Phrase,atlas:AML.T0051,detects +maltego.File,rule:azure_openai_injection.yml,maltego.Phrase,atlas:AML.T0054,detects +maltego.File,rule:bedrock_high_token_usage.yml,maltego.Phrase,atlas:AML.T0051,detects +maltego.File,rule:bedrock_high_token_usage.yml,maltego.Phrase,atlas:AML.T0054,detects +maltego.File,rule:browser_agent_session_state_capture.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:chatgpt_paste_sensitive_data.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:claude_desktop_config_modify.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:claude_session_jsonl_unexpected_access.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:copilot_rules_file_backdoor.yar,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:cursor_settings_db_modification.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:github_copilot_yolo_mode_enabled.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:github_copilot_yolo_mode_enabled.yml,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:huggingface_cache_unexpected_writer.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:huggingface_token_exposure.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:jailbreak_personas.yml,maltego.Phrase,atlas:AML.T0054,detects +maltego.File,rule:langflow_rce_exploitation_attempt.yml,maltego.Phrase,atlas:AML.T0053,detects +maltego.File,rule:llm_api_prompt_in_script_generic.yar,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:llm_response_base64_exfil.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:local_llm_listener_non_loopback.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:m365_copilot_anomalous_aggregation.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:m365_copilot_anomalous_aggregation.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:m365_copilot_sensitive_label_access.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:markdown_image_exfil.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:mcp_config_tampering.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:mcp_credential_access.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:mcp_outbound_unknown_domain.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:mcp_outbound_unknown_domain.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:mcp_tool_poisoning.yar,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:mcp_tool_poisoning.yar,maltego.Phrase,atlas:AML.T0115.002,detects +maltego.File,rule:memory_poisoning.yml,maltego.Phrase,atlas:AML.T0080,detects +maltego.File,rule:memory_poisoning.yml,maltego.Phrase,atlas:AML.T0080.000,detects +maltego.File,rule:memory_poisoning.yml,maltego.Phrase,atlas:AML.T0081,detects +maltego.File,rule:memory_poisoning.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:memory_poisoning_indicators.yar,maltego.Phrase,atlas:AML.T0080.000,detects +maltego.File,rule:memory_poisoning_indicators.yar,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:mlflow_path_traversal.rules,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:mlflow_path_traversal.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:mlflow_path_traversal.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:mlflow_unauth_api_access.yml,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:model_file_hash_mismatch.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:ollama_vllm_unauth_exposure.rules,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:ollama_vllm_unauth_exposure.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:pickle_malicious_opcodes.yar,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:pickle_malicious_opcodes.yar,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:pip_install_typosquat.yml,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:powershell_llm_api_command_generation.yml,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:prompt_injection_keywords.yml,maltego.Phrase,atlas:AML.T0051,detects +maltego.File,rule:promptflux_artifacts_fileevent.yml,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:promptflux_thinking_robot.yar,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:promptsteal_lamehug.yar,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:ray_dashboard_exposure.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:ray_jobs_api_rce.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:ray_jobs_api_rce.rules,maltego.Phrase,atlas:AML.T0049,detects +maltego.File,rule:ray_jobs_api_rce.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:runtime_ai_malware_correlation.yml,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:runtime_llm_api_c2.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:runtime_llm_api_c2.rules,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:script_interpreter_llm_api_dns.yml,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:script_interpreter_llm_api_dns.yml,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:sesameop_assistants_api_c2.yml,maltego.Phrase,atlas:AML.T0096,detects +maltego.File,rule:shadowray_process_masquerading.yml,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:ssh_authorized_keys_injection.yml,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:system_prompt_extraction.yml,maltego.Phrase,atlas:AML.T0054,detects +maltego.File,rule:torchserve_shelltorch.rules,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:torchserve_shelltorch.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:triton_inference_server_exploit.rules,maltego.Phrase,atlas:AML.T0010,detects +maltego.File,rule:triton_inference_server_exploit.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:triton_inference_server_exploit.rules,maltego.Phrase,atlas:AML.T0086,detects +maltego.File,rule:vector_db_bulk_exfil.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:vector_db_query_anomaly.yml,maltego.Phrase,atlas:AML.T0024,detects +maltego.File,rule:vector_db_query_anomaly.yml,maltego.Phrase,atlas:AML.T0051,detects +maltego.File,rule:vector_db_unauth_exposure.rules,maltego.Phrase,atlas:AML.T0011,detects +maltego.File,rule:vector_db_unauth_exposure.rules,maltego.Phrase,atlas:AML.T0024,detects +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/anthropic-api-key,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/anthropic-auth-token,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/claude-code-oauth-token,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/claude-config-dir-credentials-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/claude-credentials-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/claude-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/config-anthropic-configs,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/credential/project-mcp-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/appdata-npm-claude-cmd,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/claude,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/claude-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/local-bin-claude,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/repo-claude-md,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/repo-claude-settings-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/repo-mcp-json,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/disk/usr-local-bin-claude,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/mcp-config/claude-json-mcpservers-user-scope,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/network/api-anthropic-com-443-tcp,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/process/claude-node,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/process/node-exe-claude,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall,leaves +maltego.Phrase,tool:AIRT-0001,maltego.File,artifact:AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/appdata-cursor-user-globalstorage-state-vscdb,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/config-cursor-auth-json,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/config-cursor-user-globalstorage-state-vscdb,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/cursor-mcp-json,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/library-application-support-cursor-user-globalstorage-st,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/macos-login-keychain-generic-password-service-cursor-saf,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/macos-login-keychain-generic-password-services-cursor-ac,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/credential/repo-cursor-mcp-json,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/appdata-cursor-user,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/appdata-cursor-user-skills,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/config-cursor-user,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/cursor-mcp-json,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/library-application-support-cursor-user,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/localappdata-cursor-updater,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/localappdata-programs-cursor,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/localappdata-programs-cursor-cursor-exe,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/localappdata-programs-cursor-resources-app-bin-cursor,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/repo-cursor-mcp-json,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/disk/repo-cursorrules-repo-cursor-rules-mdc,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/mcp-config/cursor-mcp-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/mcp-config/repo-cursor-mcp-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/network/cursor-sh-api2-cursor-sh-anysphere-co-443-tcp,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/process/cursor-exe,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/registry/hkcu-software-classes-cursor-shell-open-command-default,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-run-curso,leaves +maltego.Phrase,tool:AIRT-0002,maltego.File,artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-uninstall,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/appdata-windsurf-user-globalstorage-state-vscdb,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/codeium-config-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/codeium-windsurf-mcp-config-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/config-windsurf-user-globalstorage-state-vscdb,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/library-application-support-windsurf-user-globalstorage-,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/nvim-stdpath-cache-codeium-config-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/credential/userprofile-codeium-windsurf-mcp-config-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/disk/codeium,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/disk/codeium-version-language-server,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/disk/codeium-windsurf-mcp-config-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/disk/repo-windsurf-settings-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/disk/repo-windsurfrules,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/disk/userprofile-codeium-windsurf-mcp-config-json,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/mcp-config/codeium-mcp-config-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/mcp-config/codeium-windsurf-mcp-config-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/network/server-codeium-com-codeium-com-windsurf-com-443-tcp,leaves +maltego.Phrase,tool:AIRT-0006,maltego.File,artifact:AIRT-0006/process/windsurf-exe-language-server-windows-x64-exe,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/credential/aws-sso-cache-json,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/aws-amazonq-cli-agents-json,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/local-share-amazon-q-data-sqlite3,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/local-share-amazon-q-settings-json,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-iam-bin,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-token-b,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/repo-amazonq-cli-agents-json,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/repo-amazonq-rules-md,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/userprofile-vscode-extensions-amazonwebservices-amazon-q,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/disk/xdg-runtime-dir-qlog-cli-log,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/mcp-config/aws-amazonq-default-json-agent-configuration-global-scop,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/mcp-config/aws-amazonq-mcp-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/mcp-config/repo-amazonq-default-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/mcp-config/repo-amazonq-mcp-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/network/q-us-east-1-amazonaws-com-codewhisperer-amazonaws-com-aw,leaves +maltego.Phrase,tool:AIRT-0008,maltego.File,artifact:AIRT-0008/process/node-aws-lsp-codewhisperer-token-binary-js,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/credential/appdata-claude,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/credential/claude-desktop-config-json-mcpservers-name-env,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/credential/config-claude,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/credential/library-application-support-claude,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/appdata-claude-claude-desktop-config-json,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/appdata-claude-logs-mcp-log,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/applications-claude-app,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/applications-claude-app-2,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/config-claude,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/config-claude-ant-did,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/config-claude-claude-desktop-config-json,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/config-claude-config-json,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/config-claude-logs-mcp-log,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/library-application-support-claude-claude-desktop-config,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/library-logs-claude-mcp-log,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/library-preferences-com-anthropic-claudefordesktop-plist,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/disk/mcpb-desktop-extension,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/mcp-config/appdata-claude-claude-desktop-config-json-mcpservers-nam,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/mcp-config/config-claude-claude-desktop-config-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/mcp-config/library-application-support-claude-claude-desktop-config,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/mcp-config/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/mcp-config/mcpb-dxt-bundle-files-manifest-json-inside-archive,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/network/api-anthropic-com-claude-ai-443-tcp,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/network/registry-npmjs-org-npx-mcp-server-fetch-443-tcp,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/process/claude,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/process/claude-exe,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/registry/hkcu-software-classes-activatableclasses-package-claude-,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/registry/hkcu-software-classes-claude-shell-open-command-default,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-run-claud,leaves +maltego.Phrase,tool:AIRT-0011,maltego.File,artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-uninstall,leaves +maltego.Phrase,tool:AIRT-0016,maltego.File,artifact:AIRT-0016/credential/install-config-json,leaves +maltego.Phrase,tool:AIRT-0016,maltego.File,artifact:AIRT-0016/credential/install-data-database-pythagora-db,leaves +maltego.Phrase,tool:AIRT-0016,maltego.File,artifact:AIRT-0016/credential/install-pilot-env,leaves +maltego.Phrase,tool:AIRT-0016,maltego.File,artifact:AIRT-0016/credential/openai-api-key-anthropic-api-key-groq-api-key,leaves +maltego.Phrase,tool:AIRT-0016,maltego.File,artifact:AIRT-0016/registry/hkcu-environment-openai-api-key-anthropic-api-key-groq-a,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/credential/gemini-env,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/credential/gemini-google-accounts-json,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/credential/gemini-oauth-creds-json,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/disk/etc-gemini-cli-settings-json,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/disk/gemini-npm-g-google-gemini-cli,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/disk/gemini-settings-json,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/mcp-config/gemini-settings-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/mcp-config/repo-gemini-settings-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/network/generativelanguage-googleapis-com-oauth2-googleapis-com-,leaves +maltego.Phrase,tool:AIRT-0037,maltego.File,artifact:AIRT-0037/process/gemini-node,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/credential/aws-builder-id-iam-identity-center-token-cache,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/credential/mcpservers-name-env-inside-kiro-settings-mcp-json,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/kiro-mcp-logs-view-output-channel,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/kiro-settings-mcp-json,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/power-md-plugin-json-dev-kiro,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/repo-kiro-agents,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/repo-kiro-hooks-kiro-hook,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/repo-kiro-settings-mcp-json,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/repo-kiro-specs,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/repo-kiro-steering-md,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/disk/vs-code-style-globalstorage-extensions-and-state-vscdb-p,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/mcp-config/kiro-settings-mcp-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/mcp-config/repo-kiro-settings-mcp-json-mcpservers,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/network/kiro-dev-aws-kiro-service-endpoints-443-tcp,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/network/kiro-url-scheme-and-https-kiro-dev-launch-mcp-add-name-c,leaves +maltego.Phrase,tool:AIRT-0041,maltego.File,artifact:AIRT-0041/process/kiro-ide-kiro-cli,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/appdata-com-langflowdesktop-data-database-db,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-config-dir-private-key-pem-public-key-pem-along,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-config-dir-secret-key-default-home-cache-langfl,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-data-database-db,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-database-url,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-db-pip-install-install-lib-python3-x-site-packa,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-secret-key,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/langflow-superuser-langflow-superuser-password,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/credential/project-env-path-passed-to-langflow-run-env-file,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/disk/exported-flow-json-files,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/disk/langflow,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/disk/langflow-auto-login,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/disk/langflow-db-sqlite-in-the-config-dir,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/disk/langflow-superuser-langflow-superuser-password,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/eventlog/microsoft-windows-sysmon-operational-eid-1,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/mcp-config/langflow-projects-published-as-mcp-tools-each-project-is,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/mcp-config/mcp-server-registrations-added-in-settings-mcp-servers-p,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/network/configured-llm-provider-endpoints-443-tcp,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/network/langflow-web-ui-api-7860-tcp,leaves +maltego.Phrase,tool:AIRT-0044,maltego.File,artifact:AIRT-0044/process/python-langflow-run-uvicorn,leaves diff --git a/artifacts/docs/api/intel.json b/artifacts/docs/api/intel.json new file mode 100644 index 0000000..e86b83f --- /dev/null +++ b/artifacts/docs/api/intel.json @@ -0,0 +1,18333 @@ +{ + "atlas_release": "2026.09", + "stats": { + "actors": 20, + "cases": 22, + "iocs": 221, + "atomic_iocs": 163, + "techniques_observed": 29, + "techniques_covered": 14, + "techniques_off_host": 11, + "by_kind": { + "state-nexus": 13, + "criminal": 5, + "unattributed-cluster": 2 + }, + "by_nexus": { + "unstated": 7, + "CN": 5, + "KP": 3, + "RU": 3, + "IR": 2 + }, + "by_motivation": { + "espionage": 12, + "financial": 8, + "destruction": 1, + "hacktivism": 1 + }, + "by_sector": { + "government": 7, + "information-technology": 6, + "defense-industrial-base": 3, + "education": 3, + "healthcare": 3, + "ngo-think-tank": 3, + "energy": 2, + "financial-services": 2, + "retail": 2, + "chemical": 1, + "commercial-facilities": 1, + "consumers": 1, + "critical-manufacturing": 1, + "cryptocurrency": 1, + "emergency-services": 1, + "media-entertainment": 1, + "religious-institutions": 1, + "research": 1, + "software-supply-chain": 1, + "telecommunications": 1, + "transportation": 1 + }, + "by_country": { + "UA": 3, + "US": 2, + "CA": 1, + "FR": 1 + }, + "by_region": { + "Europe": 4, + "Americas": 2 + }, + "case_sectors": { + "government": 5, + "information-technology": 5, + "consumers": 2, + "defense-industrial-base": 2, + "ngo-think-tank": 2, + "chemical": 1, + "commercial-facilities": 1, + "cryptocurrency": 1, + "energy": 1, + "financial-services": 1, + "media-entertainment": 1, + "retail": 1, + "software-supply-chain": 1, + "telecommunications": 1, + "transportation": 1 + }, + "by_ioc_type": { + "domain": 64, + "ip": 53, + "behavior": 29, + "pattern": 19, + "file": 18, + "account": 9, + "config": 5, + "directory": 3, + "email": 3, + "malware": 3, + "package": 3, + "endpoint": 2, + "hash": 2, + "mutex": 2, + "process": 2, + "url": 2, + "binary": 1, + "commit": 1 + }, + "cases_by_quarter": { + "2024-Q1": 1, + "2024-Q3": 1, + "2025-Q2": 2, + "2025-Q3": 5, + "2025-Q4": 3, + "2026-Q1": 2, + "2026-Q2": 1, + "2026-Q3": 7 + }, + "link_confidence": { + "medium": 9 + }, + "technique_use": { + "AML.T0008": { + "actors": [ + "AIRT-TA-0014" + ], + "cases": [], + "rules": [] + }, + "AML.T0008.000": { + "actors": [ + "AIRT-TA-0015" + ], + "cases": [], + "rules": [] + }, + "AML.T0010": { + "actors": [ + "AIRT-TA-0005" + ], + "cases": [ + "AIRT-CS-0001", + "AIRT-CS-0002", + "AIRT-CS-0015", + "AIRT-CS-0016" + ], + "rules": [ + "claude_desktop_config_modify.yml", + "copilot_rules_file_backdoor.yar", + "cursor_settings_db_modification.yml", + "github_copilot_yolo_mode_enabled.yml", + "huggingface_cache_unexpected_writer.yml", + "mcp_config_tampering.yml", + "mlflow_path_traversal.rules", + "model_file_hash_mismatch.yml", + "ollama_vllm_unauth_exposure.rules", + "pip_install_typosquat.yml", + "torchserve_shelltorch.rules", + "triton_inference_server_exploit.rules" + ] + }, + "AML.T0011": { + "actors": [ + "AIRT-TA-0004" + ], + "cases": [ + "AIRT-CS-0003", + "AIRT-CS-0017" + ], + "rules": [ + "github_copilot_yolo_mode_enabled.yml", + "mcp_outbound_unknown_domain.rules", + "mlflow_path_traversal.rules", + "mlflow_unauth_api_access.yml", + "ollama_vllm_unauth_exposure.rules", + "pickle_malicious_opcodes.yar", + "ray_dashboard_exposure.rules", + "ray_jobs_api_rce.rules", + "shadowray_process_masquerading.yml", + "ssh_authorized_keys_injection.yml", + "torchserve_shelltorch.rules", + "triton_inference_server_exploit.rules", + "vector_db_unauth_exposure.rules" + ] + }, + "AML.T0016.002": { + "actors": [ + "AIRT-TA-0001", + "AIRT-TA-0004", + "AIRT-TA-0007", + "AIRT-TA-0008", + "AIRT-TA-0009", + "AIRT-TA-0011", + "AIRT-TA-0012", + "AIRT-TA-0013", + "AIRT-TA-0014", + "AIRT-TA-0016", + "AIRT-TA-0018" + ], + "cases": [ + "AIRT-CS-0018", + "AIRT-CS-0021" + ], + "rules": [] + }, + "AML.T0016.004": { + "actors": [ + "AIRT-TA-0010" + ], + "cases": [], + "rules": [] + }, + "AML.T0017.001": { + "actors": [ + "AIRT-TA-0017", + "AIRT-TA-0020" + ], + "cases": [ + "AIRT-CS-0020" + ], + "rules": [] + }, + "AML.T0017.002": { + "actors": [ + "AIRT-TA-0007" + ], + "cases": [], + "rules": [] + }, + "AML.T0024": { + "actors": [], + "cases": [ + "AIRT-CS-0008" + ], + "rules": [ + "ai_inference_endpoint_redirection.yml", + "llm_response_base64_exfil.yml", + "local_llm_listener_non_loopback.yml", + "m365_copilot_anomalous_aggregation.yml", + "markdown_image_exfil.yml", + "vector_db_bulk_exfil.yml", + "vector_db_query_anomaly.yml", + "vector_db_unauth_exposure.rules" + ] + }, + "AML.T0034": { + "actors": [ + "AIRT-TA-0015", + "AIRT-TA-0019" + ], + "cases": [ + "AIRT-CS-0022" + ], + "rules": [] + }, + "AML.T0049": { + "actors": [ + "AIRT-TA-0017", + "AIRT-TA-0018" + ], + "cases": [ + "AIRT-CS-0020", + "AIRT-CS-0021" + ], + "rules": [ + "ray_jobs_api_rce.rules" + ] + }, + "AML.T0051": { + "actors": [], + "cases": [ + "AIRT-CS-0008" + ], + "rules": [ + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "prompt_injection_keywords.yml", + "vector_db_query_anomaly.yml" + ] + }, + "AML.T0053": { + "actors": [ + "AIRT-TA-0002" + ], + "cases": [ + "AIRT-CS-0004", + "AIRT-CS-0015" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_agent_docker_socket_mount.yml", + "ai_agent_spawning_lolbin.yml", + "ai_agent_spawning_shell.yml", + "ai_cli_permission_bypass_invocation.yml", + "langflow_rce_exploitation_attempt.yml" + ] + }, + "AML.T0054": { + "actors": [ + "AIRT-TA-0002", + "AIRT-TA-0010", + "AIRT-TA-0011" + ], + "cases": [ + "AIRT-CS-0004", + "AIRT-CS-0013" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "system_prompt_extraction.yml" + ] + }, + "AML.T0055": { + "actors": [ + "AIRT-TA-0003", + "AIRT-TA-0005", + "AIRT-TA-0006", + "AIRT-TA-0018", + "AIRT-TA-0019" + ], + "cases": [ + "AIRT-CS-0015", + "AIRT-CS-0016", + "AIRT-CS-0019", + "AIRT-CS-0021", + "AIRT-CS-0022" + ], + "rules": [ + "ai_agent_credential_file_access.yml" + ] + }, + "AML.T0080": { + "actors": [], + "cases": [ + "AIRT-CS-0010", + "AIRT-CS-0011" + ], + "rules": [ + "memory_poisoning.yml" + ] + }, + "AML.T0080.000": { + "actors": [], + "cases": [ + "AIRT-CS-0010" + ], + "rules": [ + "memory_poisoning.yml", + "memory_poisoning_indicators.yar" + ] + }, + "AML.T0081": { + "actors": [ + "AIRT-TA-0004", + "AIRT-TA-0005" + ], + "cases": [ + "AIRT-CS-0016", + "AIRT-CS-0017" + ], + "rules": [ + "ai_agent_autostart_persistence.yml", + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "memory_poisoning.yml" + ] + }, + "AML.T0082": { + "actors": [], + "cases": [ + "AIRT-CS-0012" + ], + "rules": [] + }, + "AML.T0086": { + "actors": [], + "cases": [ + "AIRT-CS-0010" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_assistant_outbound_to_camo_proxy.rules", + "ai_service_api_c2.rules", + "browser_agent_session_state_capture.yml", + "chatgpt_paste_sensitive_data.yml", + "claude_session_jsonl_unexpected_access.yml", + "huggingface_token_exposure.yml", + "m365_copilot_anomalous_aggregation.yml", + "m365_copilot_sensitive_label_access.yml", + "mcp_credential_access.yml", + "mcp_outbound_unknown_domain.rules", + "mcp_tool_poisoning.yar", + "memory_poisoning.yml", + "memory_poisoning_indicators.yar", + "mlflow_path_traversal.rules", + "pickle_malicious_opcodes.yar", + "ray_jobs_api_rce.rules", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "triton_inference_server_exploit.rules" + ] + }, + "AML.T0087": { + "actors": [ + "AIRT-TA-0007" + ], + "cases": [], + "rules": [] + }, + "AML.T0096": { + "actors": [ + "AIRT-TA-0001", + "AIRT-TA-0002", + "AIRT-TA-0009" + ], + "cases": [ + "AIRT-CS-0004", + "AIRT-CS-0005", + "AIRT-CS-0006", + "AIRT-CS-0007", + "AIRT-CS-0013" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_service_api_c2.rules", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml" + ] + }, + "AML.T0102": { + "actors": [ + "AIRT-TA-0001" + ], + "cases": [], + "rules": [] + }, + "AML.T0103": { + "actors": [ + "AIRT-TA-0003", + "AIRT-TA-0006", + "AIRT-TA-0016" + ], + "cases": [ + "AIRT-CS-0018", + "AIRT-CS-0019" + ], + "rules": [] + }, + "AML.T0115.002": { + "actors": [ + "AIRT-TA-0005" + ], + "cases": [ + "AIRT-CS-0002", + "AIRT-CS-0016" + ], + "rules": [ + "mcp_tool_poisoning.yar" + ] + }, + "AML.T0116": { + "actors": [ + "AIRT-TA-0002", + "AIRT-TA-0003", + "AIRT-TA-0016", + "AIRT-TA-0020" + ], + "cases": [ + "AIRT-CS-0004", + "AIRT-CS-0018" + ], + "rules": [] + }, + "AML.T0117": { + "actors": [ + "AIRT-TA-0002", + "AIRT-TA-0016" + ], + "cases": [ + "AIRT-CS-0004", + "AIRT-CS-0018" + ], + "rules": [] + }, + "AML.T0124": { + "actors": [ + "AIRT-TA-0017", + "AIRT-TA-0020" + ], + "cases": [ + "AIRT-CS-0020" + ], + "rules": [] + }, + "AML.T0126": { + "actors": [ + "AIRT-TA-0006" + ], + "cases": [ + "AIRT-CS-0019" + ], + "rules": [] + } + } + }, + "analytics": { + "method": { + "similarity": "IDF-weighted Jaccard over techniques (0.4), tools (0.2), sectors (0.2), ai_services (0.1), motivation (0.1); facets neither side reports are skipped", + "clusters": "average-linkage agglomerative, stopped below similarity 0.3", + "cooccurrence": "40 observations (case studies and sightings); pairs seen at least twice", + "backlog": "score = 2 x actors + cases using the technique, rule-less techniques only" + }, + "similarity": { + "ids": [ + "AIRT-TA-0001", + "AIRT-TA-0002", + "AIRT-TA-0003", + "AIRT-TA-0004", + "AIRT-TA-0005", + "AIRT-TA-0006", + "AIRT-TA-0007", + "AIRT-TA-0008", + "AIRT-TA-0009", + "AIRT-TA-0010", + "AIRT-TA-0011", + "AIRT-TA-0012", + "AIRT-TA-0013", + "AIRT-TA-0014", + "AIRT-TA-0015", + "AIRT-TA-0016", + "AIRT-TA-0017", + "AIRT-TA-0018", + "AIRT-TA-0019", + "AIRT-TA-0020" + ], + "matrix": [ + [ + 1.0, + 0.176, + 0.023, + 0.064, + 0.0, + 0.0, + 0.191, + 0.197, + 0.316, + 0.165, + 0.235, + 0.142, + 0.322, + 0.331, + 0.173, + 0.357, + 0.0, + 0.125, + 0.0, + 0.143 + ], + [ + 0.176, + 1.0, + 0.264, + 0.2, + 0.072, + 0.215, + 0.1, + 0.044, + 0.086, + 0.153, + 0.161, + 0.0, + 0.1, + 0.133, + 0.1, + 0.257, + 0.029, + 0.047, + 0.101, + 0.191 + ], + [ + 0.023, + 0.264, + 1.0, + 0.332, + 0.203, + 0.512, + 0.0, + 0.056, + 0.0, + 0.0, + 0.0, + 0.1, + 0.0, + 0.028, + 0.025, + 0.175, + 0.1, + 0.082, + 0.247, + 0.088 + ], + [ + 0.064, + 0.2, + 0.332, + 1.0, + 0.218, + 0.321, + 0.073, + 0.185, + 0.085, + 0.046, + 0.106, + 0.229, + 0.108, + 0.093, + 0.0, + 0.059, + 0.1, + 0.07, + 0.165, + 0.0 + ], + [ + 0.0, + 0.072, + 0.203, + 0.218, + 1.0, + 0.2, + 0.0, + 0.056, + 0.0, + 0.0, + 0.0, + 0.1, + 0.0, + 0.0, + 0.0, + 0.0, + 0.111, + 0.041, + 0.2, + 0.0 + ], + [ + 0.0, + 0.215, + 0.512, + 0.321, + 0.2, + 1.0, + 0.0, + 0.056, + 0.0, + 0.0, + 0.0, + 0.1, + 0.0, + 0.0, + 0.0, + 0.063, + 0.119, + 0.074, + 0.255, + 0.054 + ], + [ + 0.191, + 0.1, + 0.0, + 0.073, + 0.0, + 0.0, + 1.0, + 0.372, + 0.151, + 0.261, + 0.444, + 0.299, + 0.224, + 0.23, + 0.125, + 0.187, + 0.059, + 0.071, + 0.0, + 0.186 + ], + [ + 0.197, + 0.044, + 0.056, + 0.185, + 0.056, + 0.056, + 0.372, + 1.0, + 0.363, + 0.217, + 0.572, + 0.927, + 0.555, + 0.308, + 0.055, + 0.177, + 0.07, + 0.167, + 0.056, + 0.055 + ], + [ + 0.316, + 0.086, + 0.0, + 0.085, + 0.0, + 0.0, + 0.151, + 0.363, + 1.0, + 0.112, + 0.261, + 0.332, + 0.279, + 0.187, + 0.03, + 0.129, + 0.0, + 0.125, + 0.0, + 0.03 + ], + [ + 0.165, + 0.153, + 0.0, + 0.046, + 0.0, + 0.0, + 0.261, + 0.217, + 0.112, + 1.0, + 0.501, + 0.143, + 0.194, + 0.194, + 0.125, + 0.162, + 0.0, + 0.044, + 0.0, + 0.125 + ], + [ + 0.235, + 0.161, + 0.0, + 0.106, + 0.0, + 0.0, + 0.444, + 0.572, + 0.261, + 0.501, + 1.0, + 0.498, + 0.374, + 0.306, + 0.125, + 0.223, + 0.0, + 0.125, + 0.0, + 0.125 + ], + [ + 0.142, + 0.0, + 0.1, + 0.229, + 0.1, + 0.1, + 0.299, + 0.927, + 0.332, + 0.143, + 0.498, + 1.0, + 0.5, + 0.253, + 0.0, + 0.122, + 0.125, + 0.167, + 0.1, + 0.0 + ], + [ + 0.322, + 0.1, + 0.0, + 0.108, + 0.0, + 0.0, + 0.224, + 0.555, + 0.279, + 0.194, + 0.374, + 0.5, + 1.0, + 0.353, + 0.17, + 0.316, + 0.0, + 0.219, + 0.0, + 0.152 + ], + [ + 0.331, + 0.133, + 0.028, + 0.093, + 0.0, + 0.0, + 0.23, + 0.308, + 0.187, + 0.194, + 0.306, + 0.253, + 0.353, + 1.0, + 0.247, + 0.282, + 0.0, + 0.162, + 0.0, + 0.189 + ], + [ + 0.173, + 0.1, + 0.025, + 0.0, + 0.0, + 0.0, + 0.125, + 0.055, + 0.03, + 0.125, + 0.125, + 0.0, + 0.17, + 0.247, + 1.0, + 0.166, + 0.0, + 0.0, + 0.102, + 0.171 + ], + [ + 0.357, + 0.257, + 0.175, + 0.059, + 0.0, + 0.063, + 0.187, + 0.177, + 0.129, + 0.162, + 0.223, + 0.122, + 0.316, + 0.282, + 0.166, + 1.0, + 0.0, + 0.191, + 0.0, + 0.2 + ], + [ + 0.0, + 0.029, + 0.1, + 0.1, + 0.111, + 0.119, + 0.059, + 0.07, + 0.0, + 0.0, + 0.0, + 0.125, + 0.0, + 0.0, + 0.0, + 0.0, + 1.0, + 0.145, + 0.154, + 0.328 + ], + [ + 0.125, + 0.047, + 0.082, + 0.07, + 0.041, + 0.074, + 0.071, + 0.167, + 0.125, + 0.044, + 0.125, + 0.167, + 0.219, + 0.162, + 0.0, + 0.191, + 0.145, + 1.0, + 0.115, + 0.032 + ], + [ + 0.0, + 0.101, + 0.247, + 0.165, + 0.2, + 0.255, + 0.0, + 0.056, + 0.0, + 0.0, + 0.0, + 0.1, + 0.0, + 0.0, + 0.102, + 0.0, + 0.154, + 0.115, + 1.0, + 0.015 + ], + [ + 0.143, + 0.191, + 0.088, + 0.0, + 0.0, + 0.054, + 0.186, + 0.055, + 0.03, + 0.125, + 0.125, + 0.0, + 0.152, + 0.189, + 0.171, + 0.2, + 0.328, + 0.032, + 0.015, + 1.0 + ] + ] + }, + "neighbours": { + "AIRT-TA-0001": [ + { + "actor": "AIRT-TA-0016", + "score": 0.357, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "defense-industrial-base", + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0014", + "score": 0.331, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0013", + "score": 0.322, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "openai models" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0002": [ + { + "actor": "AIRT-TA-0003", + "score": 0.264, + "shared": { + "techniques": [ + "AML.T0116" + ], + "tools": [ + "AIRT-0001" + ], + "sectors": [ + "government" + ] + } + }, + { + "actor": "AIRT-TA-0016", + "score": 0.257, + "shared": { + "techniques": [ + "AML.T0116", + "AML.T0117" + ], + "sectors": [ + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0006", + "score": 0.215, + "shared": { + "tools": [ + "AIRT-0001" + ], + "sectors": [ + "information-technology" + ] + } + } + ], + "AIRT-TA-0003": [ + { + "actor": "AIRT-TA-0006", + "score": 0.512, + "shared": { + "techniques": [ + "AML.T0055", + "AML.T0103" + ], + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0004", + "score": 0.332, + "shared": { + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0002", + "score": 0.264, + "shared": { + "techniques": [ + "AML.T0116" + ], + "tools": [ + "AIRT-0001" + ], + "sectors": [ + "government" + ] + } + } + ], + "AIRT-TA-0004": [ + { + "actor": "AIRT-TA-0003", + "score": 0.332, + "shared": { + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0006", + "score": 0.321, + "shared": { + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0012", + "score": 0.229, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "financial" + ] + } + } + ], + "AIRT-TA-0005": [ + { + "actor": "AIRT-TA-0004", + "score": 0.218, + "shared": { + "techniques": [ + "AML.T0081" + ], + "tools": [ + "AIRT-0001" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0003", + "score": 0.203, + "shared": { + "techniques": [ + "AML.T0055" + ], + "tools": [ + "AIRT-0001" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0006", + "score": 0.2, + "shared": { + "techniques": [ + "AML.T0055" + ], + "tools": [ + "AIRT-0001" + ], + "motivation": [ + "financial" + ] + } + } + ], + "AIRT-TA-0006": [ + { + "actor": "AIRT-TA-0003", + "score": 0.512, + "shared": { + "techniques": [ + "AML.T0055", + "AML.T0103" + ], + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0004", + "score": 0.321, + "shared": { + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0019", + "score": 0.255, + "shared": { + "techniques": [ + "AML.T0055" + ], + "tools": [ + "AIRT-0001" + ], + "sectors": [ + "information-technology" + ], + "motivation": [ + "financial" + ] + } + } + ], + "AIRT-TA-0007": [ + { + "actor": "AIRT-TA-0011", + "score": 0.444, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0008", + "score": 0.372, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0012", + "score": 0.299, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ] + } + } + ], + "AIRT-TA-0008": [ + { + "actor": "AIRT-TA-0012", + "score": 0.927, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0011", + "score": 0.572, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0013", + "score": 0.555, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0009": [ + { + "actor": "AIRT-TA-0008", + "score": 0.363, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0012", + "score": 0.332, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ] + } + }, + { + "actor": "AIRT-TA-0001", + "score": 0.316, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002", + "AML.T0096" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0010": [ + { + "actor": "AIRT-TA-0011", + "score": 0.501, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0054" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0007", + "score": 0.261, + "shared": { + "techniques": [ + "AML.T0016" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0008", + "score": 0.217, + "shared": { + "techniques": [ + "AML.T0016" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0011": [ + { + "actor": "AIRT-TA-0008", + "score": 0.572, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0010", + "score": 0.501, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0054" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0012", + "score": 0.498, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ] + } + } + ], + "AIRT-TA-0012": [ + { + "actor": "AIRT-TA-0008", + "score": 0.927, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0013", + "score": 0.5, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ] + } + }, + { + "actor": "AIRT-TA-0011", + "score": 0.498, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ] + } + } + ], + "AIRT-TA-0013": [ + { + "actor": "AIRT-TA-0008", + "score": 0.555, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0012", + "score": 0.5, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ] + } + }, + { + "actor": "AIRT-TA-0011", + "score": 0.374, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0014": [ + { + "actor": "AIRT-TA-0013", + "score": 0.353, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0001", + "score": 0.331, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0008", + "score": 0.308, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "ai_services": [ + "gemini" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0015": [ + { + "actor": "AIRT-TA-0014", + "score": 0.247, + "shared": { + "techniques": [ + "AML.T0008" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0001", + "score": 0.173, + "shared": { + "sectors": [ + "defense-industrial-base" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0020", + "score": 0.171, + "shared": { + "sectors": [ + "education", + "healthcare" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0016": [ + { + "actor": "AIRT-TA-0001", + "score": 0.357, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "defense-industrial-base", + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0013", + "score": 0.316, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "ngo-think-tank" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0014", + "score": 0.282, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "government" + ], + "motivation": [ + "espionage" + ] + } + } + ], + "AIRT-TA-0017": [ + { + "actor": "AIRT-TA-0020", + "score": 0.328, + "shared": { + "techniques": [ + "AML.T0017", + "AML.T0017.001", + "AML.T0124" + ], + "sectors": [ + "information-technology" + ] + } + }, + { + "actor": "AIRT-TA-0019", + "score": 0.154, + "shared": { + "sectors": [ + "information-technology" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0018", + "score": 0.145, + "shared": { + "techniques": [ + "AML.T0049" + ], + "sectors": [ + "information-technology" + ] + } + } + ], + "AIRT-TA-0018": [ + { + "actor": "AIRT-TA-0013", + "score": 0.219, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "ngo-think-tank" + ] + } + }, + { + "actor": "AIRT-TA-0016", + "score": 0.191, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "government", + "ngo-think-tank" + ] + } + }, + { + "actor": "AIRT-TA-0008", + "score": 0.167, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ] + } + } + ], + "AIRT-TA-0019": [ + { + "actor": "AIRT-TA-0006", + "score": 0.255, + "shared": { + "techniques": [ + "AML.T0055" + ], + "tools": [ + "AIRT-0001" + ], + "sectors": [ + "information-technology" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0003", + "score": 0.247, + "shared": { + "techniques": [ + "AML.T0055" + ], + "tools": [ + "AIRT-0001" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actor": "AIRT-TA-0005", + "score": 0.2, + "shared": { + "techniques": [ + "AML.T0055" + ], + "tools": [ + "AIRT-0001" + ], + "motivation": [ + "financial" + ] + } + } + ], + "AIRT-TA-0020": [ + { + "actor": "AIRT-TA-0017", + "score": 0.328, + "shared": { + "techniques": [ + "AML.T0017", + "AML.T0017.001", + "AML.T0124" + ], + "sectors": [ + "information-technology" + ] + } + }, + { + "actor": "AIRT-TA-0016", + "score": 0.2, + "shared": { + "techniques": [ + "AML.T0116" + ], + "sectors": [ + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actor": "AIRT-TA-0002", + "score": 0.191, + "shared": { + "techniques": [ + "AML.T0116" + ], + "sectors": [ + "financial-services", + "government", + "information-technology" + ], + "motivation": [ + "espionage" + ] + } + } + ] + }, + "clusters": [ + { + "actors": [ + "AIRT-TA-0007", + "AIRT-TA-0008", + "AIRT-TA-0011", + "AIRT-TA-0012", + "AIRT-TA-0013" + ], + "thin": true, + "cohesion": 0.476, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ] + } + }, + { + "actors": [ + "AIRT-TA-0001", + "AIRT-TA-0014", + "AIRT-TA-0016" + ], + "thin": false, + "cohesion": 0.323, + "shared": { + "techniques": [ + "AML.T0016", + "AML.T0016.002" + ], + "sectors": [ + "government" + ], + "motivation": [ + "espionage" + ] + } + }, + { + "actors": [ + "AIRT-TA-0003", + "AIRT-TA-0004", + "AIRT-TA-0006" + ], + "thin": false, + "cohesion": 0.388, + "shared": { + "tools": [ + "AIRT-0001" + ], + "ai_services": [ + "claude code" + ], + "motivation": [ + "financial" + ] + } + }, + { + "actors": [ + "AIRT-TA-0017", + "AIRT-TA-0020" + ], + "thin": false, + "cohesion": 0.328, + "shared": { + "techniques": [ + "AML.T0017", + "AML.T0017.001", + "AML.T0124" + ], + "sectors": [ + "information-technology" + ] + } + } + ], + "cooccurrence": [ + { + "a": "AML.T0017.001", + "b": "AML.T0124", + "support": 2, + "confidence_ab": 1.0, + "confidence_ba": 1.0, + "lift": 20.0 + }, + { + "a": "AML.T0103", + "b": "AML.T0126", + "support": 2, + "confidence_ab": 0.5, + "confidence_ba": 1.0, + "lift": 10.0 + }, + { + "a": "AML.T0116", + "b": "AML.T0117", + "support": 2, + "confidence_ab": 0.5, + "confidence_ba": 1.0, + "lift": 10.0 + }, + { + "a": "AML.T0010", + "b": "AML.T0115.002", + "support": 2, + "confidence_ab": 0.4, + "confidence_ba": 1.0, + "lift": 8.0 + }, + { + "a": "AML.T0103", + "b": "AML.T0116", + "support": 2, + "confidence_ab": 0.5, + "confidence_ba": 0.5, + "lift": 5.0 + }, + { + "a": "AML.T0010", + "b": "AML.T0055", + "support": 3, + "confidence_ab": 0.6, + "confidence_ba": 0.429, + "lift": 3.43 + }, + { + "a": "AML.T0054", + "b": "AML.T0096", + "support": 2, + "confidence_ab": 0.5, + "confidence_ba": 0.286, + "lift": 2.86 + }, + { + "a": "AML.T0055", + "b": "AML.T0103", + "support": 2, + "confidence_ab": 0.286, + "confidence_ba": 0.5, + "lift": 2.86 + } + ], + "events": [ + { + "date": "2024-02-14", + "actor": "AIRT-TA-0001", + "kind": "sighting", + "ref": "Microsoft Threat Intelligence", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2024-02-14", + "actor": "AIRT-TA-0013", + "kind": "sighting", + "ref": "Microsoft Threat Intelligence", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2024-03-26", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0014", + "techniques": [] + }, + { + "date": "2024-09-24", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0010", + "techniques": [ + "AML.T0080", + "AML.T0080.000", + "AML.T0086" + ] + }, + { + "date": "2025-04-09", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0003", + "techniques": [ + "AML.T0011" + ] + }, + { + "date": "2025-06", + "actor": "AIRT-TA-0001", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0096", + "AML.T0102" + ] + }, + { + "date": "2025-06-11", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0008", + "techniques": [ + "AML.T0051", + "AML.T0024" + ] + }, + { + "date": "2025-07-09", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0009", + "techniques": [] + }, + { + "date": "2025-07-17", + "actor": "AIRT-TA-0001", + "kind": "case", + "ref": "AIRT-CS-0007", + "techniques": [ + "AML.T0096" + ] + }, + { + "date": "2025-08", + "actor": "AIRT-TA-0008", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2025-08-13", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0012", + "techniques": [ + "AML.T0082" + ] + }, + { + "date": "2025-08-26", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0015", + "techniques": [ + "AML.T0010", + "AML.T0053", + "AML.T0055" + ] + }, + { + "date": "2025-08-27", + "actor": "AIRT-TA-0003", + "kind": "sighting", + "ref": "Anthropic", + "techniques": [ + "AML.T0103", + "AML.T0116", + "AML.T0055" + ] + }, + { + "date": "2025-09", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0002", + "techniques": [ + "AML.T0010", + "AML.T0115.002" + ] + }, + { + "date": "2025-11-03", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0005", + "techniques": [ + "AML.T0096" + ] + }, + { + "date": "2025-11-05", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0006", + "techniques": [ + "AML.T0096" + ] + }, + { + "date": "2025-11-05", + "actor": "AIRT-TA-0004", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2025-11-05", + "actor": "AIRT-TA-0007", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002", + "AML.T0017.002" + ] + }, + { + "date": "2025-11-05", + "actor": "AIRT-TA-0011", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002", + "AML.T0054" + ] + }, + { + "date": "2025-11-05", + "actor": "AIRT-TA-0012", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2025-11-13", + "actor": "AIRT-TA-0002", + "kind": "case", + "ref": "AIRT-CS-0004", + "techniques": [ + "AML.T0053", + "AML.T0054", + "AML.T0096", + "AML.T0116", + "AML.T0117" + ] + }, + { + "date": "2026-02-10", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0011", + "techniques": [ + "AML.T0080" + ] + }, + { + "date": "2026-02-12", + "actor": "AIRT-TA-0007", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002", + "AML.T0087" + ] + }, + { + "date": "2026-02-12", + "actor": "AIRT-TA-0008", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2026-02-12", + "actor": "AIRT-TA-0010", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.004", + "AML.T0054" + ] + }, + { + "date": "2026-02-25", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0013", + "techniques": [ + "AML.T0054", + "AML.T0096" + ] + }, + { + "date": "2026-05-11", + "actor": "AIRT-TA-0005", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0010", + "AML.T0055" + ] + }, + { + "date": "2026-05-11", + "actor": "AIRT-TA-0014", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002", + "AML.T0008" + ] + }, + { + "date": "2026-06-08", + "actor": "", + "kind": "case", + "ref": "AIRT-CS-0001", + "techniques": [ + "AML.T0010" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0004", + "kind": "case", + "ref": "AIRT-CS-0017", + "techniques": [ + "AML.T0081", + "AML.T0011" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0004", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002", + "AML.T0081" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0005", + "kind": "case", + "ref": "AIRT-CS-0016", + "techniques": [ + "AML.T0010", + "AML.T0115.002", + "AML.T0081", + "AML.T0055" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0006", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0103", + "AML.T0126" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0007", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0009", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0016.002", + "AML.T0096" + ] + }, + { + "date": "2026-09-08", + "actor": "AIRT-TA-0015", + "kind": "sighting", + "ref": "GTIG", + "techniques": [ + "AML.T0008.000", + "AML.T0034" + ] + }, + { + "date": "2026-09-10", + "actor": "AIRT-TA-0006", + "kind": "case", + "ref": "AIRT-CS-0019", + "techniques": [ + "AML.T0103", + "AML.T0055", + "AML.T0126" + ] + }, + { + "date": "2026-09-10", + "actor": "AIRT-TA-0016", + "kind": "case", + "ref": "AIRT-CS-0018", + "techniques": [ + "AML.T0016.002", + "AML.T0103", + "AML.T0116", + "AML.T0117" + ] + }, + { + "date": "2026-09-10", + "actor": "AIRT-TA-0017", + "kind": "case", + "ref": "AIRT-CS-0020", + "techniques": [ + "AML.T0124", + "AML.T0017.001", + "AML.T0049" + ] + }, + { + "date": "2026-09-10", + "actor": "AIRT-TA-0018", + "kind": "case", + "ref": "AIRT-CS-0021", + "techniques": [ + "AML.T0016.002", + "AML.T0049", + "AML.T0055" + ] + }, + { + "date": "2026-09-10", + "actor": "AIRT-TA-0019", + "kind": "case", + "ref": "AIRT-CS-0022", + "techniques": [ + "AML.T0034", + "AML.T0055" + ] + }, + { + "date": "2026-09-10", + "actor": "AIRT-TA-0020", + "kind": "sighting", + "ref": "Anthropic", + "techniques": [ + "AML.T0017.001", + "AML.T0124", + "AML.T0116" + ] + } + ], + "cadence": { + "AIRT-TA-0001": { + "events": 3, + "span_days": 519, + "median_gap_days": 473 + }, + "AIRT-TA-0002": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0003": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0004": { + "events": 3, + "span_days": 307, + "median_gap_days": 307 + }, + "AIRT-TA-0005": { + "events": 2, + "span_days": 120, + "median_gap_days": 120 + }, + "AIRT-TA-0006": { + "events": 2, + "span_days": 2, + "median_gap_days": 2 + }, + "AIRT-TA-0007": { + "events": 3, + "span_days": 307, + "median_gap_days": 208 + }, + "AIRT-TA-0008": { + "events": 2, + "span_days": 195, + "median_gap_days": 195 + }, + "AIRT-TA-0009": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0010": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0011": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0012": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0013": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0014": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0015": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0016": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0017": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0018": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0019": { + "events": 1, + "span_days": 0, + "median_gap_days": null + }, + "AIRT-TA-0020": { + "events": 1, + "span_days": 0, + "median_gap_days": null + } + }, + "backlog": [ + { + "technique": "AML.T0103", + "name": "Deploy AI Agent", + "actors": 3, + "cases": 2, + "score": 8, + "off_host": false + }, + { + "technique": "AML.T0034", + "name": "Cost Harvesting", + "actors": 2, + "cases": 1, + "score": 5, + "off_host": false + }, + { + "technique": "AML.T0126", + "name": "Automated Collection", + "actors": 1, + "cases": 1, + "score": 3, + "off_host": false + }, + { + "technique": "AML.T0082", + "name": "RAG Credential Harvesting", + "actors": 0, + "cases": 1, + "score": 1, + "off_host": false + }, + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "actors": 11, + "cases": 2, + "score": 24, + "off_host": true + }, + { + "technique": "AML.T0116", + "name": "Autonomous Reconnaissance", + "actors": 4, + "cases": 2, + "score": 10, + "off_host": true + }, + { + "technique": "AML.T0117", + "name": "Autonomous Attack-Path Adaptation", + "actors": 2, + "cases": 2, + "score": 6, + "off_host": true + }, + { + "technique": "AML.T0017.001", + "name": "Autonomous Exploit Development", + "actors": 2, + "cases": 1, + "score": 5, + "off_host": true + }, + { + "technique": "AML.T0124", + "name": "Autonomous Attack Orchestration", + "actors": 2, + "cases": 1, + "score": 5, + "off_host": true + }, + { + "technique": "AML.T0008", + "name": "Acquire Infrastructure", + "actors": 1, + "cases": 0, + "score": 2, + "off_host": true + }, + { + "technique": "AML.T0008.000", + "name": "AI Development Workspaces", + "actors": 1, + "cases": 0, + "score": 2, + "off_host": true + }, + { + "technique": "AML.T0016.004", + "name": "AI Agent Tools", + "actors": 1, + "cases": 0, + "score": 2, + "off_host": true + }, + { + "technique": "AML.T0017.002", + "name": "AI Agent Tools", + "actors": 1, + "cases": 0, + "score": 2, + "off_host": true + }, + { + "technique": "AML.T0087", + "name": "Gather Victim Identity Information", + "actors": 1, + "cases": 0, + "score": 2, + "off_host": true + }, + { + "technique": "AML.T0102", + "name": "Generate Malicious Commands", + "actors": 1, + "cases": 0, + "score": 2, + "off_host": true + } + ], + "tactic_observations": { + "AML.TA0004": 7, + "AML.TA0003": 21, + "AML.TA0005": 9, + "AML.TA0001": 5, + "AML.TA0002": 5, + "AML.TA0007": 7, + "AML.TA0012": 5, + "AML.TA0014": 7, + "AML.TA0015": 2, + "AML.TA0010": 2, + "AML.TA0006": 5, + "AML.TA0013": 8, + "AML.TA0009": 2, + "AML.TA0011": 2 + }, + "observations": 40 + }, + "actors": [ + { + "id": "AIRT-TA-0001", + "name": "APT28", + "aliases": [ + { + "name": "Fancy Bear", + "source": "MITRE ATT&CK G0007" + }, + { + "name": "Forest Blizzard", + "source": "Microsoft" + }, + { + "name": "FROZENLAKE", + "source": "GTIG" + }, + { + "name": "UAC-0001", + "source": "CERT-UA" + } + ], + "kind": "state-nexus", + "nexus": "RU", + "motivation": [ + "espionage" + ], + "summary": "Russian military intelligence (GRU unit 26165) group. It is the first state actor publicly reported running LLM-querying malware in live operations: PROMPTSTEAL, which CERT-UA tracks as LAMEHUG, asked a hosted model for collection commands against Ukrainian targets. Earlier AI use reported by Microsoft was research and scripting assistance.", + "confidence": "high", + "basis": "Attribution of the group itself is long-standing and multi-source (ATT&CK G0007). Its LLM use is reported by three independent parties: CERT-UA, GTIG and Microsoft.", + "contested": "CERT-UA attributes LAMEHUG to UAC-0001 (APT28) with moderate confidence. The malware behaviour is better established than the attribution.", + "external_ids": { + "attack_group": [ + "G0007" + ] + }, + "malware": [ + "PROMPTSTEAL", + "LAMEHUG" + ], + "sightings": [ + { + "date": "2024-02-14", + "reporter": "Microsoft Threat Intelligence", + "summary": "Used LLMs to research satellite communication and radar technologies, and for basic scripting assistance.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "OpenAI models" + ], + "reference": "https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/" + }, + { + "date": "2025-06", + "reporter": "GTIG", + "summary": "Deployed PROMPTSTEAL against Ukraine. It queries Qwen2.5-Coder through the Hugging Face API for reconnaissance and document-collection commands, then runs them.", + "atlas": [ + "AML.T0096", + "AML.T0102" + ], + "ai_services": [ + "Hugging Face inference API" + ], + "victims": { + "countries": [ + "UA" + ], + "basis": "GTIG: new malware against Ukraine." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ], + "references": [ + { + "title": "CERT-UA #16039 - LAMEHUG (17 Jul 2025)", + "url": "https://cert.gov.ua/article/6284730" + }, + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "title": "Microsoft Threat Intelligence - Staying ahead of threat actors in the age of AI (14 Feb 2024)", + "url": "https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/" + } + ], + "cases": [ + "AIRT-CS-0007" + ], + "links": [ + { + "case": "AIRT-CS-0007", + "ref": "AIRT-TA-0001", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "CERT-UA (UAC-0001); GTIG", + "stated_confidence": "CERT-UA - moderate confidence; GTIG - \"the Russian government-backed actor APT28 (aka FROZENLAKE)\"", + "reference": "https://cert.gov.ua/article/6284730" + } + ], + "derived": { + "techniques": [ + "AML.T0016.002", + "AML.T0096", + "AML.T0102" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0001", + "AML.TA0003", + "AML.TA0014" + ], + "sectors": [ + "defense-industrial-base", + "government" + ], + "countries": [ + "UA" + ], + "regions": [ + "Europe" + ], + "first_seen": "2024-02-14", + "last_seen": "2025-07-17", + "tools": [], + "iocs": [ + { + "type": "domain", + "value": "api-inference.huggingface.co", + "description": "Inference API egress from a compiled desktop utility is the pivot", + "case": "AIRT-CS-0007" + }, + { + "type": "pattern", + "value": "Hard-coded hf_ API token inside a binary", + "description": "Hugging Face token; usable for provider-side scoping", + "case": "AIRT-CS-0007" + }, + { + "type": "pattern", + "value": "Qwen2.5-Coder-32B-Instruct referenced as the target model", + "description": "Model selector observed in samples", + "case": "AIRT-CS-0007" + }, + { + "type": "file", + "value": "Додаток.pdf.zip", + "description": "Phishing archive name reported by CERT-UA; carries a PyInstaller executable beside a decoy PDF", + "case": "AIRT-CS-0007" + }, + { + "type": "behavior", + "value": "Command execution parented by a desktop utility rather than a shell", + "description": "The executed commands never appear in the sample, so process lineage is the evidence", + "case": "AIRT-CS-0007" + }, + { + "type": "behavior", + "value": "Staged collection from Documents, Desktop and Downloads", + "description": "Collection targets Office, PDF and TXT files", + "case": "AIRT-CS-0007" + }, + { + "type": "behavior", + "value": "Exfiltration over SFTP or HTTP POST", + "description": "Two observed channels", + "case": "AIRT-CS-0007" + } + ], + "detections_cited": [ + "llm_api_prompt_in_script_generic.yar", + "promptsteal_lamehug.yar", + "runtime_llm_api_c2.rules" + ], + "detections_by_technique": [ + "agentic_orchestration_behavior.yml", + "ai_service_api_c2.rules", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml" + ], + "gaps": [], + "off_host": [ + "AML.T0016.002", + "AML.T0102" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0096", + "name": "AI Service API", + "tactics": [ + "AML.TA0014" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_service_api_c2.rules", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0102", + "name": "Generate Malicious Commands", + "tactics": [ + "AML.TA0001" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [ + { + "case": "AIRT-CS-0007", + "phase": "", + "action": "Reconstruct capability from process lineage and egress, not from the sample: static analysis under-reports because the commands are generated after execution." + }, + { + "case": "AIRT-CS-0007", + "phase": "", + "action": "Hunt for outbound requests to inference API hosts from compiled desktop applications that have no reason to reach one." + }, + { + "case": "AIRT-CS-0007", + "phase": "", + "action": "Recover any hf_ token from the binary and use it to scope provider-side activity and other samples sharing the key." + }, + { + "case": "AIRT-CS-0007", + "phase": "", + "action": "Treat every Office, PDF and TXT file in the user profile as candidate exfiltration scope, since collection was breadth-first rather than targeted." + }, + { + "case": "AIRT-CS-0007", + "phase": "", + "action": "Check for SFTP and outbound HTTP POST from the same process, and preserve the staging directory before it is cleaned up." + } + ] + } + }, + { + "id": "AIRT-TA-0002", + "name": "GTG-1002", + "kind": "state-nexus", + "nexus": "CN", + "motivation": [ + "espionage" + ], + "summary": "Anthropic's designation for a cluster it assessed with high confidence to be a Chinese state-sponsored group. The cluster built a framework around Claude Code and MCP tools that ran most of an intrusion campaign against about thirty organisations. MITRE catalogues the activity as ATT&CK campaign C0062 and ATLAS case study AML.CS0069.", + "confidence": "medium", + "basis": "One reporting party, the provider whose product was abused. MITRE's adoption corroborates that the campaign happened, not the attribution or the autonomy figures.", + "contested": "The degree of autonomy was publicly questioned by independent researchers. See AIRT-CS-0004.", + "external_ids": { + "attack_campaign": [ + "C0062" + ], + "atlas_case_study": [ + "AML.CS0069" + ] + }, + "abuses": [ + "AIRT-0001" + ], + "references": [ + { + "title": "Anthropic - Disrupting the first reported AI-orchestrated cyber espionage campaign (13 Nov 2025)", + "url": "https://www.anthropic.com/news/disrupting-AI-espionage" + }, + { + "title": "MITRE ATLAS - AML.CS0069", + "url": "https://atlas.mitre.org/studies/AML.CS0069" + } + ], + "cases": [ + "AIRT-CS-0004" + ], + "links": [ + { + "case": "AIRT-CS-0004", + "ref": "AIRT-TA-0002", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"We assess with high confidence\" - a Chinese state-sponsored group", + "reference": "https://www.anthropic.com/news/disrupting-AI-espionage" + } + ], + "derived": { + "techniques": [ + "AML.T0053", + "AML.T0054", + "AML.T0096", + "AML.T0116", + "AML.T0117" + ], + "attack": [], + "owasp_agentic": [ + "ASI01", + "ASI02" + ], + "tactics": [ + "AML.TA0001", + "AML.TA0002", + "AML.TA0005", + "AML.TA0007", + "AML.TA0012", + "AML.TA0014", + "AML.TA0015" + ], + "sectors": [ + "chemical", + "financial-services", + "government", + "information-technology" + ], + "countries": [], + "regions": [], + "first_seen": "2025-11-13", + "last_seen": "2025-11-13", + "tools": [ + "AIRT-0001" + ], + "iocs": [ + { + "type": "behavior", + "value": "Agent session with tool_use/tool_result records spanning multiple kill-chain phases", + "description": "Recon, exploitation, credential access and exfiltration inside one session is the signal; no single call is anomalous", + "case": "AIRT-CS-0004" + }, + { + "type": "behavior", + "value": "Sustained request cadence far above human working tempo", + "description": "Reported in the thousands of requests per second; the exact rate is vendor-claimed", + "case": "AIRT-CS-0004" + }, + { + "type": "behavior", + "value": "Task framing that asserts authorised defensive testing", + "description": "The documented guardrail bypass, visible in the prompt history rather than on the endpoint", + "case": "AIRT-CS-0004" + }, + { + "type": "pattern", + "value": "High ratio of agent actions to human decision points in one session", + "description": "Reported as 4-6 human interventions per campaign", + "case": "AIRT-CS-0004" + } + ], + "detections_cited": [ + "agentic_orchestration_behavior.yml", + "ai_agent_spawning_lolbin.yml", + "ai_agent_spawning_shell.yml", + "mcp_server_remote_code_fetch.yml" + ], + "detections_by_technique": [ + "agentic_orchestration_behavior.yml", + "ai_agent_docker_socket_mount.yml", + "ai_agent_spawning_lolbin.yml", + "ai_agent_spawning_shell.yml", + "ai_cli_permission_bypass_invocation.yml", + "ai_service_api_c2.rules", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "langflow_rce_exploitation_attempt.yml", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml", + "system_prompt_extraction.yml" + ], + "gaps": [], + "off_host": [ + "AML.T0116", + "AML.T0117" + ], + "hunt": [ + { + "technique": "AML.T0053", + "name": "AI Agent Tool Invocation", + "tactics": [ + "AML.TA0005", + "AML.TA0012", + "AML.TA0015" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_agent_docker_socket_mount.yml", + "ai_agent_spawning_lolbin.yml", + "ai_agent_spawning_shell.yml", + "ai_cli_permission_bypass_invocation.yml", + "langflow_rce_exploitation_attempt.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0054", + "name": "LLM Jailbreak", + "tactics": [ + "AML.TA0007", + "AML.TA0012" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "system_prompt_extraction.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0096", + "name": "AI Service API", + "tactics": [ + "AML.TA0014" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_service_api_c2.rules", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0116", + "name": "Autonomous Reconnaissance", + "tactics": [ + "AML.TA0002" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0117", + "name": "Autonomous Attack-Path Adaptation", + "tactics": [ + "AML.TA0001" + ], + "rules": [], + "off_host": true + } + ], + "collect": [ + { + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "api.anthropic.com :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/claude-node", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "claude / node", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/node-exe-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "node.exe (claude)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-api-key", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_API_KEY", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_AUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "CLAUDE_CODE_OAUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "$CLAUDE_CONFIG_DIR/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.config/anthropic/configs/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (MCP remote-server OAuth credentials)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/project-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/repo-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "~/.claude.json → mcpServers (user scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.claude/settings.local.json → enabledMcpjsonServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.mcp.json → mcpServers (project scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\claude.cmd", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/usr/local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL, GOOGLE_API_KEY, HF_TOKEN", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contains Cursor/Windsurf/Copilot", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-md", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/CLAUDE.md", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.claude/settings.json", + "vol": "stable", + "forensic_value": "low" + } + ], + "recovery": [ + { + "case": "AIRT-CS-0004", + "phase": "", + "action": "Scope from the agent side first: pull session traces for the period and look for phase progression within a single session rather than for individual malicious commands." + }, + { + "case": "AIRT-CS-0004", + "phase": "", + "action": "Correlate agent tool invocations against MCP server logs, so the arguments an agent passed are recoverable even where the agent trace was rotated." + }, + { + "case": "AIRT-CS-0004", + "phase": "", + "action": "Treat the target-side artifacts as an ordinary intrusion: the recon, credential-access and staging evidence is conventional, only the tempo is not." + }, + { + "case": "AIRT-CS-0004", + "phase": "", + "action": "Preserve agent and MCP logs before rotation - they are usually the only record of the decomposition, and default retention is short." + }, + { + "case": "AIRT-CS-0004", + "phase": "", + "action": "Record the autonomy question as an open assessment in the report rather than adopting the vendor figure, since the distinction changes attribution and response." + } + ] + } + }, + { + "id": "AIRT-TA-0003", + "name": "GTG-2002", + "kind": "criminal", + "motivation": [ + "financial" + ], + "summary": "Anthropic's designation for a data-extortion operator that used Claude Code to automate reconnaissance, credential harvesting and network penetration. Anthropic also reports the model analysed stolen financial data to set ransom demands, some above USD 500,000. At least 17 organisations were affected, in healthcare, emergency services, government and religious institutions.", + "confidence": "medium", + "basis": "One reporting party, the provider whose product was abused. No host indicators were published. The cluster name comes from Anthropic's full report, and the public summary page describes the operation without the name.", + "abuses": [ + "AIRT-0001" + ], + "sightings": [ + { + "date": "2025-08-27", + "reporter": "Anthropic", + "summary": "Claude Code used to automate reconnaissance, credential harvesting and network penetration for data extortion, and to analyse exfiltrated financial data to set ransom amounts.", + "atlas": [ + "AML.T0103", + "AML.T0116", + "AML.T0055" + ], + "owasp_agentic": [ + "ASI02" + ], + "abuses": [ + "AIRT-0001" + ], + "ai_services": [ + "Claude Code" + ], + "victims": { + "sectors": [ + "healthcare", + "emergency-services", + "government", + "religious-institutions" + ], + "org_count": { + "value": 17, + "qualifier": "at-least" + }, + "basis": "Anthropic, August 2025 threat intelligence report." + }, + "reference": "https://www.anthropic.com/news/detecting-countering-misuse-aug-2025" + } + ], + "references": [ + { + "title": "Anthropic - Detecting and countering misuse of AI: August 2025", + "url": "https://www.anthropic.com/news/detecting-countering-misuse-aug-2025" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0055", + "AML.T0103", + "AML.T0116" + ], + "attack": [], + "owasp_agentic": [ + "ASI02" + ], + "tactics": [ + "AML.TA0002", + "AML.TA0005", + "AML.TA0013" + ], + "sectors": [ + "emergency-services", + "government", + "healthcare", + "religious-institutions" + ], + "countries": [], + "regions": [], + "first_seen": "2025-08-27", + "last_seen": "2025-08-27", + "tools": [ + "AIRT-0001" + ], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [ + "ai_agent_credential_file_access.yml" + ], + "gaps": [ + "AML.T0103" + ], + "off_host": [ + "AML.T0116" + ], + "hunt": [ + { + "technique": "AML.T0055", + "name": "Unsecured Credentials", + "tactics": [ + "AML.TA0013" + ], + "rules": [ + "ai_agent_credential_file_access.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0103", + "name": "Deploy AI Agent", + "tactics": [ + "AML.TA0005" + ], + "rules": [], + "off_host": false + }, + { + "technique": "AML.T0116", + "name": "Autonomous Reconnaissance", + "tactics": [ + "AML.TA0002" + ], + "rules": [], + "off_host": true + } + ], + "collect": [ + { + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "api.anthropic.com :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/claude-node", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "claude / node", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/node-exe-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "node.exe (claude)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-api-key", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_API_KEY", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_AUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "CLAUDE_CODE_OAUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "$CLAUDE_CONFIG_DIR/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.config/anthropic/configs/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (MCP remote-server OAuth credentials)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/project-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/repo-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "~/.claude.json → mcpServers (user scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.claude/settings.local.json → enabledMcpjsonServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.mcp.json → mcpServers (project scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\claude.cmd", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/usr/local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL, GOOGLE_API_KEY, HF_TOKEN", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contains Cursor/Windsurf/Copilot", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-md", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/CLAUDE.md", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.claude/settings.json", + "vol": "stable", + "forensic_value": "low" + } + ], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0004", + "name": "MIDNIGHT NEPTUNE", + "aliases": [ + { + "name": "UNC1069", + "source": "GTIG (former designation)" + }, + { + "name": "MASAN", + "source": "GTIG" + } + ], + "kind": "state-nexus", + "nexus": "KP", + "motivation": [ + "financial" + ], + "summary": "GTIG's name for financially motivated North Korea-nexus clusters focused on cryptocurrency theft. Reported AI use has moved from researching wallet locations with Gemini in 2025 to poisoning repository configuration and Claude Code hooks to deliver the SOMBERMEME backdoor in 2026.", + "confidence": "medium", + "basis": "One reporting party across two reports.", + "external_ids": { + "vendor_cluster": [ + "UNC1069" + ] + }, + "malware": [ + "SOMBERMEME" + ], + "abuses": [ + "AIRT-0001" + ], + "sightings": [ + { + "date": "2025-11-05", + "reporter": "GTIG", + "summary": "Used Gemini to research cryptocurrency concepts and where wallet application data is stored, to generate lures including Spanish-language ones, and to develop theft code.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "Gemini" + ], + "victims": { + "sectors": [ + "cryptocurrency" + ], + "basis": "GTIG." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "date": "2026-09-08", + "reporter": "GTIG", + "summary": "Used commercial and open-weight models, including DeepSeek-Coder, to build Python RATs and lateral-movement scripts. Poisoned repository configurations and altered Claude CLI hooks to deploy SOMBERMEME on developer interaction.", + "atlas": [ + "AML.T0016.002", + "AML.T0081" + ], + "owasp_agentic": [ + "ASI04", + "ASI05" + ], + "abuses": [ + "AIRT-0001" + ], + "ai_services": [ + "DeepSeek-Coder", + "Claude Code" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "cases": [ + "AIRT-CS-0017" + ], + "links": [ + { + "case": "AIRT-CS-0017", + "ref": "AIRT-TA-0004", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "GTIG", + "stated_confidence": "\"financially motivated North Korea-nexus threat clusters formerly tracked as UNC1069\"", + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "derived": { + "techniques": [ + "AML.T0011", + "AML.T0016.002", + "AML.T0081" + ], + "attack": [ + "T1195.002", + "T1546" + ], + "owasp_agentic": [ + "ASI04", + "ASI05" + ], + "tactics": [ + "AML.TA0003", + "AML.TA0005", + "AML.TA0006", + "AML.TA0007" + ], + "sectors": [ + "cryptocurrency" + ], + "countries": [], + "regions": [], + "first_seen": "2025-11-05", + "last_seen": "2026-09-08", + "tools": [ + "AIRT-0001" + ], + "iocs": [ + { + "type": "malware", + "value": "SOMBERMEME", + "description": "Backdoor delivered on developer interaction", + "case": "AIRT-CS-0017" + }, + { + "type": "config", + "value": "Hooks added to or altered in .claude/settings.json or .claude/settings.local.json", + "description": "The persistence and trigger; compare against repository history", + "case": "AIRT-CS-0017" + }, + { + "type": "behavior", + "value": "Shell or interpreter child of the Claude Code process at session start, before any user prompt", + "description": "A hook firing looks like this; an agent acting on a prompt does not", + "case": "AIRT-CS-0017" + } + ], + "detections_cited": [ + "ai_agent_hook_config_modification.yml", + "ai_agent_spawning_shell.yml" + ], + "detections_by_technique": [ + "ai_agent_autostart_persistence.yml", + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "github_copilot_yolo_mode_enabled.yml", + "mcp_outbound_unknown_domain.rules", + "memory_poisoning.yml", + "mlflow_path_traversal.rules", + "mlflow_unauth_api_access.yml", + "ollama_vllm_unauth_exposure.rules", + "pickle_malicious_opcodes.yar", + "ray_dashboard_exposure.rules", + "ray_jobs_api_rce.rules", + "shadowray_process_masquerading.yml", + "ssh_authorized_keys_injection.yml", + "torchserve_shelltorch.rules", + "triton_inference_server_exploit.rules", + "vector_db_unauth_exposure.rules" + ], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0011", + "name": "User Execution", + "tactics": [ + "AML.TA0005" + ], + "rules": [ + "github_copilot_yolo_mode_enabled.yml", + "mcp_outbound_unknown_domain.rules", + "mlflow_path_traversal.rules", + "mlflow_unauth_api_access.yml", + "ollama_vllm_unauth_exposure.rules", + "pickle_malicious_opcodes.yar", + "ray_dashboard_exposure.rules", + "ray_jobs_api_rce.rules", + "shadowray_process_masquerading.yml", + "ssh_authorized_keys_injection.yml", + "torchserve_shelltorch.rules", + "triton_inference_server_exploit.rules", + "vector_db_unauth_exposure.rules" + ], + "off_host": false + }, + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0081", + "name": "Modify AI Agent Configuration", + "tactics": [ + "AML.TA0006", + "AML.TA0007" + ], + "rules": [ + "ai_agent_autostart_persistence.yml", + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "memory_poisoning.yml" + ], + "off_host": false + } + ], + "collect": [ + { + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "api.anthropic.com :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/claude-node", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "claude / node", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/node-exe-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "node.exe (claude)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-api-key", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_API_KEY", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_AUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "CLAUDE_CODE_OAUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "$CLAUDE_CONFIG_DIR/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.config/anthropic/configs/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (MCP remote-server OAuth credentials)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/project-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/repo-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "~/.claude.json → mcpServers (user scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.claude/settings.local.json → enabledMcpjsonServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.mcp.json → mcpServers (project scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\claude.cmd", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/usr/local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL, GOOGLE_API_KEY, HF_TOKEN", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contains Cursor/Windsurf/Copilot", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-md", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/CLAUDE.md", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.claude/settings.json", + "vol": "stable", + "forensic_value": "low" + } + ], + "recovery": [ + { + "case": "AIRT-CS-0017", + "phase": "contain", + "action": "Collect .claude/settings.json and settings.local.json from every clone of the affected repositories and from ~/.claude/, before anyone opens the project again." + }, + { + "case": "AIRT-CS-0017", + "phase": "eradicate", + "action": "Remove hooks that no commit by a known developer explains, and hunt for SOMBERMEME on every host where the agent opened the repository." + }, + { + "case": "AIRT-CS-0017", + "phase": "recover", + "action": "Rotate credentials that were in reach of a developer shell on those hosts, prioritising wallet keys and exchange API keys given the cluster's motivation." + }, + { + "case": "AIRT-CS-0017", + "phase": "harden", + "action": "Review .claude/ in pull requests as executable code, not editor configuration." + } + ] + } + }, + { + "id": "AIRT-TA-0005", + "name": "UNC6780", + "aliases": [ + { + "name": "TeamPCP", + "source": "GTIG; self-claimed" + } + ], + "kind": "criminal", + "motivation": [ + "financial" + ], + "summary": "GTIG's cluster for a financially motivated supply-chain operator. In 2026 it compromised developer tooling and AI plumbing: Trivy, Checkmarx, the LiteLLM gateway, and trojanised forks of MCP servers. Its DUSTMAKER stealer writes into the workspace directories AI coding assistants read.", + "confidence": "medium", + "basis": "One reporting party across two reports. The actor claimed responsibility for some compromises, which corroborates the link but not the details.", + "external_ids": { + "vendor_cluster": [ + "UNC6780" + ] + }, + "malware": [ + "DUSTMAKER", + "SANDCLOCK" + ], + "abuses": [ + "AIRT-0001", + "AIRT-0002" + ], + "sightings": [ + { + "date": "2026-05-11", + "reporter": "GTIG", + "summary": "Claimed supply-chain compromises of Trivy, Checkmarx and LiteLLM through compromised PyPI packages and malicious pull requests, embedding the SANDCLOCK credential stealer to lift AWS keys and GitHub tokens from build environments.", + "atlas": [ + "AML.T0010", + "AML.T0055" + ], + "owasp_agentic": [ + "ASI04" + ], + "victims": { + "sectors": [ + "software-supply-chain" + ], + "basis": "GTIG." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + } + ], + "references": [ + { + "title": "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + }, + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "cases": [ + "AIRT-CS-0016" + ], + "links": [ + { + "case": "AIRT-CS-0016", + "ref": "AIRT-TA-0005", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "GTIG", + "stated_confidence": "\"Operations attributed to the financially motivated threat actor UNC6780 (TeamPCP)\"", + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "derived": { + "techniques": [ + "AML.T0010", + "AML.T0055", + "AML.T0081", + "AML.T0115.002" + ], + "attack": [ + "T1070", + "T1195.002", + "T1552.001" + ], + "owasp_agentic": [ + "ASI03", + "ASI04" + ], + "tactics": [ + "AML.TA0003", + "AML.TA0004", + "AML.TA0006", + "AML.TA0007", + "AML.TA0013" + ], + "sectors": [ + "software-supply-chain" + ], + "countries": [], + "regions": [], + "first_seen": "2026-05-11", + "last_seen": "2026-09-08", + "tools": [ + "AIRT-0001", + "AIRT-0002" + ], + "iocs": [ + { + "type": "package", + "value": "tiktoken_mcp (PyPI)", + "description": "Trojanised fork of a legitimate MCP server", + "case": "AIRT-CS-0016" + }, + { + "type": "pattern", + "value": "Injected code in azure-functions-mcp-extension", + "description": "Official organisational repository compromised through a developer account", + "case": "AIRT-CS-0016" + }, + { + "type": "malware", + "value": "DUSTMAKER", + "description": "Credential stealer with CI/CD and AI-workspace targeting", + "case": "AIRT-CS-0016" + }, + { + "type": "directory", + "value": "/.claude/, /.cursor/, /.vscode/", + "description": "Files dropped or modified in hidden AI assistant workspace directories", + "case": "AIRT-CS-0016" + }, + { + "type": "behavior", + "value": "GitHub Actions workflow run logs deleted after execution", + "description": "Anti-forensics; the absence of runs is the signal", + "case": "AIRT-CS-0016" + } + ], + "detections_cited": [ + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "mcp_tool_poisoning.yar" + ], + "detections_by_technique": [ + "ai_agent_autostart_persistence.yml", + "ai_agent_credential_file_access.yml", + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "claude_desktop_config_modify.yml", + "copilot_rules_file_backdoor.yar", + "cursor_settings_db_modification.yml", + "github_copilot_yolo_mode_enabled.yml", + "huggingface_cache_unexpected_writer.yml", + "mcp_config_tampering.yml", + "mcp_tool_poisoning.yar", + "memory_poisoning.yml", + "mlflow_path_traversal.rules", + "model_file_hash_mismatch.yml", + "ollama_vllm_unauth_exposure.rules", + "pip_install_typosquat.yml", + "torchserve_shelltorch.rules", + "triton_inference_server_exploit.rules" + ], + "gaps": [], + "off_host": [], + "hunt": [ + { + "technique": "AML.T0010", + "name": "AI Supply Chain Compromise", + "tactics": [ + "AML.TA0004" + ], + "rules": [ + "claude_desktop_config_modify.yml", + "copilot_rules_file_backdoor.yar", + "cursor_settings_db_modification.yml", + "github_copilot_yolo_mode_enabled.yml", + "huggingface_cache_unexpected_writer.yml", + "mcp_config_tampering.yml", + "mlflow_path_traversal.rules", + "model_file_hash_mismatch.yml", + "ollama_vllm_unauth_exposure.rules", + "pip_install_typosquat.yml", + "torchserve_shelltorch.rules", + "triton_inference_server_exploit.rules" + ], + "off_host": false + }, + { + "technique": "AML.T0055", + "name": "Unsecured Credentials", + "tactics": [ + "AML.TA0013" + ], + "rules": [ + "ai_agent_credential_file_access.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0081", + "name": "Modify AI Agent Configuration", + "tactics": [ + "AML.TA0006", + "AML.TA0007" + ], + "rules": [ + "ai_agent_autostart_persistence.yml", + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "memory_poisoning.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0115.002", + "name": "AI Agent Tools", + "tactics": [ + "AML.TA0003" + ], + "rules": [ + "mcp_tool_poisoning.yar" + ], + "off_host": true + } + ], + "collect": [ + { + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "api.anthropic.com :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/claude-node", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "claude / node", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/node-exe-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "node.exe (claude)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0002/network/cursor-sh-api2-cursor-sh-anysphere-co-443-tcp", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "network", + "artifact": "*.cursor.sh, api2.cursor.sh, *.anysphere.co :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0002/process/cursor-exe", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "process", + "artifact": "Cursor.exe", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-api-key", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_API_KEY", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_AUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "CLAUDE_CODE_OAUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "$CLAUDE_CONFIG_DIR/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.config/anthropic/configs/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (MCP remote-server OAuth credentials)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/project-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/repo-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "~/.claude.json → mcpServers (user scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.claude/settings.local.json → enabledMcpjsonServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.mcp.json → mcpServers (project scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/appdata-cursor-user-globalstorage-state-vscdb", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "%APPDATA%\\Cursor\\User\\globalStorage\\state.vscdb", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/config-cursor-auth-json", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "~/.config/cursor/auth.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/config-cursor-user-globalstorage-state-vscdb", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "~/.config/Cursor/User/globalStorage/state.vscdb", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/cursor-mcp-json", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "~/.cursor/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/library-application-support-cursor-user-globalstorage-st", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/macos-login-keychain-generic-password-service-cursor-saf", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "macOS login Keychain: generic-password service 'Cursor Safe Storage', account 'Cursor Key'", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/macos-login-keychain-generic-password-services-cursor-ac", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "macOS login Keychain: generic-password services cursor-access-token / cursor-refresh-token / cursor-api-key, account cursor-user", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/credential/repo-cursor-mcp-json", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "credential", + "artifact": "/.cursor/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/disk/cursor-mcp-json", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "~/.cursor/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/disk/repo-cursor-mcp-json", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "/.cursor/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/mcp-config/cursor-mcp-json-mcpservers", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "mcp-config", + "artifact": "~/.cursor/mcp.json → mcpServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/mcp-config/repo-cursor-mcp-json-mcpservers", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "mcp-config", + "artifact": "/.cursor/mcp.json → mcpServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-run-curso", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run → Cursor", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\claude.cmd", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/usr/local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL, GOOGLE_API_KEY, HF_TOKEN", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contains Cursor/Windsurf/Copilot", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0002/disk/localappdata-programs-cursor", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "%LOCALAPPDATA%\\Programs\\cursor\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0002/disk/localappdata-programs-cursor-cursor-exe", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "%LOCALAPPDATA%\\Programs\\cursor\\_\\Cursor.exe", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0002/disk/localappdata-programs-cursor-resources-app-bin-cursor", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "%LOCALAPPDATA%\\Programs\\cursor\\_\\resources\\app\\bin\\cursor", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0002/registry/hkcu-software-classes-cursor-shell-open-command-default", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "registry", + "artifact": "HKCU\\Software\\Classes\\cursor\\shell\\open\\command → (Default)", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ → InstallLocation, DisplayVersion", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-md", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/CLAUDE.md", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.claude/settings.json", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0002/disk/appdata-cursor-user", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "%APPDATA%\\Cursor\\User\\", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0002/disk/appdata-cursor-user-skills", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "%APPDATA%\\Cursor\\User\\skills\\", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0002/disk/config-cursor-user", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "~/.config/Cursor/User/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0002/disk/library-application-support-cursor-user", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "~/Library/Application Support/Cursor/User/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0002/disk/localappdata-cursor-updater", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "%LOCALAPPDATA%\\cursor-updater\\", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0002/disk/repo-cursorrules-repo-cursor-rules-mdc", + "tool": "Cursor", + "entry_id": "AIRT-0002", + "cls": "disk", + "artifact": "/.cursorrules | /.cursor/rules/*.mdc", + "vol": "stable", + "forensic_value": "low" + } + ], + "recovery": [ + { + "case": "AIRT-CS-0016", + "phase": "contain", + "action": "Inventory MCP servers installed from PyPI and npm across developer hosts and remove any trojanised fork. The catalog's MCP config rows give the files to read." + }, + { + "case": "AIRT-CS-0016", + "phase": "contain", + "action": "Diff .claude/, .cursor/ and .vscode/ in every affected repository against the last known-good commit. A file there that no commit explains is the finding." + }, + { + "case": "AIRT-CS-0016", + "phase": "eradicate", + "action": "Pin MCP servers and AI gateway libraries to verified versions and rebuild CI images." + }, + { + "case": "AIRT-CS-0016", + "phase": "recover", + "action": "Rotate GitHub Actions OIDC trust, cloud credentials reachable from CI, and every AI provider key a compromised gateway library could have read." + }, + { + "case": "AIRT-CS-0016", + "phase": "harden", + "action": "Retain workflow run logs outside GitHub so deletion from the API does not remove the record." + } + ] + } + }, + { + "id": "AIRT-TA-0006", + "name": "ShinyHunters", + "aliases": [ + { + "name": "UNC6240", + "source": "GTIG" + } + ], + "kind": "criminal", + "motivation": [ + "financial" + ], + "summary": "A high-volume SaaS data-theft and extortion group. GTIG reports it integrated Claude Code, configured with custom MCP tools, to parse and analyse exfiltrated directories for extortion, and used AI to write obfuscated code and get past perimeter defences.", + "confidence": "medium", + "basis": "The group itself is well established (ATT&CK G1057). Its AI use is reported by GTIG and, for suspected affiliates, by Anthropic, so there are two reporting parties with different confidence.", + "external_ids": { + "attack_group": [ + "G1057" + ], + "vendor_cluster": [ + "UNC6240", + "GTG-50014" + ] + }, + "abuses": [ + "AIRT-0001" + ], + "sightings": [ + { + "date": "2026-09-08", + "reporter": "GTIG", + "summary": "Claude Code configured with custom MCP tools to parse and analyse exfiltrated data for extortion; AI-written obfuscated code to bypass perimeter defences.", + "atlas": [ + "AML.T0103", + "AML.T0126" + ], + "owasp_agentic": [ + "ASI02" + ], + "abuses": [ + "AIRT-0001" + ], + "ai_services": [ + "Claude Code", + "MCP" + ], + "victims": { + "sectors": [ + "information-technology" + ], + "basis": "GTIG: SaaS data exfiltration and extortion." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + }, + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50014 ShinyHunters smash-and-grab opportunists", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists" + } + ], + "cases": [ + "AIRT-CS-0019" + ], + "links": [ + { + "case": "AIRT-CS-0019", + "ref": "AIRT-TA-0006", + "role": "suspected", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"operators suspected to be affiliates of the ShinyHunters collective\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists" + } + ], + "derived": { + "techniques": [ + "AML.T0055", + "AML.T0103", + "AML.T0126" + ], + "attack": [ + "T1552.001", + "T1567" + ], + "owasp_agentic": [ + "ASI02" + ], + "tactics": [ + "AML.TA0005", + "AML.TA0009", + "AML.TA0013" + ], + "sectors": [ + "energy", + "information-technology", + "retail", + "telecommunications", + "transportation" + ], + "countries": [ + "FR" + ], + "regions": [ + "Europe" + ], + "first_seen": "2026-09-08", + "last_seen": "2026-09-10", + "tools": [ + "AIRT-0001" + ], + "iocs": [ + { + "type": "account", + "value": "https[:]//t[.]me/Soraki_Bot", + "description": "Criminal storefront account on Telegram (role monetization, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "ari-chain[.]com", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "arichain[.]network", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "bitmart-mystery[.]com", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "defi-claim[.]xyz", + "description": "Phishing Domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "emailsecure[.]email", + "description": "Actor email domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "mozilla[.]ws", + "description": "Mozilla brand-impersonation phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "on-pssword[.]com", + "description": "1Password typosquat phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "policenationale[.]cc", + "description": "A domain name impersonating the French national police (though we believe this served as branding for the criminal storefront rather than as a phishing lure) (role monetization, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "service-infos[.]info", + "description": "Phishing email domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "signin-1psswoord[.]com", + "description": "1Password phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "soraki[.]cc", + "description": "AutoShop carding storefront (role monetization, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "soraki[.]work", + "description": "Actor infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "autoshop.policenationale[.]cc", + "description": "Served as the web frontend for the actor's carding autoshop (role monetization, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun", + "description": "Callback domain to confirm SSRF and out of band code execution (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev", + "description": "Cloudflare Workers proxy (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "domain", + "value": "updatebeacon.duckdns[.]org", + "description": "C2 callback domain (role c2, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "104.193.135[.]207", + "description": "Attacker egress IP (seen 2026-04-05 to 2026-04-05; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "104.36.50[.]54", + "description": "Attacker egress IP (seen 2026-04-24 to 2026-04-24; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "162.128.129[.]106", + "description": "Attacker egress IP (seen 2026-02-20 to 2026-03-10; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "176.177.12[.]62", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-20; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "185.65.134[.]199", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-28; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "185.65.134[.]246", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-05-04; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "193.32.249[.]161", + "description": "Attacker egress IP (seen 2026-03-21 to 2026-04-18; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "193.32.249[.]164", + "description": "Attacker egress IP (seen 2026-04-18 to 2026-05-06; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "193.32.249[.]170", + "description": "Attacker egress IP (seen 2026-03-20 to 2026-04-06; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "195.178.110[.]131", + "description": "VPS Host (seen 2026-03-12 to 2026-04-30; role infrastructure, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "45.148.10[.]242", + "description": "Attacker egress IP (seen 2026-04-06 to 2026-04-27; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "91.171.138[.]169", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-21; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "92.118.39[.]3", + "description": "Attacker egress IP (seen 2026-04-10 to 2026-04-19; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53", + "description": "Attacker egress IP (seen 2026-04-20 to 2026-04-21; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "ip", + "value": "2a04:cec0:1185:34f2:a150:7081:caed[:]448e", + "description": "Attacker egress IP (seen 2026-04-06 to 2026-04-07; role egress, handling hunt)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "8628746407", + "description": "Telegram bot delivering AWS SES credential-validation results directly to the operator's user account (telegram bot id; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "8632748474", + "description": "Telegram bot that posted stolen data. (telegram bot id; role exfiltration, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "8664033117", + "description": "Telegram bot that posted stolen data. (telegram bot id; role exfiltration, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "8709258476", + "description": "Telegram bot delivering AWS SNS SMS-abuse test results directly to the operator's user account (telegram bot id; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "-1003311614569", + "description": "Telegram group 'ChatMignon' that received stolen data. (telegram chat id; role exfiltration, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "-1003893854338", + "description": "Telegram group 'ClintonHog' that received stolen data. (telegram chat id; role exfiltration, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "account", + "value": "8179098353", + "description": "Operator's Telegram account (telegram user id; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0019" + }, + { + "type": "url", + "value": "https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/", + "description": "Exfiltration URL (role exfiltration, handling detect-or-block)", + "case": "AIRT-CS-0019" + } + ], + "detections_cited": [], + "detections_by_technique": [ + "ai_agent_credential_file_access.yml" + ], + "gaps": [ + "AML.T0103", + "AML.T0126" + ], + "off_host": [], + "hunt": [ + { + "technique": "AML.T0055", + "name": "Unsecured Credentials", + "tactics": [ + "AML.TA0013" + ], + "rules": [ + "ai_agent_credential_file_access.yml" + ], + "off_host": false + }, + { + "technique": "AML.T0103", + "name": "Deploy AI Agent", + "tactics": [ + "AML.TA0005" + ], + "rules": [], + "off_host": false + }, + { + "technique": "AML.T0126", + "name": "Automated Collection", + "tactics": [ + "AML.TA0009" + ], + "rules": [], + "off_host": false + } + ], + "collect": [ + { + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "api.anthropic.com :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/claude-node", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "claude / node", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/node-exe-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "node.exe (claude)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-api-key", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_API_KEY", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_AUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "CLAUDE_CODE_OAUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "$CLAUDE_CONFIG_DIR/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.config/anthropic/configs/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (MCP remote-server OAuth credentials)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/project-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/repo-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "~/.claude.json → mcpServers (user scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.claude/settings.local.json → enabledMcpjsonServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.mcp.json → mcpServers (project scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\claude.cmd", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/usr/local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL, GOOGLE_API_KEY, HF_TOKEN", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contains Cursor/Windsurf/Copilot", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-md", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/CLAUDE.md", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.claude/settings.json", + "vol": "stable", + "forensic_value": "low" + } + ], + "recovery": [ + { + "case": "AIRT-CS-0019", + "phase": "contain", + "action": "Block and hunt the published addresses and domains, and alert on outbound traffic to the listed exfiltration storage URL." + }, + { + "case": "AIRT-CS-0019", + "phase": "contain", + "action": "Inventory keys embedded in shipped mobile apps and any AWS SES or SNS credentials, which the actor validated at scale and abused." + }, + { + "case": "AIRT-CS-0019", + "phase": "recover", + "action": "Rotate SaaS integration tokens and cloud keys reachable from compromised tenants, and notify downstream customers whose data transited them." + } + ] + } + }, + { + "id": "AIRT-TA-0007", + "name": "APT42", + "aliases": [ + { + "name": "CALANQUE ION", + "source": "GTIG (2026 designation)" + } + ], + "kind": "state-nexus", + "nexus": "IR", + "motivation": [ + "espionage" + ], + "summary": "Iranian government-backed group whose reported AI use centres on phishing and reconnaissance. GTIG also reports an attempt to build a Data Processing Agent that turned natural-language requests into SQL over sensitive personal data, and later work on EDR bypass.", + "confidence": "medium", + "basis": "One reporting party across three reports.", + "external_ids": { + "attack_group": [ + "G1044" + ] + }, + "sightings": [ + { + "date": "2025-11-05", + "reporter": "GTIG", + "summary": "Used Gemini for phishing content, translation and research, and attempted to build a natural-language-to-SQL Data Processing Agent over sensitive personal data.", + "atlas": [ + "AML.T0016.002", + "AML.T0017.002" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "date": "2026-02-12", + "reporter": "GTIG", + "summary": "Used Gemini for target reconnaissance, persona creation, translation and malware development support.", + "atlas": [ + "AML.T0016.002", + "AML.T0087" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + }, + { + "date": "2026-09-08", + "reporter": "GTIG", + "summary": "Used Gemini to identify target email addresses, localise lures, summarise exfiltrated data, reverse-engineer licensing algorithms and research EDR bypass.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "title": "GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration of AI for Adversarial Use (12 Feb 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + }, + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.002", + "AML.T0017.002", + "AML.T0087" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0002", + "AML.TA0003" + ], + "sectors": [], + "countries": [], + "regions": [], + "first_seen": "2025-11-05", + "last_seen": "2026-09-08", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [], + "off_host": [ + "AML.T0016.002", + "AML.T0017.002", + "AML.T0087" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0017.002", + "name": "AI Agent Tools", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0087", + "name": "Gather Victim Identity Information", + "tactics": [ + "AML.TA0002" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0008", + "name": "APT41", + "aliases": [ + { + "name": "Brass Typhoon", + "source": "MITRE ATT&CK G0096" + } + ], + "kind": "state-nexus", + "nexus": "CN", + "motivation": [ + "espionage", + "financial" + ], + "summary": "PRC-backed group that GTIG observed using Gemini throughout August 2025 for C++ and Go development, including an OSSTUN command-and-control framework, and later for tooling development and code translation.", + "confidence": "medium", + "basis": "One reporting party across two reports.", + "external_ids": { + "attack_group": [ + "G0096" + ] + }, + "sightings": [ + { + "date": "2025-08", + "reporter": "GTIG", + "summary": "Used Gemini for C++ and Go development of the OSSTUN C2 framework and for obfuscation help.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "date": "2026-02-12", + "reporter": "GTIG", + "summary": "Used Gemini to accelerate tooling development, troubleshoot in real time and translate code.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "title": "GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration of AI for Adversarial Use (12 Feb 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.002" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003" + ], + "sectors": [], + "countries": [], + "regions": [], + "first_seen": "2025-08", + "last_seen": "2026-02-12", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0009", + "name": "Sandworm", + "aliases": [ + { + "name": "APT44", + "source": "MITRE ATT&CK G0034" + }, + { + "name": "SANDWORM RELIC", + "source": "GTIG (2026 designation)" + }, + { + "name": "FROZENBARENTS", + "source": "GTIG (former designation)" + } + ], + "kind": "state-nexus", + "nexus": "RU", + "motivation": [ + "espionage", + "destruction" + ], + "summary": "Russian group that GTIG reports integrated Gemini into operations against Ukraine. It used the model for AI-themed phishing domains, automated password spraying and host profiling, and called the Gemini API directly from its own automation.", + "confidence": "medium", + "basis": "The group is well established (ATT&CK G0034). Its AI use rests on one reporting party.", + "external_ids": { + "attack_group": [ + "G0034" + ] + }, + "sightings": [ + { + "date": "2026-09-08", + "reporter": "GTIG", + "summary": "Gemini used for intelligence gathering, social engineering, asynchronous password-spraying scripts and endpoint fingerprinting; the Gemini API was called directly from tooling.", + "atlas": [ + "AML.T0016.002", + "AML.T0096" + ], + "ai_services": [ + "Gemini API" + ], + "victims": { + "countries": [ + "UA" + ], + "basis": "GTIG: continued operations targeting Ukraine." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.002", + "AML.T0096" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003", + "AML.TA0014" + ], + "sectors": [], + "countries": [ + "UA" + ], + "regions": [ + "Europe" + ], + "first_seen": "2026-09-08", + "last_seen": "2026-09-08", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [ + "agentic_orchestration_behavior.yml", + "ai_service_api_c2.rules", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml" + ], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0096", + "name": "AI Service API", + "tactics": [ + "AML.TA0014" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "ai_service_api_c2.rules", + "llm_api_prompt_in_script_generic.yar", + "powershell_llm_api_command_generation.yml", + "promptflux_artifacts_fileevent.yml", + "promptflux_thinking_robot.yar", + "promptsteal_lamehug.yar", + "runtime_ai_malware_correlation.yml", + "runtime_llm_api_c2.rules", + "script_interpreter_llm_api_dns.yml", + "sesameop_assistants_api_c2.yml" + ], + "off_host": false + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0010", + "name": "APT31", + "aliases": [ + { + "name": "ZIRCONIUM", + "source": "MITRE ATT&CK G0128" + }, + { + "name": "Violet Typhoon", + "source": "Microsoft via ATT&CK" + } + ], + "kind": "state-nexus", + "nexus": "CN", + "motivation": [ + "espionage" + ], + "summary": "PRC-based group that GTIG reports prompted Gemini with an expert security persona while trialling Hexstrike MCP tooling. It used the model to automate vulnerability analysis and plan testing against US targets. This is an early reported case of a state actor pairing an LLM with MCP-exposed offensive tools.", + "confidence": "medium", + "basis": "One reporting party.", + "external_ids": { + "attack_group": [ + "G0128" + ] + }, + "sightings": [ + { + "date": "2026-02-12", + "reporter": "GTIG", + "summary": "Used Gemini with an expert persona, citing Hexstrike MCP tooling, to automate vulnerability analysis and produce testing plans covering RCE, WAF bypass and SQL injection against US-based targets.", + "atlas": [ + "AML.T0016.004", + "AML.T0054" + ], + "owasp_agentic": [ + "ASI02" + ], + "ai_services": [ + "Gemini", + "Hexstrike MCP" + ], + "victims": { + "countries": [ + "US" + ], + "basis": "GTIG: US-based targets." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration of AI for Adversarial Use (12 Feb 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.004", + "AML.T0054" + ], + "attack": [], + "owasp_agentic": [ + "ASI02" + ], + "tactics": [ + "AML.TA0003", + "AML.TA0007", + "AML.TA0012" + ], + "sectors": [], + "countries": [ + "US" + ], + "regions": [ + "Americas" + ], + "first_seen": "2026-02-12", + "last_seen": "2026-02-12", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [ + "agentic_orchestration_behavior.yml", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "system_prompt_extraction.yml" + ], + "gaps": [], + "off_host": [ + "AML.T0016.004" + ], + "hunt": [ + { + "technique": "AML.T0016.004", + "name": "AI Agent Tools", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0054", + "name": "LLM Jailbreak", + "tactics": [ + "AML.TA0007", + "AML.TA0012" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "system_prompt_extraction.yml" + ], + "off_host": false + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0011", + "name": "MuddyWater", + "aliases": [ + { + "name": "TEMP.Zagros", + "source": "GTIG" + }, + { + "name": "MUDDYCOAST", + "source": "GTIG" + } + ], + "kind": "state-nexus", + "nexus": "IR", + "motivation": [ + "espionage" + ], + "summary": "Iranian state-sponsored group that GTIG reports used Gemini, under student and research pretexts, to develop custom malware including web shells and a Python C2 server.", + "confidence": "medium", + "basis": "One reporting party.", + "external_ids": { + "attack_group": [ + "G0069" + ] + }, + "sightings": [ + { + "date": "2025-11-05", + "reporter": "GTIG", + "summary": "Used Gemini, with student and paper-writing pretexts to get past safety guardrails, to develop web shells and a Python-based C2 server.", + "atlas": [ + "AML.T0016.002", + "AML.T0054" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.002", + "AML.T0054" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003", + "AML.TA0007", + "AML.TA0012" + ], + "sectors": [], + "countries": [], + "regions": [], + "first_seen": "2025-11-05", + "last_seen": "2025-11-05", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [ + "agentic_orchestration_behavior.yml", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "system_prompt_extraction.yml" + ], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0054", + "name": "LLM Jailbreak", + "tactics": [ + "AML.TA0007", + "AML.TA0012" + ], + "rules": [ + "agentic_orchestration_behavior.yml", + "azure_openai_injection.yml", + "bedrock_high_token_usage.yml", + "jailbreak_personas.yml", + "system_prompt_extraction.yml" + ], + "off_host": false + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0012", + "name": "UNC4899", + "aliases": [ + { + "name": "PUKCHONG", + "source": "GTIG" + } + ], + "kind": "state-nexus", + "nexus": "KP", + "motivation": [ + "financial" + ], + "summary": "North Korean supply-chain-focused actor that GTIG reports used Gemini to develop code, research exploits and improve its tooling.", + "confidence": "medium", + "basis": "One reporting party.", + "external_ids": { + "vendor_cluster": [ + "UNC4899" + ] + }, + "sightings": [ + { + "date": "2025-11-05", + "reporter": "GTIG", + "summary": "Used Gemini for code development, exploit research and tooling improvement.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "Gemini" + ], + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.002" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003" + ], + "sectors": [], + "countries": [], + "regions": [], + "first_seen": "2025-11-05", + "last_seen": "2025-11-05", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0013", + "name": "Kimsuky", + "aliases": [ + { + "name": "Emerald Sleet", + "source": "Microsoft" + }, + { + "name": "APT43", + "source": "MITRE ATT&CK G0094" + } + ], + "kind": "state-nexus", + "nexus": "KP", + "motivation": [ + "espionage" + ], + "summary": "North Korean group that Microsoft and OpenAI reported in 2024 using LLMs to research think tanks and North Korea experts, draft spear-phishing content and troubleshoot scripts.", + "confidence": "medium", + "basis": "One joint report.", + "external_ids": { + "attack_group": [ + "G0094" + ] + }, + "sightings": [ + { + "date": "2024-02-14", + "reporter": "Microsoft Threat Intelligence", + "summary": "Used LLMs to research experts and organisations, generate spear-phishing content, research public vulnerabilities and assist with scripting.", + "atlas": [ + "AML.T0016.002" + ], + "ai_services": [ + "OpenAI models" + ], + "victims": { + "sectors": [ + "ngo-think-tank", + "education" + ], + "basis": "Microsoft: individuals with North Korea expertise, academic institutions and NGOs." + }, + "reference": "https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/" + } + ], + "references": [ + { + "title": "Microsoft Threat Intelligence - Staying ahead of threat actors in the age of AI (14 Feb 2024)", + "url": "https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0016.002" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003" + ], + "sectors": [ + "education", + "ngo-think-tank" + ], + "countries": [], + "regions": [], + "first_seen": "2024-02-14", + "last_seen": "2024-02-14", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0014", + "name": "UNC5673", + "kind": "state-nexus", + "nexus": "CN", + "motivation": [ + "espionage" + ], + "summary": "PRC-nexus cluster, overlapping TEMP.Hex, that GTIG reports pooled Gemini, Claude and OpenAI accounts through relay tooling (Claude-Relay-Service, CLI-Proxy-API) while targeting governments in South and Southeast Asia. On a host, the relay tooling is the artifact.", + "confidence": "medium", + "basis": "One reporting party.", + "external_ids": { + "vendor_cluster": [ + "UNC5673" + ] + }, + "sightings": [ + { + "date": "2026-05-11", + "reporter": "GTIG", + "summary": "Used Claude-Relay-Service and CLI-Proxy-API to aggregate multiple Gemini, Claude and OpenAI accounts behind proxies for account pooling.", + "atlas": [ + "AML.T0016.002", + "AML.T0008" + ], + "ai_services": [ + "Gemini", + "Claude", + "OpenAI" + ], + "victims": { + "sectors": [ + "government" + ], + "basis": "GTIG: government sectors primarily in South and Southeast Asia." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + } + ], + "references": [ + { + "title": "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0008", + "AML.T0016.002" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003" + ], + "sectors": [ + "government" + ], + "countries": [], + "regions": [], + "first_seen": "2026-05-11", + "last_seen": "2026-05-11", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [], + "off_host": [ + "AML.T0008", + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0008", + "name": "Acquire Infrastructure", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0015", + "name": "UNC6508", + "kind": "state-nexus", + "nexus": "CN", + "motivation": [ + "espionage" + ], + "summary": "PRC-nexus espionage actor that GTIG reports targeted academic, medical and military research institutions in North America over several years. It deployed local open-weight LLM infrastructure inside compromised cloud environments.", + "confidence": "medium", + "basis": "One reporting party.", + "external_ids": { + "vendor_cluster": [ + "UNC6508" + ] + }, + "sightings": [ + { + "date": "2026-09-08", + "reporter": "GTIG", + "summary": "Deployed local open-weight LLM infrastructure in compromised cloud environments and researched AI tool setup and model vulnerabilities; targeted proprietary AI research.", + "atlas": [ + "AML.T0008.000", + "AML.T0034" + ], + "ai_services": [ + "open-weight models (self-hosted)" + ], + "victims": { + "sectors": [ + "research", + "healthcare", + "education", + "defense-industrial-base" + ], + "countries": [ + "US", + "CA" + ], + "basis": "GTIG: academic, medical and military research institutions in North America." + }, + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0008.000", + "AML.T0034" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003", + "AML.TA0011" + ], + "sectors": [ + "defense-industrial-base", + "education", + "healthcare", + "research" + ], + "countries": [ + "CA", + "US" + ], + "regions": [ + "Americas" + ], + "first_seen": "2026-09-08", + "last_seen": "2026-09-08", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [ + "AML.T0034" + ], + "off_host": [ + "AML.T0008.000" + ], + "hunt": [ + { + "technique": "AML.T0008.000", + "name": "AI Development Workspaces", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0034", + "name": "Cost Harvesting", + "tactics": [ + "AML.TA0011" + ], + "rules": [], + "off_host": false + } + ], + "collect": [], + "recovery": [] + } + }, + { + "id": "AIRT-TA-0016", + "name": "GTG-20006", + "kind": "state-nexus", + "nexus": "RU", + "motivation": [ + "espionage" + ], + "summary": "Anthropic's cluster for a Russian-speaking operator whose tradecraft and targeting it assesses as consistent with Russian state-nexus espionage. It linked the cluster to Midnight Blizzard only as consistent with public reporting. From December 2025 to August 2026 the operator ran reconnaissance, phishing and collection through Claude-driven workflows, mostly by editing the Claude Code skills that drove them.", + "confidence": "medium", + "basis": "A single reporting party, with a published indicator set.", + "contested": "The Midnight Blizzard link is stated as consistency with public reporting, not as an attribution Anthropic makes itself.", + "external_ids": { + "vendor_cluster": [ + "GTG-20006" + ] + }, + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-20006 Russian espionage", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage" + } + ], + "cases": [ + "AIRT-CS-0018" + ], + "links": [ + { + "case": "AIRT-CS-0018", + "ref": "AIRT-TA-0016", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"Our attribution is consistent with public reporting linking the actor to Midnight Blizzard.\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage" + } + ], + "derived": { + "techniques": [ + "AML.T0016.002", + "AML.T0103", + "AML.T0116", + "AML.T0117" + ], + "attack": [ + "T1528", + "T1566" + ], + "owasp_agentic": [], + "tactics": [ + "AML.TA0001", + "AML.TA0002", + "AML.TA0003", + "AML.TA0005" + ], + "sectors": [ + "defense-industrial-base", + "government", + "ngo-think-tank" + ], + "countries": [ + "UA" + ], + "regions": [ + "Europe" + ], + "first_seen": "2026-09-10", + "last_seen": "2026-09-10", + "tools": [], + "iocs": [ + { + "type": "domain", + "value": "ad-g[.]org", + "description": "C2 domain (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "cdncounter[.]net", + "description": "Actor infrastructure domain (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "chamber-ua[.]org", + "description": "Lookalike of a Ukrainian chamber organization (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "chathamhouse[.]eu", + "description": "Lookalike of Chatham House (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "docs-viewer[.]org", + "description": "C2 nginx reverse proxy (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "itechx[.]tel", + "description": "Actor identity domain (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "m365-owa[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "meridian-protocol[.]org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "meridiangroup-corp[.]com", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "metricwave[.]org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "mgsend[.]org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "ms365-device[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "ms365-live[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "my-invite[.]org", + "description": "Actor phishing domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "mygreatmarket[.]com", + "description": "ClickFix cookie-exfil C2 (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "mygreatmarket[.]org", + "description": "ClickFix cookie-exfil C2 (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "owa-ms365[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "projectnightcrawler[.]dev", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "russianearabroad[.]com", + "description": "ClickFix lure (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "russianearabroad[.]org", + "description": "Actor persona domain (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "static-ms[.]live", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "statistic-ms[.]live", + "description": "Primary RAT C2 domain (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "stuseamandesilt[.]org", + "description": "Campaign base domain (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "ukrinform-share[.]net", + "description": "Lookalike of Ukrinform (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "wa-connect[.]eu", + "description": "ClickFix cookie exfil C2 (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "wa-meeting[.]com", + "description": "WhatsApp Web pairing code phishing domain (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "email", + "value": "anna.manager@russianearabroad[.]net", + "description": "Phishing persona address (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "email", + "value": "events@embassy-protocol[.]int", + "description": "Phishing persona address (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "file", + "value": "WUEngine.exe", + "description": "Malware file name. Windows malware (role malware, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "file", + "value": "client_20260507093021_4286d211_x64.exe", + "description": "Malware build artifact (role malware, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "file", + "value": "fix_network.apk", + "description": "Android malware payload (role malware, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "file", + "value": "msedgeupdate_v3.exe", + "description": "Malware implant build (role malware, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "api.stuseamandesilt[.]org", + "description": "Campaign C2 (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "cdn.stuseamandesilt[.]org", + "description": "Campaign malware delivery (role malware_delivery, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "mslivetest.duckdns[.]org", + "description": "Dynamic-DNS C2 (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "pdfviewer2024.b-cdn[.]net", + "description": "Malware payload domain (role malware_delivery, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "static.cdncounter[.]net", + "description": "Exploit/payload delivery hostname (role malware_delivery, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "teams.ms365-live[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "domain", + "value": "update.stuseamandesilt[.]org", + "description": "Campaign subdomain (role malware_delivery, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "104.145.210[.]184", + "description": "Embassy Kit device-code phishing VPS (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "104.194.149[.]228", + "description": "Phishing VPS (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "104.194.151[.]133", + "description": "Primary C2 VPS (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "104.194.159[.]55", + "description": "C2 holding exfiltrated browser-data zips (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "144.172.114[.]192", + "description": "C2 proxy IP / operator VPS (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "148.135.195[.]111", + "description": "C2 Endpoint (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "149.54.42[.]106", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "185.198.234[.]101", + "description": "C2 server (role c2, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "185.198.234[.]26", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "2.26.53[.]194", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "213.145.86[.]112", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "31.57.243[.]154", + "description": "Phishing host (role phishing, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "38.146.28[.]132", + "description": "Actor rogue DNS resolver (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "ip", + "value": "38.146.28[.]75", + "description": "Notifier C2 for the phishing console (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "hash", + "value": "918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593", + "description": "Windows Backdoor (role malware, handling detect-or-block)", + "case": "AIRT-CS-0018" + }, + { + "type": "hash", + "value": "be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c", + "description": "Malware hash (role malware, handling detect-or-block)", + "case": "AIRT-CS-0018" + } + ], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [ + "AML.T0103" + ], + "off_host": [ + "AML.T0016.002", + "AML.T0116", + "AML.T0117" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0103", + "name": "Deploy AI Agent", + "tactics": [ + "AML.TA0005" + ], + "rules": [], + "off_host": false + }, + { + "technique": "AML.T0116", + "name": "Autonomous Reconnaissance", + "tactics": [ + "AML.TA0002" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0117", + "name": "Autonomous Attack-Path Adaptation", + "tactics": [ + "AML.TA0001" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [ + { + "case": "AIRT-CS-0018", + "phase": "contain", + "action": "Block and hunt the published domains and addresses, and search mail logs for the two phishing persona senders." + }, + { + "case": "AIRT-CS-0018", + "phase": "contain", + "action": "Hunt for the published implant file names and SHA-256 hashes, including msedgeupdate_v3.exe and WUEngine.exe." + }, + { + "case": "AIRT-CS-0018", + "phase": "eradicate", + "action": "Review identity-provider sign-in logs for device-code authentication from unfamiliar clients during the window, and revoke refresh tokens for affected accounts." + }, + { + "case": "AIRT-CS-0018", + "phase": "harden", + "action": "Restrict the device-code authentication flow by Conditional Access where it has no business use." + } + ] + } + }, + { + "id": "AIRT-TA-0017", + "name": "GTG-50020", + "kind": "criminal", + "motivation": [ + "financial" + ], + "summary": "Anthropic's cluster for a Russian-speaking, financially motivated actor that moved from hotel-booking and fintech intrusions to running an autonomous exploitation pipeline against around 30 AI companies in about four days.", + "confidence": "medium", + "basis": "A single reporting party, with a published indicator set.", + "external_ids": { + "vendor_cluster": [ + "GTG-50020" + ] + }, + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50020 From hotel bookings to the AI supply chain", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain" + } + ], + "cases": [ + "AIRT-CS-0020" + ], + "links": [ + { + "case": "AIRT-CS-0020", + "ref": "AIRT-TA-0017", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"Russian-speaking, financially-motivated actor\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain" + } + ], + "derived": { + "techniques": [ + "AML.T0017.001", + "AML.T0049", + "AML.T0124" + ], + "attack": [ + "T1190" + ], + "owasp_agentic": [], + "tactics": [ + "AML.TA0001", + "AML.TA0003", + "AML.TA0004" + ], + "sectors": [ + "commercial-facilities", + "information-technology" + ], + "countries": [], + "regions": [], + "first_seen": "2026-09-10", + "last_seen": "2026-09-10", + "tools": [], + "iocs": [ + { + "type": "ip", + "value": "141.133.125[.]208", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-05-23; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "146.103.101[.]253", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-13; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "146.103.97[.]169", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-05-25; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "167.250.111[.]136", + "description": "Attacker egress IP (seen 2026-05-23 to 2026-06-03; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "178.16.54[.]141", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-16; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "194.163.183[.]216", + "description": "Attacker egress IP (seen 2026-05-23 to 2026-05-24; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "202.66.167[.]230", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-04; role egress, handling hunt)", + "case": "AIRT-CS-0020" + }, + { + "type": "ip", + "value": "37.27.103[.]22", + "description": "Attacker egress IP (seen 2026-05-26 to 2026-06-13; role egress, handling hunt)", + "case": "AIRT-CS-0020" + } + ], + "detections_cited": [], + "detections_by_technique": [ + "ray_jobs_api_rce.rules" + ], + "gaps": [], + "off_host": [ + "AML.T0017.001", + "AML.T0124" + ], + "hunt": [ + { + "technique": "AML.T0017.001", + "name": "Autonomous Exploit Development", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0049", + "name": "Exploit Public-Facing Application", + "tactics": [ + "AML.TA0004" + ], + "rules": [ + "ray_jobs_api_rce.rules" + ], + "off_host": false + }, + { + "technique": "AML.T0124", + "name": "Autonomous Attack Orchestration", + "tactics": [ + "AML.TA0001" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [ + { + "case": "AIRT-CS-0020", + "phase": "contain", + "action": "Hunt the published egress addresses in web and WAF logs for the May to June 2026 window." + }, + { + "case": "AIRT-CS-0020", + "phase": "harden", + "action": "Treat model-gateway and evaluation endpoints as internet-exposed attack surface, with the same testing and rate limits as the product itself." + } + ] + } + }, + { + "id": "AIRT-TA-0018", + "name": "GTG-50029", + "kind": "unattributed-cluster", + "motivation": [ + "hacktivism" + ], + "summary": "Anthropic's cluster for a single French-speaking hacktivist who used Claude to build exploits, a key-validating scanner and a doxxing platform against European political parties, media and think tanks.", + "confidence": "medium", + "basis": "A single reporting party, with a published indicator set.", + "external_ids": { + "vendor_cluster": [ + "GTG-50029" + ] + }, + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50029 Hacktivists targeted European political and affiliated entities", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities" + } + ], + "cases": [ + "AIRT-CS-0021" + ], + "links": [ + { + "case": "AIRT-CS-0021", + "ref": "AIRT-TA-0018", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"single French-speaking actor\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities" + } + ], + "derived": { + "techniques": [ + "AML.T0016.002", + "AML.T0049", + "AML.T0055" + ], + "attack": [ + "T1190", + "T1505.003" + ], + "owasp_agentic": [], + "tactics": [ + "AML.TA0003", + "AML.TA0004", + "AML.TA0013" + ], + "sectors": [ + "government", + "information-technology", + "media-entertainment", + "ngo-think-tank" + ], + "countries": [], + "regions": [], + "first_seen": "2026-09-10", + "last_seen": "2026-09-10", + "tools": [], + "iocs": [ + { + "type": "domain", + "value": "fafwatch[.]xyz", + "description": "Actor-registered doxing adjacent domain (seen 2026-04 to ?; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "domain", + "value": "prod-artfkt[.]com", + "description": "Actor-registered operational domain (seen 2026-04 to ?; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "domain", + "value": "frntrs-analytics-863060591218.europe-west1.run[.]app", + "description": "Cloud Run origin behind C2 domain (seen 2026-05-13 to 2026-06; role c2, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "domain", + "value": "frntrs-analytics.dedyn[.]io", + "description": "BeEF browser-C2 hostname (deSEC dynamic DNS, actor-held API token) (seen 2026-05-13 to 2026-06; role c2, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "103.124.165[.]199", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "103.141.60[.]144", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "103.216.220[.]19", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "136.144.242[.]56", + "description": "Staging & scan box used on EU political organizations (seen 2026-05-17 to 2026-05-21; role staging, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "138.199.6[.]208", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "138.199.60[.]29", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "139.59.2[.]243", + "description": "Key-validation box (DigitalOcean) (seen 2026-02-06 to 2026-06-12; role key_validation, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "146.70.116[.]131", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "149.22.83[.]6", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "158.173.46[.]118", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "163.172.157[.]53", + "description": "Persistent dedicated server, Scaleway FR used in late-phase operations (seen 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "34.156.199[.]132", + "description": "Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role exfiltration, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "34.156.95[.]176", + "description": "Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role exfiltration, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "2001:ac8:27[:]89::a02d", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "2001:ac8:29[:]84::a01d", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "case": "AIRT-CS-0021" + }, + { + "type": "ip", + "value": "2001:bc8:711:5854:dc00:1ff:fe18[:]ba53", + "description": "Persistent dedicated server, Scaleway FR used in late-phase operations (seen 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "domain", + "value": "3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion", + "description": "CRS credential-vault API (Tor onion service; seen 2026-05 to 2026-07; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0021" + }, + { + "type": "domain", + "value": "6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion", + "description": "Actor's Tor LLM-gateway (third-party model routing) (Tor onion service; seen 2026-06 to 2026-06; role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0021" + } + ], + "detections_cited": [], + "detections_by_technique": [ + "ai_agent_credential_file_access.yml", + "ray_jobs_api_rce.rules" + ], + "gaps": [], + "off_host": [ + "AML.T0016.002" + ], + "hunt": [ + { + "technique": "AML.T0016.002", + "name": "Generative AI", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0049", + "name": "Exploit Public-Facing Application", + "tactics": [ + "AML.TA0004" + ], + "rules": [ + "ray_jobs_api_rce.rules" + ], + "off_host": false + }, + { + "technique": "AML.T0055", + "name": "Unsecured Credentials", + "tactics": [ + "AML.TA0013" + ], + "rules": [ + "ai_agent_credential_file_access.yml" + ], + "off_host": false + } + ], + "collect": [], + "recovery": [ + { + "case": "AIRT-CS-0021", + "phase": "contain", + "action": "Hunt the published addresses and onion services, and inspect wp-content/mu-plugins and font asset directories on WordPress estates for unexpected PHP." + }, + { + "case": "AIRT-CS-0021", + "phase": "eradicate", + "action": "Restore from backups verified clean. The actor poisoned backups, so check backup integrity before relying on one." + }, + { + "case": "AIRT-CS-0021", + "phase": "recover", + "action": "Rotate every API key found in public repositories or containers the actor's scanner could have validated." + } + ] + } + }, + { + "id": "AIRT-TA-0019", + "name": "GTG-50021", + "kind": "criminal", + "motivation": [ + "financial" + ], + "summary": "Anthropic's cluster for a Russian- and Ukrainian-speaking group running a fraudulent cut-price Claude reseller that proxied traffic and harvested customer credentials.", + "confidence": "medium", + "basis": "A single reporting party, with a published indicator set.", + "external_ids": { + "vendor_cluster": [ + "GTG-50021" + ] + }, + "abuses": [ + "AIRT-0001" + ], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50021", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise" + } + ], + "cases": [ + "AIRT-CS-0022" + ], + "links": [ + { + "case": "AIRT-CS-0022", + "ref": "AIRT-TA-0019", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"Russian and Ukrainian speaking group\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise" + } + ], + "derived": { + "techniques": [ + "AML.T0034", + "AML.T0055" + ], + "attack": [ + "T1557" + ], + "owasp_agentic": [ + "ASI03" + ], + "tactics": [ + "AML.TA0011", + "AML.TA0013" + ], + "sectors": [ + "consumers", + "information-technology" + ], + "countries": [], + "regions": [], + "first_seen": "2026-09-10", + "last_seen": "2026-09-10", + "tools": [ + "AIRT-0001", + "AIRT-0041" + ], + "iocs": [ + { + "type": "domain", + "value": "aws-us-east-3[.]com", + "description": "AWS lookalike domain (role infrastructure, handling detect-or-block)", + "case": "AIRT-CS-0022" + }, + { + "type": "domain", + "value": "awstore[.]cloud", + "description": "Fake Claude API reseller storefront (role monetization, handling detect-or-block)", + "case": "AIRT-CS-0022" + }, + { + "type": "domain", + "value": "holdboost[.]store", + "description": "Malware platform domain (role c2, handling detect-or-block)", + "case": "AIRT-CS-0022" + }, + { + "type": "domain", + "value": "kiro[.]cheap", + "description": "Fake Kiro API reseller storefront (role monetization, handling detect-or-block)", + "case": "AIRT-CS-0022" + }, + { + "type": "domain", + "value": "sys-tools[.]cfd", + "description": "Malware C2 (role c2, handling detect-or-block)", + "case": "AIRT-CS-0022" + }, + { + "type": "domain", + "value": "iymkjuzymkapovrntoxy.supabase[.]co", + "description": "Malware Supabase backend (role c2, handling detect-or-block)", + "case": "AIRT-CS-0022" + } + ], + "detections_cited": [ + "ai_inference_endpoint_redirection.yml" + ], + "detections_by_technique": [ + "ai_agent_credential_file_access.yml" + ], + "gaps": [ + "AML.T0034" + ], + "off_host": [], + "hunt": [ + { + "technique": "AML.T0034", + "name": "Cost Harvesting", + "tactics": [ + "AML.TA0011" + ], + "rules": [], + "off_host": false + }, + { + "technique": "AML.T0055", + "name": "Unsecured Credentials", + "tactics": [ + "AML.TA0013" + ], + "rules": [ + "ai_agent_credential_file_access.yml" + ], + "off_host": false + } + ], + "collect": [ + { + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "api.anthropic.com :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "network", + "artifact": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/claude-node", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "claude / node", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/process/node-exe-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "process", + "artifact": "node.exe (claude)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0041/network/kiro-dev-aws-kiro-service-endpoints-443-tcp", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "network", + "artifact": "kiro.dev, AWS Kiro service endpoints :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0041/network/kiro-url-scheme-and-https-kiro-dev-launch-mcp-add-name-c", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "network", + "artifact": "kiro:// URL scheme and https://kiro.dev/launch/mcp/add?name=&config= install links :443/TCP", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0041/process/kiro-ide-kiro-cli", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "process", + "artifact": "kiro (IDE); kiro (CLI)", + "vol": "live", + "forensic_value": "" + }, + { + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/kiro-mcp-logs-view-output-channel", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "Kiro - MCP Logs (View > Output channel)", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/eventlog/microsoft-windows-sysmon-operational-eid-1", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "eventlog", + "artifact": "Microsoft-Windows-Sysmon/Operational EID 1", + "vol": "rotating", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-api-key", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_API_KEY", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "ANTHROPIC_AUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "CLAUDE_CODE_OAUTH_TOKEN", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "$CLAUDE_CONFIG_DIR/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-credentials-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude/.credentials.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "~/.config/anthropic/configs/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "macOS login Keychain (MCP remote-server OAuth credentials)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/credential/project-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "credential", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/claude-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/repo-mcp-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "~/.claude.json → mcpServers (user scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.claude/settings.local.json → enabledMcpjsonServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "mcp-config", + "artifact": "/.mcp.json → mcpServers (project scope)", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/credential/aws-builder-id-iam-identity-center-token-cache", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "credential", + "artifact": "AWS Builder ID / IAM Identity Center token cache", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/credential/mcpservers-name-env-inside-kiro-settings-mcp-json", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "credential", + "artifact": "mcpServers..env inside ~/.kiro/settings/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/kiro-settings-mcp-json", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "~/.kiro/settings/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/power-md-plugin-json-dev-kiro", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "POWER.md / plugin.json / dev.kiro/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/repo-kiro-agents", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "/.kiro/agents/", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/repo-kiro-hooks-kiro-hook", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "/.kiro/hooks/*.kiro.hook", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/repo-kiro-settings-mcp-json", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "/.kiro/settings/mcp.json", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/disk/repo-kiro-steering-md", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "/.kiro/steering/*.md", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/mcp-config/kiro-settings-mcp-json-mcpservers", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "mcp-config", + "artifact": "~/.kiro/settings/mcp.json → mcpServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0041/mcp-config/repo-kiro-settings-mcp-json-mcpservers", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "mcp-config", + "artifact": "/.kiro/settings/mcp.json → mcpServers", + "vol": "stable", + "forensic_value": "high" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\claude.cmd", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/usr/local/bin/claude", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI_BASE_URL, GOOGLE_API_KEY, HF_TOKEN", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contains Cursor/Windsurf/Copilot", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "registry", + "artifact": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0041/disk/repo-kiro-specs", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "/.kiro/specs/", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0041/disk/vs-code-style-globalstorage-extensions-and-state-vscdb-p", + "tool": "Kiro", + "entry_id": "AIRT-0041", + "cls": "disk", + "artifact": "VS Code-style globalStorage, extensions, and state.vscdb paths", + "vol": "stable", + "forensic_value": "medium" + }, + { + "anchor": "AIRT-0001/disk/claude", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "~/.claude/", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-md", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/CLAUDE.md", + "vol": "stable", + "forensic_value": "low" + }, + { + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "tool": "Claude Code", + "entry_id": "AIRT-0001", + "cls": "disk", + "artifact": "/.claude/settings.json", + "vol": "stable", + "forensic_value": "low" + } + ], + "recovery": [ + { + "case": "AIRT-CS-0022", + "phase": "contain", + "action": "Search agent configurations and environment variables for API base URLs pointing at the published domains, and block them." + }, + { + "case": "AIRT-CS-0022", + "phase": "recover", + "action": "Rotate any provider API key or OAuth credential that was ever entered into a reseller." + }, + { + "case": "AIRT-CS-0022", + "phase": "harden", + "action": "Alert when a coding agent's inference endpoint is changed away from the vendor default." + } + ] + } + }, + { + "id": "AIRT-TA-0020", + "name": "GTG-10007", + "kind": "unattributed-cluster", + "motivation": [ + "espionage" + ], + "summary": "Anthropic's cluster for Chinese-speaking operators who used Claude as the engineering and orchestration layer for an exploit foundry: binary reversing, vulnerability hypotheses, exploit writing and testing. They also ran agent swarms, in which a lead agent dispatched reconnaissance and post-exploitation work to parallel sub-agents. Anthropic counts around fifty targeted organisations.", + "confidence": "medium", + "basis": "A single reporting party. No indicators were published for this cluster, so it carries a sighting rather than a case study.", + "external_ids": { + "vendor_cluster": [ + "GTG-10007" + ] + }, + "sightings": [ + { + "date": "2026-09-10", + "reporter": "Anthropic", + "summary": "Claude used for autonomous binary reversing and exploit development, and to run agent swarms in which a lead agent dispatched reconnaissance and post-exploitation to parallel sub-agents.", + "atlas": [ + "AML.T0017.001", + "AML.T0124", + "AML.T0116" + ], + "ai_services": [ + "Claude" + ], + "victims": { + "sectors": [ + "education", + "retail", + "energy", + "information-technology", + "healthcare", + "financial-services", + "critical-manufacturing", + "government" + ], + "org_count": { + "value": 50, + "qualifier": "approx" + }, + "basis": "Anthropic: roughly fifty organisations across those sectors, globally." + }, + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026" + } + ], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026" + } + ], + "cases": [], + "links": [], + "derived": { + "techniques": [ + "AML.T0017.001", + "AML.T0116", + "AML.T0124" + ], + "attack": [], + "owasp_agentic": [], + "tactics": [ + "AML.TA0001", + "AML.TA0002", + "AML.TA0003" + ], + "sectors": [ + "critical-manufacturing", + "education", + "energy", + "financial-services", + "government", + "healthcare", + "information-technology", + "retail" + ], + "countries": [], + "regions": [], + "first_seen": "2026-09-10", + "last_seen": "2026-09-10", + "tools": [], + "iocs": [], + "detections_cited": [], + "detections_by_technique": [], + "gaps": [], + "off_host": [ + "AML.T0017.001", + "AML.T0116", + "AML.T0124" + ], + "hunt": [ + { + "technique": "AML.T0017.001", + "name": "Autonomous Exploit Development", + "tactics": [ + "AML.TA0003" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0116", + "name": "Autonomous Reconnaissance", + "tactics": [ + "AML.TA0002" + ], + "rules": [], + "off_host": true + }, + { + "technique": "AML.T0124", + "name": "Autonomous Attack Orchestration", + "tactics": [ + "AML.TA0001" + ], + "rules": [], + "off_host": true + } + ], + "collect": [], + "recovery": [] + } + } + ], + "cases": [ + { + "id": "AIRT-CS-0001", + "title": "GPT Pilot core/telemetry Supply-Chain Credential Stealer", + "date_range": "2025-08-24 (commit) to 2026-06-11 (removed)", + "disclosed": "2026-06-08", + "affects": "AIRT-0016", + "confidence": "high", + "basis": "Public repository evidence - the commit, the added files and their removal are all observable in version control - with an independent write-up from StepSecurity identifying the payload as a Shai-Hulud variant.", + "contested": "The two dates in the record do not agree, and the disagreement is itself forensically useful. The malicious commit carries an author date of 2025-08-24, while StepSecurity reports that a co-founder's GitHub account was compromised and the payload force-pushed on 2026-06-08. Commit dates are attacker-controlled; scope from the push and the clone, not from the date in the object.", + "atlas": [ + "AML.T0010" + ], + "summary": "A credential-stealing worm was hidden in the GPT Pilot repository under core/telemetry/ via malicious commit 065ee8eb. Anyone who cloned and ran GPT Pilot from source between Aug 2025 and 11 Jun 2026 should assume credential compromise and rotate.", + "iocs": [ + { + "type": "file", + "value": "core/telemetry/_runtime.bin", + "description": "Payload binary" + }, + { + "type": "file", + "value": "core/telemetry/_hooks.py", + "description": "Injection hooks" + }, + { + "type": "file", + "value": "core/telemetry/.loader.lock", + "description": "Loader lock file" + }, + { + "type": "file", + "value": "core/telemetry/__init__.py", + "description": "Modified to wire in the loader" + }, + { + "type": "binary", + "value": "bun", + "description": "Unexpected bun runtime binary present on host" + }, + { + "type": "directory", + "value": "rt-*", + "description": "Temp folders matching rt-* pattern" + }, + { + "type": "commit", + "value": "065ee8eb", + "description": "Malicious commit hash" + } + ], + "response_actions": [ + "Scope: identify hosts that cloned or ran GPT Pilot from source in the Aug 2025 - Jun 2026 window.", + "Rotate every credential reachable from those hosts, not just AI provider keys.", + "Hunt for the bun binary and rt-* temp directories as post-compromise indicators.", + "Treat the repo-local .env and config.json as exposed." + ], + "lesson": "AI agent frameworks are installed from source far more often than typical enterprise software, which bypasses package-registry scanning entirely. A from-source clone is an unreviewed supply chain.", + "detections": [ + "ai_agent_credential_file_access.yml" + ], + "references": [ + { + "title": "StepSecurity - Pythagora-io/gpt-pilot Compromised on GitHub: Shai-Hulud Credential Stealer Blocked by Python Linter", + "url": "https://www.stepsecurity.io/blog/pythagora-io-gpt-pilot-compromised-on-github-shai-hulud-credential-stealer-blocked-by-python-linter" + }, + { + "title": "SafeDep Threat Intelligence - Pythagora-io/gpt-pilot IOC record", + "url": "https://safedep.io/ti/ioc/github_repo/github_repo-5278c0f8c305/" + } + ], + "owasp_agentic": [ + "ASI04" + ], + "affects_ids": [ + "AIRT-0016" + ] + }, + { + "id": "AIRT-CS-0002", + "title": "postmark-mcp npm Backdoor - First In-the-Wild Malicious MCP Server", + "date_range": "2025-09-17 (published) to ~2025-09-25 (removed)", + "disclosed": "2025-09", + "affects": "MCP ecosystem", + "confidence": "high", + "basis": "Discovered and published by Koi Security, with the backdoored version, the publishing account and the exfiltration address all recoverable from the npm registry record, and corroborated independently by Snyk and Qualys.", + "atlas": [ + "AML.T0010", + "AML.T0115.002" + ], + "summary": "npm package postmark-mcp v1.0.16, published by user 'phanpak', silently BCC'd every email processed through it to an attacker-controlled address. 1,643 downloads before removal. Koi Security called it the first real-world sighting of a malicious MCP server.", + "iocs": [ + { + "type": "package", + "value": "postmark-mcp@1.0.16", + "description": "Backdoored version" + }, + { + "type": "account", + "value": "phanpak", + "description": "Publishing account" + }, + { + "type": "email", + "value": "phan@giftshop[.]club", + "description": "BCC exfiltration destination" + } + ], + "response_actions": [ + "Enumerate every MCP config for postmark-mcp and pin/remove.", + "Treat all email processed through the server during the window as disclosed.", + "Audit MCP configs for @latest version specifiers, which would have pulled the backdoor automatically." + ], + "lesson": "An MCP server sits inside the trust boundary of the agent and inherits its credentials. Version-pinning MCP servers is not hygiene, it is a control.", + "detections": [ + "mcp_tool_poisoning.yar", + "mcp_config_tampering.yml", + "ai_agent_mcp_config_modification.yml", + "mcp_outbound_unknown_domain.rules" + ], + "references": [ + { + "title": "The Hacker News - First Malicious MCP Server Found Stealing Emails in Rogue Postmark-MCP Package", + "url": "https://thehackernews.com/2025/09/first-malicious-mcp-server-found.html" + }, + { + "title": "Snyk - Malicious MCP Server on npm: postmark-mcp harvests emails", + "url": "https://snyk.io/blog/malicious-mcp-server-on-npm-postmark-mcp-harvests-emails/" + }, + { + "title": "Dark Reading - Sneaky, Malicious MCP Server Exfiltrates Secrets via BCC", + "url": "https://www.darkreading.com/application-security/malicious-mcp-server-exfiltrates-secrets-bcc" + } + ], + "owasp_agentic": [ + "ASI04" + ], + "affects_ids": [] + }, + { + "id": "AIRT-CS-0003", + "title": "Langflow CVE-2025-3248 Mass Exploitation and Flodrix Botnet Deployment", + "date_range": "2025-04 (disclosure) onward; CISA KEV listed 2025-05-05", + "disclosed": "2025-04-09", + "affects": "AIRT-0044", + "confidence": "high", + "basis": "Assigned CVE with a CISA Known Exploited Vulnerabilities listing, which is a government assertion of in-the-wild exploitation, plus independent malware analysis from Trend Micro naming the post-exploitation payload.", + "atlas": [ + "AML.T0011" + ], + "summary": "Langflow versions before 1.3.0 expose /api/v1/validate/code, which passes user-supplied Python to exec() with no authentication and no sandbox. Payloads hidden in function decorators and default arguments execute in the server context. CVSS 9.8. CISA added it to the Known Exploited Vulnerabilities catalog on 2025-05-05. Trend Micro documented in-the-wild exploitation deploying the Flodrix botnet, with operators first enumerating publicly exposed Langflow servers via Shodan or FOFA. A second flaw, CVE-2026-5027 (CVSS 8.8, path traversal via POST /api/v2/files) affects 1.8.4 and earlier.", + "iocs": [ + { + "type": "endpoint", + "value": "POST /api/v1/validate/code", + "description": "Exploitation endpoint for CVE-2025-3248" + }, + { + "type": "endpoint", + "value": "POST /api/v2/files", + "description": "Exploitation endpoint for CVE-2026-5027" + }, + { + "type": "pattern", + "value": "Python payloads in decorators or argument defaults", + "description": "Payload placement observed in the wild" + }, + { + "type": "malware", + "value": "Flodrix botnet", + "description": "Payload delivered post-exploitation" + }, + { + "type": "behavior", + "value": "Scanning of exposed port 7860", + "description": "Pre-exploitation enumeration via Shodan/FOFA" + }, + { + "type": "config", + "value": "LANGFLOW_AUTO_LOGIN=true", + "description": "Removes authentication entirely; highest-risk configuration" + } + ], + "response_actions": [ + "Identify every Langflow instance and its version; anything before 1.3.0 should be assumed compromised if it was ever internet-reachable.", + "Hunt retrospectively - exploitation may predate patching, so upgrading is not evidence of safety.", + "Review web logs for POST requests to /api/v1/validate/code and /api/v2/files.", + "Set LANGFLOW_AUTO_LOGIN=false and place the instance behind SSO or an isolated network.", + "Run Langflow as a non-root least-privilege user so arbitrary file writes cannot land in root-owned paths.", + "Rotate every credential stored in flows and in the Langflow database." + ], + "lesson": "This is the clearest proof that AI agent infrastructure is now a mass-exploitation target rather than a theoretical one: a CISA KEV listing, a named botnet payload, and internet-wide scanning for the default port. Self-hosted agent platforms deployed by developers rarely sit in the asset inventory that vulnerability management actually scans, which is why an inventory sweep for these listeners is the highest-value first control.", + "detections": [ + "langflow_rce_exploitation_attempt.yml", + "local_llm_listener_non_loopback.yml" + ], + "references": [ + { + "title": "NVD - CVE-2025-3248", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-3248" + }, + { + "title": "CISA - Known Exploited Vulnerabilities Catalog", + "url": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog" + }, + { + "title": "Trend Micro - Langflow CVE-2025-3248 exploited to deliver the Flodrix botnet", + "url": "https://www.trendmicro.com/en_us/research/25/f/langflow-flodrix-botnet.html" + } + ], + "owasp_agentic": [ + "ASI05" + ], + "external_ids": { + "cve": [ + "CVE-2025-3248", + "CVE-2026-5027" + ] + }, + "affects_ids": [ + "AIRT-0044" + ] + }, + { + "id": "AIRT-CS-0004", + "title": "GTG-1002 - AI-Orchestrated Espionage Campaign", + "date_range": "mid-Sep 2025 (detected) to 13 Nov 2025 (disclosed)", + "disclosed": "2025-11-13", + "affects": "AIRT-0001", + "confidence": "medium", + "basis": "Single-vendor disclosure by the AI provider whose product was abused, with no public IOCs and no independent technical corroboration. MITRE ATT&CK adopted it as Campaign C0062, which corroborates that the campaign happened, not the autonomy figures. Recorded as medium because the load-bearing claim - the degree of AI autonomy - rests on one reporting party and is disputed.", + "contested": "Multiple researchers, including Kevin Beaumont, publicly questioned whether the campaign was as autonomous as reported. Anthropic's own report notes that Claude \"frequently overstated findings\" and fabricated data during the operation, which cuts against the autonomy narrative it is cited for. Treat the 80-90% figure as a vendor assessment, not a measurement.", + "atlas": [ + "AML.T0053", + "AML.T0054", + "AML.T0096", + "AML.T0116", + "AML.T0117" + ], + "summary": "Anthropic assessed with high confidence that a Chinese state-sponsored actor built an autonomous attack framework around Claude Code driving MCP servers and sub-agents, and used it against roughly thirty organisations, succeeding against at least four. The framework ran reconnaissance, vulnerability discovery, exploit development, credential harvesting, lateral movement and exfiltration, with human operators reportedly intervening at only four to six decision points per campaign. Guardrails were bypassed by role-playing as a defensive security firm conducting authorised testing and decomposing the attack into individually innocuous sub-tasks. No indicators of compromise were published.", + "iocs": [ + { + "type": "behavior", + "value": "Agent session with tool_use/tool_result records spanning multiple kill-chain phases", + "description": "Recon, exploitation, credential access and exfiltration inside one session is the signal; no single call is anomalous" + }, + { + "type": "behavior", + "value": "Sustained request cadence far above human working tempo", + "description": "Reported in the thousands of requests per second; the exact rate is vendor-claimed" + }, + { + "type": "behavior", + "value": "Task framing that asserts authorised defensive testing", + "description": "The documented guardrail bypass, visible in the prompt history rather than on the endpoint" + }, + { + "type": "pattern", + "value": "High ratio of agent actions to human decision points in one session", + "description": "Reported as 4-6 human interventions per campaign" + } + ], + "response_actions": [ + "Scope from the agent side first: pull session traces for the period and look for phase progression within a single session rather than for individual malicious commands.", + "Correlate agent tool invocations against MCP server logs, so the arguments an agent passed are recoverable even where the agent trace was rotated.", + "Treat the target-side artifacts as an ordinary intrusion: the recon, credential-access and staging evidence is conventional, only the tempo is not.", + "Preserve agent and MCP logs before rotation - they are usually the only record of the decomposition, and default retention is short.", + "Record the autonomy question as an open assessment in the report rather than adopting the vendor figure, since the distinction changes attribution and response." + ], + "lesson": "Every individual tool call in this campaign was legitimate administrative activity. The compromise is only visible as an emergent property of the session - tempo, phase progression, target breadth, and the ratio of agent actions to human decisions - which is not something a signature can express. It is also the case that most strongly rewards reading the primary report critically: the same document that supplies the autonomy figure also records the model fabricating results.", + "detections": [ + "agentic_orchestration_behavior.yml", + "ai_agent_spawning_shell.yml", + "ai_agent_spawning_lolbin.yml", + "mcp_server_remote_code_fetch.yml" + ], + "references": [ + { + "title": "Anthropic - Disrupting the first reported AI-orchestrated cyber espionage campaign", + "url": "https://www-cdn.anthropic.com/d7dd50dd1185f59be051b307150d877f2b82bd2c.pdf" + }, + { + "title": "MITRE ATT&CK - Campaign C0062, Anthropic AI-orchestrated Campaign", + "url": "https://attack.mitre.org/campaigns/C0062/" + }, + { + "title": "BleepingComputer - Anthropic claims of Claude AI-automated cyberattacks met with doubt", + "url": "https://www.bleepingcomputer.com/news/security/anthropic-claims-of-claude-ai-automated-cyberattacks-met-with-doubt/" + } + ], + "owasp_agentic": [ + "ASI01", + "ASI02" + ], + "actors": [ + { + "ref": "AIRT-TA-0002", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"We assess with high confidence\" - a Chinese state-sponsored group", + "reference": "https://www.anthropic.com/news/disrupting-AI-espionage" + } + ], + "victims": { + "sectors": [ + "information-technology", + "financial-services", + "chemical", + "government" + ], + "org_count": { + "value": 30, + "qualifier": "approx" + }, + "basis": "Anthropic names large tech companies, financial institutions, chemical manufacturers and government agencies; ATLAS AML.CS0069 records the same four sectors. No countries were named." + }, + "external_ids": { + "attack_campaign": [ + "C0062" + ], + "atlas_case_study": [ + "AML.CS0069" + ] + }, + "affects_ids": [ + "AIRT-0001" + ] + }, + { + "id": "AIRT-CS-0005", + "title": "SesameOp - OpenAI Assistants API as a Covert C2 Relay", + "date_range": "Jul 2025 (discovered) to 3 Nov 2025 (disclosed)", + "disclosed": "2025-11-03", + "affects": "OpenAI Assistants API - no catalogued endpoint tool", + "confidence": "high", + "basis": "First-party incident response engagement by Microsoft's Detection and Response Team, published with named artifacts, mutex names, file paths and configuration layout. Nothing here is inferred from a sample alone.", + "atlas": [ + "AML.T0096" + ], + "summary": "Microsoft DART found this backdoor during an intrusion where the actor had persisted for months. It uses OpenAI's Assistants API not for inference but as attacker-controlled storage inside a provider every enterprise already trusts. An Eazfuscator.NET-obfuscated loader (Netapi64.dll) is injected into a legitimate host executable through .NET AppDomainManager injection, locates a file ending in Netapi64 under C:\\Windows\\Temp, XOR-decodes it and launches the OpenAIAgent.Netapi64 backdoor. The implant polls the assistants list and reads a verb - SLEEP, Payload or Result - from the description field, takes the encrypted and compressed command body from the instructions field, and returns output as a new message.", + "iocs": [ + { + "type": "file", + "value": "Netapi64.dll", + "description": "Eazfuscator.NET-obfuscated .NET loader" + }, + { + "type": "file", + "value": "C:\\Windows\\Temp\\Netapi64.start", + "description": "Marker file written by the loader" + }, + { + "type": "file", + "value": "C:\\Windows\\Temp\\Netapi64.Exception", + "description": "Exception log written by the loader" + }, + { + "type": "file", + "value": "C:\\Windows\\Temp\\*.Netapi64", + "description": "Encoded payload the loader searches for and XOR-decodes" + }, + { + "type": "file", + "value": ".exe.config containing appDomainManagerAssembly", + "description": "The injection mechanism - a .config beside a trusted binary is the durable artifact" + }, + { + "type": "process", + "value": "OpenAIAgent.Netapi64", + "description": ".NET backdoor component" + }, + { + "type": "mutex", + "value": "Netapi64", + "description": "Loader mutex, prevents duplicate infection" + }, + { + "type": "mutex", + "value": "OpenAI APIS", + "description": "Backdoor mutex" + }, + { + "type": "domain", + "value": "api.openai.com", + "description": "C2 relay; the finding is the process making the request, not the destination" + }, + { + "type": "config", + "value": "TextFile1 .NET resource holding ||", + "description": "Embedded configuration; fields surface as OpenAIAgent.token, .aaazzz and .proxy" + }, + { + "type": "pattern", + "value": "SLEEP / Payload / Result verbs in the Assistants API description field", + "description": "The command protocol, visible only in provider-side API records" + } + ], + "response_actions": [ + "Inventory which processes on each host talk to api.openai.com. Microsoft's own hunting guidance is to count devices per InitiatingProcessFileName - a non-AI process is the finding.", + "Sweep for .exe.config files carrying appDomainManagerAssembly next to trusted binaries; this survives removal of the DLL itself.", + "Check C:\\Windows\\Temp for Netapi64.start, Netapi64.Exception and files ending in Netapi64.", + "Pull the tenant's OpenAI API records if the key is recoverable: the assistants list holds the operator's tasking, which is not present on the endpoint.", + "Treat the OpenAI API key found in the TextFile1 resource as attacker-controlled infrastructure, and revoke any legitimate keys reachable from the host." + ], + "lesson": "The C2 channel terminates at a provider every enterprise already trusts, so reputation-based and IOC-based detection produce nothing - there is no suspicious domain and no newly registered infrastructure. Detection has to key on the wrong API path being used by the wrong process at a machine-regular cadence. That makes AI provider traffic an evidence source rather than background noise, and it is a pattern rather than an indicator list: OpenAI retires the Assistants API in August 2026 and the tradecraft moves to its successor.", + "detections": [ + "sesameop_assistants_api_c2.yml", + "ai_service_api_c2.rules" + ], + "references": [ + { + "title": "Microsoft Security Blog - SesameOp: Novel backdoor uses OpenAI Assistants API for command and control", + "url": "https://www.microsoft.com/en-us/security/blog/2025/11/03/sesameop-novel-backdoor-uses-openai-assistants-api-for-command-and-control/" + }, + { + "title": "The Hacker News - Microsoft Detects SesameOp Backdoor Using OpenAI's API as a Stealth Command Channel", + "url": "https://thehackernews.com/2025/11/microsoft-detects-sesameop-backdoor.html" + } + ], + "external_ids": { + "atlas_case_study": [ + "AML.CS0042" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0006", + "title": "PROMPTFLUX - Malware That Asks an LLM to Rewrite Itself", + "date_range": "2025 (samples) to 5 Nov 2025 (disclosed)", + "disclosed": "2025-11-05", + "affects": "Gemini API (generativelanguage.googleapis.com) - no catalogued endpoint tool", + "confidence": "medium", + "basis": "Single-vendor disclosure by Google Threat Intelligence Group, corroborated widely in the press but not independently analysed. GTIG assessed the samples as still in development or testing, so the artifact list describes what the code does, not what was recovered from a victim.", + "contested": "GTIG assessed PROMPTFLUX as not yet capable of compromising a victim environment, and the sample's own AttemptToUpdateSelf routine was commented out. Reporting that presents it as an operational metamorphic threat overstates the evidence. What is established is intent and a working LLM query path, not in-the-wild impact.", + "atlas": [ + "AML.T0096" + ], + "summary": "A VBScript dropper whose \"Thinking Robot\" module queries Gemini on a timer with a prompt asking for an obfuscated rewrite of its own source, so the script on disk is never the script that was analysed. Responses are logged to a file in %TEMP%, and regenerated variants are written to the per-user Startup folder for persistence. One observed variant instructed the model hourly to act as an \"expert VBScript obfuscator\" and rewrite the entire source. GTIG grouped it with a family of samples exhibiting just-in-time code creation, and assessed it as in development.", + "iocs": [ + { + "type": "file", + "value": "%TEMP%\\thinking_robot_log.txt", + "description": "The model's responses - effectively the attacker's tooling history, turn by turn" + }, + { + "type": "directory", + "value": "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", + "description": "Regenerated script variants land here; contents differ on each iteration" + }, + { + "type": "domain", + "value": "generativelanguage.googleapis.com", + "description": "Gemini API endpoint; the finding is wscript.exe or cscript.exe reaching it" + }, + { + "type": "pattern", + "value": "gemini-1.5-flash-latest referenced in a script body", + "description": "Hard-coded model selector" + }, + { + "type": "pattern", + "value": "Hard-coded provider API key inside a script", + "description": "Recoverable from the script and usable for provider-side scoping" + }, + { + "type": "behavior", + "value": "Propagation to removable drives and mapped network shares", + "description": "Distribution mechanism described by GTIG" + } + ], + "response_actions": [ + "Collect %TEMP%\\thinking_robot_log.txt first and treat it as the primary evidence: it records what the operator asked the model to produce, and it survives when the script has already rewritten itself.", + "Hunt on the egress rather than the hash: script interpreters (wscript.exe, cscript.exe) resolving or connecting to LLM API hosts is the durable signal.", + "Snapshot the Startup folder rather than sampling it - two acquisitions minutes apart can legitimately differ.", + "Extract any hard-coded provider key and pass it to the provider for abuse scoping; the key ties otherwise unlinkable variants together.", + "Do not scope by file hash. Hash-based scoping under-reports by design here; scope by log path, Startup entry and egress." + ], + "lesson": "The malicious logic is not resident in the sample - it is fetched at execution time, so two acquisitions of the same malware produce different files and signature coverage degrades by design. The response log inverts the usual analysis order and is a gift to the investigator: it is a transcript of the attacker's intent. This is also the case that most rewards checking the primary source, since the sample's self-update routine was commented out and the family was assessed as in development.", + "detections": [ + "promptflux_thinking_robot.yar", + "promptflux_artifacts_fileevent.yml", + "script_interpreter_llm_api_dns.yml", + "llm_api_prompt_in_script_generic.yar", + "runtime_ai_malware_correlation.yml" + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://services.google.com/fh/files/misc/advances-in-threat-actor-usage-of-ai-tools-en.pdf" + }, + { + "title": "Help Net Security - Google uncovers malware using LLMs to operate and evade detection", + "url": "https://www.helpnetsecurity.com/2025/11/05/malware-using-llms/" + }, + { + "title": "Infosecurity Magazine - AI-Enabled Malware Now Actively Deployed, Says Google", + "url": "https://www.infosecurity-magazine.com/news/aienabled-malware-actively/" + } + ], + "affects_ids": [] + }, + { + "id": "AIRT-CS-0007", + "title": "PROMPTSTEAL / LAMEHUG - An LLM Writing Collection Commands at Runtime", + "date_range": "Jul 2025 (CERT-UA report) to 5 Nov 2025 (GTIG report)", + "disclosed": "2025-07-17", + "affects": "Hugging Face inference API - no catalogued endpoint tool", + "confidence": "high", + "basis": "Two independent reporting parties describing the same malware: CERT-UA published it as LAMEHUG on 17 Jul 2025 from live phishing activity, and GTIG published it as PROMPTSTEAL on 5 Nov 2025. Third-party technical analyses (Cato CTRL, Picus) followed. The behaviour is well corroborated; the attribution is not the same thing, and is recorded separately below.", + "contested": "CERT-UA tracks the actor as UAC-0001 and attributes it to APT28 (Fancy Bear) with moderate confidence. GTIG describes it as APT28 use. Attribution should be carried as an assessment rather than a fact; the malware behaviour is what is independently established.", + "atlas": [ + "AML.T0096" + ], + "summary": "A Python data miner, PyInstaller-compiled and delivered by phishing mail impersonating Ukrainian ministry correspondence and sent from compromised accounts, initially against Ukraine's security and defence sector. GTIG describes the sample as presenting itself as an image generation utility. At execution it submits base64-encoded prompts to the Qwen2.5-Coder-32B-Instruct model through the Hugging Face inference API, asking the model to generate Windows commands for system reconnaissance and document collection, then executes what comes back. It stages Office, PDF and TXT files from common user folders and exfiltrates over SFTP or HTTP POST. GTIG described it as their first observation of malware querying an LLM in live operations.", + "iocs": [ + { + "type": "domain", + "value": "api-inference.huggingface.co", + "description": "Inference API egress from a compiled desktop utility is the pivot" + }, + { + "type": "pattern", + "value": "Hard-coded hf_ API token inside a binary", + "description": "Hugging Face token; usable for provider-side scoping" + }, + { + "type": "pattern", + "value": "Qwen2.5-Coder-32B-Instruct referenced as the target model", + "description": "Model selector observed in samples" + }, + { + "type": "file", + "value": "Додаток.pdf.zip", + "description": "Phishing archive name reported by CERT-UA; carries a PyInstaller executable beside a decoy PDF" + }, + { + "type": "behavior", + "value": "Command execution parented by a desktop utility rather than a shell", + "description": "The executed commands never appear in the sample, so process lineage is the evidence" + }, + { + "type": "behavior", + "value": "Staged collection from Documents, Desktop and Downloads", + "description": "Collection targets Office, PDF and TXT files" + }, + { + "type": "behavior", + "value": "Exfiltration over SFTP or HTTP POST", + "description": "Two observed channels" + } + ], + "response_actions": [ + "Reconstruct capability from process lineage and egress, not from the sample: static analysis under-reports because the commands are generated after execution.", + "Hunt for outbound requests to inference API hosts from compiled desktop applications that have no reason to reach one.", + "Recover any hf_ token from the binary and use it to scope provider-side activity and other samples sharing the key.", + "Treat every Office, PDF and TXT file in the user profile as candidate exfiltration scope, since collection was breadth-first rather than targeted.", + "Check for SFTP and outbound HTTP POST from the same process, and preserve the staging directory before it is cleaned up." + ], + "lesson": "Paired with PROMPTFLUX this shows the two shapes of runtime LLM abuse - rewriting self, and generating actions - and the second is the harder one to investigate. The executed commands exist only in the model's response, so the investigator has to reason about what the model would have been asked to produce and treat the API egress as the pivot. It is also the better-evidenced of the pair: an independent national CERT reported it from live operations months before the vendor tracker did.", + "detections": [ + "promptsteal_lamehug.yar", + "runtime_llm_api_c2.rules", + "llm_api_prompt_in_script_generic.yar" + ], + "references": [ + { + "title": "CERT-UA #16039 - LAMEHUG (17 Jul 2025)", + "url": "https://cert.gov.ua/article/6284730" + }, + { + "title": "The Hacker News - CERT-UA Discovers LAMEHUG Malware Linked to APT28, Using LLM for Phishing Campaign", + "url": "https://thehackernews.com/2025/07/cert-ua-discovers-lamehug-malware.html" + }, + { + "title": "Cato CTRL - Analyzing LAMEHUG, first known LLM-powered malware with links to APT28", + "url": "https://www.catonetworks.com/blog/cato-ctrl-threat-research-analyzing-lamehug/" + }, + { + "title": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://services.google.com/fh/files/misc/advances-in-threat-actor-usage-of-ai-tools-en.pdf" + } + ], + "actors": [ + { + "ref": "AIRT-TA-0001", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "CERT-UA (UAC-0001); GTIG", + "stated_confidence": "CERT-UA - moderate confidence; GTIG - \"the Russian government-backed actor APT28 (aka FROZENLAKE)\"", + "reference": "https://cert.gov.ua/article/6284730" + } + ], + "victims": { + "sectors": [ + "government", + "defense-industrial-base" + ], + "countries": [ + "UA" + ], + "basis": "CERT-UA and GTIG both describe targeting of Ukraine's security and defence sector." + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0008", + "title": "EchoLeak (CVE-2025-32711) - Zero-Click Exfiltration from M365 Copilot", + "date_range": "Jan 2025 (reported) to Jun 2025 (disclosed and fixed)", + "disclosed": "2025-06-11", + "affects": "Microsoft 365 Copilot - no catalogued endpoint tool", + "confidence": "high", + "basis": "Assigned CVE, CVSS 9.3, vendor-patched server-side, and independently written up by the discovering research team and in a subsequent academic paper. Microsoft states there was no exploitation in the wild.", + "atlas": [ + "AML.T0051", + "AML.T0024" + ], + "summary": "An untrusted inbound email carried instructions that Microsoft 365 Copilot processed while assembling context. The assistant, holding privileged access to tenant data, was induced to pull sensitive content and emit it inside an auto-fetched markdown image reference, exfiltrating the data through the rendering path. Aim Labs named the underlying flaw an LLM Scope Violation - untrusted input reaching a component that holds privileged scope. No click, no attachment, no user action. Anything inside Copilot's scope was reachable, including chat history, OneDrive, SharePoint and Teams content. Microsoft fixed it server-side and reports no in-the-wild exploitation.", + "iocs": [ + { + "type": "pattern", + "value": "Markdown image reference in a completion whose URL carries content as parameters", + "description": "The exfiltration primitive; the render path fetches it without user action" + }, + { + "type": "behavior", + "value": "Copilot interaction events for a user who never invoked Copilot on that content", + "description": "Recorded in the M365 unified audit log / Purview if AI interaction auditing is on" + }, + { + "type": "behavior", + "value": "Outbound fetch from an image proxy immediately after a completion", + "description": "The beacon carrying the payload; not on the endpoint at all" + }, + { + "type": "pattern", + "value": "Inbound mail containing assistant-directed instructions", + "description": "Looks like ordinary mail; only the instruction text distinguishes it" + } + ], + "response_actions": [ + "Confirm AI interaction logging is enabled before anything else. If prompt and completion capture was off, the decisive evidence was never written and the investigation is over before it starts.", + "Pull M365 unified audit and Purview records for Copilot interactions in the window, keyed on the affected user rather than on a process.", + "Correlate completions containing markdown image references with image-proxy fetch logs, since the fetch is where the data actually left.", + "Retrieve the originating message and preserve it intact; the payload is in the body text, and it looks unremarkable.", + "Scope by Copilot's access rather than by the user's activity: everything in scope was reachable, whether or not the user ever opened it." + ], + "lesson": "Every user-behaviour assumption in traditional IR breaks here. There is no click to reconstruct, no credential to trace, no endpoint execution - the interaction happened between an email, an assistant and a rendering proxy. The decisive lesson is about posture rather than hunting: if prompt and completion logging was not already enabled, the evidence does not exist retrospectively. AI logging posture has to be established before AI hunting is possible.", + "detections": [ + "markdown_image_exfil.yml", + "m365_copilot_sensitive_label_access.yml", + "m365_copilot_anomalous_aggregation.yml", + "ai_assistant_outbound_to_camo_proxy.rules" + ], + "references": [ + { + "title": "NVD - CVE-2025-32711", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-32711" + }, + { + "title": "arXiv:2509.10540 - EchoLeak: The First Real-World Zero-Click Prompt Injection Exploit in a Production LLM System", + "url": "https://arxiv.org/abs/2509.10540" + }, + { + "title": "The Hacker News - Zero-Click AI Vulnerability Exposes Microsoft 365 Copilot Data Without User Interaction", + "url": "https://thehackernews.com/2025/06/zero-click-ai-vulnerability-exposes.html" + } + ], + "owasp_agentic": [ + "ASI01" + ], + "external_ids": { + "cve": [ + "CVE-2025-32711" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0009", + "title": "The MCP Vulnerability Cluster - RCE on Connect and the Rug-Pull", + "date_range": "Jun 2025 to Aug 2025 (the three anchor CVEs)", + "disclosed": "2025-07-09", + "affects": [ + "AIRT-0001", + "AIRT-0002", + "AIRT-0006", + "AIRT-0011" + ], + "confidence": "high", + "basis": "Three assigned CVEs with published advisories, named discovering parties and shipped fixes. Recorded from the CVE records rather than from aggregate counts.", + "summary": "Model Context Protocol went from novelty to default integration layer, and a vulnerability class followed it. mcp-remote (CVE-2025-6514, CVSS 9.6, JFrog) achieved OS command injection on the client merely by connecting to a malicious server, in versions 0.0.5 to 0.1.15 and with over 437,000 downloads at disclosure. MCP Inspector (CVE-2025-49596, CVSS 9.4, Oligo) allowed unauthenticated RCE between client and proxy, fixed in 0.14.1. MCPoison (CVE-2025-54136, CVSS 7.2, Check Point) allowed an approved MCP server configuration in Cursor to be silently redefined after approval and never re-validated - the rug-pull - fixed in Cursor 1.3.", + "iocs": [ + { + "type": "pattern", + "value": "mcp-remote 0.0.5 through 0.1.15", + "description": "Vulnerable range for CVE-2025-6514; fixed in 0.1.16" + }, + { + "type": "pattern", + "value": "@modelcontextprotocol/inspector below 0.14.1", + "description": "Vulnerable range for CVE-2025-49596" + }, + { + "type": "pattern", + "value": "Cursor before 1.3", + "description": "Vulnerable range for CVE-2025-54136 (MCPoison)" + }, + { + "type": "config", + "value": "MCP server entry pointing at a remote URL the organisation did not vet", + "description": "Present in Claude Desktop, Claude Code, Cursor, VS Code and Windsurf configs" + }, + { + "type": "behavior", + "value": "MCP tool invocation whose arguments do not match the definition currently on disk", + "description": "The rug-pull signature - config and execution disagree" + }, + { + "type": "behavior", + "value": "Child process spawned by an MCP client immediately after a server connection", + "description": "Command injection on connect" + } + ], + "response_actions": [ + "Enumerate the same server across every client that had it configured, not just the one that reported. Removing it from one client leaves the others live.", + "Treat the invocation trace as authoritative and the config as hearsay. Under a rug-pull the file on disk is not what executed, which inverts the usual instinct.", + "Version-check mcp-remote, MCP Inspector and Cursor against the fixed versions above across the estate, including developer laptops outside the managed inventory.", + "Pin MCP server versions rather than tracking latest, and record the approval decision alongside the definition hash so a later redefinition is detectable.", + "Rotate OAuth tokens and credentials the affected servers were granted or proxied, since an MCP server sits inside the agent's trust boundary." + ], + "lesson": "The rug-pull inverts a core investigative instinct: the configuration on disk is not what executed, because an approved tool was silently redefined afterwards. Only the invocation trace is authoritative. The second lesson is scope - the same MCP server is usually configured in several clients on the same host, and responders who remediate the one that alerted leave the rest running.", + "detections": [ + "mcp_tool_poisoning.yar", + "mcp_config_tampering.yml", + "claude_desktop_config_modify.yml", + "mcp_credential_access.yml", + "mcp_server_remote_code_fetch.yml", + "ai_agent_mcp_config_modification.yml" + ], + "references": [ + { + "title": "GitHub Advisory GHSA-6xpm-ggf7-wc3p - CVE-2025-6514, mcp-remote OS command injection", + "url": "https://github.com/advisories/GHSA-6xpm-ggf7-wc3p" + }, + { + "title": "JFrog - Critical mcp-remote RCE vulnerability (CVE-2025-6514)", + "url": "https://jfrog.com/blog/2025-6514-critical-mcp-remote-rce-vulnerability/" + }, + { + "title": "OSV - CVE-2025-49596, MCP Inspector RCE", + "url": "https://osv.dev/vulnerability/CVE-2025-49596" + }, + { + "title": "NVD - CVE-2025-54136 (MCPoison)", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-54136" + } + ], + "owasp_agentic": [ + "ASI04", + "ASI05" + ], + "external_ids": { + "cve": [ + "CVE-2025-49596", + "CVE-2025-54136", + "CVE-2025-6514" + ], + "ghsa": [ + "GHSA-6xpm-ggf7-wc3p" + ] + }, + "affects_ids": [ + "AIRT-0001", + "AIRT-0002", + "AIRT-0006", + "AIRT-0011" + ] + }, + { + "id": "AIRT-CS-0010", + "title": "SpAIware - Prompt Injection That Persists in Assistant Memory", + "date_range": "Sep 2024 (published) to 2025 (adopted into MITRE ATLAS)", + "disclosed": "2024-09-24", + "affects": "ChatGPT memory (macOS app) - no catalogued endpoint tool", + "confidence": "high", + "basis": "Publicly reproducible research by Johann Rehberger with a documented vendor fix, subsequently adopted into the MITRE ATLAS technique set as AI Agent Context Poisoning - Memory (AML.T0080.000).", + "summary": "An injected instruction, delivered through a malicious site or a booby-trapped document, is committed to ChatGPT's persistent memory and directs the assistant to end all future responses with a markdown image whose URL carries the previous question and answer as parameters. Because it lives in memory rather than in a conversation, it survives session resets and applies to every subsequent chat until memory is purged. OpenAI closed the exfiltration channel in ChatGPT 1.2024.247; untrusted content invoking the memory tool to store arbitrary memories was not itself eliminated, which is why memory remains an evidence source rather than a closed issue.", + "atlas": [ + "AML.T0080", + "AML.T0080.000", + "AML.T0086" + ], + "iocs": [ + { + "type": "behavior", + "value": "Memory store entry containing a standing instruction rather than a user preference", + "description": "The persistence mechanism; reads as configuration, not as an attack" + }, + { + "type": "file", + "value": "Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)", + "description": "The same primitive in coding agents - an on-disk file that is context every run" + }, + { + "type": "file", + "value": "Framework checkpoint stores (LangGraph SQLite and equivalents)", + "description": "Where an agent framework persists state between invocations" + }, + { + "type": "behavior", + "value": "Repeating outbound fetch, one per assistant response", + "description": "Regular beacon in proxy logs, cadence tied to conversation turns rather than to a timer" + }, + { + "type": "pattern", + "value": "Markdown image URL carrying conversation text as query parameters", + "description": "Exfiltration primitive; spaces escaped" + } + ], + "response_actions": [ + "Acquire the memory store before touching the host. Memory is the persistence mechanism, and it is the step responders skip.", + "Read agent instruction files and framework checkpoint stores as part of the same sweep - they are the on-disk equivalent of the same primitive.", + "Look for a repeating outbound fetch whose cadence tracks conversation turns rather than a clock; that distinguishes it from ordinary beaconing.", + "Put memory purge in the eradication phase and purge verification in recovery. Cleaning the host and rotating credentials does not remove it.", + "Establish which turn wrote each surviving entry, so a legitimate stored preference is not deleted alongside the injected one." + ], + "lesson": "Memory is a persistence mechanism and it is routinely skipped. A team can clean the host, rotate every credential and remove the malicious integration, and the agent will re-execute the attacker's instruction on its next invocation because nobody looked at the memory store. That makes memory purge a distinct eradication step and purge verification a distinct recovery step - a new line item in the IR lifecycle rather than a variation on an existing one.", + "detections": [ + "memory_poisoning.yml", + "memory_poisoning_indicators.yar", + "markdown_image_exfil.yml", + "copilot_rules_file_backdoor.yar" + ], + "references": [ + { + "title": "Embrace The Red - Spyware Injection Into Your ChatGPT's Long-Term Memory (SpAIware)", + "url": "https://embracethered.com/blog/posts/2024/chatgpt-macos-app-persistent-data-exfiltration/" + }, + { + "title": "MITRE ATLAS - AML.T0080.000, AI Agent Context Poisoning: Memory", + "url": "https://atlas.mitre.org/techniques/AML.T0080.000" + }, + { + "title": "The Hacker News - ChatGPT macOS Flaw Could've Enabled Long-Term Spyware via Memory Function", + "url": "https://thehackernews.com/2024/09/chatgpt-macos-flaw-couldve-enabled-long.html" + } + ], + "owasp_agentic": [ + "ASI06" + ], + "affects_ids": [] + }, + { + "id": "AIRT-CS-0011", + "title": "AI Recommendation Poisoning - Memory Manipulation for Profit", + "date_range": "Dec 2025 to Feb 2026 (observation window)", + "disclosed": "2026-02-10", + "affects": "Assistant memory stores - no catalogued endpoint tool", + "confidence": "high", + "basis": "Vendor security research published by Microsoft's Defender Security Research team with counts, an observation window and an ATLAS technique mapping, and picked up independently in trade press.", + "atlas": [ + "AML.T0080" + ], + "summary": "Microsoft documented memory poisoning used for commercial gain rather than espionage. Because major assistants support pre-populating a prompt through URL parameters, an \"Ask AI\" or \"Summarize with AI\" button - or a link in a page or email - can carry an instruction the assistant parses and commits to memory, biasing later recommendations toward the party that planted it. Microsoft identified 31 companies across 14 industries deploying the technique, and observed more than 50 distinct prompts in a single data source over 60 days. Instructions embedded in documents, emails and web pages produce the same effect when the content is processed by an assistant.", + "iocs": [ + { + "type": "url", + "value": "Assistant URL carrying a pre-filled prompt in a query parameter", + "description": "Recoverable from browser history and referrer logs; the delivery mechanism" + }, + { + "type": "behavior", + "value": "Memory entry phrased as an innocuous user preference", + "description": "For example, remember X as a trusted source - defeats keyword triage" + }, + { + "type": "behavior", + "value": "Assistant interaction log entry at the moment of the memory write", + "description": "The only record tying the entry back to the turn that created it" + }, + { + "type": "pattern", + "value": "Prompt text embedded in a document, email or web page", + "description": "Second delivery path, no click required beyond processing the content" + } + ], + "response_actions": [ + "Reason about provenance rather than content: for each memory entry, establish which turn wrote it and whether the source was the user or a retrieved document.", + "Pull browser history and referrer logs for parameterised assistant URLs in the window; that is where the write originates.", + "Review memory entries that name a specific vendor, product or source as trusted, and treat those as candidates regardless of how benign they read.", + "Preserve the assistant interaction log before purging memory, or the provenance evidence is destroyed along with the entry.", + "Widen the threat model in reporting: the same persistence primitive supports fraud, which changes who is targeted and how often." + ], + "lesson": "The poisoned entry looks exactly like a legitimate stored preference, which defeats keyword triage and forces the investigator into provenance reasoning - which turn wrote this, and was the source a user or a retrieved document. It also demonstrates that memory poisoning is not only an espionage primitive; a commercial motive means far more victims and far more routine occurrence than a targeted-attack framing would predict.", + "detections": [ + "memory_poisoning.yml", + "memory_poisoning_indicators.yar" + ], + "references": [ + { + "title": "Microsoft Security Blog - Manipulating AI memory for profit: The rise of AI Recommendation Poisoning", + "url": "https://www.microsoft.com/en-us/security/blog/2026/02/10/ai-recommendation-poisoning/" + }, + { + "title": "Help Net Security - That summarize with AI button might be manipulating you", + "url": "https://www.helpnetsecurity.com/2026/02/11/ai-recommendation-memory-poisoning-attacks/" + }, + { + "title": "The Hacker News - Microsoft Finds Summarize with AI Prompts Manipulating Chatbot Recommendations", + "url": "https://thehackernews.com/2026/02/microsoft-finds-summarize-with-ai.html" + } + ], + "owasp_agentic": [ + "ASI06" + ], + "victims": { + "sectors": [ + "consumers" + ], + "basis": "Users of assistants with persistent memory; ATLAS AML.CS0072 names Microsoft 365 Copilot, ChatGPT, Claude, Perplexity and Grok users." + }, + "external_ids": { + "atlas_case_study": [ + "AML.CS0072" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0012", + "title": "PoisonedRAG - Five Documents Against a Corpus of Millions", + "date_range": "2024 (preprint) to Aug 2025 (USENIX Security 2025)", + "disclosed": "2025-08-13", + "affects": "RAG vector stores - no catalogued endpoint tool", + "confidence": "high", + "basis": "Peer-reviewed and presented at USENIX Security 2025, with published code. This is demonstrated research rather than an observed intrusion, and is recorded as such - the artifact list describes where the evidence would live, not what was recovered from a victim.", + "atlas": [ + "AML.T0082" + ], + "summary": "The first knowledge poisoning attack against retrieval-augmented generation. Zou et al. formulate knowledge corruption as an optimisation problem, with black-box and white-box variants, and show that injecting five adversarial texts per target question into a knowledge base of millions reliably causes the system to return an attacker-chosen answer, at around a 90% success rate. Several defences were evaluated and none were sufficient. There is no malicious code anywhere in the attack - nothing to detonate and nothing to sandbox.", + "iocs": [ + { + "type": "behavior", + "value": "Vector store records whose ingestion provenance is missing or unattributable", + "description": "Chroma, Pinecone, Weaviate, Qdrant, pgvector and FAISS all store this differently" + }, + { + "type": "behavior", + "value": "Retrieval log showing the same small document set returned for a narrow question set", + "description": "The retrieval side of the attack; visible before the answer is" + }, + { + "type": "behavior", + "value": "Ingestion pipeline record with no upstream source or an unexpected one", + "description": "When a document entered and from where - usually the only provenance that exists" + }, + { + "type": "pattern", + "value": "Embedding whose nearest neighbours are inconsistent with its stated topic", + "description": "Anomaly signal in embedding space rather than in file content" + } + ], + "response_actions": [ + "Treat this as data-integrity work, not malware work: the investigation is retrieval provenance, ingestion history and embedding-space anomaly.", + "Pull retrieval logs for the affected question set first; which documents were returned is cheaper to establish than which documents are poisoned.", + "Reconstruct ingestion history for the returned documents - when each entered the store and through which pipeline.", + "Preserve the vector store and its metadata together; the embeddings without the ingestion metadata cannot answer the provenance question.", + "Scope by question rather than by document. A handful of records among millions is not findable by sweeping the corpus." + ], + "lesson": "The needle-to-haystack ratio is brutal - a handful of poisoned records among millions, with no malicious code anywhere. Endpoint-trained instincts do not transfer: there is nothing to detonate, no process lineage, and no hash to sweep. What the investigation actually needs is retrieval provenance and ingestion history, which means the controls that make it investigable have to be in place before the incident.", + "detections": [ + "rag_document_hidden_text.yar", + "vector_db_query_anomaly.yml", + "chroma_sqlite_unexpected_writer.yml", + "vector_db_bulk_exfil.yml" + ], + "references": [ + { + "title": "USENIX Security 2025 - PoisonedRAG: Knowledge Corruption Attacks to Retrieval-Augmented Generation of Large Language Models", + "url": "https://www.usenix.org/conference/usenixsecurity25/presentation/zou-poisonedrag" + }, + { + "title": "USENIX - PoisonedRAG paper (PDF)", + "url": "https://www.usenix.org/system/files/usenixsecurity25-zou-poisonedrag.pdf" + } + ], + "owasp_agentic": [ + "ASI06" + ], + "affects_ids": [] + }, + { + "id": "AIRT-CS-0013", + "title": "Mexican Government Breach - AI-Accelerated, Not AI-Orchestrated", + "date_range": "Dec 2025 to mid-Feb 2026 (activity)", + "disclosed": "2026-02-25", + "affects": "AIRT-0001", + "confidence": "medium", + "basis": "The breach is corroborated across multiple outlets and Anthropic confirmed the account activity and banned the accounts. The technical account of how AI was used comes from a single research firm, Gambit Security, and the assessment of the AI's role is not agreed. Recorded as medium for that reason.", + "contested": "Reporting differs on both the actor and the AI's contribution. Gambit describes a small group; some coverage describes a lone actor. Claude is reported to have executed around 75% of remote commands, but independent analysis assessed the AI's contribution as primarily post-access acceleration - planning and scripting - rather than autonomous initial compromise. This disagreement is the point of the case, not a defect in it.", + "atlas": [ + "AML.T0054", + "AML.T0096" + ], + "summary": "Gambit Security disclosed a campaign against nine Mexican federal and state government agencies, including the federal tax authority and the national electoral institute, running from December 2025 to mid-February 2026. The actor jailbroke Claude Code using Spanish-language bug-bounty and penetration-testing framing, supplemented with a second commercial model, and exfiltrated roughly 150 GB covering about 195 million taxpayer and voter records - names, addresses, RFC and CURP identifiers, voter registration details and internal employee credentials. Anthropic confirmed the activity, banned the accounts and reported improved misuse detection in later releases.", + "iocs": [ + { + "type": "behavior", + "value": "Agent session trace containing authorised-testing or bug-bounty framing", + "description": "The jailbreak, visible in the prompt history rather than on the endpoint" + }, + { + "type": "behavior", + "value": "Task decomposition following the framing turn", + "description": "The sequence that matters - framing, then a long run of individually ordinary tasks" + }, + { + "type": "behavior", + "value": "Bulk database extraction and staging on the victim estate", + "description": "Conventional intrusion artifacts; nothing AI-specific about them" + }, + { + "type": "pattern", + "value": "Two different commercial models used within one campaign", + "description": "Reported as Claude Code plus a second hosted model; provider-side scoping needs both" + } + ], + "response_actions": [ + "Work the victim estate as a conventional intrusion. The exfiltration, staging and database access artifacts are ordinary, and that is where scope comes from.", + "Request provider-side session records for both models rather than one; a single provider's view covers only part of the campaign.", + "Look for the framing turn specifically. It is the pivot between benign use and campaign use, and it is a single message in a long transcript.", + "State whether the finding is AI-accelerated or AI-orchestrated, and give the basis. Collapsing the two is the reporting failure this case exists to prevent.", + "Rotate credentials for the exposed internal employee accounts independently of the citizen data scope, since they enable follow-on access." + ], + "lesson": "This is the calibration case, and it belongs beside GTG-1002 rather than apart from it. A responder has to be able to distinguish AI-accelerated from AI-orchestrated, because the two demand different responses and reporting routinely collapses them. Getting it wrong in either direction is costly: over- attributing capability inflates the adversary, and under-attributing it means missing genuine autonomy when it does appear.", + "detections": [ + "agentic_orchestration_behavior.yml", + "ai_agent_spawning_shell.yml" + ], + "references": [ + { + "title": "Gambit Security - The AI-Assisted Breach of Mexico's Government Infrastructure (technical report)", + "url": "https://cdn.prod.website-files.com/69944dd945f20ca4a27a7c47/69d8bb5aea59e31efb3b8a7f_Tech_Report_ai_breach_mex_gov.pdf" + }, + { + "title": "Live Science - Hackers used AI to steal hundreds of millions of Mexican government and private citizen records", + "url": "https://www.livescience.com/technology/artificial-intelligence/hackers-used-ai-to-steal-hundreds-of-millions-of-mexican-government-and-private-citizen-records-in-one-of-the-largest-cybersecurity-breaches-ever" + } + ], + "victims": { + "sectors": [ + "government" + ], + "countries": [ + "MX" + ], + "org_count": { + "value": 9, + "qualifier": "exact" + }, + "basis": "Nine Mexican federal and state government agencies, per the cited reporting." + }, + "affects_ids": [ + "AIRT-0001" + ] + }, + { + "id": "AIRT-CS-0014", + "title": "ShadowRay - AI Compute Clusters Exploited in the Wild", + "date_range": "Mar 2024 (first campaign) to Nov 2025 (ShadowRay 2.0)", + "disclosed": "2024-03-26", + "affects": "Ray (distributed compute) - no catalogued endpoint tool", + "confidence": "high", + "basis": "Vendor research by Oligo Security with in-the-wild exploitation observed across two campaigns, widely corroborated in trade press. CVE-2023-48022 is a published CVE record.", + "contested": "CVE-2023-48022 is disputed. Anyscale's position is that unauthenticated job submission is intended behaviour for a framework meant to run inside a trusted network, so the CVE was never directly fixed. That disagreement is why exposure persists and why this is an exposure-management finding rather than a patching one.", + "summary": "Ray's Jobs API accepts job submissions without authentication. Internet-exposed clusters therefore give an attacker code execution on machines holding models, training data and cloud credentials. Oligo disclosed ShadowRay in March 2024 as the first known attack campaign against AI workloads in the wild, with thousands of exposed servers already compromised. In November 2025 Oligo documented ShadowRay 2.0, a global campaign turning exposed clusters into a self-propagating cryptomining botnet - multi-stage Bash and Python payloads that abuse Ray's own orchestration to deploy across every node and to spread cluster to cluster, running XMRig.", + "iocs": [ + { + "type": "behavior", + "value": "Job submission to the Ray Jobs API from outside the cluster network", + "description": "Recorded in Ray dashboard and jobs API access logs" + }, + { + "type": "behavior", + "value": "Submitted job definition carrying a multi-stage Bash or Python payload", + "description": "The job definition is the payload record and is retained by Ray" + }, + { + "type": "process", + "value": "XMRig or equivalent miner on a GPU host", + "description": "Observed payload in the ShadowRay 2.0 campaign" + }, + { + "type": "behavior", + "value": "Orchestration used to fan a job out to every node", + "description": "Ray's own scheduling is the lateral movement mechanism" + }, + { + "type": "behavior", + "value": "Outbound job submission from one cluster to another", + "description": "Cluster-to-cluster propagation observed in ShadowRay 2.0" + }, + { + "type": "pattern", + "value": "Ray dashboard reachable from the internet", + "description": "The precondition; the exposure is the vulnerability here" + } + ], + "response_actions": [ + "Inventory exposure first. There is no patch to apply, so the finding is which clusters are reachable and from where.", + "Collect Ray dashboard and jobs API access logs, and the submitted job definitions - the definitions hold the payload and are the best evidence available.", + "Scope the AI-specific impact separately from the miner: model weights, training data and pipeline credentials are what an attacker actually gained.", + "Harvest and rotate every cloud credential reachable from the cluster environment, including instance-profile and mounted secret material.", + "Check neighbouring clusters, since ShadowRay 2.0 propagated cluster to cluster rather than only host to host." + ], + "lesson": "Not every AI incident is an AI-native attack. This one is a conventional unauthenticated-RCE intrusion whose impact is AI-specific - models, training data and pipeline credentials - and it anchors the point that responders need to understand the AI stack as infrastructure before reaching for exotic explanations. It also shows what a disputed CVE does to a defender: with no fix coming, the only control is exposure management, and the artifact of record is an access log rather than a patch level.", + "detections": [ + "ray_jobs_api_rce.rules", + "ray_dashboard_exposure.rules", + "shadowray_process_masquerading.yml", + "gpu_unexpected_high_utilization.yml" + ], + "references": [ + { + "title": "Oligo Security - ShadowRay: First Known Attack Campaign Targeting AI Workloads Exploited In The Wild", + "url": "https://www.oligo.security/blog/shadowray-attack-ai-workloads-actively-exploited-in-the-wild" + }, + { + "title": "Oligo Security - ShadowRay 2.0: Active Global Campaign Hijacks Ray AI Infrastructure Into Self-Propagating Botnet", + "url": "https://www.oligo.security/blog/shadowray-2-0-attackers-turn-ai-against-itself-in-global-campaign-that-hijacks-ai-into-self-propagating-botnet" + }, + { + "title": "NVD - CVE-2023-48022", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-48022" + } + ], + "external_ids": { + "attack_campaign": [ + "C0045" + ], + "atlas_case_study": [ + "AML.CS0023" + ], + "cve": [ + "CVE-2023-48022" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0015", + "title": "s1ngularity - A Supply-Chain Payload That Used the Victim's Own AI CLIs", + "date_range": "2025-08-21 (workflow compromised) to 2025-08-26 (malicious versions live about four hours)", + "disclosed": "2025-08-26", + "affects": [ + "AIRT-0001", + "AIRT-0037", + "AIRT-0008" + ], + "confidence": "high", + "basis": "The Nx maintainers' own GitHub security advisory documents the affected versions, the timeline, /tmp/inventory.txt, the s1ngularity-repository exfiltration naming and the shell-profile change. The specific AI CLIs and the flags used to invoke them are not stated in the advisory text retrieved for this entry. They come from independent analyses by Wiz, Snyk and StepSecurity, which agree with one another, so that part of the record is third-party corroborated rather than vendor-documented.", + "atlas": [ + "AML.T0010", + "AML.T0053", + "AML.T0055" + ], + "attack": [ + "T1195.002", + "T1552.001", + "T1059" + ], + "owasp_agentic": [ + "ASI04", + "ASI05", + "ASI02" + ], + "summary": "A command-injection flaw in the Nx repository's pull-request workflow let an attacker obtain the npm publish token and push trojanised versions of the nx build system and several @nx plugins. Their postinstall script checked which AI coding CLIs were installed. It then ran Claude Code, Gemini CLI and Amazon Q with the flag that disables tool approval, and prompted them to search the filesystem for configuration, key and wallet files. The results went to /tmp/inventory.txt and were published, base64-encoded, to a public repository under the victim's own GitHub account. It also appended a shutdown command to the victim's shell profiles. The Nx Console VS Code extension installed the latest nx during version checks, so some victims were infected without ever running an npm install.", + "iocs": [ + { + "type": "package", + "value": "nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0", + "description": "Affected versions per the Nx advisory" + }, + { + "type": "file", + "value": "/tmp/inventory.txt", + "description": "Secret inventory written by the AI CLI run; its presence proves the payload executed" + }, + { + "type": "pattern", + "value": "GitHub repository name containing s1ngularity-repository", + "description": "Exfiltration destination created under the victim's own account - check the GitHub audit log" + }, + { + "type": "config", + "value": "sudo shutdown -h 0 appended to ~/.bashrc and ~/.zshrc", + "description": "Shell profile modification" + }, + { + "type": "behavior", + "value": "claude --dangerously-skip-permissions, gemini --yolo, q --trust-all-tools started by node from an npm lifecycle script", + "description": "The AI CLIs did the reconnaissance; the parent process is the evidence" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Search every developer host and CI runner for /tmp/inventory.txt and for AI CLI processes whose parent was node, npm or the Nx Console extension host during the window." + }, + { + "phase": "contain", + "action": "Search the organisation's GitHub audit log and every member account for repositories named s1ngularity-repository." + }, + { + "phase": "eradicate", + "action": "Remove the added lines from .bashrc and .zshrc, uninstall the affected nx versions and clear the npm, yarn and pnpm caches." + }, + { + "phase": "recover", + "action": "Rotate everything the inventory could have reached: GitHub tokens and the GitHub CLI OAuth grant, npm tokens, SSH keys, cloud keys and every AI provider API key found by the catalog's credential rows." + }, + { + "phase": "harden", + "action": "Treat an installed AI CLI as a capability any local process can borrow. Remove bypass flags from shell aliases and wrappers, and alert when a package manager starts one." + } + ], + "lesson": "The malware shipped no scanner. It borrowed the developer's agent, which already had filesystem access, and passed it the one flag that removes the human from the loop. That makes the agent's own session store part of the crime scene. The prompt and every file the agent opened may sit in its transcript, which is why the catalog's session-log rows for these three tools belong in the collection order here.", + "detections": [ + "ai_cli_permission_bypass_invocation.yml", + "ai_agent_spawning_shell.yml", + "ai_agent_credential_file_access.yml" + ], + "references": [ + { + "title": "Nx - Security advisory GHSA-cxm3-wv7p-598c: malicious versions of Nx and some supporting plugins were published", + "url": "https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c" + }, + { + "title": "Wiz - s1ngularity: supply chain attack leaks secrets on GitHub", + "url": "https://www.wiz.io/blog/s1ngularity-supply-chain-attack" + }, + { + "title": "Snyk - Weaponizing AI Coding Agents for Malware in the Nx Malicious Package Security Incident", + "url": "https://snyk.io/blog/weaponizing-ai-coding-agents-for-malware-in-the-nx-malicious-package/" + }, + { + "title": "StepSecurity - s1ngularity: Popular Nx Build System Package Compromised with Data-Stealing Malware", + "url": "https://www.stepsecurity.io/blog/supply-chain-security-alert-popular-nx-build-system-package-compromised-with-data-stealing-malware" + } + ], + "external_ids": { + "ghsa": [ + "GHSA-cxm3-wv7p-598c" + ] + }, + "affects_ids": [ + "AIRT-0001", + "AIRT-0008", + "AIRT-0037" + ] + }, + { + "id": "AIRT-CS-0016", + "title": "UNC6780 (TeamPCP) - DUSTMAKER and Trojanised MCP Servers", + "date_range": "Mar 2026 (supply-chain activity begins) to 8 Sep 2026 (GTIG report)", + "disclosed": "2026-09-08", + "affects": [ + "AIRT-0001", + "AIRT-0002" + ], + "confidence": "medium", + "basis": "A single reporting party. GTIG attributes the operations to UNC6780, and in May 2026 it also reported that TeamPCP claimed responsibility for supply-chain compromises that included LiteLLM. The package and repository names and the workspace-directory behaviour are GTIG's statements. They have not been corroborated by a second analysis retrieved for this entry.", + "atlas": [ + "AML.T0010", + "AML.T0115.002", + "AML.T0081", + "AML.T0055" + ], + "attack": [ + "T1195.002", + "T1552.001", + "T1070" + ], + "owasp_agentic": [ + "ASI04", + "ASI03" + ], + "actors": [ + { + "ref": "AIRT-TA-0005", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "GTIG", + "stated_confidence": "\"Operations attributed to the financially motivated threat actor UNC6780 (TeamPCP)\"", + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "victims": { + "sectors": [ + "software-supply-chain" + ], + "basis": "GTIG describes compromises of PyPI, npm and Docker Hub packages and of organisational GitHub repositories. Downstream victims are whoever installed them." + }, + "summary": "GTIG reports that UNC6780 compromised developer accounts and published trojanised forks of legitimate MCP servers to PyPI, including tiktoken_mcp. It also injected code into official organisational repositories such as azure-functions-mcp-extension. Its DUSTMAKER credential stealer detects CI/CD environments, extracts OIDC tokens from GitHub Actions and deletes workflow logs. On developer hosts it drops or modifies files in the hidden workspace directories AI coding assistants read, .claude/, .cursor/ and .vscode/. That turns the assistant's own configuration into the persistence and execution point. Earlier in 2026 GTIG tied the same actor to compromises of Trivy, Checkmarx and LiteLLM, the last of which exposed AI provider secrets.", + "iocs": [ + { + "type": "package", + "value": "tiktoken_mcp (PyPI)", + "description": "Trojanised fork of a legitimate MCP server" + }, + { + "type": "pattern", + "value": "Injected code in azure-functions-mcp-extension", + "description": "Official organisational repository compromised through a developer account" + }, + { + "type": "malware", + "value": "DUSTMAKER", + "description": "Credential stealer with CI/CD and AI-workspace targeting" + }, + { + "type": "directory", + "value": "/.claude/, /.cursor/, /.vscode/", + "description": "Files dropped or modified in hidden AI assistant workspace directories" + }, + { + "type": "behavior", + "value": "GitHub Actions workflow run logs deleted after execution", + "description": "Anti-forensics; the absence of runs is the signal" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Inventory MCP servers installed from PyPI and npm across developer hosts and remove any trojanised fork. The catalog's MCP config rows give the files to read." + }, + { + "phase": "contain", + "action": "Diff .claude/, .cursor/ and .vscode/ in every affected repository against the last known-good commit. A file there that no commit explains is the finding." + }, + { + "phase": "eradicate", + "action": "Pin MCP servers and AI gateway libraries to verified versions and rebuild CI images." + }, + { + "phase": "recover", + "action": "Rotate GitHub Actions OIDC trust, cloud credentials reachable from CI, and every AI provider key a compromised gateway library could have read." + }, + { + "phase": "harden", + "action": "Retain workflow run logs outside GitHub so deletion from the API does not remove the record." + } + ], + "lesson": "The AI assistant's workspace directory is now a place attackers write. It is read automatically, trusted implicitly and rarely reviewed in pull requests. Collection has to include it as evidence, not skip it as editor noise.", + "detections": [ + "ai_agent_hook_config_modification.yml", + "ai_agent_mcp_config_modification.yml", + "mcp_tool_poisoning.yar" + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + }, + { + "title": "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + } + ], + "external_ids": { + "vendor_cluster": [ + "UNC6780" + ] + }, + "affects_ids": [ + "AIRT-0001", + "AIRT-0002" + ] + }, + { + "id": "AIRT-CS-0017", + "title": "MIDNIGHT NEPTUNE - Poisoned Repository Config and Claude Code Hooks", + "date_range": "reported 8 Sep 2026; activity window not stated", + "disclosed": "2026-09-08", + "affects": "AIRT-0001", + "confidence": "medium", + "basis": "A single reporting party, and a short account. GTIG reports that the cluster poisoned internal repository configurations, altered Claude CLI hooks and deployed the SOMBERMEME backdoor on developer interaction. No hashes, paths or hook contents were published, and nothing retrieved for this entry corroborates it. It is recorded because the mechanism lands squarely on a catalogued artifact, not because the detail is rich.", + "atlas": [ + "AML.T0081", + "AML.T0011" + ], + "attack": [ + "T1546", + "T1195.002" + ], + "owasp_agentic": [ + "ASI04", + "ASI05" + ], + "actors": [ + { + "ref": "AIRT-TA-0004", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "GTIG", + "stated_confidence": "\"financially motivated North Korea-nexus threat clusters formerly tracked as UNC1069\"", + "reference": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "victims": { + "sectors": [ + "cryptocurrency" + ], + "basis": "GTIG describes the cluster's AI use as supporting cryptocurrency theft." + }, + "summary": "GTIG reports that MIDNIGHT NEPTUNE, the DPRK-nexus financially motivated cluster formerly tracked as UNC1069, poisoned internal repository configurations and altered Claude CLI hooks. It then deployed the SOMBERMEME backdoor once a developer interacted with the repository. A Claude Code hook is a shell command the agent runs on its own lifecycle events, from settings that can live inside the repository. A developer who opened the project with the agent ran the attacker's command without ever executing the attacker's code directly.", + "iocs": [ + { + "type": "malware", + "value": "SOMBERMEME", + "description": "Backdoor delivered on developer interaction" + }, + { + "type": "config", + "value": "Hooks added to or altered in .claude/settings.json or .claude/settings.local.json", + "description": "The persistence and trigger; compare against repository history" + }, + { + "type": "behavior", + "value": "Shell or interpreter child of the Claude Code process at session start, before any user prompt", + "description": "A hook firing looks like this; an agent acting on a prompt does not" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Collect .claude/settings.json and settings.local.json from every clone of the affected repositories and from ~/.claude/, before anyone opens the project again." + }, + { + "phase": "eradicate", + "action": "Remove hooks that no commit by a known developer explains, and hunt for SOMBERMEME on every host where the agent opened the repository." + }, + { + "phase": "recover", + "action": "Rotate credentials that were in reach of a developer shell on those hosts, prioritising wallet keys and exchange API keys given the cluster's motivation." + }, + { + "phase": "harden", + "action": "Review .claude/ in pull requests as executable code, not editor configuration." + } + ], + "lesson": "An agent's hook configuration is an autostart entry that travels with a git clone. The catalog records where it lives. This case is why that row is collected first and diffed against history, not just copied.", + "detections": [ + "ai_agent_hook_config_modification.yml", + "ai_agent_spawning_shell.yml" + ], + "references": [ + { + "title": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ], + "external_ids": { + "vendor_cluster": [ + "MIDNIGHT NEPTUNE", + "UNC1069" + ] + }, + "affects_ids": [ + "AIRT-0001" + ] + }, + { + "id": "AIRT-CS-0018", + "title": "GTG-20006 - Russian State-Nexus Espionage Run Through AI Workflows", + "date_range": "Dec 2025 to Aug 2026", + "disclosed": "2026-09-10", + "affects": "Claude models and Claude Code skills on the actor's side - no catalogued tool on victim hosts", + "confidence": "medium", + "basis": "A single reporting party, the provider whose models were used, with a published indicator set of 55 domains, addresses, file names and hashes. The link to Midnight Blizzard is Anthropic's statement that its attribution is consistent with public reporting. It is not an independent attribution and is recorded as such.", + "contested": "Anthropic ties the cluster to Midnight Blizzard only by consistency with public reporting. Treat the Midnight Blizzard link as an assessment, not an identity.", + "atlas": [ + "AML.T0016.002", + "AML.T0103", + "AML.T0116", + "AML.T0117" + ], + "attack": [ + "T1566", + "T1528" + ], + "actors": [ + { + "ref": "AIRT-TA-0016", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"Our attribution is consistent with public reporting linking the actor to Midnight Blizzard.\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage" + } + ], + "victims": { + "sectors": [ + "government", + "defense-industrial-base", + "ngo-think-tank" + ], + "countries": [ + "UA" + ], + "org_count": { + "value": 20, + "qualifier": "at-least" + }, + "basis": "Anthropic: more than 20 organisations, including government ministries, defence and intelligence bodies, embassies and diplomatic missions, think tanks and defence-industrial companies, with Ukrainian government bodies prominent." + }, + "summary": "Anthropic reports a Russian-speaking operator whose tradecraft and targeting it assesses as consistent with Russian state-nexus espionage. Between December 2025 and August 2026 the operator used Claude models across reconnaissance, device-code phishing infrastructure, bulk collection and keeping access. The human operator mostly edited the Claude Code skills that drove the workflows and let the workflows run. Victim-side artefacts are conventional: Windows implants, phishing domains and device-code phishing infrastructure.", + "iocs": [ + { + "type": "domain", + "value": "ad-g[.]org", + "description": "C2 domain (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "cdncounter[.]net", + "description": "Actor infrastructure domain (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "chamber-ua[.]org", + "description": "Lookalike of a Ukrainian chamber organization (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "chathamhouse[.]eu", + "description": "Lookalike of Chatham House (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "docs-viewer[.]org", + "description": "C2 nginx reverse proxy (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "itechx[.]tel", + "description": "Actor identity domain (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "m365-owa[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "meridian-protocol[.]org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "meridiangroup-corp[.]com", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "metricwave[.]org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "mgsend[.]org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "ms365-device[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "ms365-live[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "my-invite[.]org", + "description": "Actor phishing domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "mygreatmarket[.]com", + "description": "ClickFix cookie-exfil C2 (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "mygreatmarket[.]org", + "description": "ClickFix cookie-exfil C2 (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "owa-ms365[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "projectnightcrawler[.]dev", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "russianearabroad[.]com", + "description": "ClickFix lure (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "russianearabroad[.]org", + "description": "Actor persona domain (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "static-ms[.]live", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "statistic-ms[.]live", + "description": "Primary RAT C2 domain (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "stuseamandesilt[.]org", + "description": "Campaign base domain (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "ukrinform-share[.]net", + "description": "Lookalike of Ukrinform (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "wa-connect[.]eu", + "description": "ClickFix cookie exfil C2 (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "wa-meeting[.]com", + "description": "WhatsApp Web pairing code phishing domain (role phishing, handling detect-or-block)" + }, + { + "type": "email", + "value": "anna.manager@russianearabroad[.]net", + "description": "Phishing persona address (role phishing, handling detect-or-block)" + }, + { + "type": "email", + "value": "events@embassy-protocol[.]int", + "description": "Phishing persona address (role phishing, handling detect-or-block)" + }, + { + "type": "file", + "value": "WUEngine.exe", + "description": "Malware file name. Windows malware (role malware, handling detect-or-block)" + }, + { + "type": "file", + "value": "client_20260507093021_4286d211_x64.exe", + "description": "Malware build artifact (role malware, handling detect-or-block)" + }, + { + "type": "file", + "value": "fix_network.apk", + "description": "Android malware payload (role malware, handling detect-or-block)" + }, + { + "type": "file", + "value": "msedgeupdate_v3.exe", + "description": "Malware implant build (role malware, handling detect-or-block)" + }, + { + "type": "domain", + "value": "api.stuseamandesilt[.]org", + "description": "Campaign C2 (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "cdn.stuseamandesilt[.]org", + "description": "Campaign malware delivery (role malware_delivery, handling detect-or-block)" + }, + { + "type": "domain", + "value": "mslivetest.duckdns[.]org", + "description": "Dynamic-DNS C2 (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "pdfviewer2024.b-cdn[.]net", + "description": "Malware payload domain (role malware_delivery, handling detect-or-block)" + }, + { + "type": "domain", + "value": "static.cdncounter[.]net", + "description": "Exploit/payload delivery hostname (role malware_delivery, handling detect-or-block)" + }, + { + "type": "domain", + "value": "teams.ms365-live[.]com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "update.stuseamandesilt[.]org", + "description": "Campaign subdomain (role malware_delivery, handling detect-or-block)" + }, + { + "type": "ip", + "value": "104.145.210[.]184", + "description": "Embassy Kit device-code phishing VPS (role phishing, handling detect-or-block)" + }, + { + "type": "ip", + "value": "104.194.149[.]228", + "description": "Phishing VPS (role phishing, handling detect-or-block)" + }, + { + "type": "ip", + "value": "104.194.151[.]133", + "description": "Primary C2 VPS (role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "104.194.159[.]55", + "description": "C2 holding exfiltrated browser-data zips (role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "144.172.114[.]192", + "description": "C2 proxy IP / operator VPS (role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "148.135.195[.]111", + "description": "C2 Endpoint (role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "149.54.42[.]106", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "ip", + "value": "185.198.234[.]101", + "description": "C2 server (role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "185.198.234[.]26", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "ip", + "value": "2.26.53[.]194", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "ip", + "value": "213.145.86[.]112", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "ip", + "value": "31.57.243[.]154", + "description": "Phishing host (role phishing, handling detect-or-block)" + }, + { + "type": "ip", + "value": "38.146.28[.]132", + "description": "Actor rogue DNS resolver (role infrastructure, handling detect-or-block)" + }, + { + "type": "ip", + "value": "38.146.28[.]75", + "description": "Notifier C2 for the phishing console (role infrastructure, handling detect-or-block)" + }, + { + "type": "hash", + "value": "918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593", + "description": "Windows Backdoor (role malware, handling detect-or-block)" + }, + { + "type": "hash", + "value": "be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c", + "description": "Malware hash (role malware, handling detect-or-block)" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Block and hunt the published domains and addresses, and search mail logs for the two phishing persona senders." + }, + { + "phase": "contain", + "action": "Hunt for the published implant file names and SHA-256 hashes, including msedgeupdate_v3.exe and WUEngine.exe." + }, + { + "phase": "eradicate", + "action": "Review identity-provider sign-in logs for device-code authentication from unfamiliar clients during the window, and revoke refresh tokens for affected accounts." + }, + { + "phase": "harden", + "action": "Restrict the device-code authentication flow by Conditional Access where it has no business use." + } + ], + "lesson": "The AI sits on the operator's side here; the victim sees ordinary espionage artefacts, just more of them, faster. The case belongs in this catalog because the operator's skill files are what drove it. If an operator's workstation is ever seized, the agent's skills directory and session store are its playbook, which is the reverse of the usual collection problem.", + "detections": [], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-20006 Russian espionage", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage" + } + ], + "external_ids": { + "vendor_cluster": [ + "GTG-20006" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0019", + "title": "GTG-50014 - ShinyHunters Affiliates Vibe-Hacking SaaS Estates", + "date_range": "2026 (activity window not stated)", + "disclosed": "2026-09-10", + "affects": "Claude models on the actor's side - no catalogued tool on victim hosts", + "confidence": "medium", + "basis": "A single reporting party with a published indicator set of 40 addresses, domains and Telegram identifiers. The ShinyHunters link is Anthropic's suspicion of affiliation, not an identification.", + "contested": "Anthropic describes the operators as suspected affiliates of the ShinyHunters collective, not as the group itself.", + "atlas": [ + "AML.T0103", + "AML.T0055", + "AML.T0126" + ], + "attack": [ + "T1552.001", + "T1567" + ], + "actors": [ + { + "ref": "AIRT-TA-0006", + "role": "suspected", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"operators suspected to be affiliates of the ShinyHunters collective\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists" + } + ], + "victims": { + "sectors": [ + "information-technology", + "transportation", + "energy", + "retail", + "telecommunications" + ], + "countries": [ + "FR" + ], + "basis": "Anthropic: a technology provider, an airline, an energy company, around 200 downstream SaaS customers, a French retail chain and a French ISP dataset." + }, + "summary": "Anthropic reports operators suspected to be ShinyHunters affiliates running a vibe-hacking loop. They gave Claude a general goal, such as using a stolen credential or retrieving data, then let it evaluate the environment and write and run scripts until the goal was met. Reported losses include more than 1 TB from one technology provider, tens of millions of passenger records from an airline, and data from around 200 downstream SaaS customers. The operators also ran credential-validation pipelines on EC2 workers, scanned decompiled mobile apps for secrets with TruffleHog, and moved stolen data through Telegram.", + "iocs": [ + { + "type": "account", + "value": "https[:]//t[.]me/Soraki_Bot", + "description": "Criminal storefront account on Telegram (role monetization, handling detect-or-block)" + }, + { + "type": "domain", + "value": "ari-chain[.]com", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "arichain[.]network", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "bitmart-mystery[.]com", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "defi-claim[.]xyz", + "description": "Phishing Domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "emailsecure[.]email", + "description": "Actor email domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "mozilla[.]ws", + "description": "Mozilla brand-impersonation phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "on-pssword[.]com", + "description": "1Password typosquat phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "policenationale[.]cc", + "description": "A domain name impersonating the French national police (though we believe this served as branding for the criminal storefront rather than as a phishing lure) (role monetization, handling detect-or-block)" + }, + { + "type": "domain", + "value": "service-infos[.]info", + "description": "Phishing email domain (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "signin-1psswoord[.]com", + "description": "1Password phishing (role phishing, handling detect-or-block)" + }, + { + "type": "domain", + "value": "soraki[.]cc", + "description": "AutoShop carding storefront (role monetization, handling detect-or-block)" + }, + { + "type": "domain", + "value": "soraki[.]work", + "description": "Actor infrastructure (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "autoshop.policenationale[.]cc", + "description": "Served as the web frontend for the actor's carding autoshop (role monetization, handling detect-or-block)" + }, + { + "type": "domain", + "value": "esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun", + "description": "Callback domain to confirm SSRF and out of band code execution (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev", + "description": "Cloudflare Workers proxy (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "updatebeacon.duckdns[.]org", + "description": "C2 callback domain (role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "104.193.135[.]207", + "description": "Attacker egress IP (seen 2026-04-05 to 2026-04-05; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "104.36.50[.]54", + "description": "Attacker egress IP (seen 2026-04-24 to 2026-04-24; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "162.128.129[.]106", + "description": "Attacker egress IP (seen 2026-02-20 to 2026-03-10; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "176.177.12[.]62", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "185.65.134[.]199", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-28; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "185.65.134[.]246", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-05-04; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "193.32.249[.]161", + "description": "Attacker egress IP (seen 2026-03-21 to 2026-04-18; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "193.32.249[.]164", + "description": "Attacker egress IP (seen 2026-04-18 to 2026-05-06; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "193.32.249[.]170", + "description": "Attacker egress IP (seen 2026-03-20 to 2026-04-06; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "195.178.110[.]131", + "description": "VPS Host (seen 2026-03-12 to 2026-04-30; role infrastructure, handling hunt)" + }, + { + "type": "ip", + "value": "45.148.10[.]242", + "description": "Attacker egress IP (seen 2026-04-06 to 2026-04-27; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "91.171.138[.]169", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-21; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "92.118.39[.]3", + "description": "Attacker egress IP (seen 2026-04-10 to 2026-04-19; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53", + "description": "Attacker egress IP (seen 2026-04-20 to 2026-04-21; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "2a04:cec0:1185:34f2:a150:7081:caed[:]448e", + "description": "Attacker egress IP (seen 2026-04-06 to 2026-04-07; role egress, handling hunt)" + }, + { + "type": "account", + "value": "8628746407", + "description": "Telegram bot delivering AWS SES credential-validation results directly to the operator's user account (telegram bot id; role infrastructure, handling detect-or-block)" + }, + { + "type": "account", + "value": "8632748474", + "description": "Telegram bot that posted stolen data. (telegram bot id; role exfiltration, handling detect-or-block)" + }, + { + "type": "account", + "value": "8664033117", + "description": "Telegram bot that posted stolen data. (telegram bot id; role exfiltration, handling detect-or-block)" + }, + { + "type": "account", + "value": "8709258476", + "description": "Telegram bot delivering AWS SNS SMS-abuse test results directly to the operator's user account (telegram bot id; role infrastructure, handling detect-or-block)" + }, + { + "type": "account", + "value": "-1003311614569", + "description": "Telegram group 'ChatMignon' that received stolen data. (telegram chat id; role exfiltration, handling detect-or-block)" + }, + { + "type": "account", + "value": "-1003893854338", + "description": "Telegram group 'ClintonHog' that received stolen data. (telegram chat id; role exfiltration, handling detect-or-block)" + }, + { + "type": "account", + "value": "8179098353", + "description": "Operator's Telegram account (telegram user id; role infrastructure, handling detect-or-block)" + }, + { + "type": "url", + "value": "https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/", + "description": "Exfiltration URL (role exfiltration, handling detect-or-block)" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Block and hunt the published addresses and domains, and alert on outbound traffic to the listed exfiltration storage URL." + }, + { + "phase": "contain", + "action": "Inventory keys embedded in shipped mobile apps and any AWS SES or SNS credentials, which the actor validated at scale and abused." + }, + { + "phase": "recover", + "action": "Rotate SaaS integration tokens and cloud keys reachable from compromised tenants, and notify downstream customers whose data transited them." + } + ], + "lesson": "The operator supplied goals and the model supplied the hands-on-keyboard work. The evidence that a tenant was worked this way is an unusually fast, unusually broad burst of API calls and ad-hoc scripts from one credential, not any single call.", + "detections": [], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50014 ShinyHunters smash-and-grab opportunists", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists" + } + ], + "external_ids": { + "vendor_cluster": [ + "GTG-50014" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0020", + "title": "GTG-50020 - From Hotel Booking Fraud to Probing AI Companies", + "date_range": "May to Jun 2026 (AI supply-chain phase)", + "disclosed": "2026-09-10", + "affects": "AI provider and AI company web estates - no catalogued endpoint tool", + "confidence": "medium", + "basis": "A single reporting party with eight published egress addresses.", + "atlas": [ + "AML.T0124", + "AML.T0017.001", + "AML.T0049" + ], + "attack": [ + "T1190" + ], + "actors": [ + { + "ref": "AIRT-TA-0017", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"Russian-speaking, financially-motivated actor\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain" + } + ], + "victims": { + "sectors": [ + "commercial-facilities", + "information-technology" + ], + "basis": "Anthropic: hotel booking platforms, then around 30 AI companies in about four days." + }, + "summary": "Anthropic reports a Russian-speaking, financially motivated actor with a history of intrusions against hotel booking and fintech platforms. It built a containerised pentest platform with a local model gateway and worker agents that tested injection, XSS, authentication bypass and SSRF. It then turned the pipeline on around 30 AI companies in about four days, with the stated goal of reaching a pre-release model.", + "iocs": [ + { + "type": "ip", + "value": "141.133.125[.]208", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-05-23; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "146.103.101[.]253", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-13; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "146.103.97[.]169", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-05-25; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "167.250.111[.]136", + "description": "Attacker egress IP (seen 2026-05-23 to 2026-06-03; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "178.16.54[.]141", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-16; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "194.163.183[.]216", + "description": "Attacker egress IP (seen 2026-05-23 to 2026-05-24; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "202.66.167[.]230", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-04; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "37.27.103[.]22", + "description": "Attacker egress IP (seen 2026-05-26 to 2026-06-13; role egress, handling hunt)" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Hunt the published egress addresses in web and WAF logs for the May to June 2026 window." + }, + { + "phase": "harden", + "action": "Treat model-gateway and evaluation endpoints as internet-exposed attack surface, with the same testing and rate limits as the product itself." + } + ], + "lesson": "AI companies are now a target class in their own right. What is being stolen is model access and pre-release weights, which a victimology built only on data theft would miss.", + "detections": [], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50020 From hotel bookings to the AI supply chain", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain" + } + ], + "external_ids": { + "vendor_cluster": [ + "GTG-50020" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0021", + "title": "GTG-50029 - A Single Hacktivist Against European Political Targets", + "date_range": "Spring 2026", + "disclosed": "2026-09-10", + "affects": "WordPress and SaaS estates of the targets - no catalogued endpoint tool", + "confidence": "medium", + "basis": "A single reporting party with a published indicator set of 22 addresses, domains and onion services.", + "atlas": [ + "AML.T0016.002", + "AML.T0049", + "AML.T0055" + ], + "attack": [ + "T1190", + "T1505.003" + ], + "actors": [ + { + "ref": "AIRT-TA-0018", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"single French-speaking actor\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities" + } + ], + "victims": { + "sectors": [ + "government", + "media-entertainment", + "ngo-think-tank", + "information-technology" + ], + "org_count": { + "value": 42, + "qualifier": "exact" + }, + "basis": "Anthropic: 42 tracked targets among European political parties, media, think tanks and SaaS providers, with internal access to at least 14." + }, + "summary": "Anthropic reports a single French-speaking actor who used Claude to develop and debug a WordPress re-installation race exploit, build a Rust scanner that validated exposed API keys, and manage agents for reconnaissance and post-authentication work. Anthropic counts 42 targets, internal access to at least 14, and 12 to 26 GB exfiltrated. The haul included political membership and donor records. Reported persistence included web shells hidden in font assets and credential-harvesting WordPress must-use plugins.", + "iocs": [ + { + "type": "domain", + "value": "fafwatch[.]xyz", + "description": "Actor-registered doxing adjacent domain (seen 2026-04 to ?; role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "prod-artfkt[.]com", + "description": "Actor-registered operational domain (seen 2026-04 to ?; role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "frntrs-analytics-863060591218.europe-west1.run[.]app", + "description": "Cloud Run origin behind C2 domain (seen 2026-05-13 to 2026-06; role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "frntrs-analytics.dedyn[.]io", + "description": "BeEF browser-C2 hostname (deSEC dynamic DNS, actor-held API token) (seen 2026-05-13 to 2026-06; role c2, handling detect-or-block)" + }, + { + "type": "ip", + "value": "103.124.165[.]199", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "103.141.60[.]144", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "103.216.220[.]19", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "136.144.242[.]56", + "description": "Staging & scan box used on EU political organizations (seen 2026-05-17 to 2026-05-21; role staging, handling detect-or-block)" + }, + { + "type": "ip", + "value": "138.199.6[.]208", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "138.199.60[.]29", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "139.59.2[.]243", + "description": "Key-validation box (DigitalOcean) (seen 2026-02-06 to 2026-06-12; role key_validation, handling detect-or-block)" + }, + { + "type": "ip", + "value": "146.70.116[.]131", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "149.22.83[.]6", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "158.173.46[.]118", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "163.172.157[.]53", + "description": "Persistent dedicated server, Scaleway FR used in late-phase operations (seen 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block)" + }, + { + "type": "ip", + "value": "34.156.199[.]132", + "description": "Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role exfiltration, handling hunt)" + }, + { + "type": "ip", + "value": "34.156.95[.]176", + "description": "Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role exfiltration, handling hunt)" + }, + { + "type": "ip", + "value": "2001:ac8:27[:]89::a02d", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "2001:ac8:29[:]84::a01d", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)" + }, + { + "type": "ip", + "value": "2001:bc8:711:5854:dc00:1ff:fe18[:]ba53", + "description": "Persistent dedicated server, Scaleway FR used in late-phase operations (seen 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block)" + }, + { + "type": "domain", + "value": "3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion", + "description": "CRS credential-vault API (Tor onion service; seen 2026-05 to 2026-07; role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion", + "description": "Actor's Tor LLM-gateway (third-party model routing) (Tor onion service; seen 2026-06 to 2026-06; role infrastructure, handling detect-or-block)" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Hunt the published addresses and onion services, and inspect wp-content/mu-plugins and font asset directories on WordPress estates for unexpected PHP." + }, + { + "phase": "eradicate", + "action": "Restore from backups verified clean. The actor poisoned backups, so check backup integrity before relying on one." + }, + { + "phase": "recover", + "action": "Rotate every API key found in public repositories or containers the actor's scanner could have validated." + } + ], + "lesson": "One operator with a model ran a campaign that used to need a team. The persistence was ordinary, but its placement (fonts, must-use plugins, backups) was chosen to survive a routine clean-up.", + "detections": [], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50029 Hacktivists targeted European political and affiliated entities", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities" + } + ], + "external_ids": { + "vendor_cluster": [ + "GTG-50029" + ] + }, + "affects_ids": [] + }, + { + "id": "AIRT-CS-0022", + "title": "GTG-50021 - A Fraudulent AI Reseller Harvesting Customers' Credentials", + "date_range": "2026 (activity window not stated)", + "disclosed": "2026-09-10", + "affects": [ + "AIRT-0001", + "AIRT-0041" + ], + "confidence": "medium", + "basis": "A single reporting party with six published domains.", + "atlas": [ + "AML.T0034", + "AML.T0055" + ], + "attack": [ + "T1557" + ], + "owasp_agentic": [ + "ASI03" + ], + "actors": [ + { + "ref": "AIRT-TA-0019", + "role": "operator", + "link_confidence": "medium", + "attributed_by": "Anthropic", + "stated_confidence": "\"Russian and Ukrainian speaking group\"", + "reference": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise" + } + ], + "victims": { + "sectors": [ + "consumers", + "information-technology" + ], + "basis": "Anthropic: customers seeking discounted Claude access, and downstream AI proxy resellers." + }, + "summary": "Anthropic reports a Russian- and Ukrainian-speaking group selling cheap Claude access that silently proxied some traffic to a different model and harvested the credentials customers supplied. The published domains include kiro[.]cheap and an AWS lookalike, aws-us-east-3[.]com. On a victim host, the evidence is an agent whose API base URL points at a reseller rather than the provider, which is the misconfiguration the catalog's endpoint-redirection rule looks for.", + "iocs": [ + { + "type": "domain", + "value": "aws-us-east-3[.]com", + "description": "AWS lookalike domain (role infrastructure, handling detect-or-block)" + }, + { + "type": "domain", + "value": "awstore[.]cloud", + "description": "Fake Claude API reseller storefront (role monetization, handling detect-or-block)" + }, + { + "type": "domain", + "value": "holdboost[.]store", + "description": "Malware platform domain (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "kiro[.]cheap", + "description": "Fake Kiro API reseller storefront (role monetization, handling detect-or-block)" + }, + { + "type": "domain", + "value": "sys-tools[.]cfd", + "description": "Malware C2 (role c2, handling detect-or-block)" + }, + { + "type": "domain", + "value": "iymkjuzymkapovrntoxy.supabase[.]co", + "description": "Malware Supabase backend (role c2, handling detect-or-block)" + } + ], + "response_actions": [ + { + "phase": "contain", + "action": "Search agent configurations and environment variables for API base URLs pointing at the published domains, and block them." + }, + { + "phase": "recover", + "action": "Rotate any provider API key or OAuth credential that was ever entered into a reseller." + }, + { + "phase": "harden", + "action": "Alert when a coding agent's inference endpoint is changed away from the vendor default." + } + ], + "lesson": "A cheap-access reseller is a man in the middle by construction. It sees every prompt, every file the agent sends, and the credential itself.", + "detections": [ + "ai_inference_endpoint_redirection.yml" + ], + "references": [ + { + "title": "Anthropic - Threat Intelligence Report, September 2026: GTG-50021", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise" + } + ], + "external_ids": { + "vendor_cluster": [ + "GTG-50021" + ] + }, + "affects_ids": [ + "AIRT-0001", + "AIRT-0041" + ] + } + ], + "graph": { + "nodes": [ + { + "id": "actor:AIRT-TA-0001", + "type": "actor", + "label": "APT28", + "actor_id": "AIRT-TA-0001", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0002", + "type": "actor", + "label": "GTG-1002", + "actor_id": "AIRT-TA-0002", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0003", + "type": "actor", + "label": "GTG-2002", + "actor_id": "AIRT-TA-0003", + "actor_kind": "criminal" + }, + { + "id": "actor:AIRT-TA-0004", + "type": "actor", + "label": "MIDNIGHT NEPTUNE", + "actor_id": "AIRT-TA-0004", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0005", + "type": "actor", + "label": "UNC6780", + "actor_id": "AIRT-TA-0005", + "actor_kind": "criminal" + }, + { + "id": "actor:AIRT-TA-0006", + "type": "actor", + "label": "ShinyHunters", + "actor_id": "AIRT-TA-0006", + "actor_kind": "criminal" + }, + { + "id": "actor:AIRT-TA-0007", + "type": "actor", + "label": "APT42", + "actor_id": "AIRT-TA-0007", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0008", + "type": "actor", + "label": "APT41", + "actor_id": "AIRT-TA-0008", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0009", + "type": "actor", + "label": "Sandworm", + "actor_id": "AIRT-TA-0009", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0010", + "type": "actor", + "label": "APT31", + "actor_id": "AIRT-TA-0010", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0011", + "type": "actor", + "label": "MuddyWater", + "actor_id": "AIRT-TA-0011", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0012", + "type": "actor", + "label": "UNC4899", + "actor_id": "AIRT-TA-0012", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0013", + "type": "actor", + "label": "Kimsuky", + "actor_id": "AIRT-TA-0013", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0014", + "type": "actor", + "label": "UNC5673", + "actor_id": "AIRT-TA-0014", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0015", + "type": "actor", + "label": "UNC6508", + "actor_id": "AIRT-TA-0015", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0016", + "type": "actor", + "label": "GTG-20006", + "actor_id": "AIRT-TA-0016", + "actor_kind": "state-nexus" + }, + { + "id": "actor:AIRT-TA-0017", + "type": "actor", + "label": "GTG-50020", + "actor_id": "AIRT-TA-0017", + "actor_kind": "criminal" + }, + { + "id": "actor:AIRT-TA-0018", + "type": "actor", + "label": "GTG-50029", + "actor_id": "AIRT-TA-0018", + "actor_kind": "unattributed-cluster" + }, + { + "id": "actor:AIRT-TA-0019", + "type": "actor", + "label": "GTG-50021", + "actor_id": "AIRT-TA-0019", + "actor_kind": "criminal" + }, + { + "id": "actor:AIRT-TA-0020", + "type": "actor", + "label": "GTG-10007", + "actor_id": "AIRT-TA-0020", + "actor_kind": "unattributed-cluster" + }, + { + "id": "artifact:AIRT-0001/credential/anthropic-api-key", + "type": "artifact", + "label": "ANTHROPIC_API_KEY", + "anchor": "AIRT-0001/credential/anthropic-api-key", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/anthropic-auth-token", + "type": "artifact", + "label": "ANTHROPIC_AUTH_TOKEN", + "anchor": "AIRT-0001/credential/anthropic-auth-token", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/claude-code-oauth-token", + "type": "artifact", + "label": "CLAUDE_CODE_OAUTH_TOKEN", + "anchor": "AIRT-0001/credential/claude-code-oauth-token", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/claude-config-dir-credentials-json", + "type": "artifact", + "label": "$CLAUDE_CONFIG_DIR/.credentials.json", + "anchor": "AIRT-0001/credential/claude-config-dir-credentials-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/claude-credentials-json", + "type": "artifact", + "label": "~/.claude/.credentials.json", + "anchor": "AIRT-0001/credential/claude-credentials-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/claude-json", + "type": "artifact", + "label": "~/.claude.json", + "anchor": "AIRT-0001/credential/claude-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/config-anthropic-configs", + "type": "artifact", + "label": "~/.config/anthropic/configs/", + "anchor": "AIRT-0001/credential/config-anthropic-configs", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "type": "artifact", + "label": "macOS login Keychain (~/Library/Keychains/login.keychain-db)", + "anchor": "AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "type": "artifact", + "label": "macOS login Keychain (MCP remote-server OAuth credentials)", + "anchor": "AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/credential/project-mcp-json", + "type": "artifact", + "label": "/.mcp.json", + "anchor": "AIRT-0001/credential/project-mcp-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/appdata-npm-claude-cmd", + "type": "artifact", + "label": "%APPDATA%\\npm\\claude.cmd", + "anchor": "AIRT-0001/disk/appdata-npm-claude-cmd", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "type": "artifact", + "label": "%APPDATA%\\npm\\node_modules\\@anthropic-ai\\claude-code\\", + "anchor": "AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/claude", + "type": "artifact", + "label": "~/.claude/", + "anchor": "AIRT-0001/disk/claude", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/claude-json", + "type": "artifact", + "label": "~/.claude.json", + "anchor": "AIRT-0001/disk/claude-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/local-bin-claude", + "type": "artifact", + "label": "~/.local/bin/claude", + "anchor": "AIRT-0001/disk/local-bin-claude", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/repo-claude-md", + "type": "artifact", + "label": "/CLAUDE.md", + "anchor": "AIRT-0001/disk/repo-claude-md", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/repo-claude-settings-json", + "type": "artifact", + "label": "/.claude/settings.json", + "anchor": "AIRT-0001/disk/repo-claude-settings-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/repo-mcp-json", + "type": "artifact", + "label": "/.mcp.json", + "anchor": "AIRT-0001/disk/repo-mcp-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/disk/usr-local-bin-claude", + "type": "artifact", + "label": "/usr/local/bin/claude", + "anchor": "AIRT-0001/disk/usr-local-bin-claude", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "type": "artifact", + "label": "~/.claude.json → mcpServers (user scope)", + "anchor": "AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "type": "artifact", + "label": "/.claude/settings.local.json → enabledMcpjsonServers", + "anchor": "AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "type": "artifact", + "label": "/.mcp.json → mcpServers (project scope)", + "anchor": "AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/network/api-anthropic-com-443-tcp", + "type": "artifact", + "label": "api.anthropic.com :443/TCP", + "anchor": "AIRT-0001/network/api-anthropic-com-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "type": "artifact", + "label": "claude.ai (installer), statsig.anthropic.com (telemetry) :443/TCP", + "anchor": "AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0001/process/claude-node", + "type": "artifact", + "label": "claude / node", + "anchor": "AIRT-0001/process/claude-node", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0001/process/node-exe-claude", + "type": "artifact", + "label": "node.exe (claude)", + "anchor": "AIRT-0001/process/node-exe-claude", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "type": "artifact", + "label": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, ANTHROPIC_BASE_URL, OPENAI", + "anchor": "AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "type": "artifact", + "label": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\* → DisplayName contain", + "anchor": "AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "type": "artifact", + "label": "HKLM\\SOFTWARE\\Microsoft\\Cryptography → MachineGuid", + "anchor": "AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/appdata-cursor-user-globalstorage-state-vscdb", + "type": "artifact", + "label": "%APPDATA%\\Cursor\\User\\globalStorage\\state.vscdb", + "anchor": "AIRT-0002/credential/appdata-cursor-user-globalstorage-state-vscdb", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/config-cursor-auth-json", + "type": "artifact", + "label": "~/.config/cursor/auth.json", + "anchor": "AIRT-0002/credential/config-cursor-auth-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/config-cursor-user-globalstorage-state-vscdb", + "type": "artifact", + "label": "~/.config/Cursor/User/globalStorage/state.vscdb", + "anchor": "AIRT-0002/credential/config-cursor-user-globalstorage-state-vscdb", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/cursor-mcp-json", + "type": "artifact", + "label": "~/.cursor/mcp.json", + "anchor": "AIRT-0002/credential/cursor-mcp-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/library-application-support-cursor-user-globalstorage-st", + "type": "artifact", + "label": "~/Library/Application Support/Cursor/User/globalStorage/state.vscdb", + "anchor": "AIRT-0002/credential/library-application-support-cursor-user-globalstorage-st", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/macos-login-keychain-generic-password-service-cursor-saf", + "type": "artifact", + "label": "macOS login Keychain: generic-password service 'Cursor Safe Storage', account 'C", + "anchor": "AIRT-0002/credential/macos-login-keychain-generic-password-service-cursor-saf", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/macos-login-keychain-generic-password-services-cursor-ac", + "type": "artifact", + "label": "macOS login Keychain: generic-password services cursor-access-token / cursor-ref", + "anchor": "AIRT-0002/credential/macos-login-keychain-generic-password-services-cursor-ac", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/credential/repo-cursor-mcp-json", + "type": "artifact", + "label": "/.cursor/mcp.json", + "anchor": "AIRT-0002/credential/repo-cursor-mcp-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/appdata-cursor-user", + "type": "artifact", + "label": "%APPDATA%\\Cursor\\User\\", + "anchor": "AIRT-0002/disk/appdata-cursor-user", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/appdata-cursor-user-skills", + "type": "artifact", + "label": "%APPDATA%\\Cursor\\User\\skills\\", + "anchor": "AIRT-0002/disk/appdata-cursor-user-skills", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/config-cursor-user", + "type": "artifact", + "label": "~/.config/Cursor/User/", + "anchor": "AIRT-0002/disk/config-cursor-user", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/cursor-mcp-json", + "type": "artifact", + "label": "~/.cursor/mcp.json", + "anchor": "AIRT-0002/disk/cursor-mcp-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/library-application-support-cursor-user", + "type": "artifact", + "label": "~/Library/Application Support/Cursor/User/", + "anchor": "AIRT-0002/disk/library-application-support-cursor-user", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/localappdata-cursor-updater", + "type": "artifact", + "label": "%LOCALAPPDATA%\\cursor-updater\\", + "anchor": "AIRT-0002/disk/localappdata-cursor-updater", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/localappdata-programs-cursor", + "type": "artifact", + "label": "%LOCALAPPDATA%\\Programs\\cursor\\", + "anchor": "AIRT-0002/disk/localappdata-programs-cursor", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/localappdata-programs-cursor-cursor-exe", + "type": "artifact", + "label": "%LOCALAPPDATA%\\Programs\\cursor\\_\\Cursor.exe", + "anchor": "AIRT-0002/disk/localappdata-programs-cursor-cursor-exe", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/localappdata-programs-cursor-resources-app-bin-cursor", + "type": "artifact", + "label": "%LOCALAPPDATA%\\Programs\\cursor\\_\\resources\\app\\bin\\cursor", + "anchor": "AIRT-0002/disk/localappdata-programs-cursor-resources-app-bin-cursor", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/repo-cursor-mcp-json", + "type": "artifact", + "label": "/.cursor/mcp.json", + "anchor": "AIRT-0002/disk/repo-cursor-mcp-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/disk/repo-cursorrules-repo-cursor-rules-mdc", + "type": "artifact", + "label": "/.cursorrules | /.cursor/rules/*.mdc", + "anchor": "AIRT-0002/disk/repo-cursorrules-repo-cursor-rules-mdc", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0002/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0002/mcp-config/cursor-mcp-json-mcpservers", + "type": "artifact", + "label": "~/.cursor/mcp.json → mcpServers", + "anchor": "AIRT-0002/mcp-config/cursor-mcp-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/mcp-config/repo-cursor-mcp-json-mcpservers", + "type": "artifact", + "label": "/.cursor/mcp.json → mcpServers", + "anchor": "AIRT-0002/mcp-config/repo-cursor-mcp-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/network/cursor-sh-api2-cursor-sh-anysphere-co-443-tcp", + "type": "artifact", + "label": "*.cursor.sh, api2.cursor.sh, *.anysphere.co :443/TCP", + "anchor": "AIRT-0002/network/cursor-sh-api2-cursor-sh-anysphere-co-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0002/process/cursor-exe", + "type": "artifact", + "label": "Cursor.exe", + "anchor": "AIRT-0002/process/cursor-exe", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0002/registry/hkcu-software-classes-cursor-shell-open-command-default", + "type": "artifact", + "label": "HKCU\\Software\\Classes\\cursor\\shell\\open\\command → (Default)", + "anchor": "AIRT-0002/registry/hkcu-software-classes-cursor-shell-open-command-default", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-run-curso", + "type": "artifact", + "label": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run → Cursor", + "anchor": "AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-run-curso", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "type": "artifact", + "label": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\ → Install", + "anchor": "AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/appdata-windsurf-user-globalstorage-state-vscdb", + "type": "artifact", + "label": "%APPDATA%\\Windsurf\\User\\globalStorage\\state.vscdb", + "anchor": "AIRT-0006/credential/appdata-windsurf-user-globalstorage-state-vscdb", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/codeium-config-json", + "type": "artifact", + "label": "~/.codeium/config.json", + "anchor": "AIRT-0006/credential/codeium-config-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/codeium-windsurf-mcp-config-json", + "type": "artifact", + "label": "~/.codeium/windsurf/mcp_config.json", + "anchor": "AIRT-0006/credential/codeium-windsurf-mcp-config-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/config-windsurf-user-globalstorage-state-vscdb", + "type": "artifact", + "label": "~/.config/Windsurf/User/globalStorage/state.vscdb", + "anchor": "AIRT-0006/credential/config-windsurf-user-globalstorage-state-vscdb", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/library-application-support-windsurf-user-globalstorage-", + "type": "artifact", + "label": "~/Library/Application Support/Windsurf/User/globalStorage/state.vscdb", + "anchor": "AIRT-0006/credential/library-application-support-windsurf-user-globalstorage-", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/nvim-stdpath-cache-codeium-config-json", + "type": "artifact", + "label": "/codeium/config.json", + "anchor": "AIRT-0006/credential/nvim-stdpath-cache-codeium-config-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/credential/userprofile-codeium-windsurf-mcp-config-json", + "type": "artifact", + "label": "%USERPROFILE%\\.codeium\\windsurf\\mcp_config.json", + "anchor": "AIRT-0006/credential/userprofile-codeium-windsurf-mcp-config-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/disk/codeium", + "type": "artifact", + "label": "~/.codeium/", + "anchor": "AIRT-0006/disk/codeium", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/disk/codeium-version-language-server", + "type": "artifact", + "label": "~/.codeium//language_server_*", + "anchor": "AIRT-0006/disk/codeium-version-language-server", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/disk/codeium-windsurf-mcp-config-json", + "type": "artifact", + "label": "~/.codeium/windsurf/mcp_config.json", + "anchor": "AIRT-0006/disk/codeium-windsurf-mcp-config-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/disk/repo-windsurf-settings-json", + "type": "artifact", + "label": "/.windsurf/settings.json", + "anchor": "AIRT-0006/disk/repo-windsurf-settings-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/disk/repo-windsurfrules", + "type": "artifact", + "label": "/.windsurfrules", + "anchor": "AIRT-0006/disk/repo-windsurfrules", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/disk/userprofile-codeium-windsurf-mcp-config-json", + "type": "artifact", + "label": "%USERPROFILE%\\.codeium\\windsurf\\mcp_config.json", + "anchor": "AIRT-0006/disk/userprofile-codeium-windsurf-mcp-config-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0006/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0006/mcp-config/codeium-mcp-config-json-mcpservers", + "type": "artifact", + "label": "~/.codeium/mcp_config.json → mcpServers", + "anchor": "AIRT-0006/mcp-config/codeium-mcp-config-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/mcp-config/codeium-windsurf-mcp-config-json-mcpservers", + "type": "artifact", + "label": "~/.codeium/windsurf/mcp_config.json → mcpServers", + "anchor": "AIRT-0006/mcp-config/codeium-windsurf-mcp-config-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0006/network/server-codeium-com-codeium-com-windsurf-com-443-tcp", + "type": "artifact", + "label": "server.codeium.com, *.codeium.com, *.windsurf.com :443/TCP", + "anchor": "AIRT-0006/network/server-codeium-com-codeium-com-windsurf-com-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0006/process/windsurf-exe-language-server-windows-x64-exe", + "type": "artifact", + "label": "Windsurf.exe, language_server_windows_x64.exe", + "anchor": "AIRT-0006/process/windsurf-exe-language-server-windows-x64-exe", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0008/credential/aws-sso-cache-json", + "type": "artifact", + "label": "~/.aws/sso/cache/*.json", + "anchor": "AIRT-0008/credential/aws-sso-cache-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/aws-amazonq-cli-agents-json", + "type": "artifact", + "label": "~/.aws/amazonq/cli-agents/*.json", + "anchor": "AIRT-0008/disk/aws-amazonq-cli-agents-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/local-share-amazon-q-data-sqlite3", + "type": "artifact", + "label": "~/.local/share/amazon-q/data.sqlite3", + "anchor": "AIRT-0008/disk/local-share-amazon-q-data-sqlite3", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/local-share-amazon-q-settings-json", + "type": "artifact", + "label": "~/.local/share/amazon-q/settings.json", + "anchor": "AIRT-0008/disk/local-share-amazon-q-settings-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-iam-bin", + "type": "artifact", + "label": "node .../language-server/build/aws-lsp-codewhisperer-iam-binary.js --stdio", + "anchor": "AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-iam-bin", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-token-b", + "type": "artifact", + "label": "node .../language-server/build/aws-lsp-codewhisperer-token-binary.js --stdio", + "anchor": "AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-token-b", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/repo-amazonq-cli-agents-json", + "type": "artifact", + "label": "/.amazonq/cli-agents/*.json", + "anchor": "AIRT-0008/disk/repo-amazonq-cli-agents-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/repo-amazonq-rules-md", + "type": "artifact", + "label": "/.amazonq/rules/*.md", + "anchor": "AIRT-0008/disk/repo-amazonq-rules-md", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/userprofile-vscode-extensions-amazonwebservices-amazon-q", + "type": "artifact", + "label": "%USERPROFILE%\\.vscode\\extensions\\amazonwebservices.amazon-q-vscode-*", + "anchor": "AIRT-0008/disk/userprofile-vscode-extensions-amazonwebservices-amazon-q", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/disk/xdg-runtime-dir-qlog-cli-log", + "type": "artifact", + "label": "$XDG_RUNTIME_DIR/qlog/cli.log", + "anchor": "AIRT-0008/disk/xdg-runtime-dir-qlog-cli-log", + "cls": "disk", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0008/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0008/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0008/mcp-config/aws-amazonq-default-json-agent-configuration-global-scop", + "type": "artifact", + "label": "~/.aws/amazonq/default.json → Agent configuration, global scope in the IDE", + "anchor": "AIRT-0008/mcp-config/aws-amazonq-default-json-agent-configuration-global-scop", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/mcp-config/aws-amazonq-mcp-json-mcpservers", + "type": "artifact", + "label": "~/.aws/amazonq/mcp.json → mcpServers", + "anchor": "AIRT-0008/mcp-config/aws-amazonq-mcp-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/mcp-config/repo-amazonq-default-json-mcpservers", + "type": "artifact", + "label": "/.amazonq/default.json → mcpServers", + "anchor": "AIRT-0008/mcp-config/repo-amazonq-default-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/mcp-config/repo-amazonq-mcp-json-mcpservers", + "type": "artifact", + "label": "/.amazonq/mcp.json → mcpServers", + "anchor": "AIRT-0008/mcp-config/repo-amazonq-mcp-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0008/network/q-us-east-1-amazonaws-com-codewhisperer-amazonaws-com-aw", + "type": "artifact", + "label": "q.us-east-1.amazonaws.com, codewhisperer.*.amazonaws.com, *.awsapps.com/start :4", + "anchor": "AIRT-0008/network/q-us-east-1-amazonaws-com-codewhisperer-amazonaws-com-aw", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0008/process/node-aws-lsp-codewhisperer-token-binary-js", + "type": "artifact", + "label": "node (aws-lsp-codewhisperer-token-binary.js)", + "anchor": "AIRT-0008/process/node-aws-lsp-codewhisperer-token-binary-js", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0011/credential/appdata-claude", + "type": "artifact", + "label": "%APPDATA%\\Claude\\", + "anchor": "AIRT-0011/credential/appdata-claude", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/credential/claude-desktop-config-json-mcpservers-name-env", + "type": "artifact", + "label": "claude_desktop_config.json -> mcpServers..env", + "anchor": "AIRT-0011/credential/claude-desktop-config-json-mcpservers-name-env", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/credential/config-claude", + "type": "artifact", + "label": "~/.config/Claude/", + "anchor": "AIRT-0011/credential/config-claude", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/credential/library-application-support-claude", + "type": "artifact", + "label": "~/Library/Application Support/Claude/", + "anchor": "AIRT-0011/credential/library-application-support-claude", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/appdata-claude-claude-desktop-config-json", + "type": "artifact", + "label": "%APPDATA%\\Claude\\claude_desktop_config.json", + "anchor": "AIRT-0011/disk/appdata-claude-claude-desktop-config-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/appdata-claude-logs-mcp-log", + "type": "artifact", + "label": "%APPDATA%\\Claude\\logs\\mcp*.log", + "anchor": "AIRT-0011/disk/appdata-claude-logs-mcp-log", + "cls": "disk", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0011/disk/applications-claude-app", + "type": "artifact", + "label": "/Applications/Claude.app", + "anchor": "AIRT-0011/disk/applications-claude-app", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/applications-claude-app-2", + "type": "artifact", + "label": "~/Applications/Claude.app", + "anchor": "AIRT-0011/disk/applications-claude-app-2", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/config-claude", + "type": "artifact", + "label": "~/.config/Claude/", + "anchor": "AIRT-0011/disk/config-claude", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/config-claude-ant-did", + "type": "artifact", + "label": "~/.config/Claude/ant-did", + "anchor": "AIRT-0011/disk/config-claude-ant-did", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/config-claude-claude-desktop-config-json", + "type": "artifact", + "label": "~/.config/Claude/claude_desktop_config.json", + "anchor": "AIRT-0011/disk/config-claude-claude-desktop-config-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/config-claude-config-json", + "type": "artifact", + "label": "~/.config/Claude/config.json", + "anchor": "AIRT-0011/disk/config-claude-config-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/config-claude-logs-mcp-log", + "type": "artifact", + "label": "~/.config/Claude/logs/mcp*.log", + "anchor": "AIRT-0011/disk/config-claude-logs-mcp-log", + "cls": "disk", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0011/disk/library-application-support-claude-claude-desktop-config", + "type": "artifact", + "label": "~/Library/Application Support/Claude/claude_desktop_config.json", + "anchor": "AIRT-0011/disk/library-application-support-claude-claude-desktop-config", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/library-logs-claude-mcp-log", + "type": "artifact", + "label": "~/Library/Logs/Claude/mcp*.log", + "anchor": "AIRT-0011/disk/library-logs-claude-mcp-log", + "cls": "disk", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0011/disk/library-preferences-com-anthropic-claudefordesktop-plist", + "type": "artifact", + "label": "~/Library/Preferences/com.anthropic.claudefordesktop.plist", + "anchor": "AIRT-0011/disk/library-preferences-com-anthropic-claudefordesktop-plist", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro", + "type": "artifact", + "label": "%LOCALAPPDATA%\\Packages\\Claude_pzs8sxrjxfjjc\\LocalCache\\Roaming\\Claude\\claude_de", + "anchor": "AIRT-0011/disk/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/disk/mcpb-desktop-extension", + "type": "artifact", + "label": "*.mcpb (Desktop Extension)", + "anchor": "AIRT-0011/disk/mcpb-desktop-extension", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0011/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0011/mcp-config/appdata-claude-claude-desktop-config-json-mcpservers-nam", + "type": "artifact", + "label": "%APPDATA%\\Claude\\claude_desktop_config.json → mcpServers..command + .args", + "anchor": "AIRT-0011/mcp-config/appdata-claude-claude-desktop-config-json-mcpservers-nam", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/mcp-config/config-claude-claude-desktop-config-json-mcpservers", + "type": "artifact", + "label": "~/.config/Claude/claude_desktop_config.json → mcpServers", + "anchor": "AIRT-0011/mcp-config/config-claude-claude-desktop-config-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/mcp-config/library-application-support-claude-claude-desktop-config", + "type": "artifact", + "label": "~/Library/Application Support/Claude/claude_desktop_config.json → mcpServers", + "anchor": "AIRT-0011/mcp-config/library-application-support-claude-claude-desktop-config", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/mcp-config/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro", + "type": "artifact", + "label": "%LOCALAPPDATA%\\Packages\\Claude_pzs8sxrjxfjjc\\LocalCache\\Roaming\\Claude\\claude_de", + "anchor": "AIRT-0011/mcp-config/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/mcp-config/mcpb-dxt-bundle-files-manifest-json-inside-archive", + "type": "artifact", + "label": "*.mcpb / *.dxt bundle files → manifest.json inside archive", + "anchor": "AIRT-0011/mcp-config/mcpb-dxt-bundle-files-manifest-json-inside-archive", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/network/api-anthropic-com-claude-ai-443-tcp", + "type": "artifact", + "label": "api.anthropic.com, claude.ai :443/TCP", + "anchor": "AIRT-0011/network/api-anthropic-com-claude-ai-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0011/network/registry-npmjs-org-npx-mcp-server-fetch-443-tcp", + "type": "artifact", + "label": "registry.npmjs.org (npx MCP server fetch) :443/TCP", + "anchor": "AIRT-0011/network/registry-npmjs-org-npx-mcp-server-fetch-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0011/process/claude", + "type": "artifact", + "label": "Claude", + "anchor": "AIRT-0011/process/claude", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0011/process/claude-exe", + "type": "artifact", + "label": "Claude.exe", + "anchor": "AIRT-0011/process/claude-exe", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0011/registry/hkcu-software-classes-activatableclasses-package-claude-", + "type": "artifact", + "label": "HKCU\\Software\\Classes\\ActivatableClasses\\Package\\Claude_pzs8sxrjxfjjc* → -", + "anchor": "AIRT-0011/registry/hkcu-software-classes-activatableclasses-package-claude-", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/registry/hkcu-software-classes-claude-shell-open-command-default", + "type": "artifact", + "label": "HKCU\\Software\\Classes\\claude\\shell\\open\\command → (Default)", + "anchor": "AIRT-0011/registry/hkcu-software-classes-claude-shell-open-command-default", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-run-claud", + "type": "artifact", + "label": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run → Claude", + "anchor": "AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-run-claud", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "type": "artifact", + "label": "HKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Uninstall\\Claude → InstallLocatio", + "anchor": "AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0016/credential/install-config-json", + "type": "artifact", + "label": "/config.json", + "anchor": "AIRT-0016/credential/install-config-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0016/credential/install-data-database-pythagora-db", + "type": "artifact", + "label": "/data/database/pythagora.db", + "anchor": "AIRT-0016/credential/install-data-database-pythagora-db", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0016/credential/install-pilot-env", + "type": "artifact", + "label": "/pilot/.env", + "anchor": "AIRT-0016/credential/install-pilot-env", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0016/credential/openai-api-key-anthropic-api-key-groq-api-key", + "type": "artifact", + "label": "OPENAI_API_KEY | ANTHROPIC_API_KEY | GROQ_API_KEY", + "anchor": "AIRT-0016/credential/openai-api-key-anthropic-api-key-groq-api-key", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0016/registry/hkcu-environment-openai-api-key-anthropic-api-key-groq-a", + "type": "artifact", + "label": "HKCU\\Environment → OPENAI_API_KEY, ANTHROPIC_API_KEY, GROQ_API_KEY", + "anchor": "AIRT-0016/registry/hkcu-environment-openai-api-key-anthropic-api-key-groq-a", + "cls": "registry", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/credential/gemini-env", + "type": "artifact", + "label": "~/.gemini/.env", + "anchor": "AIRT-0037/credential/gemini-env", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/credential/gemini-google-accounts-json", + "type": "artifact", + "label": "~/.gemini/google_accounts.json", + "anchor": "AIRT-0037/credential/gemini-google-accounts-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/credential/gemini-oauth-creds-json", + "type": "artifact", + "label": "~/.gemini/oauth_creds.json", + "anchor": "AIRT-0037/credential/gemini-oauth-creds-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/disk/etc-gemini-cli-settings-json", + "type": "artifact", + "label": "/etc/gemini-cli/settings.json", + "anchor": "AIRT-0037/disk/etc-gemini-cli-settings-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/disk/gemini-npm-g-google-gemini-cli", + "type": "artifact", + "label": "gemini (npm -g @google/gemini-cli)", + "anchor": "AIRT-0037/disk/gemini-npm-g-google-gemini-cli", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/disk/gemini-settings-json", + "type": "artifact", + "label": "~/.gemini/settings.json", + "anchor": "AIRT-0037/disk/gemini-settings-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0037/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0037/mcp-config/gemini-settings-json-mcpservers", + "type": "artifact", + "label": "~/.gemini/settings.json → mcpServers", + "anchor": "AIRT-0037/mcp-config/gemini-settings-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/mcp-config/repo-gemini-settings-json-mcpservers", + "type": "artifact", + "label": "/.gemini/settings.json → mcpServers", + "anchor": "AIRT-0037/mcp-config/repo-gemini-settings-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0037/network/generativelanguage-googleapis-com-oauth2-googleapis-com-", + "type": "artifact", + "label": "generativelanguage.googleapis.com, oauth2.googleapis.com, accounts.google.com :4", + "anchor": "AIRT-0037/network/generativelanguage-googleapis-com-oauth2-googleapis-com-", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0037/process/gemini-node", + "type": "artifact", + "label": "gemini / node", + "anchor": "AIRT-0037/process/gemini-node", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0041/credential/aws-builder-id-iam-identity-center-token-cache", + "type": "artifact", + "label": "AWS Builder ID / IAM Identity Center token cache", + "anchor": "AIRT-0041/credential/aws-builder-id-iam-identity-center-token-cache", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/credential/mcpservers-name-env-inside-kiro-settings-mcp-json", + "type": "artifact", + "label": "mcpServers..env inside ~/.kiro/settings/mcp.json", + "anchor": "AIRT-0041/credential/mcpservers-name-env-inside-kiro-settings-mcp-json", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/kiro-mcp-logs-view-output-channel", + "type": "artifact", + "label": "Kiro - MCP Logs (View > Output channel)", + "anchor": "AIRT-0041/disk/kiro-mcp-logs-view-output-channel", + "cls": "disk", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0041/disk/kiro-settings-mcp-json", + "type": "artifact", + "label": "~/.kiro/settings/mcp.json", + "anchor": "AIRT-0041/disk/kiro-settings-mcp-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/power-md-plugin-json-dev-kiro", + "type": "artifact", + "label": "POWER.md / plugin.json / dev.kiro/", + "anchor": "AIRT-0041/disk/power-md-plugin-json-dev-kiro", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/repo-kiro-agents", + "type": "artifact", + "label": "/.kiro/agents/", + "anchor": "AIRT-0041/disk/repo-kiro-agents", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/repo-kiro-hooks-kiro-hook", + "type": "artifact", + "label": "/.kiro/hooks/*.kiro.hook", + "anchor": "AIRT-0041/disk/repo-kiro-hooks-kiro-hook", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/repo-kiro-settings-mcp-json", + "type": "artifact", + "label": "/.kiro/settings/mcp.json", + "anchor": "AIRT-0041/disk/repo-kiro-settings-mcp-json", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/repo-kiro-specs", + "type": "artifact", + "label": "/.kiro/specs/", + "anchor": "AIRT-0041/disk/repo-kiro-specs", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/repo-kiro-steering-md", + "type": "artifact", + "label": "/.kiro/steering/*.md", + "anchor": "AIRT-0041/disk/repo-kiro-steering-md", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/disk/vs-code-style-globalstorage-extensions-and-state-vscdb-p", + "type": "artifact", + "label": "VS Code-style globalStorage, extensions, and state.vscdb paths", + "anchor": "AIRT-0041/disk/vs-code-style-globalstorage-extensions-and-state-vscdb-p", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0041/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0041/mcp-config/kiro-settings-mcp-json-mcpservers", + "type": "artifact", + "label": "~/.kiro/settings/mcp.json → mcpServers", + "anchor": "AIRT-0041/mcp-config/kiro-settings-mcp-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/mcp-config/repo-kiro-settings-mcp-json-mcpservers", + "type": "artifact", + "label": "/.kiro/settings/mcp.json → mcpServers", + "anchor": "AIRT-0041/mcp-config/repo-kiro-settings-mcp-json-mcpservers", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0041/network/kiro-dev-aws-kiro-service-endpoints-443-tcp", + "type": "artifact", + "label": "kiro.dev, AWS Kiro service endpoints :443/TCP", + "anchor": "AIRT-0041/network/kiro-dev-aws-kiro-service-endpoints-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0041/network/kiro-url-scheme-and-https-kiro-dev-launch-mcp-add-name-c", + "type": "artifact", + "label": "kiro:// URL scheme and https://kiro.dev/launch/mcp/add?name=&config= install lin", + "anchor": "AIRT-0041/network/kiro-url-scheme-and-https-kiro-dev-launch-mcp-add-name-c", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0041/process/kiro-ide-kiro-cli", + "type": "artifact", + "label": "kiro (IDE); kiro (CLI)", + "anchor": "AIRT-0041/process/kiro-ide-kiro-cli", + "cls": "process", + "vol": "live" + }, + { + "id": "artifact:AIRT-0044/credential/appdata-com-langflowdesktop-data-database-db", + "type": "artifact", + "label": "%APPDATA%\\com.LangflowDesktop\\data\\database.db", + "anchor": "AIRT-0044/credential/appdata-com-langflowdesktop-data-database-db", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-config-dir-private-key-pem-public-key-pem-along", + "type": "artifact", + "label": "/private_key.pem (public_key.pem alongside)", + "anchor": "AIRT-0044/credential/langflow-config-dir-private-key-pem-public-key-pem-along", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-config-dir-secret-key-default-home-cache-langfl", + "type": "artifact", + "label": "/secret_key (default /.cache/langflow/secret_key on ", + "anchor": "AIRT-0044/credential/langflow-config-dir-secret-key-default-home-cache-langfl", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-data-database-db", + "type": "artifact", + "label": "~/.langflow/data/database.db", + "anchor": "AIRT-0044/credential/langflow-data-database-db", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-database-url", + "type": "artifact", + "label": "LANGFLOW_DATABASE_URL", + "anchor": "AIRT-0044/credential/langflow-database-url", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-db-pip-install-install-lib-python3-x-site-packa", + "type": "artifact", + "label": "langflow.db (pip install: /lib/python3.x/site-packages/langflow/langfl", + "anchor": "AIRT-0044/credential/langflow-db-pip-install-install-lib-python3-x-site-packa", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-secret-key", + "type": "artifact", + "label": "LANGFLOW_SECRET_KEY", + "anchor": "AIRT-0044/credential/langflow-secret-key", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/langflow-superuser-langflow-superuser-password", + "type": "artifact", + "label": "LANGFLOW_SUPERUSER / LANGFLOW_SUPERUSER_PASSWORD", + "anchor": "AIRT-0044/credential/langflow-superuser-langflow-superuser-password", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/credential/project-env-path-passed-to-langflow-run-env-file", + "type": "artifact", + "label": "/.env (path passed to `langflow run --env-file`)", + "anchor": "AIRT-0044/credential/project-env-path-passed-to-langflow-run-env-file", + "cls": "credential", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/disk/exported-flow-json-files", + "type": "artifact", + "label": "Exported flow JSON files", + "anchor": "AIRT-0044/disk/exported-flow-json-files", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/disk/langflow", + "type": "artifact", + "label": "~/.langflow/", + "anchor": "AIRT-0044/disk/langflow", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/disk/langflow-auto-login", + "type": "artifact", + "label": "LANGFLOW_AUTO_LOGIN", + "anchor": "AIRT-0044/disk/langflow-auto-login", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/disk/langflow-db-sqlite-in-the-config-dir", + "type": "artifact", + "label": "langflow.db (SQLite, in the config dir)", + "anchor": "AIRT-0044/disk/langflow-db-sqlite-in-the-config-dir", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/disk/langflow-superuser-langflow-superuser-password", + "type": "artifact", + "label": "LANGFLOW_SUPERUSER / LANGFLOW_SUPERUSER_PASSWORD", + "anchor": "AIRT-0044/disk/langflow-superuser-langflow-superuser-password", + "cls": "disk", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/eventlog/microsoft-windows-sysmon-operational-eid-1", + "type": "artifact", + "label": "Microsoft-Windows-Sysmon/Operational EID 1", + "anchor": "AIRT-0044/eventlog/microsoft-windows-sysmon-operational-eid-1", + "cls": "eventlog", + "vol": "rotating" + }, + { + "id": "artifact:AIRT-0044/mcp-config/langflow-projects-published-as-mcp-tools-each-project-is", + "type": "artifact", + "label": "Langflow projects published as MCP tools - each project is added to Langflow's o", + "anchor": "AIRT-0044/mcp-config/langflow-projects-published-as-mcp-tools-each-project-is", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/mcp-config/mcp-server-registrations-added-in-settings-mcp-servers-p", + "type": "artifact", + "label": "MCP server registrations added in Settings - MCP Servers, persisted in langflow.", + "anchor": "AIRT-0044/mcp-config/mcp-server-registrations-added-in-settings-mcp-servers-p", + "cls": "mcp-config", + "vol": "stable" + }, + { + "id": "artifact:AIRT-0044/network/configured-llm-provider-endpoints-443-tcp", + "type": "artifact", + "label": "Configured LLM provider endpoints :443/TCP", + "anchor": "AIRT-0044/network/configured-llm-provider-endpoints-443-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0044/network/langflow-web-ui-api-7860-tcp", + "type": "artifact", + "label": "Langflow web UI + API :7860/TCP", + "anchor": "AIRT-0044/network/langflow-web-ui-api-7860-tcp", + "cls": "network", + "vol": "live" + }, + { + "id": "artifact:AIRT-0044/process/python-langflow-run-uvicorn", + "type": "artifact", + "label": "python (langflow run) / uvicorn", + "anchor": "AIRT-0044/process/python-langflow-run-uvicorn", + "cls": "process", + "vol": "live" + }, + { + "id": "asi:ASI01", + "type": "asi", + "label": "ASI01 Agent Goal Hijack" + }, + { + "id": "asi:ASI02", + "type": "asi", + "label": "ASI02 Tool Misuse and Exploitation" + }, + { + "id": "asi:ASI03", + "type": "asi", + "label": "ASI03 Identity and Privilege Abuse" + }, + { + "id": "asi:ASI04", + "type": "asi", + "label": "ASI04 Agentic Supply Chain Vulnerabilities" + }, + { + "id": "asi:ASI05", + "type": "asi", + "label": "ASI05 Unexpected Code Execution" + }, + { + "id": "asi:ASI06", + "type": "asi", + "label": "ASI06 Memory and Context Poisoning" + }, + { + "id": "atlas:AML.T0008", + "type": "technique", + "label": "AML.T0008 Acquire Infrastructure", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0008.000", + "type": "technique", + "label": "AML.T0008.000 AI Development Workspaces", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0010", + "type": "technique", + "label": "AML.T0010 AI Supply Chain Compromise", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0011", + "type": "technique", + "label": "AML.T0011 User Execution", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0016.002", + "type": "technique", + "label": "AML.T0016.002 Generative AI", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0016.004", + "type": "technique", + "label": "AML.T0016.004 AI Agent Tools", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0017.001", + "type": "technique", + "label": "AML.T0017.001 Autonomous Exploit Development", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0017.002", + "type": "technique", + "label": "AML.T0017.002 AI Agent Tools", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0024", + "type": "technique", + "label": "AML.T0024 Exfiltration via AI Inference API", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0034", + "type": "technique", + "label": "AML.T0034 Cost Harvesting", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0049", + "type": "technique", + "label": "AML.T0049 Exploit Public-Facing Application", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0051", + "type": "technique", + "label": "AML.T0051 LLM Prompt Injection", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0053", + "type": "technique", + "label": "AML.T0053 AI Agent Tool Invocation", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0054", + "type": "technique", + "label": "AML.T0054 LLM Jailbreak", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0055", + "type": "technique", + "label": "AML.T0055 Unsecured Credentials", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0080", + "type": "technique", + "label": "AML.T0080 AI Agent Context Poisoning", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0080.000", + "type": "technique", + "label": "AML.T0080.000 Memory", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0081", + "type": "technique", + "label": "AML.T0081 Modify AI Agent Configuration", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0082", + "type": "technique", + "label": "AML.T0082 RAG Credential Harvesting", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0086", + "type": "technique", + "label": "AML.T0086 Exfiltration via AI Agent Tool Invocation", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0087", + "type": "technique", + "label": "AML.T0087 Gather Victim Identity Information", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0096", + "type": "technique", + "label": "AML.T0096 AI Service API", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0102", + "type": "technique", + "label": "AML.T0102 Generate Malicious Commands", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0103", + "type": "technique", + "label": "AML.T0103 Deploy AI Agent", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0115.002", + "type": "technique", + "label": "AML.T0115.002 AI Agent Tools", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0116", + "type": "technique", + "label": "AML.T0116 Autonomous Reconnaissance", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0117", + "type": "technique", + "label": "AML.T0117 Autonomous Attack-Path Adaptation", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0124", + "type": "technique", + "label": "AML.T0124 Autonomous Attack Orchestration", + "framework": "ATLAS" + }, + { + "id": "atlas:AML.T0126", + "type": "technique", + "label": "AML.T0126 Automated Collection", + "framework": "ATLAS" + }, + { + "id": "attack:T1059", + "type": "technique", + "label": "T1059 Command and Scripting Interpreter", + "framework": "ATT&CK" + }, + { + "id": "attack:T1070", + "type": "technique", + "label": "T1070 Indicator Removal", + "framework": "ATT&CK" + }, + { + "id": "attack:T1190", + "type": "technique", + "label": "T1190 Exploit Public-Facing Application", + "framework": "ATT&CK" + }, + { + "id": "attack:T1195.002", + "type": "technique", + "label": "T1195.002 Compromise Software Supply Chain", + "framework": "ATT&CK" + }, + { + "id": "attack:T1505.003", + "type": "technique", + "label": "T1505.003 Web Shell", + "framework": "ATT&CK" + }, + { + "id": "attack:T1528", + "type": "technique", + "label": "T1528 Steal Application Access Token", + "framework": "ATT&CK" + }, + { + "id": "attack:T1546", + "type": "technique", + "label": "T1546 Event Triggered Execution", + "framework": "ATT&CK" + }, + { + "id": "attack:T1552.001", + "type": "technique", + "label": "T1552.001 Credentials In Files", + "framework": "ATT&CK" + }, + { + "id": "attack:T1557", + "type": "technique", + "label": "T1557 Adversary-in-the-Middle", + "framework": "ATT&CK" + }, + { + "id": "attack:T1566", + "type": "technique", + "label": "T1566 Phishing", + "framework": "ATT&CK" + }, + { + "id": "attack:T1567", + "type": "technique", + "label": "T1567 Exfiltration Over Web Service", + "framework": "ATT&CK" + }, + { + "id": "campaign:C0045", + "type": "attack-campaign", + "label": "C0045 ShadowRay" + }, + { + "id": "campaign:C0062", + "type": "attack-campaign", + "label": "C0062 Anthropic AI-orchestrated Campaign" + }, + { + "id": "case:AIRT-CS-0001", + "type": "case", + "label": "GPT Pilot core/telemetry Supply-Chain Credential Stealer", + "case_id": "AIRT-CS-0001", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0002", + "type": "case", + "label": "postmark-mcp npm Backdoor - First In-the-Wild Malicious MCP Server", + "case_id": "AIRT-CS-0002", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0003", + "type": "case", + "label": "Langflow CVE-2025-3248 Mass Exploitation and Flodrix Botnet Deployment", + "case_id": "AIRT-CS-0003", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0004", + "type": "case", + "label": "GTG-1002 - AI-Orchestrated Espionage Campaign", + "case_id": "AIRT-CS-0004", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0005", + "type": "case", + "label": "SesameOp - OpenAI Assistants API as a Covert C2 Relay", + "case_id": "AIRT-CS-0005", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0006", + "type": "case", + "label": "PROMPTFLUX - Malware That Asks an LLM to Rewrite Itself", + "case_id": "AIRT-CS-0006", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0007", + "type": "case", + "label": "PROMPTSTEAL / LAMEHUG - An LLM Writing Collection Commands at Runtime", + "case_id": "AIRT-CS-0007", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0008", + "type": "case", + "label": "EchoLeak (CVE-2025-32711) - Zero-Click Exfiltration from M365 Copilot", + "case_id": "AIRT-CS-0008", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0009", + "type": "case", + "label": "The MCP Vulnerability Cluster - RCE on Connect and the Rug-Pull", + "case_id": "AIRT-CS-0009", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0010", + "type": "case", + "label": "SpAIware - Prompt Injection That Persists in Assistant Memory", + "case_id": "AIRT-CS-0010", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0011", + "type": "case", + "label": "AI Recommendation Poisoning - Memory Manipulation for Profit", + "case_id": "AIRT-CS-0011", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0012", + "type": "case", + "label": "PoisonedRAG - Five Documents Against a Corpus of Millions", + "case_id": "AIRT-CS-0012", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0013", + "type": "case", + "label": "Mexican Government Breach - AI-Accelerated, Not AI-Orchestrated", + "case_id": "AIRT-CS-0013", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0014", + "type": "case", + "label": "ShadowRay - AI Compute Clusters Exploited in the Wild", + "case_id": "AIRT-CS-0014", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0015", + "type": "case", + "label": "s1ngularity - A Supply-Chain Payload That Used the Victim's Own AI CLIs", + "case_id": "AIRT-CS-0015", + "confidence": "high" + }, + { + "id": "case:AIRT-CS-0016", + "type": "case", + "label": "UNC6780 (TeamPCP) - DUSTMAKER and Trojanised MCP Servers", + "case_id": "AIRT-CS-0016", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0017", + "type": "case", + "label": "MIDNIGHT NEPTUNE - Poisoned Repository Config and Claude Code Hooks", + "case_id": "AIRT-CS-0017", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0018", + "type": "case", + "label": "GTG-20006 - Russian State-Nexus Espionage Run Through AI Workflows", + "case_id": "AIRT-CS-0018", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0019", + "type": "case", + "label": "GTG-50014 - ShinyHunters Affiliates Vibe-Hacking SaaS Estates", + "case_id": "AIRT-CS-0019", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0020", + "type": "case", + "label": "GTG-50020 - From Hotel Booking Fraud to Probing AI Companies", + "case_id": "AIRT-CS-0020", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0021", + "type": "case", + "label": "GTG-50029 - A Single Hacktivist Against European Political Targets", + "case_id": "AIRT-CS-0021", + "confidence": "medium" + }, + { + "id": "case:AIRT-CS-0022", + "type": "case", + "label": "GTG-50021 - A Fraudulent AI Reseller Harvesting Customers' Credentials", + "case_id": "AIRT-CS-0022", + "confidence": "medium" + }, + { + "id": "country:CA", + "type": "country", + "label": "CA" + }, + { + "id": "country:FR", + "type": "country", + "label": "FR" + }, + { + "id": "country:MX", + "type": "country", + "label": "MX" + }, + { + "id": "country:UA", + "type": "country", + "label": "UA" + }, + { + "id": "country:US", + "type": "country", + "label": "US" + }, + { + "id": "group:G0007", + "type": "attack-group", + "label": "G0007 APT28" + }, + { + "id": "group:G0034", + "type": "attack-group", + "label": "G0034 Sandworm Team" + }, + { + "id": "group:G0069", + "type": "attack-group", + "label": "G0069 MuddyWater" + }, + { + "id": "group:G0094", + "type": "attack-group", + "label": "G0094 Kimsuky" + }, + { + "id": "group:G0096", + "type": "attack-group", + "label": "G0096 APT41" + }, + { + "id": "group:G0128", + "type": "attack-group", + "label": "G0128 ZIRCONIUM" + }, + { + "id": "group:G1044", + "type": "attack-group", + "label": "G1044 APT42" + }, + { + "id": "group:G1057", + "type": "attack-group", + "label": "G1057 ShinyHunters" + }, + { + "id": "ioc:account:-1003311614569", + "type": "ioc", + "label": "-1003311614569", + "ioc_type": "account" + }, + { + "id": "ioc:account:-1003893854338", + "type": "ioc", + "label": "-1003893854338", + "ioc_type": "account" + }, + { + "id": "ioc:account:8179098353", + "type": "ioc", + "label": "8179098353", + "ioc_type": "account" + }, + { + "id": "ioc:account:8628746407", + "type": "ioc", + "label": "8628746407", + "ioc_type": "account" + }, + { + "id": "ioc:account:8632748474", + "type": "ioc", + "label": "8632748474", + "ioc_type": "account" + }, + { + "id": "ioc:account:8664033117", + "type": "ioc", + "label": "8664033117", + "ioc_type": "account" + }, + { + "id": "ioc:account:8709258476", + "type": "ioc", + "label": "8709258476", + "ioc_type": "account" + }, + { + "id": "ioc:account:https[:]//t[.]me/Soraki_Bot", + "type": "ioc", + "label": "https[:]//t[.]me/Soraki_Bot", + "ioc_type": "account" + }, + { + "id": "ioc:account:phanpak", + "type": "ioc", + "label": "phanpak", + "ioc_type": "account" + }, + { + "id": "ioc:binary:bun", + "type": "ioc", + "label": "bun", + "ioc_type": "binary" + }, + { + "id": "ioc:commit:065ee8eb", + "type": "ioc", + "label": "065ee8eb", + "ioc_type": "commit" + }, + { + "id": "ioc:directory:%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", + "type": "ioc", + "label": "%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", + "ioc_type": "directory" + }, + { + "id": "ioc:directory:/.claude/, /.cursor/, /.vscode/", + "type": "ioc", + "label": "/.claude/, /.cursor/, /.vscode/", + "ioc_type": "directory" + }, + { + "id": "ioc:directory:rt-*", + "type": "ioc", + "label": "rt-*", + "ioc_type": "directory" + }, + { + "id": "ioc:domain:3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion", + "type": "ioc", + "label": "3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion", + "type": "ioc", + "label": "6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:ad-g[.]org", + "type": "ioc", + "label": "ad-g[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:api-inference.huggingface.co", + "type": "ioc", + "label": "api-inference.huggingface.co", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:api.openai.com", + "type": "ioc", + "label": "api.openai.com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:api.stuseamandesilt[.]org", + "type": "ioc", + "label": "api.stuseamandesilt[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:ari-chain[.]com", + "type": "ioc", + "label": "ari-chain[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:arichain[.]network", + "type": "ioc", + "label": "arichain[.]network", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:autoshop.policenationale[.]cc", + "type": "ioc", + "label": "autoshop.policenationale[.]cc", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:aws-us-east-3[.]com", + "type": "ioc", + "label": "aws-us-east-3[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:awstore[.]cloud", + "type": "ioc", + "label": "awstore[.]cloud", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:bitmart-mystery[.]com", + "type": "ioc", + "label": "bitmart-mystery[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:cdn.stuseamandesilt[.]org", + "type": "ioc", + "label": "cdn.stuseamandesilt[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:cdncounter[.]net", + "type": "ioc", + "label": "cdncounter[.]net", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:chamber-ua[.]org", + "type": "ioc", + "label": "chamber-ua[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:chathamhouse[.]eu", + "type": "ioc", + "label": "chathamhouse[.]eu", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:defi-claim[.]xyz", + "type": "ioc", + "label": "defi-claim[.]xyz", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:docs-viewer[.]org", + "type": "ioc", + "label": "docs-viewer[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:emailsecure[.]email", + "type": "ioc", + "label": "emailsecure[.]email", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun", + "type": "ioc", + "label": "esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:fafwatch[.]xyz", + "type": "ioc", + "label": "fafwatch[.]xyz", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:frntrs-analytics-863060591218.europe-west1.run[.]app", + "type": "ioc", + "label": "frntrs-analytics-863060591218.europe-west1.run[.]app", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:frntrs-analytics.dedyn[.]io", + "type": "ioc", + "label": "frntrs-analytics.dedyn[.]io", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:generativelanguage.googleapis.com", + "type": "ioc", + "label": "generativelanguage.googleapis.com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:holdboost[.]store", + "type": "ioc", + "label": "holdboost[.]store", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:itechx[.]tel", + "type": "ioc", + "label": "itechx[.]tel", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:iymkjuzymkapovrntoxy.supabase[.]co", + "type": "ioc", + "label": "iymkjuzymkapovrntoxy.supabase[.]co", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:kiro[.]cheap", + "type": "ioc", + "label": "kiro[.]cheap", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:m365-owa[.]com", + "type": "ioc", + "label": "m365-owa[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:meridian-protocol[.]org", + "type": "ioc", + "label": "meridian-protocol[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:meridiangroup-corp[.]com", + "type": "ioc", + "label": "meridiangroup-corp[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:metricwave[.]org", + "type": "ioc", + "label": "metricwave[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:mgsend[.]org", + "type": "ioc", + "label": "mgsend[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:mozilla[.]ws", + "type": "ioc", + "label": "mozilla[.]ws", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:ms365-device[.]com", + "type": "ioc", + "label": "ms365-device[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:ms365-live[.]com", + "type": "ioc", + "label": "ms365-live[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:mslivetest.duckdns[.]org", + "type": "ioc", + "label": "mslivetest.duckdns[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:my-invite[.]org", + "type": "ioc", + "label": "my-invite[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:mygreatmarket[.]com", + "type": "ioc", + "label": "mygreatmarket[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:mygreatmarket[.]org", + "type": "ioc", + "label": "mygreatmarket[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:on-pssword[.]com", + "type": "ioc", + "label": "on-pssword[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:owa-ms365[.]com", + "type": "ioc", + "label": "owa-ms365[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:pdfviewer2024.b-cdn[.]net", + "type": "ioc", + "label": "pdfviewer2024.b-cdn[.]net", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:policenationale[.]cc", + "type": "ioc", + "label": "policenationale[.]cc", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:prod-artfkt[.]com", + "type": "ioc", + "label": "prod-artfkt[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:projectnightcrawler[.]dev", + "type": "ioc", + "label": "projectnightcrawler[.]dev", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:russianearabroad[.]com", + "type": "ioc", + "label": "russianearabroad[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:russianearabroad[.]org", + "type": "ioc", + "label": "russianearabroad[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:service-infos[.]info", + "type": "ioc", + "label": "service-infos[.]info", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:signin-1psswoord[.]com", + "type": "ioc", + "label": "signin-1psswoord[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev", + "type": "ioc", + "label": "soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:soraki[.]cc", + "type": "ioc", + "label": "soraki[.]cc", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:soraki[.]work", + "type": "ioc", + "label": "soraki[.]work", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:static-ms[.]live", + "type": "ioc", + "label": "static-ms[.]live", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:static.cdncounter[.]net", + "type": "ioc", + "label": "static.cdncounter[.]net", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:statistic-ms[.]live", + "type": "ioc", + "label": "statistic-ms[.]live", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:stuseamandesilt[.]org", + "type": "ioc", + "label": "stuseamandesilt[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:sys-tools[.]cfd", + "type": "ioc", + "label": "sys-tools[.]cfd", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:teams.ms365-live[.]com", + "type": "ioc", + "label": "teams.ms365-live[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:ukrinform-share[.]net", + "type": "ioc", + "label": "ukrinform-share[.]net", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:update.stuseamandesilt[.]org", + "type": "ioc", + "label": "update.stuseamandesilt[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:updatebeacon.duckdns[.]org", + "type": "ioc", + "label": "updatebeacon.duckdns[.]org", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:wa-connect[.]eu", + "type": "ioc", + "label": "wa-connect[.]eu", + "ioc_type": "domain" + }, + { + "id": "ioc:domain:wa-meeting[.]com", + "type": "ioc", + "label": "wa-meeting[.]com", + "ioc_type": "domain" + }, + { + "id": "ioc:email:anna.manager@russianearabroad[.]net", + "type": "ioc", + "label": "anna.manager@russianearabroad[.]net", + "ioc_type": "email" + }, + { + "id": "ioc:email:events@embassy-protocol[.]int", + "type": "ioc", + "label": "events@embassy-protocol[.]int", + "ioc_type": "email" + }, + { + "id": "ioc:email:phan@giftshop[.]club", + "type": "ioc", + "label": "phan@giftshop[.]club", + "ioc_type": "email" + }, + { + "id": "ioc:file:%TEMP%\\thinking_robot_log.txt", + "type": "ioc", + "label": "%TEMP%\\thinking_robot_log.txt", + "ioc_type": "file" + }, + { + "id": "ioc:file:/tmp/inventory.txt", + "type": "ioc", + "label": "/tmp/inventory.txt", + "ioc_type": "file" + }, + { + "id": "ioc:file:.exe.config containing appDomainManagerAssembly", + "type": "ioc", + "label": ".exe.config containing appDomainManagerAssembly", + "ioc_type": "file" + }, + { + "id": "ioc:file:Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)", + "type": "ioc", + "label": "Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)", + "ioc_type": "file" + }, + { + "id": "ioc:file:C:\\Windows\\Temp\\*.Netapi64", + "type": "ioc", + "label": "C:\\Windows\\Temp\\*.Netapi64", + "ioc_type": "file" + }, + { + "id": "ioc:file:C:\\Windows\\Temp\\Netapi64.Exception", + "type": "ioc", + "label": "C:\\Windows\\Temp\\Netapi64.Exception", + "ioc_type": "file" + }, + { + "id": "ioc:file:C:\\Windows\\Temp\\Netapi64.start", + "type": "ioc", + "label": "C:\\Windows\\Temp\\Netapi64.start", + "ioc_type": "file" + }, + { + "id": "ioc:file:Framework checkpoint stores (LangGraph SQLite and equivalents)", + "type": "ioc", + "label": "Framework checkpoint stores (LangGraph SQLite and equivalents)", + "ioc_type": "file" + }, + { + "id": "ioc:file:Netapi64.dll", + "type": "ioc", + "label": "Netapi64.dll", + "ioc_type": "file" + }, + { + "id": "ioc:file:WUEngine.exe", + "type": "ioc", + "label": "WUEngine.exe", + "ioc_type": "file" + }, + { + "id": "ioc:file:client_20260507093021_4286d211_x64.exe", + "type": "ioc", + "label": "client_20260507093021_4286d211_x64.exe", + "ioc_type": "file" + }, + { + "id": "ioc:file:core/telemetry/.loader.lock", + "type": "ioc", + "label": "core/telemetry/.loader.lock", + "ioc_type": "file" + }, + { + "id": "ioc:file:core/telemetry/__init__.py", + "type": "ioc", + "label": "core/telemetry/__init__.py", + "ioc_type": "file" + }, + { + "id": "ioc:file:core/telemetry/_hooks.py", + "type": "ioc", + "label": "core/telemetry/_hooks.py", + "ioc_type": "file" + }, + { + "id": "ioc:file:core/telemetry/_runtime.bin", + "type": "ioc", + "label": "core/telemetry/_runtime.bin", + "ioc_type": "file" + }, + { + "id": "ioc:file:fix_network.apk", + "type": "ioc", + "label": "fix_network.apk", + "ioc_type": "file" + }, + { + "id": "ioc:file:msedgeupdate_v3.exe", + "type": "ioc", + "label": "msedgeupdate_v3.exe", + "ioc_type": "file" + }, + { + "id": "ioc:file:Додаток.pdf.zip", + "type": "ioc", + "label": "Додаток.pdf.zip", + "ioc_type": "file" + }, + { + "id": "ioc:hash:918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593", + "type": "ioc", + "label": "918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593", + "ioc_type": "hash" + }, + { + "id": "ioc:hash:be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c", + "type": "ioc", + "label": "be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c", + "ioc_type": "hash" + }, + { + "id": "ioc:ip:103.124.165[.]199", + "type": "ioc", + "label": "103.124.165[.]199", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:103.141.60[.]144", + "type": "ioc", + "label": "103.141.60[.]144", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:103.216.220[.]19", + "type": "ioc", + "label": "103.216.220[.]19", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:104.145.210[.]184", + "type": "ioc", + "label": "104.145.210[.]184", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:104.193.135[.]207", + "type": "ioc", + "label": "104.193.135[.]207", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:104.194.149[.]228", + "type": "ioc", + "label": "104.194.149[.]228", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:104.194.151[.]133", + "type": "ioc", + "label": "104.194.151[.]133", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:104.194.159[.]55", + "type": "ioc", + "label": "104.194.159[.]55", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:104.36.50[.]54", + "type": "ioc", + "label": "104.36.50[.]54", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:136.144.242[.]56", + "type": "ioc", + "label": "136.144.242[.]56", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:138.199.60[.]29", + "type": "ioc", + "label": "138.199.60[.]29", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:138.199.6[.]208", + "type": "ioc", + "label": "138.199.6[.]208", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:139.59.2[.]243", + "type": "ioc", + "label": "139.59.2[.]243", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:141.133.125[.]208", + "type": "ioc", + "label": "141.133.125[.]208", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:144.172.114[.]192", + "type": "ioc", + "label": "144.172.114[.]192", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:146.103.101[.]253", + "type": "ioc", + "label": "146.103.101[.]253", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:146.103.97[.]169", + "type": "ioc", + "label": "146.103.97[.]169", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:146.70.116[.]131", + "type": "ioc", + "label": "146.70.116[.]131", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:148.135.195[.]111", + "type": "ioc", + "label": "148.135.195[.]111", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:149.22.83[.]6", + "type": "ioc", + "label": "149.22.83[.]6", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:149.54.42[.]106", + "type": "ioc", + "label": "149.54.42[.]106", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:158.173.46[.]118", + "type": "ioc", + "label": "158.173.46[.]118", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:162.128.129[.]106", + "type": "ioc", + "label": "162.128.129[.]106", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:163.172.157[.]53", + "type": "ioc", + "label": "163.172.157[.]53", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:167.250.111[.]136", + "type": "ioc", + "label": "167.250.111[.]136", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:176.177.12[.]62", + "type": "ioc", + "label": "176.177.12[.]62", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:178.16.54[.]141", + "type": "ioc", + "label": "178.16.54[.]141", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:185.198.234[.]101", + "type": "ioc", + "label": "185.198.234[.]101", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:185.198.234[.]26", + "type": "ioc", + "label": "185.198.234[.]26", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:185.65.134[.]199", + "type": "ioc", + "label": "185.65.134[.]199", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:185.65.134[.]246", + "type": "ioc", + "label": "185.65.134[.]246", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:193.32.249[.]161", + "type": "ioc", + "label": "193.32.249[.]161", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:193.32.249[.]164", + "type": "ioc", + "label": "193.32.249[.]164", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:193.32.249[.]170", + "type": "ioc", + "label": "193.32.249[.]170", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:194.163.183[.]216", + "type": "ioc", + "label": "194.163.183[.]216", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:195.178.110[.]131", + "type": "ioc", + "label": "195.178.110[.]131", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:2.26.53[.]194", + "type": "ioc", + "label": "2.26.53[.]194", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:2001:ac8:27[:]89::a02d", + "type": "ioc", + "label": "2001:ac8:27[:]89::a02d", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:2001:ac8:29[:]84::a01d", + "type": "ioc", + "label": "2001:ac8:29[:]84::a01d", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:2001:bc8:711:5854:dc00:1ff:fe18[:]ba53", + "type": "ioc", + "label": "2001:bc8:711:5854:dc00:1ff:fe18[:]ba53", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:202.66.167[.]230", + "type": "ioc", + "label": "202.66.167[.]230", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:213.145.86[.]112", + "type": "ioc", + "label": "213.145.86[.]112", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53", + "type": "ioc", + "label": "2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:2a04:cec0:1185:34f2:a150:7081:caed[:]448e", + "type": "ioc", + "label": "2a04:cec0:1185:34f2:a150:7081:caed[:]448e", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:31.57.243[.]154", + "type": "ioc", + "label": "31.57.243[.]154", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:34.156.199[.]132", + "type": "ioc", + "label": "34.156.199[.]132", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:34.156.95[.]176", + "type": "ioc", + "label": "34.156.95[.]176", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:37.27.103[.]22", + "type": "ioc", + "label": "37.27.103[.]22", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:38.146.28[.]132", + "type": "ioc", + "label": "38.146.28[.]132", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:38.146.28[.]75", + "type": "ioc", + "label": "38.146.28[.]75", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:45.148.10[.]242", + "type": "ioc", + "label": "45.148.10[.]242", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:91.171.138[.]169", + "type": "ioc", + "label": "91.171.138[.]169", + "ioc_type": "ip" + }, + { + "id": "ioc:ip:92.118.39[.]3", + "type": "ioc", + "label": "92.118.39[.]3", + "ioc_type": "ip" + }, + { + "id": "ioc:mutex:Netapi64", + "type": "ioc", + "label": "Netapi64", + "ioc_type": "mutex" + }, + { + "id": "ioc:mutex:OpenAI APIS", + "type": "ioc", + "label": "OpenAI APIS", + "ioc_type": "mutex" + }, + { + "id": "ioc:package:nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0", + "type": "ioc", + "label": "nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0", + "ioc_type": "package" + }, + { + "id": "ioc:package:postmark-mcp@1.0.16", + "type": "ioc", + "label": "postmark-mcp@1.0.16", + "ioc_type": "package" + }, + { + "id": "ioc:package:tiktoken_mcp (PyPI)", + "type": "ioc", + "label": "tiktoken_mcp (PyPI)", + "ioc_type": "package" + }, + { + "id": "ioc:process:OpenAIAgent.Netapi64", + "type": "ioc", + "label": "OpenAIAgent.Netapi64", + "ioc_type": "process" + }, + { + "id": "ioc:process:XMRig or equivalent miner on a GPU host", + "type": "ioc", + "label": "XMRig or equivalent miner on a GPU host", + "ioc_type": "process" + }, + { + "id": "ioc:url:Assistant URL carrying a pre-filled prompt in a query parameter", + "type": "ioc", + "label": "Assistant URL carrying a pre-filled prompt in a query parameter", + "ioc_type": "url" + }, + { + "id": "ioc:url:https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/", + "type": "ioc", + "label": "https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/", + "ioc_type": "url" + }, + { + "id": "malware:dustmaker", + "type": "malware", + "label": "DUSTMAKER" + }, + { + "id": "malware:flodrix botnet", + "type": "malware", + "label": "Flodrix botnet" + }, + { + "id": "malware:lamehug", + "type": "malware", + "label": "LAMEHUG" + }, + { + "id": "malware:promptsteal", + "type": "malware", + "label": "PROMPTSTEAL" + }, + { + "id": "malware:sandclock", + "type": "malware", + "label": "SANDCLOCK" + }, + { + "id": "malware:sombermeme", + "type": "malware", + "label": "SOMBERMEME" + }, + { + "id": "region:Americas", + "type": "region", + "label": "Americas" + }, + { + "id": "region:Europe", + "type": "region", + "label": "Europe" + }, + { + "id": "rule:agentic_orchestration_behavior.yml", + "type": "rule", + "label": "agentic_orchestration_behavior.yml" + }, + { + "id": "rule:ai_agent_autostart_persistence.yml", + "type": "rule", + "label": "ai_agent_autostart_persistence.yml" + }, + { + "id": "rule:ai_agent_credential_file_access.yml", + "type": "rule", + "label": "ai_agent_credential_file_access.yml" + }, + { + "id": "rule:ai_agent_docker_socket_mount.yml", + "type": "rule", + "label": "ai_agent_docker_socket_mount.yml" + }, + { + "id": "rule:ai_agent_hook_config_modification.yml", + "type": "rule", + "label": "ai_agent_hook_config_modification.yml" + }, + { + "id": "rule:ai_agent_mcp_config_modification.yml", + "type": "rule", + "label": "ai_agent_mcp_config_modification.yml" + }, + { + "id": "rule:ai_agent_spawning_lolbin.yml", + "type": "rule", + "label": "ai_agent_spawning_lolbin.yml" + }, + { + "id": "rule:ai_agent_spawning_shell.yml", + "type": "rule", + "label": "ai_agent_spawning_shell.yml" + }, + { + "id": "rule:ai_assistant_outbound_to_camo_proxy.rules", + "type": "rule", + "label": "ai_assistant_outbound_to_camo_proxy.rules" + }, + { + "id": "rule:ai_cli_permission_bypass_invocation.yml", + "type": "rule", + "label": "ai_cli_permission_bypass_invocation.yml" + }, + { + "id": "rule:ai_inference_endpoint_redirection.yml", + "type": "rule", + "label": "ai_inference_endpoint_redirection.yml" + }, + { + "id": "rule:ai_service_api_c2.rules", + "type": "rule", + "label": "ai_service_api_c2.rules" + }, + { + "id": "rule:azure_openai_injection.yml", + "type": "rule", + "label": "azure_openai_injection.yml" + }, + { + "id": "rule:bedrock_high_token_usage.yml", + "type": "rule", + "label": "bedrock_high_token_usage.yml" + }, + { + "id": "rule:browser_agent_session_state_capture.yml", + "type": "rule", + "label": "browser_agent_session_state_capture.yml" + }, + { + "id": "rule:chatgpt_paste_sensitive_data.yml", + "type": "rule", + "label": "chatgpt_paste_sensitive_data.yml" + }, + { + "id": "rule:chroma_sqlite_unexpected_writer.yml", + "type": "rule", + "label": "chroma_sqlite_unexpected_writer.yml" + }, + { + "id": "rule:claude_desktop_config_modify.yml", + "type": "rule", + "label": "claude_desktop_config_modify.yml" + }, + { + "id": "rule:claude_session_jsonl_unexpected_access.yml", + "type": "rule", + "label": "claude_session_jsonl_unexpected_access.yml" + }, + { + "id": "rule:copilot_rules_file_backdoor.yar", + "type": "rule", + "label": "copilot_rules_file_backdoor.yar" + }, + { + "id": "rule:cursor_settings_db_modification.yml", + "type": "rule", + "label": "cursor_settings_db_modification.yml" + }, + { + "id": "rule:github_copilot_yolo_mode_enabled.yml", + "type": "rule", + "label": "github_copilot_yolo_mode_enabled.yml" + }, + { + "id": "rule:gpu_unexpected_high_utilization.yml", + "type": "rule", + "label": "gpu_unexpected_high_utilization.yml" + }, + { + "id": "rule:huggingface_cache_unexpected_writer.yml", + "type": "rule", + "label": "huggingface_cache_unexpected_writer.yml" + }, + { + "id": "rule:huggingface_token_exposure.yml", + "type": "rule", + "label": "huggingface_token_exposure.yml" + }, + { + "id": "rule:jailbreak_personas.yml", + "type": "rule", + "label": "jailbreak_personas.yml" + }, + { + "id": "rule:langflow_rce_exploitation_attempt.yml", + "type": "rule", + "label": "langflow_rce_exploitation_attempt.yml" + }, + { + "id": "rule:llm_api_prompt_in_script_generic.yar", + "type": "rule", + "label": "llm_api_prompt_in_script_generic.yar" + }, + { + "id": "rule:llm_response_base64_exfil.yml", + "type": "rule", + "label": "llm_response_base64_exfil.yml" + }, + { + "id": "rule:local_llm_listener_non_loopback.yml", + "type": "rule", + "label": "local_llm_listener_non_loopback.yml" + }, + { + "id": "rule:m365_copilot_anomalous_aggregation.yml", + "type": "rule", + "label": "m365_copilot_anomalous_aggregation.yml" + }, + { + "id": "rule:m365_copilot_sensitive_label_access.yml", + "type": "rule", + "label": "m365_copilot_sensitive_label_access.yml" + }, + { + "id": "rule:markdown_image_exfil.yml", + "type": "rule", + "label": "markdown_image_exfil.yml" + }, + { + "id": "rule:mcp_config_tampering.yml", + "type": "rule", + "label": "mcp_config_tampering.yml" + }, + { + "id": "rule:mcp_credential_access.yml", + "type": "rule", + "label": "mcp_credential_access.yml" + }, + { + "id": "rule:mcp_outbound_unknown_domain.rules", + "type": "rule", + "label": "mcp_outbound_unknown_domain.rules" + }, + { + "id": "rule:mcp_server_remote_code_fetch.yml", + "type": "rule", + "label": "mcp_server_remote_code_fetch.yml" + }, + { + "id": "rule:mcp_tool_poisoning.yar", + "type": "rule", + "label": "mcp_tool_poisoning.yar" + }, + { + "id": "rule:memory_poisoning.yml", + "type": "rule", + "label": "memory_poisoning.yml" + }, + { + "id": "rule:memory_poisoning_indicators.yar", + "type": "rule", + "label": "memory_poisoning_indicators.yar" + }, + { + "id": "rule:mlflow_path_traversal.rules", + "type": "rule", + "label": "mlflow_path_traversal.rules" + }, + { + "id": "rule:mlflow_unauth_api_access.yml", + "type": "rule", + "label": "mlflow_unauth_api_access.yml" + }, + { + "id": "rule:model_file_hash_mismatch.yml", + "type": "rule", + "label": "model_file_hash_mismatch.yml" + }, + { + "id": "rule:ollama_vllm_unauth_exposure.rules", + "type": "rule", + "label": "ollama_vllm_unauth_exposure.rules" + }, + { + "id": "rule:pickle_malicious_opcodes.yar", + "type": "rule", + "label": "pickle_malicious_opcodes.yar" + }, + { + "id": "rule:pip_install_typosquat.yml", + "type": "rule", + "label": "pip_install_typosquat.yml" + }, + { + "id": "rule:powershell_llm_api_command_generation.yml", + "type": "rule", + "label": "powershell_llm_api_command_generation.yml" + }, + { + "id": "rule:prompt_injection_keywords.yml", + "type": "rule", + "label": "prompt_injection_keywords.yml" + }, + { + "id": "rule:promptflux_artifacts_fileevent.yml", + "type": "rule", + "label": "promptflux_artifacts_fileevent.yml" + }, + { + "id": "rule:promptflux_thinking_robot.yar", + "type": "rule", + "label": "promptflux_thinking_robot.yar" + }, + { + "id": "rule:promptsteal_lamehug.yar", + "type": "rule", + "label": "promptsteal_lamehug.yar" + }, + { + "id": "rule:rag_document_hidden_text.yar", + "type": "rule", + "label": "rag_document_hidden_text.yar" + }, + { + "id": "rule:ray_dashboard_exposure.rules", + "type": "rule", + "label": "ray_dashboard_exposure.rules" + }, + { + "id": "rule:ray_jobs_api_rce.rules", + "type": "rule", + "label": "ray_jobs_api_rce.rules" + }, + { + "id": "rule:runtime_ai_malware_correlation.yml", + "type": "rule", + "label": "runtime_ai_malware_correlation.yml" + }, + { + "id": "rule:runtime_llm_api_c2.rules", + "type": "rule", + "label": "runtime_llm_api_c2.rules" + }, + { + "id": "rule:script_interpreter_llm_api_dns.yml", + "type": "rule", + "label": "script_interpreter_llm_api_dns.yml" + }, + { + "id": "rule:sesameop_assistants_api_c2.yml", + "type": "rule", + "label": "sesameop_assistants_api_c2.yml" + }, + { + "id": "rule:shadowray_process_masquerading.yml", + "type": "rule", + "label": "shadowray_process_masquerading.yml" + }, + { + "id": "rule:ssh_authorized_keys_injection.yml", + "type": "rule", + "label": "ssh_authorized_keys_injection.yml" + }, + { + "id": "rule:system_prompt_extraction.yml", + "type": "rule", + "label": "system_prompt_extraction.yml" + }, + { + "id": "rule:torchserve_shelltorch.rules", + "type": "rule", + "label": "torchserve_shelltorch.rules" + }, + { + "id": "rule:triton_inference_server_exploit.rules", + "type": "rule", + "label": "triton_inference_server_exploit.rules" + }, + { + "id": "rule:vector_db_bulk_exfil.yml", + "type": "rule", + "label": "vector_db_bulk_exfil.yml" + }, + { + "id": "rule:vector_db_query_anomaly.yml", + "type": "rule", + "label": "vector_db_query_anomaly.yml" + }, + { + "id": "rule:vector_db_unauth_exposure.rules", + "type": "rule", + "label": "vector_db_unauth_exposure.rules" + }, + { + "id": "sector:chemical", + "type": "sector", + "label": "chemical" + }, + { + "id": "sector:commercial-facilities", + "type": "sector", + "label": "commercial-facilities" + }, + { + "id": "sector:consumers", + "type": "sector", + "label": "consumers" + }, + { + "id": "sector:critical-manufacturing", + "type": "sector", + "label": "critical-manufacturing" + }, + { + "id": "sector:cryptocurrency", + "type": "sector", + "label": "cryptocurrency" + }, + { + "id": "sector:defense-industrial-base", + "type": "sector", + "label": "defense-industrial-base" + }, + { + "id": "sector:education", + "type": "sector", + "label": "education" + }, + { + "id": "sector:emergency-services", + "type": "sector", + "label": "emergency-services" + }, + { + "id": "sector:energy", + "type": "sector", + "label": "energy" + }, + { + "id": "sector:financial-services", + "type": "sector", + "label": "financial-services" + }, + { + "id": "sector:government", + "type": "sector", + "label": "government" + }, + { + "id": "sector:healthcare", + "type": "sector", + "label": "healthcare" + }, + { + "id": "sector:information-technology", + "type": "sector", + "label": "information-technology" + }, + { + "id": "sector:media-entertainment", + "type": "sector", + "label": "media-entertainment" + }, + { + "id": "sector:ngo-think-tank", + "type": "sector", + "label": "ngo-think-tank" + }, + { + "id": "sector:religious-institutions", + "type": "sector", + "label": "religious-institutions" + }, + { + "id": "sector:research", + "type": "sector", + "label": "research" + }, + { + "id": "sector:retail", + "type": "sector", + "label": "retail" + }, + { + "id": "sector:software-supply-chain", + "type": "sector", + "label": "software-supply-chain" + }, + { + "id": "sector:telecommunications", + "type": "sector", + "label": "telecommunications" + }, + { + "id": "sector:transportation", + "type": "sector", + "label": "transportation" + }, + { + "id": "tactic:AML.TA0001", + "type": "tactic", + "label": "AML.TA0001 AI Attack Adaptation" + }, + { + "id": "tactic:AML.TA0002", + "type": "tactic", + "label": "AML.TA0002 Reconnaissance" + }, + { + "id": "tactic:AML.TA0003", + "type": "tactic", + "label": "AML.TA0003 Resource Development" + }, + { + "id": "tactic:AML.TA0004", + "type": "tactic", + "label": "AML.TA0004 Initial Access" + }, + { + "id": "tactic:AML.TA0005", + "type": "tactic", + "label": "AML.TA0005 Execution" + }, + { + "id": "tactic:AML.TA0006", + "type": "tactic", + "label": "AML.TA0006 Persistence" + }, + { + "id": "tactic:AML.TA0007", + "type": "tactic", + "label": "AML.TA0007 Defense Evasion" + }, + { + "id": "tactic:AML.TA0009", + "type": "tactic", + "label": "AML.TA0009 Collection" + }, + { + "id": "tactic:AML.TA0010", + "type": "tactic", + "label": "AML.TA0010 Exfiltration" + }, + { + "id": "tactic:AML.TA0011", + "type": "tactic", + "label": "AML.TA0011 Impact" + }, + { + "id": "tactic:AML.TA0012", + "type": "tactic", + "label": "AML.TA0012 Privilege Escalation" + }, + { + "id": "tactic:AML.TA0013", + "type": "tactic", + "label": "AML.TA0013 Credential Access" + }, + { + "id": "tactic:AML.TA0014", + "type": "tactic", + "label": "AML.TA0014 Command and Control" + }, + { + "id": "tactic:AML.TA0015", + "type": "tactic", + "label": "AML.TA0015 Lateral Movement" + }, + { + "id": "tool:AIRT-0001", + "type": "tool", + "label": "Claude Code", + "entry_id": "AIRT-0001" + }, + { + "id": "tool:AIRT-0002", + "type": "tool", + "label": "Cursor", + "entry_id": "AIRT-0002" + }, + { + "id": "tool:AIRT-0006", + "type": "tool", + "label": "Codeium / Windsurf", + "entry_id": "AIRT-0006" + }, + { + "id": "tool:AIRT-0008", + "type": "tool", + "label": "Amazon Q Developer (ex-CodeWhisperer)", + "entry_id": "AIRT-0008" + }, + { + "id": "tool:AIRT-0011", + "type": "tool", + "label": "Claude Desktop (MCP host)", + "entry_id": "AIRT-0011" + }, + { + "id": "tool:AIRT-0016", + "type": "tool", + "label": "GPT Pilot", + "entry_id": "AIRT-0016" + }, + { + "id": "tool:AIRT-0037", + "type": "tool", + "label": "Google Gemini CLI", + "entry_id": "AIRT-0037" + }, + { + "id": "tool:AIRT-0041", + "type": "tool", + "label": "Kiro", + "entry_id": "AIRT-0041" + }, + { + "id": "tool:AIRT-0044", + "type": "tool", + "label": "Langflow", + "entry_id": "AIRT-0044" + } + ], + "edges": [ + { + "source": "actor:AIRT-TA-0001", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "atlas:AML.T0102", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "case:AIRT-CS-0007", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "country:UA", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "group:G0007", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "malware:lamehug", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0001", + "target": "malware:promptsteal", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0002", + "target": "case:AIRT-CS-0004", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0002", + "target": "tool:AIRT-0001", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "asi:ASI02", + "rel": "maps-to" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "atlas:AML.T0103", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "atlas:AML.T0116", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "sector:emergency-services", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "sector:healthcare", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "sector:religious-institutions", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0003", + "target": "tool:AIRT-0001", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "asi:ASI05", + "rel": "maps-to" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "atlas:AML.T0081", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "case:AIRT-CS-0017", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "malware:sombermeme", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "sector:cryptocurrency", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0004", + "target": "tool:AIRT-0001", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "atlas:AML.T0010", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "case:AIRT-CS-0016", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "malware:dustmaker", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "malware:sandclock", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "sector:software-supply-chain", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "tool:AIRT-0001", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0005", + "target": "tool:AIRT-0002", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "asi:ASI02", + "rel": "maps-to" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "atlas:AML.T0103", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "atlas:AML.T0126", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "case:AIRT-CS-0019", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "group:G1057", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0006", + "target": "tool:AIRT-0001", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0007", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0007", + "target": "atlas:AML.T0017.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0007", + "target": "atlas:AML.T0087", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0007", + "target": "group:G1044", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0008", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0008", + "target": "group:G0096", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0009", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0009", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0009", + "target": "country:UA", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0009", + "target": "group:G0034", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0010", + "target": "asi:ASI02", + "rel": "maps-to" + }, + { + "source": "actor:AIRT-TA-0010", + "target": "atlas:AML.T0016.004", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0010", + "target": "atlas:AML.T0054", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0010", + "target": "country:US", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0010", + "target": "group:G0128", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0011", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0011", + "target": "atlas:AML.T0054", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0011", + "target": "group:G0069", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0012", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0013", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0013", + "target": "group:G0094", + "rel": "same-as" + }, + { + "source": "actor:AIRT-TA-0013", + "target": "sector:education", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0013", + "target": "sector:ngo-think-tank", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0014", + "target": "atlas:AML.T0008", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0014", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0014", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "atlas:AML.T0008.000", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "atlas:AML.T0034", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "country:CA", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "country:US", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "sector:defense-industrial-base", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "sector:education", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "sector:healthcare", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0015", + "target": "sector:research", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0016", + "target": "case:AIRT-CS-0018", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0017", + "target": "case:AIRT-CS-0020", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0018", + "target": "case:AIRT-CS-0021", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0019", + "target": "case:AIRT-CS-0022", + "rel": "attributed-to", + "confidence": "medium" + }, + { + "source": "actor:AIRT-TA-0019", + "target": "tool:AIRT-0001", + "rel": "abuses" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "atlas:AML.T0017.001", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "atlas:AML.T0116", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "atlas:AML.T0124", + "rel": "uses" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:critical-manufacturing", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:education", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:energy", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:financial-services", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:healthcare", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "actor:AIRT-TA-0020", + "target": "sector:retail", + "rel": "targets" + }, + { + "source": "atlas:AML.T0008", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0008.000", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0010", + "target": "tactic:AML.TA0004", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0011", + "target": "tactic:AML.TA0005", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0016.002", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0016.004", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0017.001", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0017.002", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0024", + "target": "tactic:AML.TA0010", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0034", + "target": "tactic:AML.TA0011", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0049", + "target": "tactic:AML.TA0004", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0051", + "target": "tactic:AML.TA0005", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0053", + "target": "tactic:AML.TA0005", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0053", + "target": "tactic:AML.TA0012", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0053", + "target": "tactic:AML.TA0015", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0054", + "target": "tactic:AML.TA0007", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0054", + "target": "tactic:AML.TA0012", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0055", + "target": "tactic:AML.TA0013", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0080", + "target": "tactic:AML.TA0006", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0080.000", + "target": "tactic:AML.TA0006", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0081", + "target": "tactic:AML.TA0006", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0081", + "target": "tactic:AML.TA0007", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0082", + "target": "tactic:AML.TA0013", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0086", + "target": "tactic:AML.TA0010", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0087", + "target": "tactic:AML.TA0002", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0096", + "target": "tactic:AML.TA0014", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0102", + "target": "tactic:AML.TA0001", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0103", + "target": "tactic:AML.TA0005", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0115.002", + "target": "tactic:AML.TA0003", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0116", + "target": "tactic:AML.TA0002", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0117", + "target": "tactic:AML.TA0001", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0124", + "target": "tactic:AML.TA0001", + "rel": "in-tactic" + }, + { + "source": "atlas:AML.T0126", + "target": "tactic:AML.TA0009", + "rel": "in-tactic" + }, + { + "source": "case:AIRT-CS-0001", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0001", + "target": "atlas:AML.T0010", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:binary:bun", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:commit:065ee8eb", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:directory:rt-*", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:file:core/telemetry/.loader.lock", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:file:core/telemetry/__init__.py", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:file:core/telemetry/_hooks.py", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "ioc:file:core/telemetry/_runtime.bin", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0001", + "target": "rule:ai_agent_credential_file_access.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0001", + "target": "tool:AIRT-0016", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0002", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0002", + "target": "atlas:AML.T0010", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0002", + "target": "atlas:AML.T0115.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0002", + "target": "ioc:account:phanpak", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0002", + "target": "ioc:email:phan@giftshop[.]club", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0002", + "target": "ioc:package:postmark-mcp@1.0.16", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0002", + "target": "rule:ai_agent_mcp_config_modification.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0002", + "target": "rule:mcp_config_tampering.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0002", + "target": "rule:mcp_outbound_unknown_domain.rules", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0002", + "target": "rule:mcp_tool_poisoning.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0003", + "target": "asi:ASI05", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0003", + "target": "atlas:AML.T0011", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0003", + "target": "malware:flodrix botnet", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0003", + "target": "rule:langflow_rce_exploitation_attempt.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0003", + "target": "rule:local_llm_listener_non_loopback.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0003", + "target": "tool:AIRT-0044", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0004", + "target": "asi:ASI01", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0004", + "target": "asi:ASI02", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0004", + "target": "atlas:AML.T0053", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0004", + "target": "atlas:AML.T0054", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0004", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0004", + "target": "atlas:AML.T0116", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0004", + "target": "atlas:AML.T0117", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0004", + "target": "campaign:C0062", + "rel": "same-as" + }, + { + "source": "case:AIRT-CS-0004", + "target": "rule:agentic_orchestration_behavior.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0004", + "target": "rule:ai_agent_spawning_lolbin.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0004", + "target": "rule:ai_agent_spawning_shell.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0004", + "target": "rule:mcp_server_remote_code_fetch.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0004", + "target": "sector:chemical", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0004", + "target": "sector:financial-services", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0004", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0004", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0004", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0005", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:domain:api.openai.com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:file:.exe.config containing appDomainManagerAssembly", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:file:C:\\Windows\\Temp\\*.Netapi64", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:file:C:\\Windows\\Temp\\Netapi64.Exception", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:file:C:\\Windows\\Temp\\Netapi64.start", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:file:Netapi64.dll", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:mutex:Netapi64", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:mutex:OpenAI APIS", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "ioc:process:OpenAIAgent.Netapi64", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0005", + "target": "rule:ai_service_api_c2.rules", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0005", + "target": "rule:sesameop_assistants_api_c2.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0006", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0006", + "target": "ioc:directory:%APPDATA%\\Microsoft\\Windows\\Start Menu\\Programs\\Startup", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0006", + "target": "ioc:domain:generativelanguage.googleapis.com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0006", + "target": "ioc:file:%TEMP%\\thinking_robot_log.txt", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0006", + "target": "rule:llm_api_prompt_in_script_generic.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0006", + "target": "rule:promptflux_artifacts_fileevent.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0006", + "target": "rule:promptflux_thinking_robot.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0006", + "target": "rule:runtime_ai_malware_correlation.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0006", + "target": "rule:script_interpreter_llm_api_dns.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0007", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0007", + "target": "country:UA", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0007", + "target": "ioc:domain:api-inference.huggingface.co", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0007", + "target": "ioc:file:Додаток.pdf.zip", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0007", + "target": "rule:llm_api_prompt_in_script_generic.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0007", + "target": "rule:promptsteal_lamehug.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0007", + "target": "rule:runtime_llm_api_c2.rules", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0007", + "target": "sector:defense-industrial-base", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0007", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0008", + "target": "asi:ASI01", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0008", + "target": "atlas:AML.T0024", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0008", + "target": "atlas:AML.T0051", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0008", + "target": "rule:ai_assistant_outbound_to_camo_proxy.rules", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0008", + "target": "rule:m365_copilot_anomalous_aggregation.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0008", + "target": "rule:m365_copilot_sensitive_label_access.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0008", + "target": "rule:markdown_image_exfil.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0009", + "target": "asi:ASI05", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0009", + "target": "rule:ai_agent_mcp_config_modification.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "rule:claude_desktop_config_modify.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "rule:mcp_config_tampering.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "rule:mcp_credential_access.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "rule:mcp_server_remote_code_fetch.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "rule:mcp_tool_poisoning.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0009", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0009", + "target": "tool:AIRT-0002", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0009", + "target": "tool:AIRT-0006", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0009", + "target": "tool:AIRT-0011", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0010", + "target": "asi:ASI06", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0010", + "target": "atlas:AML.T0080", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0010", + "target": "atlas:AML.T0080.000", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0010", + "target": "atlas:AML.T0086", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0010", + "target": "ioc:file:Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0010", + "target": "ioc:file:Framework checkpoint stores (LangGraph SQLite and equivalents)", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0010", + "target": "rule:copilot_rules_file_backdoor.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0010", + "target": "rule:markdown_image_exfil.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0010", + "target": "rule:memory_poisoning.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0010", + "target": "rule:memory_poisoning_indicators.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0011", + "target": "asi:ASI06", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0011", + "target": "atlas:AML.T0080", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0011", + "target": "ioc:url:Assistant URL carrying a pre-filled prompt in a query parameter", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0011", + "target": "rule:memory_poisoning.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0011", + "target": "rule:memory_poisoning_indicators.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0011", + "target": "sector:consumers", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0012", + "target": "asi:ASI06", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0012", + "target": "atlas:AML.T0082", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0012", + "target": "rule:chroma_sqlite_unexpected_writer.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0012", + "target": "rule:rag_document_hidden_text.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0012", + "target": "rule:vector_db_bulk_exfil.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0012", + "target": "rule:vector_db_query_anomaly.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0013", + "target": "atlas:AML.T0054", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0013", + "target": "atlas:AML.T0096", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0013", + "target": "country:MX", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0013", + "target": "rule:agentic_orchestration_behavior.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0013", + "target": "rule:ai_agent_spawning_shell.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0013", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0013", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0014", + "target": "campaign:C0045", + "rel": "same-as" + }, + { + "source": "case:AIRT-CS-0014", + "target": "ioc:process:XMRig or equivalent miner on a GPU host", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0014", + "target": "rule:gpu_unexpected_high_utilization.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0014", + "target": "rule:ray_dashboard_exposure.rules", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0014", + "target": "rule:ray_jobs_api_rce.rules", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0014", + "target": "rule:shadowray_process_masquerading.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0015", + "target": "asi:ASI02", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0015", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0015", + "target": "asi:ASI05", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0015", + "target": "atlas:AML.T0010", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0015", + "target": "atlas:AML.T0053", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0015", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0015", + "target": "attack:T1059", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0015", + "target": "attack:T1195.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0015", + "target": "attack:T1552.001", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0015", + "target": "ioc:file:/tmp/inventory.txt", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0015", + "target": "ioc:package:nx 20.9.0-20.12.0 and 21.5.0-21.8.0; @nx/devkit, @nx/js, @nx/workspace, @nx/node 21.5.0 and 20.9.0; @nx/eslint 21.5.0; @nx/key and @nx/enterprise-cloud 3.2.0", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0015", + "target": "rule:ai_agent_credential_file_access.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0015", + "target": "rule:ai_agent_spawning_shell.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0015", + "target": "rule:ai_cli_permission_bypass_invocation.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0015", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0015", + "target": "tool:AIRT-0008", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0015", + "target": "tool:AIRT-0037", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0016", + "target": "asi:ASI03", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0016", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0016", + "target": "atlas:AML.T0010", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "atlas:AML.T0081", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "atlas:AML.T0115.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "attack:T1070", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "attack:T1195.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "attack:T1552.001", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "ioc:directory:/.claude/, /.cursor/, /.vscode/", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0016", + "target": "ioc:package:tiktoken_mcp (PyPI)", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0016", + "target": "malware:dustmaker", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0016", + "target": "rule:ai_agent_hook_config_modification.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0016", + "target": "rule:ai_agent_mcp_config_modification.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0016", + "target": "rule:mcp_tool_poisoning.yar", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0016", + "target": "sector:software-supply-chain", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0016", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0016", + "target": "tool:AIRT-0002", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0017", + "target": "asi:ASI04", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0017", + "target": "asi:ASI05", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0017", + "target": "atlas:AML.T0011", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0017", + "target": "atlas:AML.T0081", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0017", + "target": "attack:T1195.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0017", + "target": "attack:T1546", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0017", + "target": "malware:sombermeme", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0017", + "target": "rule:ai_agent_hook_config_modification.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0017", + "target": "rule:ai_agent_spawning_shell.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0017", + "target": "sector:cryptocurrency", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0017", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0018", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0018", + "target": "atlas:AML.T0103", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0018", + "target": "atlas:AML.T0116", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0018", + "target": "atlas:AML.T0117", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0018", + "target": "attack:T1528", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0018", + "target": "attack:T1566", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0018", + "target": "country:UA", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:ad-g[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:api.stuseamandesilt[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:cdn.stuseamandesilt[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:cdncounter[.]net", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:chamber-ua[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:chathamhouse[.]eu", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:docs-viewer[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:itechx[.]tel", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:m365-owa[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:meridian-protocol[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:meridiangroup-corp[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:metricwave[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:mgsend[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:ms365-device[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:ms365-live[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:mslivetest.duckdns[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:my-invite[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:mygreatmarket[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:mygreatmarket[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:owa-ms365[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:pdfviewer2024.b-cdn[.]net", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:projectnightcrawler[.]dev", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:russianearabroad[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:russianearabroad[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:static-ms[.]live", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:static.cdncounter[.]net", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:statistic-ms[.]live", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:stuseamandesilt[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:teams.ms365-live[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:ukrinform-share[.]net", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:update.stuseamandesilt[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:wa-connect[.]eu", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:domain:wa-meeting[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:email:anna.manager@russianearabroad[.]net", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:email:events@embassy-protocol[.]int", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:file:WUEngine.exe", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:file:client_20260507093021_4286d211_x64.exe", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:file:fix_network.apk", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:file:msedgeupdate_v3.exe", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:hash:918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:hash:be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:104.145.210[.]184", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:104.194.149[.]228", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:104.194.151[.]133", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:104.194.159[.]55", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:144.172.114[.]192", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:148.135.195[.]111", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:149.54.42[.]106", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:185.198.234[.]101", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:185.198.234[.]26", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:2.26.53[.]194", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:213.145.86[.]112", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:31.57.243[.]154", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:38.146.28[.]132", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "ioc:ip:38.146.28[.]75", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0018", + "target": "sector:defense-industrial-base", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0018", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0018", + "target": "sector:ngo-think-tank", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0019", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0019", + "target": "atlas:AML.T0103", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0019", + "target": "atlas:AML.T0126", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0019", + "target": "attack:T1552.001", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0019", + "target": "attack:T1567", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0019", + "target": "country:FR", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:-1003311614569", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:-1003893854338", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:8179098353", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:8628746407", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:8632748474", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:8664033117", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:8709258476", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:account:https[:]//t[.]me/Soraki_Bot", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:ari-chain[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:arichain[.]network", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:autoshop.policenationale[.]cc", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:bitmart-mystery[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:defi-claim[.]xyz", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:emailsecure[.]email", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:esvfecawvjmchjslqyemho2fiduc59wzn.oast[.]fun", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:mozilla[.]ws", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:on-pssword[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:policenationale[.]cc", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:service-infos[.]info", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:signin-1psswoord[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers[.]dev", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:soraki[.]cc", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:soraki[.]work", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:domain:updatebeacon.duckdns[.]org", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:104.193.135[.]207", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:104.36.50[.]54", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:162.128.129[.]106", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:176.177.12[.]62", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:185.65.134[.]199", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:185.65.134[.]246", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:193.32.249[.]161", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:193.32.249[.]164", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:193.32.249[.]170", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:195.178.110[.]131", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:2a01:e0a:2e2:aa40:b15d:5d28:6f4a[:]8d53", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:2a04:cec0:1185:34f2:a150:7081:caed[:]448e", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:45.148.10[.]242", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:91.171.138[.]169", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:ip:92.118.39[.]3", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "ioc:url:https[:]//s3.eu-central-1.s4.mega[.]io/fuckyoubasil/", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0019", + "target": "sector:energy", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0019", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0019", + "target": "sector:retail", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0019", + "target": "sector:telecommunications", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0019", + "target": "sector:transportation", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0020", + "target": "atlas:AML.T0017.001", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0020", + "target": "atlas:AML.T0049", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0020", + "target": "atlas:AML.T0124", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0020", + "target": "attack:T1190", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:141.133.125[.]208", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:146.103.101[.]253", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:146.103.97[.]169", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:167.250.111[.]136", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:178.16.54[.]141", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:194.163.183[.]216", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:202.66.167[.]230", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "ioc:ip:37.27.103[.]22", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0020", + "target": "sector:commercial-facilities", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0020", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0021", + "target": "atlas:AML.T0016.002", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0021", + "target": "atlas:AML.T0049", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0021", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0021", + "target": "attack:T1190", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0021", + "target": "attack:T1505.003", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:domain:3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd[.]onion", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:domain:6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad[.]onion", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:domain:fafwatch[.]xyz", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:domain:frntrs-analytics-863060591218.europe-west1.run[.]app", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:domain:frntrs-analytics.dedyn[.]io", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:domain:prod-artfkt[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:103.124.165[.]199", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:103.141.60[.]144", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:103.216.220[.]19", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:136.144.242[.]56", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:138.199.60[.]29", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:138.199.6[.]208", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:139.59.2[.]243", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:146.70.116[.]131", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:149.22.83[.]6", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:158.173.46[.]118", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:163.172.157[.]53", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:2001:ac8:27[:]89::a02d", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:2001:ac8:29[:]84::a01d", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:2001:bc8:711:5854:dc00:1ff:fe18[:]ba53", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:34.156.199[.]132", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "ioc:ip:34.156.95[.]176", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0021", + "target": "sector:government", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0021", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0021", + "target": "sector:media-entertainment", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0021", + "target": "sector:ngo-think-tank", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0022", + "target": "asi:ASI03", + "rel": "maps-to" + }, + { + "source": "case:AIRT-CS-0022", + "target": "atlas:AML.T0034", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0022", + "target": "atlas:AML.T0055", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0022", + "target": "attack:T1557", + "rel": "uses" + }, + { + "source": "case:AIRT-CS-0022", + "target": "ioc:domain:aws-us-east-3[.]com", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0022", + "target": "ioc:domain:awstore[.]cloud", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0022", + "target": "ioc:domain:holdboost[.]store", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0022", + "target": "ioc:domain:iymkjuzymkapovrntoxy.supabase[.]co", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0022", + "target": "ioc:domain:kiro[.]cheap", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0022", + "target": "ioc:domain:sys-tools[.]cfd", + "rel": "indicator" + }, + { + "source": "case:AIRT-CS-0022", + "target": "rule:ai_inference_endpoint_redirection.yml", + "rel": "detected-by" + }, + { + "source": "case:AIRT-CS-0022", + "target": "sector:consumers", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0022", + "target": "sector:information-technology", + "rel": "targets" + }, + { + "source": "case:AIRT-CS-0022", + "target": "tool:AIRT-0001", + "rel": "affects" + }, + { + "source": "case:AIRT-CS-0022", + "target": "tool:AIRT-0041", + "rel": "affects" + }, + { + "source": "country:CA", + "target": "region:Americas", + "rel": "in-region" + }, + { + "source": "country:FR", + "target": "region:Europe", + "rel": "in-region" + }, + { + "source": "country:MX", + "target": "region:Americas", + "rel": "in-region" + }, + { + "source": "country:UA", + "target": "region:Europe", + "rel": "in-region" + }, + { + "source": "country:US", + "target": "region:Americas", + "rel": "in-region" + }, + { + "source": "rule:agentic_orchestration_behavior.yml", + "target": "atlas:AML.T0053", + "rel": "detects" + }, + { + "source": "rule:agentic_orchestration_behavior.yml", + "target": "atlas:AML.T0054", + "rel": "detects" + }, + { + "source": "rule:agentic_orchestration_behavior.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:agentic_orchestration_behavior.yml", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:ai_agent_autostart_persistence.yml", + "target": "atlas:AML.T0081", + "rel": "detects" + }, + { + "source": "rule:ai_agent_credential_file_access.yml", + "target": "atlas:AML.T0055", + "rel": "detects" + }, + { + "source": "rule:ai_agent_docker_socket_mount.yml", + "target": "atlas:AML.T0053", + "rel": "detects" + }, + { + "source": "rule:ai_agent_hook_config_modification.yml", + "target": "atlas:AML.T0081", + "rel": "detects" + }, + { + "source": "rule:ai_agent_mcp_config_modification.yml", + "target": "atlas:AML.T0081", + "rel": "detects" + }, + { + "source": "rule:ai_agent_spawning_lolbin.yml", + "target": "atlas:AML.T0053", + "rel": "detects" + }, + { + "source": "rule:ai_agent_spawning_shell.yml", + "target": "atlas:AML.T0053", + "rel": "detects" + }, + { + "source": "rule:ai_assistant_outbound_to_camo_proxy.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:ai_cli_permission_bypass_invocation.yml", + "target": "atlas:AML.T0053", + "rel": "detects" + }, + { + "source": "rule:ai_inference_endpoint_redirection.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:ai_service_api_c2.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:ai_service_api_c2.rules", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:azure_openai_injection.yml", + "target": "atlas:AML.T0051", + "rel": "detects" + }, + { + "source": "rule:azure_openai_injection.yml", + "target": "atlas:AML.T0054", + "rel": "detects" + }, + { + "source": "rule:bedrock_high_token_usage.yml", + "target": "atlas:AML.T0051", + "rel": "detects" + }, + { + "source": "rule:bedrock_high_token_usage.yml", + "target": "atlas:AML.T0054", + "rel": "detects" + }, + { + "source": "rule:browser_agent_session_state_capture.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:chatgpt_paste_sensitive_data.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:claude_desktop_config_modify.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:claude_session_jsonl_unexpected_access.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:copilot_rules_file_backdoor.yar", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:cursor_settings_db_modification.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:github_copilot_yolo_mode_enabled.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:github_copilot_yolo_mode_enabled.yml", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:huggingface_cache_unexpected_writer.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:huggingface_token_exposure.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:jailbreak_personas.yml", + "target": "atlas:AML.T0054", + "rel": "detects" + }, + { + "source": "rule:langflow_rce_exploitation_attempt.yml", + "target": "atlas:AML.T0053", + "rel": "detects" + }, + { + "source": "rule:llm_api_prompt_in_script_generic.yar", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:llm_response_base64_exfil.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:local_llm_listener_non_loopback.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:m365_copilot_anomalous_aggregation.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:m365_copilot_anomalous_aggregation.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:m365_copilot_sensitive_label_access.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:markdown_image_exfil.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:mcp_config_tampering.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:mcp_credential_access.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:mcp_outbound_unknown_domain.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:mcp_outbound_unknown_domain.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:mcp_tool_poisoning.yar", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:mcp_tool_poisoning.yar", + "target": "atlas:AML.T0115.002", + "rel": "detects" + }, + { + "source": "rule:memory_poisoning.yml", + "target": "atlas:AML.T0080", + "rel": "detects" + }, + { + "source": "rule:memory_poisoning.yml", + "target": "atlas:AML.T0080.000", + "rel": "detects" + }, + { + "source": "rule:memory_poisoning.yml", + "target": "atlas:AML.T0081", + "rel": "detects" + }, + { + "source": "rule:memory_poisoning.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:memory_poisoning_indicators.yar", + "target": "atlas:AML.T0080.000", + "rel": "detects" + }, + { + "source": "rule:memory_poisoning_indicators.yar", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:mlflow_path_traversal.rules", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:mlflow_path_traversal.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:mlflow_path_traversal.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:mlflow_unauth_api_access.yml", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:model_file_hash_mismatch.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:ollama_vllm_unauth_exposure.rules", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:ollama_vllm_unauth_exposure.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:pickle_malicious_opcodes.yar", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:pickle_malicious_opcodes.yar", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:pip_install_typosquat.yml", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:powershell_llm_api_command_generation.yml", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:prompt_injection_keywords.yml", + "target": "atlas:AML.T0051", + "rel": "detects" + }, + { + "source": "rule:promptflux_artifacts_fileevent.yml", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:promptflux_thinking_robot.yar", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:promptsteal_lamehug.yar", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:ray_dashboard_exposure.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:ray_jobs_api_rce.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:ray_jobs_api_rce.rules", + "target": "atlas:AML.T0049", + "rel": "detects" + }, + { + "source": "rule:ray_jobs_api_rce.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:runtime_ai_malware_correlation.yml", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:runtime_llm_api_c2.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:runtime_llm_api_c2.rules", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:script_interpreter_llm_api_dns.yml", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:script_interpreter_llm_api_dns.yml", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:sesameop_assistants_api_c2.yml", + "target": "atlas:AML.T0096", + "rel": "detects" + }, + { + "source": "rule:shadowray_process_masquerading.yml", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:ssh_authorized_keys_injection.yml", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:system_prompt_extraction.yml", + "target": "atlas:AML.T0054", + "rel": "detects" + }, + { + "source": "rule:torchserve_shelltorch.rules", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:torchserve_shelltorch.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:triton_inference_server_exploit.rules", + "target": "atlas:AML.T0010", + "rel": "detects" + }, + { + "source": "rule:triton_inference_server_exploit.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:triton_inference_server_exploit.rules", + "target": "atlas:AML.T0086", + "rel": "detects" + }, + { + "source": "rule:vector_db_bulk_exfil.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:vector_db_query_anomaly.yml", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "rule:vector_db_query_anomaly.yml", + "target": "atlas:AML.T0051", + "rel": "detects" + }, + { + "source": "rule:vector_db_unauth_exposure.rules", + "target": "atlas:AML.T0011", + "rel": "detects" + }, + { + "source": "rule:vector_db_unauth_exposure.rules", + "target": "atlas:AML.T0024", + "rel": "detects" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/anthropic-api-key", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/anthropic-auth-token", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/claude-code-oauth-token", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/claude-config-dir-credentials-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/claude-credentials-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/claude-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/config-anthropic-configs", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/macos-login-keychain-library-keychains-login-keychain-db", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/macos-login-keychain-mcp-remote-server-oauth-credentials", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/credential/project-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/appdata-npm-claude-cmd", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/appdata-npm-node-modules-anthropic-ai-claude-code", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/claude-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/local-bin-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/repo-claude-md", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/repo-claude-settings-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/repo-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/disk/usr-local-bin-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/mcp-config/claude-json-mcpservers-user-scope", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/mcp-config/repo-claude-settings-local-json-enabledmcpjsonservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/mcp-config/repo-mcp-json-mcpservers-project-scope", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/network/api-anthropic-com-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/network/claude-ai-installer-statsig-anthropic-com-telemetry-443-", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/process/claude-node", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/process/node-exe-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/registry/hkcu-environment-openai-api-key-anthropic-api-key-anthro", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0001", + "target": "artifact:AIRT-0001/registry/hklm-software-microsoft-cryptography-machineguid", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/appdata-cursor-user-globalstorage-state-vscdb", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/config-cursor-auth-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/config-cursor-user-globalstorage-state-vscdb", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/cursor-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/library-application-support-cursor-user-globalstorage-st", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/macos-login-keychain-generic-password-service-cursor-saf", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/macos-login-keychain-generic-password-services-cursor-ac", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/credential/repo-cursor-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/appdata-cursor-user", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/appdata-cursor-user-skills", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/config-cursor-user", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/cursor-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/library-application-support-cursor-user", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/localappdata-cursor-updater", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/localappdata-programs-cursor", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/localappdata-programs-cursor-cursor-exe", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/localappdata-programs-cursor-resources-app-bin-cursor", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/repo-cursor-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/disk/repo-cursorrules-repo-cursor-rules-mdc", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/mcp-config/cursor-mcp-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/mcp-config/repo-cursor-mcp-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/network/cursor-sh-api2-cursor-sh-anysphere-co-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/process/cursor-exe", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/registry/hkcu-software-classes-cursor-shell-open-command-default", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-run-curso", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0002", + "target": "artifact:AIRT-0002/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/appdata-windsurf-user-globalstorage-state-vscdb", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/codeium-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/codeium-windsurf-mcp-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/config-windsurf-user-globalstorage-state-vscdb", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/library-application-support-windsurf-user-globalstorage-", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/nvim-stdpath-cache-codeium-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/credential/userprofile-codeium-windsurf-mcp-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/disk/codeium", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/disk/codeium-version-language-server", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/disk/codeium-windsurf-mcp-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/disk/repo-windsurf-settings-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/disk/repo-windsurfrules", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/disk/userprofile-codeium-windsurf-mcp-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/mcp-config/codeium-mcp-config-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/mcp-config/codeium-windsurf-mcp-config-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/network/server-codeium-com-codeium-com-windsurf-com-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0006", + "target": "artifact:AIRT-0006/process/windsurf-exe-language-server-windows-x64-exe", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/credential/aws-sso-cache-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/aws-amazonq-cli-agents-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/local-share-amazon-q-data-sqlite3", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/local-share-amazon-q-settings-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-iam-bin", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/node-language-server-build-aws-lsp-codewhisperer-token-b", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/repo-amazonq-cli-agents-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/repo-amazonq-rules-md", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/userprofile-vscode-extensions-amazonwebservices-amazon-q", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/disk/xdg-runtime-dir-qlog-cli-log", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/mcp-config/aws-amazonq-default-json-agent-configuration-global-scop", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/mcp-config/aws-amazonq-mcp-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/mcp-config/repo-amazonq-default-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/mcp-config/repo-amazonq-mcp-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/network/q-us-east-1-amazonaws-com-codewhisperer-amazonaws-com-aw", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0008", + "target": "artifact:AIRT-0008/process/node-aws-lsp-codewhisperer-token-binary-js", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/credential/appdata-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/credential/claude-desktop-config-json-mcpservers-name-env", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/credential/config-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/credential/library-application-support-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/appdata-claude-claude-desktop-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/appdata-claude-logs-mcp-log", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/applications-claude-app", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/applications-claude-app-2", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/config-claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/config-claude-ant-did", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/config-claude-claude-desktop-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/config-claude-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/config-claude-logs-mcp-log", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/library-application-support-claude-claude-desktop-config", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/library-logs-claude-mcp-log", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/library-preferences-com-anthropic-claudefordesktop-plist", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/disk/mcpb-desktop-extension", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/mcp-config/appdata-claude-claude-desktop-config-json-mcpservers-nam", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/mcp-config/config-claude-claude-desktop-config-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/mcp-config/library-application-support-claude-claude-desktop-config", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/mcp-config/localappdata-packages-claude-pzs8sxrjxfjjc-localcache-ro", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/mcp-config/mcpb-dxt-bundle-files-manifest-json-inside-archive", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/network/api-anthropic-com-claude-ai-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/network/registry-npmjs-org-npx-mcp-server-fetch-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/process/claude", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/process/claude-exe", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/registry/hkcu-software-classes-activatableclasses-package-claude-", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/registry/hkcu-software-classes-claude-shell-open-command-default", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-run-claud", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0011", + "target": "artifact:AIRT-0011/registry/hkcu-software-microsoft-windows-currentversion-uninstall", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0016", + "target": "artifact:AIRT-0016/credential/install-config-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0016", + "target": "artifact:AIRT-0016/credential/install-data-database-pythagora-db", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0016", + "target": "artifact:AIRT-0016/credential/install-pilot-env", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0016", + "target": "artifact:AIRT-0016/credential/openai-api-key-anthropic-api-key-groq-api-key", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0016", + "target": "artifact:AIRT-0016/registry/hkcu-environment-openai-api-key-anthropic-api-key-groq-a", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/credential/gemini-env", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/credential/gemini-google-accounts-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/credential/gemini-oauth-creds-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/disk/etc-gemini-cli-settings-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/disk/gemini-npm-g-google-gemini-cli", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/disk/gemini-settings-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/mcp-config/gemini-settings-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/mcp-config/repo-gemini-settings-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/network/generativelanguage-googleapis-com-oauth2-googleapis-com-", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0037", + "target": "artifact:AIRT-0037/process/gemini-node", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/credential/aws-builder-id-iam-identity-center-token-cache", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/credential/mcpservers-name-env-inside-kiro-settings-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/kiro-mcp-logs-view-output-channel", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/kiro-settings-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/power-md-plugin-json-dev-kiro", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/repo-kiro-agents", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/repo-kiro-hooks-kiro-hook", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/repo-kiro-settings-mcp-json", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/repo-kiro-specs", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/repo-kiro-steering-md", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/disk/vs-code-style-globalstorage-extensions-and-state-vscdb-p", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/mcp-config/kiro-settings-mcp-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/mcp-config/repo-kiro-settings-mcp-json-mcpservers", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/network/kiro-dev-aws-kiro-service-endpoints-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/network/kiro-url-scheme-and-https-kiro-dev-launch-mcp-add-name-c", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0041", + "target": "artifact:AIRT-0041/process/kiro-ide-kiro-cli", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/appdata-com-langflowdesktop-data-database-db", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-config-dir-private-key-pem-public-key-pem-along", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-config-dir-secret-key-default-home-cache-langfl", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-data-database-db", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-database-url", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-db-pip-install-install-lib-python3-x-site-packa", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-secret-key", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/langflow-superuser-langflow-superuser-password", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/credential/project-env-path-passed-to-langflow-run-env-file", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/disk/exported-flow-json-files", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/disk/langflow", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/disk/langflow-auto-login", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/disk/langflow-db-sqlite-in-the-config-dir", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/disk/langflow-superuser-langflow-superuser-password", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/eventlog/microsoft-windows-sysmon-operational-eid-1", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/mcp-config/langflow-projects-published-as-mcp-tools-each-project-is", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/mcp-config/mcp-server-registrations-added-in-settings-mcp-servers-p", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/network/configured-llm-provider-endpoints-443-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/network/langflow-web-ui-api-7860-tcp", + "rel": "leaves" + }, + { + "source": "tool:AIRT-0044", + "target": "artifact:AIRT-0044/process/python-langflow-run-uvicorn", + "rel": "leaves" + } + ] + } +} diff --git a/artifacts/docs/api/stix/ai-dfir-intel.json b/artifacts/docs/api/stix/ai-dfir-intel.json new file mode 100644 index 0000000..bb4bffc --- /dev/null +++ b/artifacts/docs/api/stix/ai-dfir-intel.json @@ -0,0 +1,9105 @@ +{ + "type": "bundle", + "id": "bundle--fcb23102-d85a-5b74-b3f3-33f15de3de3d", + "objects": [ + { + "type": "identity", + "spec_version": "2.1", + "id": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "ai-dfir-toolkit", + "identity_class": "organization", + "description": "Open AI-agent artifact catalog and detection content." + }, + { + "type": "marking-definition", + "spec_version": "2.1", + "id": "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6", + "created": "2026-09-10T00:00:00.000Z", + "definition_type": "statement", + "name": "CC BY 4.0", + "definition": { + "statement": "Catalog data licensed CC BY 4.0 - ai-dfir-toolkit. Indicators are republished from the cited reports." + } + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "APT28", + "description": "Russian military intelligence (GRU unit 26165) group. It is the first state actor publicly reported running LLM-querying malware in live operations: PROMPTSTEAL, which CERT-UA tracks as LAMEHUG, asked a hosted model for collection commands against Ukrainian targets. Earlier AI use reported by Microsoft was research and scripting assistance.", + "aliases": [ + "Fancy Bear", + "Forest Blizzard", + "FROZENLAKE", + "UAC-0001" + ], + "confidence": 85, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0001" + }, + { + "source_name": "mitre-attack", + "external_id": "G0007", + "url": "https://attack.mitre.org/groups/G0007/" + }, + { + "source_name": "CERT-UA #16039 - LAMEHUG (17 Jul 2025)", + "url": "https://cert.gov.ua/article/6284730" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "source_name": "Microsoft Threat Intelligence - Staying ahead of threat actors in the age of AI (14 Feb 2024)", + "url": "https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "Generative AI", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0016.002", + "url": "https://atlas.mitre.org/techniques/AML.T0016.002" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9babee94-2bdf-55f1-ae41-ed24d3cc9c22", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "AI Service API", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0096", + "url": "https://atlas.mitre.org/techniques/AML.T0096" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--1cf26102-f976-56b7-8e4b-bdd9f1f9e230", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--b9f904ed-2653-571d-948a-b6a6ca85801d", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "Generate Malicious Commands", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0102", + "url": "https://atlas.mitre.org/techniques/AML.T0102" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b44f6bb3-2a15-5f02-bf62-58b67ef4db02", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "attack-pattern--b9f904ed-2653-571d-948a-b6a6ca85801d" + }, + { + "type": "malware", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "malware--25a1b406-3f77-5f31-8012-8e024be79dc9", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "PROMPTSTEAL", + "is_family": true + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8a0bb86d-6a94-506b-b6dd-1c335e455050", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "malware--25a1b406-3f77-5f31-8012-8e024be79dc9" + }, + { + "type": "malware", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "malware--7a1ab6dd-cb36-5360-8134-2f677ba9bf80", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "LAMEHUG", + "is_family": true + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--67023f1f-76d6-5bed-b98f-06357a382438", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "malware--7a1ab6dd-cb36-5360-8134-2f677ba9bf80" + }, + { + "type": "location", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "location--c10b615d-b039-5eb1-bf2b-bc878b6609fc", + "created": "2025-06-01T00:00:00.000Z", + "modified": "2025-06-01T00:00:00.000Z", + "name": "UA", + "country": "UA" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ce3d9071-3490-5cf2-9385-15a87a8769e1", + "created": "2025-06-01T00:00:00.000Z", + "modified": "2025-06-01T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "location--c10b615d-b039-5eb1-bf2b-bc878b6609fc" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "GTG-1002", + "description": "Anthropic's designation for a cluster it assessed with high confidence to be a Chinese state-sponsored group. The cluster built a framework around Claude Code and MCP tools that ran most of an intrusion campaign against about thirty organisations. MITRE catalogues the activity as ATT&CK campaign C0062 and ATLAS case study AML.CS0069.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0002" + }, + { + "source_name": "Anthropic - Disrupting the first reported AI-orchestrated cyber espionage campaign (13 Nov 2025)", + "url": "https://www.anthropic.com/news/disrupting-AI-espionage" + }, + { + "source_name": "MITRE ATLAS - AML.CS0069", + "url": "https://atlas.mitre.org/studies/AML.CS0069" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--2b945796-1022-5264-a3d0-e151106d8ab7", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "AI Agent Tool Invocation", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0053", + "url": "https://atlas.mitre.org/techniques/AML.T0053" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--31c91cf3-6a6f-5a20-9264-adcd6bd1f825", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "attack-pattern--2b945796-1022-5264-a3d0-e151106d8ab7" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--f5b24b34-1130-53de-9455-2dda3936a632", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "LLM Jailbreak", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0054", + "url": "https://atlas.mitre.org/techniques/AML.T0054" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b5beeb2d-e1fb-5cc2-a83f-1b0a52703942", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "attack-pattern--f5b24b34-1130-53de-9455-2dda3936a632" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b7315371-9a08-554d-ae23-df0a4a121bbd", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "Autonomous Reconnaissance", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0116", + "url": "https://atlas.mitre.org/techniques/AML.T0116" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d422fb33-aed6-5502-9674-fa403b323902", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--9b4d2a22-c803-5df9-868b-5cd3680c2487", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "Autonomous Attack-Path Adaptation", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0117", + "url": "https://atlas.mitre.org/techniques/AML.T0117" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--24169da7-50c1-5d4b-829f-0dfc33ee8c2f", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "attack-pattern--9b4d2a22-c803-5df9-868b-5cd3680c2487" + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "AIRT-0001", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0001" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c87b4759-352c-56fc-8e34-52dc9b8112b3", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "GTG-2002", + "description": "Anthropic's designation for a data-extortion operator that used Claude Code to automate reconnaissance, credential harvesting and network penetration. Anthropic also reports the model analysed stolen financial data to set ransom demands, some above USD 500,000. At least 17 organisations were affected, in healthcare, emergency services, government and religious institutions.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0003" + }, + { + "source_name": "Anthropic - Detecting and countering misuse of AI: August 2025", + "url": "https://www.anthropic.com/news/detecting-countering-misuse-aug-2025" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "Unsecured Credentials", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0055", + "url": "https://atlas.mitre.org/techniques/AML.T0055" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--cd49bb14-f5f1-503b-bf38-f14716cbaff1", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--c6dff4d5-68a2-5269-ba49-a64550631752", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "Deploy AI Agent", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0103", + "url": "https://atlas.mitre.org/techniques/AML.T0103" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--0d82f103-04f4-5984-a879-8a9ac5b63f32", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "attack-pattern--c6dff4d5-68a2-5269-ba49-a64550631752" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--f5732656-e1fa-53f4-ba3d-3592439e5fbd", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--17c5750e-dc57-5540-9724-fed11413bc05", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--1b74fcaf-1c57-57d5-8fe8-70e4c69a7e36", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "healthcare", + "identity_class": "class", + "sectors": [ + "healthcare" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a96bc7ce-15bf-57e9-a55a-8efbd3b3ca9f", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "identity--1b74fcaf-1c57-57d5-8fe8-70e4c69a7e36" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--2e4debf6-367c-5116-85d8-57df34d5d80f", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "emergency-services", + "identity_class": "class", + "sectors": [ + "emergency-services" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--efee3ba7-f193-5837-8c9d-affc2c6a2e1c", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "identity--2e4debf6-367c-5116-85d8-57df34d5d80f" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--5d5cb585-02af-535f-865e-ff58cf584edc", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "government", + "identity_class": "class", + "sectors": [ + "government" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7c6f2489-3a01-5206-9d8c-287d5effff22", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--d345b3eb-72c9-5d33-a296-b475299949e8", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "name": "religious-institutions", + "identity_class": "class", + "sectors": [ + "religious-institutions" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2f07f2bb-ac90-5d32-9e02-d7b29fcc51b8", + "created": "2025-08-27T00:00:00.000Z", + "modified": "2025-08-27T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--9c5bfac7-8e73-516c-893c-5ff9354e8750", + "target_ref": "identity--d345b3eb-72c9-5d33-a296-b475299949e8" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "MIDNIGHT NEPTUNE", + "description": "GTIG's name for financially motivated North Korea-nexus clusters focused on cryptocurrency theft. Reported AI use has moved from researching wallet locations with Gemini in 2025 to poisoning repository configuration and Claude Code hooks to deliver the SOMBERMEME backdoor in 2026.", + "aliases": [ + "UNC1069", + "MASAN" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0004" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--da2fef0c-c8e7-5a2d-ab67-cd7680462c67", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "User Execution", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0011", + "url": "https://atlas.mitre.org/techniques/AML.T0011" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--921ec864-9243-5db1-9860-b4d3a1c5982e", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "attack-pattern--da2fef0c-c8e7-5a2d-ab67-cd7680462c67" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9208db81-f8c0-5332-8ebe-da4109889ab3", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--a37e2a7e-23b4-571d-afa6-73dac4590f7e", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "Modify AI Agent Configuration", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0081", + "url": "https://atlas.mitre.org/techniques/AML.T0081" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8313b201-7b1d-5a44-ab15-a2469fdc393c", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "attack-pattern--a37e2a7e-23b4-571d-afa6-73dac4590f7e" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--751a75d6-e12e-5a99-9e9c-0c1883bb882c", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "Compromise Software Supply Chain", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1195.002", + "url": "https://attack.mitre.org/techniques/T1195/002/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c1d331c0-5858-5f08-a423-f1e857b93f08", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "attack-pattern--751a75d6-e12e-5a99-9e9c-0c1883bb882c" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--09eb89f6-87ce-53eb-b768-5426676a32b3", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "Event Triggered Execution", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1546", + "url": "https://attack.mitre.org/techniques/T1546/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--1e66ba1c-5cf9-5a10-a194-d95b4396400c", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "attack-pattern--09eb89f6-87ce-53eb-b768-5426676a32b3" + }, + { + "type": "malware", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "malware--5fded42a-94f3-5ac1-8fbf-c57c24133c73", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "SOMBERMEME", + "is_family": true + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--afe79c72-97ca-5dd8-9692-fa5d5dae1fd6", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "malware--5fded42a-94f3-5ac1-8fbf-c57c24133c73" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--060468b3-1f0a-53b4-96f5-f5455e1d8cb7", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--316af603-b03d-5e66-b713-60c36994b132", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "cryptocurrency", + "identity_class": "class", + "sectors": [ + "cryptocurrency" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--78a98e01-27bc-59a7-ab7e-6fe0f3c34488", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "target_ref": "identity--316af603-b03d-5e66-b713-60c36994b132" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "UNC6780", + "description": "GTIG's cluster for a financially motivated supply-chain operator. In 2026 it compromised developer tooling and AI plumbing: Trivy, Checkmarx, the LiteLLM gateway, and trojanised forks of MCP servers. Its DUSTMAKER stealer writes into the workspace directories AI coding assistants read.", + "aliases": [ + "TeamPCP" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0005" + }, + { + "source_name": "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--7155f61f-f788-55aa-8b08-0c26c6f1e139", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "AI Supply Chain Compromise", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0010", + "url": "https://atlas.mitre.org/techniques/AML.T0010" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6cd8d3ae-8768-5239-b0bd-063ddcf45957", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--7155f61f-f788-55aa-8b08-0c26c6f1e139" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ee65df10-093f-5783-80e7-f20994091de8", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d827066a-83ce-590c-adf5-65018478631b", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--a37e2a7e-23b4-571d-afa6-73dac4590f7e" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--12763f9b-0599-54fc-9714-c251137ddcf5", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "AI Agent Tools", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0115.002", + "url": "https://atlas.mitre.org/techniques/AML.T0115.002" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9e3a310d-14c4-5fb4-ab5a-0a2c6791a07c", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--12763f9b-0599-54fc-9714-c251137ddcf5" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--b64d656b-8a6a-54a2-bd68-436a0856829b", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "Indicator Removal", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1070", + "url": "https://attack.mitre.org/techniques/T1070/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7aa0f151-57a0-59ed-a274-dc17e91840bd", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--b64d656b-8a6a-54a2-bd68-436a0856829b" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d972b1fd-c1b8-58b7-8792-50fc1025d487", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--751a75d6-e12e-5a99-9e9c-0c1883bb882c" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--2339d29a-b18d-53ea-8c53-cba484d8d811", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "Credentials In Files", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1552.001", + "url": "https://attack.mitre.org/techniques/T1552/001/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--845b77f8-512e-5bdd-aab7-1cf6adcc7b97", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "attack-pattern--2339d29a-b18d-53ea-8c53-cba484d8d811" + }, + { + "type": "malware", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "malware--04d224b5-44f0-5e2b-969f-44d2dfaeadf1", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "DUSTMAKER", + "is_family": true + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--47d945a0-6987-5be5-a21a-127633adc329", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "malware--04d224b5-44f0-5e2b-969f-44d2dfaeadf1" + }, + { + "type": "malware", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "malware--fc703540-ca60-502d-9be0-87c9b4dd03c8", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "SANDCLOCK", + "is_family": true + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--0658fb05-5739-5f90-b0e1-f23318c54ec8", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "malware--fc703540-ca60-502d-9be0-87c9b4dd03c8" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--dc5ad198-7188-5678-9474-091bc0d1e267", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--81278db8-20de-540c-9afc-2303c5262729", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "AIRT-0002", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0002" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--dd1a7ab0-605c-55b1-a7f7-e4e70876dfc6", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "tool--81278db8-20de-540c-9afc-2303c5262729" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--4bdf61e9-6071-5cfe-a1be-b98b1e857af8", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "software-supply-chain", + "identity_class": "class", + "sectors": [ + "software-supply-chain" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9bb32c65-db33-544b-8f9a-00e5e1013f6a", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "target_ref": "identity--4bdf61e9-6071-5cfe-a1be-b98b1e857af8" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "ShinyHunters", + "description": "A high-volume SaaS data-theft and extortion group. GTIG reports it integrated Claude Code, configured with custom MCP tools, to parse and analyse exfiltrated directories for extortion, and used AI to write obfuscated code and get past perimeter defences.", + "aliases": [ + "UNC6240" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0006" + }, + { + "source_name": "mitre-attack", + "external_id": "G1057", + "url": "https://attack.mitre.org/groups/G1057/" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50014 ShinyHunters smash-and-grab opportunists", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--35208bcb-cfb2-57e4-8c8d-f51b733e32c3", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6b0eff51-a5b4-5b0b-809f-330274540ad0", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "attack-pattern--c6dff4d5-68a2-5269-ba49-a64550631752" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--d769b860-e3c7-55c9-ae11-83cdf3c2b09d", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "Automated Collection", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0126", + "url": "https://atlas.mitre.org/techniques/AML.T0126" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9b50b184-de08-58fb-9474-f9894ae7e47e", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "attack-pattern--d769b860-e3c7-55c9-ae11-83cdf3c2b09d" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--623ee9a6-ab31-5f18-9d52-8d038f6a7d4c", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "attack-pattern--2339d29a-b18d-53ea-8c53-cba484d8d811" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--01865f34-5f5f-51d1-8f1a-51ff58f3c563", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "Exfiltration Over Web Service", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1567", + "url": "https://attack.mitre.org/techniques/T1567/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9b369baa-559e-5672-8357-e179fc0c73bb", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "attack-pattern--01865f34-5f5f-51d1-8f1a-51ff58f3c563" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--337823b5-b1d4-5b61-92a7-188c777768cc", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--e55086c4-2284-53d8-8072-d0c42fe13709", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "information-technology", + "identity_class": "class", + "sectors": [ + "information-technology" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ffcf1951-4caa-5c51-9b62-f3fa8047faef", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "identity--e55086c4-2284-53d8-8072-d0c42fe13709" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--da0f6886-7b10-5ada-9f77-068d3223a407", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "APT42", + "description": "Iranian government-backed group whose reported AI use centres on phishing and reconnaissance. GTIG also reports an attempt to build a Data Processing Agent that turned natural-language requests into SQL over sensitive personal data, and later work on EDR bypass.", + "aliases": [ + "CALANQUE ION" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0007" + }, + { + "source_name": "mitre-attack", + "external_id": "G1044", + "url": "https://attack.mitre.org/groups/G1044/" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "source_name": "GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration of AI for Adversarial Use (12 Feb 2", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a8946e3c-314b-5ea9-9388-22d3b47a2000", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--da0f6886-7b10-5ada-9f77-068d3223a407", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--2539f8c7-ebc1-5d79-8fd0-4ff09a51c73e", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "AI Agent Tools", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0017.002", + "url": "https://atlas.mitre.org/techniques/AML.T0017.002" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--bc89e21d-0895-5a66-aadc-02e9c80840a7", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--da0f6886-7b10-5ada-9f77-068d3223a407", + "target_ref": "attack-pattern--2539f8c7-ebc1-5d79-8fd0-4ff09a51c73e" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--e9341715-6f01-5209-8755-4f355ad129f1", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "Gather Victim Identity Information", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0087", + "url": "https://atlas.mitre.org/techniques/AML.T0087" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--33c8a9c5-32a0-5ed4-887a-ea8cffd43ddc", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--da0f6886-7b10-5ada-9f77-068d3223a407", + "target_ref": "attack-pattern--e9341715-6f01-5209-8755-4f355ad129f1" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--ad8ae22a-53b2-526b-8141-9f34a4a7eed4", + "created": "2025-08-01T00:00:00.000Z", + "modified": "2025-08-01T00:00:00.000Z", + "name": "APT41", + "description": "PRC-backed group that GTIG observed using Gemini throughout August 2025 for C++ and Go development, including an OSSTUN command-and-control framework, and later for tooling development and code translation.", + "aliases": [ + "Brass Typhoon" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0008" + }, + { + "source_name": "mitre-attack", + "external_id": "G0096", + "url": "https://attack.mitre.org/groups/G0096/" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + }, + { + "source_name": "GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration of AI for Adversarial Use (12 Feb 2", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9f591a5c-5a6f-54de-a1d7-8e4fffb33165", + "created": "2025-08-01T00:00:00.000Z", + "modified": "2025-08-01T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--ad8ae22a-53b2-526b-8141-9f34a4a7eed4", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--2e8a0c0c-ec2b-5a65-93ee-7bb22df3a666", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "Sandworm", + "description": "Russian group that GTIG reports integrated Gemini into operations against Ukraine. It used the model for AI-themed phishing domains, automated password spraying and host profiling, and called the Gemini API directly from its own automation.", + "aliases": [ + "APT44", + "SANDWORM RELIC", + "FROZENBARENTS" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0009" + }, + { + "source_name": "mitre-attack", + "external_id": "G0034", + "url": "https://attack.mitre.org/groups/G0034/" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2fe3b7e5-9408-5343-8910-c40df4dd0f72", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--2e8a0c0c-ec2b-5a65-93ee-7bb22df3a666", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a03f5fa3-919e-5659-ad9b-2d027dbe63d5", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--2e8a0c0c-ec2b-5a65-93ee-7bb22df3a666", + "target_ref": "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--27daa4fc-adb7-5575-964c-539824dc043f", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--2e8a0c0c-ec2b-5a65-93ee-7bb22df3a666", + "target_ref": "location--c10b615d-b039-5eb1-bf2b-bc878b6609fc" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--13435bba-f594-5c9f-9c8c-882940b52ae7", + "created": "2026-02-12T00:00:00.000Z", + "modified": "2026-02-12T00:00:00.000Z", + "name": "APT31", + "description": "PRC-based group that GTIG reports prompted Gemini with an expert security persona while trialling Hexstrike MCP tooling. It used the model to automate vulnerability analysis and plan testing against US targets. This is an early reported case of a state actor pairing an LLM with MCP-exposed offensive tools.", + "aliases": [ + "ZIRCONIUM", + "Violet Typhoon" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0010" + }, + { + "source_name": "mitre-attack", + "external_id": "G0128", + "url": "https://attack.mitre.org/groups/G0128/" + }, + { + "source_name": "GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration of AI for Adversarial Use (12 Feb 2", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--626b890a-e593-5499-b71d-5c0984182895", + "created": "2026-02-12T00:00:00.000Z", + "modified": "2026-02-12T00:00:00.000Z", + "name": "AI Agent Tools", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0016.004", + "url": "https://atlas.mitre.org/techniques/AML.T0016.004" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--740008cb-1f34-50dd-9d58-54c9a1ea861f", + "created": "2026-02-12T00:00:00.000Z", + "modified": "2026-02-12T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--13435bba-f594-5c9f-9c8c-882940b52ae7", + "target_ref": "attack-pattern--626b890a-e593-5499-b71d-5c0984182895" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--27d48bec-a683-50eb-bc58-b21bebe6cfae", + "created": "2026-02-12T00:00:00.000Z", + "modified": "2026-02-12T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--13435bba-f594-5c9f-9c8c-882940b52ae7", + "target_ref": "attack-pattern--f5b24b34-1130-53de-9455-2dda3936a632" + }, + { + "type": "location", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "location--8d1c3489-ced3-5eaa-b554-2ad9af80d268", + "created": "2026-02-12T00:00:00.000Z", + "modified": "2026-02-12T00:00:00.000Z", + "name": "US", + "country": "US" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--34251411-6592-56f7-a51a-2721ed48f1fa", + "created": "2026-02-12T00:00:00.000Z", + "modified": "2026-02-12T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--13435bba-f594-5c9f-9c8c-882940b52ae7", + "target_ref": "location--8d1c3489-ced3-5eaa-b554-2ad9af80d268" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--a5d15616-42c8-5620-93aa-a934df679a9e", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "MuddyWater", + "description": "Iranian state-sponsored group that GTIG reports used Gemini, under student and research pretexts, to develop custom malware including web shells and a Python C2 server.", + "aliases": [ + "TEMP.Zagros", + "MUDDYCOAST" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0011" + }, + { + "source_name": "mitre-attack", + "external_id": "G0069", + "url": "https://attack.mitre.org/groups/G0069/" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ed6c0dcf-32a3-5bcd-85b9-53ee22000ea6", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--a5d15616-42c8-5620-93aa-a934df679a9e", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6f5958c0-eb34-5500-9bf9-9aae0a6d1750", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--a5d15616-42c8-5620-93aa-a934df679a9e", + "target_ref": "attack-pattern--f5b24b34-1130-53de-9455-2dda3936a632" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--590c1e43-9ff8-580e-936b-b9319dd5ce8d", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "UNC4899", + "description": "North Korean supply-chain-focused actor that GTIG reports used Gemini to develop code, research exploits and improve its tooling.", + "aliases": [ + "PUKCHONG" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0012" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b87cac33-1123-5ad2-a13e-cc6edb55bf7c", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--590c1e43-9ff8-580e-936b-b9319dd5ce8d", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--eb5dc4fc-2e81-5913-9f37-f1d47c028fae", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "Kimsuky", + "description": "North Korean group that Microsoft and OpenAI reported in 2024 using LLMs to research think tanks and North Korea experts, draft spear-phishing content and troubleshoot scripts.", + "aliases": [ + "Emerald Sleet", + "APT43" + ], + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0013" + }, + { + "source_name": "mitre-attack", + "external_id": "G0094", + "url": "https://attack.mitre.org/groups/G0094/" + }, + { + "source_name": "Microsoft Threat Intelligence - Staying ahead of threat actors in the age of AI (14 Feb 2024)", + "url": "https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2ed8066b-4ea1-583e-a6cf-cc7ab4edf802", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--eb5dc4fc-2e81-5913-9f37-f1d47c028fae", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--c176d369-1ee0-599c-bec9-0a4b5d9e11ff", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "ngo-think-tank", + "identity_class": "class", + "sectors": [ + "ngo-think-tank" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--f8e76ae1-8e90-5d5b-863c-8c8de589eaa1", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--eb5dc4fc-2e81-5913-9f37-f1d47c028fae", + "target_ref": "identity--c176d369-1ee0-599c-bec9-0a4b5d9e11ff" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--29910fed-bb4b-52ca-8811-f7e2c0e38fbe", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "name": "education", + "identity_class": "class", + "sectors": [ + "education" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9b8b4a9d-2c74-5a81-a61f-228e939ce6d2", + "created": "2024-02-14T00:00:00.000Z", + "modified": "2024-02-14T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--eb5dc4fc-2e81-5913-9f37-f1d47c028fae", + "target_ref": "identity--29910fed-bb4b-52ca-8811-f7e2c0e38fbe" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--85bb8e62-fd9b-5d1c-879c-262bd77c8df6", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "UNC5673", + "description": "PRC-nexus cluster, overlapping TEMP.Hex, that GTIG reports pooled Gemini, Claude and OpenAI accounts through relay tooling (Claude-Relay-Service, CLI-Proxy-API) while targeting governments in South and Southeast Asia. On a host, the relay tooling is the artifact.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0014" + }, + { + "source_name": "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--742d2839-0b11-5185-928a-79d722e66d24", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "name": "Acquire Infrastructure", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0008", + "url": "https://atlas.mitre.org/techniques/AML.T0008" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2c62ad3f-d90f-591a-8a52-5eb81c005979", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--85bb8e62-fd9b-5d1c-879c-262bd77c8df6", + "target_ref": "attack-pattern--742d2839-0b11-5185-928a-79d722e66d24" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--612d9638-4e72-5011-b79b-7c2ab81a3d68", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--85bb8e62-fd9b-5d1c-879c-262bd77c8df6", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4e9d70f8-5b94-5bc8-aa3c-0700f6d345e8", + "created": "2026-05-11T00:00:00.000Z", + "modified": "2026-05-11T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--85bb8e62-fd9b-5d1c-879c-262bd77c8df6", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "UNC6508", + "description": "PRC-nexus espionage actor that GTIG reports targeted academic, medical and military research institutions in North America over several years. It deployed local open-weight LLM infrastructure inside compromised cloud environments.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0015" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--b6839fac-31e0-5834-acf6-bc887195241b", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "AI Development Workspaces", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0008.000", + "url": "https://atlas.mitre.org/techniques/AML.T0008.000" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b212ce17-3003-5b80-9f43-de81e0340eec", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "attack-pattern--b6839fac-31e0-5834-acf6-bc887195241b" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--ee8475ec-ddb6-58aa-a7b8-2c4c28189cfa", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "Cost Harvesting", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0034", + "url": "https://atlas.mitre.org/techniques/AML.T0034" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--22a331f9-b3a3-513e-8fbf-b7f039bbd6ae", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "attack-pattern--ee8475ec-ddb6-58aa-a7b8-2c4c28189cfa" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--d590f568-1524-59dd-9502-25f0566aa945", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "research", + "identity_class": "class", + "sectors": [ + "research" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--58cbd9dd-2c64-5f2f-a3fc-0be6549d24b4", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "identity--d590f568-1524-59dd-9502-25f0566aa945" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--840f5eae-e821-50ee-b770-5ad1616f9939", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "identity--1b74fcaf-1c57-57d5-8fe8-70e4c69a7e36" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9c9fe90b-c2db-54ba-a150-1a400d235bff", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "identity--29910fed-bb4b-52ca-8811-f7e2c0e38fbe" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--3792b856-8cf5-5432-8392-af5b197a566a", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "defense-industrial-base", + "identity_class": "class", + "sectors": [ + "defense-industrial-base" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--943260e6-fe9b-5c54-adc6-da5de040cff5", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "identity--3792b856-8cf5-5432-8392-af5b197a566a" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--21881d8a-09ac-5a52-a28b-424599934445", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "location--8d1c3489-ced3-5eaa-b554-2ad9af80d268" + }, + { + "type": "location", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "location--769b31ee-2f2d-55a7-ba6e-aec3ef1218b3", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "CA", + "country": "CA" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8ea2e454-186e-5e43-8c0d-fe5286b67bba", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0597eb1e-2506-5b75-915d-81a6bcea338e", + "target_ref": "location--769b31ee-2f2d-55a7-ba6e-aec3ef1218b3" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-20006", + "description": "Anthropic's cluster for a Russian-speaking operator whose tradecraft and targeting it assesses as consistent with Russian state-nexus espionage. It linked the cluster to Midnight Blizzard only as consistent with public reporting. From December 2025 to August 2026 the operator ran reconnaissance, phishing and collection through Claude-driven workflows, mostly by editing the Claude Code skills that drove them.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0016" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-20006 Russian espionage", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--760a9286-2a1c-59e9-b97d-0dd0541c97d5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--56ef9d1b-86fd-584f-afce-ce9ad922bab6", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "attack-pattern--c6dff4d5-68a2-5269-ba49-a64550631752" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--94b92d58-99fc-558d-952e-9dee29247f97", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--da1929e8-5878-5001-8c4b-c32296cb1703", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "attack-pattern--9b4d2a22-c803-5df9-868b-5cd3680c2487" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--3c7664be-7fa4-5efb-a852-d1fdc740cc3a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Steal Application Access Token", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1528", + "url": "https://attack.mitre.org/techniques/T1528/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ffb01c29-c430-564b-b496-0bd38fbb9053", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "attack-pattern--3c7664be-7fa4-5efb-a852-d1fdc740cc3a" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--11fe5ae3-76dc-584e-ba3f-800779668835", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Phishing", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1566", + "url": "https://attack.mitre.org/techniques/T1566/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4d79b6ab-6cc5-5a28-9dc6-9df4a5ebae70", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "attack-pattern--11fe5ae3-76dc-584e-ba3f-800779668835" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50020", + "description": "Anthropic's cluster for a Russian-speaking, financially motivated actor that moved from hotel-booking and fintech intrusions to running an autonomous exploitation pipeline against around 30 AI companies in about four days.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0017" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50020 From hotel bookings to the AI supply chain", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--c4fdb68f-6dd0-51bc-a57e-decf0b15e75e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Autonomous Exploit Development", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0017.001", + "url": "https://atlas.mitre.org/techniques/AML.T0017.001" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--561c0f06-66c9-5342-a49b-239207e49f47", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "target_ref": "attack-pattern--c4fdb68f-6dd0-51bc-a57e-decf0b15e75e" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--40209df8-ca30-5bac-b3ce-aa47b7c779e1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Exploit Public-Facing Application", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0049", + "url": "https://atlas.mitre.org/techniques/AML.T0049" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d23a46f1-bc53-57cc-9a5e-c0728445486d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "target_ref": "attack-pattern--40209df8-ca30-5bac-b3ce-aa47b7c779e1" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--c3a3fd88-0ac5-5294-973f-0dbee15b1da5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Autonomous Attack Orchestration", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0124", + "url": "https://atlas.mitre.org/techniques/AML.T0124" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--df2d94f2-3c5f-5af4-94fd-d167c5a1d6f4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "target_ref": "attack-pattern--c3a3fd88-0ac5-5294-973f-0dbee15b1da5" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--4acd779c-9b97-5a6a-afb6-b1225b446d41", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Exploit Public-Facing Application", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1190", + "url": "https://attack.mitre.org/techniques/T1190/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4d707b53-793b-5b26-a321-2de97a8d016c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "target_ref": "attack-pattern--4acd779c-9b97-5a6a-afb6-b1225b446d41" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50029", + "description": "Anthropic's cluster for a single French-speaking hacktivist who used Claude to build exploits, a key-validating scanner and a doxxing platform against European political parties, media and think tanks.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0018" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50029 Hacktivists targeted European political and affiliated", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--14469681-5bbb-5f31-bb49-a871589ee8bc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d0d514cd-b41a-51e8-b44b-04bb290fbfc7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "attack-pattern--40209df8-ca30-5bac-b3ce-aa47b7c779e1" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--220df393-5ae8-53ac-8d28-420ba93eb91a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--bd7efb6e-1c3a-52b9-baf0-38ef5fd61704", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "attack-pattern--4acd779c-9b97-5a6a-afb6-b1225b446d41" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--624f5553-4f17-5ccd-82cb-e1adf1303fac", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Web Shell", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1505.003", + "url": "https://attack.mitre.org/techniques/T1505/003/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6d85a409-4fac-552d-87ba-4e77317f29f3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "attack-pattern--624f5553-4f17-5ccd-82cb-e1adf1303fac" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50021", + "description": "Anthropic's cluster for a Russian- and Ukrainian-speaking group running a fraudulent cut-price Claude reseller that proxied traffic and harvested customer credentials.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0019" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50021", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e07c302d-196b-5d16-bc86-2a18e3149ff5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "attack-pattern--ee8475ec-ddb6-58aa-a7b8-2c4c28189cfa" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--426fc085-4d80-58b1-bd9c-fbca7c3a8a65", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955" + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--fa6c94f9-0101-5b0c-9ad0-0666828798a9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "Adversary-in-the-Middle", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1557", + "url": "https://attack.mitre.org/techniques/T1557/" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--dfd03aa0-a5ae-5e68-9be4-f05bf499ae59", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "attack-pattern--fa6c94f9-0101-5b0c-9ad0-0666828798a9" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7d76863d-06fe-585e-a43e-0bb7a93253bb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--58934c12-0444-544f-902a-9010d9977c57", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "AIRT-0041", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0041" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c5297562-6ce9-5990-ac34-a32844a0a1be", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "tool--58934c12-0444-544f-902a-9010d9977c57" + }, + { + "type": "intrusion-set", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-10007", + "description": "Anthropic's cluster for Chinese-speaking operators who used Claude as the engineering and orchestration layer for an exploit foundry: binary reversing, vulnerability hypotheses, exploit writing and testing. They also ran agent swarms, in which a lead agent dispatched reconnaissance and post-exploitation work to parallel sub-agents. Anthropic counts around fifty targeted organisations.", + "confidence": 50, + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-TA-0020" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ad4ce46b-9fec-5612-82de-8b83517b9222", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "attack-pattern--c4fdb68f-6dd0-51bc-a57e-decf0b15e75e" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d1cd50ff-94c1-56e3-959e-11a070332543", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--f20b02dc-58ce-5561-a0a2-352c88109794", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "uses", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "attack-pattern--c3a3fd88-0ac5-5294-973f-0dbee15b1da5" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e5541db0-b6f6-5d3a-bf86-8a097533d68c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--29910fed-bb4b-52ca-8811-f7e2c0e38fbe" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--e58ef490-e52d-5c88-916d-a8b15a6f360a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "retail", + "identity_class": "class", + "sectors": [ + "retail" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4d726393-91b3-5c4c-bda2-36ca994b5ae7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--e58ef490-e52d-5c88-916d-a8b15a6f360a" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--b844bf0e-4364-5afd-b786-fcd835c1e648", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "energy", + "identity_class": "class", + "sectors": [ + "energy" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--93bf5a52-1250-5ff7-8d03-0f43b7d360a8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--b844bf0e-4364-5afd-b786-fcd835c1e648" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--0e9ed653-a502-57b4-b7b2-c216383a9cd9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--e55086c4-2284-53d8-8072-d0c42fe13709" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2b5ae00e-bb9f-54b2-a1ed-7d488241e8fa", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--1b74fcaf-1c57-57d5-8fe8-70e4c69a7e36" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--9720136c-9b7d-5a34-ac77-f88a55ccded8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "financial-services", + "identity_class": "class", + "sectors": [ + "financial-services" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--fca1b822-cf2a-5252-ab79-66c874adead7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--9720136c-9b7d-5a34-ac77-f88a55ccded8" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--b34c64c8-2123-55ca-97c7-c586181f86ec", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "critical-manufacturing", + "identity_class": "class", + "sectors": [ + "critical-manufacturing" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8f184b30-0570-54ae-ab02-99c6494fbd68", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--b34c64c8-2123-55ca-97c7-c586181f86ec" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c44ec809-b952-518c-ad6e-b844a9040e3b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--58552f76-4ba6-59ff-806f-705f814753d9", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--f73f2333-4acf-5f02-8d6b-d8f8071b04f2", + "created": "2026-06-08T00:00:00.000Z", + "modified": "2026-06-08T00:00:00.000Z", + "name": "AIRT-0016", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0016" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--dd3304e4-9b8f-5acb-8692-d980fbd653ab", + "created": "2026-06-08T00:00:00.000Z", + "modified": "2026-06-08T00:00:00.000Z", + "name": "GPT Pilot core/telemetry Supply-Chain Credential Stealer", + "description": "A credential-stealing worm was hidden in the GPT Pilot repository under core/telemetry/ via malicious commit 065ee8eb. Anyone who cloned and ran GPT Pilot from source between Aug 2025 and 11 Jun 2026 should assume credential compromise and rotate.", + "published": "2026-06-08T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--7155f61f-f788-55aa-8b08-0c26c6f1e139", + "tool--f73f2333-4acf-5f02-8d6b-d8f8071b04f2" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0001" + }, + { + "source_name": "StepSecurity - Pythagora-io/gpt-pilot Compromised on GitHub: Shai-Hulud Credential Stealer Blocked by Python Linter", + "url": "https://www.stepsecurity.io/blog/pythagora-io-gpt-pilot-compromised-on-github-shai-hulud-credential-stealer-blocked-by-python-linter" + }, + { + "source_name": "SafeDep Threat Intelligence - Pythagora-io/gpt-pilot IOC record", + "url": "https://safedep.io/ti/ioc/github_repo/github_repo-5278c0f8c305/" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d7e606a3-cd86-5179-a4e7-26505da40ca6", + "created": "2025-09-01T00:00:00.000Z", + "modified": "2025-09-01T00:00:00.000Z", + "name": "phan@giftshop.club", + "description": "BCC exfiltration destination", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[email-addr:value = 'phan@giftshop.club']", + "pattern_type": "stix", + "valid_from": "2025-09-01T00:00:00.000Z" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--3ab8b62d-6b2a-5356-8336-ba14f8b7972a", + "created": "2025-09-01T00:00:00.000Z", + "modified": "2025-09-01T00:00:00.000Z", + "name": "postmark-mcp npm Backdoor - First In-the-Wild Malicious MCP Server", + "description": "npm package postmark-mcp v1.0.16, published by user 'phanpak', silently BCC'd every email processed through it to an attacker-controlled address. 1,643 downloads before removal. Koi Security called it the first real-world sighting of a malicious MCP server.", + "published": "2025-09-01T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--12763f9b-0599-54fc-9714-c251137ddcf5", + "attack-pattern--7155f61f-f788-55aa-8b08-0c26c6f1e139", + "indicator--d7e606a3-cd86-5179-a4e7-26505da40ca6" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0002" + }, + { + "source_name": "The Hacker News - First Malicious MCP Server Found Stealing Emails in Rogue Postmark-MCP Package", + "url": "https://thehackernews.com/2025/09/first-malicious-mcp-server-found.html" + }, + { + "source_name": "Snyk - Malicious MCP Server on npm: postmark-mcp harvests emails", + "url": "https://snyk.io/blog/malicious-mcp-server-on-npm-postmark-mcp-harvests-emails/" + }, + { + "source_name": "Dark Reading - Sneaky, Malicious MCP Server Exfiltrates Secrets via BCC", + "url": "https://www.darkreading.com/application-security/malicious-mcp-server-exfiltrates-secrets-bcc" + } + ] + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--ec52e3cb-3407-5ce6-b8b3-0b1a09ee927e", + "created": "2025-04-09T00:00:00.000Z", + "modified": "2025-04-09T00:00:00.000Z", + "name": "AIRT-0044", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0044" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--3fd6cecc-ab1f-5d4e-9ee0-7261d54cb862", + "created": "2025-04-09T00:00:00.000Z", + "modified": "2025-04-09T00:00:00.000Z", + "name": "Langflow CVE-2025-3248 Mass Exploitation and Flodrix Botnet Deployment", + "description": "Langflow versions before 1.3.0 expose /api/v1/validate/code, which passes user-supplied Python to exec() with no authentication and no sandbox. Payloads hidden in function decorators and default arguments execute in the server context. CVSS 9.8. CISA added it to the Known Exploited Vulnerabilities catalog on 2025-05-05. Trend Micro documented in-the-wild exploitation deploying the Flodrix botnet, with operators first enumerating publicly exposed Langflow servers via Shodan or FOFA. A second flaw, CVE-2026-5027 (CVSS 8.8, path traversal via POST /api/v2/files) affects 1.8.4 and earlier.", + "published": "2025-04-09T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--da2fef0c-c8e7-5a2d-ab67-cd7680462c67", + "tool--ec52e3cb-3407-5ce6-b8b3-0b1a09ee927e" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0003" + }, + { + "source_name": "cve", + "external_id": "CVE-2025-3248" + }, + { + "source_name": "cve", + "external_id": "CVE-2026-5027" + }, + { + "source_name": "NVD - CVE-2025-3248", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-3248" + }, + { + "source_name": "CISA - Known Exploited Vulnerabilities Catalog", + "url": "https://www.cisa.gov/known-exploited-vulnerabilities-catalog" + }, + { + "source_name": "Trend Micro - Langflow CVE-2025-3248 exploited to deliver the Flodrix botnet", + "url": "https://www.trendmicro.com/en_us/research/25/f/langflow-flodrix-botnet.html" + } + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--432ff092-4cea-5ae4-a1cc-a4db81d591f4", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "identity--e55086c4-2284-53d8-8072-d0c42fe13709" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d095a345-88f8-595f-9b15-82d8379c8236", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "identity--9720136c-9b7d-5a34-ac77-f88a55ccded8" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--24f3603a-bb46-5550-9690-7acedfeb4a56", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "chemical", + "identity_class": "class", + "sectors": [ + "chemical" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--dfd415a0-c52e-5f4d-be59-5dbe3bddf232", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "identity--24f3603a-bb46-5550-9690-7acedfeb4a56" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6432708d-550f-5a34-9bdb-6acc7eb42147", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--3efcb1b2-12cd-560c-998c-f31a84f6fb77", + "created": "2025-11-13T00:00:00.000Z", + "modified": "2025-11-13T00:00:00.000Z", + "name": "GTG-1002 - AI-Orchestrated Espionage Campaign", + "description": "Anthropic assessed with high confidence that a Chinese state-sponsored actor built an autonomous attack framework around Claude Code driving MCP servers and sub-agents, and used it against roughly thirty organisations, succeeding against at least four. The framework ran reconnaissance, vulnerability discovery, exploit development, credential harvesting, lateral movement and exfiltration, with human operators reportedly intervening at only four to six decision points per campaign. Guardrails were bypassed by role-playing as a defensive security firm conducting authorised testing and decomposing the attack into individually innocuous sub-tasks. No indicators of compromise were published.", + "published": "2025-11-13T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7", + "attack-pattern--2b945796-1022-5264-a3d0-e151106d8ab7", + "attack-pattern--9b4d2a22-c803-5df9-868b-5cd3680c2487", + "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f", + "attack-pattern--f5b24b34-1130-53de-9455-2dda3936a632", + "intrusion-set--0cd3bf15-9f8a-55e6-bbe1-9ff18c78acf4", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0004" + }, + { + "source_name": "mitre-attack", + "external_id": "C0062", + "url": "https://attack.mitre.org/campaigns/C0062/" + }, + { + "source_name": "mitre-atlas", + "external_id": "AML.CS0069", + "url": "https://atlas.mitre.org/studies/AML.CS0069" + }, + { + "source_name": "Anthropic - Disrupting the first reported AI-orchestrated cyber espionage campaign", + "url": "https://www-cdn.anthropic.com/d7dd50dd1185f59be051b307150d877f2b82bd2c.pdf" + }, + { + "source_name": "MITRE ATT&CK - Campaign C0062, Anthropic AI-orchestrated Campaign", + "url": "https://attack.mitre.org/campaigns/C0062/" + }, + { + "source_name": "BleepingComputer - Anthropic claims of Claude AI-automated cyberattacks met with doubt", + "url": "https://www.bleepingcomputer.com/news/security/anthropic-claims-of-claude-ai-automated-cyberattacks-met-with-doubt/" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--239f5e22-b32a-5c0e-baaf-c931edd8d2fd", + "created": "2025-11-03T00:00:00.000Z", + "modified": "2025-11-03T00:00:00.000Z", + "name": "Netapi64.dll", + "description": "Eazfuscator.NET-obfuscated .NET loader", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'Netapi64.dll']", + "pattern_type": "stix", + "valid_from": "2025-11-03T00:00:00.000Z" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--faef5536-d8bd-56f1-b3ee-e2657c48aeaa", + "created": "2025-11-03T00:00:00.000Z", + "modified": "2025-11-03T00:00:00.000Z", + "name": ".exe.config containing appDomainManagerAssembly", + "description": "The injection mechanism - a .config beside a trusted binary is the durable artifact", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = '.exe.config containing appDomainManagerAssembly']", + "pattern_type": "stix", + "valid_from": "2025-11-03T00:00:00.000Z" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--37a441a1-2351-5ec1-9090-10d2a186fde9", + "created": "2025-11-03T00:00:00.000Z", + "modified": "2025-11-03T00:00:00.000Z", + "name": "api.openai.com", + "description": "C2 relay; the finding is the process making the request, not the destination", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'api.openai.com']", + "pattern_type": "stix", + "valid_from": "2025-11-03T00:00:00.000Z" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--93a5192f-7905-5859-89d4-6fcb74c0935d", + "created": "2025-11-03T00:00:00.000Z", + "modified": "2025-11-03T00:00:00.000Z", + "name": "SesameOp - OpenAI Assistants API as a Covert C2 Relay", + "description": "Microsoft DART found this backdoor during an intrusion where the actor had persisted for months. It uses OpenAI's Assistants API not for inference but as attacker-controlled storage inside a provider every enterprise already trusts. An Eazfuscator.NET-obfuscated loader (Netapi64.dll) is injected into a legitimate host executable through .NET AppDomainManager injection, locates a file ending in Netapi64 under C:\\Windows\\Temp, XOR-decodes it and launches the OpenAIAgent.Netapi64 backdoor. The implant polls the assistants list and reads a verb - SLEEP, Payload or Result - from the description field, takes the encrypted and compressed command body from the instructions field, and returns output as a new message.", + "published": "2025-11-03T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f", + "indicator--239f5e22-b32a-5c0e-baaf-c931edd8d2fd", + "indicator--37a441a1-2351-5ec1-9090-10d2a186fde9", + "indicator--faef5536-d8bd-56f1-b3ee-e2657c48aeaa" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0005" + }, + { + "source_name": "mitre-atlas", + "external_id": "AML.CS0042", + "url": "https://atlas.mitre.org/studies/AML.CS0042" + }, + { + "source_name": "Microsoft Security Blog - SesameOp: Novel backdoor uses OpenAI Assistants API for command and control", + "url": "https://www.microsoft.com/en-us/security/blog/2025/11/03/sesameop-novel-backdoor-uses-openai-assistants-api-for-command-and-control/" + }, + { + "source_name": "The Hacker News - Microsoft Detects SesameOp Backdoor Using OpenAI's API as a Stealth Command Channel", + "url": "https://thehackernews.com/2025/11/microsoft-detects-sesameop-backdoor.html" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--5599a1d5-d36a-54cc-b040-327f97ab17b9", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "generativelanguage.googleapis.com", + "description": "Gemini API endpoint; the finding is wscript.exe or cscript.exe reaching it", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'generativelanguage.googleapis.com']", + "pattern_type": "stix", + "valid_from": "2025-11-05T00:00:00.000Z" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--0270c07f-b969-5b8a-96b7-f99b3ad62c21", + "created": "2025-11-05T00:00:00.000Z", + "modified": "2025-11-05T00:00:00.000Z", + "name": "PROMPTFLUX - Malware That Asks an LLM to Rewrite Itself", + "description": "A VBScript dropper whose \"Thinking Robot\" module queries Gemini on a timer with a prompt asking for an obfuscated rewrite of its own source, so the script on disk is never the script that was analysed. Responses are logged to a file in %TEMP%, and regenerated variants are written to the per-user Startup folder for persistence. One observed variant instructed the model hourly to act as an \"expert VBScript obfuscator\" and rewrite the entire source. GTIG grouped it with a family of samples exhibiting just-in-time code creation, and assessed it as in development.", + "published": "2025-11-05T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f", + "indicator--5599a1d5-d36a-54cc-b040-327f97ab17b9" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0006" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://services.google.com/fh/files/misc/advances-in-threat-actor-usage-of-ai-tools-en.pdf" + }, + { + "source_name": "Help Net Security - Google uncovers malware using LLMs to operate and evade detection", + "url": "https://www.helpnetsecurity.com/2025/11/05/malware-using-llms/" + }, + { + "source_name": "Infosecurity Magazine - AI-Enabled Malware Now Actively Deployed, Says Google", + "url": "https://www.infosecurity-magazine.com/news/aienabled-malware-actively/" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--2f5b49ff-e74d-505f-8dd5-b30fa9a8eca3", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "name": "api-inference.huggingface.co", + "description": "Inference API egress from a compiled desktop utility is the pivot", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'api-inference.huggingface.co']", + "pattern_type": "stix", + "valid_from": "2025-07-17T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--fa2c035d-7718-56f3-8cfe-d39c29f3f291", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--2f5b49ff-e74d-505f-8dd5-b30fa9a8eca3", + "target_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--63a3e3e5-357b-579b-93c7-47b48bce08ad", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "name": "Додаток.pdf.zip", + "description": "Phishing archive name reported by CERT-UA; carries a PyInstaller executable beside a decoy PDF", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'Додаток.pdf.zip']", + "pattern_type": "stix", + "valid_from": "2025-07-17T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--81d2b176-32c4-53e8-9f89-b36a00cf825d", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--63a3e3e5-357b-579b-93c7-47b48bce08ad", + "target_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--01625989-faea-5f82-ad8d-773348dd8bf4", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2eeecb36-3f6c-5553-8cac-bf7ce60e87fa", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9", + "target_ref": "identity--3792b856-8cf5-5432-8392-af5b197a566a" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--c7589795-4075-5079-a469-a70e00143512", + "created": "2025-07-17T00:00:00.000Z", + "modified": "2025-07-17T00:00:00.000Z", + "name": "PROMPTSTEAL / LAMEHUG - An LLM Writing Collection Commands at Runtime", + "description": "A Python data miner, PyInstaller-compiled and delivered by phishing mail impersonating Ukrainian ministry correspondence and sent from compromised accounts, initially against Ukraine's security and defence sector. GTIG describes the sample as presenting itself as an image generation utility. At execution it submits base64-encoded prompts to the Qwen2.5-Coder-32B-Instruct model through the Hugging Face inference API, asking the model to generate Windows commands for system reconnaissance and document collection, then executes what comes back. It stages Office, PDF and TXT files from common user folders and exfiltrates over SFTP or HTTP POST. GTIG described it as their first observation of malware querying an LLM in live operations.", + "published": "2025-07-17T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f", + "indicator--2f5b49ff-e74d-505f-8dd5-b30fa9a8eca3", + "indicator--63a3e3e5-357b-579b-93c7-47b48bce08ad", + "intrusion-set--1ba91b8e-4a2d-5993-996e-3dc640247ad9" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0007" + }, + { + "source_name": "CERT-UA #16039 - LAMEHUG (17 Jul 2025)", + "url": "https://cert.gov.ua/article/6284730" + }, + { + "source_name": "The Hacker News - CERT-UA Discovers LAMEHUG Malware Linked to APT28, Using LLM for Phishing Campaign", + "url": "https://thehackernews.com/2025/07/cert-ua-discovers-lamehug-malware.html" + }, + { + "source_name": "Cato CTRL - Analyzing LAMEHUG, first known LLM-powered malware with links to APT28", + "url": "https://www.catonetworks.com/blog/cato-ctrl-threat-research-analyzing-lamehug/" + }, + { + "source_name": "GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)", + "url": "https://services.google.com/fh/files/misc/advances-in-threat-actor-usage-of-ai-tools-en.pdf" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--4be5b8d3-f9b2-5db5-9cd3-ece2e57b43aa", + "created": "2025-06-11T00:00:00.000Z", + "modified": "2025-06-11T00:00:00.000Z", + "name": "LLM Prompt Injection", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0051", + "url": "https://atlas.mitre.org/techniques/AML.T0051" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--26940f6a-dbc9-5209-96e4-44d5e03f45e9", + "created": "2025-06-11T00:00:00.000Z", + "modified": "2025-06-11T00:00:00.000Z", + "name": "Exfiltration via AI Inference API", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0024", + "url": "https://atlas.mitre.org/techniques/AML.T0024" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--9f85aa9d-24fe-5b87-bf34-1214e5d215fd", + "created": "2025-06-11T00:00:00.000Z", + "modified": "2025-06-11T00:00:00.000Z", + "name": "EchoLeak (CVE-2025-32711) - Zero-Click Exfiltration from M365 Copilot", + "description": "An untrusted inbound email carried instructions that Microsoft 365 Copilot processed while assembling context. The assistant, holding privileged access to tenant data, was induced to pull sensitive content and emit it inside an auto-fetched markdown image reference, exfiltrating the data through the rendering path. Aim Labs named the underlying flaw an LLM Scope Violation - untrusted input reaching a component that holds privileged scope. No click, no attachment, no user action. Anything inside Copilot's scope was reachable, including chat history, OneDrive, SharePoint and Teams content. Microsoft fixed it server-side and reports no in-the-wild exploitation.", + "published": "2025-06-11T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--26940f6a-dbc9-5209-96e4-44d5e03f45e9", + "attack-pattern--4be5b8d3-f9b2-5db5-9cd3-ece2e57b43aa" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0008" + }, + { + "source_name": "cve", + "external_id": "CVE-2025-32711" + }, + { + "source_name": "NVD - CVE-2025-32711", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-32711" + }, + { + "source_name": "arXiv:2509.10540 - EchoLeak: The First Real-World Zero-Click Prompt Injection Exploit in a Production LLM System", + "url": "https://arxiv.org/abs/2509.10540" + }, + { + "source_name": "The Hacker News - Zero-Click AI Vulnerability Exposes Microsoft 365 Copilot Data Without User Interaction", + "url": "https://thehackernews.com/2025/06/zero-click-ai-vulnerability-exposes.html" + } + ] + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--1ea4a315-78e0-5add-8485-c4b1579bccd5", + "created": "2025-07-09T00:00:00.000Z", + "modified": "2025-07-09T00:00:00.000Z", + "name": "AIRT-0006", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0006" + } + ] + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--d081dbe8-b913-55db-b26f-4545b012f8b3", + "created": "2025-07-09T00:00:00.000Z", + "modified": "2025-07-09T00:00:00.000Z", + "name": "AIRT-0011", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0011" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--a592d335-5e45-5385-a430-5d9312a1ed89", + "created": "2025-07-09T00:00:00.000Z", + "modified": "2025-07-09T00:00:00.000Z", + "name": "The MCP Vulnerability Cluster - RCE on Connect and the Rug-Pull", + "description": "Model Context Protocol went from novelty to default integration layer, and a vulnerability class followed it. mcp-remote (CVE-2025-6514, CVSS 9.6, JFrog) achieved OS command injection on the client merely by connecting to a malicious server, in versions 0.0.5 to 0.1.15 and with over 437,000 downloads at disclosure. MCP Inspector (CVE-2025-49596, CVSS 9.4, Oligo) allowed unauthenticated RCE between client and proxy, fixed in 0.14.1. MCPoison (CVE-2025-54136, CVSS 7.2, Check Point) allowed an approved MCP server configuration in Cursor to be silently redefined after approval and never re-validated - the rug-pull - fixed in Cursor 1.3.", + "published": "2025-07-09T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "tool--1ea4a315-78e0-5add-8485-c4b1579bccd5", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831", + "tool--81278db8-20de-540c-9afc-2303c5262729", + "tool--d081dbe8-b913-55db-b26f-4545b012f8b3" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0009" + }, + { + "source_name": "cve", + "external_id": "CVE-2025-49596" + }, + { + "source_name": "cve", + "external_id": "CVE-2025-54136" + }, + { + "source_name": "cve", + "external_id": "CVE-2025-6514" + }, + { + "source_name": "GitHub Advisory GHSA-6xpm-ggf7-wc3p - CVE-2025-6514, mcp-remote OS command injection", + "url": "https://github.com/advisories/GHSA-6xpm-ggf7-wc3p" + }, + { + "source_name": "JFrog - Critical mcp-remote RCE vulnerability (CVE-2025-6514)", + "url": "https://jfrog.com/blog/2025-6514-critical-mcp-remote-rce-vulnerability/" + }, + { + "source_name": "OSV - CVE-2025-49596, MCP Inspector RCE", + "url": "https://osv.dev/vulnerability/CVE-2025-49596" + }, + { + "source_name": "NVD - CVE-2025-54136 (MCPoison)", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2025-54136" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--6015e136-ae72-5c1f-89a3-2cd2412556f5", + "created": "2024-09-24T00:00:00.000Z", + "modified": "2024-09-24T00:00:00.000Z", + "name": "AI Agent Context Poisoning", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0080", + "url": "https://atlas.mitre.org/techniques/AML.T0080" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--8a29761c-4b78-57b6-8444-bfc042e1b095", + "created": "2024-09-24T00:00:00.000Z", + "modified": "2024-09-24T00:00:00.000Z", + "name": "Memory", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0080.000", + "url": "https://atlas.mitre.org/techniques/AML.T0080.000" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--30cefca2-a681-517d-884c-f26b30a33941", + "created": "2024-09-24T00:00:00.000Z", + "modified": "2024-09-24T00:00:00.000Z", + "name": "Exfiltration via AI Agent Tool Invocation", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0086", + "url": "https://atlas.mitre.org/techniques/AML.T0086" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--45ca2bfa-d73a-5929-b7ea-288cb828c374", + "created": "2024-09-24T00:00:00.000Z", + "modified": "2024-09-24T00:00:00.000Z", + "name": "Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)", + "description": "The same primitive in coding agents - an on-disk file that is context every run", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'Agent instruction files re-read every session (CLAUDE.md, AGENTS.md, .cursorrules)']", + "pattern_type": "stix", + "valid_from": "2024-09-24T00:00:00.000Z" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a1ac4c3f-fc35-5632-824e-56d6678b6eac", + "created": "2024-09-24T00:00:00.000Z", + "modified": "2024-09-24T00:00:00.000Z", + "name": "Framework checkpoint stores (LangGraph SQLite and equivalents)", + "description": "Where an agent framework persists state between invocations", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'Framework checkpoint stores (LangGraph SQLite and equivalents)']", + "pattern_type": "stix", + "valid_from": "2024-09-24T00:00:00.000Z" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--cf22566d-51a9-50c6-b269-b0965e6e59ba", + "created": "2024-09-24T00:00:00.000Z", + "modified": "2024-09-24T00:00:00.000Z", + "name": "SpAIware - Prompt Injection That Persists in Assistant Memory", + "description": "An injected instruction, delivered through a malicious site or a booby-trapped document, is committed to ChatGPT's persistent memory and directs the assistant to end all future responses with a markdown image whose URL carries the previous question and answer as parameters. Because it lives in memory rather than in a conversation, it survives session resets and applies to every subsequent chat until memory is purged. OpenAI closed the exfiltration channel in ChatGPT 1.2024.247; untrusted content invoking the memory tool to store arbitrary memories was not itself eliminated, which is why memory remains an evidence source rather than a closed issue.", + "published": "2024-09-24T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--30cefca2-a681-517d-884c-f26b30a33941", + "attack-pattern--6015e136-ae72-5c1f-89a3-2cd2412556f5", + "attack-pattern--8a29761c-4b78-57b6-8444-bfc042e1b095", + "indicator--45ca2bfa-d73a-5929-b7ea-288cb828c374", + "indicator--a1ac4c3f-fc35-5632-824e-56d6678b6eac" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0010" + }, + { + "source_name": "Embrace The Red - Spyware Injection Into Your ChatGPT's Long-Term Memory (SpAIware)", + "url": "https://embracethered.com/blog/posts/2024/chatgpt-macos-app-persistent-data-exfiltration/" + }, + { + "source_name": "MITRE ATLAS - AML.T0080.000, AI Agent Context Poisoning: Memory", + "url": "https://atlas.mitre.org/techniques/AML.T0080.000" + }, + { + "source_name": "The Hacker News - ChatGPT macOS Flaw Could've Enabled Long-Term Spyware via Memory Function", + "url": "https://thehackernews.com/2024/09/chatgpt-macos-flaw-couldve-enabled-long.html" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--2d3d9724-747b-57cf-a9e2-60bd12f07fe0", + "created": "2026-02-10T00:00:00.000Z", + "modified": "2026-02-10T00:00:00.000Z", + "name": "Assistant URL carrying a pre-filled prompt in a query parameter", + "description": "Recoverable from browser history and referrer logs; the delivery mechanism", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[url:value = 'Assistant URL carrying a pre-filled prompt in a query parameter']", + "pattern_type": "stix", + "valid_from": "2026-02-10T00:00:00.000Z" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--3a6f6a10-d650-5f1a-a132-af660db9f2b4", + "created": "2026-02-10T00:00:00.000Z", + "modified": "2026-02-10T00:00:00.000Z", + "name": "AI Recommendation Poisoning - Memory Manipulation for Profit", + "description": "Microsoft documented memory poisoning used for commercial gain rather than espionage. Because major assistants support pre-populating a prompt through URL parameters, an \"Ask AI\" or \"Summarize with AI\" button - or a link in a page or email - can carry an instruction the assistant parses and commits to memory, biasing later recommendations toward the party that planted it. Microsoft identified 31 companies across 14 industries deploying the technique, and observed more than 50 distinct prompts in a single data source over 60 days. Instructions embedded in documents, emails and web pages produce the same effect when the content is processed by an assistant.", + "published": "2026-02-10T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--6015e136-ae72-5c1f-89a3-2cd2412556f5", + "indicator--2d3d9724-747b-57cf-a9e2-60bd12f07fe0" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0011" + }, + { + "source_name": "mitre-atlas", + "external_id": "AML.CS0072", + "url": "https://atlas.mitre.org/studies/AML.CS0072" + }, + { + "source_name": "Microsoft Security Blog - Manipulating AI memory for profit: The rise of AI Recommendation Poisoning", + "url": "https://www.microsoft.com/en-us/security/blog/2026/02/10/ai-recommendation-poisoning/" + }, + { + "source_name": "Help Net Security - That summarize with AI button might be manipulating you", + "url": "https://www.helpnetsecurity.com/2026/02/11/ai-recommendation-memory-poisoning-attacks/" + }, + { + "source_name": "The Hacker News - Microsoft Finds Summarize with AI Prompts Manipulating Chatbot Recommendations", + "url": "https://thehackernews.com/2026/02/microsoft-finds-summarize-with-ai.html" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--4638b49d-d89c-5187-ad13-b1d50d35ab79", + "created": "2025-08-13T00:00:00.000Z", + "modified": "2025-08-13T00:00:00.000Z", + "name": "RAG Credential Harvesting", + "external_references": [ + { + "source_name": "mitre-atlas", + "external_id": "AML.T0082", + "url": "https://atlas.mitre.org/techniques/AML.T0082" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--7c3ae70d-1fee-550d-86e9-5f98d77bdc8d", + "created": "2025-08-13T00:00:00.000Z", + "modified": "2025-08-13T00:00:00.000Z", + "name": "PoisonedRAG - Five Documents Against a Corpus of Millions", + "description": "The first knowledge poisoning attack against retrieval-augmented generation. Zou et al. formulate knowledge corruption as an optimisation problem, with black-box and white-box variants, and show that injecting five adversarial texts per target question into a knowledge base of millions reliably causes the system to return an attacker-chosen answer, at around a 90% success rate. Several defences were evaluated and none were sufficient. There is no malicious code anywhere in the attack - nothing to detonate and nothing to sandbox.", + "published": "2025-08-13T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--4638b49d-d89c-5187-ad13-b1d50d35ab79" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0012" + }, + { + "source_name": "USENIX Security 2025 - PoisonedRAG: Knowledge Corruption Attacks to Retrieval-Augmented Generation of Large Language Mod", + "url": "https://www.usenix.org/conference/usenixsecurity25/presentation/zou-poisonedrag" + }, + { + "source_name": "USENIX - PoisonedRAG paper (PDF)", + "url": "https://www.usenix.org/system/files/usenixsecurity25-zou-poisonedrag.pdf" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--7aaf518d-63b9-55e2-ac3a-64f839bf2384", + "created": "2026-02-25T00:00:00.000Z", + "modified": "2026-02-25T00:00:00.000Z", + "name": "Mexican Government Breach - AI-Accelerated, Not AI-Orchestrated", + "description": "Gambit Security disclosed a campaign against nine Mexican federal and state government agencies, including the federal tax authority and the national electoral institute, running from December 2025 to mid-February 2026. The actor jailbroke Claude Code using Spanish-language bug-bounty and penetration-testing framing, supplemented with a second commercial model, and exfiltrated roughly 150 GB covering about 195 million taxpayer and voter records - names, addresses, RFC and CURP identifiers, voter registration details and internal employee credentials. Anthropic confirmed the activity, banned the accounts and reported improved misuse detection in later releases.", + "published": "2026-02-25T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--ed8bc0d5-2866-54cf-af9f-dff18ca9ae9f", + "attack-pattern--f5b24b34-1130-53de-9455-2dda3936a632", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0013" + }, + { + "source_name": "Gambit Security - The AI-Assisted Breach of Mexico's Government Infrastructure (technical report)", + "url": "https://cdn.prod.website-files.com/69944dd945f20ca4a27a7c47/69d8bb5aea59e31efb3b8a7f_Tech_Report_ai_breach_mex_gov.pdf" + }, + { + "source_name": "Live Science - Hackers used AI to steal hundreds of millions of Mexican government and private citizen records", + "url": "https://www.livescience.com/technology/artificial-intelligence/hackers-used-ai-to-steal-hundreds-of-millions-of-mexican-government-and-private-citizen-records-in-one-of-the-largest-cybersecurity-breaches-ever" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--172e715c-f5a9-57aa-90b1-ffbe5552dfd8", + "created": "2024-03-26T00:00:00.000Z", + "modified": "2024-03-26T00:00:00.000Z", + "name": "ShadowRay - AI Compute Clusters Exploited in the Wild", + "description": "Ray's Jobs API accepts job submissions without authentication. Internet-exposed clusters therefore give an attacker code execution on machines holding models, training data and cloud credentials. Oligo disclosed ShadowRay in March 2024 as the first known attack campaign against AI workloads in the wild, with thousands of exposed servers already compromised. In November 2025 Oligo documented ShadowRay 2.0, a global campaign turning exposed clusters into a self-propagating cryptomining botnet - multi-stage Bash and Python payloads that abuse Ray's own orchestration to deploy across every node and to spread cluster to cluster, running XMRig.", + "published": "2024-03-26T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "identity--cf20135e-3ab2-5072-a070-c5679b316619" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0014" + }, + { + "source_name": "mitre-attack", + "external_id": "C0045", + "url": "https://attack.mitre.org/campaigns/C0045/" + }, + { + "source_name": "mitre-atlas", + "external_id": "AML.CS0023", + "url": "https://atlas.mitre.org/studies/AML.CS0023" + }, + { + "source_name": "cve", + "external_id": "CVE-2023-48022" + }, + { + "source_name": "Oligo Security - ShadowRay: First Known Attack Campaign Targeting AI Workloads Exploited In The Wild", + "url": "https://www.oligo.security/blog/shadowray-attack-ai-workloads-actively-exploited-in-the-wild" + }, + { + "source_name": "Oligo Security - ShadowRay 2.0: Active Global Campaign Hijacks Ray AI Infrastructure Into Self-Propagating Botnet", + "url": "https://www.oligo.security/blog/shadowray-2-0-attackers-turn-ai-against-itself-in-global-campaign-that-hijacks-ai-into-self-propagating-botnet" + }, + { + "source_name": "NVD - CVE-2023-48022", + "url": "https://nvd.nist.gov/vuln/detail/CVE-2023-48022" + } + ] + }, + { + "type": "attack-pattern", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "attack-pattern--177c057b-5b43-5a17-a647-ba8608554517", + "created": "2025-08-26T00:00:00.000Z", + "modified": "2025-08-26T00:00:00.000Z", + "name": "Command and Scripting Interpreter", + "external_references": [ + { + "source_name": "mitre-attack", + "external_id": "T1059", + "url": "https://attack.mitre.org/techniques/T1059/" + } + ] + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--52a81ef5-8d40-59f1-9b9f-ea64b4ba55f9", + "created": "2025-08-26T00:00:00.000Z", + "modified": "2025-08-26T00:00:00.000Z", + "name": "AIRT-0008", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0008" + } + ] + }, + { + "type": "tool", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "tool--fbaf5684-7595-5742-b42d-a8072b44749b", + "created": "2025-08-26T00:00:00.000Z", + "modified": "2025-08-26T00:00:00.000Z", + "name": "AIRT-0037", + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-0037" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--e208cd80-9299-58b4-a907-61cf0b1c739b", + "created": "2025-08-26T00:00:00.000Z", + "modified": "2025-08-26T00:00:00.000Z", + "name": "s1ngularity - A Supply-Chain Payload That Used the Victim's Own AI CLIs", + "description": "A command-injection flaw in the Nx repository's pull-request workflow let an attacker obtain the npm publish token and push trojanised versions of the nx build system and several @nx plugins. Their postinstall script checked which AI coding CLIs were installed. It then ran Claude Code, Gemini CLI and Amazon Q with the flag that disables tool approval, and prompted them to search the filesystem for configuration, key and wallet files. The results went to /tmp/inventory.txt and were published, base64-encoded, to a public repository under the victim's own GitHub account. It also appended a shutdown command to the victim's shell profiles. The Nx Console VS Code extension installed the latest nx during version checks, so some victims were infected without ever running an npm install.", + "published": "2025-08-26T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--177c057b-5b43-5a17-a647-ba8608554517", + "attack-pattern--2339d29a-b18d-53ea-8c53-cba484d8d811", + "attack-pattern--2b945796-1022-5264-a3d0-e151106d8ab7", + "attack-pattern--7155f61f-f788-55aa-8b08-0c26c6f1e139", + "attack-pattern--751a75d6-e12e-5a99-9e9c-0c1883bb882c", + "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955", + "tool--52a81ef5-8d40-59f1-9b9f-ea64b4ba55f9", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831", + "tool--fbaf5684-7595-5742-b42d-a8072b44749b" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0015" + }, + { + "source_name": "Nx - Security advisory GHSA-cxm3-wv7p-598c: malicious versions of Nx and some supporting plugins were published", + "url": "https://github.com/nrwl/nx/security/advisories/GHSA-cxm3-wv7p-598c" + }, + { + "source_name": "Wiz - s1ngularity: supply chain attack leaks secrets on GitHub", + "url": "https://www.wiz.io/blog/s1ngularity-supply-chain-attack" + }, + { + "source_name": "Snyk - Weaponizing AI Coding Agents for Malware in the Nx Malicious Package Security Incident", + "url": "https://snyk.io/blog/weaponizing-ai-coding-agents-for-malware-in-the-nx-malicious-package/" + }, + { + "source_name": "StepSecurity - s1ngularity: Popular Nx Build System Package Compromised with Data-Stealing Malware", + "url": "https://www.stepsecurity.io/blog/supply-chain-security-alert-popular-nx-build-system-package-compromised-with-data-stealing-malware" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--d922119e-fe0f-5367-a365-002345784fd7", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "UNC6780 (TeamPCP) - DUSTMAKER and Trojanised MCP Servers", + "description": "GTIG reports that UNC6780 compromised developer accounts and published trojanised forks of legitimate MCP servers to PyPI, including tiktoken_mcp. It also injected code into official organisational repositories such as azure-functions-mcp-extension. Its DUSTMAKER credential stealer detects CI/CD environments, extracts OIDC tokens from GitHub Actions and deletes workflow logs. On developer hosts it drops or modifies files in the hidden workspace directories AI coding assistants read, .claude/, .cursor/ and .vscode/. That turns the assistant's own configuration into the persistence and execution point. Earlier in 2026 GTIG tied the same actor to compromises of Trivy, Checkmarx and LiteLLM, the last of which exposed AI provider secrets.", + "published": "2026-09-08T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--12763f9b-0599-54fc-9714-c251137ddcf5", + "attack-pattern--2339d29a-b18d-53ea-8c53-cba484d8d811", + "attack-pattern--7155f61f-f788-55aa-8b08-0c26c6f1e139", + "attack-pattern--751a75d6-e12e-5a99-9e9c-0c1883bb882c", + "attack-pattern--a37e2a7e-23b4-571d-afa6-73dac4590f7e", + "attack-pattern--b64d656b-8a6a-54a2-bd68-436a0856829b", + "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955", + "intrusion-set--e10b6679-0eeb-5470-b3c6-820e56ecd4a4", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831", + "tool--81278db8-20de-540c-9afc-2303c5262729" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0016" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + }, + { + "source_name": "GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, and Initial Access (11 May 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access" + } + ] + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--5704a307-c8ec-5b3a-be37-8391cb38c852", + "created": "2026-09-08T00:00:00.000Z", + "modified": "2026-09-08T00:00:00.000Z", + "name": "MIDNIGHT NEPTUNE - Poisoned Repository Config and Claude Code Hooks", + "description": "GTIG reports that MIDNIGHT NEPTUNE, the DPRK-nexus financially motivated cluster formerly tracked as UNC1069, poisoned internal repository configurations and altered Claude CLI hooks. It then deployed the SOMBERMEME backdoor once a developer interacted with the repository. A Claude Code hook is a shell command the agent runs on its own lifecycle events, from settings that can live inside the repository. A developer who opened the project with the agent ran the attacker's command without ever executing the attacker's code directly.", + "published": "2026-09-08T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--09eb89f6-87ce-53eb-b768-5426676a32b3", + "attack-pattern--751a75d6-e12e-5a99-9e9c-0c1883bb882c", + "attack-pattern--a37e2a7e-23b4-571d-afa6-73dac4590f7e", + "attack-pattern--da2fef0c-c8e7-5a2d-ab67-cd7680462c67", + "intrusion-set--8d98ef39-b4e4-5983-9c4e-bef183783831", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0017" + }, + { + "source_name": "GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)", + "url": "https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--8be129ae-a743-5426-9516-e235ee862685", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "ad-g.org", + "description": "C2 domain (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'ad-g.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7d63adff-a86e-5cd6-8ea1-ae7acf2c7fb3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--8be129ae-a743-5426-9516-e235ee862685", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--188a9ece-ba6a-58fb-ab84-8ca6d9f63be2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "cdncounter.net", + "description": "Actor infrastructure domain (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'cdncounter.net']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--97dd6230-f623-5375-964b-f6004aa509a6", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--188a9ece-ba6a-58fb-ab84-8ca6d9f63be2", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--beba6e47-4992-51c9-adba-95aa70695a9b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "chamber-ua.org", + "description": "Lookalike of a Ukrainian chamber organization (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'chamber-ua.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--73326d68-ecf3-5877-b371-65077280fe90", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--beba6e47-4992-51c9-adba-95aa70695a9b", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--33b0f1a0-f7a7-5e80-ae01-69e29a1bce19", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "chathamhouse.eu", + "description": "Lookalike of Chatham House (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'chathamhouse.eu']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--fc8956b3-a321-5213-9cd4-55f134a19c43", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--33b0f1a0-f7a7-5e80-ae01-69e29a1bce19", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ab3b8412-2c97-5a77-ab6b-9f0424befd44", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "docs-viewer.org", + "description": "C2 nginx reverse proxy (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'docs-viewer.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7b845357-5e57-5a31-a2f5-482d50930430", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ab3b8412-2c97-5a77-ab6b-9f0424befd44", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--4cefa0a1-374a-5c53-a829-1ff4bdf125bc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "itechx.tel", + "description": "Actor identity domain (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'itechx.tel']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--872aba14-941c-55d4-86d9-c21e952c1635", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--4cefa0a1-374a-5c53-a829-1ff4bdf125bc", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--c44aa01d-0635-502f-bd96-19dca7ca39fa", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "m365-owa.com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'm365-owa.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4ee4c0e5-cec5-56fa-9bfb-52ad9e08f8f6", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--c44aa01d-0635-502f-bd96-19dca7ca39fa", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--b93052b4-9e61-5657-9f0e-9b44a6515865", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "meridian-protocol.org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'meridian-protocol.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--452d75ed-1f48-5d70-9d77-96f367a41e3d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--b93052b4-9e61-5657-9f0e-9b44a6515865", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--86dc56ed-15be-58a9-aadc-73bac95504b4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "meridiangroup-corp.com", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'meridiangroup-corp.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--0e6f7b90-f714-527a-a8d1-bfa37d7cfa68", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--86dc56ed-15be-58a9-aadc-73bac95504b4", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--fc2e5dc6-593e-5e0f-abdd-e358452d4aa1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "metricwave.org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'metricwave.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--da51192f-5588-5de4-b1a9-edf9bd9ad5ba", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--fc2e5dc6-593e-5e0f-abdd-e358452d4aa1", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--17a6d9ae-2d7d-5489-a432-c3947e97a92d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "mgsend.org", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'mgsend.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--53da0acb-747a-52d5-b47e-aef9c3e95549", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--17a6d9ae-2d7d-5489-a432-c3947e97a92d", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--35a2d5ef-f52d-5376-a436-9fe7fb73a171", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "ms365-device.com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'ms365-device.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--19265383-a1a3-5b2a-9f00-39ed10fe4bd0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--35a2d5ef-f52d-5376-a436-9fe7fb73a171", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--1057937a-37dd-5539-8062-3e8e112768ec", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "ms365-live.com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'ms365-live.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--69f0e95f-e312-57ee-937c-40b59b333988", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--1057937a-37dd-5539-8062-3e8e112768ec", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d0480c2a-683c-5487-9bfd-32462e8547bb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "my-invite.org", + "description": "Actor phishing domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'my-invite.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--11ab7893-89ca-5a2c-90f3-d4f62d580da3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--d0480c2a-683c-5487-9bfd-32462e8547bb", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--44f36342-58fb-5fe6-a085-f164710c3e7d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "mygreatmarket.com", + "description": "ClickFix cookie-exfil C2 (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'mygreatmarket.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2ad47a42-8e5a-5a74-be5c-3b9f55188063", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--44f36342-58fb-5fe6-a085-f164710c3e7d", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--156ad704-8c38-5183-85a3-19ae5cce2fbf", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "mygreatmarket.org", + "description": "ClickFix cookie-exfil C2 (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'mygreatmarket.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--039daadf-aec3-5684-ba43-73f18ff017f7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--156ad704-8c38-5183-85a3-19ae5cce2fbf", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--4c02c2ac-a089-5d33-ba90-9e6e11d3e2c8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "owa-ms365.com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'owa-ms365.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--24552037-bffe-5de4-bf74-6cc252b070c3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--4c02c2ac-a089-5d33-ba90-9e6e11d3e2c8", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--26967a27-943c-5f09-9c93-88a9463e4a60", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "projectnightcrawler.dev", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'projectnightcrawler.dev']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--3bcfe76d-ed70-5135-bdd5-2fb99a279a34", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--26967a27-943c-5f09-9c93-88a9463e4a60", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--bd7e554a-6d7c-5620-b89e-469c09a200ea", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "russianearabroad.com", + "description": "ClickFix lure (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'russianearabroad.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7761caed-51e2-5846-9a6c-80eb901e6b0a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--bd7e554a-6d7c-5620-b89e-469c09a200ea", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d991c5ed-4be1-588a-bf03-ab45e05ff4f7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "russianearabroad.org", + "description": "Actor persona domain (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'russianearabroad.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a2524b19-2924-58ae-af25-b6f36242c62c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--d991c5ed-4be1-588a-bf03-ab45e05ff4f7", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--1d2cebcd-42ac-5f93-afa7-2a89642d22a4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "static-ms.live", + "description": "Operator/lure infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'static-ms.live']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--f93306c0-50ca-5d7b-8717-19ae83854f3a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--1d2cebcd-42ac-5f93-afa7-2a89642d22a4", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--b7401406-95ae-51b8-bd4b-a7061454ae36", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "statistic-ms.live", + "description": "Primary RAT C2 domain (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'statistic-ms.live']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9e3eace9-5d7d-5831-99f3-f6a2536d2eed", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--b7401406-95ae-51b8-bd4b-a7061454ae36", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--6b768a76-9134-571e-9524-e25b92892b67", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "stuseamandesilt.org", + "description": "Campaign base domain (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'stuseamandesilt.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e6128366-c93e-53f0-a46f-fbc242d88c6c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--6b768a76-9134-571e-9524-e25b92892b67", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a5d72f5e-1fac-55b2-b444-eb1734878478", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "ukrinform-share.net", + "description": "Lookalike of Ukrinform (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'ukrinform-share.net']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c7597497-aa3d-561b-9754-fbf7e630c47d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a5d72f5e-1fac-55b2-b444-eb1734878478", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--7ff75d27-ec45-5818-8c0b-ae6f09609a60", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "wa-connect.eu", + "description": "ClickFix cookie exfil C2 (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'wa-connect.eu']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--667ecbb7-11bb-5544-84eb-14dd872296c0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--7ff75d27-ec45-5818-8c0b-ae6f09609a60", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--e46a95e4-c8f3-53cd-b52b-4557eb50515d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "wa-meeting.com", + "description": "WhatsApp Web pairing code phishing domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'wa-meeting.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b26f516e-95b6-5df4-b8e3-5961321aa9f8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--e46a95e4-c8f3-53cd-b52b-4557eb50515d", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--1303f39b-8e6d-5d03-8232-45fbad660ab5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "anna.manager@russianearabroad.net", + "description": "Phishing persona address (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[email-addr:value = 'anna.manager@russianearabroad.net']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7c86f33e-30a6-5f6c-91a7-e4595902c922", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--1303f39b-8e6d-5d03-8232-45fbad660ab5", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--5f3fb4bd-27a2-5c31-92dd-f8d1bf832678", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "events@embassy-protocol.int", + "description": "Phishing persona address (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[email-addr:value = 'events@embassy-protocol.int']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4466708b-7831-54ad-85e2-2318baf2a002", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--5f3fb4bd-27a2-5c31-92dd-f8d1bf832678", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d0586fec-079a-5979-96e0-24a245a660b1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "WUEngine.exe", + "description": "Malware file name. Windows malware (role malware, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'WUEngine.exe']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--3590d236-deb2-50a5-a913-b7219acffd86", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--d0586fec-079a-5979-96e0-24a245a660b1", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--6976af5f-3fec-53f4-b689-7cb9ac1345d4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "client_20260507093021_4286d211_x64.exe", + "description": "Malware build artifact (role malware, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'client_20260507093021_4286d211_x64.exe']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--bb9e6501-8e27-51bf-88d1-23bbaa128014", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--6976af5f-3fec-53f4-b689-7cb9ac1345d4", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--c1013a15-4daf-5d7b-b3e9-c5773d900cde", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "fix_network.apk", + "description": "Android malware payload (role malware, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'fix_network.apk']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--364e15ed-1286-5082-a208-f4123a90e590", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--c1013a15-4daf-5d7b-b3e9-c5773d900cde", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ddd71dcf-ebae-5acc-8572-8a66817686c8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "msedgeupdate_v3.exe", + "description": "Malware implant build (role malware, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:name = 'msedgeupdate_v3.exe']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--91a7a4d7-c601-5bed-a4c6-da232430c5b7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ddd71dcf-ebae-5acc-8572-8a66817686c8", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--44feb8b7-7c8c-5513-861b-392be2dffb0e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "api.stuseamandesilt.org", + "description": "Campaign C2 (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'api.stuseamandesilt.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--72fe338c-3d17-500b-8004-c8efbe218bdb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--44feb8b7-7c8c-5513-861b-392be2dffb0e", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--45d29442-ba74-5cd4-9ed8-5a442c168171", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "cdn.stuseamandesilt.org", + "description": "Campaign malware delivery (role malware_delivery, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'cdn.stuseamandesilt.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--28f03857-a514-52de-9843-0ff2f4333abb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--45d29442-ba74-5cd4-9ed8-5a442c168171", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a529c24e-26e9-500c-8167-fd7dfc37e543", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "mslivetest.duckdns.org", + "description": "Dynamic-DNS C2 (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'mslivetest.duckdns.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8b3cdcd8-c2d8-5d5c-a9b7-88ed27aacd36", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a529c24e-26e9-500c-8167-fd7dfc37e543", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--423e7f76-7d62-5c85-af9d-d76bde6ebf9b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "pdfviewer2024.b-cdn.net", + "description": "Malware payload domain (role malware_delivery, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'pdfviewer2024.b-cdn.net']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--1cdd6b68-7f55-570c-88f9-e57566b20758", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--423e7f76-7d62-5c85-af9d-d76bde6ebf9b", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--f84b041b-76db-5726-85b0-fc2210dc4046", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "static.cdncounter.net", + "description": "Exploit/payload delivery hostname (role malware_delivery, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'static.cdncounter.net']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9f190a8a-174d-5d54-b0df-5eb7028a5267", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--f84b041b-76db-5726-85b0-fc2210dc4046", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ba31e2f1-b785-544c-b9a7-c7e45c9e04ad", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "teams.ms365-live.com", + "description": "Microsoft 365 Phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'teams.ms365-live.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8be6a7b5-5519-5e54-9edd-f56234834fa8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ba31e2f1-b785-544c-b9a7-c7e45c9e04ad", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--21802db9-cfa5-5abb-8e90-fdff24c728e0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "update.stuseamandesilt.org", + "description": "Campaign subdomain (role malware_delivery, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'update.stuseamandesilt.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b6658a69-1ea3-54e7-b598-a1da6002614c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--21802db9-cfa5-5abb-8e90-fdff24c728e0", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--fa4379f2-bb80-57ae-adb7-1e8dbc05befa", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "104.145.210.184", + "description": "Embassy Kit device-code phishing VPS (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '104.145.210.184']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--535370a8-6fb8-54f1-a270-661c4707b038", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--fa4379f2-bb80-57ae-adb7-1e8dbc05befa", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--fb2d1e0c-b21e-5161-bb8a-c9a1ea309fea", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "104.194.149.228", + "description": "Phishing VPS (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '104.194.149.228']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--32200129-fa2b-597f-afce-fc9f7b89b187", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--fb2d1e0c-b21e-5161-bb8a-c9a1ea309fea", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--8b581d08-a70b-5524-9c84-83653ceedba8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "104.194.151.133", + "description": "Primary C2 VPS (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '104.194.151.133']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--df4e10fc-d781-57e9-aeb8-07b63f185eb2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--8b581d08-a70b-5524-9c84-83653ceedba8", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a422511e-a468-503b-9169-25b283540cd7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "104.194.159.55", + "description": "C2 holding exfiltrated browser-data zips (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '104.194.159.55']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--481e4ee0-2bf7-5bea-81f4-76c427cc3b4c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a422511e-a468-503b-9169-25b283540cd7", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--4eca2329-0c0a-5eaa-b519-04d4a1e8005d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "144.172.114.192", + "description": "C2 proxy IP / operator VPS (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '144.172.114.192']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--959c81ec-1f8d-538e-b195-0df77829ccae", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--4eca2329-0c0a-5eaa-b519-04d4a1e8005d", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--31e81d6b-93c7-54a9-a582-1662a3daba3b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "148.135.195.111", + "description": "C2 Endpoint (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '148.135.195.111']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4e8cd510-bfdf-5440-845c-c8405fb47e9f", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--31e81d6b-93c7-54a9-a582-1662a3daba3b", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--66c6ec77-6c46-595e-95dd-347a3f0b4304", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "149.54.42.106", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '149.54.42.106']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6034a94b-09c3-59c4-9bb1-45a09be39dbe", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--66c6ec77-6c46-595e-95dd-347a3f0b4304", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--2c055855-c5f9-51fa-ac30-7f711f8d1aa9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "185.198.234.101", + "description": "C2 server (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '185.198.234.101']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--67855953-f40d-57b1-bc62-54cedcde233d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--2c055855-c5f9-51fa-ac30-7f711f8d1aa9", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--c42b4a22-4d6d-559c-b0af-cd74c82e73d6", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "185.198.234.26", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '185.198.234.26']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--066e60f4-61cb-5968-9b42-f69d8d982e70", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--c42b4a22-4d6d-559c-b0af-cd74c82e73d6", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--c886f85d-07cb-5c43-9f22-f4736e6f112a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "2.26.53.194", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '2.26.53.194']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2e915659-ce1c-56aa-a003-275fe1ee22ae", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--c886f85d-07cb-5c43-9f22-f4736e6f112a", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--33ba270d-1cf8-5705-a176-1a91a642c427", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "213.145.86.112", + "description": "Operator/operational infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '213.145.86.112']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--cd83f2ef-4d5c-54df-8b80-5be4e7a774a9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--33ba270d-1cf8-5705-a176-1a91a642c427", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--fb086f71-748e-5cb2-be34-213431e6bfbd", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "31.57.243.154", + "description": "Phishing host (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '31.57.243.154']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--58286995-e989-503b-9af2-c1aa56419f0a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--fb086f71-748e-5cb2-be34-213431e6bfbd", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ef2dee24-915d-5b8f-a51b-f28812533882", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "38.146.28.132", + "description": "Actor rogue DNS resolver (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '38.146.28.132']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--4b6d85cf-a6a0-5556-8204-59043e57deaa", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ef2dee24-915d-5b8f-a51b-f28812533882", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--2c635edb-8323-5b46-a404-c34ba139c20e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "38.146.28.75", + "description": "Notifier C2 for the phishing console (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '38.146.28.75']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--cee78b9e-3e23-5052-a1c6-39e3641d8f39", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--2c635edb-8323-5b46-a404-c34ba139c20e", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a1e7a7b2-4d26-5336-8247-8e034260796e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593", + "description": "Windows Backdoor (role malware, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:hashes.'SHA-256' = '918fa52ae45ed60ba7cc8bdc99c3cbe9ab92e0375ec31fc05d0d4513be11c593']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a7ba3ecb-342a-5684-a0c9-b1ece0ee122e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a1e7a7b2-4d26-5336-8247-8e034260796e", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--67a28774-6ae6-5d48-b555-678ef32dd8f8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c", + "description": "Malware hash (role malware, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[file:hashes.'SHA-256' = 'be99857449d2856dd5a84e21c8a3d5e0e01456adb44062ddec5a6b4970d8d42c']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--bbdd0f70-0c43-5d01-99bb-f6978bc5c381", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--67a28774-6ae6-5d48-b555-678ef32dd8f8", + "target_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e02674db-b1af-5a4d-b7f5-8b9a5e2aa80b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7ed22620-2dc2-563e-ba11-b749a32109c2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "identity--3792b856-8cf5-5432-8392-af5b197a566a" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a408ac74-126c-5dba-b617-a259dfd52c10", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "identity--c176d369-1ee0-599c-bec9-0a4b5d9e11ff" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--1198b75d-e5da-5473-8726-6298787c9164", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1", + "target_ref": "location--c10b615d-b039-5eb1-bf2b-bc878b6609fc" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--cacbac05-184a-56cd-95a5-3a18897479d6", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-20006 - Russian State-Nexus Espionage Run Through AI Workflows", + "description": "Anthropic reports a Russian-speaking operator whose tradecraft and targeting it assesses as consistent with Russian state-nexus espionage. Between December 2025 and August 2026 the operator used Claude models across reconnaissance, device-code phishing infrastructure, bulk collection and keeping access. The human operator mostly edited the Claude Code skills that drove the workflows and let the workflows run. Victim-side artefacts are conventional: Windows implants, phishing domains and device-code phishing infrastructure.", + "published": "2026-09-10T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--06e1aeed-f839-5de1-b96c-69ee456919f7", + "attack-pattern--11fe5ae3-76dc-584e-ba3f-800779668835", + "attack-pattern--3c7664be-7fa4-5efb-a852-d1fdc740cc3a", + "attack-pattern--9b4d2a22-c803-5df9-868b-5cd3680c2487", + "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288", + "attack-pattern--c6dff4d5-68a2-5269-ba49-a64550631752", + "indicator--1057937a-37dd-5539-8062-3e8e112768ec", + "indicator--1303f39b-8e6d-5d03-8232-45fbad660ab5", + "indicator--156ad704-8c38-5183-85a3-19ae5cce2fbf", + "indicator--17a6d9ae-2d7d-5489-a432-c3947e97a92d", + "indicator--188a9ece-ba6a-58fb-ab84-8ca6d9f63be2", + "indicator--1d2cebcd-42ac-5f93-afa7-2a89642d22a4", + "indicator--21802db9-cfa5-5abb-8e90-fdff24c728e0", + "indicator--26967a27-943c-5f09-9c93-88a9463e4a60", + "indicator--2c055855-c5f9-51fa-ac30-7f711f8d1aa9", + "indicator--2c635edb-8323-5b46-a404-c34ba139c20e", + "indicator--31e81d6b-93c7-54a9-a582-1662a3daba3b", + "indicator--33b0f1a0-f7a7-5e80-ae01-69e29a1bce19", + "indicator--33ba270d-1cf8-5705-a176-1a91a642c427", + "indicator--35a2d5ef-f52d-5376-a436-9fe7fb73a171", + "indicator--423e7f76-7d62-5c85-af9d-d76bde6ebf9b", + "indicator--44f36342-58fb-5fe6-a085-f164710c3e7d", + "indicator--44feb8b7-7c8c-5513-861b-392be2dffb0e", + "indicator--45d29442-ba74-5cd4-9ed8-5a442c168171", + "indicator--4c02c2ac-a089-5d33-ba90-9e6e11d3e2c8", + "indicator--4cefa0a1-374a-5c53-a829-1ff4bdf125bc", + "indicator--4eca2329-0c0a-5eaa-b519-04d4a1e8005d", + "indicator--5f3fb4bd-27a2-5c31-92dd-f8d1bf832678", + "indicator--66c6ec77-6c46-595e-95dd-347a3f0b4304", + "indicator--67a28774-6ae6-5d48-b555-678ef32dd8f8", + "indicator--6976af5f-3fec-53f4-b689-7cb9ac1345d4", + "indicator--6b768a76-9134-571e-9524-e25b92892b67", + "indicator--7ff75d27-ec45-5818-8c0b-ae6f09609a60", + "indicator--86dc56ed-15be-58a9-aadc-73bac95504b4", + "indicator--8b581d08-a70b-5524-9c84-83653ceedba8", + "indicator--8be129ae-a743-5426-9516-e235ee862685", + "indicator--a1e7a7b2-4d26-5336-8247-8e034260796e", + "indicator--a422511e-a468-503b-9169-25b283540cd7", + "indicator--a529c24e-26e9-500c-8167-fd7dfc37e543", + "indicator--a5d72f5e-1fac-55b2-b444-eb1734878478", + "indicator--ab3b8412-2c97-5a77-ab6b-9f0424befd44", + "indicator--b7401406-95ae-51b8-bd4b-a7061454ae36", + "indicator--b93052b4-9e61-5657-9f0e-9b44a6515865", + "indicator--ba31e2f1-b785-544c-b9a7-c7e45c9e04ad", + "indicator--bd7e554a-6d7c-5620-b89e-469c09a200ea", + "indicator--beba6e47-4992-51c9-adba-95aa70695a9b", + "indicator--c1013a15-4daf-5d7b-b3e9-c5773d900cde", + "indicator--c42b4a22-4d6d-559c-b0af-cd74c82e73d6", + "indicator--c44aa01d-0635-502f-bd96-19dca7ca39fa", + "indicator--c886f85d-07cb-5c43-9f22-f4736e6f112a", + "indicator--d0480c2a-683c-5487-9bfd-32462e8547bb", + "indicator--d0586fec-079a-5979-96e0-24a245a660b1", + "indicator--d991c5ed-4be1-588a-bf03-ab45e05ff4f7", + "indicator--ddd71dcf-ebae-5acc-8572-8a66817686c8", + "indicator--e46a95e4-c8f3-53cd-b52b-4557eb50515d", + "indicator--ef2dee24-915d-5b8f-a51b-f28812533882", + "indicator--f84b041b-76db-5726-85b0-fc2210dc4046", + "indicator--fa4379f2-bb80-57ae-adb7-1e8dbc05befa", + "indicator--fb086f71-748e-5cb2-be34-213431e6bfbd", + "indicator--fb2d1e0c-b21e-5161-bb8a-c9a1ea309fea", + "indicator--fc2e5dc6-593e-5e0f-abdd-e358452d4aa1", + "intrusion-set--26ebe61e-57e7-59f0-a28a-3cfcee17c6f1" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0018" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-20006 Russian espionage", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--fabda6fa-6d5d-5de2-bade-21f2b3888f75", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "ari-chain.com", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'ari-chain.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6dcb5c73-ced8-5b07-ad4c-c77755d0a19f", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--fabda6fa-6d5d-5de2-bade-21f2b3888f75", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--58884eba-088e-514a-86ac-72758953c159", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "arichain.network", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'arichain.network']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--be4be299-123c-5ca6-8156-776aa85264f1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--58884eba-088e-514a-86ac-72758953c159", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--0baeea2b-3c78-5aa8-aec2-c7e63070c32b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "bitmart-mystery.com", + "description": "Crypto Themed Phishing Domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'bitmart-mystery.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--687990a5-646d-5b37-9c7f-e750cabbc243", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--0baeea2b-3c78-5aa8-aec2-c7e63070c32b", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d25d134c-8356-51c9-8097-e99b9512d698", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "defi-claim.xyz", + "description": "Phishing Domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'defi-claim.xyz']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--eed39b8c-051e-552b-8f7c-912d6842989c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--d25d134c-8356-51c9-8097-e99b9512d698", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--bf97cde6-9fae-5fab-9c2e-2b6678733a61", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "emailsecure.email", + "description": "Actor email domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'emailsecure.email']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e9edfa8f-e386-5ada-baea-92f4fd95ab87", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--bf97cde6-9fae-5fab-9c2e-2b6678733a61", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--eabd8379-8289-511e-ac11-91889f13615d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "mozilla.ws", + "description": "Mozilla brand-impersonation phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'mozilla.ws']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--5eec49d0-00cd-5508-86a2-8ae837e9275f", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--eabd8379-8289-511e-ac11-91889f13615d", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--cc67099a-0f97-5f62-868d-66dd53d92b35", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "on-pssword.com", + "description": "1Password typosquat phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'on-pssword.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--699f9608-848c-5119-87e7-a349f84b0849", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--cc67099a-0f97-5f62-868d-66dd53d92b35", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--7623fc7f-7b2f-5488-a144-d1863e41f30e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "policenationale.cc", + "description": "A domain name impersonating the French national police (though we believe this served as branding for the criminal storefront rather than as a phishing lure) (role monetization, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'policenationale.cc']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9f9b6174-7c7c-5073-a941-6aa93b41a4d5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--7623fc7f-7b2f-5488-a144-d1863e41f30e", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--562847f7-7363-54f8-b648-20b6e735fd77", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "service-infos.info", + "description": "Phishing email domain (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'service-infos.info']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--83eb916e-3457-5a06-8deb-0ca33440a1f8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--562847f7-7363-54f8-b648-20b6e735fd77", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--40f1bbc0-953c-5787-808e-75ddf9159eeb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "signin-1psswoord.com", + "description": "1Password phishing (role phishing, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'signin-1psswoord.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--f3078b5f-7c70-5778-82ad-4d92413d05a2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--40f1bbc0-953c-5787-808e-75ddf9159eeb", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--36e31986-c83c-524c-95dc-372d0404f076", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "soraki.cc", + "description": "AutoShop carding storefront (role monetization, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'soraki.cc']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9ce70e0a-6109-5e79-ba18-6477f6ef108b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--36e31986-c83c-524c-95dc-372d0404f076", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--e6c9b7ec-a7dd-5cab-9d12-ca3d44618fd6", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "soraki.work", + "description": "Actor infrastructure (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'soraki.work']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--bb1fd0d6-c8d0-5b2f-9d48-7d5591e9ff78", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--e6c9b7ec-a7dd-5cab-9d12-ca3d44618fd6", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--48985905-2eba-55b7-90b7-d211ceae276a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "autoshop.policenationale.cc", + "description": "Served as the web frontend for the actor's carding autoshop (role monetization, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'autoshop.policenationale.cc']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--875b0e77-6074-5006-8353-cf38fc2f1929", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--48985905-2eba-55b7-90b7-d211ceae276a", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d9bbe822-50a1-5ac0-a117-d022b6865bd5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "esvfecawvjmchjslqyemho2fiduc59wzn.oast.fun", + "description": "Callback domain to confirm SSRF and out of band code execution (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'esvfecawvjmchjslqyemho2fiduc59wzn.oast.fun']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ba1a536e-f054-526f-a5ad-9be2198e4a21", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--d9bbe822-50a1-5ac0-a117-d022b6865bd5", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--5d62e38d-91f2-5f91-adb3-78fab5feb59c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers.dev", + "description": "Cloudflare Workers proxy (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'soraki-proxy.20245aad98d27b1b1a2f0f103e1d7ee0.workers.dev']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--032dc908-b349-5d49-80e5-95cd347212d0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--5d62e38d-91f2-5f91-adb3-78fab5feb59c", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--b348abcf-27de-50b9-bab0-1b49ca3f534f", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "updatebeacon.duckdns.org", + "description": "C2 callback domain (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'updatebeacon.duckdns.org']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--5981aa72-0942-51cd-be2d-b4f7564daebf", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--b348abcf-27de-50b9-bab0-1b49ca3f534f", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--2b37a03c-57a7-5e36-81db-3e5ed5a39381", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "104.193.135.207", + "description": "Attacker egress IP (seen 2026-04-05 to 2026-04-05; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '104.193.135.207']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--63db11f5-dfb0-5fad-910e-a471ba28917d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--2b37a03c-57a7-5e36-81db-3e5ed5a39381", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--e9e25d99-5008-563c-aff8-132ac5fe26d4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "104.36.50.54", + "description": "Attacker egress IP (seen 2026-04-24 to 2026-04-24; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '104.36.50.54']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--15b59358-b7fe-59a2-a4e5-364e2a9c9667", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--e9e25d99-5008-563c-aff8-132ac5fe26d4", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a3ee2684-5dad-537d-9aa9-9fec323b9cf8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "162.128.129.106", + "description": "Attacker egress IP (seen 2026-02-20 to 2026-03-10; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '162.128.129.106']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--0a7c6b60-7e2e-51d5-940b-e169a9127c88", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a3ee2684-5dad-537d-9aa9-9fec323b9cf8", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--8bdfdb80-949a-5f94-aa84-73c0d5dafea9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "176.177.12.62", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '176.177.12.62']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--da651025-e269-50b2-997d-970dccd7a6b9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--8bdfdb80-949a-5f94-aa84-73c0d5dafea9", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--0d34302e-25f1-5265-82f9-ae91833660bc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "185.65.134.199", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-28; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '185.65.134.199']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--41f91b67-ef68-56d4-ae59-b6b2c87e6de0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--0d34302e-25f1-5265-82f9-ae91833660bc", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--eee1cf30-0a4f-5ffa-a616-9d62605f2f9a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "185.65.134.246", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-05-04; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '185.65.134.246']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--67aae6f1-79db-577f-add0-33913e8143e4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--eee1cf30-0a4f-5ffa-a616-9d62605f2f9a", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--f23607b4-b8be-5801-aa72-d2b3d09e1d4e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "193.32.249.161", + "description": "Attacker egress IP (seen 2026-03-21 to 2026-04-18; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '193.32.249.161']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--f3ffafce-8a07-566d-9023-be0d89afcbc3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--f23607b4-b8be-5801-aa72-d2b3d09e1d4e", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--9a3a2118-9169-5892-b778-712c73082d32", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "193.32.249.164", + "description": "Attacker egress IP (seen 2026-04-18 to 2026-05-06; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '193.32.249.164']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7b68fc94-a9de-5a4f-a386-dc3e2a1edd5d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--9a3a2118-9169-5892-b778-712c73082d32", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ed0dee61-a1b0-5c7f-8866-2844945ac47c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "193.32.249.170", + "description": "Attacker egress IP (seen 2026-03-20 to 2026-04-06; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '193.32.249.170']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--742db24d-a30f-544a-9f31-b92bde25af24", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ed0dee61-a1b0-5c7f-8866-2844945ac47c", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ea4da452-4b36-5922-91e2-668f3131ab40", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "195.178.110.131", + "description": "VPS Host (seen 2026-03-12 to 2026-04-30; role infrastructure, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '195.178.110.131']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--77bbb2b1-f9fb-5ceb-a02e-3787f2d30f2f", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ea4da452-4b36-5922-91e2-668f3131ab40", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--0ac108cb-83e0-56fa-818d-08d30d0f7ce7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "45.148.10.242", + "description": "Attacker egress IP (seen 2026-04-06 to 2026-04-27; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '45.148.10.242']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e46120bf-89cf-5a77-8d8e-0422e19037bb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--0ac108cb-83e0-56fa-818d-08d30d0f7ce7", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--b757aeab-1f2a-5511-a376-f3e91ea101bc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "91.171.138.169", + "description": "Attacker egress IP (seen 2026-04-19 to 2026-04-21; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '91.171.138.169']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--6583a1bc-9cd8-5d74-a586-a989afda6538", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--b757aeab-1f2a-5511-a376-f3e91ea101bc", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--3dd13b6f-9aec-5496-aa34-3201f1890d00", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "92.118.39.3", + "description": "Attacker egress IP (seen 2026-04-10 to 2026-04-19; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '92.118.39.3']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--b876f0ef-aa59-5cdb-a607-d0ef7f624289", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--3dd13b6f-9aec-5496-aa34-3201f1890d00", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--9d404216-ac02-5625-a32b-da812b1d2dbb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "2a01:e0a:2e2:aa40:b15d:5d28:6f4a:8d53", + "description": "Attacker egress IP (seen 2026-04-20 to 2026-04-21; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv6-addr:value = '2a01:e0a:2e2:aa40:b15d:5d28:6f4a:8d53']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8d42c04e-6302-5482-9ea7-21b704fce8ed", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--9d404216-ac02-5625-a32b-da812b1d2dbb", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--35cab564-60ed-5275-b5f7-64144fd3c8d2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "2a04:cec0:1185:34f2:a150:7081:caed:448e", + "description": "Attacker egress IP (seen 2026-04-06 to 2026-04-07; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv6-addr:value = '2a04:cec0:1185:34f2:a150:7081:caed:448e']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--3583992d-9044-5213-8780-abf8f724feb9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--35cab564-60ed-5275-b5f7-64144fd3c8d2", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--5e3be593-543f-5fe0-a086-4b106cee99c5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "https://s3.eu-central-1.s4.mega.io/fuckyoubasil/", + "description": "Exfiltration URL (role exfiltration, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[url:value = 'https://s3.eu-central-1.s4.mega.io/fuckyoubasil/']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ca613d4d-3b7c-5c2d-a8dc-1335eacbc189", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--5e3be593-543f-5fe0-a086-4b106cee99c5", + "target_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--b6c649ba-cf5f-5ea2-ae33-b34dd0f749fd", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "transportation", + "identity_class": "class", + "sectors": [ + "transportation" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d665fd7f-e1c4-5edc-8b65-892807dff166", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "identity--b6c649ba-cf5f-5ea2-ae33-b34dd0f749fd" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--54cb1e92-2f8c-5ff4-aebb-b0c1d42981ba", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "identity--b844bf0e-4364-5afd-b786-fcd835c1e648" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7a16cdd5-c750-545b-ba08-e5cb8bfa3279", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "identity--e58ef490-e52d-5c88-916d-a8b15a6f360a" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--27997012-c032-565f-a61f-8eecf082e81b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "telecommunications", + "identity_class": "class", + "sectors": [ + "telecommunications" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--03406a8c-4a24-5de7-ae8d-a1609fd04c1d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "identity--27997012-c032-565f-a61f-8eecf082e81b" + }, + { + "type": "location", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "location--a6ce891e-09e8-509a-91aa-a9cef253f315", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "FR", + "country": "FR" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--80158027-2843-5639-8a3c-3acd9c93313d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a", + "target_ref": "location--a6ce891e-09e8-509a-91aa-a9cef253f315" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--598d81d3-a2ce-5de5-a5c7-2cfff619084e", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50014 - ShinyHunters Affiliates Vibe-Hacking SaaS Estates", + "description": "Anthropic reports operators suspected to be ShinyHunters affiliates running a vibe-hacking loop. They gave Claude a general goal, such as using a stolen credential or retrieving data, then let it evaluate the environment and write and run scripts until the goal was met. Reported losses include more than 1 TB from one technology provider, tens of millions of passenger records from an airline, and data from around 200 downstream SaaS customers. The operators also ran credential-validation pipelines on EC2 workers, scanned decompiled mobile apps for secrets with TruffleHog, and moved stolen data through Telegram.", + "published": "2026-09-10T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--01865f34-5f5f-51d1-8f1a-51ff58f3c563", + "attack-pattern--2339d29a-b18d-53ea-8c53-cba484d8d811", + "attack-pattern--c6dff4d5-68a2-5269-ba49-a64550631752", + "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955", + "attack-pattern--d769b860-e3c7-55c9-ae11-83cdf3c2b09d", + "indicator--0ac108cb-83e0-56fa-818d-08d30d0f7ce7", + "indicator--0baeea2b-3c78-5aa8-aec2-c7e63070c32b", + "indicator--0d34302e-25f1-5265-82f9-ae91833660bc", + "indicator--2b37a03c-57a7-5e36-81db-3e5ed5a39381", + "indicator--35cab564-60ed-5275-b5f7-64144fd3c8d2", + "indicator--36e31986-c83c-524c-95dc-372d0404f076", + "indicator--3dd13b6f-9aec-5496-aa34-3201f1890d00", + "indicator--40f1bbc0-953c-5787-808e-75ddf9159eeb", + "indicator--48985905-2eba-55b7-90b7-d211ceae276a", + "indicator--562847f7-7363-54f8-b648-20b6e735fd77", + "indicator--58884eba-088e-514a-86ac-72758953c159", + "indicator--5d62e38d-91f2-5f91-adb3-78fab5feb59c", + "indicator--5e3be593-543f-5fe0-a086-4b106cee99c5", + "indicator--7623fc7f-7b2f-5488-a144-d1863e41f30e", + "indicator--8bdfdb80-949a-5f94-aa84-73c0d5dafea9", + "indicator--9a3a2118-9169-5892-b778-712c73082d32", + "indicator--9d404216-ac02-5625-a32b-da812b1d2dbb", + "indicator--a3ee2684-5dad-537d-9aa9-9fec323b9cf8", + "indicator--b348abcf-27de-50b9-bab0-1b49ca3f534f", + "indicator--b757aeab-1f2a-5511-a376-f3e91ea101bc", + "indicator--bf97cde6-9fae-5fab-9c2e-2b6678733a61", + "indicator--cc67099a-0f97-5f62-868d-66dd53d92b35", + "indicator--d25d134c-8356-51c9-8097-e99b9512d698", + "indicator--d9bbe822-50a1-5ac0-a117-d022b6865bd5", + "indicator--e6c9b7ec-a7dd-5cab-9d12-ca3d44618fd6", + "indicator--e9e25d99-5008-563c-aff8-132ac5fe26d4", + "indicator--ea4da452-4b36-5922-91e2-668f3131ab40", + "indicator--eabd8379-8289-511e-ac11-91889f13615d", + "indicator--ed0dee61-a1b0-5c7f-8866-2844945ac47c", + "indicator--eee1cf30-0a4f-5ffa-a616-9d62605f2f9a", + "indicator--f23607b4-b8be-5801-aa72-d2b3d09e1d4e", + "indicator--fabda6fa-6d5d-5de2-bade-21f2b3888f75", + "intrusion-set--142575d7-2b6b-5def-8999-d1ef6574c14a" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0019" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50014 ShinyHunters smash-and-grab opportunists", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--c7f15a66-aa24-5d1a-9105-770973f050d7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "141.133.125.208", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-05-23; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '141.133.125.208']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--fd357f6e-6503-59b9-958e-1feeef685639", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--c7f15a66-aa24-5d1a-9105-770973f050d7", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--b2ba08fd-4821-5d91-90f7-f452ab3b0b1f", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "146.103.101.253", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-13; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '146.103.101.253']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--81021cf4-8624-5777-a2e1-03a0aee07cbc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--b2ba08fd-4821-5d91-90f7-f452ab3b0b1f", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--818200b5-b142-5199-b50b-0362f523eaeb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "146.103.97.169", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-05-25; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '146.103.97.169']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--06ef7e1a-54d0-5db7-92cc-657fad9667e5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--818200b5-b142-5199-b50b-0362f523eaeb", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--abe7fd9f-7733-589a-b700-33dec9845840", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "167.250.111.136", + "description": "Attacker egress IP (seen 2026-05-23 to 2026-06-03; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '167.250.111.136']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--673203cf-3947-59c8-8b1c-84510aa57fa1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--abe7fd9f-7733-589a-b700-33dec9845840", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a6e8f1a3-7667-5751-a0d0-340c335faadc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "178.16.54.141", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-16; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '178.16.54.141']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7514d7de-d0ba-57bb-8d8b-8cb98e2a682c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a6e8f1a3-7667-5751-a0d0-340c335faadc", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--65f4a294-516c-54e5-be93-909aaa148b7d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "194.163.183.216", + "description": "Attacker egress IP (seen 2026-05-23 to 2026-05-24; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '194.163.183.216']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9c6eb6a9-e4bf-51a8-97b9-51a59cc88149", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--65f4a294-516c-54e5-be93-909aaa148b7d", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--9b25b515-6723-5732-86e4-441f3e6b2433", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "202.66.167.230", + "description": "Attacker egress IP (seen 2026-05-21 to 2026-06-04; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '202.66.167.230']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e9518e3f-3427-579b-9ff6-7321941f42c8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--9b25b515-6723-5732-86e4-441f3e6b2433", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--7f6c18e8-7951-5da1-a26b-f55a23f8a5d2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "37.27.103.22", + "description": "Attacker egress IP (seen 2026-05-26 to 2026-06-13; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '37.27.103.22']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--be1c24e1-f2f7-50c3-af72-127eab9fb25c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--7f6c18e8-7951-5da1-a26b-f55a23f8a5d2", + "target_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--74a7cc80-8dc0-5681-bf7d-8516259a10e4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "commercial-facilities", + "identity_class": "class", + "sectors": [ + "commercial-facilities" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ed9b5548-2a8f-5128-8613-7da1a4a90ba7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "target_ref": "identity--74a7cc80-8dc0-5681-bf7d-8516259a10e4" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--66b7465b-885f-5977-80f3-296508dc3389", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c", + "target_ref": "identity--e55086c4-2284-53d8-8072-d0c42fe13709" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--45b02a49-9139-5a64-bdc5-9324c0de7ec9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50020 - From Hotel Booking Fraud to Probing AI Companies", + "description": "Anthropic reports a Russian-speaking, financially motivated actor with a history of intrusions against hotel booking and fintech platforms. It built a containerised pentest platform with a local model gateway and worker agents that tested injection, XSS, authentication bypass and SSRF. It then turned the pipeline on around 30 AI companies in about four days, with the stated goal of reaching a pre-release model.", + "published": "2026-09-10T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--40209df8-ca30-5bac-b3ce-aa47b7c779e1", + "attack-pattern--4acd779c-9b97-5a6a-afb6-b1225b446d41", + "attack-pattern--c3a3fd88-0ac5-5294-973f-0dbee15b1da5", + "attack-pattern--c4fdb68f-6dd0-51bc-a57e-decf0b15e75e", + "indicator--65f4a294-516c-54e5-be93-909aaa148b7d", + "indicator--7f6c18e8-7951-5da1-a26b-f55a23f8a5d2", + "indicator--818200b5-b142-5199-b50b-0362f523eaeb", + "indicator--9b25b515-6723-5732-86e4-441f3e6b2433", + "indicator--a6e8f1a3-7667-5751-a0d0-340c335faadc", + "indicator--abe7fd9f-7733-589a-b700-33dec9845840", + "indicator--b2ba08fd-4821-5d91-90f7-f452ab3b0b1f", + "indicator--c7f15a66-aa24-5d1a-9105-770973f050d7", + "intrusion-set--d9f066f7-1448-58b9-82bc-dea7dbbf093c" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0020" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50020 From hotel bookings to the AI supply chain", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--f514894a-ec20-53a3-a962-32650319c1a9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "fafwatch.xyz", + "description": "Actor-registered doxing adjacent domain (seen 2026-04 to ?; role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'fafwatch.xyz']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--22ac8218-24c3-5d26-9246-8031d1369e7c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--f514894a-ec20-53a3-a962-32650319c1a9", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--e0e0631b-efc2-5ea9-89ee-3fd79cbcdad2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "prod-artfkt.com", + "description": "Actor-registered operational domain (seen 2026-04 to ?; role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'prod-artfkt.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--0a522e2f-dcc6-5e44-8518-ae82fa105871", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--e0e0631b-efc2-5ea9-89ee-3fd79cbcdad2", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--4c4699dd-c9ff-526d-bdfd-36ca2a19b7c2", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "frntrs-analytics-863060591218.europe-west1.run.app", + "description": "Cloud Run origin behind C2 domain (seen 2026-05-13 to 2026-06; role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'frntrs-analytics-863060591218.europe-west1.run.app']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--57bc6a37-3e19-579e-89c2-376b3b2e12d9", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--4c4699dd-c9ff-526d-bdfd-36ca2a19b7c2", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--3f08bee6-10e9-55d3-9ea1-1ee85e07b0fb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "frntrs-analytics.dedyn.io", + "description": "BeEF browser-C2 hostname (deSEC dynamic DNS, actor-held API token) (seen 2026-05-13 to 2026-06; role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'frntrs-analytics.dedyn.io']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--54aaf7c2-480b-5d0d-9e1a-be1107a5e442", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--3f08bee6-10e9-55d3-9ea1-1ee85e07b0fb", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--c12ef018-9d0e-5e00-9fae-fa8d831f54ce", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "103.124.165.199", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '103.124.165.199']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9d73d8ea-453a-57ee-a46a-1bace4a918e1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--c12ef018-9d0e-5e00-9fae-fa8d831f54ce", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--d4a39676-88c7-5d1e-bf81-86739666d301", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "103.141.60.144", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '103.141.60.144']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--fee5cf3f-67c5-5ca5-af37-85bca6e04f17", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--d4a39676-88c7-5d1e-bf81-86739666d301", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a2159ba2-fca1-5937-87e0-5ada5531a4b1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "103.216.220.19", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '103.216.220.19']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--daf5eb6e-b8bd-5ca5-9748-85cdb82c96b0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a2159ba2-fca1-5937-87e0-5ada5531a4b1", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--58e3a704-be04-5259-9445-de126e43ff06", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "136.144.242.56", + "description": "Staging & scan box used on EU political organizations (seen 2026-05-17 to 2026-05-21; role staging, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '136.144.242.56']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d5f49a9d-f54d-5724-8d0e-f14cbdea6139", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--58e3a704-be04-5259-9445-de126e43ff06", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--3e53ab0e-03c0-54bb-b0e8-501dffacab4b", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "138.199.6.208", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '138.199.6.208']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--97622678-fed5-5810-9da9-94d2f021a5e3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--3e53ab0e-03c0-54bb-b0e8-501dffacab4b", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--66609507-4ec0-53bd-b256-133c2fa2587c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "138.199.60.29", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '138.199.60.29']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--e1ca25af-3f02-5236-ba5e-e1fa55e4633a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--66609507-4ec0-53bd-b256-133c2fa2587c", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ace591d4-bccb-54dc-96d9-6ea5f4b25884", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "139.59.2.243", + "description": "Key-validation box (DigitalOcean) (seen 2026-02-06 to 2026-06-12; role key_validation, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '139.59.2.243']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--69508132-c7d0-59a1-86ac-546560e4c8cf", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ace591d4-bccb-54dc-96d9-6ea5f4b25884", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--703e3eec-dba6-50ed-ae81-f45d4b1f5c00", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "146.70.116.131", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '146.70.116.131']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--12e26240-3589-5a54-a0bb-facb8afb1f29", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--703e3eec-dba6-50ed-ae81-f45d4b1f5c00", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--ed423fa8-35aa-5d9e-af19-98a55e11e995", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "149.22.83.6", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '149.22.83.6']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--fa7cd618-d561-5e63-86a5-f8f67d0b8ab1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--ed423fa8-35aa-5d9e-af19-98a55e11e995", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--3bc89a62-eb80-523c-994d-20dfa5ab714d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "158.173.46.118", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '158.173.46.118']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--71cf63a9-8ffa-5db8-867c-8af4eb4d7c56", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--3bc89a62-eb80-523c-994d-20dfa5ab714d", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--78d0837b-0298-5839-9512-83a5816992d0", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "163.172.157.53", + "description": "Persistent dedicated server, Scaleway FR used in late-phase operations (seen 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '163.172.157.53']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--a899c86d-8244-5c6d-81e2-248c4d2184bc", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--78d0837b-0298-5839-9512-83a5816992d0", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--9eadc4a4-2847-55aa-89ab-a34432ecf852", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "34.156.199.132", + "description": "Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role exfiltration, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '34.156.199.132']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--452a289d-f5ee-5580-9636-5b5384b2a2d7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--9eadc4a4-2847-55aa-89ab-a34432ecf852", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--66980077-b54d-5e5c-98db-ca028d41f1d4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "34.156.95.176", + "description": "Exfiltration endpoints in hijacked GCP projects (seen 2026-04 to 2026-05; role exfiltration, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv4-addr:value = '34.156.95.176']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--2692d0bc-c316-59c9-a773-b38227d54289", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--66980077-b54d-5e5c-98db-ca028d41f1d4", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--7288ae91-2327-5dbb-ae64-83255d877f3c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "2001:ac8:27:89::a02d", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv6-addr:value = '2001:ac8:27:89::a02d']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8c2d6b66-ec76-5bd4-b14d-7a694394ae55", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--7288ae91-2327-5dbb-ae64-83255d877f3c", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--fb0b3e2a-ed76-579f-821d-6afc66d40a20", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "2001:ac8:29:84::a01d", + "description": "Commercial VPN/DC attack exits (Mullvad/M247/31173/Datacamp; AL/AT/AR/CH/BG/SK/DE) - primary-key ops window (seen 2026-03-25 to 2026-05-20; role egress, handling hunt)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv6-addr:value = '2001:ac8:29:84::a01d']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--5dac1a7e-d2d1-5ac3-8efc-a2d88b37701c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--fb0b3e2a-ed76-579f-821d-6afc66d40a20", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--31cff03b-38ef-5941-b520-f018d88eda44", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "2001:bc8:711:5854:dc00:1ff:fe18:ba53", + "description": "Persistent dedicated server, Scaleway FR used in late-phase operations (seen 2026-06-26 to 2026-07-04; role dedicated_server, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[ipv6-addr:value = '2001:bc8:711:5854:dc00:1ff:fe18:ba53']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--ebb61426-f723-5ac0-b2d5-e5101a9ddc12", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--31cff03b-38ef-5941-b520-f018d88eda44", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--4fbba690-20de-5fac-bf7e-b29182ffb4a3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd.onion", + "description": "CRS credential-vault API (Tor onion service; seen 2026-05 to 2026-07; role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = '3ell6n47y3ct4a3x67fbuz62q2mk2l4vo6eacho2suzftdshsnrfopyd.onion']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--d284e744-e27b-5fb7-8faf-73b327245c48", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--4fbba690-20de-5fac-bf7e-b29182ffb4a3", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--dcbcdaab-34f8-556c-94ec-c96d1b8bc139", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad.onion", + "description": "Actor's Tor LLM-gateway (third-party model routing) (Tor onion service; seen 2026-06 to 2026-06; role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = '6mshbvhvzhdgumwwazf4jcep2xx4kdk6n4wgffc46msu2gc3j3t2fpad.onion']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--825d26d9-5183-5b06-9eef-30c5eb83f556", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--dcbcdaab-34f8-556c-94ec-c96d1b8bc139", + "target_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8e301088-18a4-5fff-8db2-47b220251640", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "identity--5d5cb585-02af-535f-865e-ff58cf584edc" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--984e523f-1927-5a94-a283-9245720ff117", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "media-entertainment", + "identity_class": "class", + "sectors": [ + "media-entertainment" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--57c0a2a0-a7c6-52ca-bd22-5d6cdfcf664d", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "identity--984e523f-1927-5a94-a283-9245720ff117" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--518099f8-14c7-5185-a258-58632135ce78", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "identity--c176d369-1ee0-599c-bec9-0a4b5d9e11ff" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--1e120e6a-d1c6-526e-adc7-8d32e0be73f1", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3", + "target_ref": "identity--e55086c4-2284-53d8-8072-d0c42fe13709" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--7e0c84c4-fe46-581e-bd25-c14129d4b1be", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50029 - A Single Hacktivist Against European Political Targets", + "description": "Anthropic reports a single French-speaking actor who used Claude to develop and debug a WordPress re-installation race exploit, build a Rust scanner that validated exposed API keys, and manage agents for reconnaissance and post-authentication work. Anthropic counts 42 targets, internal access to at least 14, and 12 to 26 GB exfiltrated. The haul included political membership and donor records. Reported persistence included web shells hidden in font assets and credential-harvesting WordPress must-use plugins.", + "published": "2026-09-10T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--40209df8-ca30-5bac-b3ce-aa47b7c779e1", + "attack-pattern--4acd779c-9b97-5a6a-afb6-b1225b446d41", + "attack-pattern--624f5553-4f17-5ccd-82cb-e1adf1303fac", + "attack-pattern--bac26ccc-825f-516a-a7d4-2fab9506f288", + "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955", + "indicator--31cff03b-38ef-5941-b520-f018d88eda44", + "indicator--3bc89a62-eb80-523c-994d-20dfa5ab714d", + "indicator--3e53ab0e-03c0-54bb-b0e8-501dffacab4b", + "indicator--3f08bee6-10e9-55d3-9ea1-1ee85e07b0fb", + "indicator--4c4699dd-c9ff-526d-bdfd-36ca2a19b7c2", + "indicator--4fbba690-20de-5fac-bf7e-b29182ffb4a3", + "indicator--58e3a704-be04-5259-9445-de126e43ff06", + "indicator--66609507-4ec0-53bd-b256-133c2fa2587c", + "indicator--66980077-b54d-5e5c-98db-ca028d41f1d4", + "indicator--703e3eec-dba6-50ed-ae81-f45d4b1f5c00", + "indicator--7288ae91-2327-5dbb-ae64-83255d877f3c", + "indicator--78d0837b-0298-5839-9512-83a5816992d0", + "indicator--9eadc4a4-2847-55aa-89ab-a34432ecf852", + "indicator--a2159ba2-fca1-5937-87e0-5ada5531a4b1", + "indicator--ace591d4-bccb-54dc-96d9-6ea5f4b25884", + "indicator--c12ef018-9d0e-5e00-9fae-fa8d831f54ce", + "indicator--d4a39676-88c7-5d1e-bf81-86739666d301", + "indicator--dcbcdaab-34f8-556c-94ec-c96d1b8bc139", + "indicator--e0e0631b-efc2-5ea9-89ee-3fd79cbcdad2", + "indicator--ed423fa8-35aa-5d9e-af19-98a55e11e995", + "indicator--f514894a-ec20-53a3-a962-32650319c1a9", + "indicator--fb0b3e2a-ed76-579f-821d-6afc66d40a20", + "intrusion-set--55d06a72-eb91-541f-b92a-e8b379ae8ad3" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0021" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50029 Hacktivists targeted European political and affiliated", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities" + } + ] + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--235bce4d-fedb-57e9-a89c-d4d75895af56", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "aws-us-east-3.com", + "description": "AWS lookalike domain (role infrastructure, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'aws-us-east-3.com']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--7b0ca55f-66f2-50bb-b6e5-f2d850503588", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--235bce4d-fedb-57e9-a89c-d4d75895af56", + "target_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--1bcce5f1-0a83-5bce-8a91-99f157cc1d09", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "awstore.cloud", + "description": "Fake Claude API reseller storefront (role monetization, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'awstore.cloud']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--1b16e2e6-ad15-5307-9dd6-b7e90763b194", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--1bcce5f1-0a83-5bce-8a91-99f157cc1d09", + "target_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--81e19695-2062-5661-8b70-93fc8c7c665a", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "holdboost.store", + "description": "Malware platform domain (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'holdboost.store']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--bbf37d06-812d-5e1f-b03b-19ff5fc017e4", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--81e19695-2062-5661-8b70-93fc8c7c665a", + "target_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--a6922b93-789d-5a86-a449-95af44b852fb", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "kiro.cheap", + "description": "Fake Kiro API reseller storefront (role monetization, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'kiro.cheap']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--9bd18a17-a130-5b03-a94e-b39e6a88d974", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--a6922b93-789d-5a86-a449-95af44b852fb", + "target_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--f1e518ec-dc85-5f4d-8e6e-71049b7816d5", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "sys-tools.cfd", + "description": "Malware C2 (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'sys-tools.cfd']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--64d5ae7e-cffd-557e-936f-0ff133f00ad3", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--f1e518ec-dc85-5f4d-8e6e-71049b7816d5", + "target_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0" + }, + { + "type": "indicator", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "indicator--191bf2f5-8284-57c2-bb5b-8278f9f8c3bf", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "iymkjuzymkapovrntoxy.supabase.co", + "description": "Malware Supabase backend (role c2, handling detect-or-block)", + "indicator_types": [ + "malicious-activity" + ], + "pattern": "[domain-name:value = 'iymkjuzymkapovrntoxy.supabase.co']", + "pattern_type": "stix", + "valid_from": "2026-09-10T00:00:00.000Z" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--8308250a-0ae2-5d0e-bb71-174ea72ae27c", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "indicates", + "source_ref": "indicator--191bf2f5-8284-57c2-bb5b-8278f9f8c3bf", + "target_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0" + }, + { + "type": "identity", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "identity--dda95ac8-f549-557a-a478-a50f43c1a119", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "consumers", + "identity_class": "class", + "sectors": [ + "consumers" + ] + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c968cd48-3637-5dd8-b4f7-25ad421ac604", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "identity--dda95ac8-f549-557a-a478-a50f43c1a119" + }, + { + "type": "relationship", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "relationship--c9c934ba-65ba-5fea-8891-9ccdba3c76f7", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "relationship_type": "targets", + "source_ref": "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "target_ref": "identity--e55086c4-2284-53d8-8072-d0c42fe13709" + }, + { + "type": "report", + "spec_version": "2.1", + "created_by_ref": "identity--cf20135e-3ab2-5072-a070-c5679b316619", + "object_marking_refs": [ + "marking-definition--7f16ab7e-802f-5eec-bdda-a44d842cb3e6" + ], + "id": "report--25d0562f-f17d-5a13-b0dc-5243075959d8", + "created": "2026-09-10T00:00:00.000Z", + "modified": "2026-09-10T00:00:00.000Z", + "name": "GTG-50021 - A Fraudulent AI Reseller Harvesting Customers' Credentials", + "description": "Anthropic reports a Russian- and Ukrainian-speaking group selling cheap Claude access that silently proxied some traffic to a different model and harvested the credentials customers supplied. The published domains include kiro[.]cheap and an AWS lookalike, aws-us-east-3[.]com. On a victim host, the evidence is an agent whose API base URL points at a reseller rather than the provider, which is the misconfiguration the catalog's endpoint-redirection rule looks for.", + "published": "2026-09-10T00:00:00.000Z", + "report_types": [ + "threat-report" + ], + "object_refs": [ + "attack-pattern--cb69a857-3a1e-5441-ac29-f2332202c955", + "attack-pattern--ee8475ec-ddb6-58aa-a7b8-2c4c28189cfa", + "attack-pattern--fa6c94f9-0101-5b0c-9ad0-0666828798a9", + "indicator--191bf2f5-8284-57c2-bb5b-8278f9f8c3bf", + "indicator--1bcce5f1-0a83-5bce-8a91-99f157cc1d09", + "indicator--235bce4d-fedb-57e9-a89c-d4d75895af56", + "indicator--81e19695-2062-5661-8b70-93fc8c7c665a", + "indicator--a6922b93-789d-5a86-a449-95af44b852fb", + "indicator--f1e518ec-dc85-5f4d-8e6e-71049b7816d5", + "intrusion-set--c94d154a-2aa9-51d3-8ce4-6d924adc7aa0", + "tool--58934c12-0444-544f-902a-9010d9977c57", + "tool--7c5faf86-889c-5d4d-9a05-fbc098d2f831" + ], + "external_references": [ + { + "source_name": "ai-dfir-toolkit", + "external_id": "AIRT-CS-0022" + }, + { + "source_name": "Anthropic - Threat Intelligence Report, September 2026: GTG-50021", + "url": "https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise" + } + ] + } + ] +} diff --git a/artifacts/intel/actors/airt-ta-0001.yml b/artifacts/intel/actors/airt-ta-0001.yml new file mode 100644 index 0000000..7d9f41b --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0001.yml @@ -0,0 +1,67 @@ +# AI DFIR threat actor profile +# AIRT-TA-0001 - APT28 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0001 +name: APT28 +aliases: +- name: Fancy Bear + source: MITRE ATT&CK G0007 +- name: Forest Blizzard + source: Microsoft +- name: FROZENLAKE + source: GTIG +- name: UAC-0001 + source: CERT-UA +kind: state-nexus +nexus: RU +motivation: +- espionage +summary: 'Russian military intelligence (GRU unit 26165) group. It is the first state actor + publicly reported running LLM-querying malware in live operations: PROMPTSTEAL, which CERT-UA + tracks as LAMEHUG, asked a hosted model for collection commands against Ukrainian targets. + Earlier AI use reported by Microsoft was research and scripting assistance.' +confidence: high +basis: 'Attribution of the group itself is long-standing and multi-source (ATT&CK G0007). + Its LLM use is reported by three independent parties: CERT-UA, GTIG and Microsoft.' +contested: CERT-UA attributes LAMEHUG to UAC-0001 (APT28) with moderate confidence. The malware + behaviour is better established than the attribution. +external_ids: + attack_group: + - G0007 +malware: +- PROMPTSTEAL +- LAMEHUG +sightings: +- date: '2024-02-14' + reporter: Microsoft Threat Intelligence + summary: Used LLMs to research satellite communication and radar technologies, and for basic + scripting assistance. + atlas: + - AML.T0016.002 + ai_services: + - OpenAI models + reference: https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/ +- date: 2025-06 + reporter: GTIG + summary: Deployed PROMPTSTEAL against Ukraine. It queries Qwen2.5-Coder through the Hugging + Face API for reconnaissance and document-collection commands, then runs them. + atlas: + - AML.T0096 + - AML.T0102 + ai_services: + - Hugging Face inference API + victims: + countries: + - UA + basis: 'GTIG: new malware against Ukraine.' + reference: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +references: +- title: 'CERT-UA #16039 - LAMEHUG (17 Jul 2025)' + url: https://cert.gov.ua/article/6284730 +- title: 'GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)' + url: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- title: Microsoft Threat Intelligence - Staying ahead of threat actors in the age of AI (14 + Feb 2024) + url: https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/ diff --git a/artifacts/intel/actors/airt-ta-0002.yml b/artifacts/intel/actors/airt-ta-0002.yml new file mode 100644 index 0000000..4f2db1a --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0002.yml @@ -0,0 +1,33 @@ +# AI DFIR threat actor profile +# AIRT-TA-0002 - GTG-1002 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0002 +name: GTG-1002 +kind: state-nexus +nexus: CN +motivation: +- espionage +summary: Anthropic's designation for a cluster it assessed with high confidence to be a Chinese + state-sponsored group. The cluster built a framework around Claude Code and MCP tools that + ran most of an intrusion campaign against about thirty organisations. MITRE catalogues the + activity as ATT&CK campaign C0062 and ATLAS case study AML.CS0069. +confidence: medium +basis: One reporting party, the provider whose product was abused. MITRE's adoption corroborates + that the campaign happened, not the attribution or the autonomy figures. +contested: The degree of autonomy was publicly questioned by independent researchers. See + AIRT-CS-0004. +external_ids: + attack_campaign: + - C0062 + atlas_case_study: + - AML.CS0069 +abuses: +- AIRT-0001 +references: +- title: Anthropic - Disrupting the first reported AI-orchestrated cyber espionage campaign + (13 Nov 2025) + url: https://www.anthropic.com/news/disrupting-AI-espionage +- title: MITRE ATLAS - AML.CS0069 + url: https://atlas.mitre.org/studies/AML.CS0069 diff --git a/artifacts/intel/actors/airt-ta-0003.yml b/artifacts/intel/actors/airt-ta-0003.yml new file mode 100644 index 0000000..7942365 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0003.yml @@ -0,0 +1,51 @@ +# AI DFIR threat actor profile +# AIRT-TA-0003 - GTG-2002 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0003 +name: GTG-2002 +kind: criminal +motivation: +- financial +summary: Anthropic's designation for a data-extortion operator that used Claude Code to automate + reconnaissance, credential harvesting and network penetration. Anthropic also reports the + model analysed stolen financial data to set ransom demands, some above USD 500,000. At least + 17 organisations were affected, in healthcare, emergency services, government and religious + institutions. +confidence: medium +basis: One reporting party, the provider whose product was abused. No host indicators were + published. The cluster name comes from Anthropic's full report, and the public summary page + describes the operation without the name. +abuses: +- AIRT-0001 +sightings: +- date: '2025-08-27' + reporter: Anthropic + summary: Claude Code used to automate reconnaissance, credential harvesting and network + penetration for data extortion, and to analyse exfiltrated financial data to set ransom + amounts. + atlas: + - AML.T0103 + - AML.T0116 + - AML.T0055 + owasp_agentic: + - ASI02 + abuses: + - AIRT-0001 + ai_services: + - Claude Code + victims: + sectors: + - healthcare + - emergency-services + - government + - religious-institutions + org_count: + value: 17 + qualifier: at-least + basis: Anthropic, August 2025 threat intelligence report. + reference: https://www.anthropic.com/news/detecting-countering-misuse-aug-2025 +references: +- title: 'Anthropic - Detecting and countering misuse of AI: August 2025' + url: https://www.anthropic.com/news/detecting-countering-misuse-aug-2025 diff --git a/artifacts/intel/actors/airt-ta-0004.yml b/artifacts/intel/actors/airt-ta-0004.yml new file mode 100644 index 0000000..d8e211e --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0004.yml @@ -0,0 +1,65 @@ +# AI DFIR threat actor profile +# AIRT-TA-0004 - MIDNIGHT NEPTUNE +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0004 +name: MIDNIGHT NEPTUNE +aliases: +- name: UNC1069 + source: GTIG (former designation) +- name: MASAN + source: GTIG +kind: state-nexus +nexus: KP +motivation: +- financial +summary: GTIG's name for financially motivated North Korea-nexus clusters focused on cryptocurrency + theft. Reported AI use has moved from researching wallet locations with Gemini in 2025 to + poisoning repository configuration and Claude Code hooks to deliver the SOMBERMEME backdoor + in 2026. +confidence: medium +basis: One reporting party across two reports. +external_ids: + vendor_cluster: + - UNC1069 +malware: +- SOMBERMEME +abuses: +- AIRT-0001 +sightings: +- date: '2025-11-05' + reporter: GTIG + summary: Used Gemini to research cryptocurrency concepts and where wallet application data + is stored, to generate lures including Spanish-language ones, and to develop theft code. + atlas: + - AML.T0016.002 + ai_services: + - Gemini + victims: + sectors: + - cryptocurrency + basis: GTIG. + reference: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- date: '2026-09-08' + reporter: GTIG + summary: Used commercial and open-weight models, including DeepSeek-Coder, to build Python + RATs and lateral-movement scripts. Poisoned repository configurations and altered Claude + CLI hooks to deploy SOMBERMEME on developer interaction. + atlas: + - AML.T0016.002 + - AML.T0081 + owasp_agentic: + - ASI04 + - ASI05 + abuses: + - AIRT-0001 + ai_services: + - DeepSeek-Coder + - Claude Code + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +references: +- title: 'GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)' + url: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- title: 'GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai diff --git a/artifacts/intel/actors/airt-ta-0005.yml b/artifacts/intel/actors/airt-ta-0005.yml new file mode 100644 index 0000000..ef49732 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0005.yml @@ -0,0 +1,51 @@ +# AI DFIR threat actor profile +# AIRT-TA-0005 - UNC6780 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0005 +name: UNC6780 +aliases: +- name: TeamPCP + source: GTIG; self-claimed +kind: criminal +motivation: +- financial +summary: 'GTIG''s cluster for a financially motivated supply-chain operator. In 2026 it compromised + developer tooling and AI plumbing: Trivy, Checkmarx, the LiteLLM gateway, and trojanised + forks of MCP servers. Its DUSTMAKER stealer writes into the workspace directories AI coding + assistants read.' +confidence: medium +basis: One reporting party across two reports. The actor claimed responsibility for some compromises, + which corroborates the link but not the details. +external_ids: + vendor_cluster: + - UNC6780 +malware: +- DUSTMAKER +- SANDCLOCK +abuses: +- AIRT-0001 +- AIRT-0002 +sightings: +- date: '2026-05-11' + reporter: GTIG + summary: Claimed supply-chain compromises of Trivy, Checkmarx and LiteLLM through compromised + PyPI packages and malicious pull requests, embedding the SANDCLOCK credential stealer + to lift AWS keys and GitHub tokens from build environments. + atlas: + - AML.T0010 + - AML.T0055 + owasp_agentic: + - ASI04 + victims: + sectors: + - software-supply-chain + basis: GTIG. + reference: https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access +references: +- title: GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, + and Initial Access (11 May 2026) + url: https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access +- title: 'GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai diff --git a/artifacts/intel/actors/airt-ta-0006.yml b/artifacts/intel/actors/airt-ta-0006.yml new file mode 100644 index 0000000..7993ba8 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0006.yml @@ -0,0 +1,54 @@ +# AI DFIR threat actor profile +# AIRT-TA-0006 - ShinyHunters +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0006 +name: ShinyHunters +aliases: +- name: UNC6240 + source: GTIG +kind: criminal +motivation: +- financial +summary: A high-volume SaaS data-theft and extortion group. GTIG reports it integrated Claude + Code, configured with custom MCP tools, to parse and analyse exfiltrated directories for + extortion, and used AI to write obfuscated code and get past perimeter defences. +confidence: medium +basis: The group itself is well established (ATT&CK G1057). Its AI use is reported by GTIG + and, for suspected affiliates, by Anthropic, so there are two reporting parties with different + confidence. +external_ids: + attack_group: + - G1057 + vendor_cluster: + - UNC6240 + - GTG-50014 +abuses: +- AIRT-0001 +sightings: +- date: '2026-09-08' + reporter: GTIG + summary: Claude Code configured with custom MCP tools to parse and analyse exfiltrated data + for extortion; AI-written obfuscated code to bypass perimeter defences. + atlas: + - AML.T0103 + - AML.T0126 + owasp_agentic: + - ASI02 + abuses: + - AIRT-0001 + ai_services: + - Claude Code + - MCP + victims: + sectors: + - information-technology + basis: 'GTIG: SaaS data exfiltration and extortion.' + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +references: +- title: 'GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50014 ShinyHunters smash-and-grab + opportunists' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50014-shinyhunters-smash-and-grab-opportunists diff --git a/artifacts/intel/actors/airt-ta-0007.yml b/artifacts/intel/actors/airt-ta-0007.yml new file mode 100644 index 0000000..5ded21a --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0007.yml @@ -0,0 +1,60 @@ +# AI DFIR threat actor profile +# AIRT-TA-0007 - APT42 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0007 +name: APT42 +aliases: +- name: CALANQUE ION + source: GTIG (2026 designation) +kind: state-nexus +nexus: IR +motivation: +- espionage +summary: Iranian government-backed group whose reported AI use centres on phishing and reconnaissance. + GTIG also reports an attempt to build a Data Processing Agent that turned natural-language + requests into SQL over sensitive personal data, and later work on EDR bypass. +confidence: medium +basis: One reporting party across three reports. +external_ids: + attack_group: + - G1044 +sightings: +- date: '2025-11-05' + reporter: GTIG + summary: Used Gemini for phishing content, translation and research, and attempted to build + a natural-language-to-SQL Data Processing Agent over sensitive personal data. + atlas: + - AML.T0016.002 + - AML.T0017.002 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- date: '2026-02-12' + reporter: GTIG + summary: Used Gemini for target reconnaissance, persona creation, translation and malware + development support. + atlas: + - AML.T0016.002 + - AML.T0087 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use +- date: '2026-09-08' + reporter: GTIG + summary: Used Gemini to identify target email addresses, localise lures, summarise exfiltrated + data, reverse-engineer licensing algorithms and research EDR bypass. + atlas: + - AML.T0016.002 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +references: +- title: 'GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)' + url: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- title: 'GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration + of AI for Adversarial Use (12 Feb 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use +- title: 'GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai diff --git a/artifacts/intel/actors/airt-ta-0008.yml b/artifacts/intel/actors/airt-ta-0008.yml new file mode 100644 index 0000000..e33d61d --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0008.yml @@ -0,0 +1,48 @@ +# AI DFIR threat actor profile +# AIRT-TA-0008 - APT41 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0008 +name: APT41 +aliases: +- name: Brass Typhoon + source: MITRE ATT&CK G0096 +kind: state-nexus +nexus: CN +motivation: +- espionage +- financial +summary: PRC-backed group that GTIG observed using Gemini throughout August 2025 for C++ and + Go development, including an OSSTUN command-and-control framework, and later for tooling + development and code translation. +confidence: medium +basis: One reporting party across two reports. +external_ids: + attack_group: + - G0096 +sightings: +- date: 2025-08 + reporter: GTIG + summary: Used Gemini for C++ and Go development of the OSSTUN C2 framework and for obfuscation + help. + atlas: + - AML.T0016.002 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- date: '2026-02-12' + reporter: GTIG + summary: Used Gemini to accelerate tooling development, troubleshoot in real time and translate + code. + atlas: + - AML.T0016.002 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use +references: +- title: 'GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)' + url: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +- title: 'GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration + of AI for Adversarial Use (12 Feb 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use diff --git a/artifacts/intel/actors/airt-ta-0009.yml b/artifacts/intel/actors/airt-ta-0009.yml new file mode 100644 index 0000000..34bfae2 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0009.yml @@ -0,0 +1,45 @@ +# AI DFIR threat actor profile +# AIRT-TA-0009 - Sandworm +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0009 +name: Sandworm +aliases: +- name: APT44 + source: MITRE ATT&CK G0034 +- name: SANDWORM RELIC + source: GTIG (2026 designation) +- name: FROZENBARENTS + source: GTIG (former designation) +kind: state-nexus +nexus: RU +motivation: +- espionage +- destruction +summary: Russian group that GTIG reports integrated Gemini into operations against Ukraine. + It used the model for AI-themed phishing domains, automated password spraying and host profiling, + and called the Gemini API directly from its own automation. +confidence: medium +basis: The group is well established (ATT&CK G0034). Its AI use rests on one reporting party. +external_ids: + attack_group: + - G0034 +sightings: +- date: '2026-09-08' + reporter: GTIG + summary: Gemini used for intelligence gathering, social engineering, asynchronous password-spraying + scripts and endpoint fingerprinting; the Gemini API was called directly from tooling. + atlas: + - AML.T0016.002 + - AML.T0096 + ai_services: + - Gemini API + victims: + countries: + - UA + basis: 'GTIG: continued operations targeting Ukraine.' + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +references: +- title: 'GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai diff --git a/artifacts/intel/actors/airt-ta-0010.yml b/artifacts/intel/actors/airt-ta-0010.yml new file mode 100644 index 0000000..c458e0e --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0010.yml @@ -0,0 +1,48 @@ +# AI DFIR threat actor profile +# AIRT-TA-0010 - APT31 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0010 +name: APT31 +aliases: +- name: ZIRCONIUM + source: MITRE ATT&CK G0128 +- name: Violet Typhoon + source: Microsoft via ATT&CK +kind: state-nexus +nexus: CN +motivation: +- espionage +summary: PRC-based group that GTIG reports prompted Gemini with an expert security persona + while trialling Hexstrike MCP tooling. It used the model to automate vulnerability analysis + and plan testing against US targets. This is an early reported case of a state actor pairing + an LLM with MCP-exposed offensive tools. +confidence: medium +basis: One reporting party. +external_ids: + attack_group: + - G0128 +sightings: +- date: '2026-02-12' + reporter: GTIG + summary: Used Gemini with an expert persona, citing Hexstrike MCP tooling, to automate vulnerability + analysis and produce testing plans covering RCE, WAF bypass and SQL injection against + US-based targets. + atlas: + - AML.T0016.004 + - AML.T0054 + owasp_agentic: + - ASI02 + ai_services: + - Gemini + - Hexstrike MCP + victims: + countries: + - US + basis: 'GTIG: US-based targets.' + reference: https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use +references: +- title: 'GTIG - AI Threat Tracker: Distillation, Experimentation, and (Continued) Integration + of AI for Adversarial Use (12 Feb 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/distillation-experimentation-integration-ai-adversarial-use diff --git a/artifacts/intel/actors/airt-ta-0011.yml b/artifacts/intel/actors/airt-ta-0011.yml new file mode 100644 index 0000000..246a177 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0011.yml @@ -0,0 +1,37 @@ +# AI DFIR threat actor profile +# AIRT-TA-0011 - MuddyWater +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0011 +name: MuddyWater +aliases: +- name: TEMP.Zagros + source: GTIG +- name: MUDDYCOAST + source: GTIG +kind: state-nexus +nexus: IR +motivation: +- espionage +summary: Iranian state-sponsored group that GTIG reports used Gemini, under student and research + pretexts, to develop custom malware including web shells and a Python C2 server. +confidence: medium +basis: One reporting party. +external_ids: + attack_group: + - G0069 +sightings: +- date: '2025-11-05' + reporter: GTIG + summary: Used Gemini, with student and paper-writing pretexts to get past safety guardrails, + to develop web shells and a Python-based C2 server. + atlas: + - AML.T0016.002 + - AML.T0054 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +references: +- title: 'GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)' + url: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools diff --git a/artifacts/intel/actors/airt-ta-0012.yml b/artifacts/intel/actors/airt-ta-0012.yml new file mode 100644 index 0000000..88958ee --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0012.yml @@ -0,0 +1,33 @@ +# AI DFIR threat actor profile +# AIRT-TA-0012 - UNC4899 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0012 +name: UNC4899 +aliases: +- name: PUKCHONG + source: GTIG +kind: state-nexus +nexus: KP +motivation: +- financial +summary: North Korean supply-chain-focused actor that GTIG reports used Gemini to develop + code, research exploits and improve its tooling. +confidence: medium +basis: One reporting party. +external_ids: + vendor_cluster: + - UNC4899 +sightings: +- date: '2025-11-05' + reporter: GTIG + summary: Used Gemini for code development, exploit research and tooling improvement. + atlas: + - AML.T0016.002 + ai_services: + - Gemini + reference: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools +references: +- title: 'GTIG - AI Threat Tracker: Advances in Threat Actor Usage of AI Tools (5 Nov 2025)' + url: https://cloud.google.com/blog/topics/threat-intelligence/threat-actor-usage-of-ai-tools diff --git a/artifacts/intel/actors/airt-ta-0013.yml b/artifacts/intel/actors/airt-ta-0013.yml new file mode 100644 index 0000000..3ebfd9b --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0013.yml @@ -0,0 +1,42 @@ +# AI DFIR threat actor profile +# AIRT-TA-0013 - Kimsuky +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0013 +name: Kimsuky +aliases: +- name: Emerald Sleet + source: Microsoft +- name: APT43 + source: MITRE ATT&CK G0094 +kind: state-nexus +nexus: KP +motivation: +- espionage +summary: North Korean group that Microsoft and OpenAI reported in 2024 using LLMs to research + think tanks and North Korea experts, draft spear-phishing content and troubleshoot scripts. +confidence: medium +basis: One joint report. +external_ids: + attack_group: + - G0094 +sightings: +- date: '2024-02-14' + reporter: Microsoft Threat Intelligence + summary: Used LLMs to research experts and organisations, generate spear-phishing content, + research public vulnerabilities and assist with scripting. + atlas: + - AML.T0016.002 + ai_services: + - OpenAI models + victims: + sectors: + - ngo-think-tank + - education + basis: 'Microsoft: individuals with North Korea expertise, academic institutions and NGOs.' + reference: https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/ +references: +- title: Microsoft Threat Intelligence - Staying ahead of threat actors in the age of AI (14 + Feb 2024) + url: https://www.microsoft.com/en-us/security/blog/2024/02/14/staying-ahead-of-threat-actors-in-the-age-of-ai/ diff --git a/artifacts/intel/actors/airt-ta-0014.yml b/artifacts/intel/actors/airt-ta-0014.yml new file mode 100644 index 0000000..84f9898 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0014.yml @@ -0,0 +1,40 @@ +# AI DFIR threat actor profile +# AIRT-TA-0014 - UNC5673 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0014 +name: UNC5673 +kind: state-nexus +nexus: CN +motivation: +- espionage +summary: PRC-nexus cluster, overlapping TEMP.Hex, that GTIG reports pooled Gemini, Claude + and OpenAI accounts through relay tooling (Claude-Relay-Service, CLI-Proxy-API) while targeting + governments in South and Southeast Asia. On a host, the relay tooling is the artifact. +confidence: medium +basis: One reporting party. +external_ids: + vendor_cluster: + - UNC5673 +sightings: +- date: '2026-05-11' + reporter: GTIG + summary: Used Claude-Relay-Service and CLI-Proxy-API to aggregate multiple Gemini, Claude + and OpenAI accounts behind proxies for account pooling. + atlas: + - AML.T0016.002 + - AML.T0008 + ai_services: + - Gemini + - Claude + - OpenAI + victims: + sectors: + - government + basis: 'GTIG: government sectors primarily in South and Southeast Asia.' + reference: https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access +references: +- title: GTIG - Adversaries Leverage AI for Vulnerability Exploitation, Augmented Operations, + and Initial Access (11 May 2026) + url: https://cloud.google.com/blog/topics/threat-intelligence/ai-vulnerability-exploitation-initial-access diff --git a/artifacts/intel/actors/airt-ta-0015.yml b/artifacts/intel/actors/airt-ta-0015.yml new file mode 100644 index 0000000..98ecfce --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0015.yml @@ -0,0 +1,43 @@ +# AI DFIR threat actor profile +# AIRT-TA-0015 - UNC6508 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0015 +name: UNC6508 +kind: state-nexus +nexus: CN +motivation: +- espionage +summary: PRC-nexus espionage actor that GTIG reports targeted academic, medical and military + research institutions in North America over several years. It deployed local open-weight + LLM infrastructure inside compromised cloud environments. +confidence: medium +basis: One reporting party. +external_ids: + vendor_cluster: + - UNC6508 +sightings: +- date: '2026-09-08' + reporter: GTIG + summary: Deployed local open-weight LLM infrastructure in compromised cloud environments + and researched AI tool setup and model vulnerabilities; targeted proprietary AI research. + atlas: + - AML.T0008.000 + - AML.T0034 + ai_services: + - open-weight models (self-hosted) + victims: + sectors: + - research + - healthcare + - education + - defense-industrial-base + countries: + - US + - CA + basis: 'GTIG: academic, medical and military research institutions in North America.' + reference: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai +references: +- title: 'GTIG - AI Threat Tracker: From Prompting to Autonomy (8 Sep 2026)' + url: https://cloud.google.com/blog/topics/threat-intelligence/from-prompting-to-autonomy-the-evolution-of-adversarial-ai diff --git a/artifacts/intel/actors/airt-ta-0016.yml b/artifacts/intel/actors/airt-ta-0016.yml new file mode 100644 index 0000000..5ff128c --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0016.yml @@ -0,0 +1,26 @@ +# AI DFIR threat actor profile +# AIRT-TA-0016 - GTG-20006 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0016 +name: GTG-20006 +kind: state-nexus +nexus: RU +motivation: +- espionage +summary: Anthropic's cluster for a Russian-speaking operator whose tradecraft and targeting + it assesses as consistent with Russian state-nexus espionage. It linked the cluster to Midnight + Blizzard only as consistent with public reporting. From December 2025 to August 2026 the + operator ran reconnaissance, phishing and collection through Claude-driven workflows, mostly + by editing the Claude Code skills that drove them. +confidence: medium +basis: A single reporting party, with a published indicator set. +contested: The Midnight Blizzard link is stated as consistency with public reporting, not + as an attribution Anthropic makes itself. +external_ids: + vendor_cluster: + - GTG-20006 +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-20006 Russian espionage' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-20006-russian-espionage diff --git a/artifacts/intel/actors/airt-ta-0017.yml b/artifacts/intel/actors/airt-ta-0017.yml new file mode 100644 index 0000000..387f060 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0017.yml @@ -0,0 +1,22 @@ +# AI DFIR threat actor profile +# AIRT-TA-0017 - GTG-50020 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0017 +name: GTG-50020 +kind: criminal +motivation: +- financial +summary: Anthropic's cluster for a Russian-speaking, financially motivated actor that moved + from hotel-booking and fintech intrusions to running an autonomous exploitation pipeline + against around 30 AI companies in about four days. +confidence: medium +basis: A single reporting party, with a published indicator set. +external_ids: + vendor_cluster: + - GTG-50020 +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50020 From hotel bookings + to the AI supply chain' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50020-from-hotel-bookings-to-the-ai-supply-chain diff --git a/artifacts/intel/actors/airt-ta-0018.yml b/artifacts/intel/actors/airt-ta-0018.yml new file mode 100644 index 0000000..8389eb9 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0018.yml @@ -0,0 +1,22 @@ +# AI DFIR threat actor profile +# AIRT-TA-0018 - GTG-50029 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0018 +name: GTG-50029 +kind: unattributed-cluster +motivation: +- hacktivism +summary: Anthropic's cluster for a single French-speaking hacktivist who used Claude to build + exploits, a key-validating scanner and a doxxing platform against European political parties, + media and think tanks. +confidence: medium +basis: A single reporting party, with a published indicator set. +external_ids: + vendor_cluster: + - GTG-50029 +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50029 Hacktivists targeted + European political and affiliated entities' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50029-hacktivists-targeted-european-political-and-affiliated-entities diff --git a/artifacts/intel/actors/airt-ta-0019.yml b/artifacts/intel/actors/airt-ta-0019.yml new file mode 100644 index 0000000..790ea18 --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0019.yml @@ -0,0 +1,22 @@ +# AI DFIR threat actor profile +# AIRT-TA-0019 - GTG-50021 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0019 +name: GTG-50021 +kind: criminal +motivation: +- financial +summary: Anthropic's cluster for a Russian- and Ukrainian-speaking group running a fraudulent + cut-price Claude reseller that proxied traffic and harvested customer credentials. +confidence: medium +basis: A single reporting party, with a published indicator set. +external_ids: + vendor_cluster: + - GTG-50021 +abuses: +- AIRT-0001 +references: +- title: 'Anthropic - Threat Intelligence Report, September 2026: GTG-50021' + url: https://www.anthropic.com/threat-intelligence-report-september-2026#gtg-50021-indicators-of-compromise diff --git a/artifacts/intel/actors/airt-ta-0020.yml b/artifacts/intel/actors/airt-ta-0020.yml new file mode 100644 index 0000000..e01a03e --- /dev/null +++ b/artifacts/intel/actors/airt-ta-0020.yml @@ -0,0 +1,51 @@ +# AI DFIR threat actor profile +# AIRT-TA-0020 - GTG-10007 +# Schema: ../../schema/actor.schema.json +# Techniques, victims, IOCs and detections are derived by scripts/intel_graph.py. + +id: AIRT-TA-0020 +name: GTG-10007 +kind: unattributed-cluster +motivation: +- espionage +summary: 'Anthropic''s cluster for Chinese-speaking operators who used Claude as the engineering + and orchestration layer for an exploit foundry: binary reversing, vulnerability hypotheses, + exploit writing and testing. They also ran agent swarms, in which a lead agent dispatched + reconnaissance and post-exploitation work to parallel sub-agents. Anthropic counts around + fifty targeted organisations.' +confidence: medium +basis: A single reporting party. No indicators were published for this cluster, so it carries + a sighting rather than a case study. +external_ids: + vendor_cluster: + - GTG-10007 +sightings: +- date: '2026-09-10' + reporter: Anthropic + summary: Claude used for autonomous binary reversing and exploit development, and to run + agent swarms in which a lead agent dispatched reconnaissance and post-exploitation to + parallel sub-agents. + atlas: + - AML.T0017.001 + - AML.T0124 + - AML.T0116 + ai_services: + - Claude + victims: + sectors: + - education + - retail + - energy + - information-technology + - healthcare + - financial-services + - critical-manufacturing + - government + org_count: + value: 50 + qualifier: approx + basis: 'Anthropic: roughly fifty organisations across those sectors, globally.' + reference: https://www.anthropic.com/threat-intelligence-report-september-2026 +references: +- title: Anthropic - Threat Intelligence Report, September 2026 + url: https://www.anthropic.com/threat-intelligence-report-september-2026 diff --git a/artifacts/intel/watch-sources.yml b/artifacts/intel/watch-sources.yml new file mode 100644 index 0000000..8176145 --- /dev/null +++ b/artifacts/intel/watch-sources.yml @@ -0,0 +1,95 @@ +# Sources scripts/intel_watch.py polls for intel candidates. +# +# Nothing here writes to the catalog. Each new item becomes a GitHub issue +# labelled intel-candidate, holding facts and a link only, for a person to +# research with the method in artifacts/docs/RESEARCH-2026-08-14.md. Licences +# matter: AIID and the OWASP documents are CC BY-SA 4.0 and this repository's +# data is CC BY 4.0, so candidates carry ids, dates, titles and URLs - never copied +# prose. +# +# `match` terms are case-insensitive. An item is a candidate when its text hits +# at least one term. The catalog's tool names, vendors and aliases are added +# automatically, so a new tool is watched the day it is catalogued. + +lookback_days: 21 + +match: + - agent + - agentic + - MCP + - model context protocol + - coding assistant + - AI CLI + - LLM + - prompt injection + - Claude Code + - Copilot + - Gemini CLI + - Codex + +sources: + - id: cisa-kev + kind: kev + url: https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json + note: A new KEV entry for a catalogued vendor or product. + + - id: atlas + kind: atlas + url: https://raw.githubusercontent.com/mitre-atlas/atlas-data/main/dist/ + note: ATLAS case studies newer than the pin. + + - id: avid + kind: avid + url: https://github.com/avidml/avid-db + note: AVID reports in the Security risk domain. + + - id: aiid + kind: aiid + url: https://incidentdatabase.ai/api/graphql + # The AI Incident Database classifies incidents against the MIT AI Risk + # Repository domains. 2.2 is AI system security vulnerabilities and attacks, + # 4.2 is cyberattacks, weapon development or use, and mass harm. Incidents in + # those domains are candidates even without a keyword hit. + mit_domains: ["2.2", "4.2"] + note: Security-relevant AI incidents. + + - id: owasp-asi-tracker + kind: markdown-table + url: https://raw.githubusercontent.com/OWASP/www-project-top-10-for-large-language-model-applications/main/initiatives/agent_security_initiative/ASI%20Agentic%20Exploits%20%26%20Incidents/ASI_Agentic_Exploits_Incidents.md + note: New rows in the OWASP Agentic exploits and incidents tracker. + + - id: gtig + kind: feed + url: https://cloud.google.com/blog/topics/threat-intelligence/rss/ + note: Google Threat Intelligence Group posts. + + - id: microsoft-security + kind: feed + url: https://www.microsoft.com/en-us/security/blog/feed/ + note: Microsoft Threat Intelligence posts. + + - id: openai-global-affairs + kind: feed + url: https://openai.com/news/rss.xml + note: OpenAI threat reports ("Disrupting malicious uses of AI"). + + - id: anthropic-news + kind: feed + url: https://www.anthropic.com/rss.xml + note: Anthropic threat intelligence reports. The feed URL is a best guess - if it 404s the run logs a warning and continues. + + - id: cert-ua + kind: feed + url: https://cert.gov.ua/api/articles/rss + note: CERT-UA advisories. Best-guess feed URL, as above. + + - id: github-advisories + kind: ghsa + # Reviewed advisories for packages this catalog documents or whose MCP + # servers it records. Extend as entries are added. + ecosystems: + npm: ["@modelcontextprotocol/sdk", "@anthropic-ai/claude-code", "@google/gemini-cli", + "@openai/codex", "mcp-remote", "@playwright/mcp", "n8n", "flowise"] + pip: ["langflow", "litellm", "open-webui", "vllm", "mcp", "crewai", "autogen-agentchat", + "langchain", "aider-chat", "open-interpreter", "letta"] + note: Reviewed GitHub advisories for catalogued packages. diff --git a/artifacts/schema/actor.schema.json b/artifacts/schema/actor.schema.json new file mode 100644 index 0000000..d1931b8 --- /dev/null +++ b/artifacts/schema/actor.schema.json @@ -0,0 +1,308 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "actor.schema.json", + "title": "AI DFIR threat actor profile", + "description": "An actor named by a government or vendor report - an attributed group or a reporter-designated cluster. Unnamed operators stay in their case study. Techniques, victims, IOCs, detections and first/last seen are NOT authored here: intel_graph.py derives them from the linked case studies and sightings, so a profile cannot contradict its own evidence.", + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "name", + "kind", + "summary", + "confidence", + "basis", + "references" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^AIRT-TA-[0-9]{4}$", + "description": "Permanent, like AIRT ids." + }, + "name": { + "type": "string", + "minLength": 1 + }, + "aliases": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "name", + "source" + ], + "properties": { + "name": { + "type": "string", + "minLength": 1 + }, + "source": { + "type": "string", + "minLength": 1 + } + } + } + }, + "kind": { + "type": "string", + "enum": [ + "state-nexus", + "criminal", + "commercial", + "unattributed-cluster" + ] + }, + "nexus": { + "type": "string", + "pattern": "^[A-Z]{2}$", + "description": "Only when an attributing party states one." + }, + "motivation": { + "type": "array", + "items": { + "type": "string", + "enum": [ + "espionage", + "financial", + "destruction", + "influence", + "hacktivism", + "commercial-promotion" + ] + } + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "confidence": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + }, + "basis": { + "type": "string", + "minLength": 1 + }, + "contested": { + "type": "string" + }, + "external_ids": { + "type": "object", + "additionalProperties": false, + "properties": { + "attack_campaign": { + "type": "array", + "items": { + "type": "string", + "pattern": "^C[0-9]{4}$" + } + }, + "attack_group": { + "type": "array", + "items": { + "type": "string", + "pattern": "^G[0-9]{4}$" + } + }, + "atlas_case_study": { + "type": "array", + "items": { + "type": "string", + "pattern": "^AML\\.CS[0-9]{4}$" + } + }, + "aiid": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + }, + "cve": { + "type": "array", + "items": { + "type": "string", + "pattern": "^CVE-[0-9]{4}-[0-9]{4,7}$" + } + }, + "ghsa": { + "type": "array", + "items": { + "type": "string", + "pattern": "^GHSA(-[23456789cfghjmpqrvwx]{4}){3}$" + } + }, + "mit_risk_domain": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[1-7]\\.[0-9]$" + } + }, + "vendor_cluster": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "malware": { + "type": "array", + "items": { + "type": "string" + } + }, + "abuses": { + "type": "array", + "items": { + "type": "string", + "pattern": "^AIRT-[0-9]{4}$" + }, + "description": "Catalogued tools the actor is reported to have used or targeted." + }, + "sightings": { + "type": "array", + "description": "Reported AI use that does not meet the case-study bar (no indicators published). Each is one report's claim.", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "date", + "reporter", + "summary", + "reference" + ], + "properties": { + "date": { + "type": "string", + "pattern": "^[0-9]{4}(-[0-9]{2}(-[0-9]{2})?)?$" + }, + "reporter": { + "type": "string", + "minLength": 1 + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "atlas": { + "type": "array", + "items": { + "type": "string", + "pattern": "^AML\\.T[0-9]{4}(\\.[0-9]{3})?$" + } + }, + "attack": { + "type": "array", + "items": { + "type": "string", + "pattern": "^T[0-9]{4}(\\.[0-9]{3})?$" + } + }, + "owasp_agentic": { + "type": "array", + "items": { + "type": "string", + "pattern": "^ASI(0[1-9]|10)$" + } + }, + "abuses": { + "type": "array", + "items": { + "type": "string", + "pattern": "^AIRT-[0-9]{4}$" + } + }, + "ai_services": { + "type": "array", + "items": { + "type": "string" + } + }, + "victims": { + "type": "object", + "additionalProperties": false, + "properties": { + "sectors": { + "type": "array", + "items": { + "$ref": "intel-vocab.json#/$defs/sector" + } + }, + "countries": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[A-Z]{2}$" + } + }, + "org_count": { + "type": "object", + "additionalProperties": false, + "required": [ + "value", + "qualifier" + ], + "properties": { + "value": { + "type": "integer", + "minimum": 1 + }, + "qualifier": { + "type": "string", + "enum": [ + "exact", + "approx", + "at-least" + ] + } + } + }, + "basis": { + "type": "string", + "minLength": 1 + } + }, + "description": "Omit any field the source does not state. A guessed sector becomes somebody's wrong victimology chart." + }, + "reference": { + "type": "string", + "pattern": "^https://" + } + } + } + }, + "references": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "title", + "url" + ], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "pattern": "^https://" + }, + "accessed": { + "type": "string" + } + } + } + } + } +} diff --git a/artifacts/schema/artifact.schema.json b/artifacts/schema/artifact.schema.json index 6603a25..f1a9eb8 100644 --- a/artifacts/schema/artifact.schema.json +++ b/artifacts/schema/artifact.schema.json @@ -241,6 +241,14 @@ "pattern": "^T[0-9]{4}(\\.[0-9]{3})?$" } }, + "owasp_agentic": { + "type": "array", + "description": "OWASP Top 10 for Agentic Applications 2026 risks this tool's footprint gives evidence of. Author only where the mapping is clear; titles live in schema/owasp.json.", + "items": { + "type": "string", + "pattern": "^ASI(0[1-9]|10)$" + } + }, "references": { "type": "array", "items": { diff --git a/artifacts/schema/case-study.schema.json b/artifacts/schema/case-study.schema.json new file mode 100644 index 0000000..f39e1bf --- /dev/null +++ b/artifacts/schema/case-study.schema.json @@ -0,0 +1,366 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "case-study.schema.json", + "title": "AI DFIR case study", + "description": "One documented incident or disclosed campaign. Formalises what build_site.check_cases already enforced, and adds the structured actor, victim and framework fields the threat-intel layer derives from. Closed shape: a field that is not here does not exist.", + "type": "object", + "additionalProperties": false, + "required": [ + "id", + "title", + "date_range", + "disclosed", + "affects", + "confidence", + "basis", + "summary", + "iocs", + "response_actions", + "lesson", + "detections", + "references" + ], + "properties": { + "id": { + "type": "string", + "pattern": "^AIRT-CS-[0-9]{4}$" + }, + "title": { + "type": "string", + "minLength": 1 + }, + "date_range": { + "type": "string", + "minLength": 1 + }, + "disclosed": { + "type": "string", + "pattern": "^[0-9]{4}(-[0-9]{2}(-[0-9]{2})?)?$" + }, + "affects": { + "oneOf": [ + { + "type": "string" + }, + { + "type": "array", + "items": { + "type": "string" + } + } + ] + }, + "confidence": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + }, + "basis": { + "type": "string", + "minLength": 1 + }, + "contested": { + "type": "string" + }, + "summary": { + "type": "string", + "minLength": 1 + }, + "atlas": { + "type": "array", + "items": { + "type": "string", + "pattern": "^AML\\.T[0-9]{4}(\\.[0-9]{3})?$" + } + }, + "attack": { + "type": "array", + "items": { + "type": "string", + "pattern": "^T[0-9]{4}(\\.[0-9]{3})?$" + } + }, + "owasp_agentic": { + "type": "array", + "items": { + "type": "string", + "pattern": "^ASI(0[1-9]|10)$" + } + }, + "actors": { + "type": "array", + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "ref", + "link_confidence", + "attributed_by", + "reference" + ], + "properties": { + "ref": { + "type": "string", + "pattern": "^AIRT-TA-[0-9]{4}$" + }, + "role": { + "type": "string", + "enum": [ + "operator", + "developer", + "broker", + "suspected" + ] + }, + "link_confidence": { + "type": "string", + "enum": [ + "high", + "medium", + "low" + ] + }, + "attributed_by": { + "type": "string", + "minLength": 1 + }, + "stated_confidence": { + "type": "string", + "description": "The attributing party's own words about its confidence, verbatim - kept separate from link_confidence, which is ours and measures provenance." + }, + "reference": { + "type": "string", + "pattern": "^https://" + }, + "unverified": { + "type": "boolean" + } + } + } + }, + "victims": { + "type": "object", + "additionalProperties": false, + "properties": { + "sectors": { + "type": "array", + "items": { + "$ref": "intel-vocab.json#/$defs/sector" + } + }, + "countries": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[A-Z]{2}$" + } + }, + "org_count": { + "type": "object", + "additionalProperties": false, + "required": [ + "value", + "qualifier" + ], + "properties": { + "value": { + "type": "integer", + "minimum": 1 + }, + "qualifier": { + "type": "string", + "enum": [ + "exact", + "approx", + "at-least" + ] + } + } + }, + "basis": { + "type": "string", + "minLength": 1 + } + }, + "description": "Omit any field the source does not state. A guessed sector becomes somebody's wrong victimology chart." + }, + "external_ids": { + "type": "object", + "additionalProperties": false, + "properties": { + "attack_campaign": { + "type": "array", + "items": { + "type": "string", + "pattern": "^C[0-9]{4}$" + } + }, + "attack_group": { + "type": "array", + "items": { + "type": "string", + "pattern": "^G[0-9]{4}$" + } + }, + "atlas_case_study": { + "type": "array", + "items": { + "type": "string", + "pattern": "^AML\\.CS[0-9]{4}$" + } + }, + "aiid": { + "type": "array", + "items": { + "type": "integer", + "minimum": 1 + } + }, + "cve": { + "type": "array", + "items": { + "type": "string", + "pattern": "^CVE-[0-9]{4}-[0-9]{4,7}$" + } + }, + "ghsa": { + "type": "array", + "items": { + "type": "string", + "pattern": "^GHSA(-[23456789cfghjmpqrvwx]{4}){3}$" + } + }, + "mit_risk_domain": { + "type": "array", + "items": { + "type": "string", + "pattern": "^[1-7]\\.[0-9]$" + } + }, + "vendor_cluster": { + "type": "array", + "items": { + "type": "string" + } + } + } + }, + "iocs": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "type", + "value" + ], + "properties": { + "type": { + "type": "string", + "enum": [ + "file", + "directory", + "binary", + "process", + "commit", + "domain", + "ip", + "url", + "hash", + "email", + "package", + "account", + "mutex", + "endpoint", + "config", + "pattern", + "behavior", + "malware" + ] + }, + "value": { + "type": "string", + "minLength": 1 + }, + "description": { + "type": "string" + } + } + } + }, + "response_actions": { + "type": "array", + "minItems": 1, + "items": { + "oneOf": [ + { + "type": "string", + "minLength": 1 + }, + { + "type": "object", + "additionalProperties": false, + "required": [ + "phase", + "action" + ], + "properties": { + "phase": { + "type": "string", + "enum": [ + "contain", + "eradicate", + "recover", + "harden" + ] + }, + "action": { + "type": "string", + "minLength": 1 + } + } + } + ] + } + }, + "lesson": { + "type": "string", + "minLength": 1 + }, + "detections": { + "type": "array", + "items": { + "type": "string" + } + }, + "references": { + "type": "array", + "minItems": 1, + "items": { + "type": "object", + "additionalProperties": false, + "required": [ + "title", + "url" + ], + "properties": { + "title": { + "type": "string", + "minLength": 1 + }, + "url": { + "type": "string", + "pattern": "^https://" + }, + "accessed": { + "type": "string" + } + } + } + } + } +} diff --git a/artifacts/schema/cve-status.json b/artifacts/schema/cve-status.json new file mode 100644 index 0000000..fff19ca --- /dev/null +++ b/artifacts/schema/cve-status.json @@ -0,0 +1,111 @@ +{ + "_comment": "Generated by scripts/cve_status.py --refresh. Do not hand-edit.", + "retrieved": "2026-09-30", + "source": "https://www.cisa.gov/sites/default/files/feeds/known_exploited_vulnerabilities.json", + "catalog_version": "2026.09.29", + "cves": { + "CVE-2022-1471": { + "cisa_kev": false + }, + "CVE-2023-43472": { + "cisa_kev": false + }, + "CVE-2023-43654": { + "cisa_kev": false + }, + "CVE-2023-48022": { + "cisa_kev": false + }, + "CVE-2023-6831": { + "cisa_kev": false + }, + "CVE-2024-0132": { + "cisa_kev": false + }, + "CVE-2024-0520": { + "cisa_kev": false + }, + "CVE-2024-2928": { + "cisa_kev": false + }, + "CVE-2024-37059": { + "cisa_kev": false + }, + "CVE-2024-8309": { + "cisa_kev": false + }, + "CVE-2025-1550": { + "cisa_kev": false + }, + "CVE-2025-1716": { + "cisa_kev": false + }, + "CVE-2025-23266": { + "cisa_kev": false + }, + "CVE-2025-23319": { + "cisa_kev": false + }, + "CVE-2025-23320": { + "cisa_kev": false + }, + "CVE-2025-23334": { + "cisa_kev": false + }, + "CVE-2025-23359": { + "cisa_kev": false + }, + "CVE-2025-32444": { + "cisa_kev": false + }, + "CVE-2025-3248": { + "cisa_kev": true, + "date_added": "2025-05-05", + "vendor": "Langflow", + "product": "Langflow", + "ransomware": "Known" + }, + "CVE-2025-32711": { + "cisa_kev": false + }, + "CVE-2025-49596": { + "cisa_kev": false + }, + "CVE-2025-53109": { + "cisa_kev": false + }, + "CVE-2025-53110": { + "cisa_kev": false + }, + "CVE-2025-53773": { + "cisa_kev": false + }, + "CVE-2025-54135": { + "cisa_kev": false + }, + "CVE-2025-54136": { + "cisa_kev": false + }, + "CVE-2025-59145": { + "cisa_kev": false + }, + "CVE-2025-59536": { + "cisa_kev": false + }, + "CVE-2025-64496": { + "cisa_kev": false + }, + "CVE-2025-6514": { + "cisa_kev": false + }, + "CVE-2026-45672": { + "cisa_kev": false + }, + "CVE-2026-5027": { + "cisa_kev": false + }, + "CVE-2026-70491": { + "cisa_kev": false + } + } +} diff --git a/artifacts/schema/intel-vocab.json b/artifacts/schema/intel-vocab.json new file mode 100644 index 0000000..732e90a --- /dev/null +++ b/artifacts/schema/intel-vocab.json @@ -0,0 +1,127 @@ +{ + "$schema": "https://json-schema.org/draft/2020-12/schema", + "$id": "intel-vocab.json", + "description": "Closed vocabularies for the threat-intel layer. Sector: CISA's sixteen critical-infrastructure sectors plus the ones AI incident reports repeatedly name. Region is derived from country through the M49 continent map below and is never authored. Extend both together with the actor/case schemas, the templates and the skill.", + "$defs": { + "sector": { + "type": "string", + "enum": [ + "chemical", + "commercial-facilities", + "communications", + "critical-manufacturing", + "dams", + "defense-industrial-base", + "emergency-services", + "energy", + "financial-services", + "food-agriculture", + "government", + "healthcare", + "information-technology", + "nuclear", + "transportation", + "water", + "education", + "research", + "religious-institutions", + "cryptocurrency", + "software-supply-chain", + "media-entertainment", + "ngo-think-tank", + "consumers", + "legal-professional-services", + "retail", + "telecommunications" + ] + } + }, + "regions": { + "Africa": [ + "DZ", + "EG", + "MA", + "NG", + "KE", + "ZA", + "ET", + "GH", + "TN" + ], + "Americas": [ + "US", + "CA", + "MX", + "BR", + "AR", + "CL", + "CO", + "PE", + "VE" + ], + "Asia": [ + "CN", + "TW", + "JP", + "KR", + "KP", + "IN", + "PK", + "ID", + "MY", + "SG", + "TH", + "VN", + "PH", + "MN", + "NP", + "IL", + "IR", + "IQ", + "SA", + "AE", + "TR", + "KZ", + "UZ", + "BD", + "LK", + "HK" + ], + "Europe": [ + "RU", + "UA", + "GB", + "FR", + "DE", + "IT", + "ES", + "NL", + "PL", + "BE", + "SE", + "NO", + "FI", + "DK", + "CH", + "AT", + "CZ", + "RO", + "HU", + "PT", + "IE", + "GR", + "BY", + "MD", + "GE", + "AM", + "AZ", + "EE", + "LV", + "LT" + ], + "Oceania": [ + "AU", + "NZ" + ] + } +} diff --git a/artifacts/schema/owasp.json b/artifacts/schema/owasp.json new file mode 100644 index 0000000..559ed84 --- /dev/null +++ b/artifacts/schema/owasp.json @@ -0,0 +1,243 @@ +{ + "_comment": "OWASP GenAI Security Project reference ids. Titles and ids are facts; every summary is this project's own wording, because the OWASP documents are CC BY-SA 4.0 and this repository's data is CC BY 4.0. Regenerate MAPPINGS indexes with scripts/sync_mappings.py after editing.", + "llm_2026": { + "source": "https://genai.owasp.org/llm-top-10/", + "published": "2026-08-04", + "items": { + "LLM01": { + "title": "Prompt Injection", + "was_2025": "LLM01" + }, + "LLM02": { + "title": "Sensitive Information Disclosure", + "was_2025": "LLM02" + }, + "LLM03": { + "title": "Excessive Agency", + "was_2025": "LLM06" + }, + "LLM04": { + "title": "Supply Chain", + "was_2025": "LLM03" + }, + "LLM05": { + "title": "Data and Model Poisoning", + "was_2025": "LLM04" + }, + "LLM06": { + "title": "Unbounded Consumption", + "was_2025": "LLM10" + }, + "LLM07": { + "title": "Misinformation", + "was_2025": "LLM09" + }, + "LLM08": { + "title": "Hidden Context Exposure", + "was_2025": "LLM07", + "note": "renamed and widened" + }, + "LLM09": { + "title": "Vector and Embedding Weaknesses", + "was_2025": "LLM08" + }, + "LLM10": { + "title": "Improper Output Handling", + "was_2025": "LLM05" + } + } + }, + "llm_2025_to_2026": { + "LLM01": "LLM01", + "LLM02": "LLM02", + "LLM03": "LLM04", + "LLM04": "LLM05", + "LLM05": "LLM10", + "LLM06": "LLM03", + "LLM07": "LLM08", + "LLM08": "LLM09", + "LLM09": "LLM07", + "LLM10": "LLM06" + }, + "agentic_2026": { + "source": "https://genai.owasp.org/resource/owasp-top-10-for-agentic-applications-for-2026/", + "published": "2025-12", + "cross_map_note": "related_llm_2025 is Appendix A as published; related_llm_2026 is the same list translated through llm_2025_to_2026. threat_ids are the Agentic AI Threats and Mitigations T-codes.", + "incident_tracker": "https://github.com/OWASP/www-project-top-10-for-large-language-model-applications/blob/main/initiatives/agent_security_initiative/ASI%20Agentic%20Exploits%20%26%20Incidents/ASI_Agentic_Exploits_Incidents.md", + "items": { + "ASI01": { + "title": "Agent Goal Hijack", + "summary": "Content the agent reads - a document, a web page, a tool result, a message - redirects what the agent is trying to accomplish, so it pursues an attacker's objective with the user's authority.", + "related_llm_2025": [ + "LLM01", + "LLM06" + ], + "related_llm_2026": [ + "LLM01", + "LLM03" + ], + "threat_ids": [ + "T6", + "T7" + ] + }, + "ASI02": { + "title": "Tool Misuse and Exploitation", + "summary": "The agent uses tools it was legitimately given in an unsafe or unintended way - chaining them, over-calling them or passing them attacker-shaped arguments - without any tool being vulnerable itself.", + "related_llm_2025": [ + "LLM06" + ], + "related_llm_2026": [ + "LLM03" + ], + "threat_ids": [ + "T2", + "T4", + "T16" + ] + }, + "ASI03": { + "title": "Identity and Privilege Abuse", + "summary": "Credentials, tokens and delegated permissions held by or passed through an agent are reused, inherited or escalated beyond what the task needed.", + "related_llm_2025": [ + "LLM01", + "LLM06", + "LLM02" + ], + "related_llm_2026": [ + "LLM01", + "LLM02", + "LLM03" + ], + "threat_ids": [ + "T3" + ] + }, + "ASI04": { + "title": "Agentic Supply Chain Vulnerabilities", + "summary": "A third-party component the agent loads at runtime - an MCP server, plugin, tool definition, model, prompt template or agent card - is malicious or compromised.", + "related_llm_2025": [ + "LLM03" + ], + "related_llm_2026": [ + "LLM04" + ], + "threat_ids": [ + "T17", + "T2", + "T11", + "T12", + "T13", + "T16" + ] + }, + "ASI05": { + "title": "Unexpected Code Execution", + "summary": "Agent-generated or agent-fetched code, commands or deserialised content execute on a host where nobody intended arbitrary execution.", + "related_llm_2025": [ + "LLM01", + "LLM05" + ], + "related_llm_2026": [ + "LLM01", + "LLM10" + ], + "threat_ids": [ + "T11" + ] + }, + "ASI06": { + "title": "Memory and Context Poisoning", + "summary": "Persistent memory, retrieved context or shared state is seeded with content that changes the agent's later behaviour, surviving the session that planted it.", + "related_llm_2025": [ + "LLM01", + "LLM04", + "LLM08" + ], + "related_llm_2026": [ + "LLM01", + "LLM05", + "LLM09" + ], + "threat_ids": [ + "T1", + "T4", + "T6", + "T12" + ] + }, + "ASI07": { + "title": "Insecure Inter-Agent Communication", + "summary": "Messages between agents are spoofed, intercepted, replayed or trusted without authentication, so one agent can be steered through another.", + "related_llm_2025": [ + "LLM02", + "LLM06" + ], + "related_llm_2026": [ + "LLM02", + "LLM03" + ], + "threat_ids": [ + "T12", + "T16" + ] + }, + "ASI08": { + "title": "Cascading Failures", + "summary": "One faulty or compromised step propagates through automated agent chains and amplifies into a wider failure before a human can intervene.", + "related_llm_2025": [ + "LLM01", + "LLM04", + "LLM06" + ], + "related_llm_2026": [ + "LLM01", + "LLM03", + "LLM05" + ], + "threat_ids": [ + "T5", + "T8" + ] + }, + "ASI09": { + "title": "Human-Agent Trust Exploitation", + "summary": "The agent's apparent authority or fluency is used to get a human to approve, run or believe something they would otherwise reject.", + "related_llm_2025": [ + "LLM01", + "LLM05", + "LLM06", + "LLM09" + ], + "related_llm_2026": [ + "LLM01", + "LLM03", + "LLM07", + "LLM10" + ], + "threat_ids": [ + "T7", + "T8", + "T10" + ] + }, + "ASI10": { + "title": "Rogue Agents", + "summary": "An agent drifts from, conceals or acts against its intended behaviour - through compromise or misalignment - while still appearing to operate normally.", + "related_llm_2025": [ + "LLM02", + "LLM09" + ], + "related_llm_2026": [ + "LLM02", + "LLM07" + ], + "threat_ids": [ + "T13", + "T14", + "T15" + ] + } + } + } +} diff --git a/artifacts/schema/technique-ids.json b/artifacts/schema/technique-ids.json index 81a6205..fc22d42 100644 --- a/artifacts/schema/technique-ids.json +++ b/artifacts/schema/technique-ids.json @@ -1,14 +1,52 @@ { "_comment": "Generated by scripts/validate_techniques.py --refresh. Do not hand-edit.", - "retrieved": "2026-08-14", + "retrieved": "2026-09-30", "atlas": { - "release": "2026.07", - "source": "https://raw.githubusercontent.com/mitre-atlas/atlas-data/main/dist/v6/ATLAS-2026.07.yaml", + "release": "2026.09", + "release_date": "2026-09-15", + "source": "https://raw.githubusercontent.com/mitre-atlas/atlas-data/main/dist/v6/ATLAS-2026.09.yaml", + "tactic_order": [ + "AML.TA0002", + "AML.TA0003", + "AML.TA0001", + "AML.TA0004", + "AML.TA0000", + "AML.TA0005", + "AML.TA0006", + "AML.TA0012", + "AML.TA0007", + "AML.TA0013", + "AML.TA0008", + "AML.TA0015", + "AML.TA0009", + "AML.TA0014", + "AML.TA0010", + "AML.TA0011" + ], + "tactics": { + "AML.TA0000": "AI Model Access", + "AML.TA0001": "AI Attack Adaptation", + "AML.TA0002": "Reconnaissance", + "AML.TA0003": "Resource Development", + "AML.TA0004": "Initial Access", + "AML.TA0005": "Execution", + "AML.TA0006": "Persistence", + "AML.TA0007": "Defense Evasion", + "AML.TA0008": "Discovery", + "AML.TA0009": "Collection", + "AML.TA0010": "Exfiltration", + "AML.TA0011": "Impact", + "AML.TA0012": "Privilege Escalation", + "AML.TA0013": "Credential Access", + "AML.TA0014": "Command and Control", + "AML.TA0015": "Lateral Movement" + }, "techniques": { "AML.T0000": "Search Open Technical Databases", "AML.T0000.000": "Journals and Conference Proceedings", "AML.T0000.001": "Pre-Print Repositories", "AML.T0000.002": "Technical Blogs", + "AML.T0000.003": "Scan Databases", "AML.T0001": "Search Open AI Vulnerability Analysis", "AML.T0002": "Acquire Public AI Artifacts", "AML.T0002.000": "Datasets", @@ -21,6 +59,10 @@ "AML.T0005.001": "Train Proxy via Replication", "AML.T0005.002": "Use Pre-Trained Model", "AML.T0006": "Active Scanning", + "AML.T0006.000": "Enumerate Hosted AI Resources", + "AML.T0006.001": "Query Platform Metadata APIs", + "AML.T0006.002": "Scan for Exposed AI Infrastructure", + "AML.T0006.003": "Probe AI Agent Trigger Channels", "AML.T0007": "Discover AI Artifacts", "AML.T0008": "Acquire Infrastructure", "AML.T0008.000": "AI Development Workspaces", @@ -49,8 +91,12 @@ "AML.T0016.000": "Adversarial AI Attack Implementations", "AML.T0016.001": "Software Tools", "AML.T0016.002": "Generative AI", + "AML.T0016.003": "Exploits", + "AML.T0016.004": "AI Agent Tools", "AML.T0017": "Develop Capabilities", "AML.T0017.000": "Adversarial AI Attacks", + "AML.T0017.001": "Autonomous Exploit Development", + "AML.T0017.002": "AI Agent Tools", "AML.T0018": "Manipulate AI Model", "AML.T0018.000": "Poison AI Model", "AML.T0018.001": "Modify AI Model Architecture", @@ -121,10 +167,10 @@ "AML.T0069.002": "System Prompt", "AML.T0070": "RAG Poisoning", "AML.T0071": "False RAG Entry Injection", - "AML.T0072": "Reverse Shell", + "AML.T0072": "Cyber Communication Channel", "AML.T0073": "Impersonation", "AML.T0074": "Masquerading", - "AML.T0075": "Cloud Service Discovery", + "AML.T0075": "Enterprise Resource Discovery", "AML.T0076": "Corrupt AI Model", "AML.T0077": "LLM Response Rendering", "AML.T0078": "Drive-by Compromise", @@ -146,7 +192,7 @@ "AML.T0086": "Exfiltration via AI Agent Tool Invocation", "AML.T0087": "Gather Victim Identity Information", "AML.T0088": "Generate Deepfakes", - "AML.T0089": "Process Discovery", + "AML.T0089": "Enterprise Environment Discovery", "AML.T0090": "OS Credential Dumping", "AML.T0091": "Use Alternate Authentication Material", "AML.T0091.000": "Application Access Token", @@ -183,22 +229,2484 @@ "AML.T0115.000": "Datasets", "AML.T0115.001": "Models", "AML.T0115.002": "AI Agent Tools", - "AML.TA0000": "AI Model Access", - "AML.TA0001": "AI Attack Staging", - "AML.TA0002": "Reconnaissance", - "AML.TA0003": "Resource Development", - "AML.TA0004": "Initial Access", - "AML.TA0005": "Execution", - "AML.TA0006": "Persistence", - "AML.TA0007": "Defense Evasion", - "AML.TA0008": "Discovery", - "AML.TA0009": "Collection", - "AML.TA0010": "Exfiltration", - "AML.TA0011": "Impact", - "AML.TA0012": "Privilege Escalation", - "AML.TA0013": "Credential Access", - "AML.TA0014": "Command and Control", - "AML.TA0015": "Lateral Movement" + "AML.T0116": "Autonomous Reconnaissance", + "AML.T0117": "Autonomous Attack-Path Adaptation", + "AML.T0118": "Autonomous AI Agent Communication", + "AML.T0118.000": "Communication via Shared Artifacts", + "AML.T0118.001": "Direct Agent Communication", + "AML.T0119": "Exploit Automated Artifact Processing Pipeline", + "AML.T0120": "AI Artifact Repository", + "AML.T0121": "AI Agent Environment Reconstruction", + "AML.T0122": "Exploitation of Remote Services", + "AML.T0123": "Obfuscated Files or Information", + "AML.T0124": "Autonomous Attack Orchestration", + "AML.T0125": "Create Account", + "AML.T0126": "Automated Collection", + "AML.T0127": "Data Staged", + "AML.T0128": "Compromise Infrastructure", + "AML.T0129": "Triggers in Multimodal Inputs", + "AML.T0130": "AI Agent Response Biasing", + "AML.T0131": "Crafted AI Assistant Links", + "AML.T0132": "Misconfigured or Publicly Exposed AI Services", + "AML.T0133": "Discover AI Agent Runtime Capabilities", + "AML.T0134": "AI Targeted Cloaking" + }, + "technique_tactics": { + "AML.T0000": [ + "AML.TA0002" + ], + "AML.T0000.000": [ + "AML.TA0002" + ], + "AML.T0000.001": [ + "AML.TA0002" + ], + "AML.T0000.002": [ + "AML.TA0002" + ], + "AML.T0000.003": [ + "AML.TA0002" + ], + "AML.T0001": [ + "AML.TA0002" + ], + "AML.T0002": [ + "AML.TA0003" + ], + "AML.T0002.000": [ + "AML.TA0003" + ], + "AML.T0002.001": [ + "AML.TA0003" + ], + "AML.T0002.002": [ + "AML.TA0003" + ], + "AML.T0003": [ + "AML.TA0002" + ], + "AML.T0004": [ + "AML.TA0002" + ], + "AML.T0005": [ + "AML.TA0001" + ], + "AML.T0005.000": [ + "AML.TA0001" + ], + "AML.T0005.001": [ + "AML.TA0001" + ], + "AML.T0005.002": [ + "AML.TA0001" + ], + "AML.T0006": [ + "AML.TA0002" + ], + "AML.T0006.000": [ + "AML.TA0002" + ], + "AML.T0006.001": [ + "AML.TA0002" + ], + "AML.T0006.002": [ + "AML.TA0002" + ], + "AML.T0006.003": [ + "AML.TA0002" + ], + "AML.T0007": [ + "AML.TA0008" + ], + "AML.T0008": [ + "AML.TA0003" + ], + "AML.T0008.000": [ + "AML.TA0003" + ], + "AML.T0008.001": [ + "AML.TA0003" + ], + "AML.T0008.002": [ + "AML.TA0003" + ], + "AML.T0008.003": [ + "AML.TA0003" + ], + "AML.T0008.004": [ + "AML.TA0003" + ], + "AML.T0008.005": [ + "AML.TA0003" + ], + "AML.T0010": [ + "AML.TA0004" + ], + "AML.T0010.000": [ + "AML.TA0004" + ], + "AML.T0010.001": [ + "AML.TA0004" + ], + "AML.T0010.002": [ + "AML.TA0004" + ], + "AML.T0010.003": [ + "AML.TA0004" + ], + "AML.T0010.004": [ + "AML.TA0004" + ], + "AML.T0010.005": [ + "AML.TA0004" + ], + "AML.T0011": [ + "AML.TA0005" + ], + "AML.T0011.000": [ + "AML.TA0005" + ], + "AML.T0011.001": [ + "AML.TA0005" + ], + "AML.T0011.002": [ + "AML.TA0005" + ], + "AML.T0011.003": [ + "AML.TA0005" + ], + "AML.T0012": [ + "AML.TA0004", + "AML.TA0012", + "AML.TA0015" + ], + "AML.T0013": [ + "AML.TA0008" + ], + "AML.T0014": [ + "AML.TA0008" + ], + "AML.T0015": [ + "AML.TA0004", + "AML.TA0007", + "AML.TA0011" + ], + "AML.T0016": [ + "AML.TA0003" + ], + "AML.T0016.000": [ + "AML.TA0003" + ], + "AML.T0016.001": [ + "AML.TA0003" + ], + "AML.T0016.002": [ + "AML.TA0003" + ], + "AML.T0016.003": [ + "AML.TA0003" + ], + "AML.T0016.004": [ + "AML.TA0003" + ], + "AML.T0017": [ + "AML.TA0003" + ], + "AML.T0017.000": [ + "AML.TA0003" + ], + "AML.T0017.001": [ + "AML.TA0003" + ], + "AML.T0017.002": [ + "AML.TA0003" + ], + "AML.T0018": [ + "AML.TA0001", + "AML.TA0006" + ], + "AML.T0018.000": [ + "AML.TA0001", + "AML.TA0006" + ], + "AML.T0018.001": [ + "AML.TA0001", + "AML.TA0006" + ], + "AML.T0018.002": [ + "AML.TA0001", + "AML.TA0006" + ], + "AML.T0018.003": [ + "AML.TA0001", + "AML.TA0006" + ], + "AML.T0020": [ + "AML.TA0006" + ], + "AML.T0021": [ + "AML.TA0003" + ], + "AML.T0024": [ + "AML.TA0010" + ], + "AML.T0024.000": [ + "AML.TA0010" + ], + "AML.T0024.001": [ + "AML.TA0010" + ], + "AML.T0024.002": [ + "AML.TA0010" + ], + "AML.T0025": [ + "AML.TA0010" + ], + "AML.T0029": [ + "AML.TA0011" + ], + "AML.T0031": [ + "AML.TA0011" + ], + "AML.T0034": [ + "AML.TA0011" + ], + "AML.T0034.000": [ + "AML.TA0011" + ], + "AML.T0034.001": [ + "AML.TA0011" + ], + "AML.T0034.002": [ + "AML.TA0011" + ], + "AML.T0035": [ + "AML.TA0009" + ], + "AML.T0036": [ + "AML.TA0009" + ], + "AML.T0037": [ + "AML.TA0009" + ], + "AML.T0040": [ + "AML.TA0000" + ], + "AML.T0041": [ + "AML.TA0000" + ], + "AML.T0042": [ + "AML.TA0001" + ], + "AML.T0043": [ + "AML.TA0001" + ], + "AML.T0043.000": [ + "AML.TA0001" + ], + "AML.T0043.001": [ + "AML.TA0001" + ], + "AML.T0043.002": [ + "AML.TA0001" + ], + "AML.T0043.003": [ + "AML.TA0001" + ], + "AML.T0043.004": [ + "AML.TA0001" + ], + "AML.T0044": [ + "AML.TA0000" + ], + "AML.T0046": [ + "AML.TA0011" + ], + "AML.T0047": [ + "AML.TA0000" + ], + "AML.T0048": [ + "AML.TA0011" + ], + "AML.T0048.000": [ + "AML.TA0011" + ], + "AML.T0048.001": [ + "AML.TA0011" + ], + "AML.T0048.002": [ + "AML.TA0011" + ], + "AML.T0048.003": [ + "AML.TA0011" + ], + "AML.T0048.004": [ + "AML.TA0011" + ], + "AML.T0049": [ + "AML.TA0004" + ], + "AML.T0050": [ + "AML.TA0005" + ], + "AML.T0051": [ + "AML.TA0005" + ], + "AML.T0051.000": [ + "AML.TA0005" + ], + "AML.T0051.001": [ + "AML.TA0005" + ], + "AML.T0051.002": [ + "AML.TA0005" + ], + "AML.T0052": [ + "AML.TA0004", + "AML.TA0015" + ], + "AML.T0052.000": [ + "AML.TA0004", + "AML.TA0015" + ], + "AML.T0052.001": [ + "AML.TA0004", + "AML.TA0015" + ], + "AML.T0053": [ + "AML.TA0005", + "AML.TA0012", + "AML.TA0015" + ], + "AML.T0054": [ + "AML.TA0007", + "AML.TA0012" + ], + "AML.T0055": [ + "AML.TA0013" + ], + "AML.T0056": [ + "AML.TA0010" + ], + "AML.T0057": [ + "AML.TA0010" + ], + "AML.T0059": [ + "AML.TA0011" + ], + "AML.T0060": [ + "AML.TA0003" + ], + "AML.T0061": [ + "AML.TA0006" + ], + "AML.T0062": [ + "AML.TA0008" + ], + "AML.T0063": [ + "AML.TA0008" + ], + "AML.T0064": [ + "AML.TA0002" + ], + "AML.T0065": [ + "AML.TA0001" + ], + "AML.T0066": [ + "AML.TA0001" + ], + "AML.T0067": [ + "AML.TA0007" + ], + "AML.T0067.000": [ + "AML.TA0007" + ], + "AML.T0068": [ + "AML.TA0007" + ], + "AML.T0069": [ + "AML.TA0008" + ], + "AML.T0069.000": [ + "AML.TA0008" + ], + "AML.T0069.001": [ + "AML.TA0008" + ], + "AML.T0069.002": [ + "AML.TA0008" + ], + "AML.T0070": [ + "AML.TA0006" + ], + "AML.T0071": [ + "AML.TA0007" + ], + "AML.T0072": [ + "AML.TA0014" + ], + "AML.T0073": [ + "AML.TA0007" + ], + "AML.T0074": [ + "AML.TA0007" + ], + "AML.T0075": [ + "AML.TA0008" + ], + "AML.T0076": [ + "AML.TA0007" + ], + "AML.T0077": [ + "AML.TA0010" + ], + "AML.T0078": [ + "AML.TA0004" + ], + "AML.T0079": [ + "AML.TA0003" + ], + "AML.T0080": [ + "AML.TA0006" + ], + "AML.T0080.000": [ + "AML.TA0006" + ], + "AML.T0080.001": [ + "AML.TA0006" + ], + "AML.T0081": [ + "AML.TA0006", + "AML.TA0007" + ], + "AML.T0082": [ + "AML.TA0013" + ], + "AML.T0083": [ + "AML.TA0013" + ], + "AML.T0084": [ + "AML.TA0008" + ], + "AML.T0084.000": [ + "AML.TA0008" + ], + "AML.T0084.001": [ + "AML.TA0008" + ], + "AML.T0084.002": [ + "AML.TA0008" + ], + "AML.T0084.003": [ + "AML.TA0008" + ], + "AML.T0085": [ + "AML.TA0009" + ], + "AML.T0085.000": [ + "AML.TA0009" + ], + "AML.T0085.001": [ + "AML.TA0009" + ], + "AML.T0086": [ + "AML.TA0010" + ], + "AML.T0087": [ + "AML.TA0002" + ], + "AML.T0088": [ + "AML.TA0001" + ], + "AML.T0089": [ + "AML.TA0008" + ], + "AML.T0090": [ + "AML.TA0013" + ], + "AML.T0091": [ + "AML.TA0015" + ], + "AML.T0091.000": [ + "AML.TA0015" + ], + "AML.T0091.001": [ + "AML.TA0015" + ], + "AML.T0092": [ + "AML.TA0007" + ], + "AML.T0093": [ + "AML.TA0004", + "AML.TA0006" + ], + "AML.T0094": [ + "AML.TA0007" + ], + "AML.T0095": [ + "AML.TA0002" + ], + "AML.T0095.000": [ + "AML.TA0002" + ], + "AML.T0096": [ + "AML.TA0014" + ], + "AML.T0097": [ + "AML.TA0007" + ], + "AML.T0098": [ + "AML.TA0013" + ], + "AML.T0099": [ + "AML.TA0006" + ], + "AML.T0100": [ + "AML.TA0005" + ], + "AML.T0101": [ + "AML.TA0011" + ], + "AML.T0102": [ + "AML.TA0001" + ], + "AML.T0103": [ + "AML.TA0005" + ], + "AML.T0105": [ + "AML.TA0012" + ], + "AML.T0106": [ + "AML.TA0013" + ], + "AML.T0107": [ + "AML.TA0007" + ], + "AML.T0108": [ + "AML.TA0014" + ], + "AML.T0109": [ + "AML.TA0007" + ], + "AML.T0110": [ + "AML.TA0006" + ], + "AML.T0110.000": [ + "AML.TA0006" + ], + "AML.T0110.001": [ + "AML.TA0006" + ], + "AML.T0110.002": [ + "AML.TA0006" + ], + "AML.T0111": [ + "AML.TA0007" + ], + "AML.T0112": [ + "AML.TA0011" + ], + "AML.T0112.000": [ + "AML.TA0011" + ], + "AML.T0112.001": [ + "AML.TA0011" + ], + "AML.T0113": [ + "AML.TA0013" + ], + "AML.T0114": [ + "AML.TA0014" + ], + "AML.T0115": [ + "AML.TA0003" + ], + "AML.T0115.000": [ + "AML.TA0003" + ], + "AML.T0115.001": [ + "AML.TA0003" + ], + "AML.T0115.002": [ + "AML.TA0003" + ], + "AML.T0116": [ + "AML.TA0002" + ], + "AML.T0117": [ + "AML.TA0001" + ], + "AML.T0118": [ + "AML.TA0001" + ], + "AML.T0118.000": [ + "AML.TA0001" + ], + "AML.T0118.001": [ + "AML.TA0001" + ], + "AML.T0119": [ + "AML.TA0004" + ], + "AML.T0120": [ + "AML.TA0014" + ], + "AML.T0121": [ + "AML.TA0006" + ], + "AML.T0122": [ + "AML.TA0015" + ], + "AML.T0123": [ + "AML.TA0007" + ], + "AML.T0124": [ + "AML.TA0001" + ], + "AML.T0125": [ + "AML.TA0006" + ], + "AML.T0126": [ + "AML.TA0009" + ], + "AML.T0127": [ + "AML.TA0009" + ], + "AML.T0128": [ + "AML.TA0003" + ], + "AML.T0129": [ + "AML.TA0007" + ], + "AML.T0130": [ + "AML.TA0011" + ], + "AML.T0131": [ + "AML.TA0004" + ], + "AML.T0132": [ + "AML.TA0004" + ], + "AML.T0133": [ + "AML.TA0008" + ], + "AML.T0134": [ + "AML.TA0007" + ] + }, + "mitigations": { + "AML.M0000": "Limit Public Release of Information", + "AML.M0001": "Limit Model Artifact Release", + "AML.M0002": "Predictive AI Output Obfuscation", + "AML.M0003": "Predictive AI Model Hardening", + "AML.M0004": "Limit AI Service Query Volume and Rate", + "AML.M0005": "Control Access to AI Models and Data at Rest", + "AML.M0006": "Predictive AI Ensembles", + "AML.M0007": "Sanitize Training Data", + "AML.M0008": "Validate AI Model", + "AML.M0009": "Predictive AI Multi-Sensor Fusion", + "AML.M0010": "Predictive AI Input Restoration", + "AML.M0011": "Restrict Library Loading", + "AML.M0012": "Encrypt Sensitive Information", + "AML.M0013": "Code Signing", + "AML.M0014": "Verify AI Artifacts", + "AML.M0015": "Predictive AI Adversarial Input Detection", + "AML.M0016": "Vulnerability Scanning", + "AML.M0017": "AI Model Distribution Methods", + "AML.M0018": "User Training", + "AML.M0019": "Control Access to AI Models and Data in Production", + "AML.M0020": "Generative AI Guardrails", + "AML.M0021": "Generative AI Guidelines", + "AML.M0022": "Generative AI Model Alignment", + "AML.M0023": "AI Bill of Materials", + "AML.M0024": "AI Telemetry Logging", + "AML.M0025": "Maintain AI Dataset Provenance", + "AML.M0026": "Privileged AI Agent Permissions Configuration", + "AML.M0027": "Single-User AI Agent Permissions Configuration", + "AML.M0028": "AI Agent Tools Permissions Configuration", + "AML.M0029": "Human In-the-Loop for AI Agent Actions", + "AML.M0030": "Restrict AI Agent Tool Invocation on Untrusted Data", + "AML.M0031": "Memory Hardening", + "AML.M0032": "Segmentation of AI Agent Components", + "AML.M0033": "Input and Output Validation for AI Agent Components", + "AML.M0034": "Deepfake Detection", + "AML.M0035": "AI Red Team", + "AML.M0036": "Limit AI Workload Resource Consumption", + "AML.M0037": "AI Agent Authority Expansion Controls", + "AML.M0038": "AI Agent Scope Drift Detection", + "AML.M0039": "AI Honeypots" + }, + "technique_mitigations": { + "AML.T0000": [ + "AML.M0000", + "AML.M0039" + ], + "AML.T0000.003": [ + "AML.M0039" + ], + "AML.T0001": [ + "AML.M0000" + ], + "AML.T0002": [ + "AML.M0000" + ], + "AML.T0002.000": [ + "AML.M0001" + ], + "AML.T0002.001": [ + "AML.M0001", + "AML.M0014" + ], + "AML.T0003": [ + "AML.M0000" + ], + "AML.T0004": [ + "AML.M0000" + ], + "AML.T0005": [ + "AML.M0000", + "AML.M0001", + "AML.M0002", + "AML.M0004", + "AML.M0019" + ], + "AML.T0005.000": [ + "AML.M0000", + "AML.M0001" + ], + "AML.T0005.001": [ + "AML.M0002", + "AML.M0004", + "AML.M0024" + ], + "AML.T0005.002": [ + "AML.M0000" + ], + "AML.T0006": [ + "AML.M0019", + "AML.M0032", + "AML.M0039" + ], + "AML.T0006.000": [ + "AML.M0039" + ], + "AML.T0006.001": [ + "AML.M0039" + ], + "AML.T0006.002": [ + "AML.M0039" + ], + "AML.T0006.003": [ + "AML.M0039" + ], + "AML.T0007": [ + "AML.M0005", + "AML.M0012" + ], + "AML.T0010": [ + "AML.M0014", + "AML.M0020", + "AML.M0023", + "AML.M0035" + ], + "AML.T0010.001": [ + "AML.M0006", + "AML.M0013", + "AML.M0035" + ], + "AML.T0010.002": [ + "AML.M0005", + "AML.M0007", + "AML.M0014", + "AML.M0025", + "AML.M0035" + ], + "AML.T0010.003": [ + "AML.M0005", + "AML.M0006", + "AML.M0008", + "AML.M0013", + "AML.M0017", + "AML.M0035" + ], + "AML.T0010.005": [ + "AML.M0035" + ], + "AML.T0011": [ + "AML.M0011", + "AML.M0014", + "AML.M0016", + "AML.M0018", + "AML.M0023" + ], + "AML.T0011.000": [ + "AML.M0011", + "AML.M0013", + "AML.M0014", + "AML.M0016", + "AML.M0018", + "AML.M0023" + ], + "AML.T0011.001": [ + "AML.M0011", + "AML.M0013", + "AML.M0016", + "AML.M0018", + "AML.M0023" + ], + "AML.T0012": [ + "AML.M0005", + "AML.M0019" + ], + "AML.T0013": [ + "AML.M0002", + "AML.M0004" + ], + "AML.T0014": [ + "AML.M0002", + "AML.M0004", + "AML.M0006" + ], + "AML.T0015": [ + "AML.M0003", + "AML.M0006", + "AML.M0009", + "AML.M0010", + "AML.M0015", + "AML.M0034", + "AML.M0035" + ], + "AML.T0016": [ + "AML.M0001" + ], + "AML.T0016.002": [ + "AML.M0001", + "AML.M0020", + "AML.M0022" + ], + "AML.T0018": [ + "AML.M0005", + "AML.M0008", + "AML.M0013", + "AML.M0035" + ], + "AML.T0018.000": [ + "AML.M0005", + "AML.M0007", + "AML.M0008", + "AML.M0013", + "AML.M0025", + "AML.M0035" + ], + "AML.T0018.001": [ + "AML.M0005", + "AML.M0008", + "AML.M0013", + "AML.M0035" + ], + "AML.T0018.002": [ + "AML.M0013" + ], + "AML.T0020": [ + "AML.M0001", + "AML.M0005", + "AML.M0007", + "AML.M0008", + "AML.M0023", + "AML.M0025", + "AML.M0035" + ], + "AML.T0021": [ + "AML.M0005", + "AML.M0019" + ], + "AML.T0024": [ + "AML.M0004", + "AML.M0019", + "AML.M0024", + "AML.M0035" + ], + "AML.T0024.000": [ + "AML.M0002", + "AML.M0004", + "AML.M0024", + "AML.M0035" + ], + "AML.T0024.001": [ + "AML.M0002", + "AML.M0004", + "AML.M0024", + "AML.M0035" + ], + "AML.T0024.002": [ + "AML.M0002", + "AML.M0004", + "AML.M0024", + "AML.M0035" + ], + "AML.T0025": [ + "AML.M0005" + ], + "AML.T0029": [ + "AML.M0004", + "AML.M0015", + "AML.M0019", + "AML.M0035", + "AML.M0036" + ], + "AML.T0031": [ + "AML.M0003", + "AML.M0006", + "AML.M0010", + "AML.M0015" + ], + "AML.T0034": [ + "AML.M0004", + "AML.M0019", + "AML.M0035", + "AML.M0036" + ], + "AML.T0034.000": [ + "AML.M0035" + ], + "AML.T0034.001": [ + "AML.M0035", + "AML.M0036" + ], + "AML.T0034.002": [ + "AML.M0035", + "AML.M0036" + ], + "AML.T0035": [ + "AML.M0001", + "AML.M0005", + "AML.M0012", + "AML.M0017" + ], + "AML.T0040": [ + "AML.M0019", + "AML.M0024", + "AML.M0039" + ], + "AML.T0041": [ + "AML.M0009" + ], + "AML.T0042": [ + "AML.M0002", + "AML.M0004", + "AML.M0005", + "AML.M0019" + ], + "AML.T0043": [ + "AML.M0002", + "AML.M0003", + "AML.M0004", + "AML.M0006", + "AML.M0008", + "AML.M0010", + "AML.M0015", + "AML.M0019" + ], + "AML.T0043.000": [ + "AML.M0003", + "AML.M0005", + "AML.M0006", + "AML.M0010", + "AML.M0015", + "AML.M0017" + ], + "AML.T0043.001": [ + "AML.M0002", + "AML.M0003", + "AML.M0004", + "AML.M0006", + "AML.M0010", + "AML.M0015", + "AML.M0019" + ], + "AML.T0043.002": [ + "AML.M0003", + "AML.M0006", + "AML.M0010", + "AML.M0015" + ], + "AML.T0043.003": [ + "AML.M0003", + "AML.M0004", + "AML.M0006", + "AML.M0010", + "AML.M0015" + ], + "AML.T0043.004": [ + "AML.M0003", + "AML.M0006", + "AML.M0008", + "AML.M0010", + "AML.M0015" + ], + "AML.T0044": [ + "AML.M0005", + "AML.M0017" + ], + "AML.T0046": [ + "AML.M0004", + "AML.M0019" + ], + "AML.T0047": [ + "AML.M0024" + ], + "AML.T0048.004": [ + "AML.M0005", + "AML.M0012", + "AML.M0017" + ], + "AML.T0049": [ + "AML.M0039" + ], + "AML.T0050": [ + "AML.M0011" + ], + "AML.T0051": [ + "AML.M0019", + "AML.M0020", + "AML.M0021", + "AML.M0022", + "AML.M0024", + "AML.M0033", + "AML.M0035" + ], + "AML.T0051.000": [ + "AML.M0024", + "AML.M0033", + "AML.M0035" + ], + "AML.T0051.001": [ + "AML.M0024", + "AML.M0033", + "AML.M0035" + ], + "AML.T0051.002": [ + "AML.M0024", + "AML.M0033", + "AML.M0035" + ], + "AML.T0052": [ + "AML.M0018", + "AML.M0034" + ], + "AML.T0052.000": [ + "AML.M0018", + "AML.M0034" + ], + "AML.T0052.001": [ + "AML.M0018", + "AML.M0034" + ], + "AML.T0053": [ + "AML.M0020", + "AML.M0021", + "AML.M0022", + "AML.M0024", + "AML.M0026", + "AML.M0027", + "AML.M0028", + "AML.M0029", + "AML.M0030", + "AML.M0032", + "AML.M0033", + "AML.M0035" + ], + "AML.T0054": [ + "AML.M0020", + "AML.M0021", + "AML.M0022", + "AML.M0035" + ], + "AML.T0056": [ + "AML.M0020", + "AML.M0021", + "AML.M0022", + "AML.M0035" + ], + "AML.T0057": [ + "AML.M0008", + "AML.M0020", + "AML.M0021", + "AML.M0022", + "AML.M0035" + ], + "AML.T0059": [ + "AML.M0007", + "AML.M0025" + ], + "AML.T0061": [ + "AML.M0020", + "AML.M0021", + "AML.M0022" + ], + "AML.T0062": [ + "AML.M0004", + "AML.M0020", + "AML.M0021", + "AML.M0022" + ], + "AML.T0063": [ + "AML.M0002", + "AML.M0012", + "AML.M0017", + "AML.M0019" + ], + "AML.T0064": [ + "AML.M0000" + ], + "AML.T0066": [ + "AML.M0020" + ], + "AML.T0068": [ + "AML.M0020", + "AML.M0035" + ], + "AML.T0069": [ + "AML.M0000", + "AML.M0005", + "AML.M0019", + "AML.M0020" + ], + "AML.T0069.000": [ + "AML.M0005", + "AML.M0019", + "AML.M0020" + ], + "AML.T0069.001": [ + "AML.M0005", + "AML.M0020" + ], + "AML.T0069.002": [ + "AML.M0005", + "AML.M0019", + "AML.M0020" + ], + "AML.T0070": [ + "AML.M0020", + "AML.M0035" + ], + "AML.T0071": [ + "AML.M0020" + ], + "AML.T0074": [ + "AML.M0011", + "AML.M0025" + ], + "AML.T0078": [ + "AML.M0020" + ], + "AML.T0080": [ + "AML.M0031", + "AML.M0035" + ], + "AML.T0080.000": [ + "AML.M0031", + "AML.M0035" + ], + "AML.T0080.001": [ + "AML.M0035" + ], + "AML.T0081": [ + "AML.M0035" + ], + "AML.T0082": [ + "AML.M0026", + "AML.M0027" + ], + "AML.T0084": [ + "AML.M0000", + "AML.M0039" + ], + "AML.T0084.001": [ + "AML.M0000" + ], + "AML.T0084.002": [ + "AML.M0000" + ], + "AML.T0084.003": [ + "AML.M0000" + ], + "AML.T0085": [ + "AML.M0024", + "AML.M0026", + "AML.M0027", + "AML.M0028", + "AML.M0032" + ], + "AML.T0085.000": [ + "AML.M0024", + "AML.M0026", + "AML.M0027", + "AML.M0032" + ], + "AML.T0085.001": [ + "AML.M0024", + "AML.M0026", + "AML.M0027", + "AML.M0028", + "AML.M0032" + ], + "AML.T0086": [ + "AML.M0024", + "AML.M0026", + "AML.M0027", + "AML.M0028", + "AML.M0029", + "AML.M0030", + "AML.M0032", + "AML.M0033" + ], + "AML.T0088": [ + "AML.M0009", + "AML.M0034" + ], + "AML.T0090": [ + "AML.M0011" + ], + "AML.T0091": [ + "AML.M0019" + ], + "AML.T0091.000": [ + "AML.M0019" + ], + "AML.T0093": [ + "AML.M0039" + ], + "AML.T0095": [ + "AML.M0000", + "AML.M0039" + ], + "AML.T0095.000": [ + "AML.M0039" + ], + "AML.T0096": [ + "AML.M0019" + ], + "AML.T0098": [ + "AML.M0032" + ], + "AML.T0099": [ + "AML.M0020" + ], + "AML.T0100": [ + "AML.M0020", + "AML.M0021" + ], + "AML.T0101": [ + "AML.M0024", + "AML.M0026", + "AML.M0027", + "AML.M0028", + "AML.M0029", + "AML.M0030" + ], + "AML.T0102": [ + "AML.M0020", + "AML.M0022" + ], + "AML.T0106": [ + "AML.M0016" + ], + "AML.T0107": [ + "AML.M0016" + ], + "AML.T0108": [ + "AML.M0020" + ], + "AML.T0112.000": [ + "AML.M0020" + ], + "AML.T0112.001": [ + "AML.M0005" + ], + "AML.T0114": [ + "AML.M0024" + ], + "AML.T0115": [ + "AML.M0007", + "AML.M0008", + "AML.M0016" + ], + "AML.T0115.000": [ + "AML.M0007" + ], + "AML.T0115.001": [ + "AML.M0008", + "AML.M0016" + ], + "AML.T0115.002": [ + "AML.M0016" + ], + "AML.T0116": [ + "AML.M0037", + "AML.M0038" + ], + "AML.T0117": [ + "AML.M0037", + "AML.M0038" + ], + "AML.T0119": [ + "AML.M0016" + ], + "AML.T0122": [ + "AML.M0016" + ], + "AML.T0124": [ + "AML.M0037", + "AML.M0038" + ], + "AML.T0132": [ + "AML.M0039" + ], + "AML.T0133": [ + "AML.M0039" + ] + }, + "case_studies": { + "AML.CS0000": { + "name": "Evasion of Deep Learning Detector for Malware C&C Traffic", + "type": "Exercise", + "date": "2020-01-01", + "techniques": [ + "AML.T0000.001", + "AML.T0002.000", + "AML.T0005", + "AML.T0015", + "AML.T0042", + "AML.T0043.003" + ] + }, + "AML.CS0001": { + "name": "Botnet Domain Generation Algorithm (DGA) Detection Evasion", + "type": "Exercise", + "date": "2020-01-01", + "techniques": [ + "AML.T0000", + "AML.T0002", + "AML.T0015", + "AML.T0017.000", + "AML.T0042", + "AML.T0043.001" + ] + }, + "AML.CS0002": { + "name": "VirusTotal Poisoning", + "type": "Incident", + "date": "2020-01-01", + "techniques": [ + "AML.T0010.002", + "AML.T0016.000", + "AML.T0020", + "AML.T0043" + ] + }, + "AML.CS0003": { + "name": "Bypassing Cylance's AI Malware Detection", + "type": "Exercise", + "date": "2019-09-07", + "techniques": [ + "AML.T0000", + "AML.T0015", + "AML.T0017.000", + "AML.T0043.003", + "AML.T0047", + "AML.T0063" + ] + }, + "AML.CS0004": { + "name": "Camera Hijack Attack on Facial Recognition System", + "type": "Incident", + "date": "2020-01-01", + "techniques": [ + "AML.T0008.001", + "AML.T0015", + "AML.T0016.000", + "AML.T0016.001", + "AML.T0021", + "AML.T0047", + "AML.T0048.000", + "AML.T0087" + ] + }, + "AML.CS0005": { + "name": "Attack on Machine Translation Services", + "type": "Exercise", + "date": "2020-04-30", + "techniques": [ + "AML.T0000", + "AML.T0002.000", + "AML.T0002.001", + "AML.T0005.001", + "AML.T0015", + "AML.T0031", + "AML.T0040", + "AML.T0043.002", + "AML.T0048.004" + ] + }, + "AML.CS0006": { + "name": "ClearviewAI Misconfiguration", + "type": "Incident", + "date": "2020-04-16", + "techniques": [ + "AML.T0002", + "AML.T0021", + "AML.T0031", + "AML.T0036" + ] + }, + "AML.CS0007": { + "name": "GPT-2 Model Replication", + "type": "Exercise", + "date": "2019-08-22", + "techniques": [ + "AML.T0000", + "AML.T0002.000", + "AML.T0002.001", + "AML.T0005.000", + "AML.T0008.000" + ] + }, + "AML.CS0008": { + "name": "ProofPoint Evasion", + "type": "Exercise", + "date": "2019-09-09", + "techniques": [ + "AML.T0005.001", + "AML.T0015", + "AML.T0043.002", + "AML.T0047", + "AML.T0063" + ] + }, + "AML.CS0009": { + "name": "Tay Poisoning", + "type": "Incident", + "date": "2016-03-23", + "techniques": [ + "AML.T0010.002", + "AML.T0020", + "AML.T0031", + "AML.T0047" + ] + }, + "AML.CS0010": { + "name": "Microsoft Azure Service Disruption", + "type": "Exercise", + "date": "2020-01-01", + "techniques": [ + "AML.T0000", + "AML.T0012", + "AML.T0015", + "AML.T0025", + "AML.T0035", + "AML.T0040", + "AML.T0042", + "AML.T0043.000" + ] + }, + "AML.CS0011": { + "name": "Microsoft Edge AI Evasion", + "type": "Exercise", + "date": "2020-02-01", + "techniques": [ + "AML.T0000", + "AML.T0002", + "AML.T0015", + "AML.T0040", + "AML.T0043.001" + ] + }, + "AML.CS0012": { + "name": "Face Identification System Evasion via Physical Countermeasures", + "type": "Exercise", + "date": "2020-01-01", + "techniques": [ + "AML.T0000", + "AML.T0002.000", + "AML.T0005", + "AML.T0008.003", + "AML.T0012", + "AML.T0013", + "AML.T0015", + "AML.T0040", + "AML.T0041", + "AML.T0043.000" + ] + }, + "AML.CS0013": { + "name": "Backdoor Attack on Deep Learning Models in Mobile Apps", + "type": "Exercise", + "date": "2021-01-18", + "techniques": [ + "AML.T0002.001", + "AML.T0004", + "AML.T0010.003", + "AML.T0015", + "AML.T0017.000", + "AML.T0018.001", + "AML.T0041", + "AML.T0042", + "AML.T0043.004", + "AML.T0044" + ] + }, + "AML.CS0014": { + "name": "Confusing Antimalware Neural Networks", + "type": "Exercise", + "date": "2021-06-23", + "techniques": [ + "AML.T0001", + "AML.T0002.000", + "AML.T0003", + "AML.T0005", + "AML.T0015", + "AML.T0017.000", + "AML.T0042", + "AML.T0043.002", + "AML.T0047" + ] + }, + "AML.CS0015": { + "name": "Compromised PyTorch Dependency Chain", + "type": "Incident", + "date": "2022-12-25", + "techniques": [ + "AML.T0010.001", + "AML.T0025", + "AML.T0037" + ] + }, + "AML.CS0016": { + "name": "Achieving Code Execution in MathGPT via Prompt Injection", + "type": "Exercise", + "date": "2023-01-28", + "techniques": [ + "AML.T0001", + "AML.T0029", + "AML.T0042", + "AML.T0047", + "AML.T0048.000", + "AML.T0051.000", + "AML.T0053", + "AML.T0055", + "AML.T0093" + ] + }, + "AML.CS0017": { + "name": "Bypassing ID.me Identity Verification", + "type": "Incident", + "date": "2020-10-01", + "techniques": [ + "AML.T0015", + "AML.T0047", + "AML.T0048.000" + ] + }, + "AML.CS0018": { + "name": "Arbitrary Code Execution with Google Colab", + "type": "Exercise", + "date": "2022-07-01", + "techniques": [ + "AML.T0010.001", + "AML.T0011", + "AML.T0012", + "AML.T0017", + "AML.T0025", + "AML.T0035", + "AML.T0048", + "AML.T0048.004" + ] + }, + "AML.CS0019": { + "name": "PoisonGPT", + "type": "Exercise", + "date": "2023-07-01", + "techniques": [ + "AML.T0002.001", + "AML.T0010.003", + "AML.T0018.000", + "AML.T0031", + "AML.T0042", + "AML.T0048.001", + "AML.T0115.001" + ] + }, + "AML.CS0020": { + "name": "Indirect Prompt Injection Threats: Bing Chat Data Pirate", + "type": "Exercise", + "date": "2023-01-01", + "techniques": [ + "AML.T0017", + "AML.T0048.003", + "AML.T0051.001", + "AML.T0052.000", + "AML.T0068" + ] + }, + "AML.CS0021": { + "name": "ChatGPT Conversation Exfiltration", + "type": "Exercise", + "date": "2023-05-01", + "techniques": [ + "AML.T0048.003", + "AML.T0051.001", + "AML.T0053", + "AML.T0065", + "AML.T0077", + "AML.T0078", + "AML.T0079" + ] + }, + "AML.CS0022": { + "name": "ChatGPT Package Hallucination", + "type": "Exercise", + "date": "2024-06-01", + "techniques": [ + "AML.T0010.001", + "AML.T0011.001", + "AML.T0040", + "AML.T0048.003", + "AML.T0060", + "AML.T0062" + ] + }, + "AML.CS0023": { + "name": "ShadowRay: Hijacking Exposed Ray Clusters", + "type": "Incident", + "date": "2023-09-05", + "techniques": [ + "AML.T0006", + "AML.T0010.003", + "AML.T0025", + "AML.T0035", + "AML.T0048.000", + "AML.T0049", + "AML.T0055" + ] + }, + "AML.CS0024": { + "name": "Morris II Worm: RAG-Based Attack", + "type": "Exercise", + "date": "2024-03-05", + "techniques": [ + "AML.T0040", + "AML.T0048.003", + "AML.T0051.000", + "AML.T0051.002", + "AML.T0053", + "AML.T0057", + "AML.T0061" + ] + }, + "AML.CS0025": { + "name": "Web-Scale Data Poisoning: Split-View Attack", + "type": "Exercise", + "date": "2024-06-06", + "techniques": [ + "AML.T0002.000", + "AML.T0008.002", + "AML.T0020", + "AML.T0031", + "AML.T0059", + "AML.T0115.000" + ] + }, + "AML.CS0026": { + "name": "Financial Transaction Hijacking with M365 Copilot as an Insider", + "type": "Exercise", + "date": "2024-08-08", + "techniques": [ + "AML.T0047", + "AML.T0048.000", + "AML.T0051.001", + "AML.T0053", + "AML.T0064", + "AML.T0065", + "AML.T0066", + "AML.T0067.000", + "AML.T0068", + "AML.T0069.000", + "AML.T0069.001", + "AML.T0070", + "AML.T0071", + "AML.T0093" + ] + }, + "AML.CS0027": { + "name": "Organization Confusion on Hugging Face", + "type": "Exercise", + "date": "2023-08-23", + "techniques": [ + "AML.T0007", + "AML.T0010.003", + "AML.T0011.000", + "AML.T0016.000", + "AML.T0018.000", + "AML.T0018.002", + "AML.T0021", + "AML.T0025", + "AML.T0044", + "AML.T0048", + "AML.T0048.004", + "AML.T0055", + "AML.T0072", + "AML.T0073", + "AML.T0074", + "AML.T0115.001" + ] + }, + "AML.CS0028": { + "name": "AI Model Tampering via Supply Chain Attack", + "type": "Exercise", + "date": "2023-09-26", + "techniques": [ + "AML.T0004", + "AML.T0007", + "AML.T0010.004", + "AML.T0015", + "AML.T0018.000", + "AML.T0018.001", + "AML.T0044", + "AML.T0048.004", + "AML.T0049" + ] + }, + "AML.CS0029": { + "name": "Google Bard Conversation Exfiltration", + "type": "Exercise", + "date": "2023-11-23", + "techniques": [ + "AML.T0008", + "AML.T0017", + "AML.T0048.003", + "AML.T0051.001", + "AML.T0065", + "AML.T0077", + "AML.T0093" + ] + }, + "AML.CS0030": { + "name": "LLM Jacking", + "type": "Incident", + "date": "2024-05-06", + "techniques": [ + "AML.T0012", + "AML.T0016.001", + "AML.T0048.000", + "AML.T0049", + "AML.T0055", + "AML.T0075" + ] + }, + "AML.CS0031": { + "name": "Malicious Models on Hugging Face", + "type": "Incident", + "date": "2025-02-25", + "techniques": [ + "AML.T0010", + "AML.T0011.000", + "AML.T0018.002", + "AML.T0072", + "AML.T0076", + "AML.T0115.001" + ] + }, + "AML.CS0032": { + "name": "Attempted Evasion of ML Phishing Webpage Detection System", + "type": "Incident", + "date": "2022-12-01", + "techniques": [ + "AML.T0015", + "AML.T0043.003", + "AML.T0048.003", + "AML.T0052" + ] + }, + "AML.CS0033": { + "name": "Live Deepfake Image Injection to Evade Mobile KYC Verification", + "type": "Exercise", + "date": "2024-10-01", + "techniques": [ + "AML.T0015", + "AML.T0016", + "AML.T0016.001", + "AML.T0016.002", + "AML.T0021", + "AML.T0047", + "AML.T0048.000", + "AML.T0073", + "AML.T0087", + "AML.T0088" + ] + }, + "AML.CS0034": { + "name": "ProKYC: Deepfake Tool for Account Fraud Attacks", + "type": "Incident", + "date": "2024-10-09", + "techniques": [ + "AML.T0015", + "AML.T0016.002", + "AML.T0021", + "AML.T0047", + "AML.T0048.000", + "AML.T0073", + "AML.T0087", + "AML.T0088" + ] + }, + "AML.CS0035": { + "name": "Data Exfiltration from Slack AI via Indirect Prompt Injection", + "type": "Exercise", + "date": "2024-08-20", + "techniques": [ + "AML.T0012", + "AML.T0047", + "AML.T0051.001", + "AML.T0065", + "AML.T0066", + "AML.T0070", + "AML.T0077", + "AML.T0082" + ] + }, + "AML.CS0036": { + "name": "AIKatz: Attacking LLM Desktop Applications", + "type": "Exercise", + "date": "2025-01-01", + "techniques": [ + "AML.T0012", + "AML.T0029", + "AML.T0047", + "AML.T0048.000", + "AML.T0048.003", + "AML.T0051.000", + "AML.T0080.000", + "AML.T0080.001", + "AML.T0089", + "AML.T0090", + "AML.T0091.000", + "AML.T0092" + ] + }, + "AML.CS0037": { + "name": "Data Exfiltration via Agent Tools in Copilot Studio", + "type": "Exercise", + "date": "2025-06-01", + "techniques": [ + "AML.T0006.003", + "AML.T0047", + "AML.T0051", + "AML.T0051.002", + "AML.T0065", + "AML.T0084.000", + "AML.T0084.001", + "AML.T0084.002", + "AML.T0085.000", + "AML.T0085.001", + "AML.T0086", + "AML.T0093" + ] + }, + "AML.CS0038": { + "name": "Planting Instructions for Delayed Automatic AI Agent Tool Invocation", + "type": "Exercise", + "date": "2024-02-01", + "techniques": [ + "AML.T0051.001", + "AML.T0053", + "AML.T0065", + "AML.T0085.001", + "AML.T0093", + "AML.T0094" + ] + }, + "AML.CS0039": { + "name": "Living Off AI: Prompt Injection via Jira Service Management", + "type": "Exercise", + "date": "2025-06-19", + "techniques": [ + "AML.T0003", + "AML.T0051.001", + "AML.T0053", + "AML.T0065", + "AML.T0085.001", + "AML.T0086", + "AML.T0093", + "AML.T0095" + ] + }, + "AML.CS0040": { + "name": "Hacking ChatGPT's Memories with Prompt Injection", + "type": "Exercise", + "date": "2024-02-01", + "techniques": [ + "AML.T0048.003", + "AML.T0051.001", + "AML.T0065", + "AML.T0068", + "AML.T0080.000", + "AML.T0093" + ] + }, + "AML.CS0041": { + "name": "Rules File Backdoor: Supply Chain Attack on AI Coding Assistants", + "type": "Exercise", + "date": "2025-03-18", + "techniques": [ + "AML.T0010.001", + "AML.T0048.003", + "AML.T0051.000", + "AML.T0054", + "AML.T0065", + "AML.T0067", + "AML.T0068", + "AML.T0079", + "AML.T0081" + ] + }, + "AML.CS0042": { + "name": "SesameOp: Novel backdoor uses OpenAI Assistants API for command and control", + "type": "Incident", + "date": "2025-07-01", + "techniques": [ + "AML.T0096" + ] + }, + "AML.CS0043": { + "name": "Malware Prototype with Embedded Prompt Injection", + "type": "Incident", + "date": "2025-06-25", + "techniques": [ + "AML.T0015", + "AML.T0017", + "AML.T0025", + "AML.T0037", + "AML.T0051.000", + "AML.T0055", + "AML.T0065", + "AML.T0097" + ] + }, + "AML.CS0044": { + "name": "LAMEHUG: Malware Leveraging Dynamic AI-Generated Commands", + "type": "Incident", + "date": "2025-06-03", + "techniques": [ + "AML.T0011", + "AML.T0012", + "AML.T0025", + "AML.T0037", + "AML.T0052", + "AML.T0073", + "AML.T0074", + "AML.T0102" + ] + }, + "AML.CS0045": { + "name": "Data Exfiltration via an MCP Server used by Cursor", + "type": "Exercise", + "date": "2025-06-24", + "techniques": [ + "AML.T0048.000", + "AML.T0051.001", + "AML.T0053", + "AML.T0065", + "AML.T0068", + "AML.T0078", + "AML.T0079", + "AML.T0083", + "AML.T0086" + ] + }, + "AML.CS0046": { + "name": "Data Destruction via Indirect Prompt Injection Targeting Claude Computer-Use", + "type": "Exercise", + "date": "2024-10-24", + "techniques": [ + "AML.T0051.001", + "AML.T0053", + "AML.T0054", + "AML.T0065", + "AML.T0068", + "AML.T0093", + "AML.T0101" + ] + }, + "AML.CS0047": { + "name": "Code to Deploy Destructive AI Agent Discovered in Amazon Q VS Code Extension", + "type": "Incident", + "date": "2025-07-13", + "techniques": [ + "AML.T0010.001", + "AML.T0011.001", + "AML.T0051.000", + "AML.T0055", + "AML.T0065", + "AML.T0101", + "AML.T0103" + ] + }, + "AML.CS0048": { + "name": "Exposed ClawdBot Control Interfaces Leads to Credential Access and Execution", + "type": "Exercise", + "date": "2026-01-25", + "techniques": [ + "AML.T0000.003", + "AML.T0025", + "AML.T0048.003", + "AML.T0051.001", + "AML.T0053", + "AML.T0069.002", + "AML.T0083", + "AML.T0092", + "AML.T0098", + "AML.T0132" + ] + }, + "AML.CS0049": { + "name": "Supply Chain Compromise via Poisoned ClawdBot Skill", + "type": "Exercise", + "date": "2026-01-26", + "techniques": [ + "AML.T0008.002", + "AML.T0010.005", + "AML.T0011.002", + "AML.T0017", + "AML.T0048", + "AML.T0051.001", + "AML.T0053", + "AML.T0065", + "AML.T0074", + "AML.T0110.000", + "AML.T0111", + "AML.T0115.002" + ] + }, + "AML.CS0050": { + "name": "OpenClaw 1-Click Remote Code Execution", + "type": "Exercise", + "date": "2026-02-01", + "techniques": [ + "AML.T0011.003", + "AML.T0012", + "AML.T0017", + "AML.T0050", + "AML.T0079", + "AML.T0081", + "AML.T0105", + "AML.T0106", + "AML.T0107" + ] + }, + "AML.CS0051": { + "name": "OpenClaw Command & Control via Prompt Injection", + "type": "Exercise", + "date": "2026-02-03", + "techniques": [ + "AML.T0002.002", + "AML.T0008", + "AML.T0051.000", + "AML.T0051.001", + "AML.T0053", + "AML.T0054", + "AML.T0065", + "AML.T0069.000", + "AML.T0069.001", + "AML.T0074", + "AML.T0078", + "AML.T0079", + "AML.T0080.001", + "AML.T0081", + "AML.T0095.000", + "AML.T0108", + "AML.T0112.000" + ] + }, + "AML.CS0052": { + "name": "LLMSmith: RCE Vulnerabilities in LLM-Integrated Applications", + "type": "Exercise", + "date": "2025-02-27", + "techniques": [ + "AML.T0004", + "AML.T0017", + "AML.T0049", + "AML.T0050", + "AML.T0051.000", + "AML.T0053", + "AML.T0054", + "AML.T0065", + "AML.T0072", + "AML.T0084.003", + "AML.T0105", + "AML.T0112.000" + ] + }, + "AML.CS0053": { + "name": "Poisoned Postmark MCP Server Email Exfiltration", + "type": "Incident", + "date": "2025-09-01", + "techniques": [ + "AML.T0010.005", + "AML.T0011.002", + "AML.T0017", + "AML.T0048", + "AML.T0073", + "AML.T0086", + "AML.T0109", + "AML.T0110.001", + "AML.T0115.002" + ] + }, + "AML.CS0054": { + "name": "Data Exfiltration via Remote Poisoned MCP Tool", + "type": "Exercise", + "date": "2025-04-01", + "techniques": [ + "AML.T0010.005", + "AML.T0011.002", + "AML.T0048.003", + "AML.T0051.001", + "AML.T0053", + "AML.T0055", + "AML.T0065", + "AML.T0086", + "AML.T0098", + "AML.T0110.000", + "AML.T0115.002" + ] + }, + "AML.CS0055": { + "name": "AI ClickFix: Hijacking Computer-Use Agents Using ClickFix", + "type": "Exercise", + "date": "2025-05-24", + "techniques": [ + "AML.T0016.002", + "AML.T0017", + "AML.T0051.001", + "AML.T0053", + "AML.T0078", + "AML.T0079", + "AML.T0100", + "AML.T0112.000" + ] + }, + "AML.CS0056": { + "name": "Model Distillation Campaigns Targeting Anthropic Claude", + "type": "Incident", + "date": "2026-02-23", + "techniques": [ + "AML.T0008.005", + "AML.T0024.002", + "AML.T0040", + "AML.T0048.002", + "AML.T0048.003", + "AML.T0048.004", + "AML.T0065" + ] + }, + "AML.CS0057": { + "name": "Storm-2139 Azure OpenAI Guardrail Bypass", + "type": "Incident", + "date": "2024-12-01", + "techniques": [ + "AML.T0008", + "AML.T0012", + "AML.T0017", + "AML.T0040", + "AML.T0048.000", + "AML.T0048.002", + "AML.T0054", + "AML.T0079", + "AML.T0088" + ] + }, + "AML.CS0058": { + "name": "Google Photos AI Model Extraction", + "type": "Exercise", + "date": "2025-03-01", + "techniques": [ + "AML.T0007", + "AML.T0015", + "AML.T0025", + "AML.T0035", + "AML.T0043.000", + "AML.T0044", + "AML.T0048.004" + ] + }, + "AML.CS0059": { + "name": "EchoLeak: Zero-Click Prompt Injection Targeting M365 Copilot for Data Exfiltration", + "type": "Exercise", + "date": "2025-05-25", + "techniques": [ + "AML.T0025", + "AML.T0048", + "AML.T0051.002", + "AML.T0065", + "AML.T0066", + "AML.T0067", + "AML.T0068", + "AML.T0070", + "AML.T0077", + "AML.T0079", + "AML.T0085.000", + "AML.T0093" + ] + }, + "AML.CS0060": { + "name": "Cross-Site Scripting via Prompt Manipulation in Lenovo AI Chatbot", + "type": "Exercise", + "date": "2025-08-18", + "techniques": [ + "AML.T0008", + "AML.T0011", + "AML.T0047", + "AML.T0048", + "AML.T0050", + "AML.T0051.000", + "AML.T0065", + "AML.T0077", + "AML.T0091.001", + "AML.T0093", + "AML.T0113" + ] + }, + "AML.CS0061": { + "name": "AI in the Middle: Web-Based AI Services as C2 Relays", + "type": "Exercise", + "date": "2026-02-17", + "techniques": [ + "AML.T0008.002", + "AML.T0037", + "AML.T0047", + "AML.T0050", + "AML.T0065", + "AML.T0068", + "AML.T0079", + "AML.T0086", + "AML.T0095", + "AML.T0114" + ] + }, + "AML.CS0062": { + "name": "RCE Vulnerability in Semantic Kernel Search Plugin", + "type": "Exercise", + "date": "2026-05-07", + "techniques": [ + "AML.T0047", + "AML.T0050", + "AML.T0051.000", + "AML.T0053", + "AML.T0065", + "AML.T0112" + ] + }, + "AML.CS0063": { + "name": "Prompt-Based Attacks Against Gemini via Calendar Invitations", + "type": "Exercise", + "date": "2025-08-06", + "techniques": [ + "AML.T0006", + "AML.T0025", + "AML.T0048.003", + "AML.T0051.001", + "AML.T0051.002", + "AML.T0053", + "AML.T0054", + "AML.T0065", + "AML.T0080.001", + "AML.T0084", + "AML.T0085.001", + "AML.T0086", + "AML.T0093", + "AML.T0094", + "AML.T0101" + ] + }, + "AML.CS0064": { + "name": "Poisoned GGUF Templates: Inference-Time Supply Chain Attack", + "type": "Exercise", + "date": "2025-06-01", + "techniques": [ + "AML.T0002.001", + "AML.T0010.003", + "AML.T0011.000", + "AML.T0017.000", + "AML.T0018.003", + "AML.T0031", + "AML.T0048.003", + "AML.T0051.002", + "AML.T0053", + "AML.T0067", + "AML.T0074", + "AML.T0086", + "AML.T0115.001" + ] + }, + "AML.CS0065": { + "name": "Model Namespace Reuse Supply Chain Attack", + "type": "Exercise", + "date": "2025-09-03", + "techniques": [ + "AML.T0010.003", + "AML.T0011.000", + "AML.T0018.002", + "AML.T0021", + "AML.T0072", + "AML.T0074", + "AML.T0095", + "AML.T0115.001" + ] + }, + "AML.CS0066": { + "name": "ZombieAgent: Data Exfiltration Attack on ChatGPT", + "type": "Exercise", + "date": "2025-09-25", + "techniques": [ + "AML.T0051.001", + "AML.T0053", + "AML.T0054", + "AML.T0065", + "AML.T0068", + "AML.T0079", + "AML.T0080.000", + "AML.T0085.001", + "AML.T0086", + "AML.T0093" + ] + }, + "AML.CS0067": { + "name": "Claude Code GitHub Action Secret Exposure", + "type": "Exercise", + "date": "2026-06-05", + "techniques": [ + "AML.T0051.001", + "AML.T0053", + "AML.T0054", + "AML.T0057", + "AML.T0065", + "AML.T0084.001", + "AML.T0084.002", + "AML.T0086", + "AML.T0093", + "AML.T0095.000", + "AML.T0098" + ] + }, + "AML.CS0068": { + "name": "Autonomous OpenAI Evaluation Agents Compromise Hugging Face Infrastructure", + "type": "Incident", + "date": "2026-07-08", + "techniques": [ + "AML.T0012", + "AML.T0017.001", + "AML.T0025", + "AML.T0036", + "AML.T0037", + "AML.T0049", + "AML.T0050", + "AML.T0055", + "AML.T0072", + "AML.T0075", + "AML.T0089", + "AML.T0091.000", + "AML.T0102", + "AML.T0105", + "AML.T0116", + "AML.T0117", + "AML.T0118.000", + "AML.T0119", + "AML.T0120", + "AML.T0121", + "AML.T0122", + "AML.T0123" + ] + }, + "AML.CS0069": { + "name": "GTG-1002 Claude Code Espionage Campaign", + "type": "Incident", + "date": "2025-09-01", + "techniques": [ + "AML.T0006", + "AML.T0012", + "AML.T0016.001", + "AML.T0017.001", + "AML.T0025", + "AML.T0036", + "AML.T0037", + "AML.T0040", + "AML.T0049", + "AML.T0051.000", + "AML.T0054", + "AML.T0055", + "AML.T0075", + "AML.T0089", + "AML.T0103", + "AML.T0116", + "AML.T0117", + "AML.T0125", + "AML.T0126", + "AML.T0127", + "AML.T0128" + ] + }, + "AML.CS0070": { + "name": "Threat Actor Uses a DeepSeek-Powered Hermes Agent in Langflow and n8n Exploitation Attempts", + "type": "Incident", + "date": "2026-05-07", + "techniques": [ + "AML.T0000", + "AML.T0000.003", + "AML.T0006", + "AML.T0016.001", + "AML.T0016.002", + "AML.T0016.003", + "AML.T0016.004", + "AML.T0017.002", + "AML.T0040", + "AML.T0049", + "AML.T0095.000", + "AML.T0102", + "AML.T0116", + "AML.T0117" + ] + }, + "AML.CS0071": { + "name": "Multi-Agent Framework Compromises Taiwanese Government Systems", + "type": "Incident", + "date": "2026-07-01", + "techniques": [ + "AML.T0006", + "AML.T0012", + "AML.T0025", + "AML.T0036", + "AML.T0049", + "AML.T0116", + "AML.T0117", + "AML.T0118.001", + "AML.T0124", + "AML.T0126" + ] + }, + "AML.CS0072": { + "name": "AI Recommendation Poisoning via Crafted AI Assistant Links", + "type": "Incident", + "date": "2026-02-10", + "techniques": [ + "AML.T0016", + "AML.T0068", + "AML.T0079", + "AML.T0080.000", + "AML.T0130", + "AML.T0131" + ] + } } }, "attack": { @@ -1226,6 +3734,6945 @@ "T1574.002", "T1656", "T1672" - ] + ], + "tactics": { + "TA0001": "Initial Access", + "TA0002": "Execution", + "TA0003": "Persistence", + "TA0004": "Privilege Escalation", + "TA0005": "Stealth", + "TA0006": "Credential Access", + "TA0007": "Discovery", + "TA0008": "Lateral Movement", + "TA0009": "Collection", + "TA0010": "Exfiltration", + "TA0011": "Command and Control", + "TA0040": "Impact", + "TA0042": "Resource Development", + "TA0043": "Reconnaissance", + "TA0112": "Defense Impairment" + }, + "technique_tactics": { + "T1001": [ + "TA0011" + ], + "T1001.001": [ + "TA0011" + ], + "T1001.002": [ + "TA0011" + ], + "T1001.003": [ + "TA0011" + ], + "T1002": [ + "TA0010" + ], + "T1003": [ + "TA0006" + ], + "T1003.001": [ + "TA0006" + ], + "T1003.002": [ + "TA0006" + ], + "T1003.003": [ + "TA0006" + ], + "T1003.004": [ + "TA0006" + ], + "T1003.005": [ + "TA0006" + ], + "T1003.006": [ + "TA0006" + ], + "T1003.007": [ + "TA0006" + ], + "T1003.008": [ + "TA0006" + ], + "T1004": [ + "TA0003" + ], + "T1005": [ + "TA0009" + ], + "T1006": [ + "TA0005" + ], + "T1007": [ + "TA0007" + ], + "T1008": [ + "TA0011" + ], + "T1009": [ + "TA0005" + ], + "T1010": [ + "TA0007" + ], + "T1011": [ + "TA0010" + ], + "T1011.001": [ + "TA0010" + ], + "T1012": [ + "TA0007" + ], + "T1013": [ + "TA0003", + "TA0004" + ], + "T1014": [ + "TA0005" + ], + "T1015": [ + "TA0003", + "TA0004" + ], + "T1016": [ + "TA0007" + ], + "T1016.001": [ + "TA0007" + ], + "T1016.002": [ + "TA0007" + ], + "T1017": [ + "TA0008" + ], + "T1018": [ + "TA0007" + ], + "T1019": [ + "TA0003" + ], + "T1020": [ + "TA0010" + ], + "T1020.001": [ + "TA0010" + ], + "T1021": [ + "TA0008" + ], + "T1021.001": [ + "TA0008" + ], + "T1021.002": [ + "TA0008" + ], + "T1021.003": [ + "TA0008" + ], + "T1021.004": [ + "TA0008" + ], + "T1021.005": [ + "TA0008" + ], + "T1021.006": [ + "TA0008" + ], + "T1021.007": [ + "TA0008" + ], + "T1021.008": [ + "TA0008" + ], + "T1022": [ + "TA0010" + ], + "T1023": [ + "TA0003" + ], + "T1024": [ + "TA0011" + ], + "T1025": [ + "TA0009" + ], + "T1026": [ + "TA0011" + ], + "T1027": [ + "TA0005" + ], + "T1027.001": [ + "TA0005" + ], + "T1027.002": [ + "TA0005" + ], + "T1027.003": [ + "TA0005" + ], + "T1027.004": [ + "TA0005" + ], + "T1027.005": [ + "TA0005" + ], + "T1027.006": [ + "TA0005" + ], + "T1027.007": [ + "TA0005" + ], + "T1027.008": [ + "TA0005" + ], + "T1027.009": [ + "TA0005" + ], + "T1027.010": [ + "TA0005" + ], + "T1027.011": [ + "TA0005" + ], + "T1027.012": [ + "TA0005" + ], + "T1027.013": [ + "TA0005" + ], + "T1027.014": [ + "TA0005" + ], + "T1027.015": [ + "TA0005" + ], + "T1027.016": [ + "TA0005" + ], + "T1027.017": [ + "TA0005" + ], + "T1027.018": [ + "TA0005" + ], + "T1028": [ + "TA0002", + "TA0008" + ], + "T1029": [ + "TA0010" + ], + "T1030": [ + "TA0010" + ], + "T1031": [ + "TA0003" + ], + "T1032": [ + "TA0011" + ], + "T1033": [ + "TA0007" + ], + "T1034": [ + "TA0003", + "TA0004" + ], + "T1035": [ + "TA0002" + ], + "T1036": [ + "TA0005" + ], + "T1036.001": [ + "TA0005" + ], + "T1036.002": [ + "TA0005" + ], + "T1036.003": [ + "TA0005" + ], + "T1036.004": [ + "TA0005" + ], + "T1036.005": [ + "TA0005" + ], + "T1036.006": [ + "TA0005" + ], + "T1036.007": [ + "TA0005" + ], + "T1036.008": [ + "TA0005" + ], + "T1036.009": [ + "TA0005" + ], + "T1036.010": [ + "TA0005" + ], + "T1036.011": [ + "TA0005" + ], + "T1036.012": [ + "TA0005" + ], + "T1037": [ + "TA0003", + "TA0004" + ], + "T1037.001": [ + "TA0003", + "TA0004" + ], + "T1037.002": [ + "TA0003", + "TA0004" + ], + "T1037.003": [ + "TA0003", + "TA0004" + ], + "T1037.004": [ + "TA0003", + "TA0004" + ], + "T1037.005": [ + "TA0003", + "TA0004" + ], + "T1038": [ + "TA0003", + "TA0004", + "TA0005" + ], + "T1039": [ + "TA0009" + ], + "T1040": [ + "TA0006", + "TA0007" + ], + "T1041": [ + "TA0010" + ], + "T1042": [ + "TA0003" + ], + "T1043": [ + "TA0011" + ], + "T1044": [ + "TA0003", + "TA0004" + ], + "T1045": [ + "TA0005" + ], + "T1046": [ + "TA0007" + ], + "T1047": [ + "TA0002" + ], + "T1048": [ + "TA0010" + ], + "T1048.001": [ + "TA0010" + ], + "T1048.002": [ + "TA0010" + ], + "T1048.003": [ + "TA0010" + ], + "T1049": [ + "TA0007" + ], + "T1050": [ + "TA0003", + "TA0004" + ], + "T1051": [ + "TA0008" + ], + "T1052": [ + "TA0010" + ], + "T1052.001": [ + "TA0010" + ], + "T1053": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.001": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.002": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.003": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.004": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.005": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.006": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1053.007": [ + "TA0002", + "TA0003", + "TA0004" + ], + "T1054": [ + "TA0005" + ], + "T1055": [ + "TA0004", + "TA0005" + ], + "T1055.001": [ + "TA0004", + "TA0005" + ], + "T1055.002": [ + "TA0004", + "TA0005" + ], + "T1055.003": [ + "TA0004", + "TA0005" + ], + "T1055.004": [ + "TA0004", + "TA0005" + ], + "T1055.005": [ + "TA0004", + "TA0005" + ], + "T1055.008": [ + "TA0004", + "TA0005" + ], + "T1055.009": [ + "TA0004", + "TA0005" + ], + "T1055.011": [ + "TA0004", + "TA0005" + ], + "T1055.012": [ + "TA0004", + "TA0005" + ], + "T1055.013": [ + "TA0004", + "TA0005" + ], + "T1055.014": [ + "TA0004", + "TA0005" + ], + "T1055.015": [ + "TA0004", + "TA0005" + ], + "T1056": [ + "TA0006", + "TA0009" + ], + "T1056.001": [ + "TA0006", + "TA0009" + ], + "T1056.002": [ + "TA0006", + "TA0009" + ], + "T1056.003": [ + "TA0006", + "TA0009" + ], + "T1056.004": [ + "TA0006", + "TA0009" + ], + "T1057": [ + "TA0007" + ], + "T1058": [ + "TA0003", + "TA0004" + ], + "T1059": [ + "TA0002" + ], + "T1059.001": [ + "TA0002" + ], + "T1059.002": [ + "TA0002" + ], + "T1059.003": [ + "TA0002" + ], + "T1059.004": [ + "TA0002" + ], + "T1059.005": [ + "TA0002" + ], + "T1059.006": [ + "TA0002" + ], + "T1059.007": [ + "TA0002" + ], + "T1059.008": [ + "TA0002" + ], + "T1059.009": [ + "TA0002" + ], + "T1059.010": [ + "TA0002" + ], + "T1059.011": [ + "TA0002" + ], + "T1059.012": [ + "TA0002" + ], + "T1059.013": [ + "TA0002" + ], + "T1060": [ + "TA0003" + ], + "T1061": [ + "TA0002" + ], + "T1062": [ + "TA0003" + ], + "T1063": [ + "TA0007" + ], + "T1064": [ + "TA0002", + "TA0005" + ], + "T1065": [ + "TA0011" + ], + "T1066": [ + "TA0005" + ], + "T1067": [ + "TA0003" + ], + "T1068": [ + "TA0004" + ], + "T1069": [ + "TA0007" + ], + "T1069.001": [ + "TA0007" + ], + "T1069.002": [ + "TA0007" + ], + "T1069.003": [ + "TA0007" + ], + "T1070": [ + "TA0005" + ], + "T1070.001": [ + "TA0005" + ], + "T1070.002": [ + "TA0005" + ], + "T1070.003": [ + "TA0005" + ], + "T1070.004": [ + "TA0005" + ], + "T1070.005": [ + "TA0005" + ], + "T1070.006": [ + "TA0005" + ], + "T1070.007": [ + "TA0005" + ], + "T1070.008": [ + "TA0005" + ], + "T1070.009": [ + "TA0005" + ], + "T1070.010": [ + "TA0005" + ], + "T1071": [ + "TA0011" + ], + "T1071.001": [ + "TA0011" + ], + "T1071.002": [ + "TA0011" + ], + "T1071.003": [ + "TA0011" + ], + "T1071.004": [ + "TA0011" + ], + "T1071.005": [ + "TA0011" + ], + "T1072": [ + "TA0002", + "TA0008" + ], + "T1073": [ + "TA0005" + ], + "T1074": [ + "TA0009" + ], + "T1074.001": [ + "TA0009" + ], + "T1074.002": [ + "TA0009" + ], + "T1075": [ + "TA0008" + ], + "T1076": [ + "TA0008" + ], + "T1077": [ + "TA0008" + ], + "T1078": [ + "TA0001", + "TA0003", + "TA0004", + "TA0005" + ], + "T1078.001": [ + "TA0001", + "TA0003", + "TA0004", + "TA0005" + ], + "T1078.002": [ + "TA0001", + "TA0003", + "TA0004", + "TA0005" + ], + "T1078.003": [ + "TA0001", + "TA0003", + "TA0004", + "TA0005" + ], + "T1078.004": [ + "TA0001", + "TA0003", + "TA0004", + "TA0005" + ], + "T1079": [ + "TA0011" + ], + "T1080": [ + "TA0008" + ], + "T1081": [ + "TA0006" + ], + "T1082": [ + "TA0007" + ], + "T1083": [ + "TA0007" + ], + "T1084": [ + "TA0003" + ], + "T1085": [ + "TA0002", + "TA0005" + ], + "T1086": [ + "TA0002" + ], + "T1087": [ + "TA0007" + ], + "T1087.001": [ + "TA0007" + ], + "T1087.002": [ + "TA0007" + ], + "T1087.003": [ + "TA0007" + ], + "T1087.004": [ + "TA0007" + ], + "T1088": [ + "TA0004", + "TA0005" + ], + "T1089": [ + "TA0005" + ], + "T1090": [ + "TA0011" + ], + "T1090.001": [ + "TA0011" + ], + "T1090.002": [ + "TA0011" + ], + "T1090.003": [ + "TA0011" + ], + "T1090.004": [ + "TA0011" + ], + "T1091": [ + "TA0001", + "TA0008" + ], + "T1092": [ + "TA0011" + ], + "T1093": [ + "TA0005" + ], + "T1094": [ + "TA0011" + ], + "T1095": [ + "TA0011" + ], + "T1096": [ + "TA0005" + ], + "T1097": [ + "TA0008" + ], + "T1098": [ + "TA0003", + "TA0004" + ], + "T1098.001": [ + "TA0003", + "TA0004" + ], + "T1098.002": [ + "TA0003", + "TA0004" + ], + "T1098.003": [ + "TA0003", + "TA0004" + ], + "T1098.004": [ + "TA0003", + "TA0004" + ], + "T1098.005": [ + "TA0003", + "TA0004" + ], + "T1098.006": [ + "TA0003", + "TA0004" + ], + "T1098.007": [ + "TA0003", + "TA0004" + ], + "T1099": [ + "TA0005" + ], + "T1100": [ + "TA0003", + "TA0004" + ], + "T1101": [ + "TA0003" + ], + "T1102": [ + "TA0011" + ], + "T1102.001": [ + "TA0011" + ], + "T1102.002": [ + "TA0011" + ], + "T1102.003": [ + "TA0011" + ], + "T1103": [ + "TA0003", + "TA0004" + ], + "T1104": [ + "TA0011" + ], + "T1105": [ + "TA0011" + ], + "T1106": [ + "TA0002" + ], + "T1107": [ + "TA0005" + ], + "T1108": [ + "TA0003", + "TA0005" + ], + "T1109": [ + "TA0003", + "TA0005" + ], + "T1110": [ + "TA0006" + ], + "T1110.001": [ + "TA0006" + ], + "T1110.002": [ + "TA0006" + ], + "T1110.003": [ + "TA0006" + ], + "T1110.004": [ + "TA0006" + ], + "T1111": [ + "TA0006" + ], + "T1112": [ + "TA0003", + "TA0112" + ], + "T1113": [ + "TA0009" + ], + "T1114": [ + "TA0009" + ], + "T1114.001": [ + "TA0009" + ], + "T1114.002": [ + "TA0009" + ], + "T1114.003": [ + "TA0009" + ], + "T1115": [ + "TA0009" + ], + "T1116": [ + "TA0005" + ], + "T1117": [ + "TA0002", + "TA0005" + ], + "T1118": [ + "TA0002", + "TA0005" + ], + "T1119": [ + "TA0009" + ], + "T1120": [ + "TA0007" + ], + "T1121": [ + "TA0002", + "TA0005" + ], + "T1122": [ + "TA0003", + "TA0005" + ], + "T1123": [ + "TA0009" + ], + "T1124": [ + "TA0007" + ], + "T1125": [ + "TA0009" + ], + "T1126": [ + "TA0005" + ], + "T1127": [ + "TA0002", + "TA0005" + ], + "T1127.001": [ + "TA0002", + "TA0005" + ], + "T1127.002": [ + "TA0002", + "TA0005" + ], + "T1127.003": [ + "TA0002", + "TA0005" + ], + "T1128": [ + "TA0003" + ], + "T1129": [ + "TA0002" + ], + "T1130": [ + "TA0005" + ], + "T1131": [ + "TA0003" + ], + "T1132": [ + "TA0011" + ], + "T1132.001": [ + "TA0011" + ], + "T1132.002": [ + "TA0011" + ], + "T1133": [ + "TA0001", + "TA0003" + ], + "T1134": [ + "TA0004", + "TA0005" + ], + "T1134.001": [ + "TA0004", + "TA0005" + ], + "T1134.002": [ + "TA0004", + "TA0005" + ], + "T1134.003": [ + "TA0004", + "TA0005" + ], + "T1134.004": [ + "TA0004", + "TA0005" + ], + "T1134.005": [ + "TA0004", + "TA0005" + ], + "T1135": [ + "TA0007" + ], + "T1136": [ + "TA0003" + ], + "T1136.001": [ + "TA0003" + ], + "T1136.002": [ + "TA0003" + ], + "T1136.003": [ + "TA0003" + ], + "T1137": [ + "TA0003" + ], + "T1137.001": [ + "TA0003" + ], + "T1137.002": [ + "TA0003" + ], + "T1137.003": [ + "TA0003" + ], + "T1137.004": [ + "TA0003" + ], + "T1137.005": [ + "TA0003" + ], + "T1137.006": [ + "TA0003" + ], + "T1138": [ + "TA0003", + "TA0004" + ], + "T1139": [ + "TA0006" + ], + "T1140": [ + "TA0005" + ], + "T1141": [ + "TA0006" + ], + "T1142": [ + "TA0006" + ], + "T1143": [ + "TA0005" + ], + "T1144": [ + "TA0005" + ], + "T1145": [ + "TA0006" + ], + "T1146": [ + "TA0005" + ], + "T1147": [ + "TA0005" + ], + "T1148": [ + "TA0005" + ], + "T1149": [ + "TA0005" + ], + "T1150": [ + "TA0003", + "TA0004", + "TA0005" + ], + "T1151": [ + "TA0002", + "TA0005" + ], + "T1152": [ + "TA0002", + "TA0003", + "TA0005" + ], + "T1153": [ + "TA0002" + ], + "T1154": [ + "TA0002", + "TA0003" + ], + "T1155": [ + "TA0002" + ], + "T1156": [ + "TA0003" + ], + "T1157": [ + "TA0003", + "TA0004" + ], + "T1158": [ + "TA0003", + "TA0005" + ], + "T1159": [ + "TA0003" + ], + "T1160": [ + "TA0003", + "TA0004" + ], + "T1161": [ + "TA0003" + ], + "T1162": [ + "TA0003" + ], + "T1163": [ + "TA0003" + ], + "T1164": [ + "TA0003" + ], + "T1165": [ + "TA0003", + "TA0004" + ], + "T1166": [ + "TA0003", + "TA0004" + ], + "T1167": [ + "TA0006" + ], + "T1168": [ + "TA0002", + "TA0003" + ], + "T1169": [ + "TA0004" + ], + "T1170": [ + "TA0002", + "TA0005" + ], + "T1171": [ + "TA0006" + ], + "T1172": [ + "TA0011" + ], + "T1173": [ + "TA0002" + ], + "T1174": [ + "TA0006" + ], + "T1175": [ + "TA0002", + "TA0008" + ], + "T1176": [ + "TA0003" + ], + "T1176.001": [ + "TA0003" + ], + "T1176.002": [ + "TA0003" + ], + "T1177": [ + "TA0002", + "TA0003" + ], + "T1178": [ + "TA0004" + ], + "T1179": [ + "TA0003", + "TA0004", + "TA0006" + ], + "T1180": [ + "TA0003" + ], + "T1181": [ + "TA0004", + "TA0005" + ], + "T1182": [ + "TA0003", + "TA0004" + ], + "T1183": [ + "TA0003", + "TA0004", + "TA0005" + ], + "T1184": [ + "TA0008" + ], + "T1185": [ + "TA0009" + ], + "T1186": [ + "TA0005" + ], + "T1187": [ + "TA0006" + ], + "T1188": [ + "TA0011" + ], + "T1189": [ + "TA0001" + ], + "T1190": [ + "TA0001" + ], + "T1191": [ + "TA0002", + "TA0005" + ], + "T1192": [ + "TA0001" + ], + "T1193": [ + "TA0001" + ], + "T1194": [ + "TA0001" + ], + "T1195": [ + "TA0001" + ], + "T1195.001": [ + "TA0001" + ], + "T1195.002": [ + "TA0001" + ], + "T1195.003": [ + "TA0001" + ], + "T1196": [ + "TA0002", + "TA0005" + ], + "T1197": [ + "TA0002", + "TA0003", + "TA0005" + ], + "T1198": [ + "TA0003", + "TA0005" + ], + "T1199": [ + "TA0001" + ], + "T1200": [ + "TA0001" + ], + "T1201": [ + "TA0007" + ], + "T1202": [ + "TA0005" + ], + "T1203": [ + "TA0002" + ], + "T1204": [ + "TA0002" + ], + "T1204.001": [ + "TA0002" + ], + "T1204.002": [ + "TA0002" + ], + "T1204.003": [ + "TA0002" + ], + "T1204.004": [ + "TA0002" + ], + "T1204.005": [ + "TA0002" + ], + "T1205": [ + "TA0003", + "TA0005", + "TA0011" + ], + "T1205.001": [ + "TA0003", + "TA0005", + "TA0011" + ], + "T1205.002": [ + "TA0003", + "TA0005", + "TA0011" + ], + "T1206": [ + "TA0004" + ], + "T1207": [ + "TA0112" + ], + "T1208": [ + "TA0006" + ], + "T1209": [ + "TA0003" + ], + "T1210": [ + "TA0008" + ], + "T1211": [ + "TA0005" + ], + "T1212": [ + "TA0006" + ], + "T1213": [ + "TA0009" + ], + "T1213.001": [ + "TA0009" + ], + "T1213.002": [ + "TA0009" + ], + "T1213.003": [ + "TA0009" + ], + "T1213.004": [ + "TA0009" + ], + "T1213.005": [ + "TA0009" + ], + "T1213.006": [ + "TA0009" + ], + "T1214": [ + "TA0006" + ], + "T1215": [ + "TA0003" + ], + "T1216": [ + "TA0005" + ], + "T1216.001": [ + "TA0005" + ], + "T1216.002": [ + "TA0005" + ], + "T1217": [ + "TA0007" + ], + "T1218": [ + "TA0005" + ], + "T1218.001": [ + "TA0005" + ], + "T1218.002": [ + "TA0005" + ], + "T1218.003": [ + "TA0005" + ], + "T1218.004": [ + "TA0005" + ], + "T1218.005": [ + "TA0005" + ], + "T1218.007": [ + "TA0005" + ], + "T1218.008": [ + "TA0005" + ], + "T1218.009": [ + "TA0005" + ], + "T1218.010": [ + "TA0005" + ], + "T1218.011": [ + "TA0005" + ], + "T1218.012": [ + "TA0005" + ], + "T1218.013": [ + "TA0005" + ], + "T1218.014": [ + "TA0005" + ], + "T1218.015": [ + "TA0005" + ], + "T1219": [ + "TA0011" + ], + "T1219.001": [ + "TA0011" + ], + "T1219.002": [ + "TA0011" + ], + "T1219.003": [ + "TA0011" + ], + "T1220": [ + "TA0005" + ], + "T1221": [ + "TA0005" + ], + "T1222": [ + "TA0112" + ], + "T1222.001": [ + "TA0112" + ], + "T1222.002": [ + "TA0112" + ], + "T1223": [ + "TA0002", + "TA0005" + ], + "T1480": [ + "TA0005" + ], + "T1480.001": [ + "TA0005" + ], + "T1480.002": [ + "TA0005" + ], + "T1482": [ + "TA0007" + ], + "T1483": [ + "TA0011" + ], + "T1484": [ + "TA0004", + "TA0112" + ], + "T1484.001": [ + "TA0004", + "TA0112" + ], + "T1484.002": [ + "TA0004", + "TA0112" + ], + "T1485": [ + "TA0040" + ], + "T1485.001": [ + "TA0040" + ], + "T1486": [ + "TA0040" + ], + "T1487": [ + "TA0040" + ], + "T1488": [ + "TA0040" + ], + "T1489": [ + "TA0040" + ], + "T1490": [ + "TA0040" + ], + "T1491": [ + "TA0040" + ], + "T1491.001": [ + "TA0040" + ], + "T1491.002": [ + "TA0040" + ], + "T1492": [ + "TA0040" + ], + "T1493": [ + "TA0040" + ], + "T1494": [ + "TA0040" + ], + "T1495": [ + "TA0040" + ], + "T1496": [ + "TA0040" + ], + "T1496.001": [ + "TA0040" + ], + "T1496.002": [ + "TA0040" + ], + "T1496.003": [ + "TA0040" + ], + "T1496.004": [ + "TA0040" + ], + "T1497": [ + "TA0005", + "TA0007" + ], + "T1497.001": [ + "TA0005", + "TA0007" + ], + "T1497.002": [ + "TA0005", + "TA0007" + ], + "T1497.003": [ + "TA0005", + "TA0007" + ], + "T1498": [ + "TA0040" + ], + "T1498.001": [ + "TA0040" + ], + "T1498.002": [ + "TA0040" + ], + "T1499": [ + "TA0040" + ], + "T1499.001": [ + "TA0040" + ], + "T1499.002": [ + "TA0040" + ], + "T1499.003": [ + "TA0040" + ], + "T1499.004": [ + "TA0040" + ], + "T1500": [ + "TA0005" + ], + "T1501": [ + "TA0003" + ], + "T1502": [ + "TA0004", + "TA0005" + ], + "T1503": [ + "TA0006" + ], + "T1504": [ + "TA0003", + "TA0004" + ], + "T1505": [ + "TA0003" + ], + "T1505.001": [ + "TA0003" + ], + "T1505.002": [ + "TA0003" + ], + "T1505.003": [ + "TA0003" + ], + "T1505.004": [ + "TA0003" + ], + "T1505.005": [ + "TA0003" + ], + "T1505.006": [ + "TA0003" + ], + "T1506": [ + "TA0005", + "TA0008" + ], + "T1514": [ + "TA0004" + ], + "T1518": [ + "TA0007" + ], + "T1518.001": [ + "TA0007" + ], + "T1518.002": [ + "TA0007" + ], + "T1519": [ + "TA0003", + "TA0004" + ], + "T1522": [ + "TA0006" + ], + "T1525": [ + "TA0003" + ], + "T1526": [ + "TA0007" + ], + "T1527": [ + "TA0005", + "TA0008" + ], + "T1528": [ + "TA0006" + ], + "T1529": [ + "TA0040" + ], + "T1530": [ + "TA0009" + ], + "T1531": [ + "TA0040" + ], + "T1534": [ + "TA0008" + ], + "T1535": [ + "TA0005" + ], + "T1536": [ + "TA0005" + ], + "T1537": [ + "TA0010" + ], + "T1538": [ + "TA0007" + ], + "T1539": [ + "TA0006" + ], + "T1542": [ + "TA0003", + "TA0005" + ], + "T1542.001": [ + "TA0003", + "TA0005" + ], + "T1542.002": [ + "TA0003", + "TA0005" + ], + "T1542.003": [ + "TA0003", + "TA0005" + ], + "T1542.004": [ + "TA0003", + "TA0005" + ], + "T1542.005": [ + "TA0003", + "TA0005" + ], + "T1543": [ + "TA0003", + "TA0004" + ], + "T1543.001": [ + "TA0003", + "TA0004" + ], + "T1543.002": [ + "TA0003", + "TA0004" + ], + "T1543.003": [ + "TA0003", + "TA0004" + ], + "T1543.004": [ + "TA0003", + "TA0004" + ], + "T1543.005": [ + "TA0003", + "TA0004" + ], + "T1546": [ + "TA0003", + "TA0004" + ], + "T1546.001": [ + "TA0003", + "TA0004" + ], + "T1546.002": [ + "TA0003", + "TA0004" + ], + "T1546.003": [ + "TA0003", + "TA0004" + ], + "T1546.004": [ + "TA0003", + "TA0004" + ], + "T1546.005": [ + "TA0003", + "TA0004" + ], + "T1546.006": [ + "TA0003", + "TA0004" + ], + "T1546.007": [ + "TA0003", + "TA0004" + ], + "T1546.008": [ + "TA0003", + "TA0004" + ], + "T1546.009": [ + "TA0003", + "TA0004" + ], + "T1546.010": [ + "TA0003", + "TA0004" + ], + "T1546.011": [ + "TA0003", + "TA0004" + ], + "T1546.012": [ + "TA0003", + "TA0004" + ], + "T1546.013": [ + "TA0003", + "TA0004" + ], + "T1546.014": [ + "TA0003", + "TA0004" + ], + "T1546.015": [ + "TA0003", + "TA0004" + ], + "T1546.016": [ + "TA0003", + "TA0004" + ], + "T1546.017": [ + "TA0003", + "TA0004" + ], + "T1546.018": [ + "TA0003", + "TA0004" + ], + "T1547": [ + "TA0003", + "TA0004" + ], + "T1547.001": [ + "TA0003", + "TA0004" + ], + "T1547.002": [ + "TA0003", + "TA0004" + ], + "T1547.003": [ + "TA0003", + "TA0004" + ], + "T1547.004": [ + "TA0003", + "TA0004" + ], + "T1547.005": [ + "TA0003", + "TA0004" + ], + "T1547.006": [ + "TA0003", + "TA0004" + ], + "T1547.007": [ + "TA0003", + "TA0004" + ], + "T1547.008": [ + "TA0003", + "TA0004" + ], + "T1547.009": [ + "TA0003", + "TA0004" + ], + "T1547.010": [ + "TA0003", + "TA0004" + ], + "T1547.011": [ + "TA0003", + "TA0004" + ], + "T1547.012": [ + "TA0003", + "TA0004" + ], + "T1547.013": [ + "TA0003", + "TA0004" + ], + "T1547.014": [ + "TA0003", + "TA0004" + ], + "T1547.015": [ + "TA0003", + "TA0004" + ], + "T1548": [ + "TA0004" + ], + "T1548.001": [ + "TA0004" + ], + "T1548.002": [ + "TA0004" + ], + "T1548.003": [ + "TA0004" + ], + "T1548.004": [ + "TA0004" + ], + "T1548.005": [ + "TA0004" + ], + "T1548.006": [ + "TA0004" + ], + "T1550": [ + "TA0008" + ], + "T1550.001": [ + "TA0008" + ], + "T1550.002": [ + "TA0008" + ], + "T1550.003": [ + "TA0008" + ], + "T1550.004": [ + "TA0008" + ], + "T1552": [ + "TA0006" + ], + "T1552.001": [ + "TA0006" + ], + "T1552.002": [ + "TA0006" + ], + "T1552.003": [ + "TA0006" + ], + "T1552.004": [ + "TA0006" + ], + "T1552.005": [ + "TA0006" + ], + "T1552.006": [ + "TA0006" + ], + "T1552.007": [ + "TA0006" + ], + "T1552.008": [ + "TA0006" + ], + "T1553": [ + "TA0112" + ], + "T1553.001": [ + "TA0112" + ], + "T1553.002": [ + "TA0112" + ], + "T1553.003": [ + "TA0112" + ], + "T1553.004": [ + "TA0112" + ], + "T1553.005": [ + "TA0112" + ], + "T1553.006": [ + "TA0112" + ], + "T1554": [ + "TA0003" + ], + "T1555": [ + "TA0006" + ], + "T1555.001": [ + "TA0006" + ], + "T1555.002": [ + "TA0006" + ], + "T1555.003": [ + "TA0006" + ], + "T1555.004": [ + "TA0006" + ], + "T1555.005": [ + "TA0006" + ], + "T1555.006": [ + "TA0006" + ], + "T1556": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.001": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.002": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.003": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.004": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.005": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.006": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.007": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.008": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1556.009": [ + "TA0003", + "TA0006", + "TA0112" + ], + "T1557": [ + "TA0006", + "TA0009" + ], + "T1557.001": [ + "TA0006", + "TA0009" + ], + "T1557.002": [ + "TA0006", + "TA0009" + ], + "T1557.003": [ + "TA0006", + "TA0009" + ], + "T1557.004": [ + "TA0006", + "TA0009" + ], + "T1558": [ + "TA0006" + ], + "T1558.001": [ + "TA0006" + ], + "T1558.002": [ + "TA0006" + ], + "T1558.003": [ + "TA0006" + ], + "T1558.004": [ + "TA0006" + ], + "T1558.005": [ + "TA0006" + ], + "T1559": [ + "TA0002" + ], + "T1559.001": [ + "TA0002" + ], + "T1559.002": [ + "TA0002" + ], + "T1559.003": [ + "TA0002" + ], + "T1560": [ + "TA0009" + ], + "T1560.001": [ + "TA0009" + ], + "T1560.002": [ + "TA0009" + ], + "T1560.003": [ + "TA0009" + ], + "T1561": [ + "TA0040" + ], + "T1561.001": [ + "TA0040" + ], + "T1561.002": [ + "TA0040" + ], + "T1562": [ + "TA0005" + ], + "T1562.001": [ + "TA0005" + ], + "T1562.002": [ + "TA0005" + ], + "T1562.003": [ + "TA0005" + ], + "T1562.004": [ + "TA0005" + ], + "T1562.006": [ + "TA0005" + ], + "T1562.007": [ + "TA0005" + ], + "T1562.008": [ + "TA0005" + ], + "T1562.009": [ + "TA0005" + ], + "T1562.010": [ + "TA0005" + ], + "T1562.011": [ + "TA0005" + ], + "T1562.012": [ + "TA0005" + ], + "T1562.013": [ + "TA0005" + ], + "T1563": [ + "TA0008" + ], + "T1563.001": [ + "TA0008" + ], + "T1563.002": [ + "TA0008" + ], + "T1564": [ + "TA0005" + ], + "T1564.001": [ + "TA0005" + ], + "T1564.002": [ + "TA0005" + ], + "T1564.003": [ + "TA0005" + ], + "T1564.004": [ + "TA0005" + ], + "T1564.005": [ + "TA0005" + ], + "T1564.006": [ + "TA0005" + ], + "T1564.007": [ + "TA0005" + ], + "T1564.008": [ + "TA0005" + ], + "T1564.009": [ + "TA0005" + ], + "T1564.010": [ + "TA0005" + ], + "T1564.011": [ + "TA0005" + ], + "T1564.012": [ + "TA0005" + ], + "T1564.013": [ + "TA0005" + ], + "T1564.014": [ + "TA0005" + ], + "T1565": [ + "TA0040" + ], + "T1565.001": [ + "TA0040" + ], + "T1565.002": [ + "TA0040" + ], + "T1565.003": [ + "TA0040" + ], + "T1566": [ + "TA0001" + ], + "T1566.001": [ + "TA0001" + ], + "T1566.002": [ + "TA0001" + ], + "T1566.003": [ + "TA0001" + ], + "T1566.004": [ + "TA0001" + ], + "T1567": [ + "TA0010" + ], + "T1567.001": [ + "TA0010" + ], + "T1567.002": [ + "TA0010" + ], + "T1567.003": [ + "TA0010" + ], + "T1567.004": [ + "TA0010" + ], + "T1568": [ + "TA0011" + ], + "T1568.001": [ + "TA0011" + ], + "T1568.002": [ + "TA0011" + ], + "T1568.003": [ + "TA0011" + ], + "T1569": [ + "TA0002" + ], + "T1569.001": [ + "TA0002" + ], + "T1569.002": [ + "TA0002" + ], + "T1569.003": [ + "TA0002" + ], + "T1570": [ + "TA0008" + ], + "T1571": [ + "TA0011" + ], + "T1572": [ + "TA0011" + ], + "T1573": [ + "TA0011" + ], + "T1573.001": [ + "TA0011" + ], + "T1573.002": [ + "TA0011" + ], + "T1574": [ + "TA0002", + "TA0005" + ], + "T1574.001": [ + "TA0002", + "TA0005" + ], + "T1574.002": [ + "TA0002", + "TA0005" + ], + "T1574.004": [ + "TA0002", + "TA0005" + ], + "T1574.005": [ + "TA0002", + "TA0005" + ], + "T1574.006": [ + "TA0002", + "TA0005" + ], + "T1574.007": [ + "TA0002", + "TA0005" + ], + "T1574.008": [ + "TA0002", + "TA0005" + ], + "T1574.009": [ + "TA0002", + "TA0005" + ], + "T1574.010": [ + "TA0002", + "TA0005" + ], + "T1574.011": [ + "TA0002", + "TA0005" + ], + "T1574.012": [ + "TA0002", + "TA0005" + ], + "T1574.013": [ + "TA0002", + "TA0005" + ], + "T1574.014": [ + "TA0002", + "TA0005" + ], + "T1578": [ + "TA0112" + ], + "T1578.001": [ + "TA0112" + ], + "T1578.002": [ + "TA0112" + ], + "T1578.003": [ + "TA0112" + ], + "T1578.004": [ + "TA0112" + ], + "T1578.005": [ + "TA0112" + ], + "T1580": [ + "TA0007" + ], + "T1583": [ + "TA0042" + ], + "T1583.001": [ + "TA0042" + ], + "T1583.002": [ + "TA0042" + ], + "T1583.003": [ + "TA0042" + ], + "T1583.004": [ + "TA0042" + ], + "T1583.005": [ + "TA0042" + ], + "T1583.006": [ + "TA0042" + ], + "T1583.007": [ + "TA0042" + ], + "T1583.008": [ + "TA0042" + ], + "T1584": [ + "TA0042" + ], + "T1584.001": [ + "TA0042" + ], + "T1584.002": [ + "TA0042" + ], + "T1584.003": [ + "TA0042" + ], + "T1584.004": [ + "TA0042" + ], + "T1584.005": [ + "TA0042" + ], + "T1584.006": [ + "TA0042" + ], + "T1584.007": [ + "TA0042" + ], + "T1584.008": [ + "TA0042" + ], + "T1585": [ + "TA0042" + ], + "T1585.001": [ + "TA0042" + ], + "T1585.002": [ + "TA0042" + ], + "T1585.003": [ + "TA0042" + ], + "T1586": [ + "TA0042" + ], + "T1586.001": [ + "TA0042" + ], + "T1586.002": [ + "TA0042" + ], + "T1586.003": [ + "TA0042" + ], + "T1587": [ + "TA0042" + ], + "T1587.001": [ + "TA0042" + ], + "T1587.002": [ + "TA0042" + ], + "T1587.003": [ + "TA0042" + ], + "T1587.004": [ + "TA0042" + ], + "T1588": [ + "TA0042" + ], + "T1588.001": [ + "TA0042" + ], + "T1588.002": [ + "TA0042" + ], + "T1588.003": [ + "TA0042" + ], + "T1588.004": [ + "TA0042" + ], + "T1588.005": [ + "TA0042" + ], + "T1588.006": [ + "TA0042" + ], + "T1588.007": [ + "TA0042" + ], + "T1589": [ + "TA0043" + ], + "T1589.001": [ + "TA0043" + ], + "T1589.002": [ + "TA0043" + ], + "T1589.003": [ + "TA0043" + ], + "T1590": [ + "TA0043" + ], + "T1590.001": [ + "TA0043" + ], + "T1590.002": [ + "TA0043" + ], + "T1590.003": [ + "TA0043" + ], + "T1590.004": [ + "TA0043" + ], + "T1590.005": [ + "TA0043" + ], + "T1590.006": [ + "TA0043" + ], + "T1591": [ + "TA0043" + ], + "T1591.001": [ + "TA0043" + ], + "T1591.002": [ + "TA0043" + ], + "T1591.003": [ + "TA0043" + ], + "T1591.004": [ + "TA0043" + ], + "T1592": [ + "TA0043" + ], + "T1592.001": [ + "TA0043" + ], + "T1592.002": [ + "TA0043" + ], + "T1592.003": [ + "TA0043" + ], + "T1592.004": [ + "TA0043" + ], + "T1593": [ + "TA0043" + ], + "T1593.001": [ + "TA0043" + ], + "T1593.002": [ + "TA0043" + ], + "T1593.003": [ + "TA0043" + ], + "T1594": [ + "TA0043" + ], + "T1595": [ + "TA0043" + ], + "T1595.001": [ + "TA0043" + ], + "T1595.002": [ + "TA0043" + ], + "T1595.003": [ + "TA0043" + ], + "T1596": [ + "TA0043" + ], + "T1596.001": [ + "TA0043" + ], + "T1596.002": [ + "TA0043" + ], + "T1596.003": [ + "TA0043" + ], + "T1596.004": [ + "TA0043" + ], + "T1596.005": [ + "TA0043" + ], + "T1597": [ + "TA0043" + ], + "T1597.001": [ + "TA0043" + ], + "T1597.002": [ + "TA0043" + ], + "T1598": [ + "TA0043" + ], + "T1598.001": [ + "TA0043" + ], + "T1598.002": [ + "TA0043" + ], + "T1598.003": [ + "TA0043" + ], + "T1598.004": [ + "TA0043" + ], + "T1599": [ + "TA0112" + ], + "T1599.001": [ + "TA0112" + ], + "T1600": [ + "TA0112" + ], + "T1600.001": [ + "TA0112" + ], + "T1600.002": [ + "TA0112" + ], + "T1601": [ + "TA0112" + ], + "T1601.001": [ + "TA0112" + ], + "T1601.002": [ + "TA0112" + ], + "T1602": [ + "TA0009" + ], + "T1602.001": [ + "TA0009" + ], + "T1602.002": [ + "TA0009" + ], + "T1606": [ + "TA0006" + ], + "T1606.001": [ + "TA0006" + ], + "T1606.002": [ + "TA0006" + ], + "T1608": [ + "TA0042" + ], + "T1608.001": [ + "TA0042" + ], + "T1608.002": [ + "TA0042" + ], + "T1608.003": [ + "TA0042" + ], + "T1608.004": [ + "TA0042" + ], + "T1608.005": [ + "TA0042" + ], + "T1608.006": [ + "TA0042" + ], + "T1609": [ + "TA0002" + ], + "T1610": [ + "TA0002" + ], + "T1611": [ + "TA0004" + ], + "T1612": [ + "TA0005" + ], + "T1613": [ + "TA0007" + ], + "T1614": [ + "TA0007" + ], + "T1614.001": [ + "TA0007" + ], + "T1615": [ + "TA0007" + ], + "T1619": [ + "TA0007" + ], + "T1620": [ + "TA0005" + ], + "T1621": [ + "TA0006" + ], + "T1622": [ + "TA0005", + "TA0007" + ], + "T1647": [ + "TA0112" + ], + "T1648": [ + "TA0002" + ], + "T1649": [ + "TA0006" + ], + "T1650": [ + "TA0042" + ], + "T1651": [ + "TA0002" + ], + "T1652": [ + "TA0007" + ], + "T1653": [ + "TA0003" + ], + "T1654": [ + "TA0007" + ], + "T1656": [ + "TA0005" + ], + "T1657": [ + "TA0040" + ], + "T1659": [ + "TA0001", + "TA0011" + ], + "T1665": [ + "TA0011" + ], + "T1666": [ + "TA0112" + ], + "T1667": [ + "TA0040" + ], + "T1668": [ + "TA0003" + ], + "T1669": [ + "TA0001" + ], + "T1671": [ + "TA0003" + ], + "T1672": [ + "TA0005" + ], + "T1673": [ + "TA0007" + ], + "T1674": [ + "TA0002" + ], + "T1675": [ + "TA0002" + ], + "T1677": [ + "TA0002" + ], + "T1678": [ + "TA0005" + ], + "T1679": [ + "TA0005" + ], + "T1680": [ + "TA0007" + ], + "T1681": [ + "TA0043" + ], + "T1682": [ + "TA0043" + ], + "T1683": [ + "TA0042" + ], + "T1683.001": [ + "TA0042" + ], + "T1683.002": [ + "TA0042" + ], + "T1684": [ + "TA0005" + ], + "T1684.001": [ + "TA0005" + ], + "T1684.002": [ + "TA0005" + ], + "T1685": [ + "TA0112" + ], + "T1685.001": [ + "TA0112" + ], + "T1685.002": [ + "TA0112" + ], + "T1685.003": [ + "TA0112" + ], + "T1685.004": [ + "TA0112" + ], + "T1685.005": [ + "TA0112" + ], + "T1685.006": [ + "TA0112" + ], + "T1686": [ + "TA0112" + ], + "T1686.001": [ + "TA0112" + ], + "T1686.002": [ + "TA0112" + ], + "T1686.003": [ + "TA0112" + ], + "T1687": [ + "TA0112" + ], + "T1688": [ + "TA0112" + ], + "T1689": [ + "TA0112" + ], + "T1690": [ + "TA0112" + ] + }, + "groups": { + "G0001": { + "name": "Axiom" + }, + "G0002": { + "name": "Moafee" + }, + "G0003": { + "name": "Cleaver" + }, + "G0004": { + "name": "Ke3chang" + }, + "G0005": { + "name": "APT12" + }, + "G0006": { + "name": "APT1" + }, + "G0007": { + "name": "APT28" + }, + "G0008": { + "name": "Carbanak" + }, + "G0009": { + "name": "Deep Panda" + }, + "G0010": { + "name": "Turla" + }, + "G0011": { + "name": "PittyTiger" + }, + "G0012": { + "name": "Darkhotel" + }, + "G0013": { + "name": "APT30" + }, + "G0016": { + "name": "APT29" + }, + "G0017": { + "name": "DragonOK" + }, + "G0018": { + "name": "admin@338" + }, + "G0019": { + "name": "Naikon" + }, + "G0020": { + "name": "Equation" + }, + "G0021": { + "name": "Molerats" + }, + "G0022": { + "name": "APT3" + }, + "G0023": { + "name": "APT16" + }, + "G0024": { + "name": "Putter Panda" + }, + "G0025": { + "name": "APT17" + }, + "G0026": { + "name": "APT18" + }, + "G0027": { + "name": "Threat Group-3390" + }, + "G0028": { + "name": "Threat Group-1314" + }, + "G0029": { + "name": "Scarlet Mimic" + }, + "G0030": { + "name": "Lotus Blossom" + }, + "G0032": { + "name": "Lazarus Group" + }, + "G0033": { + "name": "Poseidon Group" + }, + "G0034": { + "name": "Sandworm Team" + }, + "G0035": { + "name": "Dragonfly" + }, + "G0036": { + "name": "GCMAN" + }, + "G0037": { + "name": "FIN6" + }, + "G0038": { + "name": "Stealth Falcon" + }, + "G0039": { + "name": "Suckfly" + }, + "G0040": { + "name": "Patchwork" + }, + "G0041": { + "name": "Strider" + }, + "G0043": { + "name": "Group5" + }, + "G0044": { + "name": "Winnti Group" + }, + "G0045": { + "name": "menuPass" + }, + "G0046": { + "name": "FIN7" + }, + "G0047": { + "name": "Gamaredon Group" + }, + "G0048": { + "name": "RTM" + }, + "G0049": { + "name": "OilRig" + }, + "G0050": { + "name": "APT32" + }, + "G0051": { + "name": "FIN10" + }, + "G0052": { + "name": "CopyKittens" + }, + "G0053": { + "name": "FIN5" + }, + "G0054": { + "name": "Sowbug" + }, + "G0055": { + "name": "NEODYMIUM" + }, + "G0056": { + "name": "PROMETHIUM" + }, + "G0059": { + "name": "Magic Hound" + }, + "G0060": { + "name": "BRONZE BUTLER" + }, + "G0061": { + "name": "FIN8" + }, + "G0062": { + "name": "TA459" + }, + "G0063": { + "name": "BlackOasis" + }, + "G0064": { + "name": "APT33" + }, + "G0065": { + "name": "Leviathan" + }, + "G0066": { + "name": "Elderwood" + }, + "G0067": { + "name": "APT37" + }, + "G0068": { + "name": "PLATINUM" + }, + "G0069": { + "name": "MuddyWater" + }, + "G0070": { + "name": "Dark Caracal" + }, + "G0071": { + "name": "Orangeworm" + }, + "G0073": { + "name": "APT19" + }, + "G0075": { + "name": "Rancor" + }, + "G0076": { + "name": "Thrip" + }, + "G0077": { + "name": "Leafminer" + }, + "G0078": { + "name": "Gorgon Group" + }, + "G0079": { + "name": "DarkHydrus" + }, + "G0080": { + "name": "Cobalt Group" + }, + "G0081": { + "name": "Tropic Trooper" + }, + "G0082": { + "name": "APT38" + }, + "G0083": { + "name": "SilverTerrier" + }, + "G0084": { + "name": "Gallmaker" + }, + "G0085": { + "name": "FIN4" + }, + "G0087": { + "name": "APT39" + }, + "G0088": { + "name": "TEMP.Veles" + }, + "G0089": { + "name": "The White Company" + }, + "G0090": { + "name": "WIRTE" + }, + "G0091": { + "name": "Silence" + }, + "G0092": { + "name": "TA505" + }, + "G0093": { + "name": "GALLIUM" + }, + "G0094": { + "name": "Kimsuky" + }, + "G0095": { + "name": "Machete" + }, + "G0096": { + "name": "APT41" + }, + "G0098": { + "name": "BlackTech" + }, + "G0099": { + "name": "APT-C-36" + }, + "G0100": { + "name": "Inception" + }, + "G0102": { + "name": "Wizard Spider" + }, + "G0103": { + "name": "Mofang" + }, + "G0105": { + "name": "DarkVishnya" + }, + "G0106": { + "name": "Rocke" + }, + "G0107": { + "name": "Whitefly" + }, + "G0108": { + "name": "Blue Mockingbird" + }, + "G0112": { + "name": "Windshift" + }, + "G0114": { + "name": "Chimera" + }, + "G0115": { + "name": "GOLD SOUTHFIELD" + }, + "G0117": { + "name": "Fox Kitten" + }, + "G0119": { + "name": "Indrik Spider" + }, + "G0120": { + "name": "Evilnum" + }, + "G0121": { + "name": "Sidewinder" + }, + "G0122": { + "name": "Silent Librarian" + }, + "G0123": { + "name": "Volatile Cedar" + }, + "G0124": { + "name": "Windigo" + }, + "G0125": { + "name": "HAFNIUM" + }, + "G0126": { + "name": "Higaisa" + }, + "G0127": { + "name": "TA551" + }, + "G0128": { + "name": "ZIRCONIUM" + }, + "G0129": { + "name": "Mustang Panda" + }, + "G0130": { + "name": "Ajax Security Team" + }, + "G0131": { + "name": "Tonto Team" + }, + "G0133": { + "name": "Nomadic Octopus" + }, + "G0134": { + "name": "Transparent Tribe" + }, + "G0135": { + "name": "BackdoorDiplomacy" + }, + "G0136": { + "name": "IndigoZebra" + }, + "G0137": { + "name": "Ferocious Kitten" + }, + "G0138": { + "name": "Andariel" + }, + "G0139": { + "name": "TeamTNT" + }, + "G0140": { + "name": "LazyScripter" + }, + "G0142": { + "name": "Confucius" + }, + "G0143": { + "name": "Aquatic Panda" + }, + "G1001": { + "name": "HEXANE" + }, + "G1002": { + "name": "BITTER" + }, + "G1003": { + "name": "Ember Bear" + }, + "G1004": { + "name": "LAPSUS$" + }, + "G1005": { + "name": "POLONIUM" + }, + "G1006": { + "name": "Earth Lusca" + }, + "G1007": { + "name": "Aoqin Dragon" + }, + "G1008": { + "name": "SideCopy" + }, + "G1009": { + "name": "Moses Staff" + }, + "G1011": { + "name": "EXOTIC LILY" + }, + "G1012": { + "name": "CURIUM" + }, + "G1013": { + "name": "Metador" + }, + "G1014": { + "name": "LuminousMoth" + }, + "G1015": { + "name": "Scattered Spider" + }, + "G1016": { + "name": "FIN13" + }, + "G1017": { + "name": "Volt Typhoon" + }, + "G1018": { + "name": "TA2541" + }, + "G1019": { + "name": "MoustachedBouncer" + }, + "G1020": { + "name": "Mustard Tempest" + }, + "G1021": { + "name": "Cinnamon Tempest" + }, + "G1022": { + "name": "ToddyCat" + }, + "G1023": { + "name": "APT5" + }, + "G1024": { + "name": "Akira" + }, + "G1026": { + "name": "Malteiro" + }, + "G1028": { + "name": "APT-C-23" + }, + "G1030": { + "name": "Agrius" + }, + "G1031": { + "name": "Saint Bear" + }, + "G1032": { + "name": "INC Ransom" + }, + "G1033": { + "name": "Star Blizzard" + }, + "G1034": { + "name": "Daggerfly" + }, + "G1035": { + "name": "Winter Vivern" + }, + "G1036": { + "name": "Moonstone Sleet" + }, + "G1037": { + "name": "TA577" + }, + "G1038": { + "name": "TA578" + }, + "G1039": { + "name": "RedCurl" + }, + "G1040": { + "name": "Play" + }, + "G1041": { + "name": "Sea Turtle" + }, + "G1042": { + "name": "RedEcho" + }, + "G1043": { + "name": "BlackByte" + }, + "G1044": { + "name": "APT42" + }, + "G1045": { + "name": "Salt Typhoon" + }, + "G1046": { + "name": "Storm-1811" + }, + "G1047": { + "name": "Velvet Ant" + }, + "G1048": { + "name": "UNC3886" + }, + "G1049": { + "name": "AppleJeus" + }, + "G1050": { + "name": "Water Galura" + }, + "G1051": { + "name": "Medusa Group" + }, + "G1052": { + "name": "Contagious Interview" + }, + "G1053": { + "name": "Storm-0501" + }, + "G1054": { + "name": "MirrorFace" + }, + "G1055": { + "name": "VOID MANTICORE" + }, + "G1056": { + "name": "TeamPCP" + }, + "G1057": { + "name": "ShinyHunters" + } + }, + "campaigns": { + "C0001": { + "name": "Frankenstein", + "first_seen": "2019-01-01", + "last_seen": "2019-04-01" + }, + "C0002": { + "name": "Night Dragon", + "first_seen": "2009-11-01", + "last_seen": "2011-02-01" + }, + "C0004": { + "name": "CostaRicto", + "first_seen": "2019-10-01", + "last_seen": "2020-11-01" + }, + "C0005": { + "name": "Operation Spalax", + "first_seen": "2019-11-01", + "last_seen": "2021-01-01" + }, + "C0006": { + "name": "Operation Honeybee", + "first_seen": "2017-08-01", + "last_seen": "2018-02-01" + }, + "C0007": { + "name": "FunnyDream", + "first_seen": "2018-07-01", + "last_seen": "2020-11-01" + }, + "C0010": { + "name": "C0010", + "first_seen": "2020-12-01", + "last_seen": "2022-08-01" + }, + "C0011": { + "name": "C0011", + "first_seen": "2021-12-01", + "last_seen": "2022-07-01" + }, + "C0012": { + "name": "Operation CuckooBees", + "first_seen": "2019-12-01", + "last_seen": "2022-05-01" + }, + "C0013": { + "name": "Operation Sharpshooter", + "first_seen": "2017-09-01", + "last_seen": "2019-03-01" + }, + "C0014": { + "name": "Operation Wocao", + "first_seen": "2017-12-01", + "last_seen": "2019-12-01" + }, + "C0015": { + "name": "C0015", + "first_seen": "2021-08-01", + "last_seen": "2021-08-01" + }, + "C0016": { + "name": "Operation Dust Storm", + "first_seen": "2010-01-01", + "last_seen": "2016-02-01" + }, + "C0017": { + "name": "C0017", + "first_seen": "2021-05-01", + "last_seen": "2022-02-01" + }, + "C0018": { + "name": "C0018", + "first_seen": "2022-02-01", + "last_seen": "2022-03-01" + }, + "C0021": { + "name": "C0021", + "first_seen": "2018-11-01", + "last_seen": "2018-11-01" + }, + "C0022": { + "name": "Operation Dream Job", + "first_seen": "2019-09-01", + "last_seen": "2020-08-01" + }, + "C0023": { + "name": "Operation Ghost", + "first_seen": "2013-09-01", + "last_seen": "2019-10-01" + }, + "C0024": { + "name": "SolarWinds Compromise", + "first_seen": "2019-08-01", + "last_seen": "2021-01-01" + }, + "C0025": { + "name": "2016 Ukraine Electric Power Attack", + "first_seen": "2016-12-01", + "last_seen": "2016-12-01" + }, + "C0026": { + "name": "C0026", + "first_seen": "2022-08-01", + "last_seen": "2022-09-01" + }, + "C0027": { + "name": "C0027", + "first_seen": "2022-06-01", + "last_seen": "2022-12-01" + }, + "C0028": { + "name": "2015 Ukraine Electric Power Attack", + "first_seen": "2015-12-01", + "last_seen": "2016-01-01" + }, + "C0029": { + "name": "Cutting Edge", + "first_seen": "2023-12-01", + "last_seen": "2024-02-01" + }, + "C0030": { + "name": "Triton Safety Instrumented System Attack", + "first_seen": "2017-06-01", + "last_seen": "2017-08-01" + }, + "C0032": { + "name": "C0032", + "first_seen": "2014-10-01", + "last_seen": "2017-01-01" + }, + "C0033": { + "name": "C0033", + "first_seen": "2016-05-01", + "last_seen": "2023-01-01" + }, + "C0034": { + "name": "2022 Ukraine Electric Power Attack", + "first_seen": "2022-06-01", + "last_seen": "2022-10-01" + }, + "C0035": { + "name": "KV Botnet Activity", + "first_seen": "2022-10-01", + "last_seen": "2024-01-01" + }, + "C0036": { + "name": "Pikabot Distribution February 2024", + "first_seen": "2024-02-01", + "last_seen": "2024-02-01" + }, + "C0037": { + "name": "Water Curupira Pikabot Distribution", + "first_seen": "2023-01-01", + "last_seen": "2023-12-01" + }, + "C0038": { + "name": "HomeLand Justice", + "first_seen": "2021-05-01", + "last_seen": "2022-09-01" + }, + "C0039": { + "name": "Versa Director Zero Day Exploitation", + "first_seen": "2024-06-01", + "last_seen": "2024-08-01" + }, + "C0040": { + "name": "APT41 DUST", + "first_seen": "2023-01-31", + "last_seen": "2024-06-30" + }, + "C0041": { + "name": "FrostyGoop Incident", + "first_seen": "2024-01-01", + "last_seen": "2024-01-01" + }, + "C0042": { + "name": "Outer Space", + "first_seen": "2021-01-01", + "last_seen": "2021-12-01" + }, + "C0043": { + "name": "Indian Critical Infrastructure Intrusions", + "first_seen": "2021-01-01", + "last_seen": "2022-04-01" + }, + "C0044": { + "name": "Juicy Mix", + "first_seen": "2022-01-01", + "last_seen": "2022-12-01" + }, + "C0045": { + "name": "ShadowRay", + "first_seen": "2023-09-01", + "last_seen": "2024-03-01" + }, + "C0046": { + "name": "ArcaneDoor", + "first_seen": "2023-07-01", + "last_seen": "2024-04-01" + }, + "C0047": { + "name": "RedDelta Modified PlugX Infection Chain Operations", + "first_seen": "2023-07-01", + "last_seen": "2024-12-01" + }, + "C0048": { + "name": "Operation MidnightEclipse", + "first_seen": "2024-03-01", + "last_seen": "2024-04-01" + }, + "C0049": { + "name": "Leviathan Australian Intrusions", + "first_seen": "2022-04-01", + "last_seen": "2022-09-01" + }, + "C0050": { + "name": "J-magic Campaign", + "first_seen": "2023-06-01", + "last_seen": "2024-06-01" + }, + "C0051": { + "name": "APT28 Nearest Neighbor Campaign", + "first_seen": "2022-02-01", + "last_seen": "2024-11-01" + }, + "C0052": { + "name": "SPACEHOP Activity", + "first_seen": "2019-01-01", + "last_seen": "2024-05-01" + }, + "C0053": { + "name": "FLORAHOX Activity", + "first_seen": "2019-01-01", + "last_seen": "2024-05-01" + }, + "C0055": { + "name": "Quad7 Activity", + "first_seen": "2023-08-01", + "last_seen": "2025-08-01" + }, + "C0056": { + "name": "RedPenguin", + "first_seen": "2024-07-01", + "last_seen": "2025-03-01" + }, + "C0057": { + "name": "3CX Supply Chain Attack", + "first_seen": "2022-11-01", + "last_seen": "2023-03-01" + }, + "C0058": { + "name": "SharePoint ToolShell Exploitation", + "first_seen": "2025-07-01", + "last_seen": "2025-07-01" + }, + "C0059": { + "name": "Salesforce Data Exfiltration", + "first_seen": "2004-10-01", + "last_seen": "2025-09-01" + }, + "C0060": { + "name": "Operation AkaiRyū", + "first_seen": "2004-06-01", + "last_seen": "2004-09-01" + }, + "C0061": { + "name": "Operation Digital Eye", + "first_seen": "2024-06-01", + "last_seen": "2024-07-01" + }, + "C0062": { + "name": "Anthropic AI-orchestrated Campaign", + "first_seen": "2025-09-01", + "last_seen": "2025-09-01" + }, + "C0063": { + "name": "2025 Poland Wiper Attacks", + "first_seen": "2025-03-01", + "last_seen": "2025-12-01" + } + }, + "software": { + "S0001": { + "name": "Trojan.Mebromi", + "type": "malware" + }, + "S0002": { + "name": "Mimikatz", + "type": "tool" + }, + "S0003": { + "name": "RIPTIDE", + "type": "malware" + }, + "S0004": { + "name": "TinyZBot", + "type": "malware" + }, + "S0005": { + "name": "Windows Credential Editor", + "type": "tool" + }, + "S0006": { + "name": "pwdump", + "type": "tool" + }, + "S0007": { + "name": "Skeleton Key", + "type": "malware" + }, + "S0008": { + "name": "gsecdump", + "type": "tool" + }, + "S0009": { + "name": "Hikit", + "type": "malware" + }, + "S0010": { + "name": "Lurid", + "type": "malware" + }, + "S0011": { + "name": "Taidoor", + "type": "malware" + }, + "S0012": { + "name": "PoisonIvy", + "type": "malware" + }, + "S0013": { + "name": "PlugX", + "type": "malware" + }, + "S0014": { + "name": "BS2005", + "type": "malware" + }, + "S0015": { + "name": "Ixeshe", + "type": "malware" + }, + "S0016": { + "name": "P2P ZeuS", + "type": "malware" + }, + "S0017": { + "name": "BISCUIT", + "type": "malware" + }, + "S0018": { + "name": "Sykipot", + "type": "malware" + }, + "S0019": { + "name": "Regin", + "type": "malware" + }, + "S0020": { + "name": "China Chopper", + "type": "malware" + }, + "S0021": { + "name": "Derusbi", + "type": "malware" + }, + "S0022": { + "name": "Uroburos", + "type": "malware" + }, + "S0023": { + "name": "CHOPSTICK", + "type": "malware" + }, + "S0024": { + "name": "Dyre", + "type": "malware" + }, + "S0025": { + "name": "CALENDAR", + "type": "malware" + }, + "S0026": { + "name": "GLOOXMAIL", + "type": "malware" + }, + "S0027": { + "name": "Zeroaccess", + "type": "malware" + }, + "S0028": { + "name": "SHIPSHAPE", + "type": "malware" + }, + "S0029": { + "name": "PsExec", + "type": "tool" + }, + "S0030": { + "name": "Carbanak", + "type": "malware" + }, + "S0031": { + "name": "BACKSPACE", + "type": "malware" + }, + "S0032": { + "name": "gh0st RAT", + "type": "malware" + }, + "S0033": { + "name": "NetTraveler", + "type": "malware" + }, + "S0034": { + "name": "NETEAGLE", + "type": "malware" + }, + "S0035": { + "name": "SPACESHIP", + "type": "malware" + }, + "S0036": { + "name": "FLASHFLOOD", + "type": "malware" + }, + "S0037": { + "name": "HAMMERTOSS", + "type": "malware" + }, + "S0038": { + "name": "Duqu", + "type": "malware" + }, + "S0039": { + "name": "Net", + "type": "tool" + }, + "S0040": { + "name": "HTRAN", + "type": "tool" + }, + "S0041": { + "name": "Wiper", + "type": "malware" + }, + "S0042": { + "name": "LOWBALL", + "type": "malware" + }, + "S0043": { + "name": "BUBBLEWRAP", + "type": "malware" + }, + "S0044": { + "name": "JHUHUGIT", + "type": "malware" + }, + "S0045": { + "name": "ADVSTORESHELL", + "type": "malware" + }, + "S0046": { + "name": "CozyCar", + "type": "malware" + }, + "S0047": { + "name": "Hacking Team UEFI Rootkit", + "type": "malware" + }, + "S0048": { + "name": "PinchDuke", + "type": "malware" + }, + "S0049": { + "name": "GeminiDuke", + "type": "malware" + }, + "S0050": { + "name": "CosmicDuke", + "type": "malware" + }, + "S0051": { + "name": "MiniDuke", + "type": "malware" + }, + "S0052": { + "name": "OnionDuke", + "type": "malware" + }, + "S0053": { + "name": "SeaDuke", + "type": "malware" + }, + "S0054": { + "name": "CloudDuke", + "type": "malware" + }, + "S0055": { + "name": "RARSTONE", + "type": "malware" + }, + "S0056": { + "name": "Net Crawler", + "type": "malware" + }, + "S0057": { + "name": "Tasklist", + "type": "tool" + }, + "S0058": { + "name": "SslMM", + "type": "malware" + }, + "S0059": { + "name": "WinMM", + "type": "malware" + }, + "S0060": { + "name": "Sys10", + "type": "malware" + }, + "S0061": { + "name": "HDoor", + "type": "malware" + }, + "S0062": { + "name": "DustySky", + "type": "malware" + }, + "S0063": { + "name": "SHOTPUT", + "type": "malware" + }, + "S0064": { + "name": "ELMER", + "type": "malware" + }, + "S0065": { + "name": "4H RAT", + "type": "malware" + }, + "S0066": { + "name": "3PARA RAT", + "type": "malware" + }, + "S0067": { + "name": "pngdowner", + "type": "malware" + }, + "S0068": { + "name": "httpclient", + "type": "malware" + }, + "S0069": { + "name": "BLACKCOFFEE", + "type": "malware" + }, + "S0070": { + "name": "HTTPBrowser", + "type": "malware" + }, + "S0071": { + "name": "hcdLoader", + "type": "malware" + }, + "S0072": { + "name": "OwaAuth", + "type": "malware" + }, + "S0073": { + "name": "ASPXSpy", + "type": "malware" + }, + "S0074": { + "name": "Sakula", + "type": "malware" + }, + "S0075": { + "name": "Reg", + "type": "tool" + }, + "S0076": { + "name": "FakeM", + "type": "malware" + }, + "S0077": { + "name": "CallMe", + "type": "malware" + }, + "S0078": { + "name": "Psylo", + "type": "malware" + }, + "S0079": { + "name": "MobileOrder", + "type": "malware" + }, + "S0080": { + "name": "Mivast", + "type": "malware" + }, + "S0081": { + "name": "Elise", + "type": "malware" + }, + "S0082": { + "name": "Emissary", + "type": "malware" + }, + "S0083": { + "name": "Misdat", + "type": "malware" + }, + "S0084": { + "name": "Mis-Type", + "type": "malware" + }, + "S0085": { + "name": "S-Type", + "type": "malware" + }, + "S0086": { + "name": "ZLib", + "type": "malware" + }, + "S0087": { + "name": "Hi-Zor", + "type": "malware" + }, + "S0088": { + "name": "Kasidet", + "type": "malware" + }, + "S0089": { + "name": "BlackEnergy", + "type": "malware" + }, + "S0090": { + "name": "Rover", + "type": "malware" + }, + "S0091": { + "name": "Epic", + "type": "malware" + }, + "S0092": { + "name": "Agent.btz", + "type": "malware" + }, + "S0093": { + "name": "Backdoor.Oldrea", + "type": "malware" + }, + "S0094": { + "name": "Trojan.Karagany", + "type": "malware" + }, + "S0095": { + "name": "ftp", + "type": "tool" + }, + "S0096": { + "name": "Systeminfo", + "type": "tool" + }, + "S0097": { + "name": "Ping", + "type": "tool" + }, + "S0098": { + "name": "T9000", + "type": "malware" + }, + "S0099": { + "name": "Arp", + "type": "tool" + }, + "S0100": { + "name": "ipconfig", + "type": "tool" + }, + "S0101": { + "name": "ifconfig", + "type": "tool" + }, + "S0102": { + "name": "nbtstat", + "type": "tool" + }, + "S0103": { + "name": "route", + "type": "tool" + }, + "S0104": { + "name": "netstat", + "type": "tool" + }, + "S0105": { + "name": "dsquery", + "type": "tool" + }, + "S0106": { + "name": "cmd", + "type": "tool" + }, + "S0107": { + "name": "Cherry Picker", + "type": "malware" + }, + "S0108": { + "name": "netsh", + "type": "tool" + }, + "S0109": { + "name": "WEBC2", + "type": "malware" + }, + "S0110": { + "name": "at", + "type": "tool" + }, + "S0111": { + "name": "schtasks", + "type": "tool" + }, + "S0112": { + "name": "ROCKBOOT", + "type": "malware" + }, + "S0113": { + "name": "Prikormka", + "type": "malware" + }, + "S0114": { + "name": "BOOTRASH", + "type": "malware" + }, + "S0115": { + "name": "Crimson", + "type": "malware" + }, + "S0116": { + "name": "UACMe", + "type": "tool" + }, + "S0117": { + "name": "XTunnel", + "type": "malware" + }, + "S0118": { + "name": "Nidiran", + "type": "malware" + }, + "S0119": { + "name": "Cachedump", + "type": "tool" + }, + "S0120": { + "name": "Fgdump", + "type": "tool" + }, + "S0121": { + "name": "Lslsass", + "type": "tool" + }, + "S0122": { + "name": "Pass-The-Hash Toolkit", + "type": "tool" + }, + "S0123": { + "name": "xCmd", + "type": "tool" + }, + "S0124": { + "name": "Pisloader", + "type": "malware" + }, + "S0125": { + "name": "Remsec", + "type": "malware" + }, + "S0126": { + "name": "ComRAT", + "type": "malware" + }, + "S0127": { + "name": "BBSRAT", + "type": "malware" + }, + "S0128": { + "name": "BADNEWS", + "type": "malware" + }, + "S0129": { + "name": "AutoIt backdoor", + "type": "malware" + }, + "S0130": { + "name": "Unknown Logger", + "type": "malware" + }, + "S0131": { + "name": "TINYTYPHON", + "type": "malware" + }, + "S0132": { + "name": "H1N1", + "type": "malware" + }, + "S0133": { + "name": "Miner-C", + "type": "malware" + }, + "S0134": { + "name": "Downdelph", + "type": "malware" + }, + "S0135": { + "name": "HIDEDRV", + "type": "malware" + }, + "S0136": { + "name": "USBStealer", + "type": "malware" + }, + "S0137": { + "name": "CORESHELL", + "type": "malware" + }, + "S0138": { + "name": "OLDBAIT", + "type": "malware" + }, + "S0139": { + "name": "PowerDuke", + "type": "malware" + }, + "S0140": { + "name": "Shamoon", + "type": "malware" + }, + "S0141": { + "name": "Winnti for Windows", + "type": "malware" + }, + "S0142": { + "name": "StreamEx", + "type": "malware" + }, + "S0143": { + "name": "Flame", + "type": "malware" + }, + "S0144": { + "name": "ChChes", + "type": "malware" + }, + "S0145": { + "name": "POWERSOURCE", + "type": "malware" + }, + "S0146": { + "name": "TEXTMATE", + "type": "malware" + }, + "S0147": { + "name": "Pteranodon", + "type": "malware" + }, + "S0148": { + "name": "RTM", + "type": "malware" + }, + "S0149": { + "name": "MoonWind", + "type": "malware" + }, + "S0150": { + "name": "POSHSPY", + "type": "malware" + }, + "S0151": { + "name": "HALFBAKED", + "type": "malware" + }, + "S0152": { + "name": "EvilGrab", + "type": "malware" + }, + "S0153": { + "name": "RedLeaves", + "type": "malware" + }, + "S0154": { + "name": "Cobalt Strike", + "type": "malware" + }, + "S0155": { + "name": "WINDSHIELD", + "type": "malware" + }, + "S0156": { + "name": "KOMPROGO", + "type": "malware" + }, + "S0157": { + "name": "SOUNDBITE", + "type": "malware" + }, + "S0158": { + "name": "PHOREAL", + "type": "malware" + }, + "S0159": { + "name": "SNUGRIDE", + "type": "malware" + }, + "S0160": { + "name": "certutil", + "type": "tool" + }, + "S0161": { + "name": "XAgentOSX", + "type": "malware" + }, + "S0162": { + "name": "Komplex", + "type": "malware" + }, + "S0163": { + "name": "Janicab", + "type": "malware" + }, + "S0164": { + "name": "TDTESS", + "type": "malware" + }, + "S0165": { + "name": "OSInfo", + "type": "malware" + }, + "S0166": { + "name": "RemoteCMD", + "type": "malware" + }, + "S0167": { + "name": "Matryoshka", + "type": "malware" + }, + "S0168": { + "name": "Gazer", + "type": "malware" + }, + "S0169": { + "name": "RawPOS", + "type": "malware" + }, + "S0170": { + "name": "Helminth", + "type": "malware" + }, + "S0171": { + "name": "Felismus", + "type": "malware" + }, + "S0172": { + "name": "Reaver", + "type": "malware" + }, + "S0173": { + "name": "FLIPSIDE", + "type": "malware" + }, + "S0174": { + "name": "Responder", + "type": "tool" + }, + "S0175": { + "name": "meek", + "type": "tool" + }, + "S0176": { + "name": "Wingbird", + "type": "malware" + }, + "S0177": { + "name": "Power Loader", + "type": "malware" + }, + "S0178": { + "name": "Truvasys", + "type": "malware" + }, + "S0179": { + "name": "MimiPenguin", + "type": "tool" + }, + "S0180": { + "name": "Volgmer", + "type": "malware" + }, + "S0181": { + "name": "FALLCHILL", + "type": "malware" + }, + "S0182": { + "name": "FinFisher", + "type": "malware" + }, + "S0183": { + "name": "Tor", + "type": "tool" + }, + "S0184": { + "name": "POWRUNER", + "type": "malware" + }, + "S0185": { + "name": "SEASHARPEE", + "type": "malware" + }, + "S0186": { + "name": "DownPaper", + "type": "malware" + }, + "S0187": { + "name": "Daserf", + "type": "malware" + }, + "S0188": { + "name": "Starloader", + "type": "malware" + }, + "S0189": { + "name": "ISMInjector", + "type": "malware" + }, + "S0190": { + "name": "BITSAdmin", + "type": "tool" + }, + "S0191": { + "name": "Winexe", + "type": "tool" + }, + "S0192": { + "name": "Pupy", + "type": "tool" + }, + "S0193": { + "name": "Forfiles", + "type": "tool" + }, + "S0194": { + "name": "PowerSploit", + "type": "tool" + }, + "S0195": { + "name": "SDelete", + "type": "tool" + }, + "S0196": { + "name": "PUNCHBUGGY", + "type": "malware" + }, + "S0197": { + "name": "PUNCHTRACK", + "type": "malware" + }, + "S0198": { + "name": "NETWIRE", + "type": "malware" + }, + "S0199": { + "name": "TURNEDUP", + "type": "malware" + }, + "S0200": { + "name": "Dipsind", + "type": "malware" + }, + "S0201": { + "name": "JPIN", + "type": "malware" + }, + "S0202": { + "name": "adbupd", + "type": "malware" + }, + "S0203": { + "name": "Hydraq", + "type": "malware" + }, + "S0204": { + "name": "Briba", + "type": "malware" + }, + "S0205": { + "name": "Naid", + "type": "malware" + }, + "S0206": { + "name": "Wiarp", + "type": "malware" + }, + "S0207": { + "name": "Vasport", + "type": "malware" + }, + "S0208": { + "name": "Pasam", + "type": "malware" + }, + "S0210": { + "name": "Nerex", + "type": "malware" + }, + "S0211": { + "name": "Linfo", + "type": "malware" + }, + "S0212": { + "name": "CORALDECK", + "type": "malware" + }, + "S0213": { + "name": "DOGCALL", + "type": "malware" + }, + "S0214": { + "name": "HAPPYWORK", + "type": "malware" + }, + "S0215": { + "name": "KARAE", + "type": "malware" + }, + "S0216": { + "name": "POORAIM", + "type": "malware" + }, + "S0217": { + "name": "SHUTTERSPEED", + "type": "malware" + }, + "S0218": { + "name": "SLOWDRIFT", + "type": "malware" + }, + "S0219": { + "name": "WINERACK", + "type": "malware" + }, + "S0220": { + "name": "Chaos", + "type": "malware" + }, + "S0221": { + "name": "Umbreon", + "type": "malware" + }, + "S0222": { + "name": "CCBkdr", + "type": "malware" + }, + "S0223": { + "name": "POWERSTATS", + "type": "malware" + }, + "S0224": { + "name": "Havij", + "type": "tool" + }, + "S0225": { + "name": "sqlmap", + "type": "tool" + }, + "S0226": { + "name": "Smoke Loader", + "type": "malware" + }, + "S0227": { + "name": "spwebmember", + "type": "tool" + }, + "S0228": { + "name": "NanHaiShu", + "type": "malware" + }, + "S0229": { + "name": "Orz", + "type": "malware" + }, + "S0230": { + "name": "ZeroT", + "type": "malware" + }, + "S0231": { + "name": "Invoke-PSImage", + "type": "tool" + }, + "S0232": { + "name": "HOMEFRY", + "type": "malware" + }, + "S0233": { + "name": "MURKYTOP", + "type": "malware" + }, + "S0234": { + "name": "Bandook", + "type": "malware" + }, + "S0235": { + "name": "CrossRAT", + "type": "malware" + }, + "S0236": { + "name": "Kwampirs", + "type": "malware" + }, + "S0237": { + "name": "GravityRAT", + "type": "malware" + }, + "S0238": { + "name": "Proxysvc", + "type": "malware" + }, + "S0239": { + "name": "Bankshot", + "type": "malware" + }, + "S0240": { + "name": "ROKRAT", + "type": "malware" + }, + "S0241": { + "name": "RATANKBA", + "type": "malware" + }, + "S0242": { + "name": "SynAck", + "type": "malware" + }, + "S0243": { + "name": "DealersChoice", + "type": "malware" + }, + "S0244": { + "name": "Comnie", + "type": "malware" + }, + "S0245": { + "name": "BADCALL", + "type": "malware" + }, + "S0246": { + "name": "HARDRAIN", + "type": "malware" + }, + "S0247": { + "name": "NavRAT", + "type": "malware" + }, + "S0248": { + "name": "yty", + "type": "malware" + }, + "S0249": { + "name": "Gold Dragon", + "type": "malware" + }, + "S0250": { + "name": "Koadic", + "type": "tool" + }, + "S0251": { + "name": "Zebrocy", + "type": "malware" + }, + "S0252": { + "name": "Brave Prince", + "type": "malware" + }, + "S0253": { + "name": "RunningRAT", + "type": "malware" + }, + "S0254": { + "name": "PLAINTEE", + "type": "malware" + }, + "S0255": { + "name": "DDKONG", + "type": "malware" + }, + "S0256": { + "name": "Mosquito", + "type": "malware" + }, + "S0257": { + "name": "VERMIN", + "type": "malware" + }, + "S0258": { + "name": "RGDoor", + "type": "malware" + }, + "S0259": { + "name": "InnaputRAT", + "type": "malware" + }, + "S0260": { + "name": "InvisiMole", + "type": "malware" + }, + "S0261": { + "name": "Catchamas", + "type": "malware" + }, + "S0262": { + "name": "QuasarRAT", + "type": "tool" + }, + "S0263": { + "name": "TYPEFRAME", + "type": "malware" + }, + "S0264": { + "name": "OopsIE", + "type": "malware" + }, + "S0265": { + "name": "Kazuar", + "type": "malware" + }, + "S0266": { + "name": "TrickBot", + "type": "malware" + }, + "S0267": { + "name": "FELIXROOT", + "type": "malware" + }, + "S0268": { + "name": "Bisonal", + "type": "malware" + }, + "S0269": { + "name": "QUADAGENT", + "type": "malware" + }, + "S0270": { + "name": "RogueRobin", + "type": "malware" + }, + "S0271": { + "name": "KEYMARBLE", + "type": "malware" + }, + "S0272": { + "name": "NDiskMonitor", + "type": "malware" + }, + "S0273": { + "name": "Socksbot", + "type": "malware" + }, + "S0274": { + "name": "Calisto", + "type": "malware" + }, + "S0275": { + "name": "UPPERCUT", + "type": "malware" + }, + "S0276": { + "name": "Keydnap", + "type": "malware" + }, + "S0277": { + "name": "FruitFly", + "type": "malware" + }, + "S0278": { + "name": "iKitten", + "type": "malware" + }, + "S0279": { + "name": "Proton", + "type": "malware" + }, + "S0280": { + "name": "MirageFox", + "type": "malware" + }, + "S0281": { + "name": "Dok", + "type": "malware" + }, + "S0282": { + "name": "MacSpy", + "type": "malware" + }, + "S0283": { + "name": "jRAT", + "type": "malware" + }, + "S0284": { + "name": "More_eggs", + "type": "malware" + }, + "S0330": { + "name": "Zeus Panda", + "type": "malware" + }, + "S0331": { + "name": "Agent Tesla", + "type": "malware" + }, + "S0332": { + "name": "Remcos", + "type": "tool" + }, + "S0333": { + "name": "UBoatRAT", + "type": "malware" + }, + "S0334": { + "name": "DarkComet", + "type": "malware" + }, + "S0335": { + "name": "Carbon", + "type": "malware" + }, + "S0336": { + "name": "NanoCore", + "type": "malware" + }, + "S0337": { + "name": "BadPatch", + "type": "malware" + }, + "S0338": { + "name": "Cobian RAT", + "type": "malware" + }, + "S0339": { + "name": "Micropsia", + "type": "malware" + }, + "S0340": { + "name": "Octopus", + "type": "malware" + }, + "S0341": { + "name": "Xbash", + "type": "malware" + }, + "S0342": { + "name": "GreyEnergy", + "type": "malware" + }, + "S0343": { + "name": "Exaramel for Windows", + "type": "malware" + }, + "S0344": { + "name": "Azorult", + "type": "malware" + }, + "S0345": { + "name": "Seasalt", + "type": "malware" + }, + "S0346": { + "name": "OceanSalt", + "type": "malware" + }, + "S0347": { + "name": "AuditCred", + "type": "malware" + }, + "S0348": { + "name": "Cardinal RAT", + "type": "malware" + }, + "S0349": { + "name": "LaZagne", + "type": "tool" + }, + "S0350": { + "name": "zwShell", + "type": "malware" + }, + "S0351": { + "name": "Cannon", + "type": "malware" + }, + "S0352": { + "name": "OSX_OCEANLOTUS.D", + "type": "malware" + }, + "S0353": { + "name": "NOKKI", + "type": "malware" + }, + "S0354": { + "name": "Denis", + "type": "malware" + }, + "S0355": { + "name": "Final1stspy", + "type": "malware" + }, + "S0356": { + "name": "KONNI", + "type": "malware" + }, + "S0357": { + "name": "Impacket", + "type": "tool" + }, + "S0358": { + "name": "Ruler", + "type": "tool" + }, + "S0359": { + "name": "Nltest", + "type": "tool" + }, + "S0360": { + "name": "BONDUPDATER", + "type": "malware" + }, + "S0361": { + "name": "Expand", + "type": "tool" + }, + "S0362": { + "name": "Linux Rabbit", + "type": "malware" + }, + "S0363": { + "name": "Empire", + "type": "tool" + }, + "S0364": { + "name": "RawDisk", + "type": "tool" + }, + "S0365": { + "name": "Olympic Destroyer", + "type": "malware" + }, + "S0366": { + "name": "WannaCry", + "type": "malware" + }, + "S0367": { + "name": "Emotet", + "type": "malware" + }, + "S0368": { + "name": "NotPetya", + "type": "malware" + }, + "S0369": { + "name": "CoinTicker", + "type": "malware" + }, + "S0370": { + "name": "SamSam", + "type": "malware" + }, + "S0371": { + "name": "POWERTON", + "type": "malware" + }, + "S0372": { + "name": "LockerGoga", + "type": "malware" + }, + "S0373": { + "name": "Astaroth", + "type": "malware" + }, + "S0374": { + "name": "SpeakUp", + "type": "malware" + }, + "S0375": { + "name": "Remexi", + "type": "malware" + }, + "S0376": { + "name": "HOPLIGHT", + "type": "malware" + }, + "S0377": { + "name": "Ebury", + "type": "malware" + }, + "S0378": { + "name": "PoshC2", + "type": "tool" + }, + "S0379": { + "name": "Revenge RAT", + "type": "malware" + }, + "S0380": { + "name": "StoneDrill", + "type": "malware" + }, + "S0381": { + "name": "FlawedAmmyy", + "type": "malware" + }, + "S0382": { + "name": "ServHelper", + "type": "malware" + }, + "S0383": { + "name": "FlawedGrace", + "type": "malware" + }, + "S0384": { + "name": "Dridex", + "type": "malware" + }, + "S0385": { + "name": "njRAT", + "type": "malware" + }, + "S0386": { + "name": "Ursnif", + "type": "malware" + }, + "S0387": { + "name": "KeyBoy", + "type": "malware" + }, + "S0388": { + "name": "YAHOYAH", + "type": "malware" + }, + "S0389": { + "name": "JCry", + "type": "malware" + }, + "S0390": { + "name": "SQLRat", + "type": "malware" + }, + "S0391": { + "name": "HAWKBALL", + "type": "malware" + }, + "S0393": { + "name": "PowerStallion", + "type": "malware" + }, + "S0394": { + "name": "HiddenWasp", + "type": "malware" + }, + "S0395": { + "name": "LightNeuron", + "type": "malware" + }, + "S0396": { + "name": "EvilBunny", + "type": "malware" + }, + "S0397": { + "name": "LoJax", + "type": "malware" + }, + "S0398": { + "name": "HyperBro", + "type": "malware" + }, + "S0400": { + "name": "RobbinHood", + "type": "malware" + }, + "S0401": { + "name": "Exaramel for Linux", + "type": "malware" + }, + "S0402": { + "name": "OSX/Shlayer", + "type": "malware" + }, + "S0404": { + "name": "esentutl", + "type": "tool" + }, + "S0409": { + "name": "Machete", + "type": "malware" + }, + "S0410": { + "name": "Fysbis", + "type": "malware" + }, + "S0412": { + "name": "ZxShell", + "type": "malware" + }, + "S0413": { + "name": "MailSniper", + "type": "tool" + }, + "S0414": { + "name": "BabyShark", + "type": "malware" + }, + "S0415": { + "name": "BOOSTWRITE", + "type": "malware" + }, + "S0416": { + "name": "RDFSNIFFER", + "type": "malware" + }, + "S0417": { + "name": "GRIFFON", + "type": "malware" + }, + "S0428": { + "name": "PoetRAT", + "type": "malware" + }, + "S0430": { + "name": "Winnti for Linux", + "type": "malware" + }, + "S0431": { + "name": "HotCroissant", + "type": "malware" + }, + "S0433": { + "name": "Rifdoor", + "type": "malware" + }, + "S0434": { + "name": "Imminent Monitor", + "type": "tool" + }, + "S0435": { + "name": "PLEAD", + "type": "malware" + }, + "S0436": { + "name": "TSCookie", + "type": "malware" + }, + "S0437": { + "name": "Kivars", + "type": "malware" + }, + "S0438": { + "name": "Attor", + "type": "malware" + }, + "S0439": { + "name": "Okrum", + "type": "malware" + }, + "S0441": { + "name": "PowerShower", + "type": "malware" + }, + "S0442": { + "name": "VBShower", + "type": "malware" + }, + "S0443": { + "name": "MESSAGETAP", + "type": "malware" + }, + "S0444": { + "name": "ShimRat", + "type": "malware" + }, + "S0445": { + "name": "ShimRatReporter", + "type": "tool" + }, + "S0446": { + "name": "Ryuk", + "type": "malware" + }, + "S0447": { + "name": "Lokibot", + "type": "malware" + }, + "S0448": { + "name": "Rising Sun", + "type": "malware" + }, + "S0449": { + "name": "Maze", + "type": "malware" + }, + "S0450": { + "name": "SHARPSTATS", + "type": "malware" + }, + "S0451": { + "name": "LoudMiner", + "type": "malware" + }, + "S0452": { + "name": "USBferry", + "type": "malware" + }, + "S0453": { + "name": "Pony", + "type": "malware" + }, + "S0454": { + "name": "Cadelspy", + "type": "malware" + }, + "S0455": { + "name": "Metamorfo", + "type": "malware" + }, + "S0456": { + "name": "Aria-body", + "type": "malware" + }, + "S0457": { + "name": "Netwalker", + "type": "malware" + }, + "S0458": { + "name": "Ramsay", + "type": "malware" + }, + "S0459": { + "name": "MechaFlounder", + "type": "malware" + }, + "S0460": { + "name": "Get2", + "type": "malware" + }, + "S0461": { + "name": "SDBbot", + "type": "malware" + }, + "S0462": { + "name": "CARROTBAT", + "type": "malware" + }, + "S0464": { + "name": "SYSCON", + "type": "malware" + }, + "S0465": { + "name": "CARROTBALL", + "type": "tool" + }, + "S0466": { + "name": "WindTail", + "type": "malware" + }, + "S0467": { + "name": "TajMahal", + "type": "malware" + }, + "S0468": { + "name": "Skidmap", + "type": "malware" + }, + "S0469": { + "name": "ABK", + "type": "malware" + }, + "S0470": { + "name": "BBK", + "type": "malware" + }, + "S0471": { + "name": "build_downer", + "type": "malware" + }, + "S0472": { + "name": "down_new", + "type": "malware" + }, + "S0473": { + "name": "Avenger", + "type": "malware" + }, + "S0475": { + "name": "BackConfig", + "type": "malware" + }, + "S0476": { + "name": "Valak", + "type": "malware" + }, + "S0477": { + "name": "Goopy", + "type": "malware" + }, + "S0481": { + "name": "Ragnar Locker", + "type": "malware" + }, + "S0482": { + "name": "Bundlore", + "type": "malware" + }, + "S0483": { + "name": "IcedID", + "type": "malware" + }, + "S0484": { + "name": "Carberp", + "type": "malware" + }, + "S0486": { + "name": "Bonadan", + "type": "malware" + }, + "S0487": { + "name": "Kessel", + "type": "malware" + }, + "S0488": { + "name": "CrackMapExec", + "type": "tool" + }, + "S0491": { + "name": "StrongPity", + "type": "malware" + }, + "S0492": { + "name": "CookieMiner", + "type": "malware" + }, + "S0493": { + "name": "GoldenSpy", + "type": "malware" + }, + "S0495": { + "name": "RDAT", + "type": "malware" + }, + "S0496": { + "name": "REvil", + "type": "malware" + }, + "S0497": { + "name": "Dacls", + "type": "malware" + }, + "S0498": { + "name": "Cryptoistic", + "type": "malware" + }, + "S0499": { + "name": "Hancitor", + "type": "malware" + }, + "S0500": { + "name": "MCMD", + "type": "tool" + }, + "S0501": { + "name": "PipeMon", + "type": "malware" + }, + "S0502": { + "name": "Drovorub", + "type": "malware" + }, + "S0503": { + "name": "FrameworkPOS", + "type": "malware" + }, + "S0504": { + "name": "Anchor", + "type": "malware" + }, + "S0508": { + "name": "ngrok", + "type": "tool" + }, + "S0511": { + "name": "RegDuke", + "type": "malware" + }, + "S0512": { + "name": "FatDuke", + "type": "malware" + }, + "S0513": { + "name": "LiteDuke", + "type": "malware" + }, + "S0514": { + "name": "WellMess", + "type": "malware" + }, + "S0515": { + "name": "WellMail", + "type": "malware" + }, + "S0516": { + "name": "SoreFang", + "type": "malware" + }, + "S0517": { + "name": "Pillowmint", + "type": "malware" + }, + "S0518": { + "name": "PolyglotDuke", + "type": "malware" + }, + "S0519": { + "name": "SYNful Knock", + "type": "malware" + }, + "S0520": { + "name": "BLINDINGCAN", + "type": "malware" + }, + "S0521": { + "name": "BloodHound", + "type": "tool" + }, + "S0526": { + "name": "KGH_SPY", + "type": "malware" + }, + "S0527": { + "name": "CSPY Downloader", + "type": "tool" + }, + "S0528": { + "name": "Javali", + "type": "malware" + }, + "S0530": { + "name": "Melcoz", + "type": "malware" + }, + "S0531": { + "name": "Grandoreiro", + "type": "malware" + }, + "S0532": { + "name": "Lucifer", + "type": "malware" + }, + "S0533": { + "name": "SLOTHFULMEDIA", + "type": "malware" + }, + "S0534": { + "name": "Bazar", + "type": "malware" + }, + "S0537": { + "name": "HyperStack", + "type": "malware" + }, + "S0538": { + "name": "Crutch", + "type": "malware" + }, + "S0543": { + "name": "Spark", + "type": "malware" + }, + "S0546": { + "name": "SharpStage", + "type": "malware" + }, + "S0547": { + "name": "DropBook", + "type": "malware" + }, + "S0552": { + "name": "AdFind", + "type": "tool" + }, + "S0553": { + "name": "MoleNet", + "type": "malware" + }, + "S0554": { + "name": "Egregor", + "type": "malware" + }, + "S0556": { + "name": "Pay2Key", + "type": "malware" + }, + "S0559": { + "name": "SUNBURST", + "type": "malware" + }, + "S0560": { + "name": "TEARDROP", + "type": "malware" + }, + "S0561": { + "name": "GuLoader", + "type": "malware" + }, + "S0562": { + "name": "SUNSPOT", + "type": "malware" + }, + "S0564": { + "name": "BlackMould", + "type": "malware" + }, + "S0565": { + "name": "Raindrop", + "type": "malware" + }, + "S0567": { + "name": "Dtrack", + "type": "malware" + }, + "S0568": { + "name": "EVILNUM", + "type": "malware" + }, + "S0569": { + "name": "Explosive", + "type": "malware" + }, + "S0570": { + "name": "BitPaymer", + "type": "malware" + }, + "S0572": { + "name": "Caterpillar WebShell", + "type": "malware" + }, + "S0574": { + "name": "BendyBear", + "type": "malware" + }, + "S0575": { + "name": "Conti", + "type": "malware" + }, + "S0576": { + "name": "MegaCortex", + "type": "malware" + }, + "S0578": { + "name": "SUPERNOVA", + "type": "malware" + }, + "S0579": { + "name": "Waterbear", + "type": "malware" + }, + "S0581": { + "name": "IronNetInjector", + "type": "tool" + }, + "S0582": { + "name": "LookBack", + "type": "malware" + }, + "S0583": { + "name": "Pysa", + "type": "malware" + }, + "S0584": { + "name": "AppleJeus", + "type": "malware" + }, + "S0585": { + "name": "Kerrdown", + "type": "malware" + }, + "S0586": { + "name": "TAINTEDSCRIBE", + "type": "malware" + }, + "S0587": { + "name": "Penquin", + "type": "malware" + }, + "S0588": { + "name": "GoldMax", + "type": "malware" + }, + "S0589": { + "name": "Sibot", + "type": "malware" + }, + "S0590": { + "name": "NBTscan", + "type": "tool" + }, + "S0591": { + "name": "ConnectWise", + "type": "tool" + }, + "S0592": { + "name": "RemoteUtilities", + "type": "tool" + }, + "S0593": { + "name": "ECCENTRICBANDWAGON", + "type": "malware" + }, + "S0594": { + "name": "Out1", + "type": "tool" + }, + "S0595": { + "name": "ThiefQuest", + "type": "malware" + }, + "S0596": { + "name": "ShadowPad", + "type": "malware" + }, + "S0597": { + "name": "GoldFinder", + "type": "malware" + }, + "S0598": { + "name": "P.A.S. Webshell", + "type": "malware" + }, + "S0599": { + "name": "Kinsing", + "type": "malware" + }, + "S0600": { + "name": "Doki", + "type": "malware" + }, + "S0601": { + "name": "Hildegard", + "type": "malware" + }, + "S0603": { + "name": "Stuxnet", + "type": "malware" + }, + "S0604": { + "name": "Industroyer", + "type": "malware" + }, + "S0605": { + "name": "EKANS", + "type": "malware" + }, + "S0606": { + "name": "Bad Rabbit", + "type": "malware" + }, + "S0607": { + "name": "KillDisk", + "type": "malware" + }, + "S0608": { + "name": "Conficker", + "type": "malware" + }, + "S0610": { + "name": "SideTwist", + "type": "malware" + }, + "S0611": { + "name": "Clop", + "type": "malware" + }, + "S0612": { + "name": "WastedLocker", + "type": "malware" + }, + "S0613": { + "name": "PS1", + "type": "malware" + }, + "S0614": { + "name": "CostaBricks", + "type": "malware" + }, + "S0615": { + "name": "SombRAT", + "type": "malware" + }, + "S0616": { + "name": "DEATHRANSOM", + "type": "malware" + }, + "S0617": { + "name": "HELLOKITTY", + "type": "malware" + }, + "S0618": { + "name": "FIVEHANDS", + "type": "malware" + }, + "S0622": { + "name": "AppleSeed", + "type": "malware" + }, + "S0623": { + "name": "Siloscape", + "type": "malware" + }, + "S0624": { + "name": "Ecipekac", + "type": "malware" + }, + "S0625": { + "name": "Cuba", + "type": "malware" + }, + "S0626": { + "name": "P8RAT", + "type": "malware" + }, + "S0627": { + "name": "SodaMaster", + "type": "malware" + }, + "S0628": { + "name": "FYAnti", + "type": "malware" + }, + "S0629": { + "name": "RainyDay", + "type": "malware" + }, + "S0630": { + "name": "Nebulae", + "type": "malware" + }, + "S0631": { + "name": "Chaes", + "type": "malware" + }, + "S0632": { + "name": "GrimAgent", + "type": "malware" + }, + "S0633": { + "name": "Sliver", + "type": "tool" + }, + "S0634": { + "name": "EnvyScout", + "type": "malware" + }, + "S0635": { + "name": "BoomBox", + "type": "malware" + }, + "S0636": { + "name": "VaporRage", + "type": "malware" + }, + "S0637": { + "name": "NativeZone", + "type": "malware" + }, + "S0638": { + "name": "Babuk", + "type": "malware" + }, + "S0639": { + "name": "Seth-Locker", + "type": "malware" + }, + "S0640": { + "name": "Avaddon", + "type": "malware" + }, + "S0641": { + "name": "Kobalos", + "type": "malware" + }, + "S0642": { + "name": "BADFLICK", + "type": "malware" + }, + "S0643": { + "name": "Peppy", + "type": "malware" + }, + "S0644": { + "name": "ObliqueRAT", + "type": "malware" + }, + "S0645": { + "name": "Wevtutil", + "type": "tool" + }, + "S0646": { + "name": "SpicyOmelette", + "type": "malware" + }, + "S0647": { + "name": "Turian", + "type": "malware" + }, + "S0648": { + "name": "JSS Loader", + "type": "malware" + }, + "S0649": { + "name": "SMOKEDHAM", + "type": "malware" + }, + "S0650": { + "name": "QakBot", + "type": "malware" + }, + "S0651": { + "name": "BoxCaon", + "type": "malware" + }, + "S0652": { + "name": "MarkiRAT", + "type": "malware" + }, + "S0653": { + "name": "xCaon", + "type": "malware" + }, + "S0654": { + "name": "ProLock", + "type": "malware" + }, + "S0657": { + "name": "BLUELIGHT", + "type": "malware" + }, + "S0658": { + "name": "XCSSET", + "type": "malware" + }, + "S0659": { + "name": "Diavol", + "type": "malware" + }, + "S0660": { + "name": "Clambling", + "type": "malware" + }, + "S0661": { + "name": "FoggyWeb", + "type": "malware" + }, + "S0662": { + "name": "RCSession", + "type": "malware" + }, + "S0663": { + "name": "SysUpdate", + "type": "malware" + }, + "S0664": { + "name": "Pandora", + "type": "malware" + }, + "S0665": { + "name": "ThreatNeedle", + "type": "malware" + }, + "S0666": { + "name": "Gelsemium", + "type": "malware" + }, + "S0667": { + "name": "Chrommme", + "type": "malware" + }, + "S0668": { + "name": "TinyTurla", + "type": "malware" + }, + "S0669": { + "name": "KOCTOPUS", + "type": "malware" + }, + "S0670": { + "name": "WarzoneRAT", + "type": "malware" + }, + "S0671": { + "name": "Tomiris", + "type": "malware" + }, + "S0672": { + "name": "Zox", + "type": "malware" + }, + "S0673": { + "name": "DarkWatchman", + "type": "malware" + }, + "S0674": { + "name": "CharmPower", + "type": "malware" + }, + "S0677": { + "name": "AADInternals", + "type": "tool" + }, + "S0678": { + "name": "Torisma", + "type": "malware" + }, + "S0679": { + "name": "Ferocious", + "type": "malware" + }, + "S0680": { + "name": "LitePower", + "type": "malware" + }, + "S0681": { + "name": "Lizar", + "type": "malware" + }, + "S0682": { + "name": "TrailBlazer", + "type": "malware" + }, + "S0683": { + "name": "Peirates", + "type": "tool" + }, + "S0684": { + "name": "ROADTools", + "type": "tool" + }, + "S0685": { + "name": "PowerPunch", + "type": "malware" + }, + "S0686": { + "name": "QuietSieve", + "type": "malware" + }, + "S0687": { + "name": "Cyclops Blink", + "type": "malware" + }, + "S0688": { + "name": "Meteor", + "type": "malware" + }, + "S0689": { + "name": "WhisperGate", + "type": "malware" + }, + "S0690": { + "name": "Green Lambert", + "type": "malware" + }, + "S0691": { + "name": "Neoichor", + "type": "malware" + }, + "S0692": { + "name": "SILENTTRINITY", + "type": "tool" + }, + "S0693": { + "name": "CaddyWiper", + "type": "malware" + }, + "S0694": { + "name": "DRATzarus", + "type": "malware" + }, + "S0695": { + "name": "Donut", + "type": "tool" + }, + "S0696": { + "name": "Flagpro", + "type": "malware" + }, + "S0697": { + "name": "HermeticWiper", + "type": "malware" + }, + "S0698": { + "name": "HermeticWizard", + "type": "malware" + }, + "S0699": { + "name": "Mythic", + "type": "tool" + }, + "S1010": { + "name": "VPNFilter", + "type": "malware" + }, + "S1011": { + "name": "Tarrask", + "type": "malware" + }, + "S1012": { + "name": "PowerLess", + "type": "malware" + }, + "S1013": { + "name": "ZxxZ", + "type": "malware" + }, + "S1014": { + "name": "DanBot", + "type": "malware" + }, + "S1015": { + "name": "Milan", + "type": "malware" + }, + "S1016": { + "name": "MacMa", + "type": "malware" + }, + "S1017": { + "name": "OutSteel", + "type": "malware" + }, + "S1018": { + "name": "Saint Bot", + "type": "malware" + }, + "S1019": { + "name": "Shark", + "type": "malware" + }, + "S1020": { + "name": "Kevin", + "type": "malware" + }, + "S1021": { + "name": "DnsSystem", + "type": "malware" + }, + "S1022": { + "name": "IceApple", + "type": "malware" + }, + "S1023": { + "name": "CreepyDrive", + "type": "malware" + }, + "S1024": { + "name": "CreepySnail", + "type": "malware" + }, + "S1025": { + "name": "Amadey", + "type": "malware" + }, + "S1026": { + "name": "Mongall", + "type": "malware" + }, + "S1027": { + "name": "Heyoka Backdoor", + "type": "malware" + }, + "S1028": { + "name": "Action RAT", + "type": "malware" + }, + "S1029": { + "name": "AuTo Stealer", + "type": "malware" + }, + "S1030": { + "name": "Squirrelwaffle", + "type": "malware" + }, + "S1031": { + "name": "PingPull", + "type": "malware" + }, + "S1032": { + "name": "PyDCrypt", + "type": "malware" + }, + "S1033": { + "name": "DCSrv", + "type": "malware" + }, + "S1034": { + "name": "StrifeWater", + "type": "malware" + }, + "S1035": { + "name": "Small Sieve", + "type": "malware" + }, + "S1037": { + "name": "STARWHALE", + "type": "malware" + }, + "S1039": { + "name": "Bumblebee", + "type": "malware" + }, + "S1040": { + "name": "Rclone", + "type": "tool" + }, + "S1041": { + "name": "Chinoxy", + "type": "malware" + }, + "S1042": { + "name": "SUGARDUMP", + "type": "malware" + }, + "S1043": { + "name": "ccf32", + "type": "malware" + }, + "S1044": { + "name": "FunnyDream", + "type": "malware" + }, + "S1046": { + "name": "PowGoop", + "type": "malware" + }, + "S1047": { + "name": "Mori", + "type": "malware" + }, + "S1048": { + "name": "macOS.OSAMiner", + "type": "malware" + }, + "S1049": { + "name": "SUGARUSH", + "type": "malware" + }, + "S1050": { + "name": "PcShare", + "type": "tool" + }, + "S1051": { + "name": "KEYPLUG", + "type": "malware" + }, + "S1052": { + "name": "DEADEYE", + "type": "malware" + }, + "S1053": { + "name": "AvosLocker", + "type": "malware" + }, + "S1058": { + "name": "Prestige", + "type": "malware" + }, + "S1059": { + "name": "metaMain", + "type": "malware" + }, + "S1060": { + "name": "Mafalda", + "type": "malware" + }, + "S1063": { + "name": "Brute Ratel C4", + "type": "tool" + }, + "S1064": { + "name": "SVCReady", + "type": "malware" + }, + "S1065": { + "name": "Woody RAT", + "type": "malware" + }, + "S1066": { + "name": "DarkTortilla", + "type": "malware" + }, + "S1068": { + "name": "BlackCat", + "type": "malware" + }, + "S1070": { + "name": "Black Basta", + "type": "malware" + }, + "S1071": { + "name": "Rubeus", + "type": "tool" + }, + "S1072": { + "name": "Industroyer2", + "type": "malware" + }, + "S1073": { + "name": "Royal", + "type": "malware" + }, + "S1074": { + "name": "ANDROMEDA", + "type": "malware" + }, + "S1075": { + "name": "KOPILUWAK", + "type": "malware" + }, + "S1076": { + "name": "QUIETCANARY", + "type": "malware" + }, + "S1078": { + "name": "RotaJakiro", + "type": "malware" + }, + "S1081": { + "name": "BADHATCH", + "type": "malware" + }, + "S1084": { + "name": "QUIETEXIT", + "type": "malware" + }, + "S1085": { + "name": "Sardonic", + "type": "malware" + }, + "S1086": { + "name": "Snip3", + "type": "malware" + }, + "S1087": { + "name": "AsyncRAT", + "type": "tool" + }, + "S1088": { + "name": "Disco", + "type": "malware" + }, + "S1089": { + "name": "SharpDisco", + "type": "malware" + }, + "S1090": { + "name": "NightClub", + "type": "malware" + }, + "S1091": { + "name": "Pacu", + "type": "tool" + }, + "S1096": { + "name": "Cheerscrypt", + "type": "malware" + }, + "S1097": { + "name": "HUI Loader", + "type": "malware" + }, + "S1099": { + "name": "Samurai", + "type": "malware" + }, + "S1100": { + "name": "Ninja", + "type": "malware" + }, + "S1101": { + "name": "LoFiSe", + "type": "malware" + }, + "S1102": { + "name": "Pcexter", + "type": "malware" + }, + "S1104": { + "name": "SLOWPULSE", + "type": "malware" + }, + "S1105": { + "name": "COATHANGER", + "type": "malware" + }, + "S1106": { + "name": "NGLite", + "type": "malware" + }, + "S1107": { + "name": "NKAbuse", + "type": "malware" + }, + "S1108": { + "name": "PULSECHECK", + "type": "malware" + }, + "S1109": { + "name": "PACEMAKER", + "type": "malware" + }, + "S1110": { + "name": "SLIGHTPULSE", + "type": "malware" + }, + "S1111": { + "name": "DarkGate", + "type": "malware" + }, + "S1112": { + "name": "STEADYPULSE", + "type": "malware" + }, + "S1113": { + "name": "RAPIDPULSE", + "type": "malware" + }, + "S1114": { + "name": "ZIPLINE", + "type": "malware" + }, + "S1115": { + "name": "WIREFIRE", + "type": "malware" + }, + "S1116": { + "name": "WARPWIRE", + "type": "malware" + }, + "S1117": { + "name": "GLASSTOKEN", + "type": "malware" + }, + "S1118": { + "name": "BUSHWALK", + "type": "malware" + }, + "S1119": { + "name": "LIGHTWIRE", + "type": "malware" + }, + "S1120": { + "name": "FRAMESTING", + "type": "malware" + }, + "S1121": { + "name": "LITTLELAMB.WOOLTEA", + "type": "malware" + }, + "S1122": { + "name": "Mispadu", + "type": "malware" + }, + "S1123": { + "name": "PITSTOP", + "type": "malware" + }, + "S1124": { + "name": "SocGholish", + "type": "malware" + }, + "S1125": { + "name": "AcidRain", + "type": "malware" + }, + "S1129": { + "name": "Akira", + "type": "malware" + }, + "S1130": { + "name": "Raspberry Robin", + "type": "malware" + }, + "S1131": { + "name": "NPPSPY", + "type": "tool" + }, + "S1132": { + "name": "IPsec Helper", + "type": "malware" + }, + "S1133": { + "name": "Apostle", + "type": "malware" + }, + "S1134": { + "name": "DEADWOOD", + "type": "malware" + }, + "S1135": { + "name": "MultiLayer Wiper", + "type": "malware" + }, + "S1136": { + "name": "BFG Agonizer", + "type": "malware" + }, + "S1137": { + "name": "Moneybird", + "type": "malware" + }, + "S1138": { + "name": "Gootloader", + "type": "malware" + }, + "S1139": { + "name": "INC Ransomware", + "type": "malware" + }, + "S1140": { + "name": "Spica", + "type": "malware" + }, + "S1141": { + "name": "LunarWeb", + "type": "malware" + }, + "S1142": { + "name": "LunarMail", + "type": "malware" + }, + "S1143": { + "name": "LunarLoader", + "type": "malware" + }, + "S1144": { + "name": "FRP", + "type": "tool" + }, + "S1145": { + "name": "Pikabot", + "type": "malware" + }, + "S1146": { + "name": "MgBot", + "type": "malware" + }, + "S1147": { + "name": "Nightdoor", + "type": "malware" + }, + "S1148": { + "name": "Raccoon Stealer", + "type": "malware" + }, + "S1149": { + "name": "CHIMNEYSWEEP", + "type": "malware" + }, + "S1150": { + "name": "ROADSWEEP", + "type": "malware" + }, + "S1151": { + "name": "ZeroCleare", + "type": "malware" + }, + "S1152": { + "name": "IMAPLoader", + "type": "malware" + }, + "S1153": { + "name": "Cuckoo Stealer", + "type": "malware" + }, + "S1154": { + "name": "VersaMem", + "type": "malware" + }, + "S1155": { + "name": "Covenant", + "type": "tool" + }, + "S1156": { + "name": "Manjusaka", + "type": "malware" + }, + "S1158": { + "name": "DUSTPAN", + "type": "malware" + }, + "S1159": { + "name": "DUSTTRAP", + "type": "malware" + }, + "S1160": { + "name": "Latrodectus", + "type": "malware" + }, + "S1161": { + "name": "BPFDoor", + "type": "malware" + }, + "S1162": { + "name": "Playcrypt", + "type": "malware" + }, + "S1163": { + "name": "SnappyTCP", + "type": "malware" + }, + "S1164": { + "name": "UPSTYLE", + "type": "malware" + }, + "S1166": { + "name": "Solar", + "type": "malware" + }, + "S1167": { + "name": "AcidPour", + "type": "malware" + }, + "S1168": { + "name": "SampleCheck5000", + "type": "malware" + }, + "S1169": { + "name": "Mango", + "type": "malware" + }, + "S1170": { + "name": "ODAgent", + "type": "malware" + }, + "S1171": { + "name": "OilCheck", + "type": "malware" + }, + "S1172": { + "name": "OilBooster", + "type": "malware" + }, + "S1173": { + "name": "PowerExchange", + "type": "malware" + }, + "S1176": { + "name": "attrib", + "type": "tool" + }, + "S1178": { + "name": "ShrinkLocker", + "type": "malware" + }, + "S1179": { + "name": "Exbyte", + "type": "malware" + }, + "S1180": { + "name": "BlackByte Ransomware", + "type": "malware" + }, + "S1181": { + "name": "BlackByte 2.0 Ransomware", + "type": "malware" + }, + "S1182": { + "name": "MagicRAT", + "type": "malware" + }, + "S1183": { + "name": "StrelaStealer", + "type": "malware" + }, + "S1184": { + "name": "BOLDMOVE", + "type": "malware" + }, + "S1185": { + "name": "LightSpy", + "type": "malware" + }, + "S1186": { + "name": "Line Dancer", + "type": "malware" + }, + "S1187": { + "name": "reGeorg", + "type": "malware" + }, + "S1188": { + "name": "Line Runner", + "type": "malware" + }, + "S1189": { + "name": "Neo-reGeorg", + "type": "malware" + }, + "S1190": { + "name": "Kapeka", + "type": "malware" + }, + "S1191": { + "name": "Megazord", + "type": "malware" + }, + "S1192": { + "name": "NICECURL", + "type": "malware" + }, + "S1193": { + "name": "TAMECAT", + "type": "malware" + }, + "S1194": { + "name": "Akira _v2", + "type": "malware" + }, + "S1196": { + "name": "Troll Stealer", + "type": "malware" + }, + "S1197": { + "name": "GoBear", + "type": "malware" + }, + "S1198": { + "name": "Gomir", + "type": "malware" + }, + "S1199": { + "name": "LockBit 2.0", + "type": "malware" + }, + "S1200": { + "name": "StealBit", + "type": "malware" + }, + "S1201": { + "name": "TRANSLATEXT", + "type": "malware" + }, + "S1202": { + "name": "LockBit 3.0", + "type": "malware" + }, + "S1203": { + "name": "J-magic", + "type": "malware" + }, + "S1204": { + "name": "cd00r", + "type": "malware" + }, + "S1205": { + "name": "cipher.exe", + "type": "tool" + }, + "S1206": { + "name": "JumbledPath", + "type": "malware" + }, + "S1207": { + "name": "XLoader", + "type": "malware" + }, + "S1209": { + "name": "Quick Assist", + "type": "tool" + }, + "S1210": { + "name": "Sagerunex", + "type": "malware" + }, + "S1211": { + "name": "Hannotog", + "type": "malware" + }, + "S1212": { + "name": "RansomHub", + "type": "malware" + }, + "S1213": { + "name": "Lumma Stealer", + "type": "malware" + }, + "S1217": { + "name": "VIRTUALPITA", + "type": "malware" + }, + "S1218": { + "name": "VIRTUALPIE", + "type": "malware" + }, + "S1219": { + "name": "REPTILE", + "type": "malware" + }, + "S1220": { + "name": "MEDUSA", + "type": "malware" + }, + "S1221": { + "name": "MOPSLED", + "type": "malware" + }, + "S1222": { + "name": "RIFLESPINE", + "type": "malware" + }, + "S1223": { + "name": "THINCRUST", + "type": "malware" + }, + "S1224": { + "name": "CASTLETAP", + "type": "malware" + }, + "S1226": { + "name": "BOOKWORM", + "type": "malware" + }, + "S1227": { + "name": "StarProxy", + "type": "malware" + }, + "S1228": { + "name": "PUBLOAD", + "type": "malware" + }, + "S1229": { + "name": "Havoc", + "type": "malware" + }, + "S1230": { + "name": "HIUPAN", + "type": "malware" + }, + "S1232": { + "name": "SplatDropper", + "type": "malware" + }, + "S1233": { + "name": "PAKLOG", + "type": "malware" + }, + "S1234": { + "name": "SplatCloak", + "type": "malware" + }, + "S1235": { + "name": "CorKLOG", + "type": "malware" + }, + "S1236": { + "name": "CLAIMLOADER", + "type": "malware" + }, + "S1237": { + "name": "CANONSTAGER", + "type": "malware" + }, + "S1238": { + "name": "STATICPLUGIN", + "type": "malware" + }, + "S1239": { + "name": "TONESHELL", + "type": "malware" + }, + "S1240": { + "name": "RedLine Stealer", + "type": "malware" + }, + "S1242": { + "name": "Qilin", + "type": "malware" + }, + "S1244": { + "name": "Medusa Ransomware", + "type": "malware" + }, + "S1245": { + "name": "InvisibleFerret", + "type": "malware" + }, + "S1246": { + "name": "BeaverTail", + "type": "malware" + }, + "S1247": { + "name": "Embargo", + "type": "malware" + }, + "S1248": { + "name": "XORIndex Loader", + "type": "malware" + }, + "S1249": { + "name": "HexEval Loader", + "type": "malware" + }, + "S9001": { + "name": "SystemBC", + "type": "malware" + }, + "S9002": { + "name": "Diskpart", + "type": "tool" + }, + "S9003": { + "name": "evilginx2", + "type": "tool" + }, + "S9004": { + "name": "Crocodilus", + "type": "malware" + }, + "S9007": { + "name": "HTTPTroy", + "type": "malware" + }, + "S9008": { + "name": "Shai-Hulud", + "type": "malware" + }, + "S9009": { + "name": "TruffleHog", + "type": "tool" + }, + "S9010": { + "name": "GlassWorm", + "type": "malware" + }, + "S9011": { + "name": "BRUSHFIRE", + "type": "malware" + }, + "S9012": { + "name": "TRAILBLAZE", + "type": "malware" + }, + "S9013": { + "name": "DRYHOOK", + "type": "malware" + }, + "S9014": { + "name": "PHASEJAM", + "type": "malware" + }, + "S9015": { + "name": "BRICKSTORM", + "type": "malware" + }, + "S9016": { + "name": "Caminho", + "type": "malware" + }, + "S9017": { + "name": "DCRAT", + "type": "tool" + }, + "S9018": { + "name": "HeartCrypt", + "type": "malware" + }, + "S9019": { + "name": "PureCrypter", + "type": "malware" + }, + "S9020": { + "name": "LODEINFO", + "type": "malware" + }, + "S9021": { + "name": "DOWNIISSA", + "type": "malware" + }, + "S9022": { + "name": "MirrorStealer", + "type": "malware" + }, + "S9023": { + "name": "HiddenFace", + "type": "malware" + }, + "S9024": { + "name": "SPAWNCHIMERA", + "type": "malware" + }, + "S9025": { + "name": "NOOPLDR", + "type": "malware" + }, + "S9026": { + "name": "ROAMINGHOUSE", + "type": "malware" + }, + "S9027": { + "name": "ANELLDR", + "type": "malware" + }, + "S9028": { + "name": "PHPsert", + "type": "malware" + }, + "S9029": { + "name": "IronWind", + "type": "malware" + }, + "S9030": { + "name": "SameCoin", + "type": "malware" + }, + "S9031": { + "name": "AshTag", + "type": "malware" + }, + "S9032": { + "name": "MuddyViper", + "type": "malware" + }, + "S9033": { + "name": "Fooder", + "type": "malware" + }, + "S9034": { + "name": "Tsundere Botnet", + "type": "malware" + }, + "S9035": { + "name": "LAMEHUG", + "type": "malware" + }, + "S9036": { + "name": "LP-Notes", + "type": "malware" + }, + "S9037": { + "name": "RustyWater", + "type": "malware" + }, + "S9038": { + "name": "DynoWiper", + "type": "malware" + }, + "S9039": { + "name": "LazyWiper", + "type": "malware" + }, + "S9041": { + "name": "TeamPCP Cloud Stealer", + "type": "malware" + }, + "S9042": { + "name": "CanisterWorm", + "type": "malware" + }, + "S9043": { + "name": "Mini Shai-Hulud", + "type": "malware" + }, + "S9044": { + "name": "Kali365", + "type": "malware" + } + } } } diff --git a/artifacts/scripts/apply_mappings_update.py b/artifacts/scripts/apply_mappings_update.py index a46e44f..31fa446 100644 --- a/artifacts/scripts/apply_mappings_update.py +++ b/artifacts/scripts/apply_mappings_update.py @@ -28,6 +28,11 @@ # Mapped from each rule's own scope. ATLAS ids use the short form already used # throughout this file (T0053 rather than AML.T0053). +# The OWASP values below are 2025 IDs - this script predates the 2026 remap +# (remap_owasp_2026.py). Every row is internally consistent with the 2025 list, +# so Langflow's LLM03 here is 2025 Supply Chain, which MAPPINGS now correctly +# shows as 2026 LLM04. It is kept as a record of the one-off update it made; do +# not re-run it, or it will write 2025 IDs back into a 2026 table. RULES = [ ("ai_agent_mcp_config_modification.yml", "T0081", "LLM06", "—"), ("ai_agent_spawning_shell.yml", "T0053", "LLM06", "—"), diff --git a/artifacts/scripts/build_site.py b/artifacts/scripts/build_site.py index 8c3073c..54a9bb5 100644 --- a/artifacts/scripts/build_site.py +++ b/artifacts/scripts/build_site.py @@ -31,6 +31,37 @@ sys.path.insert(0, str(Path(__file__).resolve().parent)) import data_sources import site_data # noqa: E402 (same-directory build helper) +import intel_graph # noqa: E402 +import site_intel # noqa: E402 +import site_scripts # noqa: E402 +import triage_spec # noqa: E402 + +VENDOR = Path(__file__).resolve().parent / "vendor" + + +def js_data(obj) -> str: + """JSON for a " anywhere in the corpus - a rule body, a case summary, + an indicator - would end the script element early and the page would render + as broken text. Escaping the slash is valid JSON and valid JS.""" + return json.dumps(obj, separators=(",", ":"), ensure_ascii=False).replace(" tuple[str, list[str]]: + """A vendored file's text, and any problem with its recorded provenance.""" + meta = json.loads((VENDOR / "VENDOR.json").read_text(encoding="utf-8")).get(name, {}) + path = VENDOR / name + if not path.exists(): + return "", [f"[VENDOR] {name} is missing"] + data = path.read_bytes() + import hashlib + problems = [] + if hashlib.sha256(data).hexdigest() != meta.get("sha256"): + problems.append(f"[VENDOR] {name} does not match the sha256 in vendor/VENDOR.json") + text = data.decode("utf-8") + if "Math.min(1000,Math.round(window.innerWidth*.92)); +function setDrawerW(px,save){ + const w=Math.max(360,Math.min(Math.round(px),Math.round(window.innerWidth*.92))); + document.documentElement.style.setProperty('--drawer-w',w+'px'); + if(save)try{localStorage.setItem(DW_KEY,String(w))}catch(e){} + syncGrip(); +} +function drawerW(){return $('#drawer').getBoundingClientRect().width} +function syncGrip(){ + const d=$('#drawer'),g=$('#dgrip');if(!g)return; + g.hidden=d.hidden; + if(!d.hidden)g.style.right=drawerW()+'px'; + const b=d.querySelector('.dwide'); + if(b)b.textContent=drawerW()>=DW_WIDE()-4?'narrow':'wider'; +} +(()=>{ + try{const w=parseInt(localStorage.getItem(DW_KEY)||'',10);if(w)setDrawerW(w,false)}catch(e){} + const g=document.createElement('div');g.id='dgrip';g.hidden=true; + g.setAttribute('role','separator');g.setAttribute('aria-orientation','vertical'); + g.setAttribute('aria-label','Resize panel');g.tabIndex=0; + document.body.appendChild(g); + g.onpointerdown=e=>{e.preventDefault();g.classList.add('drag');g.setPointerCapture(e.pointerId); + g.onpointermove=ev=>setDrawerW(window.innerWidth-ev.clientX,false); + g.onpointerup=()=>{g.classList.remove('drag');g.onpointermove=null;setDrawerW(drawerW(),true)}}; + g.onkeydown=e=>{if(e.key==='ArrowLeft'){setDrawerW(drawerW()+40,true)} + else if(e.key==='ArrowRight'){setDrawerW(drawerW()-40,true)}}; + new MutationObserver(()=>{ + const d=$('#drawer'),h=d.querySelector('.dhead'); + if(h&&!h.querySelector('.dwide')){ + const b=document.createElement('button');b.className='dwide';b.type='button'; + b.onclick=()=>setDrawerW(drawerW()>=DW_WIDE()-4?DW_DEFAULT:DW_WIDE(),true); + h.insertBefore(b,h.querySelector('.x')); + } + syncGrip(); + }).observe($('#drawer'),{childList:true,attributes:true,attributeFilter:['hidden']}); + window.addEventListener('resize',syncGrip); +})(); + /* ---------- clipboard ---------- */ function copy(text,btn){ const done=()=>{if(!btn)return;const old=btn.textContent;btn.textContent='copied'; @@ -1928,6 +2017,12 @@ def build_tools(entries, rows): ${(r.atlas.length||r.owasp.length)?`

Mapped techniques

${r.atlas.map(a=>`${esc(a)}`).join('')} ${r.owasp.map(o=>`${esc(o)}`).join('')}
`:''} + ${(()=>{const cs=CASES.filter(c=>(c.detections||[]).includes(r.file)); + const ac=INTEL.actors.filter(a=>a.derived.detections_by_technique.includes(r.file)||a.derived.detections_cited.includes(r.file)); + return (cs.length||ac.length)?`

Cited by

+ ${cs.length?`
${cs.map(c=>``).join('')}
`:''} + ${ac.length?`
${ac.map(a=>``).join('')}
`:''} +

Actors listed use a technique this rule detects, or a case about them cites it.

`:''})()} ${r.falsepositives.length?`

False positives

    ${r.falsepositives.map(f=>`
  • ${esc(f)}
  • `).join('')}
`:''}

Detection logic @@ -1992,6 +2087,9 @@ def build_tools(entries, rows): ${t.guidance?`

${esc(t.guidance)}

`:''}

${t.abuse?`

Abuse potential

${esc(t.abuse)}
`:''} + ${(()=>{const ac=INTEL.actors.filter(a=>a.derived.tools.includes(t.entry_id)); + return ac.length?`

Reported used or targeted by ${ac.length}

+
${ac.map(a=>``).join('')}
`:''})()} ${cs.length?`

Documented incidents ${cs.length}

${cs.map(c=>``).join('')}
`:''} ${(t.techniques||[]).length?`

Mapped techniques

@@ -2038,6 +2136,7 @@ def build_tools(entries, rows): if(bVol)bVol.onclick=()=>addRows(r=>r.vol&&r.vol!=='stable',bVol); $('#dPickAll').onclick=()=>addRows(()=>true,$('#dPickAll')); $$('#drawer .clsrow').forEach(b=>b.onclick=()=>drill(b.dataset.cls)); + wireIntelLinks('#drawer'); $$('#drawer .caselink').forEach(b=>b.onclick=()=>{ pushNav();closeDrawer();view='cases';update(); const el=document.getElementById('cs-'+b.dataset.cs); @@ -2072,6 +2171,7 @@ def build_tools(entries, rows): $('#growBtn').onclick=()=>{codeGrow=!codeGrow;sync()}; sync(); wireTechChips(); + wireIntelLinks('#drawer'); } function wireTechChips(){ $$('#drawer .tchip[data-tech],#drawer .tchip[data-owasp]').forEach(c=>c.onclick=()=>{ @@ -2242,9 +2342,10 @@ def build_tools(entries, rows): .map(k=>({kind:k,items:by[k]})); } function caseStudiesHTML(){ - if(!CASES.length)return`
No case studies.
`; + const LIST=caseOnly?CASES.filter(c=>caseOnly.has(c.id)):CASES; + if(!LIST.length)return`
No case studies.
`; const byConf={}; - for(const c of CASES){const k=c.confidence||'unrated'; byConf[k]=(byConf[k]||0)+1} + for(const c of LIST){const k=c.confidence||'unrated'; byConf[k]=(byConf[k]||0)+1} const tally=['high','medium','low','unrated'].filter(k=>byConf[k]) .map(k=>`${byConf[k]} ${k}`).join(' · '); return `

Case studies

@@ -2252,10 +2353,11 @@ def build_tools(entries, rows): catalog, with the indicators each left behind and what responders did about it. Every case records where its claims came from, because several of these rest on a single reporting party.

-

Provenance: ${esc(tally)}

+

Provenance: ${esc(tally)}

+ ${caseOnly?``:''}
`+ - CASES.map(c=>{ + LIST.map(c=>{ const groups=iocGroups(c.iocs||[]); const n=(c.iocs||[]).length; // The affected tool is a link when the catalog knows it, because the useful @@ -2296,6 +2398,13 @@ def build_tools(entries, rows): ${c.basis?`${esc(c.basis)}`:''}
`:''} ${c.contested?`
Disputed. ${esc(c.contested)}
`:''} + ${(c.actors||[]).length?`
Attributed to ${c.actors.map(l=> + ` + ${confBadge(l.link_confidence)} ${esc(l.attributed_by)}${ + l.stated_confidence?': '+esc(l.stated_confidence):''}`).join(' ')}
`:''} + ${(c.victims&&((c.victims.sectors||[]).length||(c.victims.countries||[]).length))?`
Victims + ${esc([...(c.victims.sectors||[]),...(c.victims.countries||[])].join(' · '))}${ + c.victims.org_count?` · ${esc(c.victims.org_count.qualifier)} ${c.victims.org_count.value} organisations`:''}
`:''}

Indicators ${n}

@@ -2309,7 +2418,8 @@ def build_tools(entries, rows):

Response

${(c.response_actions||[]).length?`
    ${c.response_actions.map(a=> - `
  1. ${esc(a)}
  2. `).join('')}
`:`

None recorded.

`} + `
  • ${a.phase?`${esc(a.phase)} `:''}${ + esc(a.action)}
  • `).join('')}`:`

    None recorded.

    `}
    ${c.lesson?`
    Lesson. ${esc(c.lesson)}
    `:''} @@ -2473,6 +2583,8 @@ def build_tools(entries, rows): }; renderTabs();renderToast();renderBack();return; } + if(view==='intel'){renderIntel();renderTabs();renderToast();renderBack();return} + if(view==='graph'){renderGraph();renderTabs();renderToast();renderBack();return} if(view==='guide'){ main.innerHTML=guideHTML(); // Prefix rendered heading ids so guide anchors never collide with row anchors. @@ -2508,6 +2620,8 @@ def build_tools(entries, rows): if(pa)pa.onclick=e=>{e.stopPropagation();togglePickAll(e.currentTarget)}; }else if(view==='cases'){ main.innerHTML=caseStudiesHTML(); + $$('#main .csactor').forEach(b=>b.onclick=e=>{e.preventDefault();openActorDrawer(b.dataset.actor,b)}); + const co=$('#csOnly');if(co)co.onclick=()=>{caseOnly=null;renderMain()}; $$('#main .csjump').forEach(b=>b.onclick=()=>{ pushNav();resetFilters();filters.tool=[b.dataset.t];view='catalog'; history.replaceState(null,'','#'+b.dataset.id); @@ -2535,7 +2649,8 @@ def build_tools(entries, rows): // deliberate move rather than the only thing a click can do. $$('#main .tool').forEach(c=>c.onclick=()=>openToolDrawer(c.dataset.id,c)); }else{ - main.innerHTML=planHTML(); + main.innerHTML=planHTML()+triageHTML(); + wireTriage(); const l=$('#cpLinks'),p=$('#cpList'); if(l)l.onclick=()=>copy(planLinks(),l); if(p)p.onclick=()=>copy(planText(),p); @@ -2626,6 +2741,13 @@ def build_tools(entries, rows): function applyHash(){ const h=decodeURIComponent(location.hash.slice(1)); if(!h)return; + if(h.startsWith('actor/')){ + const id=h.slice(6); + if(ACTORMAP[id]){view='intel';update();openActorDrawer(id,null)} + return; + } + if(h==='intel'){view='intel';update();return} + if(h==='graph'||h.startsWith('graph/')){view='graph';update();return} if(h.startsWith('rule/')){ const f=h.slice(5); if(RULEMAP[f]||RULEFILE[f]){view='rules';update();openRuleDrawer(f,null)} @@ -2907,6 +3029,20 @@ def main(): entries = json.loads((API / "catalog.json").read_text(encoding="utf-8")) rows = build_rows(entries) tools = build_tools(entries, rows) + # How the script builder collects each row, decided once in Python next to + # the KAPE and Velociraptor exporters rather than re-derived in the browser. + for r in rows: + r["spec"] = triage_spec.spec(r) + # Which framework definitions exist for a tool, by file rather than by + # naming convention, so the page never offers a target the feed lacks. + import export_velociraptor + for t, e in zip(tools, entries): + name = export_velociraptor.artifact_name(e) + if (API / "velociraptor" / f"{name}.yaml").exists(): + t["velo"] = name + kape = name.replace("Custom.AIAgents.", "") + if (API / "kape" / f"{kape}.tkape").exists(): + t["kape"] = kape # Everything outside the catalog proper: rules, indexes, case studies, guide. mapping_rows, atlas_index, owasp_index = site_data.load_mappings() @@ -2914,6 +3050,27 @@ def main(): cases = site_data.load_case_studies() guide = site_data.load_guide() + # The threat-intel layer, built from the same rows and rules the page shows. + isrc = intel_graph.load_sources(entries=entries, rows=rows, rules=rules) + intel_problems = intel_graph.check(isrc) + intel = intel_graph.build(isrc) + pin = isrc["pin"] + site_intel_data = { + "stats": intel["stats"], + "analytics": intel["analytics"], + "actors": [{**a, "derived": {**a["derived"], + "collect": [c["anchor"] for c in a["derived"]["collect"]]}} + for a in intel["actors"]], + "atlas": {"release": pin["atlas"]["release"], "tactic_order": pin["atlas"]["tactic_order"], + "tactics": pin["atlas"]["tactics"], "techniques": pin["atlas"]["techniques"], + "technique_tactics": pin["atlas"]["technique_tactics"]}, + "asi": {k: v["title"] for k, v in isrc["owasp"]["agentic_2026"]["items"].items()}, + "region_of": {c: r for r, cs in isrc["vocab"]["regions"].items() for c in cs}, + "atomic_types": sorted(intel_graph.ATOMIC_IOC), + "off_host_tactics": sorted(intel_graph.OFF_HOST_TACTICS), + } + cyto_js, vendor_problems = vendored("cytoscape.min.js") + # Coverage is computed, never authored. audit() is also a hard gate in # validate.py; running it here too means a stale source table cannot reach # the deployed page even if somebody skips the validator. @@ -2923,7 +3080,7 @@ def main(): if "--check" in sys.argv: return 1 if check(rows, tools, rules, guide, cases, - data_sources.audit(cov)) else 0 + data_sources.audit(cov) + intel_problems + vendor_problems) else 0 n_cred = sum(1 for r in rows if r["cls"] == "credential") n_mcp = sum(1 for r in rows if r["cls"] == "mcp-config") @@ -2955,7 +3112,7 @@ def main(): - + @@ -2979,6 +3136,8 @@ def main(): + + @@ -3038,19 +3197,25 @@ def main(): + """ diff --git a/artifacts/scripts/cve_status.py b/artifacts/scripts/cve_status.py new file mode 100644 index 0000000..7f31b0f --- /dev/null +++ b/artifacts/scripts/cve_status.py @@ -0,0 +1,162 @@ +#!/usr/bin/env python3 +"""Pin the CISA KEV status of every CVE the repository cites, and gate the prose. + + python scripts/cve_status.py # gate, writes nothing + python scripts/cve_status.py --check # same, explicit + python scripts/cve_status.py --refresh # re-pin schema/cve-status.json (network) + python scripts/cve_status.py --refresh --kev-file known_exploited_vulnerabilities.json + +"On CISA KEV" is a claim a responder acts on - it moves a finding up the queue +and it is the first thing a manager asks. The repository made it about Ray +CVE-2023-48022 in a rule header while the investigation guide said, correctly, +that the CVE is not in the catalog. Two files disagreeing about a public list is +a defect the list itself can settle, so this pins the list and checks the text +against it, the same way validate_techniques.py pins ATLAS and ATT&CK. + +Same shape as that script: validation is offline against a vendored pin, and +--refresh is the only thing that touches the network, so a KEV addition shows +up in review as a diff rather than silently changing what CI enforces. + +The gate fails when: + - a CVE is cited anywhere and is missing from the pin (run --refresh) + - a line says a CVE is on CISA KEV and the pin says it is not +It does not fail on a KEV-listed CVE that nobody calls KEV - that is an +omission, reported, not a false statement. +""" +from __future__ import annotations + +import argparse +import json +import re +import sys +import urllib.request +from datetime import date +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +REPO = ROOT.parent +PINNED = ROOT / "schema" / "cve-status.json" +KEV_URL = ("https://www.cisa.gov/sites/default/files/feeds/" + "known_exploited_vulnerabilities.json") + +CVE = re.compile(r"\bCVE-\d{4}-\d{4,7}\b") +# "CISA KEV", "KEV-listed", "on the KEV catalog". VulnCheck runs its own KEV +# list, and a line that names it is talking about that list, not CISA's. +KEV_CLAIM = re.compile(r"\bKEV\b") +NOT_CISA = re.compile(r"VulnCheck|not (?:in|on)|does not appear|isn't|is not", re.I) + +SURFACES = ["MAPPINGS.md", "README.md", "playbooks/*.json", "0[0-9]-*/*", + "artifacts/detections/**/*", "artifacts/catalog/*.yml", + "artifacts/case-studies/*.yml", "artifacts/intel/**/*.yml", + "docs/*.md", "artifacts/README.md"] + + +def lines(): + seen = set() + for pattern in SURFACES: + for f in sorted(REPO.glob(pattern)): + if f in seen or not f.is_file(): + continue + seen.add(f) + try: + text = f.read_text(encoding="utf-8") + except UnicodeDecodeError: + continue + for n, line in enumerate(text.splitlines(), 1): + yield f.relative_to(REPO), n, line + + +def claimed(line: str, at: int, above: str = "") -> str | None: + """The CVE a KEV token on this line is about: the nearest one before it. + + "CVE-2025-3248 (CISA KEV), CVE-2026-5027" makes a claim about the first CVE + only. Reading every CVE on the line as claimed flagged the second as a false + KEV statement, which it is not. + """ + before = [m for m in CVE.finditer(line) if m.end() <= at] + if before: + return before[-1].group(0) + earlier = CVE.findall(above) + if earlier: + return earlier[-1] + after = CVE.search(line, at) + return after.group(0) if after else None + + +def cited() -> set[str]: + return {c for _, _, line in lines() for c in CVE.findall(line)} + + +def refresh(kev_file: Path | None) -> dict: + if kev_file: + kev = json.loads(kev_file.read_text(encoding="utf-8")) + else: + with urllib.request.urlopen(KEV_URL, timeout=120) as r: + kev = json.loads(r.read()) + listed = {v["cveID"]: v for v in kev.get("vulnerabilities", [])} + out = {} + for c in sorted(cited()): + v = listed.get(c) + out[c] = ({"cisa_kev": True, "date_added": v.get("dateAdded", ""), + "vendor": v.get("vendorProject", ""), "product": v.get("product", ""), + "ransomware": v.get("knownRansomwareCampaignUse", "")} + if v else {"cisa_kev": False}) + return { + "_comment": "Generated by scripts/cve_status.py --refresh. Do not hand-edit.", + "retrieved": date.today().isoformat(), + "source": KEV_URL, + "catalog_version": kev.get("catalogVersion", ""), + "cves": out, + } + + +def check() -> list[str]: + if not PINNED.exists(): + return [f"{PINNED.relative_to(ROOT)} is missing - run --refresh"] + pin = json.loads(PINNED.read_text(encoding="utf-8"))["cves"] + problems = [] + for c in sorted(cited() - set(pin)): + problems.append(f"{c} is cited but not pinned - run cve_status.py --refresh") + # A KEV token is about the nearest CVE before it - on the same line, or on + # the lines just above when the sentence wraps (the Ray rule said "KEV-listed + # by CISA" five lines below the CVE it meant). Only when nothing precedes it + # does the nearest CVE after it on the same line count. + by_file: dict[Path, list[tuple[int, str]]] = {} + for rel, n, line in lines(): + by_file.setdefault(rel, []).append((n, line)) + for rel, rows in by_file.items(): + for i, (n, line) in enumerate(rows): + if NOT_CISA.search(line): + continue + for k in KEV_CLAIM.finditer(line): + c = claimed(line, k.start(), " ".join(l for _, l in rows[max(0, i - 8):i])) + if c and c in pin and not pin[c]["cisa_kev"]: + problems.append(f"{rel}:{n}: says {c} is on CISA KEV; the pinned " + f"catalog does not list it") + return sorted(set(problems)) + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--check", action="store_true") + ap.add_argument("--refresh", action="store_true") + ap.add_argument("--kev-file", type=Path, + help="read the KEV JSON from a local copy (e.g. a cisagov/kev-data clone)") + args = ap.parse_args() + if args.refresh: + data = refresh(args.kev_file) + with open(PINNED, "w", encoding="utf-8", newline="\n") as fh: + fh.write(json.dumps(data, indent=2, ensure_ascii=False) + "\n") + n = sum(1 for v in data["cves"].values() if v["cisa_kev"]) + print(f"pinned {len(data['cves'])} cited CVEs, {n} on CISA KEV " + f"(catalog {data['catalog_version']})") + return 0 + problems = check() + for p in problems: + print(f"[KEV] {p}") + print(f"\n{len(problems)} problem(s).") + return 1 if problems else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/artifacts/scripts/forbidden_terms.py b/artifacts/scripts/forbidden_terms.py new file mode 100644 index 0000000..eb18ce1 --- /dev/null +++ b/artifacts/scripts/forbidden_terms.py @@ -0,0 +1,55 @@ +#!/usr/bin/env python3 +"""Fail if any tracked file contains a term the project does not publish. + + FORBIDDEN_TERMS="term one,term two" python scripts/forbidden_terms.py + +The terms come from the environment - in CI, a repository secret - and are +never committed, and this script never prints them: a finding reports the file +and line and how many terms matched, nothing more. With the variable unset it +passes and says so, so a fork or a local run without the secret is not blocked. + +Why a secret rather than a list in the repo: the point is that certain names do +not appear here, and a committed denylist would be the one file that names them. +Third-party reference data (ATT&CK alias lists, ATLAS case-study credits) is the +usual way such a name arrives, which is why every pin refresh is also checked by +refresh_guard.py against the same secret. +""" +from __future__ import annotations + +import os +import re +import subprocess +import sys +from pathlib import Path + +REPO = Path(__file__).resolve().parent.parent.parent + + +def main() -> int: + terms = [t.strip() for t in os.environ.get("FORBIDDEN_TERMS", "").split(",") if t.strip()] + if not terms: + print("FORBIDDEN_TERMS not set - skipped") + return 0 + pats = [re.compile(r"(? technique -> rule that detects it + -> catalogued tool it abused -> artifact rows to collect + +which answers, for a named adversary: what to hunt, with which rule, and what to +pull off the host, in volatility order. +""" +from __future__ import annotations + +import argparse +import csv +import glob +import io +import json +import re +import sys +import uuid +from pathlib import Path + +import yaml + +HERE = Path(__file__).resolve().parent +ROOT = HERE.parent +REPO = ROOT.parent +API = ROOT / "docs" / "api" +SCHEMA = ROOT / "schema" +sys.path.insert(0, str(HERE)) + +NS = uuid.uuid5(uuid.NAMESPACE_URL, "https://github.com/depalmar/ai-dfir-toolkit") + +# Indicator types that name one concrete thing a tool can match on. The rest - +# behaviour, pattern, config - are descriptions of what to look for, and making +# them graph nodes would join unrelated incidents on the word "behavior". +ATOMIC_IOC = {"file", "directory", "binary", "process", "commit", "domain", "ip", + "url", "hash", "email", "package", "account", "mutex"} + +VOL_RANK = {"live": 0, "rotating": 1, "stable": 2} + +# ATLAS tactics that happen on the adversary's side of the wire: building +# capability, staging, researching. A technique confined to these leaves nothing +# on a defended host, so "no rule" there is a fact about telemetry, not a gap in +# this repository's content. Reported apart from real gaps so the coverage +# number does not ask for rules nobody could write. +OFF_HOST_TACTICS = {"AML.TA0001", "AML.TA0002", "AML.TA0003"} +FV_RANK = {"high": 0, "medium": 1, "low": 2, "": 3} + + +# --------------------------------------------------------------------------- load + +def _yaml_files(pattern: str) -> list[tuple[Path, dict]]: + out = [] + for f in sorted(glob.glob(str(pattern))): + out.append((Path(f), yaml.safe_load(Path(f).read_text(encoding="utf-8")) or {})) + return out + + +def load_sources(entries=None, rows=None, rules=None) -> dict: + """Everything the graph is built from, in one dict. Import-light on purpose: + build_site imports this module, so it must not import build_site at load - + and build_site passes the entries, rows and rules it already built, so the + page and the feeds are derived from one pass rather than two.""" + import site_data + if entries is None: + entries = [d for _, d in _yaml_files(ROOT / "catalog" / "*.yml")] + if rows is None: + import build_site + rows = build_site.build_rows(entries) + if rules is None: + mapping_rows, _, _ = site_data.load_mappings() + rules = site_data.load_rules(mapping_rows) + return { + "entries": entries, + "rows": rows, + "rules": rules, + "cases_raw": _yaml_files(ROOT / "case-studies" / "*.yml"), + "actors_raw": _yaml_files(ROOT / "intel" / "actors" / "*.yml"), + "pin": json.loads((SCHEMA / "technique-ids.json").read_text(encoding="utf-8")), + "owasp": json.loads((SCHEMA / "owasp.json").read_text(encoding="utf-8")), + "vocab": json.loads((SCHEMA / "intel-vocab.json").read_text(encoding="utf-8")), + } + + +# -------------------------------------------------------------------------- check + +def _validator(name: str): + from jsonschema import Draft202012Validator + from referencing import Registry, Resource + reg = Registry() + for n in ("intel-vocab.json", "case-study.schema.json", "actor.schema.json"): + doc = json.loads((SCHEMA / n).read_text(encoding="utf-8")) + reg = reg.with_resource(n, Resource.from_contents(doc)) + schema = json.loads((SCHEMA / name).read_text(encoding="utf-8")) + return Draft202012Validator(schema, registry=reg) + + +def check(src: dict) -> list[str]: + """Every way the intel files can be wrong without a schema noticing.""" + problems: list[str] = [] + case_v, actor_v = _validator("case-study.schema.json"), _validator("actor.schema.json") + tool_ids = {e["id"] for e in src["entries"]} + rule_files = {r["file"] for r in src["rules"]} + + actor_ids: dict[str, str] = {} + for path, a in src["actors_raw"]: + for err in sorted(actor_v.iter_errors(a), key=lambda e: list(e.path)): + loc = ".".join(str(p) for p in err.absolute_path) or "(root)" + problems.append(f"[ACTOR] {path.name}: {loc}: {err.message}") + aid = a.get("id", "") + # The file name carries the id, like the case studies, so a renumber + # shows up as a rename in review instead of an edit inside a file. + if aid and path.stem != aid.lower(): + problems.append(f"[ACTOR] {path.name}: id {aid} does not match the file name") + if aid in actor_ids: + problems.append(f"[ACTOR] {aid} is used by {actor_ids[aid]} and {path.name}") + actor_ids[aid] = path.name + for t in a.get("abuses") or []: + if t not in tool_ids: + problems.append(f"[ACTOR] {aid}: abuses {t}, which is not a catalog entry") + for s in a.get("sightings") or []: + for t in s.get("abuses") or []: + if t not in tool_ids: + problems.append(f"[ACTOR] {aid}: sighting abuses {t}, not a catalog entry") + + linked: dict[str, list[dict]] = {} + for path, c in src["cases_raw"]: + for err in sorted(case_v.iter_errors(c), key=lambda e: list(e.path)): + loc = ".".join(str(p) for p in err.absolute_path) or "(root)" + problems.append(f"[CASE] {path.name}: {loc}: {err.message}") + cid = c.get("id", path.stem) + if path.stem != str(cid).lower(): + problems.append(f"[CASE] {path.name}: id {cid} does not match the file name") + for link in c.get("actors") or []: + ref = link.get("ref") + if ref not in actor_ids: + problems.append(f"[CASE] {cid}: actor {ref} has no profile in intel/actors/") + linked.setdefault(ref, []).append(link) + # Same honesty rule as the catalog: a low link must say so. + if link.get("link_confidence") == "low" and not link.get("unverified"): + problems.append(f"[CASE] {cid}: low-confidence link to {ref} must carry " + f"unverified: true") + for d in c.get("detections") or []: + if d not in rule_files: + problems.append(f"[CASE] {cid}: cites {d}, which is not a rule in this repo") + + # A profile rated high cannot rest on links that are all weaker than that. + for path, a in src["actors_raw"]: + if a.get("confidence") == "high": + links = linked.get(a.get("id"), []) + if links and all(l.get("link_confidence") == "low" for l in links): + problems.append(f"[ACTOR] {a['id']}: rated high, but every case link is low") + # An actor with no case and no sighting is a name, not intelligence. + if not linked.get(a.get("id")) and not (a.get("sightings") or []): + problems.append(f"[ACTOR] {a.get('id')}: no case study cites it and it has no " + f"sightings - there is nothing to derive a profile from") + return problems + + +# -------------------------------------------------------------------------- build + +def _atlas_parent(t: str) -> str: + parent, _, sub = t.rpartition(".") + return parent if len(sub) == 3 and sub.isdigit() else t + + +def _quarter(date: str) -> str: + m = re.match(r"(\d{4})-(\d{2})", date or "") + return f"{m.group(1)}-Q{(int(m.group(2)) - 1) // 3 + 1}" if m else "" + + +def build(src: dict) -> dict: + """Actors with derived fields, cases, the entity graph, and stats.""" + pin, owasp, vocab = src["pin"], src["owasp"], src["vocab"] + atlas = pin["atlas"] + tools = {e["id"]: e for e in src["entries"]} + rows_by_tool: dict[str, list[dict]] = {} + for r in src["rows"]: + rows_by_tool.setdefault(r["entry_id"], []).append(r) + region_of = {c: reg for reg, cs in vocab["regions"].items() for c in cs} + + # Rules that detect a technique, exact or through the parent. A rule tagged + # T0051 does detect T0051.000 in the sense that matters here - it fires on + # the class - so a sub-technique counts as covered by its parent's rule. + rules_for: dict[str, set[str]] = {} + for r in src["rules"]: + for t in r.get("atlas", []): + rules_for.setdefault(t, set()).add(r["file"]) + + def detecting(t: str) -> set[str]: + return rules_for.get(t, set()) | rules_for.get(_atlas_parent(t), set()) + + cases = [] + for _, c in src["cases_raw"]: + affects = c.get("affects") + affects = affects if isinstance(affects, list) else [affects or ""] + cases.append({**c, "affects_ids": sorted({i for a in affects + for i in re.findall(r"AIRT-\d{4}", str(a))})}) + + actors = [] + for _, a in src["actors_raw"]: + aid = a["id"] + mine = [c for c in cases if any(l.get("ref") == aid for l in c.get("actors") or [])] + sightings = a.get("sightings") or [] + techs = sorted({t for c in mine for t in c.get("atlas") or []} + | {t for s in sightings for t in s.get("atlas") or []}) + attack_t = sorted({t for c in mine for t in c.get("attack") or []} + | {t for s in sightings for t in s.get("attack") or []}) + asi = sorted({x for c in mine for x in c.get("owasp_agentic") or []} + | {x for s in sightings for x in s.get("owasp_agentic") or []}) + victims = [c.get("victims") or {} for c in mine] + [s.get("victims") or {} for s in sightings] + sectors = sorted({x for v in victims for x in v.get("sectors") or []}) + countries = sorted({x for v in victims for x in v.get("countries") or []}) + dates = sorted([str(c.get("disclosed")) for c in mine if c.get("disclosed")] + + [str(s["date"]) for s in sightings]) + abused = sorted(set(a.get("abuses") or []) + | {t for c in mine for t in c["affects_ids"]} + | {t for s in sightings for t in s.get("abuses") or []}) + cited = sorted({d for c in mine for d in c.get("detections") or []}) + hunt = [] + for t in techs: + tac = atlas["technique_tactics"].get(t, []) + hunt.append({"technique": t, "name": atlas["techniques"].get(t, ""), + "tactics": tac, "rules": sorted(detecting(t)), + "off_host": bool(tac) and set(tac) <= OFF_HOST_TACTICS}) + # What to pull off a host, for the tools this actor is reported to have + # used or targeted: live first, then rotating, then stable, and within a + # tier the high-value rows first - the collection order the catalog + # already recommends, filtered to this adversary. + collect = sorted( + ({"anchor": r["anchor"], "tool": r["tool"], "entry_id": r["entry_id"], + "cls": r["cls"], "artifact": r["artifact"], "vol": r["vol"], + "forensic_value": r["forensic_value"]} + for t in abused for r in rows_by_tool.get(t, [])), + key=lambda r: (VOL_RANK.get(r["vol"], 9), FV_RANK.get(r["forensic_value"], 9), + r["entry_id"], r["anchor"])) + recovery = [{"case": c["id"], **(ra if isinstance(ra, dict) else {"phase": "", "action": ra})} + for c in mine for ra in c.get("response_actions") or []] + actors.append({ + **{k: a[k] for k in a}, + "cases": [c["id"] for c in mine], + "links": [{"case": c["id"], **l} for c in mine for l in c.get("actors") or [] + if l.get("ref") == aid], + "derived": { + "techniques": techs, "attack": attack_t, "owasp_agentic": asi, + "tactics": sorted({ta for t in techs for ta in atlas["technique_tactics"].get(t, [])}), + "sectors": sectors, "countries": countries, + "regions": sorted({region_of[c] for c in countries if c in region_of}), + "first_seen": dates[0] if dates else "", "last_seen": dates[-1] if dates else "", + "tools": abused, + "iocs": [{**i, "case": c["id"]} for c in mine for i in c.get("iocs") or []], + "detections_cited": cited, + "detections_by_technique": sorted({r for h in hunt for r in h["rules"]}), + "gaps": [h["technique"] for h in hunt if not h["rules"] and not h["off_host"]], + "off_host": [h["technique"] for h in hunt if not h["rules"] and h["off_host"]], + "hunt": hunt, "collect": collect, "recovery": recovery, + }, + }) + + graph = _graph(actors, cases, src, tools, rows_by_tool, rules_for, region_of) + stats = _stats(actors, cases, atlas, rules_for) + out = {"actors": actors, "cases": cases, "graph": graph, "stats": stats, + "atlas": {"release": atlas["release"], "tactic_order": atlas["tactic_order"], + "tactics": atlas["tactics"]}} + out["analytics"] = analytics(out, atlas) + return out + + +def _graph(actors, cases, src, tools, rows_by_tool, rules_for, region_of): + nodes: dict[str, dict] = {} + edges: set[tuple] = set() + atlas = src["pin"]["atlas"] + attack = src["pin"]["attack"] + asi_items = src["owasp"]["agentic_2026"]["items"] + + def node(nid, ntype, label, **extra): + if nid not in nodes: + nodes[nid] = {"id": nid, "type": ntype, "label": label, **extra} + return nid + + def edge(a, b, rel, **extra): + edges.add((a, b, rel, json.dumps(extra, sort_keys=True) if extra else "")) + + def tech(t): + if t.startswith("AML."): + n = node(f"atlas:{t}", "technique", f"{t} {atlas['techniques'].get(t, '')}".strip(), + framework="ATLAS") + for ta in atlas["technique_tactics"].get(t, []): + edge(n, node(f"tactic:{ta}", "tactic", f"{ta} {atlas['tactics'].get(ta, '')}"), + "in-tactic") + return n + return node(f"attack:{t}", "technique", f"{t} {attack['techniques'].get(t, '')}".strip(), + framework="ATT&CK") + + def place(v, owner): + for s in v.get("sectors") or []: + edge(owner, node(f"sector:{s}", "sector", s), "targets") + for c in v.get("countries") or []: + cn = node(f"country:{c}", "country", c) + edge(owner, cn, "targets") + if c in region_of: + edge(cn, node(f"region:{region_of[c]}", "region", region_of[c]), "in-region") + + def tool(t): + e = tools[t] + n = node(f"tool:{t}", "tool", e["name"], entry_id=t) + for r in rows_by_tool.get(t, []): + edge(n, node(f"artifact:{r['anchor']}", "artifact", r["artifact"][:80], + anchor=r["anchor"], cls=r["cls"], vol=r["vol"]), "leaves") + return n + + rule_nodes = set() + + def rule(f): + rule_nodes.add(f) + return node(f"rule:{f}", "rule", f) + + for a in actors: + an = node(f"actor:{a['id']}", "actor", a["name"], actor_id=a["id"], actor_kind=a["kind"]) + for s in a.get("sightings") or []: + for t in s.get("atlas") or []: + edge(an, tech(t), "uses") + for t in s.get("attack") or []: + edge(an, tech(t), "uses") + for x in s.get("owasp_agentic") or []: + edge(an, node(f"asi:{x}", "asi", f"{x} {asi_items[x]['title']}"), "maps-to") + for t in s.get("abuses") or []: + edge(an, tool(t), "abuses") + place(s.get("victims") or {}, an) + for t in a.get("abuses") or []: + edge(an, tool(t), "abuses") + for m in a.get("malware") or []: + edge(an, node(f"malware:{m.lower()}", "malware", m), "uses") + for g in (a.get("external_ids") or {}).get("attack_group") or []: + edge(an, node(f"group:{g}", "attack-group", + f"{g} {attack['groups'].get(g, {}).get('name', '')}".strip()), "same-as") + + for c in cases: + cn = node(f"case:{c['id']}", "case", c["title"], case_id=c["id"], + confidence=c.get("confidence", "")) + for l in c.get("actors") or []: + edge(f"actor:{l['ref']}", cn, "attributed-to", confidence=l.get("link_confidence", "")) + for t in (c.get("atlas") or []) + (c.get("attack") or []): + edge(cn, tech(t), "uses") + for x in c.get("owasp_agentic") or []: + edge(cn, node(f"asi:{x}", "asi", f"{x} {asi_items[x]['title']}"), "maps-to") + for t in c["affects_ids"]: + if t in tools: + edge(cn, tool(t), "affects") + for d in c.get("detections") or []: + edge(cn, rule(d), "detected-by") + for i in c.get("iocs") or []: + if i.get("type") == "malware": + edge(cn, node(f"malware:{i['value'].lower()}", "malware", i["value"]), "uses") + elif i.get("type") in ATOMIC_IOC: + edge(cn, node(f"ioc:{i['type']}:{i['value']}", "ioc", i["value"], + ioc_type=i["type"]), "indicator") + for k, vals in (c.get("external_ids") or {}).items(): + if k == "attack_campaign": + for v in vals: + edge(cn, node(f"campaign:{v}", "attack-campaign", + f"{v} {attack['campaigns'].get(v, {}).get('name', '')}".strip()), + "same-as") + place(c.get("victims") or {}, cn) + + # Rules join the graph through the techniques already in it, so the graph + # holds every rule that bears on an actor or case and no others. + tech_nodes = {n["id"].split(":", 1)[1] for n in nodes.values() + if n["type"] == "technique" and n.get("framework") == "ATLAS"} + for t in sorted(tech_nodes): + for f in sorted(rules_for.get(t, set()) | rules_for.get(_atlas_parent(t), set())): + edge(rule(f), f"atlas:{t}", "detects") + + out_edges = [{"source": a, "target": b, "rel": r, **(json.loads(x) if x else {})} + for a, b, r, x in sorted(edges)] + return {"nodes": sorted(nodes.values(), key=lambda n: n["id"]), "edges": out_edges} + + +def _stats(actors, cases, atlas, rules_for): + def tally(it): + out: dict[str, int] = {} + for x in it: + out[x] = out.get(x, 0) + 1 + return dict(sorted(out.items(), key=lambda kv: (-kv[1], kv[0]))) + + observed = sorted({t for a in actors for t in a["derived"]["techniques"]} + | {t for c in cases for t in c.get("atlas") or []}) + covered = [t for t in observed + if rules_for.get(t) or rules_for.get(_atlas_parent(t))] + off_host = [t for t in observed if t not in covered + and set(atlas["technique_tactics"].get(t, [])) <= OFF_HOST_TACTICS + and atlas["technique_tactics"].get(t)] + tech_use: dict[str, dict] = {} + for a in actors: + for t in a["derived"]["techniques"]: + tech_use.setdefault(t, {"actors": set(), "cases": set()})["actors"].add(a["id"]) + for c in cases: + for t in c.get("atlas") or []: + tech_use.setdefault(t, {"actors": set(), "cases": set()})["cases"].add(c["id"]) + return { + "actors": len(actors), "cases": len(cases), + "iocs": sum(len(c.get("iocs") or []) for c in cases), + "atomic_iocs": sum(1 for c in cases for i in c.get("iocs") or [] + if i.get("type") in ATOMIC_IOC), + "techniques_observed": len(observed), + "techniques_covered": len(covered), + "techniques_off_host": len(off_host), + "by_kind": tally(a["kind"] for a in actors), + "by_nexus": tally(a.get("nexus") or "unstated" for a in actors), + "by_motivation": tally(m for a in actors for m in a.get("motivation") or []), + "by_sector": tally(s for a in actors for s in a["derived"]["sectors"]), + "by_country": tally(c for a in actors for c in a["derived"]["countries"]), + "by_region": tally(r for a in actors for r in a["derived"]["regions"]), + "case_sectors": tally(s for c in cases for s in (c.get("victims") or {}).get("sectors") or []), + "by_ioc_type": tally(i.get("type", "") for c in cases for i in c.get("iocs") or []), + "cases_by_quarter": dict(sorted(tally(_quarter(str(c.get("disclosed", ""))) for c in cases + if c.get("disclosed")).items())), + "link_confidence": tally(l.get("link_confidence", "") for c in cases + for l in c.get("actors") or []), + "technique_use": {t: {"actors": sorted(v["actors"]), "cases": sorted(v["cases"]), + "rules": sorted(rules_for.get(t, set()) + | rules_for.get(_atlas_parent(t), set()))} + for t, v in sorted(tech_use.items())}, + } + + +# ---------------------------------------------------------------------- analytics +# +# Descriptive statistics over what the sources report - similarity, clusters, +# co-occurrence, cadence, a detection backlog. Deterministic, explainable, and +# computed here rather than in the browser so the numbers are reviewable in the +# feed. Twenty actors is a small corpus: these are for triage and hypothesis, +# never for attribution, and the page says so next to every one of them. + +SIM_WEIGHTS = {"techniques": 0.4, "tools": 0.2, "sectors": 0.2, "ai_services": 0.1, + "motivation": 0.1} +CLUSTER_MIN_SIM = 0.30 + + +def _features(a: dict) -> dict[str, set]: + d = a["derived"] + techs = set(d["techniques"]) | {_atlas_parent(t) for t in d["techniques"]} + return {"techniques": techs, "tools": set(d["tools"]), "sectors": set(d["sectors"]), + "ai_services": {x.lower() for s in a.get("sightings") or [] + for x in s.get("ai_services") or []}, + "motivation": set(a.get("motivation") or [])} + + +def _jaccard(x: set, y: set, idf: dict | None = None) -> float | None: + """IDF-weighted Jaccard. A feature every actor has - "used a generative AI + model" is in almost every sighting - says nothing about which actors are + alike, so it is weighted down by log(1 + N/df), the way a search engine + weights a common word. Plain Jaccard grouped half the corpus on that alone.""" + if not x and not y: + return None + w = (lambda k: idf.get(k, 1.0)) if idf else (lambda k: 1.0) + return sum(w(k) for k in x & y) / sum(w(k) for k in x | y) + + +def similarity(fa: dict, fb: dict, idf: dict | None = None) -> tuple[float, dict]: + num = den = 0.0 + shared = {} + for f, w in SIM_WEIGHTS.items(): + j = _jaccard(fa[f], fb[f], (idf or {}).get(f)) + if j is None: + continue # neither side reports it: no evidence either way + num += w * j + den += w + if fa[f] & fb[f]: + shared[f] = sorted(fa[f] & fb[f]) + return (round(num / den, 3) if den else 0.0), shared + + +def _cluster(ids: list[str], sim: dict) -> list[list[str]]: + """Average-linkage agglomerative clustering, stopped at CLUSTER_MIN_SIM. + + Deterministic: ties break on sorted ids, so the same corpus always gives the + same clusters and a diff of the feed shows exactly what moved.""" + groups = [[i] for i in sorted(ids)] + + def link(a, b): + return sum(sim[(x, y)] for x in a for y in b) / (len(a) * len(b)) + + while True: + best, pair = -1.0, None + for i in range(len(groups)): + for j in range(i + 1, len(groups)): + v = link(groups[i], groups[j]) + if v > best: + best, pair = v, (i, j) + if not pair or best < CLUSTER_MIN_SIM: + break + i, j = pair + groups[i] = sorted(groups[i] + groups[j]) + del groups[j] + return sorted((g for g in groups if len(g) > 1), key=lambda g: (-len(g), g)) + + +def analytics(intel: dict, atlas: dict) -> dict: + actors = intel["actors"] + feats = {a["id"]: _features(a) for a in actors} + ids = sorted(feats) + import math + idf = {} + for f in SIM_WEIGHTS: + df: dict[str, int] = {} + for i in ids: + for k in feats[i][f]: + df[k] = df.get(k, 0) + 1 + idf[f] = {k: math.log(1 + len(ids) / v) for k, v in df.items()} + sim, why = {}, {} + for x in ids: + for y in ids: + if x == y: + sim[(x, y)] = 1.0 + continue + v, shared = similarity(feats[x], feats[y], idf) + sim[(x, y)] = v + why[(x, y)] = shared + neighbours = {} + for x in ids: + ranked = sorted((y for y in ids if y != x), key=lambda y: (-sim[(x, y)], y)) + neighbours[x] = [{"actor": y, "score": sim[(x, y)], "shared": why[(x, y)]} + for y in ranked[:3] if sim[(x, y)] > 0] + clusters = [] + for g in _cluster(ids, sim): + common = {f: sorted(set.intersection(*(feats[i][f] for i in g))) + for f in SIM_WEIGHTS} + # A cluster whose only shared evidence is off-host technique use - "asked + # a chatbot for help" - reflects how thinly those actors are reported, + # not a behavioural resemblance. Said so rather than hidden. + shared_t = common.get("techniques") or [] + thin = (not any(common[f] for f in SIM_WEIGHTS if f != "techniques") + and all(set(atlas["technique_tactics"].get(t, []) or ["x"]) <= OFF_HOST_TACTICS + for t in shared_t)) + clusters.append({"actors": g, "thin": thin, "cohesion": round( + sum(sim[(a, b)] for a in g for b in g if a < b) / max(1, len(g) * (len(g) - 1) / 2), 3), + "shared": {k: v for k, v in common.items() if v}}) + + # Technique co-occurrence. One transaction per observation - a case study or + # a sighting - because that is the unit a reporter published. Lift over 1 + # means two techniques turn up together more often than their separate + # frequencies predict. + tx = [set(c.get("atlas") or []) for c in intel["cases"]] + tx += [set(s.get("atlas") or []) for a in actors for s in a.get("sightings") or []] + tx = [t for t in tx if t] + n = len(tx) + freq: dict[str, int] = {} + for t in tx: + for x in t: + freq[x] = freq.get(x, 0) + 1 + pairs: dict[tuple, int] = {} + for t in tx: + for a in sorted(t): + for b in sorted(t): + if a < b: + pairs[(a, b)] = pairs.get((a, b), 0) + 1 + cooc = [] + for (a, b), k in pairs.items(): + if k < 2: + continue + cooc.append({"a": a, "b": b, "support": k, + "confidence_ab": round(k / freq[a], 3), "confidence_ba": round(k / freq[b], 3), + "lift": round(k * n / (freq[a] * freq[b]), 2)}) + cooc.sort(key=lambda r: (-r["lift"], -r["support"], r["a"], r["b"])) + + # Timeline: every dated observation, and each actor's cadence. + events = [] + for c in intel["cases"]: + for l in c.get("actors") or [{"ref": ""}]: + if c.get("disclosed"): + events.append({"date": str(c["disclosed"]), "actor": l.get("ref", ""), + "kind": "case", "ref": c["id"], "techniques": c.get("atlas") or []}) + for a in actors: + for s in a.get("sightings") or []: + events.append({"date": str(s["date"]), "actor": a["id"], "kind": "sighting", + "ref": s["reporter"], "techniques": s.get("atlas") or []}) + events.sort(key=lambda e: (e["date"], e["actor"], e["kind"], e["ref"])) + + def days(d): + from datetime import date + parts = [int(x) for x in re.findall(r"\d+", d)[:3]] + [1, 1] + return date(parts[0], parts[1], parts[2]).toordinal() + + cadence = {} + for a in actors: + ds = sorted({days(e["date"]) for e in events if e["actor"] == a["id"]}) + gaps = [b - x for x, b in zip(ds, ds[1:])] + cadence[a["id"]] = {"events": len([e for e in events if e["actor"] == a["id"]]), + "span_days": (ds[-1] - ds[0]) if ds else 0, + "median_gap_days": sorted(gaps)[len(gaps) // 2] if gaps else None} + + # Detection backlog: techniques in use with no rule, weighted by how many + # actors and cases use them. Off-host techniques are listed separately - + # there is nothing to write a rule against. + backlog = [] + for t, u in intel["stats"]["technique_use"].items(): + if u["rules"]: + continue + tac = atlas["technique_tactics"].get(t, []) + backlog.append({"technique": t, "name": atlas["techniques"].get(t, ""), + "actors": len(u["actors"]), "cases": len(u["cases"]), + "score": 2 * len(u["actors"]) + len(u["cases"]), + "off_host": bool(tac) and set(tac) <= OFF_HOST_TACTICS}) + backlog.sort(key=lambda r: (r["off_host"], -r["score"], r["technique"])) + + tactic_obs: dict[str, int] = {} + for t in tx: + for ta in sorted({ta for x in t for ta in atlas["technique_tactics"].get(x, [])}): + tactic_obs[ta] = tactic_obs.get(ta, 0) + 1 + + return { + "method": {"similarity": "IDF-weighted Jaccard over " + ", ".join( + f"{k} ({v})" for k, v in SIM_WEIGHTS.items()) + "; facets neither side reports are skipped", + "clusters": f"average-linkage agglomerative, stopped below similarity {CLUSTER_MIN_SIM}", + "cooccurrence": f"{n} observations (case studies and sightings); pairs seen at least twice", + "backlog": "score = 2 x actors + cases using the technique, rule-less techniques only"}, + "similarity": {"ids": ids, "matrix": [[sim[(x, y)] for y in ids] for x in ids]}, + "neighbours": neighbours, "clusters": clusters, "cooccurrence": cooc[:40], + "events": events, "cadence": cadence, "backlog": backlog, + "tactic_observations": tactic_obs, "observations": n, + } + + +# ------------------------------------------------------------------------ exports + +def _uid(kind: str, key: str) -> str: + return f"{kind}--{uuid.uuid5(NS, kind + ':' + key)}" + + +def _refang(v: str) -> str: + return (v.replace("[.]", ".").replace("[:]", ":").replace("hxxps", "https") + .replace("hxxp", "http")) + + +def _ts(date: str, fallback: str) -> str: + d = str(date or fallback) + if re.fullmatch(r"\d{4}", d): + d += "-01-01" + elif re.fullmatch(r"\d{4}-\d{2}", d): + d += "-01" + return d[:10] + "T00:00:00.000Z" + + +def _pattern(t: str, v: str) -> str | None: + v = _refang(v).replace("\\", "\\\\").replace("'", "\\'") + if t == "domain": + return f"[domain-name:value = '{v}']" + if t == "ip": + return f"[{'ipv6-addr' if ':' in v else 'ipv4-addr'}:value = '{v}']" + if t == "url": + return f"[url:value = '{v}']" + if t == "email": + return f"[email-addr:value = '{v}']" + if t == "hash" and re.fullmatch(r"[0-9a-fA-F]{64}", v): + return f"[file:hashes.'SHA-256' = '{v.lower()}']" + if t == "file" and "/" not in v and "\\" not in v: + return f"[file:name = '{v}']" + return None + + +def stix_bundle(intel: dict, pin: dict) -> dict: + """STIX 2.1. Deterministic: ids are uuid5 of the repo's own ids, timestamps + come from the data, so an unchanged catalog exports a byte-identical bundle.""" + stamp = _ts(max((str(c.get("disclosed", "")) for c in intel["cases"]), default="2026-01-01"), "") + ident = _uid("identity", "producer") + mark = _uid("marking-definition", "cc-by-4.0") + common = {"spec_version": "2.1", "created_by_ref": ident, "object_marking_refs": [mark]} + objs = [ + {"type": "identity", "spec_version": "2.1", "id": ident, "created": stamp, "modified": stamp, + "name": "ai-dfir-toolkit", "identity_class": "organization", + "description": "Open AI-agent artifact catalog and detection content."}, + {"type": "marking-definition", "spec_version": "2.1", "id": mark, "created": stamp, + "definition_type": "statement", "name": "CC BY 4.0", + "definition": {"statement": "Catalog data licensed CC BY 4.0 - ai-dfir-toolkit. " + "Indicators are republished from the cited reports."}}, + ] + seen = set() + + def add(o): + if o["id"] not in seen: + seen.add(o["id"]) + objs.append(o) + return o["id"] + + def rel(src, tgt, kind, when): + return add({"type": "relationship", **common, "id": _uid("relationship", f"{src}|{kind}|{tgt}"), + "created": when, "modified": when, "relationship_type": kind, + "source_ref": src, "target_ref": tgt}) + + def attack_pattern(t, when): + if t.startswith("AML."): + name = pin["atlas"]["techniques"].get(t, t) + ref = {"source_name": "mitre-atlas", "external_id": t, + "url": f"https://atlas.mitre.org/techniques/{t}"} + else: + name = pin["attack"]["techniques"].get(t, t) + ref = {"source_name": "mitre-attack", "external_id": t, + "url": f"https://attack.mitre.org/techniques/{t.replace('.', '/')}/"} + return add({"type": "attack-pattern", **common, "id": _uid("attack-pattern", t), + "created": when, "modified": when, "name": name, "external_references": [ref]}) + + def target(v, owner, when): + for s in v.get("sectors") or []: + i = add({"type": "identity", **common, "id": _uid("identity", "sector:" + s), + "created": when, "modified": when, "name": s, "identity_class": "class", + "sectors": [s]}) + rel(owner, i, "targets", when) + for c in v.get("countries") or []: + loc = add({"type": "location", **common, "id": _uid("location", c), "created": when, + "modified": when, "name": c, "country": c}) + rel(owner, loc, "targets", when) + + tool_ids = {} + for a in intel["actors"]: + when = _ts(a["derived"]["first_seen"], stamp[:10]) + ext = [{"source_name": "ai-dfir-toolkit", "external_id": a["id"]}] + for g in (a.get("external_ids") or {}).get("attack_group") or []: + ext.append({"source_name": "mitre-attack", "external_id": g, + "url": f"https://attack.mitre.org/groups/{g}/"}) + ext += [{"source_name": r["title"][:120], "url": r["url"]} for r in a["references"]] + iset = add({"type": "intrusion-set", **common, "id": _uid("intrusion-set", a["id"]), + "created": when, "modified": when, "name": a["name"], + "description": a["summary"], + "aliases": [x["name"] for x in a.get("aliases") or []] or None, + "confidence": {"high": 85, "medium": 50, "low": 15}[a["confidence"]], + "external_references": ext}) + objs[-1] = {k: v for k, v in objs[-1].items() if v is not None} if objs[-1]["id"] == iset else objs[-1] + for t in a["derived"]["techniques"] + a["derived"]["attack"]: + rel(iset, attack_pattern(t, when), "uses", when) + for m in a.get("malware") or []: + mal = add({"type": "malware", **common, "id": _uid("malware", m.lower()), "created": when, + "modified": when, "name": m, "is_family": True}) + rel(iset, mal, "uses", when) + for t in a["derived"]["tools"]: + tool_ids[t] = True + tl = add({"type": "tool", **common, "id": _uid("tool", t), "created": when, + "modified": when, "name": t, + "external_references": [{"source_name": "ai-dfir-toolkit", "external_id": t}]}) + rel(iset, tl, "uses", when) + for s in a.get("sightings") or []: + target(s.get("victims") or {}, iset, _ts(s["date"], stamp[:10])) + + for c in intel["cases"]: + when = _ts(c.get("disclosed"), stamp[:10]) + refs = [{"source_name": "ai-dfir-toolkit", "external_id": c["id"]}] + for k, vals in (c.get("external_ids") or {}).items(): + for v in vals if isinstance(vals, list) else [vals]: + if k == "attack_campaign": + refs.append({"source_name": "mitre-attack", "external_id": v, + "url": f"https://attack.mitre.org/campaigns/{v}/"}) + elif k == "atlas_case_study": + refs.append({"source_name": "mitre-atlas", "external_id": v, + "url": f"https://atlas.mitre.org/studies/{v}"}) + elif k == "cve": + refs.append({"source_name": "cve", "external_id": v}) + refs += [{"source_name": r["title"][:120], "url": r["url"]} for r in c.get("references") or []] + members = [] + owners = [_uid("intrusion-set", l["ref"]) for l in c.get("actors") or []] + for t in (c.get("atlas") or []) + (c.get("attack") or []): + members.append(attack_pattern(t, when)) + for i in c.get("iocs") or []: + p = _pattern(i.get("type", ""), str(i.get("value", ""))) + if not p: + continue + ind = add({"type": "indicator", **common, "id": _uid("indicator", f"{c['id']}|{p}"), + "created": when, "modified": when, "name": _refang(str(i["value"]))[:200], + "description": str(i.get("description", ""))[:1000], + "indicator_types": ["malicious-activity"], "pattern": p, + "pattern_type": "stix", "valid_from": when}) + members.append(ind) + for o in owners: + rel(ind, o, "indicates", when) + for t in c["affects_ids"]: + members.append(add({"type": "tool", **common, "id": _uid("tool", t), "created": when, + "modified": when, "name": t, + "external_references": [{"source_name": "ai-dfir-toolkit", + "external_id": t}]})) + if owners: + members += owners + victims = c.get("victims") or {} + if victims and owners: + for o in owners: + target(victims, o, when) + members = sorted(set(members)) or [ident] + add({"type": "report", **common, "id": _uid("report", c["id"]), "created": when, + "modified": when, "name": c["title"], "description": c.get("summary", ""), + "published": when, "report_types": ["threat-report"], + "object_refs": members, "external_references": refs}) + return {"type": "bundle", "id": _uid("bundle", "ai-dfir-intel"), "objects": objs} + + +MALTEGO_TYPE = { + "actor": "maltego.Phrase", "case": "maltego.Phrase", "tool": "maltego.Phrase", + "artifact": "maltego.File", "rule": "maltego.File", "technique": "maltego.Phrase", + "tactic": "maltego.Phrase", "asi": "maltego.Phrase", "malware": "maltego.Phrase", + "sector": "maltego.Phrase", "country": "maltego.Location", "region": "maltego.Location", + "attack-group": "maltego.Phrase", "attack-campaign": "maltego.Phrase", +} +MALTEGO_IOC = {"domain": "maltego.Domain", "ip": "maltego.IPv4Address", "url": "maltego.URL", + "email": "maltego.EmailAddress", "hash": "maltego.Hash", "file": "maltego.File"} + + +def maltego_csv(graph: dict) -> tuple[str, str]: + """Two CSVs for Maltego's table import: entities, then links. Standard entity + types only, so the import needs no custom entity pack; the node's own type + travels in a Category column for filtering once it is in.""" + ent, lnk = io.StringIO(), io.StringIO() + w = csv.writer(ent, lineterminator="\n") + w.writerow(["EntityType", "Value", "Category", "Label"]) + typ = {} + for n in graph["nodes"]: + t = MALTEGO_IOC.get(n.get("ioc_type", ""), MALTEGO_TYPE.get(n["type"], "maltego.Phrase")) + typ[n["id"]] = (t, n["id"] if n["type"] != "ioc" else _refang(n["label"])) + w.writerow([t, typ[n["id"]][1], n["type"], n["label"]]) + w = csv.writer(lnk, lineterminator="\n") + w.writerow(["SourceType", "SourceValue", "TargetType", "TargetValue", "Relationship"]) + for e in graph["edges"]: + if e["source"] in typ and e["target"] in typ: + s, t = typ[e["source"]], typ[e["target"]] + w.writerow([s[0], s[1], t[0], t[1], e["rel"]]) + return ent.getvalue(), lnk.getvalue() + + +def write_lf(path: Path, text: str) -> None: + path.parent.mkdir(parents=True, exist_ok=True) + with path.open("w", encoding="utf-8", newline="\n") as fh: + fh.write(text) + + +def export(intel: dict, pin: dict) -> list[Path]: + public = {"atlas_release": intel["atlas"]["release"], "stats": intel["stats"], + "analytics": intel["analytics"], + "actors": intel["actors"], "cases": intel["cases"], "graph": intel["graph"]} + ent, lnk = maltego_csv(intel["graph"]) + out = { + API / "intel.json": json.dumps(public, indent=1, ensure_ascii=False, sort_keys=False) + "\n", + API / "stix" / "ai-dfir-intel.json": json.dumps(stix_bundle(intel, pin), indent=1, + ensure_ascii=False) + "\n", + API / "graph" / "maltego-entities.csv": ent, + API / "graph" / "maltego-links.csv": lnk, + } + for p, text in out.items(): + write_lf(p, text) + return list(out) + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--check", action="store_true") + ap.add_argument("--export", action="store_true") + args = ap.parse_args() + src = load_sources() + problems = check(src) + for p in problems: + print(p) + if args.check: + print(f"\n{len(problems)} problem(s).") + return 1 if problems else 0 + intel = build(src) + s = intel["stats"] + print(f"{s['actors']} actors, {s['cases']} cases, {s['iocs']} indicators " + f"({s['atomic_iocs']} atomic), {s['techniques_observed']} ATLAS techniques " + f"observed, {s['techniques_covered']} with a rule, {s['techniques_off_host']} " + f"off-host; graph " + f"{len(intel['graph']['nodes'])} nodes / {len(intel['graph']['edges'])} edges") + from datetime import date, timedelta + cutoff = (date.today() - timedelta(days=365)).isoformat() + for a in intel["actors"]: + d = a["derived"] + if d["gaps"]: + print(f" [GAP] {a['id']} {a['name']}: no rule for {', '.join(d['gaps'])}") + # Reported, not failed: an actor going quiet is information, not a defect. + # But a profile nobody has looked at in a year should be looked at. + if d["last_seen"] and d["last_seen"] < cutoff: + print(f" [STALE] {a['id']} {a['name']}: last activity {d['last_seen']}, " + f"over a year ago - re-check the sources for newer reporting") + if args.export: + for p in export(intel, src["pin"]): + print(f"wrote {p.relative_to(ROOT)}") + return 1 if problems else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/artifacts/scripts/intel_watch.py b/artifacts/scripts/intel_watch.py new file mode 100644 index 0000000..9e5b71e --- /dev/null +++ b/artifacts/scripts/intel_watch.py @@ -0,0 +1,351 @@ +#!/usr/bin/env python3 +"""Poll threat-intel sources and file new items as GitHub issues for review. + + python scripts/intel_watch.py --dry-run # print candidates, touch nothing + python scripts/intel_watch.py # open issues (needs GITHUB_TOKEN) + python scripts/intel_watch.py --dry-run --kev-file kev.json --atlas-dir atlas-data/dist \\ + --avid-dir avid-db # offline, from local mirrors + +This is the half of the automation that never merges anything. A framework +refresh is mechanical and can merge itself (framework-refresh.yml); a new +incident, actor or advisory needs judgement - is it in scope, what does the +source actually say, who else corroborates it - so it arrives as an issue +labelled intel-candidate with facts and a link, and a person or a session with +vendor egress researches it before anything reaches the catalog. + +Deduplication has no state file. Every candidate carries a stable key in its +title - "[intel] :" - and a key already present in any open or +closed intel-candidate issue is skipped. Closing an issue as not relevant is +therefore how you tell the watcher to stop raising it. + +Each source fails on its own. A feed that has moved logs a warning and the run +continues, because one dead URL must not stop the other nine from reporting. +""" +from __future__ import annotations + +import argparse +import glob +import json +import os +import re +import sys +import urllib.parse +import urllib.request +import xml.etree.ElementTree as ET +from datetime import date, datetime, timedelta, timezone +from pathlib import Path + +import yaml + +ROOT = Path(__file__).resolve().parent.parent +CONFIG = ROOT / "intel" / "watch-sources.yml" +UA = {"User-Agent": "ai-dfir-toolkit-intel-watch (+https://github.com/depalmar/ai-dfir-toolkit)"} + + +def fetch(url: str, data: bytes | None = None, headers: dict | None = None) -> bytes: + req = urllib.request.Request(url, data=data, headers={**UA, **(headers or {})}) + with urllib.request.urlopen(req, timeout=60) as r: + return r.read() + + +# Catalog names that are also ordinary words or platform names. +GENERIC = {"open source", "community", "various", "continue", "agent framework libraries", + "github copilot", "copilot", "codex", "operator", "goose", "warp", "kiro", "jan.ai"} + + +def catalog_terms() -> tuple[set[str], dict]: + terms, entries = set(), {} + for f in glob.glob(str(ROOT / "catalog" / "*.yml")): + e = yaml.safe_load(Path(f).read_text(encoding="utf-8")) + entries[e["id"]] = e + # Tool names and aliases, not vendors: "Microsoft" and "Google" as terms + # matched every Windows and Chrome KEV entry - 420 candidates on a + # three-week window, which is noise nobody would read. + for t in [e.get("name", "")] + list(e.get("aliases") or []): + for part in re.split(r"\s*/\s*", re.sub(r"\s*\(.*?\)", "", str(t))): + part = part.strip() + if len(part) >= 4 and part.lower() not in GENERIC: + terms.add(part.lower()) + return terms, entries + + +def hits(text: str, terms: set[str]) -> list[str]: + low = text.lower() + return sorted(t for t in terms if re.search(r"(?= ctx["since"] + if (h and recent) or (v["cveID"] in pinned and recent): + out.append({"key": v["cveID"], "title": f"{v['cveID']} {v.get('vendorProject')} " + f"{v.get('product')} added to CISA KEV", "date": v.get("dateAdded"), + "url": f"https://nvd.nist.gov/vuln/detail/{v['cveID']}", + "facts": {"vendor": v.get("vendorProject"), "product": v.get("product"), + "name": v.get("vulnerabilityName"), "due": v.get("dueDate"), + "ransomware": v.get("knownRansomwareCampaignUse"), + "catalog_match": ", ".join(h) or "cited CVE"}}) + return out + + +def src_atlas(cfg, ctx): + pin = json.loads((ROOT / "schema" / "technique-ids.json").read_text())["atlas"] + base = Path(ctx["atlas_dir"]) if ctx.get("atlas_dir") else None + load = (lambda p: yaml.safe_load((base / p).read_text())) if base else \ + (lambda p: yaml.safe_load(fetch(cfg["url"] + p))) + manifest = load("manifest.yaml") + newest = max(manifest, key=lambda r: tuple(int(x) for x in str(r["release"]).split("."))) + doc = load(newest["versions"][0]["path"]) + studies = doc.get("case-studies") or {} + studies = studies.values() if isinstance(studies, dict) else studies + out = [] + for cs in studies: + if cs["id"] in pin.get("case_studies", {}): + continue + out.append({"key": cs["id"], "title": f"New ATLAS case study {cs['id']}: {cs.get('name', '')}", + "date": str(cs.get("date", "")), + "url": f"https://atlas.mitre.org/studies/{cs['id']}", + "facts": {"release": newest["release"], "type": cs.get("type", "")}}) + return out + + +def src_avid(cfg, ctx): + d = Path(ctx["avid_dir"]) if ctx.get("avid_dir") else None + if d is None: + import subprocess + import tempfile + d = Path(tempfile.mkdtemp()) / "avid-db" + subprocess.run(["git", "clone", "-q", "--depth", "1", cfg["url"], str(d)], check=True) + out = [] + for f in sorted(d.glob("reports/*/AVID-*.json")): + try: + r = json.loads(f.read_text(encoding="utf-8")) + except (json.JSONDecodeError, UnicodeDecodeError): + continue + when = str(r.get("reported_date", "")) + if when < ctx["since"]: + continue + impact = r.get("impact") + impact = impact if isinstance(impact, dict) else {} + domains = (impact.get("avid") or {}).get("risk_domain") or [] + text = json.dumps(r.get("problemtype", {})) + json.dumps(r.get("affects", {})) + # Catalogued tools only. AVID is dominated by automated model-scanner + # reports that all say "LLM", which the generic terms would match. + h = hits(text, ctx["catalog_terms"]) + if "Security" in domains and h: + rid = r.get("metadata", {}).get("report_id") or f.stem + out.append({"key": rid, "title": f"AVID {rid}: " + str( + (r.get("problemtype") or {}).get("description", {}).get("value", ""))[:120], + "date": when, "url": f"https://avidml.org/database/{rid.lower()}", + "facts": {"matched": ", ".join(h[:8]), "risk_domain": ", ".join(domains)}}) + return out + + +AIID_QUERY = """query($since: String) { + incidents(filter: {date: {GTE: $since}}, sort: {incident_id: DESC}, pagination: {limit: 200}) { + incident_id title date + classifications { namespace attributes { short_name value_json } } + } +}""" + + +def src_aiid(cfg, ctx): + body = json.dumps({"query": AIID_QUERY, "variables": {"since": ctx["since"]}}).encode() + data = json.loads(fetch(cfg["url"], body, {"Content-Type": "application/json"})) + out = [] + for inc in (data.get("data") or {}).get("incidents") or []: + domains = [] + for c in inc.get("classifications") or []: + if "MIT" in str(c.get("namespace", "")): + for a in c.get("attributes") or []: + domains += re.findall(r"\b\d\.\d\b", str(a.get("value_json", ""))) + h = hits(inc.get("title", ""), ctx["catalog_terms"] | ctx["match"]) + if h or set(domains) & set(cfg.get("mit_domains") or []): + iid = inc["incident_id"] + out.append({"key": str(iid), "title": f"AIID incident {iid}: {inc.get('title', '')[:120]}", + "date": inc.get("date", ""), "url": f"https://incidentdatabase.ai/cite/{iid}", + "facts": {"mit_domains": ", ".join(sorted(set(domains))) or "-", + "matched": ", ".join(h[:8]) or "-", + "licence": "AIID data is CC BY-SA 4.0 - record ids and links only"}}) + return out + + +def src_markdown_table(cfg, ctx): + text = fetch(cfg["url"]).decode("utf-8", "replace") + out = [] + for line in text.splitlines(): + if not line.startswith("|") or set(line) <= set("|-: "): + continue + cells = [c.strip() for c in line.strip("|").split("|")] + if len(cells) < 3 or cells[0].lower() in ("date", ""): + continue + key = re.sub(r"[^a-z0-9]+", "-", (cells[0] + " " + cells[1]).lower()).strip("-")[:80] + links = re.findall(r"\((https?://[^)]+)\)", line) + out.append({"key": key, "title": f"OWASP ASI tracker: {cells[1][:120]}", + "date": cells[0], "url": links[0] if links else cfg["url"], + "facts": {"asi": ", ".join(sorted(set(re.findall(r"ASI\d{2}", line)))) or "-", + "licence": "OWASP content is CC BY-SA 4.0 - record ids and links only"}}) + return out + + +def src_feed(cfg, ctx): + root = ET.fromstring(fetch(cfg["url"])) + ns = {"a": "http://www.w3.org/2005/Atom"} + items = [(i.findtext("title") or "", i.findtext("link") or "", i.findtext("pubDate") or "", + i.findtext("description") or "") for i in root.iter("item")] + items += [(e.findtext("a:title", namespaces=ns) or "", + (e.find("a:link", ns).get("href") if e.find("a:link", ns) is not None else ""), + e.findtext("a:updated", namespaces=ns) or "", e.findtext("a:summary", namespaces=ns) or "") + for e in root.iter("{http://www.w3.org/2005/Atom}entry")] + out = [] + for title, link, when, desc in items: + d = _date(when) + if d and d < ctx["since"]: + continue + h = hits(title + " " + re.sub(r"<[^>]+>", " ", desc), ctx["catalog_terms"] | ctx["match"]) + if h: + out.append({"key": re.sub(r"[^a-z0-9]+", "-", link.lower())[-80:] or title[:60], + "title": title[:140], "date": d or when, "url": link, + "facts": {"matched": ", ".join(h[:8])}}) + return out + + +def src_ghsa(cfg, ctx): + out = [] + token = os.environ.get("GITHUB_TOKEN", "") + headers = {"Accept": "application/vnd.github+json", **({"Authorization": f"Bearer {token}"} if token else {})} + for eco, pkgs in (cfg.get("ecosystems") or {}).items(): + for pkg in pkgs: + q = urllib.parse.urlencode({"ecosystem": eco, "affects": pkg, "type": "reviewed", + "published": f">={ctx['since']}", "per_page": 50}) + for adv in json.loads(fetch(f"https://api.github.com/advisories?{q}", headers=headers)): + out.append({"key": adv["ghsa_id"], "title": f"{adv['ghsa_id']} {pkg}: {adv.get('summary', '')[:110]}", + "date": str(adv.get("published_at", ""))[:10], "url": adv.get("html_url", ""), + "facts": {"package": f"{eco}:{pkg}", "severity": adv.get("severity"), + "cve": adv.get("cve_id") or "-"}}) + return out + + +def _date(s: str) -> str: + for fmt in ("%a, %d %b %Y %H:%M:%S %z", "%a, %d %b %Y %H:%M:%S %Z", "%Y-%m-%dT%H:%M:%S%z", + "%Y-%m-%dT%H:%M:%SZ", "%Y-%m-%d"): + try: + return datetime.strptime(s.strip(), fmt).date().isoformat() + except ValueError: + continue + m = re.search(r"\d{4}-\d{2}-\d{2}", s or "") + return m.group(0) if m else "" + + +SOURCES = {"kev": src_kev, "atlas": src_atlas, "avid": src_avid, "aiid": src_aiid, + "markdown-table": src_markdown_table, "feed": src_feed, "ghsa": src_ghsa} + + +# ------------------------------------------------------------------------ issues + +def existing_keys(repo: str, token: str) -> set[str]: + keys, page = set(), 1 + while True: + q = urllib.parse.urlencode({"labels": "intel-candidate", "state": "all", "per_page": 100, "page": page}) + batch = json.loads(fetch(f"https://api.github.com/repos/{repo}/issues?{q}", + headers={"Authorization": f"Bearer {token}", + "Accept": "application/vnd.github+json"})) + for i in batch: + m = re.match(r"\[intel\] (\S+)", i.get("title", "")) + if m: + keys.add(m.group(1)) + if len(batch) < 100: + return keys + page += 1 + + +def issue_body(src: dict, c: dict) -> str: + facts = "\n".join(f"| {k} | {v} |" for k, v in c["facts"].items()) + return f"""Raised automatically by `scripts/intel_watch.py` from **{src['id']}** ({src.get('note', '')}). + +| Field | Value | +|---|---| +| Source date | {c.get('date') or '-'} | +| Link | {c['url']} | +{facts} + +This is a lead, not a finding. Nothing here has been read beyond its title and +metadata. Before it reaches the catalog: + +- [ ] Read the primary source, not a summary of it +- [ ] Decide scope: does it touch a catalogued tool, an agent runtime or MCP, or an actor in scope (attributed or named cluster)? +- [ ] Second, independent source found - or record it as single-source (`medium` at most) +- [ ] Adversarial pass: what would make this wrong? (RESEARCH-2026-08-14.md method) +- [ ] Licence: facts only from CC BY-SA sources (AIID, OWASP) - ids, dates, names, links; our own words +- [ ] If it becomes a case study: indicators, detections, `actors` links with `stated_confidence`, `victims` only as stated +- [ ] Gates: `validate.py`, `intel_graph.py --check`, `build_site.py --check` + +Close as not planned to stop the watcher raising it again. +""" + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--dry-run", action="store_true") + ap.add_argument("--only", nargs="*", help="source ids to run") + ap.add_argument("--since", help="ISO date; default is lookback_days from the config") + ap.add_argument("--kev-file") + ap.add_argument("--atlas-dir") + ap.add_argument("--avid-dir") + ap.add_argument("--max-issues", type=int, default=25, + help="cap per run, so a first run or a noisy source cannot flood the tracker") + args = ap.parse_args() + cfg = yaml.safe_load(CONFIG.read_text(encoding="utf-8")) + terms, _ = catalog_terms() + since = args.since or (date.today() - timedelta(days=int(cfg.get("lookback_days", 21)))).isoformat() + ctx = {"since": since, "catalog_terms": terms, + "match": {m.lower() for m in cfg.get("match") or []}, + "kev_file": args.kev_file, "atlas_dir": args.atlas_dir, "avid_dir": args.avid_dir} + found, warnings = [], [] + for src in cfg["sources"]: + if args.only and src["id"] not in args.only: + continue + try: + for c in SOURCES[src["kind"]](src, ctx): + found.append((src, c)) + except Exception as exc: # one dead source must not stop the rest + warnings.append(f"{src['id']}: {type(exc).__name__}: {str(exc)[:160]}") + for w in warnings: + print(f"::warning::{w}") + + token, repo = os.environ.get("GITHUB_TOKEN", ""), os.environ.get("GITHUB_REPOSITORY", "") + have = existing_keys(repo, token) if (token and repo and not args.dry_run) else set() + fresh = [(s, c) for s, c in found if f"{s['id']}:{c['key']}" not in have] + print(f"{len(found)} candidate(s) since {since}, {len(fresh)} new") + opened = 0 + for src, c in fresh: + key = f"{src['id']}:{c['key']}" + title = f"[intel] {key} - {c['title']}"[:240] + if args.dry_run or not (token and repo): + print(f" {title}\n {c['url']}") + continue + if opened >= args.max_issues: + print(f"::notice::cap of {args.max_issues} reached; the rest will be raised next run") + break + fetch(f"https://api.github.com/repos/{repo}/issues", + json.dumps({"title": title, "body": issue_body(src, c), + "labels": ["intel-candidate", f"source:{src['id']}"]}).encode(), + {"Authorization": f"Bearer {token}", "Accept": "application/vnd.github+json", + "Content-Type": "application/json"}) + opened += 1 + if opened: + print(f"opened {opened} issue(s)") + return 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/artifacts/scripts/refresh_guard.py b/artifacts/scripts/refresh_guard.py new file mode 100644 index 0000000..f9f0f5f --- /dev/null +++ b/artifacts/scripts/refresh_guard.py @@ -0,0 +1,154 @@ +#!/usr/bin/env python3 +"""Decide whether a framework refresh is safe to merge without a person. + + python scripts/refresh_guard.py --base origin/main --summary out.md + +Run by .github/workflows/framework-refresh.yml after the pins have been +re-fetched and every derived file regenerated. Exit codes: + + 0 auto-merge: only pinned reference data and files derived from it changed + 2 needs review: something else changed, or a guard tripped + 1 error + +Why this is the whole policy. A refresh that only moves ids and names inside +the pins, and the files generated from them, cannot change a claim this +repository makes - if a pin drops an id something still cites, the offline gates +(validate_techniques.py, cve_status.py) fail on the refreshed tree and the +workflow never gets this far. So the guard only has to prove the diff is +confined to derived data. Anything outside that list is a change a person +should read. + +The optional FORBIDDEN_TERMS environment variable (comma-separated, supplied as +a repository secret so the terms themselves are never committed) blocks auto- +merge if any term appears in an added line. Upstream reference data carries +free text written by third parties; this is how the maintainer keeps names out +of the repository that its own content deliberately omits. +""" +from __future__ import annotations + +import argparse +import json +import os +import subprocess +import sys +from pathlib import Path + +ROOT = Path(__file__).resolve().parent.parent +REPO = ROOT.parent + +# Pins, and everything generated from them. Kept deliberately short. +ALLOWED = ( + "artifacts/schema/technique-ids.json", + "artifacts/schema/cve-status.json", + "MAPPINGS.md", + "artifacts/docs/api/", +) +PINS = {"artifacts/schema/technique-ids.json", "artifacts/schema/cve-status.json"} + + +def git(*args: str) -> str: + return subprocess.run(["git", *args], cwd=REPO, check=True, capture_output=True, + text=True).stdout + + +def changed(base: str) -> list[str]: + out = git("diff", "--name-only", base, "--") + git("ls-files", "--others", "--exclude-standard") + return sorted({l.strip() for l in out.splitlines() if l.strip()}) + + +def old_json(base: str, path: str) -> dict: + try: + return json.loads(git("show", f"{base}:{path}")) + except subprocess.CalledProcessError: + return {} + + +def diff_keys(old: dict, new: dict) -> tuple[list, list, list]: + added = sorted(set(new) - set(old)) + removed = sorted(set(old) - set(new)) + renamed = sorted(k for k in set(old) & set(new) + if isinstance(old[k], str) and old[k] != new[k]) + return added, removed, renamed + + +def summary(base: str) -> list[str]: + lines = [] + old = old_json(base, "artifacts/schema/technique-ids.json") + new = json.loads((ROOT / "schema" / "technique-ids.json").read_text(encoding="utf-8")) + oa, na = old.get("atlas", {}), new["atlas"] + if oa.get("release") != na.get("release"): + lines.append(f"- ATLAS {oa.get('release', '?')} -> **{na['release']}**") + for key in ("tactics", "techniques", "mitigations", "case_studies"): + o = {k: (v if isinstance(v, str) else v.get("name", "")) for k, v in (oa.get(key) or {}).items()} + n = {k: (v if isinstance(v, str) else v.get("name", "")) for k, v in (na.get(key) or {}).items()} + add, rem, ren = diff_keys(o, n) + if add or rem or ren: + lines.append(f"- ATLAS {key.replace('_', ' ')}: +{len(add)} -{len(rem)} renamed {len(ren)}") + for k in add[:25]: + lines.append(f" - added `{k}` {n[k]}") + for k in rem[:25]: + lines.append(f" - removed `{k}` {o[k]}") + for k in ren[:25]: + lines.append(f" - renamed `{k}`: {o[k]} -> {n[k]}") + ot, nt = old.get("attack", {}), new["attack"] + if ot.get("version") != nt.get("version"): + lines.append(f"- ATT&CK {ot.get('version', '?')} -> **{nt['version']}**") + for key in ("techniques", "groups", "campaigns"): + add, rem, _ = diff_keys(ot.get(key) or {}, nt.get(key) or {}) + if add or rem: + lines.append(f"- ATT&CK {key}: +{len(add)} -{len(rem)}") + newly_retired = sorted(set(nt.get("retired", [])) - set(ot.get("retired", []))) + if newly_retired: + lines.append(f"- ATT&CK newly deprecated or revoked: {', '.join(newly_retired[:30])}") + oc = old_json(base, "artifacts/schema/cve-status.json").get("cves", {}) + nc = json.loads((ROOT / "schema" / "cve-status.json").read_text(encoding="utf-8"))["cves"] + flipped = sorted(c for c in nc if c in oc and oc[c].get("cisa_kev") != nc[c].get("cisa_kev")) + if flipped: + lines.append("- CISA KEV status changed: " + ", ".join( + f"{c} -> {'listed' if nc[c]['cisa_kev'] else 'not listed'}" for c in flipped)) + return lines + + +def forbidden(base: str) -> list[str]: + terms = [t.strip().lower() for t in os.environ.get("FORBIDDEN_TERMS", "").split(",") if t.strip()] + if not terms: + return [] + added = [l[1:].lower() for l in git("diff", "-U0", base, "--").splitlines() + if l.startswith("+") and not l.startswith("+++")] + # Report only that a term matched, never which one: the point of keeping the + # list in a secret is that it does not appear in logs either. + return [f"{sum(1 for l in added if t in l)} added line(s) match a forbidden term" + for t in terms if any(t in l for l in added)] + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--base", default="origin/main") + ap.add_argument("--summary", type=Path) + args = ap.parse_args() + files = changed(args.base) + outside = [f for f in files if not f.startswith(ALLOWED)] + reasons = [] + if not files: + print("no changes") + return 0 + if outside: + reasons.append("changes outside pinned reference data: " + ", ".join(outside[:20])) + if not (set(files) & PINS): + reasons.append("no pin changed, so this is not a framework refresh") + reasons += forbidden(args.base) + body = ["## Framework refresh", "", *summary(args.base), ""] + if reasons: + body += ["**Held for review:**", *[f"- {r}" for r in reasons]] + else: + body += ["Only pinned reference data and files derived from it changed, and every " + "gate passed on the refreshed tree, so this is set to auto-merge."] + text = "\n".join(body) + "\n" + print(text) + if args.summary: + args.summary.write_text(text, encoding="utf-8") + return 2 if reasons else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/artifacts/scripts/remap_owasp_2026.py b/artifacts/scripts/remap_owasp_2026.py index a280df9..b4ea008 100644 --- a/artifacts/scripts/remap_owasp_2026.py +++ b/artifacts/scripts/remap_owasp_2026.py @@ -19,25 +19,19 @@ import sys from pathlib import Path -REPO = Path("/home/user/ai-dfir-toolkit") - -# 2025 id -> (2026 id, 2026 title). Sourced from the OWASP GenAI Security -# Project publication of 2026-08-04. -MAP = { - "LLM01": ("LLM01", "Prompt Injection"), - "LLM02": ("LLM02", "Sensitive Information Disclosure"), - "LLM03": ("LLM04", "Supply Chain"), - "LLM04": ("LLM05", "Data and Model Poisoning"), - "LLM05": ("LLM10", "Improper Output Handling"), - "LLM06": ("LLM03", "Excessive Agency"), - # Renamed and widened, not dropped: the 2026 entry covers any non-user-facing - # content assembled into the context window - tool schemas, retrieved policy - # text, developer instructions - of which the system prompt is one case. - "LLM07": ("LLM08", "Hidden Context Exposure"), - "LLM08": ("LLM09", "Vector and Embedding Weaknesses"), - "LLM09": ("LLM07", "Misinformation"), - "LLM10": ("LLM06", "Unbounded Consumption"), -} +import json + +REPO = Path(__file__).resolve().parent.parent.parent + +# 2025 id -> (2026 id, 2026 title), from the pinned OWASP reference data rather +# than a copy in this script, so the remap table and the MAPPINGS index cannot +# disagree. LLM07 -> LLM08 is renamed and widened, not dropped: the 2026 entry +# covers any non-user-facing content assembled into the context window - tool +# schemas, retrieved policy text, developer instructions - of which the system +# prompt is one case. +_OWASP = json.loads((REPO / "artifacts" / "schema" / "owasp.json").read_text(encoding="utf-8")) +MAP = {old: (new, _OWASP["llm_2026"]["items"][new]["title"]) + for old, new in _OWASP["llm_2025_to_2026"].items()} # LLM07 -> LLM08 also renames the category, so any prose naming the old title has # to move with it or the file will describe one thing and tag another. diff --git a/artifacts/scripts/site_data.py b/artifacts/scripts/site_data.py index 509a606..6a18579 100644 --- a/artifacts/scripts/site_data.py +++ b/artifacts/scripts/site_data.py @@ -64,16 +64,24 @@ def category_label(dirname: str) -> str: return stem[:1].upper() + stem[1:] +# ATLAS technique ids are T0xxx; ATT&CK's are T1xxx. The extractor used to take +# any T followed by four digits, so a Suricata rule citing ATT&CK T1190 in its +# metadata shipped with an "ATLAS" technique AML.T1190 that does not exist. +ATLAS_IN_TEXT = r"AML\.T\d{4}(?:\.\d{3})?|\bT0\d{3}(?:\.\d{3})?\b" + + def _norm_atlas(v: str) -> str: - """T0051.000, AML.T0051, attack.atlas.t0051 -> AML.T0051.000 style.""" - v = v.strip().replace("attack.atlas.", "").upper() - if not v: - return "" - if v.startswith("AML."): - v = v[4:] - if not v.startswith("T"): - return "" - return "AML." + v + """T0051.000, AML.T0051, attack.atlas.t0051, atlas.aml-t0051 -> AML.T0051.000. + + The last form is used by 18 tags across 07, 08 and 09, and used to normalise + to "", so those rules showed only whatever MAPPINGS said about them. + Anything that is not an ATLAS technique id comes back empty rather than as + a plausible-looking wrong one - "T1611 (ATT&CK)" is not AML.T1611. + """ + v = v.strip().upper().replace("ATTACK.ATLAS.", "").replace("ATLAS.", "") + v = re.sub(r"^AML[.-]", "", v) + m = re.fullmatch(r"T(0\d{3})(\.\d{3})?", v) + return f"AML.T{m.group(1)}{m.group(2) or ''}" if m else "" def _norm_owasp(v: str) -> str: @@ -82,6 +90,12 @@ def _norm_owasp(v: str) -> str: return f"LLM{int(m.group(1)):02d}" if m else "" +def _norm_asi(v: str) -> str: + """owasp.asi01, ASI01, ASI 01, ASI01:2026 -> ASI01 (OWASP Agentic Top 10).""" + m = re.search(r"ASI\s*0?(\d+)", v.strip().upper()) + return f"ASI{int(m.group(1)):02d}" if m and 1 <= int(m.group(1)) <= 10 else "" + + def _tags_split(tags): """Pull ATLAS / OWASP / ATT&CK out of a Sigma tags list.""" atlas, owasp, attack = [], [], [] @@ -93,6 +107,7 @@ def _tags_split(tags): if v: atlas.append(v) elif "owasp" in low: + # ASI tags live in the owasp namespace too; _tags_asi collects them. v = _norm_owasp(t) if v: owasp.append(v) @@ -105,11 +120,17 @@ def parse_sigma(path: Path): """Sigma: a real YAML document. Multi-document files take the first doc.""" raw = path.read_text(encoding="utf-8") try: - doc = next(d for d in yaml.safe_load_all(raw) if isinstance(d, dict)) - except (StopIteration, yaml.YAMLError): + docs = [d for d in yaml.safe_load_all(raw) if isinstance(d, dict)] + doc = docs[0] + except (IndexError, yaml.YAMLError): return None ls = doc.get("logsource") or {} - atlas, owasp, attack = _tags_split(doc.get("tags")) + # Tags from every document, not the first. A multi-rule file tags each rule + # separately, and reading only the first dropped T0086 from the second rule + # of agentic_orchestration_behavior.yml. + all_tags = [t for d in docs for t in (d.get("tags") or [])] + atlas, owasp, attack = _tags_split(all_tags) + atlas, owasp, attack = sorted(set(atlas)), sorted(set(owasp)), sorted(set(attack)) return { "format": "Sigma", "title": doc.get("title", path.stem), @@ -135,7 +156,7 @@ def parse_yara(path: Path): meta.setdefault(k.lower(), v) names = re.findall(r"^\s*rule\s+(\w+)", raw, re.M) header = re.search(r"/\*(.*?)\*/", raw, re.S) - atlas = [_norm_atlas(x) for x in re.findall(r"AML\.T[\d.]+|T\d{4}(?:\.\d+)?", + atlas = [_norm_atlas(x) for x in re.findall(ATLAS_IN_TEXT, (meta.get("atlas", "") + " " + (header.group(1) if header else "")))] owasp = [_norm_owasp(x) for x in re.findall(r"LLM\s*0?\d+", (meta.get("owasp", "") + " " + (header.group(1) if header else "")))] @@ -165,7 +186,7 @@ def parse_suricata(path: Path): meta_blob = " ".join(re.findall(r"metadata:\s*([^;]+);", joined)) header = re.search(r"#(.*?)(?:\nalert)", raw, re.S) scope = (meta_blob + " " + (header.group(1) if header else "")) - atlas = [_norm_atlas(x) for x in re.findall(r"AML\.T[\d.]+|T\d{4}(?:\.\d+)?", scope)] + atlas = [_norm_atlas(x) for x in re.findall(ATLAS_IN_TEXT, scope)] owasp = [_norm_owasp(x) for x in re.findall(r"LLM\s*0?\d+", scope)] return { "format": "Suricata", @@ -212,7 +233,9 @@ def load_rules(mapping_rows): # MAPPINGS is the curated source where present; tags fill the gaps. atlas = sorted(set(r["atlas"]) | {_norm_atlas(x) for x in row.get("atlas", [])}) owasp = sorted(set(r["owasp"]) | {_norm_owasp(x) for x in row.get("owasp", [])}) + asi = sorted({_norm_asi(x) for x in row.get("asi", [])} - {""}) r.update({ + "asi": asi, "file": path.name, "path": str(path.relative_to(REPO)), "category": category_label(label), @@ -225,10 +248,54 @@ def load_rules(mapping_rows): def load_mappings(): - """Parse MAPPINGS.md: per-rule rows plus the ATLAS / OWASP index tables.""" + """Parse MAPPINGS.md: per-rule rows plus the ATLAS / OWASP index tables. + + Columns are read by header name, not by position. The per-rule parser used + to require five cells, and section 04 had four - no OWASP column - so all + nine AI-infrastructure rows were dropped and those rules lost their + reference text on the site with nothing failing. + """ rows, atlas_index, owasp_index = {}, [], [] if not MAPPINGS.exists(): return rows, atlas_index, owasp_index + section, header = None, [] + + def ids(cell): + return [x.strip() for x in cell.split(",") if x.strip() and x.strip() not in ("-", "—")] + + for line in MAPPINGS.read_text(encoding="utf-8").splitlines(): + if line.startswith("## "): + head = line[3:].strip().lower() + section = ("atlas_index" if "atlas technique index" in head + else "asi_index" if "agentic" in head and "index" in head + else "owasp_index" if "owasp top 10" in head and "index" in head + else "rules") + header = [] + continue + if not line.startswith("|") or set(line.strip()) <= set("|-: "): + continue + cells = [c.strip() for c in line.strip().strip("|").split("|")] + if not header: + header = [c.lower() for c in cells] + continue + col = dict(zip(header, cells)) + if section == "rules": + name = cells[0].strip("`") + rows[name] = { + "format": col.get("format", ""), + "atlas": ids(col.get("atlas", "")), + "owasp": ids(col.get("owasp", "")), + "asi": ids(col.get("asi", "")), + "reference": next((v for k, v in col.items() + if "reference" in k), ""), + } + elif section == "atlas_index" and len(cells) >= 3: + atlas_index.append({"id": _norm_atlas(cells[0]), "raw": cells[0], + "title": cells[1], "count": int(re.sub(r"\D", "", cells[2]) or 0)}) + elif section == "owasp_index" and len(cells) >= 3: + owasp_index.append({"id": _norm_owasp(cells[0]), "raw": cells[0], + "title": cells[1], "count": int(re.sub(r"\D", "", cells[2]) or 0)}) + return rows, atlas_index, owasp_index section = None for line in MAPPINGS.read_text(encoding="utf-8").splitlines(): if line.startswith("## "): @@ -303,9 +370,22 @@ def load_case_studies(): # that names none, because it implies coverage nobody has. "detections": [str(d) for d in (c.get("detections") or [])], "iocs": iocs, - "response_actions": [str(a) for a in (c.get("response_actions") or [])], + # Legacy strings, or {phase, action}. Normalised to one shape so the + # page renders recovery as its own lane without guessing a phase for + # the strings that never stated one. + "response_actions": [ + {"phase": str(a.get("phase", "")), "action": str(a.get("action", ""))} + if isinstance(a, dict) else {"phase": "", "action": str(a)} + for a in (c.get("response_actions") or [])], "lesson": c.get("lesson", ""), "references": refs, + # Structured intel fields. Absent means the source did not say. + "attack": [str(a) for a in (c.get("attack") or [])], + "owasp_agentic": [str(a) for a in (c.get("owasp_agentic") or [])], + "actors": [dict(a) for a in (c.get("actors") or []) if isinstance(a, dict)], + "victims": dict(c.get("victims") or {}), + "external_ids": {k: [str(x) for x in (v if isinstance(v, list) else [v])] + for k, v in (c.get("external_ids") or {}).items()}, }) return out diff --git a/artifacts/scripts/site_intel.py b/artifacts/scripts/site_intel.py new file mode 100644 index 0000000..0a83769 --- /dev/null +++ b/artifacts/scripts/site_intel.py @@ -0,0 +1,922 @@ +"""Site views for the threat-intel layer, the entity graph and the triage-script builder. + +Kept out of build_site.py because that file already holds the catalog's whole +page, and these three views share nothing with it but the drawer, the plan and +the design tokens. Everything here renders data that intel_graph.py and +triage_spec.py derived at build time; the browser computes counts for display, +never facts. +""" + +CSS = r""" +:root{ + /* Categorical series, one per entity type. Deliberately not the severity ramp + or the value/confidence scales: a node's colour says what it is, and must + never read as how bad it is. Mid-lightness, spaced in hue. */ + --series-1:#5b6fa8; --series-2:#3f8f7f; --series-3:#a0662e; --series-4:#8a5a9e; + --series-5:#6b8a3a; --series-6:#b0506a; --series-7:#4f8fb3; --series-8:#8c7b52; + --gap:#b64a3c; --covered:#3f8f7f; --offhost:#9c968c; +} +:root[data-theme=dark]{ + --series-1:#93a6dc; --series-2:#7fc8b8; --series-3:#e0a56c; --series-4:#c49ad6; + --series-5:#a9c774; --series-6:#e48da3; --series-7:#8fc7e6; --series-8:#cbbb8f; + --gap:#ef8d7f; --covered:#7fc8b8; --offhost:#7c766e; +} +@media (prefers-color-scheme:dark){ + :root:not([data-theme=light]):not([data-theme=dark]){ + --series-1:#93a6dc; --series-2:#7fc8b8; --series-3:#e0a56c; --series-4:#c49ad6; + --series-5:#a9c774; --series-6:#e48da3; --series-7:#8fc7e6; --series-8:#cbbb8f; + --gap:#ef8d7f; --covered:#7fc8b8; --offhost:#7c766e; + } +} +.isec{margin:26px 0 8px} +.isec>h3{font-size:15px;margin:0 0 4px} +.isec>p.lede{margin:0 0 12px;color:var(--muted);max-width:78ch} +.istats{display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:10px;margin:14px 0} +.istat{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:10px 12px} +.istat b{display:block;font-size:22px;line-height:1.15} +.istat span{color:var(--muted);font-size:12px} +.agrid{display:grid;grid-template-columns:repeat(auto-fill,minmax(260px,1fr));gap:10px} +.acard{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:11px 13px; + text-align:left;display:flex;flex-direction:column;gap:5px} +.acard:hover{background:var(--hover)} +.acard .an{font-weight:600} +.acard .am{color:var(--muted);font-size:12px} +.kind{display:inline-block;border-radius:999px;padding:1px 8px;font-size:11px;border:1px solid var(--line)} +.kind.k-state-nexus{border-color:var(--series-1);color:var(--series-1)} +.kind.k-criminal{border-color:var(--series-6);color:var(--series-6)} +.kind.k-commercial{border-color:var(--series-3);color:var(--series-3)} +.kind.k-unattributed-cluster{border-color:var(--series-8);color:var(--series-8)} +.gapn{color:var(--gap);font-size:12px} +.seg.small .segbtn{font-size:12px;padding:3px 9px} +.matrix{display:flex;gap:6px;overflow-x:auto;padding-bottom:8px;margin-top:10px} +.mcol{min-width:132px;flex:1 0 132px} +.mhead{font-size:11px;font-weight:600;color:var(--muted);padding:4px 2px;border-bottom:2px solid var(--line); + margin-bottom:4px;min-height:34px} +.mhead i{font-style:normal;color:var(--faint);font-weight:400} +.mcell{display:block;width:100%;text-align:left;border:1px solid var(--line-soft);border-radius:6px; + padding:4px 6px;margin:0 0 3px;font-size:11px;line-height:1.3;background:var(--panel);color:var(--ink)} +.mcell.sub{margin-left:8px;width:calc(100% - 8px)} +.mcell .mid{display:block;font-family:ui-monospace,Menlo,Consolas,monospace;font-size:10px;color:var(--muted)} +.mcell.zero{opacity:.45} +.mcell.sel{outline:2px solid var(--accent);outline-offset:1px} +.mcell.st-gap{border-color:var(--gap);box-shadow:inset 3px 0 0 var(--gap)} +.mcell.st-covered{box-shadow:inset 3px 0 0 var(--covered)} +.mcell.st-offhost{box-shadow:inset 3px 0 0 var(--offhost)} +.mlegend{display:flex;flex-wrap:wrap;gap:12px;font-size:12px;color:var(--muted);margin-top:6px} +.mlegend i{display:inline-block;width:10px;height:10px;border-radius:2px;margin-right:5px;vertical-align:-1px} +.tdetail{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:12px 14px;margin-top:10px} +.tdetail h4{margin:0 0 6px} +.linkrow2{display:flex;flex-wrap:wrap;gap:6px;margin:4px 0 8px} +.lchip{border:1px solid var(--line);background:var(--panel-2);border-radius:999px;padding:2px 9px;font-size:12px} +.lchip:hover{background:var(--hover)} +.bars{display:grid;grid-template-columns:repeat(auto-fill,minmax(300px,1fr));gap:14px} +.barbox{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:10px 12px} +.barbox h4{margin:0 0 8px;font-size:13px} +.vbar{display:grid;grid-template-columns:150px 1fr 28px;gap:8px;align-items:center;font-size:12px;margin:3px 0} +.vbar .bl{overflow:hidden;text-overflow:ellipsis;white-space:nowrap} +.vbar .bt{height:10px;border-radius:3px;background:var(--line-soft);overflow:hidden} +.vbar .bt i{display:block;height:100%;background:var(--series-1)} +.vbar .bn{text-align:right;color:var(--muted)} +.htable .lchip{display:inline-block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap; + margin:0 0 3px;vertical-align:top} +.htable td:last-child{max-width:190px} +.qbars{display:flex;align-items:flex-end;gap:6px;height:120px;border-bottom:1px solid var(--line);padding-top:6px} +.qbar{flex:1;display:flex;flex-direction:column;align-items:center;justify-content:flex-end;height:100%;min-width:26px} +.qbar i{display:block;width:70%;background:var(--series-2);border-radius:3px 3px 0 0} +.qbar span{font-size:10px;color:var(--muted);margin-top:3px;white-space:nowrap} +.qbar b{font-size:11px} +.htable{width:100%;border-collapse:collapse;font-size:12px} +.hscroll{overflow-x:auto;max-width:100%} +.htable th,.htable td{border-bottom:1px solid var(--line-soft);padding:5px 6px;text-align:left;vertical-align:top} +.htable td.gap{color:var(--gap)} +.htable td.off{color:var(--faint)} +.phase{display:inline-block;font-size:10px;text-transform:uppercase;letter-spacing:.04em;border-radius:4px; + padding:0 5px;border:1px solid var(--line);color:var(--muted)} +.ph-contain{border-color:var(--series-6);color:var(--series-6)} +.ph-eradicate{border-color:var(--series-3);color:var(--series-3)} +.ph-recover{border-color:var(--series-2);color:var(--series-2)} +.ph-harden{border-color:var(--series-1);color:var(--series-1)} +.sighting{border-left:3px solid var(--line);padding:2px 0 2px 9px;margin:6px 0} +.sighting .sm{font-size:11px;color:var(--muted)} +.vbar{border:0;background:none;width:100%;text-align:left;padding:2px 3px;border-radius:5px;color:var(--ink)} +.vbar:hover{background:var(--hover)} +.vbar.on,.qbar.on,.acard.on,.mhead.on{outline:2px solid var(--accent);outline-offset:1px} +.qbar{border:0;background:none;padding:0;color:var(--ink)} +.mhead{border:0;border-bottom:2px solid var(--line);background:none;width:100%;text-align:left;cursor:pointer} +.istat small{font-size:13px;color:var(--faint);font-weight:400} +.pivot{border:1px solid var(--accent-border);background:var(--accent-soft);border-radius:10px;padding:9px 12px; + margin:12px 0;position:sticky;top:0;z-index:5} +.pchips,.pacts{display:flex;flex-wrap:wrap;gap:6px;align-items:center} +.pacts{margin-top:7px} +.tline{display:block} +.tline .tgrid{stroke:var(--line-soft)} +.tline .tax,.tline .tlab{fill:var(--muted);font-size:10px} +.tline .tlab{font-size:11px;fill:var(--ink)} +.tline .tspan{stroke:var(--line);stroke-width:2} +.tline .tcase{fill:var(--series-3);cursor:pointer} +.tline .tsight{fill:var(--series-1);cursor:pointer} +.tline .tcase:hover,.tline .tsight:hover,.tline :focus{stroke:var(--ink);stroke-width:2} +.hmap{border-collapse:collapse;font-size:11px} +.hmap th,.hmap td{border:1px solid var(--line-soft);padding:0;text-align:center;min-width:22px;height:22px} +.hmap thead th{height:auto;vertical-align:bottom} +.hmap tbody th{text-align:left;padding:1px 4px;white-space:nowrap} +.hmh{border:0;background:none;writing-mode:vertical-rl;transform:rotate(180deg);font-size:10px; + font-family:ui-monospace,Menlo,Consolas,monospace;color:var(--muted);padding:3px 0} +.hmap td.h-covered{background:color-mix(in srgb,var(--covered) 55%,var(--panel));color:var(--on-tone)} +.hmap td.h-gap{background:color-mix(in srgb,var(--gap) 60%,var(--panel));color:var(--on-tone)} +.hmap td.h-offhost{background:color-mix(in srgb,var(--offhost) 45%,var(--panel))} +.hmap.sim td{min-width:30px;font-size:10px;color:var(--ink)} +.vlab{writing-mode:vertical-rl;transform:rotate(180deg);font-size:10px;color:var(--muted);white-space:nowrap} +/* graph workbench */ +.gwrap{display:grid;grid-template-columns:230px 1fr 280px;gap:10px;min-height:620px} +.gpane{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:10px;overflow:auto;max-height:78vh} +.gpane h4{margin:6px 0;font-size:12px;color:var(--muted);text-transform:uppercase;letter-spacing:.04em} +#cy{border:1px solid var(--line);border-radius:10px;background:var(--panel-2);min-height:620px;height:78vh} +.gsearch{width:100%;padding:6px 8px;border:1px solid var(--field-line);border-radius:7px;background:var(--panel);color:var(--ink)} +.gres{display:flex;flex-direction:column;gap:2px;margin-top:6px} +.gres button,.nbl button{text-align:left;border:0;background:none;padding:3px 4px;border-radius:5px;font-size:12px} +.gres button:hover,.nbl button:hover{background:var(--hover)} +.tfilter{display:flex;flex-wrap:wrap;gap:4px} +.tfilter label{font-size:11px;border:1px solid var(--line);border-radius:999px;padding:1px 7px;cursor:pointer} +.tfilter input{margin:0 4px 0 0;vertical-align:-1px} +.gbtns{display:flex;flex-wrap:wrap;gap:5px;margin:6px 0} +.gbtns .btn{font-size:12px;padding:4px 8px} +.dot2{display:inline-block;width:9px;height:9px;border-radius:50%;margin-right:5px;vertical-align:0} +.nbl{display:flex;flex-direction:column} +.nbl .rel{font-size:11px;color:var(--faint);margin-top:6px} +.gnote{font-size:12px;color:var(--muted)} +/* triage builder */ +.tbuild{border:1px solid var(--line);border-radius:10px;background:var(--panel);padding:12px 14px;margin:14px 0} +.tbuild h3{margin:0 0 4px;font-size:15px} +.tbuild .tcount{font-size:12px;color:var(--muted);margin:6px 0} +.tbuild pre{max-height:320px;overflow:auto;background:var(--panel-2);border:1px solid var(--line-soft); + border-radius:8px;padding:8px;font-size:11px} +.fw{display:grid;grid-template-columns:repeat(auto-fill,minmax(250px,1fr));gap:10px;margin-top:10px} +.fwc{border:1px solid var(--line-soft);border-radius:8px;padding:9px 11px;background:var(--panel-2)} +.fwc h4{margin:0 0 4px;font-size:13px} +.fwc p{margin:0 0 6px;font-size:12px;color:var(--muted)} +.fwc code{display:block;white-space:pre-wrap;word-break:break-all;font-size:11px;background:var(--panel); + border:1px solid var(--line-soft);border-radius:6px;padding:6px} +@media (max-width:900px){ + .gwrap{grid-template-columns:1fr} + #cy{height:60vh;min-height:420px} + .gpane{max-height:none} + .vbar{grid-template-columns:110px 1fr 24px} +} +""" + +JS = r""" +/* ---------- threat intel ---------- + Everything on this view is derived by scripts/intel_graph.py from the actor + profiles, the case studies, the catalog and the rule corpus. The page counts + for display; it does not decide anything. */ +const ACTORMAP=Object.fromEntries(INTEL.actors.map(a=>[a.id,a])); +const CASEMAP=Object.fromEntries(CASES.map(c=>[c.id,c])); +const ATL=INTEL.atlas; +const TNAME=id=>ATL.techniques[id]||''; +const KIND_LABEL={'state-nexus':'state nexus','criminal':'criminal','commercial':'commercial', + 'unattributed-cluster':'named cluster'}; +let intelLayer='actors', techSel=null, matrixAll=false; +const RULES_FOR=(()=>{const m={};for(const r of RULES)for(const t of r.atlas)(m[t]=m[t]||new Set()).add(r.file);return m})(); +const rulesFor=t=>new Set([...(RULES_FOR[t]||[]),...(RULES_FOR[t.split('.').slice(0,2).join('.')]||[])]); +const OFFHOST=new Set(INTEL.off_host_tactics); +const offHost=t=>{const ta=ATL.technique_tactics[t]||[];return ta.length&&ta.every(x=>OFFHOST.has(x))}; +const AN=INTEL.analytics; +const quarterOf=d=>{const m=/^(\d{4})-(\d{2})/.exec(d||'');return m?`${m[1]}-Q${Math.floor((+m[2]-1)/3)+1}`:''}; +const tacticsOf=ts=>[...new Set(ts.flatMap(t=>ATL.technique_tactics[t]||[]))]; + +/* Cross-filter. One facet set drives every chart, list and count on the view: + click a bar, a matrix cell, a timeline mark or a cluster and everything else + narrows to match. Facets that belong to actors (type, nexus, motivation, + cluster) filter a case through the actors linked to it, so an unattributed + case drops out of an actor-facet view rather than silently staying in. */ +const IF={}; +const IF_LABEL={sector:'sector',region:'region',country:'country',kind:'actor type',nexus:'nexus', + motivation:'motivation',technique:'technique',tactic:'tactic',quarter:'quarter',cluster:'cluster',actor:'actor'}; +const hasTech=(list,t)=>list.some(x=>x===t||x.startsWith(t+'.')); +function actorEvents(a){return AN.events.filter(e=>e.actor===a.id)} +function actorPasses(a){ + const d=a.derived; + for(const [k,v] of Object.entries(IF)){ + if(k==='sector'&&!d.sectors.includes(v))return false; + if(k==='region'&&!d.regions.includes(v))return false; + if(k==='country'&&!d.countries.includes(v))return false; + if(k==='kind'&&a.kind!==v)return false; + if(k==='nexus'&&(a.nexus||'unstated')!==v)return false; + if(k==='motivation'&&!(a.motivation||[]).includes(v))return false; + if(k==='technique'&&!hasTech(d.techniques,v))return false; + if(k==='tactic'&&!d.tactics.includes(v))return false; + if(k==='quarter'&&!actorEvents(a).some(e=>quarterOf(e.date)===v))return false; + if(k==='cluster'&&!(AN.clusters[+v]||{actors:[]}).actors.includes(a.id))return false; + if(k==='actor'&&a.id!==v)return false; + } + return true; +} +const ACTOR_FACETS=new Set(['kind','nexus','motivation','cluster','actor']); +function casePasses(c){ + const v=c.victims||{}; + const regions=(v.countries||[]).map(x=>INTEL.region_of[x]).filter(Boolean); + for(const [k,val] of Object.entries(IF)){ + if(k==='sector'&&!(v.sectors||[]).includes(val))return false; + if(k==='region'&&!regions.includes(val))return false; + if(k==='country'&&!(v.countries||[]).includes(val))return false; + if(k==='technique'&&!hasTech(c.atlas||[],val))return false; + if(k==='tactic'&&!tacticsOf(c.atlas||[]).includes(val))return false; + if(k==='quarter'&&quarterOf(c.disclosed)!==val)return false; + } + if([...ACTOR_FACETS].some(k=>k in IF)){ + const linked=(c.actors||[]).map(l=>ACTORMAP[l.ref]).filter(Boolean); + if(!linked.some(actorPasses))return false; + } + return true; +} +function fActors(){return INTEL.actors.filter(actorPasses)} +function fCases(){return CASES.filter(casePasses)} +function setIF(k,v){if(IF[k]===v)delete IF[k];else IF[k]=v;renderIntel()} +function techUse(t){ + const acts=fActors().filter(a=>a.derived.techniques.includes(t)).map(a=>a.id); + const cs=fCases().filter(c=>(c.atlas||[]).includes(t)).map(c=>c.id); + return {actors:acts,cases:cs,rules:[...rulesFor(t)]}; +} +function techState(t){ + const u=techUse(t); + if(!u.actors.length&&!u.cases.length)return u.rules.length?'covered':''; + if(u.rules.length)return 'covered'; + return offHost(t)?'offhost':'gap'; +} +function kindBadge(k){return `${esc(KIND_LABEL[k]||k)}`} +function actorCard(a){ + const d=a.derived; + return ``; +} +function tally(list){const o={};for(const x of list)o[x]=(o[x]||0)+1; + return Object.fromEntries(Object.entries(o).sort((a,b)=>b[1]-a[1]||a[0].localeCompare(b[0])))} +// A bar chart whose bars are filters. data-f/data-v carry the facet; the label +// map lets a bar read "state nexus" while filtering on "state-nexus". +function bars(title,facet,counts,color,label){ + const e=Object.entries(counts||{}); + if(!e.length)return `

    ${esc(title)}

    None stated in the sources.

    `; + const max=Math.max(...e.map(x=>x[1])); + return `

    ${esc(title)}

    ${e.slice(0,14).map(([k,n])=> + ``).join('')}
    `; +} +function matrixHTML(acts,cases){ + const use={}; + const add=(t,k,id)=>{(use[t]=use[t]||{actors:new Set(),cases:new Set()})[k].add(id)}; + for(const a of acts)for(const t of a.derived.techniques)add(t,'actors',a.id); + for(const c of cases)for(const t of c.atlas||[])add(t,'cases',c.id); + const layerCount=t=>{const u=use[t]||{actors:new Set(),cases:new Set()}; + return intelLayer==='actors'?u.actors.size:intelLayer==='cases'?u.cases.size: + intelLayer==='rules'?rulesFor(t).size:(u.actors.size+u.cases.size)}; + const stateOf=t=>{const u=use[t];if(!u)return rulesFor(t).size?'covered':''; + return rulesFor(t).size?'covered':offHost(t)?'offhost':'gap'}; + const all=Object.keys(ATL.techniques); + const max=Math.max(1,...all.map(layerCount)); + const cols=ATL.tactic_order.map(ta=>{ + const ts=all.filter(t=>(ATL.technique_tactics[t]||[]).includes(ta)) + .filter(t=>matrixAll||layerCount(t)>0||(intelLayer==='gaps'&&use[t])).sort(); + const cells=ts.map(t=>{ + const n=layerCount(t), st=intelLayer==='gaps'?stateOf(t):''; + const pct=intelLayer==='gaps'?0:Math.round(n/max*70); + const bg=pct?`background:color-mix(in srgb, var(--series-1) ${pct}%, var(--panel))`:''; + return ``}).join(''); + return `
    ${ + cells||'

    none

    '}
    `; + }).join(''); + return `
    ${cols}
    + ${intelLayer==='gaps'?`
    used, no rule + has a rule + off-host: happens on the adversary's side, nothing to detect on an endpoint
    `:''} + ${techSel?techDetailHTML(techSel):''}`; +} +function techDetailHTML(t){ + const u=techUse(t); + const tools=TOOLS.filter(x=>(x.atlas||[]).includes(t)); + const assoc=AN.cooccurrence.filter(r=>r.a===t||r.b===t).slice(0,6); + return `

    ${esc(t)} ${esc(TNAME(t))}

    +

    ${(ATL.technique_tactics[t]||[]).map(x=>esc(ATL.tactics[x]||x)).join(' · ')} + · ATLAS ↗ + ${offHost(t)?' · off-host technique':''} + ·

    + ${u.actors.length?`Actors
    ${u.actors.map(id=> + ``).join('')}
    `:''} + ${u.cases.length?`Case studies
    ${u.cases.map(id=> + ``).join('')}
    `:''} + Rules
    ${u.rules.length?u.rules.map(f=> + ``).join(''): + `${offHost(t)?'None, and none expected: this happens off the endpoint.':'None. This is a coverage gap.'}`}
    + ${tools.length?`Catalogued tools mapped to it
    ${tools.map(x=> + ``).join('')}
    `:''} + ${assoc.length?`Reported alongside (co-occurrence lift, ${AN.observations} observations) +
    ${assoc.map(r=>{const o=r.a===t?r.b:r.a;return ``}).join('')}
    `:''} +
    `; +} +// Timeline swimlane: one lane per actor, a mark per dated observation. Months on +// x. SVG by hand - no charting library, and it stays readable in both themes. +function timelineSVG(acts){ + const ev=AN.events.filter(e=>acts.some(a=>a.id===e.actor)&&(!IF.quarter||quarterOf(e.date)===IF.quarter)); + if(!ev.length)return '

    No dated observations in this selection.

    '; + const mon=d=>{const m=/^(\d{4})-(\d{2})/.exec(d);return m?(+m[1])*12+(+m[2]-1):0}; + const lo=Math.min(...ev.map(e=>mon(e.date))), hi=Math.max(...ev.map(e=>mon(e.date)))+1; + const lanes=[...new Set(ev.map(e=>e.actor))].sort((x,y)=> + Math.min(...ev.filter(e=>e.actor===x).map(e=>mon(e.date)))-Math.min(...ev.filter(e=>e.actor===y).map(e=>mon(e.date)))); + const L=150,W=Math.max(640,(hi-lo)*28+L+20),H=lanes.length*22+34; + const X=m=>L+(m-lo)/(hi-lo)*(W-L-20); + const ticks=[];for(let m=lo;m<=hi;m++)if(m%3===0)ticks.push(m); + return `
    + ${ticks.map(m=>` + ${Math.floor(m/12)}-${String(m%12+1).padStart(2,'0')}`).join('')} + ${lanes.map((id,i)=>{const y=12+i*22,a=ACTORMAP[id]||{name:id||'unattributed'}; + const mine=ev.filter(e=>e.actor===id);const xs=mine.map(e=>X(mon(e.date))); + return `${esc(a.name.slice(0,20))} + + ${mine.map(e=>{const x=X(mon(e.date));const tip=esc(`${e.date} · ${a.name} · ${e.kind} ${e.ref} · ${e.techniques.join(', ')}`); + return e.kind==='case'?`${tip}` + :`${tip}`}).join('')}`}).join('')} +
    +
    case study + sighting (reported AI use)
    `; +} +// Technique x actor heatmap: which adversaries share which techniques. +function heatmapHTML(acts){ + const tcount=tally(acts.flatMap(a=>a.derived.techniques)); + const ts=Object.keys(tcount).slice(0,24); + if(!ts.length||!acts.length)return '

    Nothing to compare in this selection.

    '; + return `
    ${ts.map(t=> + ``).join('')} + ${acts.map(a=>`${ts.map(t=>{ + const on=a.derived.techniques.includes(t), st=on?(rulesFor(t).size?'covered':offHost(t)?'offhost':'gap'):''; + return ``}).join('')}`).join('')}
    ${on?'●':''}
    +
    has a ruleno rule + off-host
    `; +} +function simHTML(acts){ + const ids=AN.similarity.ids.filter(id=>acts.some(a=>a.id===id)); + if(ids.length<2)return '

    Pick a wider selection to compare actors.

    '; + const idx=Object.fromEntries(AN.similarity.ids.map((x,i)=>[x,i])); + const M=AN.similarity.matrix; + return `
    ${ids.map(id=> + ``).join('')} + ${ids.map(r=>`${ids.map(c=>{ + const v=M[idx[r]][idx[c]];return ``}).join('')}`).join('')}
    ${esc((ACTORMAP[id]||{}).name||id)}
    ${r===c?'':v>=.2?v.toFixed(2).slice(1):''}
    `; +} +function clustersHTML(){ + if(!AN.clusters.length)return '

    No clusters at this threshold.

    '; + return `
    ${AN.clusters.map((c,i)=>``).join('')}
    `; +} +function backlogHTML(){ + const on=AN.backlog.filter(b=>!b.off_host), off=AN.backlog.filter(b=>b.off_host); + const row=b=>` ${esc(b.name)} + ${b.actors}${b.cases}${b.score}`; + return `
    + ${on.map(row).join('')||''}
    On-host technique with no ruleActorsCasesPriority
    None.
    + ${off.length?`

    Also rule-less, but off-host and so not a detection backlog item: + ${off.map(b=>esc(b.technique.replace('AML.',''))).join(', ')}.

    `:''}`; +} +function cooccHTML(){ + if(!AN.cooccurrence.length)return '

    No technique pair is reported together twice yet.

    '; + return `
    ${ + AN.cooccurrence.slice(0,12).map(r=>` + + `).join('')}
    TechniqueReported withTogetherLift
    ${esc(TNAME(r.a))} ${esc(TNAME(r.b))}${r.support}${r.lift}
    `; +} +function pivotHTML(acts,cases){ + const keys=Object.keys(IF); + if(!keys.length)return ''; + const rules=new Set(acts.flatMap(a=>a.derived.detections_by_technique.concat(a.derived.detections_cited)) + .concat(cases.flatMap(c=>c.detections||[]))); + if(IF.technique)for(const f of rulesFor(IF.technique))rules.add(f); + const collect=[...new Set(acts.flatMap(a=>a.derived.collect))].filter(x=>ROWMAP[x]); + const lab=(k,v)=>k==='actor'?(ACTORMAP[v]||{}).name||v:k==='cluster'?'cluster '+(+v+1):k==='technique'?v+' '+TNAME(v): + k==='tactic'?ATL.tactics[v]||v:k==='kind'?KIND_LABEL[v]||v:v; + return `
    ${keys.map(k=>``).join('')} +
    +
    ${acts.length} actor${acts.length===1?'':'s'} · ${cases.length} case${cases.length===1?'':'s'} match. Pivot: + ${cases.length?``:''} + ${rules.size?``:''} + ${acts.length?``:''} + ${collect.length?``:''}
    `; +} +function intelHTML(){ + const acts=fActors(), cases=fCases(); + const allAct=INTEL.actors; + const observed=[...new Set(acts.flatMap(a=>a.derived.techniques).concat(cases.flatMap(c=>c.atlas||[])))]; + const off=observed.filter(t=>!rulesFor(t).size&&offHost(t)).length; + const cov=observed.filter(t=>rulesFor(t).size).length; + const atomic=cases.flatMap(c=>c.iocs||[]).filter(i=>INTEL.atomic_types.includes(i.type)).length; + const sortA=[...acts].sort((a,b)=>(b.derived.last_seen||'').localeCompare(a.derived.last_seen||'')||a.name.localeCompare(b.name)); + const vic=cases.map(c=>c.victims||{}); + const q=tally(cases.map(c=>quarterOf(c.disclosed)).filter(Boolean)); + const qs=Object.keys(q).sort(), qmax=Math.max(1,...Object.values(q)); + const tacCount=tally(acts.flatMap(a=>a.derived.tactics).concat(cases.flatMap(c=>tacticsOf(c.atlas||[])))); + const links=cases.flatMap(c=>(c.actors||[]).filter(l=>!IF.actor||l.ref===IF.actor).map(l=>l.link_confidence)); + const ivars=Object.keys(IF).length; + return `

    Threat intel

    +

    Who is reported using AI tooling against whom, how, what it leaves on a host, and which + rule in this repository catches it. Every chart below is a filter: click a bar, a tactic, a matrix + cell, a timeline mark or a cluster, and the rest of the page narrows to match. Pivot out to the + case studies, the rules, the graph or a collection plan from the bar that appears.

    +
    + STIX 2.1 + Maltego CSV
    + ${pivotHTML(acts,cases)} +
    +
    ${acts.length}${ivars?`/${allAct.length}`:''}actors and named clusters
    +
    ${cases.length}${ivars?`/${CASES.length}`:''}case studies
    +
    ${atomic}atomic indicators
    +
    ${observed.length}ATLAS techniques observed
    +
    ${cov}/${observed.length-off}on-host techniques with a rule
    +
    ${off}off-host, nothing to detect on an endpoint
    +
    ${Object.entries(tally(links)).map(([k,v])=>v+' '+k).join(' · ')||'-'}attribution links by confidence
    +
    +

    Timeline

    Every dated observation per actor: squares are case studies, + dots are reported AI use. Hover for the techniques; click to open the profile.

    + ${timelineSVG(acts)} +
    ${qs.map(k=>``).join('')}
    +

    Case studies by disclosure quarter. Click a quarter to filter.

    +

    Actors ${acts.length}

    Most recent activity first. + A profile's techniques, victims, indicators and detections are derived from the cases and sightings that cite it.

    +
    ${sortA.map(actorCard).join('')||'

    No actor matches.

    '}
    +

    Attack map

    ATLAS ${esc(ATL.release)}, tactics in kill-chain order. Pick a + layer; pick a technique for who uses it, what detects it and what is reported alongside it; click a tactic heading to filter.

    +
    ${[['actors','Actors'],['cases','Cases'], + ['rules','Rules'],['gaps','Coverage gaps']].map(([k,l])=> + ``).join('')}
    + + ${matrixHTML(acts,cases)}
    +

    Victimology and profile

    Only what the sources state. A blank sector is + a source that did not say, not a sector nobody targeted. Sector, region and country here count case studies.

    +
    ${bars('Sector (cases)','sector',tally(vic.flatMap(x=>x.sectors||[])),'var(--series-1)')} + ${bars('Region (cases)','region',tally(vic.flatMap(x=>(x.countries||[]).map(c=>INTEL.region_of[c]).filter(Boolean))),'var(--series-2)')} + ${bars('Country (cases)','country',tally(vic.flatMap(x=>x.countries||[])),'var(--series-3)')} + ${bars('Sector (actors)','sector',tally(acts.flatMap(a=>a.derived.sectors)),'var(--series-1)')} + ${bars('Actor type','kind',tally(acts.map(a=>a.kind)),'var(--series-4)',k=>KIND_LABEL[k]||k)} + ${bars('Stated nexus','nexus',tally(acts.map(a=>a.nexus||'unstated')),'var(--series-5)')} + ${bars('Motivation','motivation',tally(acts.flatMap(a=>a.motivation||[])),'var(--series-6)')} + ${bars('Tactics used','tactic',tacCount,'var(--series-7)',k=>ATL.tactics[k]||k)}
    +

    Who shares which techniques

    Technique by actor for the current selection, + coloured by whether this repository can detect it.

    ${heatmapHTML(sortA)}
    +

    Detection backlog

    ${esc(AN.method.backlog)}. The top of this list is + where a new rule would cover the most reported activity.

    ${backlogHTML()}
    +

    Similarity and clusters

    Unsupervised and descriptive: + ${esc(AN.method.similarity)}; clusters are ${esc(AN.method.clusters)}. Built from what the sources + report about ${allAct.length} actors, so it measures how alike the reporting is. It is a triage and hypothesis + aid, never attribution.

    + ${clustersHTML()}
    ${simHTML(sortA)}
    +

    Techniques reported together

    ${esc(AN.method.cooccurrence)}. Lift above 1 + means the pair appears together more often than chance, which makes the second a hunting lead when you find the first.

    + ${cooccHTML()}
    `; +} +function wireIntelLinks(scope){ + $$(scope+' [data-actor]').forEach(b=>b.onclick=()=>openActorDrawer(b.dataset.actor,b)); + $$(scope+' [data-actor]').forEach(b=>{if(b.tagName!=='BUTTON')b.onkeydown=e=>{if(e.key==='Enter')openActorDrawer(b.dataset.actor,b)}}); + $$(scope+' .lchip[data-rule]').forEach(b=>b.onclick=()=>openRuleDrawer(b.dataset.rule,b)); + $$(scope+' .lchip[data-tool]').forEach(b=>b.onclick=()=>openToolDrawer(b.dataset.tool,b)); + $$(scope+' .lchip[data-case]').forEach(b=>b.onclick=()=>{ + pushNav();closeDrawer();view='cases';update(); + const el=document.getElementById('cs-'+b.dataset.case); + if(el){el.open=true;el.scrollIntoView({block:'start'})}}); + $$(scope+' .lchip[data-anchor]').forEach(b=>b.onclick=()=>openDrawer(b.dataset.anchor,b)); +} +function renderIntel(){ + const y=window.scrollY; + $('#main').innerHTML=intelHTML(); + wireIntelLinks('#main'); + $$('#main [data-f]').forEach(b=>b.onclick=()=>setIF(b.dataset.f,b.dataset.v)); + $$('#main [data-tsel]').forEach(b=>b.onclick=()=>{techSel=b.dataset.tsel;renderIntel(); + const d=$('#main .tdetail');if(d)d.scrollIntoView({block:'center'})}); + $$('#main .segbtn[data-layer]').forEach(b=>b.onclick=()=>{intelLayer=b.dataset.layer;renderIntel()}); + const ma=$('#mAll');if(ma)ma.onchange=()=>{matrixAll=ma.checked;renderIntel()}; + $$('#main .mcell').forEach(b=>b.onclick=()=>{techSel=techSel===b.dataset.t?null:b.dataset.t;renderIntel()}); + const g=$('#goGraph');if(g)g.onclick=()=>{pushNav();view='graph';graphSeed=null;update()}; + const clr=$('#ifClear');if(clr)clr.onclick=()=>{for(const k of Object.keys(IF))delete IF[k];renderIntel()}; + const acts=fActors(),cases=fCases(); + const pc=$('#pvCases');if(pc)pc.onclick=()=>{pushNav();caseOnly=new Set(cases.map(c=>c.id));view='cases';update()}; + const pr=$('#pvRules');if(pr)pr.onclick=()=>{ + const rs=new Set(acts.flatMap(a=>a.derived.detections_by_technique.concat(a.derived.detections_cited)).concat(cases.flatMap(c=>c.detections||[]))); + if(IF.technique)for(const f of rulesFor(IF.technique))rs.add(f); + pushNav();resetRuleFilters();ruleSet=new Set(RULES.filter(r=>rs.has(r.file)).map(r=>r.file));view='rules';update()}; + const pg=$('#pvGraph');if(pg)pg.onclick=()=>{pushNav();view='graph';graphSeed=null; + history.replaceState(null,'','#graph/'+encodeURIComponent(acts.slice(0,40).map(a=>'actor:'+a.id).join('|')));update()}; + const pp=$('#pvPlan');if(pp)pp.onclick=()=>{const rows=[...new Set(acts.flatMap(a=>a.derived.collect))].filter(x=>ROWMAP[x]); + const n=rows.filter(x=>!picks.has(x)).length;rows.forEach(x=>picks.add(x));savePicks();renderTabs();renderToast(); + pp.disabled=true;pp.textContent=n?`added ${n}`:'already in plan'}; + requestAnimationFrame(()=>window.scrollTo(0,y)); +} +function actorDrawerHTML(a){ + const d=a.derived, base=location.origin==='null'?'':location.origin+location.pathname; + const byTac={}; + for(const h of d.hunt){for(const ta of (h.tactics.length?h.tactics:['?']))(byTac[ta]=byTac[ta]||[]).push(h)} + const order=[...ATL.tactic_order,'?'].filter(t=>byTac[t]); + const collect=d.collect.map(x=>ROWMAP[x]).filter(Boolean); + const vol={};for(const r of collect)vol[r.vol]=(vol[r.vol]||0)+1; + const atomic=d.iocs.filter(i=>INTEL.atomic_types.includes(i.type)); + const behav=d.iocs.filter(i=>!INTEL.atomic_types.includes(i.type)); + return `
    ${esc(a.name)} ${esc(a.id)} +
    +
    +
    ${kindBadge(a.kind)}${a.nexus?`nexus ${esc(a.nexus)}`:''} + ${(a.motivation||[]).map(m=>`${esc(m)}`).join('')}${confBadge(a.confidence)}
    + ${(a.aliases||[]).length?`

    also ${a.aliases.map(x=>esc(x.name)+' ('+esc(x.source)+')').join(' · ')}

    `:''} +

    ${esc(a.summary)}

    +

    ${esc(a.basis)}

    + ${a.contested?`
    Disputed. ${esc(a.contested)}
    `:''} +
    ${d.first_seen?`seen ${esc(d.first_seen)} to ${esc(d.last_seen)}`:'undated'} + ${(a.external_ids||{}).attack_group?' · '+(a.external_ids.attack_group).map(g=> + `ATT&CK ${esc(g)}`).join(' '):''}
    + ${a.links.length?`

    Attribution links ${a.links.length}

    + ${a.links.map(l=>`
    + ${confBadge(l.link_confidence)} ${esc(l.role||'')} · by ${esc(l.attributed_by)} + ${l.stated_confidence?`
    Stated: ${esc(l.stated_confidence)}
    `:''}
    `).join('')}
    `:''} + ${(a.sightings||[]).length?`

    Reported AI use ${a.sightings.length}

    + ${a.sightings.map(s=>`
    ${esc(s.date)} · ${esc(s.reporter)} + ${(s.ai_services||[]).length?' · '+esc(s.ai_services.join(', ')):''}
    ${esc(s.summary)} +
    `).join('')}
    `:''} + ${(AN.neighbours[a.id]||[]).length?`

    Most similar actors

    + ${AN.neighbours[a.id].map(n=>`
    + similarity ${n.score} · shared ${Object.entries(n.shared).map(([k,v])=>esc(k.replace('_',' ')+': '+v.map(x=>(TOOLMAP[x]||{}).tool||x).join(', '))).join(' · ')}
    `).join('')} +

    Similarity of what is reported, for pivoting. Not attribution.

    `:''} +

    Hunt → detect ${d.hunt.length}

    + ${d.hunt.length?` + ${order.map(ta=>byTac[ta].map((h,i)=>`${i?'':``} + + `).join('')).join('')} +
    TacticTechniqueRules in this repo
    ${esc(ATL.tactics[ta]||'')}${esc(h.technique)} ${esc(h.name)}${h.rules.length?h.rules.map(f=> + ``).join(' '):h.off_host?'off-host':'no rule'}
    `:'

    No techniques recorded.

    '} + ${(d.owasp_agentic||[]).length?`

    OWASP Agentic: ${d.owasp_agentic.map(x=>esc(x+' '+(INTEL.asi[x]||''))).join(' · ')}

    `:''}
    +

    Collect ${collect.length}

    + ${collect.length?`

    From the catalogued tools this actor is reported to have used or targeted: + ${d.tools.map(t=>``).join(' ')}

    +
    ${VOL_TIERS.filter(v=>vol[v]).map(v=>`${vol[v]}${v}`).join('')}
    +
    ${collect.slice(0,60).map(r=> + ``).join('')}
    ` + :'

    No catalogued tool is linked, so there is nothing tool-specific to collect. Use the case indicators.

    '}
    +

    Indicators ${d.iocs.length}

    + ${atomic.length?`

    ${atomic.length} atomic, from ${[...new Set(atomic.map(i=>i.case))].map(esc).join(', ')}. Full list in the case study and the STIX feed.

    +
    ${atomic.slice(0,24).map(i=>`${esc(i.value)}${esc(i.type)}`).join('')}
    `:''} + ${behav.length?`
      ${behav.slice(0,10).map(i=>`
    • ${esc(i.type)} ${esc(i.value)}
    • `).join('')}
    `:''} + ${d.iocs.length?'':'

    None published.

    '}
    + ${d.recovery.length?`

    Response and recovery ${d.recovery.length}

    +
      ${d.recovery.map(r=>`
    1. ${r.phase?`${esc(r.phase)} `:''}${esc(r.action)} + (${esc(r.case)})
    2. `).join('')}
    `:''} + ${(d.sectors.length||d.countries.length)?`

    Victimology

    +

    ${d.sectors.map(esc).join(' · ')}${d.countries.length?' — '+d.countries.map(esc).join(', '):''}

    `:''} +

    Sources ${a.references.length}

    +
    +

    Permalink

    + +
    +
    +
    + + ${collect.length?``:''} +
    `; +} +function openActorDrawer(id,fromEl){ + const a=ACTORMAP[id]; if(!a)return; + lastFocus=fromEl||document.activeElement; + const d=$('#drawer'); + d.innerHTML=actorDrawerHTML(a); + d.hidden=false; + d.setAttribute('aria-label','Threat actor '+a.name); + history.replaceState(null,'','#actor/'+a.id); + $('#dClose').onclick=closeDrawer; + $('#dClose').focus(); + $('#dCopyLink').onclick=e=>copy(e.target.dataset.v,e.target); + wireIntelLinks('#drawer'); + wireTechChips(); + $('#dGraph').onclick=()=>{pushNav();closeDrawer();graphSeed='actor:'+a.id;view='graph';update()}; + const p=$('#dPickActor'); + if(p)p.onclick=()=>{ + const add=a.derived.collect.filter(x=>ROWMAP[x]&&!picks.has(x)); + a.derived.collect.forEach(x=>{if(ROWMAP[x])picks.add(x)}); + savePicks();update();p.disabled=true;p.textContent=add.length?`Added ${add.length}`:'Already in plan'; + }; +} + +/* ---------- graph workbench ---------- + A Maltego-style researcher view over the same derived graph the STIX and + Maltego feeds export. Starts small - a seed and its neighbours - and grows by + expansion, because 500 nodes at once is a hairball, not an investigation. + Cytoscape is inlined as inert text and only evaluated the first time this view + opens, so the catalog does not pay for it. */ +const GNODE=Object.fromEntries(GRAPH.nodes.map(n=>[n.id,n])); +const GADJ=(()=>{const m={};for(const e of GRAPH.edges){ + (m[e.source]=m[e.source]||[]).push({id:e.target,rel:e.rel,dir:'out'}); + (m[e.target]=m[e.target]||[]).push({id:e.source,rel:e.rel,dir:'in'})}return m})(); +const GTYPES=['actor','case','tool','artifact','rule','technique','tactic','asi','ioc','malware','sector','country','region','attack-group','attack-campaign']; +const GCOLOR={actor:'--series-6',case:'--series-3',tool:'--series-1',artifact:'--series-8',rule:'--series-2', + technique:'--series-4',tactic:'--series-4',asi:'--series-5',ioc:'--series-7',malware:'--series-6', + sector:'--series-5',country:'--series-7',region:'--series-7','attack-group':'--series-6','attack-campaign':'--series-3'}; +const GSHAPE={actor:'hexagon',case:'round-rectangle',tool:'ellipse',artifact:'rectangle',rule:'diamond', + technique:'triangle',tactic:'vee',asi:'star',ioc:'tag',malware:'octagon',sector:'barrel',country:'round-tag', + region:'round-tag','attack-group':'hexagon','attack-campaign':'round-rectangle'}; +let cy=null, graphSeed=null, gHidden=new Set(['artifact','tactic','region']), gPathMode=false, gPathFrom=null; +// cose's repulsion is in its own units - the default is 2048 per node pair, and +// anything under ~1e5 leaves labelled nodes stacked on each other. +const COSE=()=>({name:'cose',animate:false,fit:true,padding:40,nodeDimensionsIncludeLabels:true, + nodeRepulsion:()=>450000,nodeOverlap:30,idealEdgeLength:()=>110,edgeElasticity:()=>80,gravity:.4,numIter:1500}); +function cssVar(n){return getComputedStyle(document.documentElement).getPropertyValue(n).trim()||'#888'} +function loadCyto(){ + if(window.cytoscape)return true; + const src=document.getElementById('cyto-src'); + if(!src)return false; + const s=document.createElement('script');s.textContent=src.textContent;document.head.appendChild(s); + return !!window.cytoscape; +} +function graphHTML(){ + return `

    Graph

    +

    Actors, cases, catalogued tools, rules, techniques and indicators as one graph. Double-click + a node to expand it; select two and find the path between them. Artifact rows, tactics and regions + are hidden until you ask for them, so the first view stays readable.

    +
    +
    +
    +

    Find

    + +
    +

    Show types

    +
    ${GTYPES.map(t=>``).join('')}
    +

    Layout

    +
    ${['cose','concentric','breadthfirst','circle'].map(l=> + ``).join('')}
    +

    Actions

    +
    + + + + + +
    +

    Export view

    +
    +
    +

    +
    + +

    Select a node.

    +
    `; +} +function gEls(ids){ + const els=[], have=new Set(ids); + for(const id of ids){const n=GNODE[id];if(!n)continue; + els.push({group:'nodes',data:{id,label:n.label.length>42?n.label.slice(0,40)+'…':n.label,type:n.type}})} + for(const e of GRAPH.edges)if(have.has(e.source)&&have.has(e.target)) + els.push({group:'edges',data:{id:e.source+'>'+e.rel+'>'+e.target,source:e.source,target:e.target,rel:e.rel}}); + return els; +} +function gAdd(ids,center){ + const fresh=ids.filter(id=>GNODE[id]&&!gHidden.has(GNODE[id].type)&&cy.getElementById(id).empty()); + if(!fresh.length){gStat();return} + const cur=cy.nodes().map(n=>n.id()); + const els=gEls([...cur,...fresh]).filter(e=>cy.getElementById(e.data.id).empty()); + const pos=center&&cy.getElementById(center).nonempty()?cy.getElementById(center).position():null; + cy.add(els.map(e=>pos&&e.group==='nodes'?{...e,position:{x:pos.x+(Math.random()-.5)*160,y:pos.y+(Math.random()-.5)*160}}:e)); + cy.layout({...COSE(),randomize:false}).run(); + gStat();gHash(); +} +function gExpand(id){gAdd((GADJ[id]||[]).map(x=>x.id),id)} +function gStat(){const s=$('#gstat');if(s)s.textContent=`${cy.nodes().length} nodes · ${cy.edges().length} edges on canvas`} +function gHash(){ + const ids=cy.nodes().map(n=>n.id()); + if(ids.length<=40)history.replaceState(null,'','#graph/'+encodeURIComponent(ids.join('|'))); +} +function gInfo(id){ + const n=GNODE[id], box=$('#ginfo'); if(!n||!box)return; + const nb=(GADJ[id]||[]); + const byRel={};for(const x of nb)(byRel[x.rel+' ('+x.dir+')']=byRel[x.rel+' ('+x.dir+')']||[]).push(x.id); + const open=n.type==='actor'?``: + n.type==='rule'?``: + n.type==='tool'?``: + n.type==='artifact'?``: + n.type==='case'?``: + n.type==='technique'&&n.framework==='ATLAS'?`ATLAS ↗`:''; + box.innerHTML=`

    ${esc(n.type)}

    ${esc(n.label)}

    +

    ${esc(id)}

    ${open} +
    +

    Neighbours

    ${Object.entries(byRel).map(([rel,ids])=> + `${esc(rel)} · ${ids.length}${ids.slice(0,30).map(x=> + ``).join('')}`).join('')}
    `; + box.querySelector('[data-exp]').onclick=()=>gExpand(id); + box.querySelectorAll('[data-add]').forEach(b=>b.onclick=()=>{const t=GNODE[b.dataset.add]; + if(t&&gHidden.has(t.type)){gHidden.delete(t.type);const cb=$(`#main input[data-gt="${t.type}"]`);if(cb)cb.checked=true} + gAdd([b.dataset.add],id);cy.getElementById(b.dataset.add).select();gInfo(b.dataset.add)}); + const o=box.querySelector('[data-open]'); + if(o)o.onclick=()=>{const k=o.dataset.open, v=id.split(':').slice(1).join(':'); + if(k==='actor')openActorDrawer(v,o);else if(k==='rule')openRuleDrawer(v,o); + else if(k==='tool')openToolDrawer(v,o);else if(k==='artifact')openDrawer(v,o); + else{pushNav();view='cases';update();const el=document.getElementById('cs-'+v);if(el){el.open=true;el.scrollIntoView()}}}; +} +function gPath(a,b){ + // Breadth-first over the full graph, not the canvas, so a path can surface + // nodes nobody has expanded yet - which is usually the point of asking. + const prev={[a]:null},q=[a]; + while(q.length){const x=q.shift();if(x===b)break; + for(const y of (GADJ[x]||[]))if(!(y.id in prev)){prev[y.id]=x;q.push(y.id)}} + if(!(b in prev))return null; + const path=[];for(let x=b;x;x=prev[x])path.unshift(x);return path; +} +function renderGraph(){ + $('#main').innerHTML=graphHTML(); + $('#gBackIntel').onclick=()=>{view='intel';update()}; + if(!loadCyto()){$('#cy').innerHTML='

    Graph library unavailable in this build.

    ';return} + const style=[ + {selector:'node',style:{'label':'data(label)','font-size':9,'color':cssVar('--ink'),'text-valign':'bottom', + 'text-margin-y':3,'width':18,'height':18,'border-width':1,'border-color':cssVar('--line'), + 'text-wrap':'ellipsis','text-max-width':110}}, + ...GTYPES.map(t=>({selector:`node[type="${t}"]`,style:{'background-color':cssVar(GCOLOR[t]),'shape':GSHAPE[t]}})), + {selector:'node[type="actor"]',style:{'width':30,'height':30,'font-size':11,'font-weight':'bold'}}, + {selector:'node:selected',style:{'border-width':3,'border-color':cssVar('--accent')}}, + {selector:'node.path',style:{'border-width':4,'border-color':cssVar('--gap')}}, + {selector:'edge',style:{'width':1,'line-color':cssVar('--line'),'target-arrow-shape':'triangle', + 'target-arrow-color':cssVar('--line'),'curve-style':'bezier','arrow-scale':.6,'label':'data(rel)', + 'font-size':7,'color':cssVar('--faint'),'text-rotation':'autorotate'}}, + {selector:'edge.path',style:{'width':3,'line-color':cssVar('--gap'),'target-arrow-color':cssVar('--gap')}}, + ]; + cy=window.cytoscape({container:$('#cy'),elements:[],style,wheelSensitivity:.25,minZoom:.1,maxZoom:1.4}); + const fromHash=decodeURIComponent(location.hash.slice(1)); + let seed=[]; + if(fromHash.startsWith('graph/'))seed=fromHash.slice(6).split('|').filter(x=>GNODE[x]); + if(!seed.length&&graphSeed&&GNODE[graphSeed])seed=[graphSeed,...(GADJ[graphSeed]||[]).map(x=>x.id)]; + if(!seed.length)seed=GRAPH.nodes.filter(n=>n.type==='actor').map(n=>n.id); + seed.forEach(id=>{const t=(GNODE[id]||{}).type;if(t&&gHidden.has(t)&&seed.length<40)gHidden.delete(t)}); + cy.add(gEls(seed.filter(id=>!gHidden.has((GNODE[id]||{}).type)))); + cy.layout(COSE()).run(); + gStat(); + cy.on('dbltap','node',e=>gExpand(e.target.id())); + cy.on('tap','node',e=>{const id=e.target.id();gInfo(id); + if(gPathMode){if(!gPathFrom){gPathFrom=id;$('#gPath').textContent='Path: pick 2nd'} + else{const p=gPath(gPathFrom,id);cy.elements().removeClass('path'); + if(p){gAdd(p,gPathFrom);p.forEach((x,i)=>{cy.getElementById(x).addClass('path'); + if(i)cy.edges().filter(ed=>(ed.source().id()===p[i-1]&&ed.target().id()===x)||(ed.source().id()===x&&ed.target().id()===p[i-1])).addClass('path')})} + else $('#gstat').textContent='No path between those two.'; + gPathMode=false;gPathFrom=null;$('#gPath').setAttribute('aria-pressed','false');$('#gPath').textContent='Path: pick 2'}}}); + $('#gq').oninput=e=>{const q=e.target.value.trim().toLowerCase(); + $('#gres').innerHTML=q.length<2?'':GRAPH.nodes.filter(n=>n.label.toLowerCase().includes(q)||n.id.toLowerCase().includes(q)) + .slice(0,25).map(n=>``).join(''); + $$('#gres [data-go]').forEach(b=>b.onclick=()=>{const id=b.dataset.go,t=GNODE[id].type; + if(gHidden.has(t)){gHidden.delete(t);const cb=$(`#main input[data-gt="${t}"]`);if(cb)cb.checked=true} + gAdd([id]);const el=cy.getElementById(id);cy.$(':selected').unselect();el.select();cy.center(el);gInfo(id)})}; + $$('#main input[data-gt]').forEach(cb=>cb.onchange=()=>{const t=cb.dataset.gt; + if(cb.checked)gHidden.delete(t);else{gHidden.add(t);cy.nodes(`[type="${t}"]`).remove()}gStat()}); + $$('#main [data-lay]').forEach(b=>b.onclick=()=>cy.layout(b.dataset.lay==='cose'?COSE():{name:b.dataset.lay,animate:false,padding:40,spacingFactor:1.3,nodeDimensionsIncludeLabels:true}).run()); + $('#gExpand').onclick=()=>cy.$('node:selected').forEach(n=>gExpand(n.id())); + $('#gHide').onclick=()=>{cy.$('node:selected').remove();gStat();gHash()}; + $('#gClear').onclick=()=>{cy.elements().remove();gStat();$('#ginfo').innerHTML='

    Select a node.

    '}; + $('#gAll').onclick=()=>gAdd(GRAPH.nodes.filter(n=>n.type==='actor').map(n=>n.id)); + $('#gPath').onclick=()=>{gPathMode=!gPathMode;gPathFrom=null;$('#gPath').setAttribute('aria-pressed',String(gPathMode)); + $('#gPath').textContent=gPathMode?'Path: pick 1st':'Path: pick 2'}; + $('#gPng').onclick=()=>{const a=document.createElement('a');a.href=cy.png({full:true,scale:2,bg:cssVar('--panel')}); + a.download=`ai-dfir-graph-${stamp()}.png`;document.body.appendChild(a);a.click();a.remove()}; + $('#gJson').onclick=()=>download(`ai-dfir-graph-${stamp()}.json`,JSON.stringify({source:REPO_URL, + nodes:cy.nodes().map(n=>GNODE[n.id()]),edges:cy.edges().map(e=>e.data())},null,2),'application/json'); + $('#gCsv').onclick=()=>{const ids=new Set(cy.nodes().map(n=>n.id())); + const val=id=>{const n=GNODE[id];return n.type==='ioc'?n.label:id}; + const typ=id=>{const n=GNODE[id];return n.type==='ioc'?({domain:'maltego.Domain',ip:'maltego.IPv4Address',url:'maltego.URL', + email:'maltego.EmailAddress',hash:'maltego.Hash',file:'maltego.File'}[n.ioc_type]||'maltego.Phrase'): + (n.type==='country'||n.type==='region')?'maltego.Location':'maltego.Phrase'}; + const ent='EntityType,Value,Category,Label\n'+[...ids].map(id=>[typ(id),val(id),GNODE[id].type,GNODE[id].label].map(csvCell).join(',')).join('\n'); + const lnk='SourceType,SourceValue,TargetType,TargetValue,Relationship\n'+cy.edges().map(e=>{const d=e.data(); + return [typ(d.source),val(d.source),typ(d.target),val(d.target),d.rel].map(csvCell).join(',')}).join('\n'); + download(`ai-dfir-graph-entities-${stamp()}.csv`,ent+'\n','text/csv'); + setTimeout(()=>download(`ai-dfir-graph-links-${stamp()}.csv`,lnk+'\n','text/csv'),300)}; + if(graphSeed&&cy.getElementById(graphSeed).nonempty()){cy.getElementById(graphSeed).select();gInfo(graphSeed)} +} + +/* ---------- triage script builder ---------- + Turns the collection plan into a script for the host in front of you. The + templates are fixed and live in scripts/site_scripts.py; this only writes the + target lines, from specs triage_spec.py computed at build time. */ +let triageOS='win', triageFw='native'; +const psq=s=>"'"+String(s??'').replace(/'/g,"''")+"'"; +const shq=s=>"'"+String(s??'').replace(/'/g,"'\\''")+"'"; +function planRowsOrdered(){ + return [...picks].map(a=>ROWMAP[a]).filter(Boolean) + .sort((a,b)=>(VOL_ORDER[a.vol]??9)-(VOL_ORDER[b.vol]??9)||(RANK[a.forensic_value]??9)-(RANK[b.forensic_value]??9)); +} +function triageTargets(os){ + const out={lines:[],n:0,manual:0,skipped:0}; + for(const r of planRowsOrdered()){ + const s=r.spec||{kind:'manual',why:'no collection spec'}; + const base=os==='win'?`a=${psq(r.anchor)};tool=${psq(r.tool)};c=${psq(r.cls)}`:''; + const push=l=>{out.lines.push(l);out.n++}; + if(s.kind==='path'){ + const ts=s[os]||[]; + if(!ts.length){ + if(s.win.length||s.mac.length||s.linux.length){out.skipped++;continue} + out.manual++; + } + for(const t of ts)push(os==='win'?` @{${base};k='path';p=${psq(t)};s=$${s.secret?'true':'false'}}` + :`P ${shq(r.anchor)} ${shq(r.tool)} ${shq(r.cls)} ${s.secret?1:0} ${shq(t)}`); + }else if(s.kind==='registry'||s.kind==='eventlog'){ + if(os!=='win'){out.skipped++;continue} + push(s.kind==='registry'?` @{${base};k='registry';p=${psq(s.win[0])};s=$${s.secret?'true':'false'}}` + :` @{${base};k='eventlog';p=${psq(s.channel)}}`); + }else if(s.kind==='process'){ + push(os==='win'?` @{${base};k='process';n=@(${s.names.map(n=>psq(n.replace(/\.exe$/i,''))).join(',')})}` + :`PROC ${shq(r.anchor)} ${shq(r.tool)} ${shq(s.names.map(n=>n.replace(/[^\w.\-]/g,'')).join('|'))}`); + }else if(s.kind==='network'){ + push(os==='win'?` @{${base};k='network';ports=@(${(s.ports||[]).join(',')});hosts=@(${(s.hosts||[]).map(psq).join(',')})}` + :`NET ${shq(r.anchor)} ${shq(r.tool)} ${shq([...(s.ports||[]),...(s.hosts||[])].join(' '))}`); + }else{ + out.manual++; + push(os==='win'?` @{${base};k='manual';why=${psq(r.artifact+' - '+(s.why||''))}}` + :`MANUAL ${shq(r.anchor)} ${shq(r.tool)} ${shq(r.cls)} ${shq(r.artifact+' - '+(s.why||''))}`); + } + } + return out; +} +function triageScript(os){ + const p=activePlan()||{}; + const t=triageTargets(os); + const name=(p.name||'ai-triage').replace(/[^\w.-]+/g,'_').slice(0,40)||'ai-triage'; + const meta=`plan: ${(p.name||'untitled').replace(/[\r\n]/g,' ')} | host: ${(p.host||'-').replace(/[\r\n]/g,' ')} | generated ${new Date().toISOString()} | ${t.n} targets | ${REPO_URL}`; + const tpl=os==='win'?TRIAGE_PS1:TRIAGE_SH; + // Secret patterns from the whole catalog: tokens become wildcards, a + // directory becomes "everything under it". + const sec=[...new Set(ROWS.filter(r=>r.spec&&r.spec.kind==='path'&&r.spec.secret) + .flatMap(r=>r.spec[os]||[]).map(x=>x.replace(/\{(HOME|REPO)\}/g,'*').replace(/[\\/]$/,m=>m+'*')))].sort(); + const secBlock=os==='win'?sec.map(x=>' '+psq(x)).join('\n'):sec.map(x=>x.replace(/'/g,'')).join('\n'); + const body=(os==='win'?t.lines.join('\n'):t.lines.join('\n')); + return {name:name+(os==='win'?'.ps1':'.sh'),t,text:tpl.split('__META__').join(meta).split('__NAME__').join(name) + .replace('__TARGETS__',()=>body||(os==='win'?'':': # no targets')) + .replace('__SECRETS__',()=>secBlock)}; +} +function triageHTML(){ + if(!picks.size)return ''; + const osL={win:'Windows (PowerShell)',mac:'macOS (bash)',linux:'Linux (bash)'}; + const sc=triageScript(triageOS); + const tools=[...new Set(planRowsOrdered().map(r=>r.entry_id))].map(id=>TOOLMAP[id]).filter(Boolean); + const velo=tools.filter(t=>t.velo).map(t=>t.velo), kape=tools.filter(t=>t.kape).map(t=>t.kape); + return `

    Triage script

    +

    Collection without writing one. Pick how you will collect; the native script is the + default because it needs nothing installed on the host.

    +
    ${[['native','Native script'],['velo','Velociraptor'], + ['kape','KAPE'],['py','Python collector']].map(([k,l])=>``).join('')}
    + ${triageFw==='native'?` +
    ${Object.entries(osL).map(([k,l])=> + ``).join('')}
    +

    ${sc.t.n} target line${sc.t.n===1?'':'s'} for ${esc(osL[triageOS])}${sc.t.manual?` · ${sc.t.manual} need a person (written to the manifest as manual)`:''}${ + sc.t.skipped?` · ${sc.t.skipped} do not apply to this OS`:''}. Volatile state first; credentials hashed, not copied, unless you pass + ${triageOS==='win'?'-CollectSecrets':'--collect-secrets'}. Repository-scoped rows need + ${triageOS==='win'?'-RepoPath':'--repo'}; limit to one user with + ${triageOS==='win'?'-HomePath':'--home'}.

    +
    +
    +
    Preview
    ${esc(sc.text)}
    ` + :triageFw==='velo'?`

    Velociraptor

    +

    Best for a fleet, or when you already run it. Import the artifact definitions from the feed, then collect.

    + ${velo.length?`velociraptor --definitions artifacts/docs/api/velociraptor/ artifacts collect ${velo.map(esc).join(' ')} --output triage.zip` + :'

    No picked tool has a Velociraptor artifact.

    '} +

    artifact definitions ↗ + · Custom.AIAgents.Triage collects every catalogued tool.

    ` + :triageFw==='kape'?`

    KAPE (Windows)

    +

    Best if your Windows triage already runs through KAPE. Copy the .tkape targets into KAPE's Targets folder.

    + ${kape.length?`kape.exe --tsource C: --tdest D:\\kape_out --target ${kape.map(esc).join(',')} --vhdx triage` + :'

    No picked tool has a KAPE target.

    '} +

    targets ↗ + · AIAgents_P1 is the priority-one compound target.

    ` + :`

    Python collector

    +

    The repository's cross-platform collector, driven by collectors/targets.yaml. Needs Python 3 and PyYAML on the host.

    + python3 collectors/collect_ai_artifacts.py --case-id IR-001 --operator you --output ./cases --project-dir /path/to/repo +

    Add --dry-run to enumerate and hash without copying.

    `} +
    `; +} +function wireTriage(){ + $$('#main .segbtn[data-fw]').forEach(b=>b.onclick=()=>{triageFw=b.dataset.fw;renderMain()}); + $$('#main .segbtn[data-os]').forEach(b=>b.onclick=()=>{triageOS=b.dataset.os;renderMain()}); + const dl=$('#tDl');if(dl)dl.onclick=()=>{const s=triageScript(triageOS); + download(s.name,s.text.replace(/\r?\n/g,triageOS==='win'?'\r\n':'\n'),'text/plain');flash(dl,'downloaded')}; + const cp=$('#tCopy');if(cp)cp.onclick=()=>copy(triageScript(triageOS).text,cp); +} +""" diff --git a/artifacts/scripts/site_scripts.py b/artifacts/scripts/site_scripts.py new file mode 100644 index 0000000..09e025c --- /dev/null +++ b/artifacts/scripts/site_scripts.py @@ -0,0 +1,345 @@ +"""Triage script templates the site fills in from a collection plan. + +Two self-contained scripts, PowerShell for Windows and POSIX-leaning bash for +macOS and Linux, with no dependency beyond what ships with the OS. The site +replaces __TARGETS__ with one line per picked artifact and __META__ with the plan +details; nothing else in the template varies, so what runs on a host is +reviewable here rather than being assembled out of string fragments in a browser. + +The rules both scripts keep are collect_ai_artifacts.py's, for the same reasons: + - read-only. Nothing is written to a source location; copies keep timestamps. + - chain of custody. Every file is SHA-256 hashed at the source and re-hashed + after copy; the manifest records operator, host, UTC window and the hash of + the script itself, and is hashed in turn. + - least collection. A credential row records metadata and a hash, not the + secret, unless the operator passes -CollectSecrets / --collect-secrets. + - volatile first. Process and socket state is captured before any file copy, + because it is the only thing on the host that a copy step can change. +""" + +PS1 = r'''<# + AI agent artifact triage - generated by ai-dfir-toolkit + __META__ + + Run elevated to reach every user profile. Read-only against the sources. + Usage: + powershell -ExecutionPolicy Bypass -File .\__NAME__.ps1 -CaseId IR-001 -Operator you + [-Out D:\evidence] [-RepoPath C:\src\app,C:\src\other] [-HomePath C:\Users\alice] + [-CollectSecrets] [-MaxFileMB 512] +#> +param( + [string]$CaseId = "case", + [string]$Operator = $env:USERNAME, + [string]$Out = (Join-Path $env:SystemDrive "AIDFIR"), + [string[]]$RepoPath = @(), + [string[]]$HomePath = @(), + [switch]$CollectSecrets, + [int]$MaxFileMB = 512 +) +$ErrorActionPreference = "Continue" +$ProgressPreference = "SilentlyContinue" +$started = (Get-Date).ToUniversalTime() +$stamp = $started.ToString("yyyyMMddTHHmmssZ") +$root = Join-Path $Out ("{0}_{1}_{2}" -f $CaseId, $env:COMPUTERNAME, $stamp) +$files = Join-Path $root "files" +$live = Join-Path $root "live" +New-Item -ItemType Directory -Force -Path $files, $live | Out-Null +$manifest = New-Object System.Collections.Generic.List[object] +$isAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator) +if (-not $isAdmin) { Write-Warning "Not elevated: other users' profiles and some logs will be unreadable." } + +# Every profile by default; -HomePath narrows collection to the named ones. +$homes = if ($HomePath.Count) { $HomePath } else { + @(Get-ChildItem (Join-Path $env:SystemDrive "Users") -Directory -Force -ErrorAction SilentlyContinue | + Where-Object { $_.Name -notin @("Public","Default","Default User","All Users") } | ForEach-Object { $_.FullName }) } + +function Add-Row($t, $path, $status, $note, $size, $mtime, $sha, $dest) { + $manifest.Add([pscustomobject]@{ + anchor=$t.a; tool=$t.tool; class=$t.c; template=$t.p; path=$path; status=$status; + size=$size; mtime_utc=$mtime; sha256=$sha; dest=$dest; note=$note }) +} + +function Expand-Template($tmpl) { + if ($tmpl -like "*{HOME}*") { return $homes | ForEach-Object { $tmpl.Replace("{HOME}", $_) } } + if ($tmpl -like "*{REPO}*") { return $RepoPath | ForEach-Object { $tmpl.Replace("{REPO}", $_.TrimEnd("\")) } } + return @($tmpl) +} + +# Every credential location the catalog knows for this OS, not only the picked +# ones. A directory row (~/.claude/) otherwise sweeps a token file into the copy +# and defeats the hash-only rule for secrets. +$secretPatterns = @( +__SECRETS__ +) +function Test-Secret($path) { + foreach ($p in $secretPatterns) { if ($path -like $p) { return $true } } + return $false +} + +function Collect-File($t, $f) { + $size = $f.Length; $mtime = $f.LastWriteTimeUtc.ToString("o") + $isSecret = $t.s -or (Test-Secret $f.FullName) + $sha = "" + if ($size -le ($MaxFileMB * 1MB)) { + try { $sha = (Get-FileHash -LiteralPath $f.FullName -Algorithm SHA256 -ErrorAction Stop).Hash.ToLower() } + catch { Add-Row $t $f.FullName "error" ("hash: " + $_.Exception.Message) $size $mtime "" ""; return } + } else { + Add-Row $t $f.FullName "metadata-only" ("larger than " + $MaxFileMB + " MB") $size $mtime "" ""; return + } + if ($isSecret -and -not $CollectSecrets) { + Add-Row $t $f.FullName "hashed-only" "credential: pass -CollectSecrets to copy" $size $mtime $sha ""; return + } + $dest = Join-Path $files ($f.FullName -replace "^([A-Za-z]):", '$1') + try { + New-Item -ItemType Directory -Force -Path (Split-Path $dest) | Out-Null + Copy-Item -LiteralPath $f.FullName -Destination $dest -Force -ErrorAction Stop + (Get-Item -LiteralPath $dest).CreationTimeUtc = $f.CreationTimeUtc + (Get-Item -LiteralPath $dest).LastWriteTimeUtc = $f.LastWriteTimeUtc + $check = (Get-FileHash -LiteralPath $dest -Algorithm SHA256).Hash.ToLower() + $status = if ($check -eq $sha) { "copied" } else { "copied-hash-mismatch" } + Add-Row $t $f.FullName $status "" $size $mtime $sha $dest.Substring($root.Length + 1) + } catch { + # A file the application holds open (a SQLite store, a live log) will not + # copy. The hash above still proves what was there; image the volume or + # use a VSS snapshot for the content. + Add-Row $t $f.FullName "locked" $_.Exception.Message $size $mtime $sha "" + } +} + +function Collect-Path($t) { + foreach ($p in (Expand-Template $t.p)) { + $items = @(Get-Item -Path $p -Force -ErrorAction SilentlyContinue) + if (-not $items) { Add-Row $t $p "absent" "" "" "" "" ""; continue } + foreach ($i in $items) { + if ($i.PSIsContainer) { + Get-ChildItem -LiteralPath $i.FullName -Recurse -File -Force -ErrorAction SilentlyContinue | + ForEach-Object { Collect-File $t $_ } + } else { Collect-File $t $i } + } + } +} + +function Collect-Registry($t) { + $safe = ($t.p -replace '[\\/:*?"<>|]', "_") + $keys = @($t.p) + if ($t.p -like "HKCU\*" -and $isAdmin) { + # HKCU is only the operator's hive. Every loaded user hive is under HKU. + $keys = @(Get-ChildItem "Registry::HKEY_USERS" -ErrorAction SilentlyContinue | + Where-Object { $_.PSChildName -match "^S-1-5-21-[\d-]+$" } | + ForEach-Object { "HKU\" + $_.PSChildName + $t.p.Substring(4) }) + } + foreach ($k in $keys) { + $dest = Join-Path $live ("reg_" + ($k -replace '[\\/:*?"<>|]', "_") + ".reg") + if ($t.s -and -not $CollectSecrets) { + $exists = Test-Path ("Registry::" + $k) + Add-Row $t $k ($(if ($exists) { "present-not-exported" } else { "absent" })) "credential values: pass -CollectSecrets to export" "" "" "" "" + continue + } + & reg.exe export $k $dest /y 2>$null | Out-Null + if (Test-Path $dest) { Add-Row $t $k "exported" "" (Get-Item $dest).Length "" (Get-FileHash $dest -Algorithm SHA256).Hash.ToLower() $dest.Substring($root.Length + 1) } + else { Add-Row $t $k "absent" "" "" "" "" "" } + } +} + +function Collect-EventLog($t) { + $dest = Join-Path $live ("evtx_" + ($t.p -replace '[\\/:*?"<>| ]', "_") + ".evtx") + if (Test-Path $dest) { Add-Row $t $t.p "exported" "shared export" "" "" "" $dest.Substring($root.Length + 1); return } + & wevtutil.exe epl $t.p $dest 2>$null + if (Test-Path $dest) { Add-Row $t $t.p "exported" "" (Get-Item $dest).Length "" (Get-FileHash $dest -Algorithm SHA256).Hash.ToLower() $dest.Substring($root.Length + 1) } + else { Add-Row $t $t.p "absent" "channel not present or not enabled" "" "" "" "" } +} + +$targets = @( +__TARGETS__ +) + +Write-Host "[1/4] volatile state: processes, sockets, DNS cache" +$procs = Get-CimInstance Win32_Process -ErrorAction SilentlyContinue | + Select-Object ProcessId, ParentProcessId, Name, ExecutablePath, CommandLine, CreationDate +$procs | Export-Csv -NoTypeInformation -Encoding UTF8 (Join-Path $live "processes.csv") +Get-NetTCPConnection -ErrorAction SilentlyContinue | + Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, State, OwningProcess, CreationTime | + Export-Csv -NoTypeInformation -Encoding UTF8 (Join-Path $live "tcp.csv") +Get-DnsClientCache -ErrorAction SilentlyContinue | Select-Object Entry, Data, TimeToLive | + Export-Csv -NoTypeInformation -Encoding UTF8 (Join-Path $live "dns_cache.csv") +$tcp = @(Import-Csv (Join-Path $live "tcp.csv") -ErrorAction SilentlyContinue) +$dns = @(Import-Csv (Join-Path $live "dns_cache.csv") -ErrorAction SilentlyContinue) +foreach ($t in $targets | Where-Object { $_.k -eq "process" }) { + $hit = @($procs | Where-Object { $n = $_.Name; @($t.n) | Where-Object { $n -like ($_ + "*") } }) + Add-Row $t ($t.n -join ", ") ($(if ($hit) { "running" } else { "not-running" })) ("pids " + (($hit | ForEach-Object ProcessId) -join " ")) "" "" "" "live\processes.csv" +} +foreach ($t in $targets | Where-Object { $_.k -eq "network" }) { + $l = @($tcp | Where-Object { $_.State -eq "Listen" -and ([int]$_.LocalPort) -in @($t.ports) -and ([int]$_.LocalPort) -ne 443 }) + $d = @($dns | Where-Object { $e = $_.Entry; @($t.hosts) | Where-Object { $e -like ("*" + $_) } }) + Add-Row $t (@($t.ports) + @($t.hosts) -join " ") "snapshot" ("listeners " + $l.Count + ", dns hits " + $d.Count) "" "" "" "live\tcp.csv" +} + +Write-Host "[2/4] event logs and registry" +foreach ($t in $targets | Where-Object { $_.k -eq "eventlog" }) { Collect-EventLog $t } +foreach ($t in $targets | Where-Object { $_.k -eq "registry" }) { Collect-Registry $t } + +Write-Host "[3/4] files" +foreach ($t in $targets | Where-Object { $_.k -eq "path" }) { Collect-Path $t } +foreach ($t in $targets | Where-Object { $_.k -eq "manual" }) { Add-Row $t "" "manual" $t.why "" "" "" "" } + +Write-Host "[4/4] manifest" +$finished = (Get-Date).ToUniversalTime() +$self = if ($PSCommandPath) { (Get-FileHash -LiteralPath $PSCommandPath -Algorithm SHA256).Hash.ToLower() } else { "" } +$manifest | Export-Csv -NoTypeInformation -Encoding UTF8 (Join-Path $root "manifest.csv") +[pscustomobject]@{ + case_id=$CaseId; operator=$Operator; host=$env:COMPUTERNAME; elevated=$isAdmin + started_utc=$started.ToString("o"); finished_utc=$finished.ToString("o") + script_sha256=$self; collect_secrets=[bool]$CollectSecrets; repo_paths=($RepoPath -join ";") + home_paths=($homes -join ";") + generator="ai-dfir-toolkit" +} | ConvertTo-Json | Set-Content -Encoding UTF8 (Join-Path $root "collection.json") +Get-ChildItem $root -Recurse -File | Where-Object { $_.Name -ne "SHA256SUMS" } | + ForEach-Object { "{0} {1}" -f (Get-FileHash -LiteralPath $_.FullName -Algorithm SHA256).Hash.ToLower(), $_.FullName.Substring($root.Length + 1) } | + Set-Content -Encoding ASCII (Join-Path $root "SHA256SUMS") +$zip = $root + ".zip" +Compress-Archive -Path (Join-Path $root "*") -DestinationPath $zip -Force +"{0} {1}" -f (Get-FileHash -LiteralPath $zip -Algorithm SHA256).Hash.ToLower(), (Split-Path $zip -Leaf) | Set-Content -Encoding ASCII ($zip + ".sha256") +$sum = $manifest | Group-Object status | ForEach-Object { "{0} {1}" -f $_.Count, $_.Name } +Write-Host ("done: " + ($sum -join ", ")) +Write-Host ("evidence: " + $zip) +''' + +SH = r'''#!/usr/bin/env bash +# AI agent artifact triage - generated by ai-dfir-toolkit +# __META__ +# +# Run with sudo to reach every user's home. Read-only against the sources. +# Usage: +# sudo bash __NAME__.sh --case IR-001 --operator you [--out /evidence] +# [--repo /src/app --repo /src/other] [--home /home/alice] [--collect-secrets] +# [--max-file-mb 512] +set -u +CASE="case"; OPERATOR="${SUDO_USER:-${USER:-unknown}}"; OUT="/var/tmp/AIDFIR" +COLLECT_SECRETS=0; MAX_MB=512; REPOS=""; HOME_ONLY="" +while [ $# -gt 0 ]; do + case "$1" in + --case) CASE="$2"; shift 2 ;; + --operator) OPERATOR="$2"; shift 2 ;; + --out) OUT="$2"; shift 2 ;; + --repo) REPOS="$REPOS +$2"; shift 2 ;; + --home) HOME_ONLY="$HOME_ONLY +$2"; shift 2 ;; + --collect-secrets) COLLECT_SECRETS=1; shift ;; + --max-file-mb) MAX_MB="$2"; shift 2 ;; + *) echo "unknown option $1" >&2; exit 2 ;; + esac +done +OS_NAME=$(uname -s) +HOSTNAME_=$(hostname 2>/dev/null || uname -n) +STARTED=$(date -u +%Y-%m-%dT%H:%M:%SZ) +ROOT="$OUT/${CASE}_${HOSTNAME_}_$(date -u +%Y%m%dT%H%M%SZ)" +FILES="$ROOT/files"; LIVE="$ROOT/live" +mkdir -p "$FILES" "$LIVE" || exit 1 +MANIFEST="$ROOT/manifest.tsv" +printf 'anchor\ttool\tclass\ttemplate\tpath\tstatus\tsize\tmtime_epoch\tsha256\tdest\tnote\n' > "$MANIFEST" +[ "$(id -u)" -eq 0 ] || echo "warning: not root - other users' homes will be unreadable" >&2 + +if command -v sha256sum >/dev/null 2>&1; then SHA="sha256sum"; else SHA="shasum -a 256"; fi +sha() { $SHA "$1" 2>/dev/null | awk '{print $1}'; } +if [ "$OS_NAME" = "Darwin" ]; then + fsize() { stat -f %z "$1" 2>/dev/null; }; fmtime() { stat -f %m "$1" 2>/dev/null; } + HOMES=$(ls -d /Users/* 2>/dev/null | grep -v -e '/Shared$' -e '/Guest$'; echo /var/root) +else + fsize() { stat -c %s "$1" 2>/dev/null; }; fmtime() { stat -c %Y "$1" 2>/dev/null; } + HOMES=$(ls -d /home/* 2>/dev/null; echo /root) +fi +# Every home by default; --home narrows collection to the named ones. +[ -n "$HOME_ONLY" ] && HOMES="$HOME_ONLY" + +row() { # anchor tool class template path status size mtime sha dest note + printf '%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\t%s\n' "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" "$9" "${10}" "${11}" >> "$MANIFEST" +} + +# Every credential location the catalog knows for this OS, not only the picked +# ones. A directory row (~/.claude/) otherwise sweeps a token file into the copy +# and defeats the hash-only rule for secrets. +SECRET_PATTERNS='__SECRETS__' +is_secret() { + printf '%s\n' "$SECRET_PATTERNS" | while IFS= read -r pat; do + [ -z "$pat" ] && continue + case "$1" in $pat) echo yes; break ;; esac + done +} + +collect_file() { # anchor tool class template secret file + f="$6"; size=$(fsize "$f"); mt=$(fmtime "$f") + sec="$5"; [ "$sec" = "1" ] || { [ -n "$(is_secret "$f")" ] && sec=1; } + if [ -n "$size" ] && [ "$size" -gt $((MAX_MB * 1048576)) ]; then + row "$1" "$2" "$3" "$4" "$f" metadata-only "$size" "$mt" "" "" "larger than ${MAX_MB} MB"; return + fi + h=$(sha "$f") + if [ -z "$h" ]; then row "$1" "$2" "$3" "$4" "$f" error "$size" "$mt" "" "" "unreadable"; return; fi + if [ "$sec" = "1" ] && [ "$COLLECT_SECRETS" -ne 1 ]; then + row "$1" "$2" "$3" "$4" "$f" hashed-only "$size" "$mt" "$h" "" "credential: pass --collect-secrets to copy"; return + fi + dest="$FILES$f"; mkdir -p "$(dirname "$dest")" + if cp -p "$f" "$dest" 2>/dev/null; then + [ "$(sha "$dest")" = "$h" ] && st=copied || st=copied-hash-mismatch + row "$1" "$2" "$3" "$4" "$f" "$st" "$size" "$mt" "$h" "files$f" "" + else + row "$1" "$2" "$3" "$4" "$f" error "$size" "$mt" "$h" "" "copy failed" + fi +} + +expand() { # concrete pattern -> matching paths, one per line + p="$1" + case "$p" in + *[\*\?]*) + base="${p%%[\*\?]*}"; base="${base%/*}"; rest="${p#"$base"/}" + depth=$(printf '%s' "$rest" | awk -F/ '{print NF}') + [ -d "$base" ] && find "$base" -mindepth "$depth" -maxdepth "$depth" -path "$p" 2>/dev/null ;; + *) [ -e "$p" ] && printf '%s\n' "$p" ;; + esac +} + +P() { # anchor tool class secret template + case "$5" in + *"{HOME}"*) bases="$HOMES"; tok="{HOME}" ;; + *"{REPO}"*) bases="$REPOS"; tok="{REPO}" ;; + *) bases="-"; tok="" ;; + esac + printf '%s\n' "$bases" | while IFS= read -r b; do + [ -z "$b" ] && continue + if [ -n "$tok" ]; then b="${b%/}"; pat=$(printf '%s' "$5" | awk -v t="$tok" -v r="$b" '{i=index($0,t); print substr($0,1,i-1) r substr($0,i+length(t))}'); else pat="$5"; fi + found=0 + expand "$pat" | while IFS= read -r m; do + if [ -d "$m" ]; then find "$m" -type f 2>/dev/null | while IFS= read -r f; do collect_file "$1" "$2" "$3" "$5" "$4" "$f"; done + else collect_file "$1" "$2" "$3" "$5" "$4" "$m"; fi + done + [ -z "$(expand "$pat" | head -n 1)" ] && row "$1" "$2" "$3" "$5" "$pat" absent "" "" "" "" "" + done +} +PROC() { row "$1" "$2" process "$3" "$3" snapshot "" "" "" "live/processes.txt" "$(grep -i -c -E "$3" "$LIVE/processes.txt" 2>/dev/null) matching lines"; } +NET() { row "$1" "$2" network "$3" "$3" snapshot "" "" "" "live/sockets.txt" "ports and hosts to review in the socket and DNS snapshots"; } +MANUAL() { row "$1" "$2" "$3" "" "" manual "" "" "" "" "$4"; } + +echo "[1/3] volatile state: processes and sockets" +ps -axo pid,ppid,user,lstart,command > "$LIVE/processes.txt" 2>/dev/null || ps -ef > "$LIVE/processes.txt" +if [ "$OS_NAME" = "Darwin" ]; then + lsof -nP -iTCP -iUDP > "$LIVE/sockets.txt" 2>/dev/null +else + (ss -tunap 2>/dev/null || netstat -tunap 2>/dev/null) > "$LIVE/sockets.txt" +fi + +echo "[2/3] targets" +__TARGETS__ + +echo "[3/3] manifest" +SELF=""; [ -f "$0" ] && SELF=$(sha "$0") +cat > "$ROOT/collection.json" < SHA256SUMS) +tar -czf "$ROOT.tar.gz" -C "$(dirname "$ROOT")" "$(basename "$ROOT")" && printf '%s %s\n' "$(sha "$ROOT.tar.gz")" "$(basename "$ROOT").tar.gz" > "$ROOT.tar.gz.sha256" +echo "done: $(tail -n +2 "$MANIFEST" | cut -f6 | sort | uniq -c | tr '\n' ' ')" +echo "evidence: $ROOT.tar.gz" +''' diff --git a/artifacts/scripts/sync_mappings.py b/artifacts/scripts/sync_mappings.py new file mode 100644 index 0000000..e5e3cf5 --- /dev/null +++ b/artifacts/scripts/sync_mappings.py @@ -0,0 +1,153 @@ +#!/usr/bin/env python3 +"""Regenerate the index tables at the foot of MAPPINGS.md from the pinned frameworks. + + python scripts/sync_mappings.py # rewrite the indexes in place + python scripts/sync_mappings.py --check # exit 1 if they are stale, write nothing + +The per-rule tables above the indexes are curated by hand - which technique a +rule detects is a judgement. The indexes below them are not: they are a count of +those judgements plus a title lookup, and they had drifted. T0010.002 was titled +"Software Supply Chain" where ATLAS says "Data", T0018 "Poison AI Model" where +ATLAS says "Manipulate AI Model", and T0104 was still listed a release after ATLAS +folded it into T0115. A count and a lookup are exactly the kind of thing that +should be derived, so they are. + +--check also enforces that every ATLAS id a rule tags itself with appears in its +MAPPINGS row (a parent tag is satisfied by one of its sub-techniques). The two +sources disagreed on a third of the multi-technique rules, and the site shows the +union, so a MAPPINGS row that omits a rule's own tag understates coverage in the +one table people read. +""" +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path + +sys.path.insert(0, str(Path(__file__).resolve().parent)) +import site_data # noqa: E402 + +ROOT = Path(__file__).resolve().parent.parent +MAPPINGS = ROOT.parent / "MAPPINGS.md" +MARKER = "## ATLAS Technique Index" + +LLM_PROSE = """Remapped from the 2025 list on 2026-08-13, against the 2026 publication of +2026-08-04. Eight of the ten IDs changed meaning between the two editions, so a +2025 ID read as a 2026 one names the wrong category - `LLM03` was Supply Chain +and is now Excessive Agency. Categories with no rule are listed so the gaps are +visible rather than merely absent.""" + +ASI_PROSE = """The OWASP Top 10 for Agentic Applications (December 2025) names the risks that +exist because an application acts - holds tools, credentials and memory - rather +than only answers. The per-rule ASI values above are this project's assessment of +which risk a rule gives evidence of, not an OWASP mapping; OWASP publishes none +for detection content. A dash means the rule detects something the agentic list +does not cover, usually an adversary *using* AI rather than an agentic +application being attacked. The related LLM IDs are OWASP's own Appendix A cross- +map, which cites the 2025 list, translated to 2026 IDs through +`artifacts/schema/owasp.json`.""" + + +def load_pins(): + tech = json.loads((ROOT / "schema" / "technique-ids.json").read_text(encoding="utf-8")) + owasp = json.loads((ROOT / "schema" / "owasp.json").read_text(encoding="utf-8")) + return tech, owasp + + +def atlas_title(atlas: dict, ident: str) -> str: + name = atlas["techniques"].get(ident, "") + parent, _, sub = ident.rpartition(".") + if len(sub) == 3 and sub.isdigit() and parent in atlas["techniques"]: + return f"{atlas['techniques'][parent]}: {name}" + return name + + +def render(rows: dict, tech: dict, owasp: dict) -> str: + atlas = tech["atlas"] + counts: dict[str, int] = {} + llm: dict[str, int] = {} + asi: dict[str, int] = {} + for row in rows.values(): + for raw in row["atlas"]: + ident = site_data._norm_atlas(raw) + if ident: + counts[ident] = counts.get(ident, 0) + 1 + for raw in row["owasp"]: + ident = site_data._norm_owasp(raw) + if ident: + llm[ident] = llm.get(ident, 0) + 1 + for raw in row.get("asi", []): + ident = site_data._norm_asi(raw) + if ident: + asi[ident] = asi.get(ident, 0) + 1 + + out = [MARKER, "", + f"Titles are ATLAS {atlas['release']} names, generated from " + f"`artifacts/schema/technique-ids.json` by `artifacts/scripts/sync_mappings.py`.", + "", "| ATLAS ID | Title | Tactic | Rule count |", + "|----------|-------|--------|------------|"] + for ident in sorted(counts): + tactics = ", ".join(atlas["tactics"].get(t, t) + for t in atlas.get("technique_tactics", {}).get(ident, [])) + out.append(f"| {ident[4:]:<8} | {atlas_title(atlas, ident)} | {tactics} | {counts[ident]} |") + + items = owasp["llm_2026"]["items"] + out += ["", "## OWASP Top 10 for LLM Applications 2026 Index", "", LLM_PROSE, "", + "| OWASP | Title | Rule count | Was in 2025 |", + "|-------|-------|------------|-------------|"] + for ident, it in items.items(): + was = it["was_2025"] + (f", {it['note']}" if it.get("note") else "") + out.append(f"| {ident:<8} | {it['title']} | {llm.get(ident, 0)} | {was} |") + + ag = owasp["agentic_2026"]["items"] + out += ["", "## OWASP Top 10 for Agentic Applications 2026 Index", "", ASI_PROSE, "", + "| ASI | Title | Rule count | Related LLM (2026) |", + "|-----|-------|------------|--------------------|"] + for ident, it in ag.items(): + out.append(f"| {ident} | {it['title']} | {asi.get(ident, 0)} | " + f"{', '.join(it['related_llm_2026'])} |") + return "\n".join(out) + "\n" + + +def tag_problems(rows: dict) -> list[str]: + problems = [] + for rule in site_data.load_rules({}): + row = rows.get(rule["file"]) + if row is None: + problems.append(f"{rule['path']}: no row in MAPPINGS.md") + continue + listed = {site_data._norm_atlas(x) for x in row["atlas"]} - {""} + for ident in rule["atlas"]: + covered = ident in listed or any(x.startswith(ident + ".") for x in listed) + if not covered: + problems.append(f"{rule['path']}: tagged {ident} but its MAPPINGS row " + f"lists {', '.join(sorted(listed)) or 'nothing'}") + return problems + + +def main() -> int: + ap = argparse.ArgumentParser() + ap.add_argument("--check", action="store_true") + args = ap.parse_args() + tech, owasp = load_pins() + rows, _, _ = site_data.load_mappings() + text = MAPPINGS.read_text(encoding="utf-8") + head = text[:text.index(MARKER)] if MARKER in text else text.rstrip() + "\n\n---\n\n" + new = head + render(rows, tech, owasp) + problems = tag_problems(rows) + if args.check: + if new != text: + problems.append("MAPPINGS.md indexes are stale - run scripts/sync_mappings.py") + elif new != text: + with open(MAPPINGS, "w", encoding="utf-8", newline="\n") as fh: + fh.write(new) + print("MAPPINGS.md indexes regenerated") + for p in problems: + print(f"[MAP] {p}") + print(f"{len(problems)} problem(s).") + return 1 if problems else 0 + + +if __name__ == "__main__": + sys.exit(main()) diff --git a/artifacts/scripts/triage_spec.py b/artifacts/scripts/triage_spec.py new file mode 100644 index 0000000..bcc0c40 --- /dev/null +++ b/artifacts/scripts/triage_spec.py @@ -0,0 +1,145 @@ +#!/usr/bin/env python3 +"""How to collect one catalog row, per operating system, for the site's script builder. + +The collection plan used to end at a list of paths, and a responder then had to +turn that list into a collection script by hand, under time pressure, on the +platform in front of them. The site now generates that script. The browser only +assembles it; every decision about what a locator means is made here, once, in +Python, next to the exporters that already make the same decisions for KAPE and +Velociraptor - so the three cannot disagree about what a path is. + +Each row gets a `spec`: + + {"kind": "path", "win": [...], "mac": [...], "linux": [...]} + {"kind": "registry", "win": ["HKCU\\\\Environment"], "values": [...]} + {"kind": "process", "names": ["goose", "goosed"]} + {"kind": "network", "ports": [8080], "hosts": ["api.anthropic.com"]} + {"kind": "eventlog", "channel": "...", "event_id": "1"} + {"kind": "manual", "why": "..."} + +plus "secret": true on credential rows, so the script records metadata and a +hash without copying the value unless the operator opts in - the same default +collectors/collect_ai_artifacts.py uses. + +Path templates use two tokens the script expands at run time: + {HOME} every user profile on the host (C:\\Users\\*, /Users/*, /home/* and /root) + {REPO} every repository path the operator passes in, because a row + names an arbitrary checkout and globbing the disk for it would be + both slow and wrong +A trailing / means "the whole directory". +""" +from __future__ import annotations + +import re + +from export_velociraptor import PROSE, split_paths + +WIN_ENV = [ + (r"^%APPDATA%", r"{HOME}\AppData\Roaming"), + (r"^%LOCALAPPDATA%", r"{HOME}\AppData\Local"), + (r"^%USERPROFILE%", r"{HOME}"), + (r"^%PROGRAMDATA%", r"C:\ProgramData"), + (r"^%PROGRAMFILES%", r"C:\Program Files"), + (r"^%TEMP%", r"{HOME}\AppData\Local\Temp"), +] +REPO_TOKEN = re.compile(r"^<(repo|project|gitroot)>", re.I) +MAC_ONLY = re.compile(r"^/(Users|Library|Applications|System)/|^~/Library/") + + +def _clean(p: str) -> str: + # "path → key" names a key inside the file; the file is what gets collected. + p = p.split(" → ")[0].split(" -> ")[0].strip() + # A trailing parenthetical is a note, not part of the path. + p = re.sub(r"\s+\(.*\)$", "", p).strip() + return p + + +def _one(p: str, os_name: str) -> str: + """One catalog path to one template for one OS, or '' if it is not a path there.""" + p = _clean(p) + # The prose guard exists for locators like "macOS login Keychain (~/...)". + # A locator that already starts at a path root is a path even when a + # directory name has spaces in it - "Power Automate Desktop" is a folder. + rooted = re.match(r"^(~|%|/|<(repo|project|gitroot)>|[A-Za-z]:[\\/])", p, re.I) + if not p or (PROSE.search(p) and not rooted): + return "" + if REPO_TOKEN.match(p): + p = REPO_TOKEN.sub("{REPO}", p) + # , , and similar are wildcards the catalog wrote in + # prose. Anything else in angle brackets is a location only a person knows. + p = re.sub(r"<(version|ver|uuid[^>]*|hash|id|name|user|profile|workspace[^>]*|n)>", "*", p, flags=re.I) + if re.search(r"[<>]", p) or "..." in p or "$" in p: + return "" + win = os_name == "win" + if p.startswith("{REPO}"): + return p.replace("/", "\\") if win else p.replace("\\", "/") + if p.startswith("~"): + body = p[1:].lstrip("/\\") + if win: + return "{HOME}\\" + body.replace("/", "\\") + if os_name == "linux" and MAC_ONLY.match(p): + return "" + return "{HOME}/" + body.replace("\\", "/") + if p.startswith("%"): + if not win: + return "" + for pat, repl in WIN_ENV: + m = re.match(pat, p, flags=re.I) + if m: + return (repl + p[m.end():]).replace("/", "\\") + return "" + if re.match(r"^[A-Za-z]:[\\/]", p): + return p.replace("/", "\\") if win else "" + if p.startswith("/"): + if win: + return "" + if os_name == "linux" and MAC_ONLY.match(p): + return "" + return p + return "" + + +def _oses(row: dict) -> dict[str, bool]: + os_ = {o.lower() for o in row.get("os") or []} + return {"win": "windows" in os_ or not os_, "mac": "macos" in os_ or not os_, + "linux": "linux" in os_ or not os_} + + +def spec(row: dict) -> dict: + cls, loc = row["cls"], row["artifact"] or "" + secret = cls == "credential" + if cls == "registry": + key = loc.split(" → ")[0].strip() + if not re.match(r"^HK(CU|LM|U|CR)\\", key, re.I) or "<" in key: + return {"kind": "manual", "why": "registry location needs a person to resolve"} + vals = loc.split(" → ", 1)[1] if " → " in loc else "" + return {"kind": "registry", "win": [key], "values": vals, "secret": "API_KEY" in vals + or "TOKEN" in vals} + if cls == "process": + names = [n.strip() for n in re.split(r"\s*(?:/|,|\|)\s*", re.sub(r"\(.*?\)", "", loc)) + if re.fullmatch(r"[\w.\-]+", n.strip() or "-")] + return {"kind": "process", "names": names} if names else {"kind": "manual", + "why": "process described, not named"} + if cls == "network": + ports = sorted({int(p) for p in re.findall(r":(\d{2,5})(?:-\d+)?/(?:TCP|UDP)", loc)}) + hosts = sorted({h for h in re.findall(r"\b((?:[a-z0-9-]+\.)+[a-z]{2,})\b", loc.lower()) + if "*" not in h}) + return {"kind": "network", "ports": ports, "hosts": hosts} + if cls == "eventlog": + m = re.match(r"^(.*?)\s+EID\s+(\S+)$", loc) + return {"kind": "eventlog", "channel": (m.group(1) if m else loc).strip(), + "event_id": m.group(2) if m else ""} + out = {"kind": "path", "win": [], "mac": [], "linux": [], "secret": secret} + want = _oses(row) + for one in split_paths(loc.replace(" ; ", " | ").replace(" | ", " | ")): + for os_name in ("win", "mac", "linux"): + if not want[os_name]: + continue + t = _one(one, os_name) + if t and t not in out[os_name]: + out[os_name].append(t) + if not (out["win"] or out["mac"] or out["linux"]): + return {"kind": "manual", "secret": secret, + "why": "no fixed path - an environment variable, keychain, database or " + "a location the operator has to supply"} + return out diff --git a/artifacts/scripts/validate_mappings.py b/artifacts/scripts/validate_mappings.py index d31dff3..df54e20 100644 --- a/artifacts/scripts/validate_mappings.py +++ b/artifacts/scripts/validate_mappings.py @@ -58,6 +58,7 @@ def index_drift(mappings: Path, on_disk: set[str]) -> list[str]: lines = mappings.read_text(encoding="utf-8").splitlines() atlas: dict[str, int] = {} owasp: dict[str, int] = {} + asi: dict[str, int] = {} columns: list[str] = [] rows = 0 @@ -78,6 +79,9 @@ def index_drift(mappings: Path, on_disk: set[str]) -> list[str]: elif name == "owasp": for tag in re.findall(r"\bLLM\d{2}\b", cells[i]): owasp[tag] = owasp.get(tag, 0) + 1 + elif name == "asi": + for tag in re.findall(r"\bASI\d{2}\b", cells[i]): + asi[tag] = asi.get(tag, 0) + 1 def published(heading: str) -> dict[str, int]: out: dict[str, int] = {} @@ -85,21 +89,30 @@ def published(heading: str) -> dict[str, int]: start = next(i for i, l in enumerate(lines) if l.startswith(heading)) except StopIteration: return out + # The count column is found by its header, not its position. The OWASP + # index gained a "was in 2025" column when the list was remapped and the + # ATLAS index gained a "tactic" column in 2026.09; an exact width made + # the whole table invisible to this check rather than failing loudly. + count_at = None for line in lines[start + 1:]: if line.startswith("##"): break - cells = [c.strip() for c in line.strip("|").split("|")] - # >= 3, not == 3: the OWASP index gained a "was in 2025" column - # when the list was remapped, and an exact width made the whole - # table invisible to this check rather than failing loudly. - if len(cells) >= 3 and cells[2].isdigit(): - out[cells[0]] = int(cells[2]) + if not line.startswith("|") or set(line.strip()) <= set("|-: "): + continue + cells = [c.strip() for c in line.strip().strip("|").split("|")] + if count_at is None: + heads = [c.lower() for c in cells] + count_at = next((i for i, h in enumerate(heads) if "count" in h), 2) + continue + if len(cells) > count_at and cells[count_at].isdigit(): + out[cells[0]] = int(cells[count_at]) return out problems = [] for label, heading, counted in ( ("ATLAS", "## ATLAS Technique Index", atlas), ("OWASP", "## OWASP Top 10 for LLM Applications 2026 Index", owasp), + ("ASI", "## OWASP Top 10 for Agentic Applications 2026 Index", asi), ): pub = published(heading) for tag in sorted(set(pub) | set(counted)): diff --git a/artifacts/scripts/validate_techniques.py b/artifacts/scripts/validate_techniques.py index aa49fa9..604cc3b 100644 --- a/artifacts/scripts/validate_techniques.py +++ b/artifacts/scripts/validate_techniques.py @@ -33,6 +33,7 @@ import argparse import glob import json +import re import sys import urllib.request from datetime import date @@ -67,83 +68,231 @@ def version_key(s: str) -> tuple: return (0,) -def refresh() -> dict: - manifest = yaml.safe_load(fetch(ATLAS_MANIFEST).decode("utf-8")) +def _load_yaml(url: str, local: Path | None, rel: str): + """Read one upstream YAML file, from a local mirror when one is given. + + The mirror path exists because some runners reach GitHub's git transport but + not raw.githubusercontent.com. A shallow clone of the upstream repository is + byte-identical to what the URL serves, so the pin records the canonical URL + either way - where the bytes came from is transport, not provenance. + """ + if local: + return yaml.safe_load((local / rel).read_text(encoding="utf-8")) + return yaml.safe_load(fetch(url + rel).decode("utf-8")) + + +def _load_json(url: str, local: Path | None, rel: str): + if local: + return json.loads((local / rel).read_text(encoding="utf-8")) + return json.loads(fetch(url)) + + +def _values(node): + """ATLAS v6 keys objects by id; earlier formats used lists. Accept both.""" + return list(node.values()) if isinstance(node, dict) else list(node or []) + + +def refresh_atlas(local: Path | None = None) -> dict: + manifest = _load_yaml(ATLAS_BASE, local, "manifest.yaml") newest = max(manifest, key=lambda r: version_key(str(r["release"]))) path = newest["versions"][0]["path"] - atlas_doc = yaml.safe_load(fetch(ATLAS_BASE + path).decode("utf-8")) + doc = _load_yaml(ATLAS_BASE, local, path) + + # Bucket by object type, not by id prefix. The first version of this walked + # every dict and kept any id starting "AML.T" - which is also the prefix of + # every tactic, so sixteen tactics were pinned as techniques and the count + # read 194 where upstream said 178. + tactics = {t["id"]: t.get("name", "") for t in _values(doc.get("tactics"))} + techniques = {t["id"]: t.get("name", "") for t in _values(doc.get("techniques"))} + mitigations = {m["id"]: m.get("name", "") for m in _values(doc.get("mitigations"))} + + technique_tactics: dict[str, list[str]] = {} + mitigates: dict[str, list[str]] = {} + employs: dict[str, list[str]] = {} + order: list[tuple[int, str]] = [] + for src, rels in (doc.get("relationships") or {}).items(): + for rtype, items in (rels or {}).items(): + for r in items or []: + tgt = r.get("target") + if rtype == "achieves": + technique_tactics.setdefault(src, []).append(tgt) + elif rtype == "mitigates": + mitigates.setdefault(tgt, []).append(src) + elif rtype == "employs": + employs.setdefault(src, []).append(tgt) + elif rtype == "sequences": + order.append((int(r.get("position", 0)), tgt)) + + case_studies = {} + for cs in _values(doc.get("case-studies")): + row = {"name": cs.get("name", "")} + # Type and date only. Upstream also ships free-text actor, target and + # reporter fields, which name the organisations that wrote or were the + # subject of each study. This repository's data stays organisation- + # neutral beyond what a catalog entry itself cites, so those fields are + # left upstream - the id links to them. + for key in ("type", "date"): + if cs.get(key): + row[key] = str(cs[key]) + row["techniques"] = sorted(set(employs.get(cs["id"], []))) + case_studies[cs["id"]] = row - atlas: dict[str, str] = {} - - def walk(node) -> None: - if isinstance(node, dict): - ident = node.get("id") - if isinstance(ident, str) and ident.startswith("AML.T"): - atlas[ident] = node.get("name", "") - for value in node.values(): - walk(value) - elif isinstance(node, list): - for value in node: - walk(value) + return { + "release": str(newest["release"]), + "release_date": str(newest.get("release-date", "")), + "source": ATLAS_BASE + path, + "tactic_order": [t for _, t in sorted(order)] or sorted(tactics), + "tactics": dict(sorted(tactics.items())), + "techniques": dict(sorted(techniques.items())), + "technique_tactics": {k: sorted(set(v)) for k, v in sorted(technique_tactics.items())}, + "mitigations": dict(sorted(mitigations.items())), + "technique_mitigations": {k: sorted(set(v)) for k, v in sorted(mitigates.items())}, + "case_studies": dict(sorted(case_studies.items())), + } - walk(atlas_doc) - index = json.loads(fetch(ATTACK_INDEX)) +def refresh_attack(local: Path | None = None) -> dict: + index = _load_json(ATTACK_INDEX, local, "index.json") enterprise = next(c for c in index["collections"] if c["name"] == "Enterprise ATT&CK") latest = max(enterprise["versions"], key=lambda v: version_key(v["version"])) - bundle = json.loads(fetch(latest["url"])) + rel = latest["url"].split("/attack-stix-data/master/", 1)[-1] + bundle = _load_json(latest["url"], local, rel) + + def ext_id(obj): + for ref in obj.get("external_references", []): + if ref.get("source_name") == "mitre-attack" and ref.get("external_id"): + return ref["external_id"] + return None attack: dict[str, str] = {} retired: list[str] = [] + tactic_by_short: dict[str, str] = {} + tactics: dict[str, str] = {} + technique_tactics: dict[str, list[str]] = {} + groups, campaigns, software = {}, {}, {} for obj in bundle.get("objects", []): - if obj.get("type") != "attack-pattern": + ident = ext_id(obj) + if not ident: continue - for ref in obj.get("external_references", []): - if ref.get("source_name") == "mitre-attack" and ref.get("external_id"): - ident = ref["external_id"] - attack[ident] = obj.get("name", "") - if obj.get("x_mitre_deprecated") or obj.get("revoked"): - retired.append(ident) + gone = bool(obj.get("x_mitre_deprecated") or obj.get("revoked")) + kind = obj.get("type") + if kind == "x-mitre-tactic": + tactics[ident] = obj.get("name", "") + tactic_by_short[obj.get("x_mitre_shortname", "")] = ident + elif kind == "attack-pattern": + attack[ident] = obj.get("name", "") + if gone: + retired.append(ident) + technique_tactics[ident] = [p["phase_name"] for p in obj.get("kill_chain_phases", []) + if p.get("kill_chain_name") == "mitre-attack"] + elif gone: + continue + elif kind == "intrusion-set": + # Name only. ATT&CK's alias lists carry every vendor's naming scheme + # for the group, and this repository does not republish vendor + # attributions beyond what an actor profile itself cites. Nothing + # here uses the aliases; an actor profile records the ones its + # sources use, with the source named. + groups[ident] = {"name": obj.get("name", "")} + elif kind == "campaign": + campaigns[ident] = {"name": obj.get("name", ""), + "first_seen": str(obj.get("first_seen", ""))[:10], + "last_seen": str(obj.get("last_seen", ""))[:10]} + elif kind in ("malware", "tool"): + software[ident] = {"name": obj.get("name", ""), "type": kind} + + return { + "version": latest["version"], + "source": latest["url"], + "techniques": dict(sorted(attack.items())), + "retired": sorted(set(retired)), + "tactics": dict(sorted(tactics.items())), + "technique_tactics": {k: sorted(tactic_by_short.get(s, s) for s in v) + for k, v in sorted(technique_tactics.items()) if v}, + "groups": dict(sorted(groups.items())), + "campaigns": dict(sorted(campaigns.items())), + "software": dict(sorted(software.items())), + } + +def refresh(atlas_dir: Path | None = None, attack_dir: Path | None = None) -> dict: return { "_comment": "Generated by scripts/validate_techniques.py --refresh. Do not hand-edit.", "retrieved": date.today().isoformat(), - "atlas": { - "release": str(newest["release"]), - "source": ATLAS_BASE + path, - "techniques": dict(sorted(atlas.items())), - }, - "attack": { - "version": latest["version"], - "source": latest["url"], - "techniques": dict(sorted(attack.items())), - "retired": sorted(set(retired)), - }, + "atlas": refresh_atlas(atlas_dir), + "attack": refresh_attack(attack_dir), } +# Every surface that carries a framework id. The gate used to read catalog/*.yml +# alone, so AML.T0104 and AML.T0019 - both folded into AML.T0115 in ATLAS +# 2026.07 - sat in a case study, MAPPINGS, two rules and a playbook for a month +# while CI stayed green. An id is an id wherever it is written. +TEXT_SURFACES = [ + "MAPPINGS.md", + "playbooks/*.json", + "0[0-9]-*/*", + "artifacts/detections/**/*", + "artifacts/case-studies/*.yml", + "artifacts/intel/**/*.yml", + "docs/ai-dfir-investigation-guide.md", + "README.md", +] +ATLAS_ID = re.compile(r"\bAML\.(?:TA|T|M|CS)\d{4}(?:\.\d{3})?\b") + + +def surface_ids(repo: Path): + """(file, id) for every ATLAS id written anywhere on a text surface.""" + seen = set() + for pattern in TEXT_SURFACES: + for f in sorted(repo.glob(pattern)): + if not f.is_file() or f in seen or f.suffix.lower() in (".png", ".jpg", ".svg", ".pdf"): + continue + seen.add(f) + try: + text = f.read_text(encoding="utf-8") + except UnicodeDecodeError: + continue + for m in ATLAS_ID.finditer(text): + yield f.relative_to(repo), m.group(0) + + +def _as_list(v): + if not v: + return [] + return v if isinstance(v, list) else [v] + + def main() -> int: ap = argparse.ArgumentParser() ap.add_argument("--check", action="store_true", help="validate only - the default, accepted for symmetry with the other gates") ap.add_argument("--refresh", action="store_true", help="re-pin schema/technique-ids.json from upstream (network)") + ap.add_argument("--atlas-dir", type=Path, + help="read ATLAS from a local atlas-data/dist mirror instead of the network") + ap.add_argument("--attack-dir", type=Path, + help="read ATT&CK from a local attack-stix-data mirror instead of the network") ap.add_argument("--advise", action="store_true", help="also list parents whose subtechniques might be a more precise mapping") args = ap.parse_args() if args.refresh: - data = refresh() + data = refresh(args.atlas_dir, args.attack_dir) # newline="\n" explicitly: this file is generated on whatever platform # the refresher happens to run on, and the repo keeps generated output # byte-identical across platforms. with open(PINNED, "w", encoding="utf-8", newline="\n") as fh: fh.write(json.dumps(data, indent=2, ensure_ascii=False) + "\n") - print(f"ATLAS {data['atlas']['release']:>8} " - f"{len(data['atlas']['techniques'])} techniques") + a = data["atlas"] + print(f"ATLAS {a['release']:>8} {len(a['tactics'])} tactics, " + f"{len(a['techniques'])} techniques, {len(a['mitigations'])} mitigations, " + f"{len(a['case_studies'])} case studies") print(f"ATT&CK {data['attack']['version']:>8} " f"{len(data['attack']['techniques'])} techniques " - f"({len(data['attack']['retired'])} deprecated or revoked)") + f"({len(data['attack']['retired'])} deprecated or revoked), " + f"{len(data['attack']['groups'])} groups, " + f"{len(data['attack']['campaigns'])} campaigns") print(f"pinned to {PINNED.relative_to(ROOT)}") return 0 @@ -196,7 +345,71 @@ def main() -> int: problems.append(f"{eid}: attack_techniques {ident} ({attack[ident]}) is " f"deprecated or revoked in {pin['attack']['version']}") - print(f"pinned: ATLAS {pin['atlas']['release']} ({len(atlas)} techniques), " + # Everything else that carries an id. Catalog entries are checked above + # with their field names; these are checked by value, wherever written. + known_atlas = (set(atlas) | set(pin["atlas"].get("tactics", {})) + | set(pin["atlas"].get("mitigations", {})) + | set(pin["atlas"].get("case_studies", {}))) + repo = ROOT.parent + for rel, ident in sorted(set(surface_ids(repo))): + if ident not in known_atlas: + problems.append(f"{rel}: {ident} is not in ATLAS {pin['atlas']['release']}") + + # MAPPINGS writes ATLAS ids without the AML. prefix, and Sigma tags write + # them as attack.atlas.tNNNN or atlas.aml-tNNNN - neither form is caught by + # the text scan, so both go through the site loader's normaliser. + sys.path.insert(0, str(Path(__file__).resolve().parent)) + import site_data + rows, _, _ = site_data.load_mappings() + for name, row in rows.items(): + for raw in row.get("atlas", []): + ident = site_data._norm_atlas(raw) + if ident and ident not in atlas: + problems.append(f"MAPPINGS.md {name}: {raw} is not in ATLAS " + f"{pin['atlas']['release']}") + for rule in site_data.load_rules({}): + for ident in rule.get("atlas", []): + if ident not in atlas: + problems.append(f"{rule['path']}: {ident} is not in ATLAS " + f"{pin['atlas']['release']}") + for tag in rule.get("attack", []): + m = re.fullmatch(r"attack\.(t\d{4}(?:\.\d{3})?)", tag.lower()) + if m: + ident = m.group(1).upper() + if ident not in attack: + problems.append(f"{rule['path']}: {tag} is not in Enterprise ATT&CK " + f"{pin['attack']['version']}") + elif ident in retired: + problems.append(f"{rule['path']}: {tag} is deprecated or revoked") + + # Structured ATT&CK references on case studies and actor profiles. + groups = pin["attack"].get("groups", {}) + campaigns = pin["attack"].get("campaigns", {}) + for f in sorted(glob.glob(str(ROOT / "case-studies" / "*.yml"))) + \ + sorted(glob.glob(str(ROOT / "intel" / "actors" / "*.yml"))): + doc = yaml.safe_load(Path(f).read_text(encoding="utf-8")) or {} + did = doc.get("id", Path(f).name) + for ident in doc.get("attack") or []: + if ident not in attack: + problems.append(f"{did}: attack {ident} is not in Enterprise ATT&CK") + elif ident in retired: + problems.append(f"{did}: attack {ident} is deprecated or revoked") + ext = doc.get("external_ids") or {} + for ident in _as_list(ext.get("attack_campaign")): + if ident not in campaigns: + problems.append(f"{did}: ATT&CK campaign {ident} is not in " + f"{pin['attack']['version']}") + for ident in _as_list(ext.get("attack_group")): + if ident not in groups: + problems.append(f"{did}: ATT&CK group {ident} is not in " + f"{pin['attack']['version']}") + for ident in _as_list(ext.get("atlas_case_study")): + if ident not in pin["atlas"].get("case_studies", {}): + problems.append(f"{did}: ATLAS case study {ident} is not in " + f"{pin['atlas']['release']}") + + print(f"pinned: ATLAS {pin['atlas']['release']} ({len(atlas)} techniques, " + f"{len(pin['atlas'].get('tactics', {}))} tactics), " f"ATT&CK {pin['attack']['version']} ({len(attack)} techniques), " f"retrieved {pin['retrieved']}") diff --git a/artifacts/scripts/vendor/VENDOR.json b/artifacts/scripts/vendor/VENDOR.json new file mode 100644 index 0000000..ac2a1b0 --- /dev/null +++ b/artifacts/scripts/vendor/VENDOR.json @@ -0,0 +1,13 @@ +{ + "_comment": "Third-party code inlined into docs/site/index.html. build_site.py --check fails if a file's sha256 no longer matches, so an upgrade is a reviewed change to this file and never a silent swap.", + "cytoscape.min.js": { + "package": "cytoscape", + "version": "3.34.3", + "license": "MIT", + "license_file": "cytoscape.LICENSE", + "source": "https://registry.npmjs.org/cytoscape/-/cytoscape-3.34.3.tgz", + "npm_integrity": "sha512-yfYGhRcGAntq6YBD583j4n0Eg3jIxvWmZtz/5uz9UYkeIStSlMxuUja+ec5j3iBD8nv1rwaOAYMW09tBdkSeaQ==", + "file": "package/dist/cytoscape.min.js", + "sha256": "5f3b5b529546d5af1fc5628590af033b74511a5b6f789f5f4682845863228b91" + } +} diff --git a/artifacts/scripts/vendor/cytoscape.LICENSE b/artifacts/scripts/vendor/cytoscape.LICENSE new file mode 100644 index 0000000..aac05f2 --- /dev/null +++ b/artifacts/scripts/vendor/cytoscape.LICENSE @@ -0,0 +1,19 @@ +Copyright (c) 2016-2026, The Cytoscape Consortium. + +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the “Software”), to deal in +the Software without restriction, including without limitation the rights to +use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies +of the Software, and to permit persons to whom the Software is furnished to do +so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. \ No newline at end of file diff --git a/artifacts/scripts/vendor/cytoscape.min.js b/artifacts/scripts/vendor/cytoscape.min.js new file mode 100644 index 0000000..bab26b7 --- /dev/null +++ b/artifacts/scripts/vendor/cytoscape.min.js @@ -0,0 +1,31 @@ +/** + * Copyright (c) 2016-2026, The Cytoscape Consortium. + * + * Permission is hereby granted, free of charge, to any person obtaining a copy of + * this software and associated documentation files (the “Software”), to deal in + * the Software without restriction, including without limitation the rights to + * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies + * of the Software, and to permit persons to whom the Software is furnished to do + * so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in all + * copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + * SOFTWARE. + */ + +!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?module.exports=t():"function"==typeof define&&define.amd?define(t):(e="undefined"!=typeof globalThis?globalThis:e||self).cytoscape=t()}(this,(function(){"use strict";function e(e,t){(null==t||t>e.length)&&(t=e.length);for(var n=0,r=Array(t);n=e.length?{done:!0}:{done:!1,value:e[r++]}},e:function(e){throw e},f:a}}throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}var i,o=!0,s=!1;return{s:function(){n=n.call(e)},n:function(){var e=n.next();return o=e.done,e},e:function(e){s=!0,i=e},f:function(){try{o||null==n.return||n.return()}finally{if(s)throw i}}}}function a(e,t,n){return(t=s(t))in e?Object.defineProperty(e,t,{value:n,enumerable:!0,configurable:!0,writable:!0}):e[t]=n,e}function i(e,t){return function(e){if(Array.isArray(e))return e}(e)||function(e,t){var n=null==e?null:"undefined"!=typeof Symbol&&e[Symbol.iterator]||e["@@iterator"];if(null!=n){var r,a,i,o,s=[],l=!0,u=!1;try{if(i=(n=n.call(e)).next,0===t){if(Object(n)!==n)return;l=!1}else for(;!(l=(r=i.call(n)).done)&&(s.push(r.value),s.length!==t);l=!0);}catch(e){u=!0,a=e}finally{try{if(!l&&null!=n.return&&(o=n.return(),Object(o)!==o))return}finally{if(u)throw a}}return s}}(e,t)||u(e,t)||function(){throw new TypeError("Invalid attempt to destructure non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function o(t){return function(t){if(Array.isArray(t))return e(t)}(t)||function(e){if("undefined"!=typeof Symbol&&null!=e[Symbol.iterator]||null!=e["@@iterator"])return Array.from(e)}(t)||u(t)||function(){throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method.")}()}function s(e){var t=function(e,t){if("object"!=typeof e||!e)return e;var n=e[Symbol.toPrimitive];if(void 0!==n){var r=n.call(e,t);if("object"!=typeof r)return r;throw new TypeError("@@toPrimitive must return a primitive value.")}return String(e)}(e,"string");return"symbol"==typeof t?t:t+""}function l(e){return l="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},l(e)}function u(t,n){if(t){if("string"==typeof t)return e(t,n);var r={}.toString.call(t).slice(8,-1);return"Object"===r&&t.constructor&&(r=t.constructor.name),"Map"===r||"Set"===r?Array.from(t):"Arguments"===r||/^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(r)?e(t,n):void 0}}var c="undefined"==typeof window?null:window,d=c?c.navigator:null;c&&c.document;var h,f,p,g,v,y,m,b,x,w,E,k,T,C,P,S,B,D,_,A,M,R,I,N,L,z,O,V,F=l(""),X=l({}),j=l((function(){})),Y="undefined"==typeof HTMLElement?"undefined":l(HTMLElement),q=function(e){return e&&e.instanceString&&U(e.instanceString)?e.instanceString():null},W=function(e){return null!=e&&l(e)==F},U=function(e){return null!=e&&l(e)===j},H=function(e){return!Q(e)&&(Array.isArray?Array.isArray(e):null!=e&&e instanceof Array)},K=function(e){return null!=e&&l(e)===X&&!H(e)&&e.constructor===Object},G=function(e){return null!=e&&l(e)===l(1)&&!isNaN(e)},Z=function(e){return G(e)&&Math.floor(e)===e},$=function(e){return"undefined"===Y?void 0:null!=e&&e instanceof HTMLElement},Q=function(e){return J(e)||ee(e)},J=function(e){return"collection"===q(e)&&e._private.single},ee=function(e){return"collection"===q(e)&&!e._private.single},te=function(e){return"core"===q(e)},ne=function(e){return"stylesheet"===q(e)},re=function(e){return null==e||!(""!==e&&!e.match(/^\s+$/))},ae=function(e){return function(e){return null!=e&&l(e)===X}(e)&&U(e.then)},ie=function(e,t){t||(t=function(){if(1===arguments.length)return arguments[0];if(0===arguments.length)return"undefined";for(var e=[],t=0;tt?1:0},ye=null!=Object.assign?Object.assign.bind(Object):function(e){for(var t=arguments,n=1;n255)return;t.push(Math.floor(i))}var o=r[1]||r[2]||r[3],s=r[1]&&r[2]&&r[3];if(o&&!s)return;var l=n[4];if(void 0!==l){if((l=parseFloat(l))<0||l>1)return;t.push(l)}}return t}(e)||function(e){var t,n,r,a,i,o,s,l;function u(e,t,n){return n<0&&(n+=1),n>1&&(n-=1),n<1/6?e+6*(t-e)*n:n<.5?t:n<2/3?e+(t-e)*(2/3-n)*6:e}var c=new RegExp("^"+pe+"$").exec(e);if(c){if((n=parseInt(c[1]))<0?n=(360- -1*n%360)%360:n>360&&(n%=360),n/=360,(r=parseFloat(c[2]))<0||r>100)return;if(r/=100,(a=parseFloat(c[3]))<0||a>100)return;if(a/=100,void 0!==(i=c[4])&&((i=parseFloat(i))<0||i>1))return;if(0===r)o=s=l=Math.round(255*a);else{var d=a<.5?a*(1+r):a+r-a*r,h=2*a-d;o=Math.round(255*u(h,d,n+1/3)),s=Math.round(255*u(h,d,n)),l=Math.round(255*u(h,d,n-1/3))}t=[o,s,l,i]}return t}(e)},be={transparent:[0,0,0,0],aliceblue:[240,248,255],antiquewhite:[250,235,215],aqua:[0,255,255],aquamarine:[127,255,212],azure:[240,255,255],beige:[245,245,220],bisque:[255,228,196],black:[0,0,0],blanchedalmond:[255,235,205],blue:[0,0,255],blueviolet:[138,43,226],brown:[165,42,42],burlywood:[222,184,135],cadetblue:[95,158,160],chartreuse:[127,255,0],chocolate:[210,105,30],coral:[255,127,80],cornflowerblue:[100,149,237],cornsilk:[255,248,220],crimson:[220,20,60],cyan:[0,255,255],darkblue:[0,0,139],darkcyan:[0,139,139],darkgoldenrod:[184,134,11],darkgray:[169,169,169],darkgreen:[0,100,0],darkgrey:[169,169,169],darkkhaki:[189,183,107],darkmagenta:[139,0,139],darkolivegreen:[85,107,47],darkorange:[255,140,0],darkorchid:[153,50,204],darkred:[139,0,0],darksalmon:[233,150,122],darkseagreen:[143,188,143],darkslateblue:[72,61,139],darkslategray:[47,79,79],darkslategrey:[47,79,79],darkturquoise:[0,206,209],darkviolet:[148,0,211],deeppink:[255,20,147],deepskyblue:[0,191,255],dimgray:[105,105,105],dimgrey:[105,105,105],dodgerblue:[30,144,255],firebrick:[178,34,34],floralwhite:[255,250,240],forestgreen:[34,139,34],fuchsia:[255,0,255],gainsboro:[220,220,220],ghostwhite:[248,248,255],gold:[255,215,0],goldenrod:[218,165,32],gray:[128,128,128],grey:[128,128,128],green:[0,128,0],greenyellow:[173,255,47],honeydew:[240,255,240],hotpink:[255,105,180],indianred:[205,92,92],indigo:[75,0,130],ivory:[255,255,240],khaki:[240,230,140],lavender:[230,230,250],lavenderblush:[255,240,245],lawngreen:[124,252,0],lemonchiffon:[255,250,205],lightblue:[173,216,230],lightcoral:[240,128,128],lightcyan:[224,255,255],lightgoldenrodyellow:[250,250,210],lightgray:[211,211,211],lightgreen:[144,238,144],lightgrey:[211,211,211],lightpink:[255,182,193],lightsalmon:[255,160,122],lightseagreen:[32,178,170],lightskyblue:[135,206,250],lightslategray:[119,136,153],lightslategrey:[119,136,153],lightsteelblue:[176,196,222],lightyellow:[255,255,224],lime:[0,255,0],limegreen:[50,205,50],linen:[250,240,230],magenta:[255,0,255],maroon:[128,0,0],mediumaquamarine:[102,205,170],mediumblue:[0,0,205],mediumorchid:[186,85,211],mediumpurple:[147,112,219],mediumseagreen:[60,179,113],mediumslateblue:[123,104,238],mediumspringgreen:[0,250,154],mediumturquoise:[72,209,204],mediumvioletred:[199,21,133],midnightblue:[25,25,112],mintcream:[245,255,250],mistyrose:[255,228,225],moccasin:[255,228,181],navajowhite:[255,222,173],navy:[0,0,128],oldlace:[253,245,230],olive:[128,128,0],olivedrab:[107,142,35],orange:[255,165,0],orangered:[255,69,0],orchid:[218,112,214],palegoldenrod:[238,232,170],palegreen:[152,251,152],paleturquoise:[175,238,238],palevioletred:[219,112,147],papayawhip:[255,239,213],peachpuff:[255,218,185],peru:[205,133,63],pink:[255,192,203],plum:[221,160,221],powderblue:[176,224,230],purple:[128,0,128],red:[255,0,0],rosybrown:[188,143,143],royalblue:[65,105,225],saddlebrown:[139,69,19],salmon:[250,128,114],sandybrown:[244,164,96],seagreen:[46,139,87],seashell:[255,245,238],sienna:[160,82,45],silver:[192,192,192],skyblue:[135,206,235],slateblue:[106,90,205],slategray:[112,128,144],slategrey:[112,128,144],snow:[255,250,250],springgreen:[0,255,127],steelblue:[70,130,180],tan:[210,180,140],teal:[0,128,128],thistle:[216,191,216],tomato:[255,99,71],turquoise:[64,224,208],violet:[238,130,238],wheat:[245,222,179],white:[255,255,255],whitesmoke:[245,245,245],yellow:[255,255,0],yellowgreen:[154,205,50]},xe=function(e){for(var t=e.map,n=e.keys,r=n.length,a=0;a=o||t<0||v&&e-p>=c}function x(){var e=t();if(b(e))return w(e);h=setTimeout(x,function(e){var t=o-(e-f);return v?a(t,c-(e-p)):t}(e))}function w(e){return h=void 0,y&&l?m(e):(l=u=void 0,d)}function E(){var e=t(),n=b(e);if(l=arguments,u=this,f=e,n){if(void 0===h)return function(e){return p=e,h=setTimeout(x,o),g?m(e):d}(f);if(v)return clearTimeout(h),h=setTimeout(x,o),m(f)}return void 0===h&&(h=setTimeout(x,o)),d}return o=n(o)||0,e(s)&&(g=!!s.leading,c=(v="maxWait"in s)?r(n(s.maxWait)||0,o):c,y="trailing"in s?!!s.trailing:y),E.cancel=function(){void 0!==h&&clearTimeout(h),p=0,l=f=u=h=void 0},E.flush=function(){return void 0===h?d:w(t())},E},O}(),Ae=ke(_e),Me=c?c.performance:null,Re=Me&&Me.now?function(){return Me.now()}:function(){return Date.now()},Ie=function(){if(c){if(c.requestAnimationFrame)return function(e){c.requestAnimationFrame(e)};if(c.mozRequestAnimationFrame)return function(e){c.mozRequestAnimationFrame(e)};if(c.webkitRequestAnimationFrame)return function(e){c.webkitRequestAnimationFrame(e)};if(c.msRequestAnimationFrame)return function(e){c.msRequestAnimationFrame(e)}}return function(e){e&&setTimeout((function(){e(Re())}),1e3/60)}}(),Ne=function(e){return Ie(e)},Le=Re,ze=9261,Oe=5381,Ve=function(e){for(var t,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:ze;!(t=e.next()).done;)n=65599*n+t.value|0;return n},Fe=function(e){return 65599*(arguments.length>1&&void 0!==arguments[1]?arguments[1]:ze)+e|0},Xe=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:Oe;return(t<<5)+t+e|0},je=function(e){return 2097152*e[0]+e[1]},Ye=function(e,t){return[Fe(e[0],t[0]),Xe(e[1],t[1])]},qe=function(e,t){var n={value:0,done:!1},r=0,a=e.length;return Ve({next:function(){return r=0;r--)e[r]===t&&e.splice(r,1)},ht=function(e){e.splice(0,e.length)},ft=function(e,t,n){return n&&(t=le(n,t)),e[t]},pt=function(e,t,n,r){n&&(t=le(n,t)),e[t]=r},gt="undefined"!=typeof Map?Map:function(){return n((function e(){t(this,e),this._obj={}}),[{key:"set",value:function(e,t){return this._obj[e]=t,this}},{key:"delete",value:function(e){return this._obj[e]=void 0,this}},{key:"clear",value:function(){this._obj={}}},{key:"has",value:function(e){return void 0!==this._obj[e]}},{key:"get",value:function(e){return this._obj[e]}}])}(),vt=function(){return n((function e(n){if(t(this,e),this._obj=Object.create(null),this.size=0,null!=n){var r;r=null!=n.instanceString&&n.instanceString()===this.instanceString()?n.toArray():n;for(var a=0;a2&&void 0!==arguments[2])||arguments[2];if(void 0!==e&&void 0!==t&&te(e)){var r=t.group;if(null==r&&(r=t.data&&null!=t.data.source&&null!=t.data.target?"edges":"nodes"),"nodes"===r||"edges"===r){this.length=1,this[0]=this;var a=this._private={cy:e,single:!0,data:t.data||{},position:t.position||{x:0,y:0},autoWidth:void 0,autoHeight:void 0,autoPadding:void 0,compoundBoundsClean:!1,listeners:[],group:r,style:{},rstyle:{},styleCxts:[],styleKeys:{},removed:!0,selected:!!t.selected,selectable:void 0===t.selectable||!!t.selectable,locked:!!t.locked,grabbed:!1,grabbable:void 0===t.grabbable||!!t.grabbable,pannable:void 0===t.pannable?"edges"===r:!!t.pannable,active:!1,classes:new yt,animation:{current:[],queue:[]},rscratch:{},scratch:t.scratch||{},edges:[],children:[],parent:t.parent&&t.parent.isNode()?t.parent:null,traversalCache:{},backgrounding:!1,bbCache:null,bbCacheShift:{x:0,y:0},bodyBounds:null,overlayBounds:null,labelBounds:{all:null,source:null,target:null,main:null},arrowBounds:{source:null,target:null,"mid-source":null,"mid-target":null}};if(null==a.position.x&&(a.position.x=0),null==a.position.y&&(a.position.y=0),t.renderedPosition){var i=t.renderedPosition,o=e.pan(),s=e.zoom();a.position={x:(i.x-o.x)/s,y:(i.y-o.y)/s}}var l=[];H(t.classes)?l=t.classes:W(t.classes)&&(l=t.classes.split(/\s+/));for(var u=0,c=l.length;ut?1:0},u=function(e,t,a,i,o){var s;if(null==a&&(a=0),null==o&&(o=n),a<0)throw new Error("lo must be non-negative");for(null==i&&(i=e.length);an;0<=n?t++:t--)u.push(t);return u}.apply(this).reverse()).length;ig;0<=g?++h:--h)v.push(i(e,r));return v},p=function(e,t,r,a){var i,o,s;for(null==a&&(a=n),i=e[r];r>t&&a(i,o=e[s=r-1>>1])<0;)e[r]=o,r=s;return e[r]=i},g=function(e,t,r){var a,i,o,s,l;for(null==r&&(r=n),i=e.length,l=t,o=e[t],a=2*t+1;a0;){var w=y.pop(),E=g(w),k=w.id();if(d[k]=E,E!==1/0)for(var T=w.neighborhood().intersect(f),C=0;C0)for(n.unshift(t);c[a];){var i=c[a];n.unshift(i.edge),n.unshift(i.node),a=(r=i.node).id()}return o.spawn(n)}}}},At={kruskal:function(e){e=e||function(e){return 1};for(var t=this.byGroup(),n=t.nodes,r=t.edges,a=n.length,i=new Array(a),o=n,s=function(e){for(var t=0;t0;){if(l=g.pop(),u=l.id(),v.delete(u),w++,u===d){for(var E=[],k=a,T=d,C=m[T];E.unshift(k),null!=C&&E.unshift(C),null!=(k=y[T]);)C=m[T=k.id()];return{found:!0,distance:h[u],path:this.spawn(E),steps:w}}p[u]=!0;for(var P=l._private.edges,S=0;SP&&(f[C]=P,y[C]=T,m[C]=x),!a){var S=T*u+k;!a&&f[S]>P&&(f[S]=P,y[S]=k,m[S]=x)}}}for(var B=0;B1&&void 0!==arguments[1]?arguments[1]:i,r=[],a=m(e);;){if(null==a)return t.spawn();var o=y(a),l=o.edge,u=o.pred;if(r.unshift(a[0]),a.same(n)&&r.length>0)break;null!=l&&r.unshift(l),a=u}return s.spawn(r)},hasNegativeWeightCycle:p,negativeWeightCycles:g}}},Ot=Math.sqrt(2),Vt=function(e,t,n){0===n.length&&rt("Karger-Stein must be run on a connected (sub)graph");for(var r=n[e],a=r[1],i=r[2],o=t[a],s=t[i],l=n,u=l.length-1;u>=0;u--){var c=l[u],d=c[1],h=c[2];(t[d]===o&&t[h]===s||t[d]===s&&t[h]===o)&&l.splice(u,1)}for(var f=0;fr;){var a=Math.floor(Math.random()*t.length);t=Vt(a,e,t),n--}return t},Xt={kargerStein:function(){var e=this,t=this.byGroup(),n=t.nodes,r=t.edges;r.unmergeBy((function(e){return e.isLoop()}));var a=n.length,i=r.length,o=Math.ceil(Math.pow(Math.log(a)/Math.LN2,2)),s=Math.floor(a/Ot);if(!(a<2)){for(var l=[],u=0;u0?1:e<0?-1:0},Gt=function(e,t){return Math.sqrt(Zt(e,t))},Zt=function(e,t){var n=t.x-e.x,r=t.y-e.y;return n*n+r*r},$t=function(e){for(var t=e.length,n=0,r=0;r=e.x1&&e.y2>=e.y1)return{x1:e.x1,y1:e.y1,x2:e.x2,y2:e.y2,w:e.x2-e.x1,h:e.y2-e.y1};if(null!=e.w&&null!=e.h&&e.w>=0&&e.h>=0)return{x1:e.x1,y1:e.y1,x2:e.x1+e.w,y2:e.y1+e.h,w:e.w,h:e.h}}},nn=function(e,t,n){e.x1=Math.min(e.x1,t),e.x2=Math.max(e.x2,t),e.w=e.x2-e.x1,e.y1=Math.min(e.y1,n),e.y2=Math.max(e.y2,n),e.h=e.y2-e.y1},rn=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0;return e.x1-=t,e.x2+=t,e.y1-=t,e.y2+=t,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},an=function(e){var t,n,r,a,o=arguments.length>1&&void 0!==arguments[1]?arguments[1]:[0];if(1===o.length)t=n=r=a=o[0];else if(2===o.length)t=r=o[0],a=n=o[1];else if(4===o.length){var s=i(o,4);t=s[0],n=s[1],r=s[2],a=s[3]}return e.x1-=a,e.x2+=n,e.y1-=t,e.y2+=r,e.w=e.x2-e.x1,e.h=e.y2-e.y1,e},on=function(e,t){e.x1=t.x1,e.y1=t.y1,e.x2=t.x2,e.y2=t.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1},sn=function(e,t){return!(e.x1>t.x2)&&(!(t.x1>e.x2)&&(!(e.x2t.y2)&&!(t.y1>e.y2)))))))},ln=function(e,t,n){return e.x1<=t&&t<=e.x2&&e.y1<=n&&n<=e.y2},un=function(e,t){return ln(e,t.x,t.y)},cn=function(e,t){return ln(e,t.x1,t.y1)&&ln(e,t.x2,t.y2)},dn=null!==(St=Math.hypot)&&void 0!==St?St:function(e,t){return Math.sqrt(e*e+t*t)};function hn(e,t,n,r,a,i){var o=function(e,t){if(e.length<3)throw new Error("Need at least 3 vertices");var n=function(e,t){return{x:e.x+t.x,y:e.y+t.y}},r=function(e,t){return{x:e.x-t.x,y:e.y-t.y}},a=function(e,t){return{x:e.x*t,y:e.y*t}},i=function(e,t){return e.x*t.y-e.y*t.x},o=function(e,t,o,s){var l=r(t,e),u=r(s,o),c=i(l,u);if(Math.abs(c)<1e-9)return n(e,a(l,.5));var d=i(r(o,e),u)/c;return n(e,a(l,d))},s=e.map((function(e){return{x:e.x,y:e.y}}));(function(e){for(var t=0,n=0;n7&&void 0!==arguments[7]?arguments[7]:"auto",c="auto"===u?Mn(a,i):u,d=a/2,h=i/2,f=(c=Math.min(c,d,h))!==d,p=c!==h;if(f){var g=r-h-o;if((s=Cn(e,t,n,r,n-d+c-o,g,n+d-c+o,g,!1)).length>0)return s}if(p){var v=n+d+o;if((s=Cn(e,t,n,r,v,r-h+c-o,v,r+h-c+o,!1)).length>0)return s}if(f){var y=r+h+o;if((s=Cn(e,t,n,r,n-d+c-o,y,n+d-c+o,y,!1)).length>0)return s}if(p){var m=n-d-o;if((s=Cn(e,t,n,r,m,r-h+c-o,m,r+h-c+o,!1)).length>0)return s}var b=n-d+c,x=r-h+c;if((l=kn(e,t,n,r,b,x,c+o)).length>0&&l[0]<=b&&l[1]<=x)return[l[0],l[1]];var w=n+d-c,E=r-h+c;if((l=kn(e,t,n,r,w,E,c+o)).length>0&&l[0]>=w&&l[1]<=E)return[l[0],l[1]];var k=n+d-c,T=r+h-c;if((l=kn(e,t,n,r,k,T,c+o)).length>0&&l[0]>=k&&l[1]>=T)return[l[0],l[1]];var C=n-d+c,P=r+h-c;return(l=kn(e,t,n,r,C,P,c+o)).length>0&&l[0]<=C&&l[1]>=P?[l[0],l[1]]:[]},pn=function(e,t,n,r,a,i,o){var s=o,l=Math.min(n,a),u=Math.max(n,a),c=Math.min(r,i),d=Math.max(r,i);return l-s<=e&&e<=u+s&&c-s<=t&&t<=d+s},gn=function(e,t,n,r,a,i,o,s,l){var u=Math.min(n,o,a)-l,c=Math.max(n,o,a)+l,d=Math.min(r,s,i)-l,h=Math.max(r,s,i)+l;return!(ec||th)},vn=function(e,t,n,r,a,i,o,s){var l=[];!function(e,t,n,r,a){var i,o,s,l,u,c,d,h;0===e&&(e=1e-5),s=-27*(r/=e)+(t/=e)*(9*(n/=e)-t*t*2),i=(o=(3*n-t*t)/9)*o*o+(s/=54)*s,a[1]=0,d=t/3,i>0?(u=(u=s+Math.sqrt(i))<0?-Math.pow(-u,1/3):Math.pow(u,1/3),c=(c=s-Math.sqrt(i))<0?-Math.pow(-c,1/3):Math.pow(c,1/3),a[0]=-d+u+c,d+=(u+c)/2,a[4]=a[2]=-d,d=Math.sqrt(3)*(-c+u)/2,a[3]=d,a[5]=-d):(a[5]=a[3]=0,0===i?(h=s<0?-Math.pow(-s,1/3):Math.pow(s,1/3),a[0]=2*h-d,a[4]=a[2]=-(h+d)):(l=(o=-o)*o*o,l=Math.acos(s/Math.sqrt(l)),h=2*Math.sqrt(o),a[0]=-d+h*Math.cos(l/3),a[2]=-d+h*Math.cos((l+2*Math.PI)/3),a[4]=-d+h*Math.cos((l+4*Math.PI)/3)))}(1*n*n-4*n*a+2*n*o+4*a*a-4*a*o+o*o+r*r-4*r*i+2*r*s+4*i*i-4*i*s+s*s,9*n*a-3*n*n-3*n*o-6*a*a+3*a*o+9*r*i-3*r*r-3*r*s-6*i*i+3*i*s,3*n*n-6*n*a+n*o-n*e+2*a*a+2*a*e-o*e+3*r*r-6*r*i+r*s-r*t+2*i*i+2*i*t-s*t,1*n*a-n*n+n*e-a*e+r*i-r*r+r*t-i*t,l);for(var u=[],c=0;c<6;c+=2)Math.abs(l[c+1])<1e-7&&l[c]>=0&&l[c]<=1&&u.push(l[c]);u.push(1),u.push(0);for(var d,h,f,p=-1,g=0;g=0?fl?(e-a)*(e-a)+(t-i)*(t-i):u-d},mn=function(e,t,n){for(var r,a,i,o,s=0,l=0;l=e&&e>=i||r<=e&&e<=i))continue;(e-r)/(i-r)*(o-a)+a>t&&s++}return s%2!=0},bn=function(e,t,n,r,a,i,o,s,l){var u,c=new Array(n.length);null!=s[0]?(u=Math.atan(s[1]/s[0]),s[0]<0?u+=Math.PI/2:u=-u-Math.PI/2):u=s;for(var d,h=Math.cos(-u),f=Math.sin(-u),p=0;p0){var g=wn(c,-l);d=xn(g)}else d=c;return mn(e,t,d)},xn=function(e){for(var t,n,r,a,i,o,s,l,u=new Array(e.length/2),c=0;c=0&&p<=1&&v.push(p),g>=0&&g<=1&&v.push(g),0===v.length)return[];var y=v[0]*s[0]+e,m=v[0]*s[1]+t;return v.length>1?v[0]==v[1]?[y,m]:[y,m,v[1]*s[0]+e,v[1]*s[1]+t]:[y,m]},Tn=function(e,t,n){return t<=e&&e<=n||n<=e&&e<=t?e:e<=t&&t<=n||n<=t&&t<=e?t:n},Cn=function(e,t,n,r,a,i,o,s,l){var u=e-a,c=n-e,d=o-a,h=t-i,f=r-t,p=s-i,g=d*h-p*u,v=c*h-f*u,y=p*c-d*f;if(0!==y){var m=g/y,b=v/y,x=-.001;return x<=m&&m<=1.001&&x<=b&&b<=1.001||l?[e+m*c,t+m*f]:[]}return 0===g||0===v?Tn(e,n,o)===o?[o,s]:Tn(e,n,a)===a?[a,i]:Tn(a,o,n)===n?[n,r]:[]:[]},Pn=function(e,t,n,r,a){var i=[],o=r/2,s=a/2,l=t,u=n;i.push({x:l+o*e[0],y:u+s*e[1]});for(var c=1;c0){var m=wn(g,-s);u=xn(m)}else u=g}else u=n;for(var b=0;bu&&(u=t)},d=function(e){return l[e]},h=0;h0?b.edgesTo(m)[0]:m.edgesTo(b)[0];var w=r(x);m=m.id(),u[m]>u[g]+w&&(u[m]=u[g]+w,h.nodes.indexOf(m)<0?h.push(m):h.updateItem(m),l[m]=0,n[m]=[]),u[m]==u[g]+w&&(l[m]=l[m]+l[g],n[m].push(g))}else for(var E=0;E0;){for(var P=t.pop(),S=0;S0&&o.push(n[s]);0!==o.length&&a.push(r.collection(o))}return a}(c,l,t,r);return b=function(e){for(var t=0;t5&&void 0!==arguments[5]?arguments[5]:er,o=r,s=0;s=2?or(e,t,n,0,rr,ar):or(e,t,n,0,nr)},squaredEuclidean:function(e,t,n){return or(e,t,n,0,rr)},manhattan:function(e,t,n){return or(e,t,n,0,nr)},max:function(e,t,n){return or(e,t,n,-1/0,ir)}};function lr(e,t,n,r,a,i){var o;return o=U(e)?e:sr[e]||sr.euclidean,0===t&&U(e)?o(a,i):o(t,n,r,a,i)}sr["squared-euclidean"]=sr.squaredEuclidean,sr.squaredeuclidean=sr.squaredEuclidean;var ur=ct({k:2,m:2,sensitivityThreshold:1e-4,distance:"euclidean",maxIterations:10,attributes:[],testMode:!1,testCentroids:null}),cr=function(e){return ur(e)},dr=function(e,t,n,r,a){var i="kMedoids"!==a?function(e){return n[e]}:function(e){return r[e](n)},o=n,s=t;return lr(e,r.length,i,(function(e){return r[e](t)}),o,s)},hr=function(e,t,n){for(var r=n.length,a=new Array(r),i=new Array(r),o=new Array(t),s=null,l=0;ln)return!1}return!0},yr=function(e,t,n){for(var r=0;ra&&(a=t[l][u],i=u);o[i].push(e[l])}for(var c=0;c=a.threshold||"dendrogram"===a.mode&&1===e.length)return!1;var f,p=t[o],g=t[r[o]];f="dendrogram"===a.mode?{left:p,right:g,key:p.key}:{value:p.value.concat(g.value),key:p.key},e[p.index]=f,e.splice(g.index,1),t[p.key]=f;for(var v=0;vn[g.key][y.key]&&(i=n[g.key][y.key])):"max"===a.linkage?(i=n[p.key][y.key],n[p.key][y.key]1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],a=!(arguments.length>5&&void 0!==arguments[5])||arguments[5];arguments.length>3&&void 0!==arguments[3]&&!arguments[3]?(n0&&e.splice(0,t)):e=e.slice(t,n);for(var i=0,o=e.length-1;o>=0;o--){var s=e[o];a?isFinite(s)||(e[o]=-1/0,i++):e.splice(o,1)}r&&e.sort((function(e,t){return e-t}));var l=e.length,u=Math.floor(l/2);return l%2!=0?e[u+1+i]:(e[u-1+i]+e[u+i])/2}(e):"mean"===t?function(e){for(var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=0,a=0,i=t;i1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=1/0,a=t;a1&&void 0!==arguments[1]?arguments[1]:0,n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:e.length,r=-1/0,a=t;ao&&(i=l,o=t[a*e+l])}i>0&&r.push(i)}for(var u=0;u=P?(S=P,P=D,B=_):D>S&&(S=D);for(var A=0;A0?1:0;k[E%u.minIterations*t+z]=O,L+=O}if(L>0&&(E>=u.minIterations-1||E==u.maxIterations-1)){for(var V=0,F=0;F0&&r.push(a);return r}(t,i,o),Y=function(e,t,n){for(var r=Nr(e,t,n),a=0;al&&(s=u,l=c)}n[a]=i[s]}return Nr(e,t,n)}(t,r,j),q={},W=0;W1||o>1)&&(u=!0),c[t]=[],e.outgoers().forEach((function(e){e.isEdge()&&c[t].push(e.id())}))}else d[t]=[void 0,e.target().id()]})):l.forEach((function(e){var t=e.id();e.isNode()?(e.degree(!0)%2&&(n?r?u=!0:r=t:n=t),c[t]=[],e.connectedEdges().forEach((function(e){return c[t].push(e.id())}))):d[t]=[e.source().id(),e.target().id()]}));var h={found:!1,trail:void 0};if(u)return h;if(r&&n)if(s){if(a&&r!=a)return h;a=r}else{if(a&&r!=a&&n!=a)return h;a||(a=r)}else a||(a=l[0].id());var f=function(e){for(var t,n,r,a=e,i=[e];c[a].length;)t=c[a].shift(),n=d[t][0],a!=(r=d[t][1])?(c[r]=c[r].filter((function(e){return e!=t})),a=r):s||a==n||(c[n]=c[n].filter((function(e){return e!=t})),a=n),i.unshift(t),i.unshift(a);return i},p=[],g=[];for(g=f(a);1!=g.length;)0==c[g[0]].length?(p.unshift(l.getElementById(g.shift())),p.unshift(l.getElementById(g.shift()))):g=f(g.shift()).concat(g);for(var v in p.unshift(l.getElementById(g.shift())),c)if(c[v].length)return h;return h.found=!0,h.trail=this.spawn(p,!0),h}},Fr=function(){var e=this,t={},n=0,r=0,a=[],i=[],o={},s=function(l,u,c){l===c&&(r+=1),t[u]={id:n,low:n++,cutVertex:!1};var d,h,f,p,g=e.getElementById(u).connectedEdges().intersection(e);0===g.size()?a.push(e.spawn(e.getElementById(u))):g.forEach((function(n){d=n.source().id(),h=n.target().id(),(f=d===u?h:d)!==c&&(p=n.id(),o[p]||(o[p]=!0,i.push({x:u,y:f,edge:n})),f in t?t[u].low=Math.min(t[u].low,t[f].id):(s(l,f,u),t[u].low=Math.min(t[u].low,t[f].low),t[u].id<=t[f].low&&(t[u].cutVertex=!0,function(n,r){for(var o=i.length-1,s=[],l=e.spawn();i[o].x!=n||i[o].y!=r;)s.push(i.pop().edge),o--;s.push(i.pop().edge),s.forEach((function(n){var r=n.connectedNodes().intersection(e);l.merge(n),r.forEach((function(n){var r=n.id(),a=n.connectedEdges().intersection(e);l.merge(n),t[r].cutVertex?l.merge(a.filter((function(e){return e.isLoop()}))):l.merge(a)}))})),a.push(l)}(u,f))))}))};e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||(r=0,s(n,n),t[n].cutVertex=r>1)}}));var l=Object.keys(t).filter((function(e){return t[e].cutVertex})).map((function(t){return e.getElementById(t)}));return{cut:e.spawn(l),components:a}},Xr=function(){var e=this,t={},n=0,r=[],a=[],i=e.spawn(e),o=function(s){if(a.push(s),t[s]={index:n,low:n++,explored:!1},e.getElementById(s).connectedEdges().intersection(e).forEach((function(e){var n=e.target().id();n!==s&&(n in t||o(n),t[n].explored||(t[s].low=Math.min(t[s].low,t[n].low)))})),t[s].index===t[s].low){for(var l=e.spawn();;){var u=a.pop();if(l.merge(e.getElementById(u)),t[u].low=t[s].index,t[u].explored=!0,u===s)break}var c=l.edgesWith(l),d=l.merge(c);r.push(d),i=i.difference(d)}};return e.forEach((function(e){if(e.isNode()){var n=e.id();n in t||o(n)}})),{cut:i,components:r}},jr={};[xt,_t,At,Rt,Nt,zt,Xt,zn,Vn,Xn,Yn,Jn,kr,Ar,zr,Vr,{hopcroftTarjanBiconnected:Fr,htbc:Fr,htb:Fr,hopcroftTarjanBiconnectedComponents:Fr},{tarjanStronglyConnected:Xr,tsc:Xr,tscc:Xr,tarjanStronglyConnectedComponents:Xr}].forEach((function(e){ye(jr,e)})); +/*! + Embeddable Minimum Strictly-Compliant Promises/A+ 1.1.1 Thenable + Copyright (c) 2013-2014 Ralf S. Engelschall (http://engelschall.com) + Licensed under The MIT License (http://opensource.org/licenses/MIT) + */ +var Yr=function(e){if(!(this instanceof Yr))return new Yr(e);this.id="Thenable/1.0.7",this.state=0,this.fulfillValue=void 0,this.rejectReason=void 0,this.onFulfilled=[],this.onRejected=[],this.proxy={then:this.then.bind(this)},"function"==typeof e&&e.call(this,this.fulfill.bind(this),this.reject.bind(this))};Yr.prototype={fulfill:function(e){return qr(this,1,"fulfillValue",e)},reject:function(e){return qr(this,2,"rejectReason",e)},then:function(e,t){var n=this,r=new Yr;return n.onFulfilled.push(Hr(e,r,"fulfill")),n.onRejected.push(Hr(t,r,"reject")),Wr(n),r.proxy}};var qr=function(e,t,n,r){return 0===e.state&&(e.state=t,e[n]=r,Wr(e)),e},Wr=function(e){1===e.state?Ur(e,"onFulfilled",e.fulfillValue):2===e.state&&Ur(e,"onRejected",e.rejectReason)},Ur=function(e,t,n){if(0!==e[t].length){var r=e[t];e[t]=[];var a=function(){for(var e=0;e0:void 0}},clearQueue:function(){return function(){var e=this,t=void 0!==e.length?e:[e];if(!(this._private.cy||this).styleEnabled())return this;for(var n=0;n-1}}(),a=function(){if(Ya)return ja;Ya=1;var e=Oi();return ja=function(t,n){var r=this.__data__,a=e(r,t);return a<0?(++this.size,r.push([t,n])):r[a][1]=n,this},ja}();function i(e){var t=-1,n=null==e?0:e.length;for(this.clear();++t-1&&t%1==0&&t0&&this.spawn(r).updateStyle().emit("class"),t},addClass:function(e){return this.toggleClass(e,!0)},hasClass:function(e){var t=this[0];return null!=t&&t._private.classes.has(e)},toggleClass:function(e,t){H(e)||(e=e.match(/\S+/g)||[]);for(var n=this,r=void 0===t,a=[],i=0,o=n.length;i0&&this.spawn(a).updateStyle().emit("class"),n},removeClass:function(e){return this.toggleClass(e,!1)},flashClass:function(e,t){var n=this;if(null==t)t=250;else if(0===t)return n;return n.addClass(e),setTimeout((function(){n.removeClass(e)}),t),n}};To.className=To.classNames=To.classes;var Co={metaChar:"[\\!\\\"\\#\\$\\%\\&\\'\\(\\)\\*\\+\\,\\.\\/\\:\\;\\<\\=\\>\\?\\@\\[\\]\\^\\`\\{\\|\\}\\~]",comparatorOp:"=|\\!=|>|>=|<|<=|\\$=|\\^=|\\*=",boolOp:"\\?|\\!|\\^",string:"\"(?:\\\\\"|[^\"])*\"|'(?:\\\\'|[^'])*'",number:de,meta:"degree|indegree|outdegree",separator:"\\s*,\\s*",descendant:"\\s+",child:"\\s+>\\s+",subject:"\\$",group:"node|edge|\\*",directedEdge:"\\s+->\\s+",undirectedEdge:"\\s+<->\\s+"};Co.variable="(?:[\\w-.]|(?:\\\\"+Co.metaChar+"))+",Co.className="(?:[\\w-]|(?:\\\\"+Co.metaChar+"))+",Co.value=Co.string+"|"+Co.number,Co.id=Co.variable,function(){var e,t,n;for(e=Co.comparatorOp.split("|"),n=0;n=0||"="!==t&&(Co.comparatorOp+="|\\!"+t)}();var Po=0,So=1,Bo=2,Do=3,_o=4,Ao=5,Mo=6,Ro=7,Io=8,No=9,Lo=10,zo=11,Oo=12,Vo=13,Fo=14,Xo=15,jo=16,Yo=17,qo=18,Wo=19,Uo=20,Ho=[{selector:":selected",matches:function(e){return e.selected()}},{selector:":unselected",matches:function(e){return!e.selected()}},{selector:":selectable",matches:function(e){return e.selectable()}},{selector:":unselectable",matches:function(e){return!e.selectable()}},{selector:":locked",matches:function(e){return e.locked()}},{selector:":unlocked",matches:function(e){return!e.locked()}},{selector:":visible",matches:function(e){return e.visible()}},{selector:":hidden",matches:function(e){return!e.visible()}},{selector:":transparent",matches:function(e){return e.transparent()}},{selector:":grabbed",matches:function(e){return e.grabbed()}},{selector:":free",matches:function(e){return!e.grabbed()}},{selector:":removed",matches:function(e){return e.removed()}},{selector:":inside",matches:function(e){return!e.removed()}},{selector:":grabbable",matches:function(e){return e.grabbable()}},{selector:":ungrabbable",matches:function(e){return!e.grabbable()}},{selector:":animated",matches:function(e){return e.animated()}},{selector:":unanimated",matches:function(e){return!e.animated()}},{selector:":parent",matches:function(e){return e.isParent()}},{selector:":childless",matches:function(e){return e.isChildless()}},{selector:":child",matches:function(e){return e.isChild()}},{selector:":orphan",matches:function(e){return e.isOrphan()}},{selector:":nonorphan",matches:function(e){return e.isChild()}},{selector:":compound",matches:function(e){return e.isNode()?e.isParent():e.source().isParent()||e.target().isParent()}},{selector:":loop",matches:function(e){return e.isLoop()}},{selector:":simple",matches:function(e){return e.isSimple()}},{selector:":active",matches:function(e){return e.active()}},{selector:":inactive",matches:function(e){return!e.active()}},{selector:":backgrounding",matches:function(e){return e.backgrounding()}},{selector:":nonbackgrounding",matches:function(e){return!e.backgrounding()}}].sort((function(e,t){return function(e,t){return-1*ve(e,t)}(e.selector,t.selector)})),Ko=function(){for(var e,t={},n=0;n0&&u.edgeCount>0)return it("The selector `"+e+"` is invalid because it uses both a compound selector and an edge selector"),!1;if(u.edgeCount>1)return it("The selector `"+e+"` is invalid because it uses multiple edge selectors"),!1;1===u.edgeCount&&it("The selector `"+e+"` is deprecated. Edge selectors do not take effect on changes to source and target nodes after an edge is added, for performance reasons. Use a class or data selector on edges instead, updating the class or data of an edge when your app detects a change in source or target nodes.")}return!0},toString:function(){if(null!=this.toStringCache)return this.toStringCache;for(var e=function(e){return null==e?"":e},t=function(t){return W(t)?'"'+t+'"':e(t)},n=function(e){return" "+e+" "},r=function(r,i){var o=r.type,s=r.value;switch(o){case Po:var l=e(s);return l.substring(0,l.length-1);case Do:var u=r.field,c=r.operator;return"["+u+n(e(c))+t(s)+"]";case Ao:var d=r.operator,h=r.field;return"["+e(d)+h+"]";case _o:return"["+r.field+"]";case Mo:var f=r.operator;return"[["+r.field+n(e(f))+t(s)+"]]";case Ro:return s;case Io:return"#"+s;case No:return"."+s;case Yo:case Xo:return a(r.parent,i)+n(">")+a(r.child,i);case qo:case jo:return a(r.ancestor,i)+" "+a(r.descendant,i);case Wo:var p=a(r.left,i),g=a(r.subject,i),v=a(r.right,i);return p+(p.length>0?" ":"")+g+v;case Uo:return""}},a=function(e,t){return e.checks.reduce((function(n,a,i){return n+(t===e&&0===i?"$":"")+r(a,t)}),"")},i="",o=0;o1&&o=0&&(t=t.replace("!",""),c=!0),t.indexOf("@")>=0&&(t=t.replace("@",""),u=!0),(o||l||u)&&(a=o||s?""+e:"",i=""+n),u&&(e=a=a.toLowerCase(),n=i=i.toLowerCase()),t){case"*=":r=a.indexOf(i)>=0;break;case"$=":r=a.indexOf(i,a.length-i.length)>=0;break;case"^=":r=0===a.indexOf(i);break;case"=":r=e===n;break;case">":d=!0,r=e>n;break;case">=":d=!0,r=e>=n;break;case"<":d=!0,r=e0;){var u=a.shift();t(u),i.add(u.id()),o&&r(a,i,u)}return e}function ps(e,t,n){if(n.isParent())for(var r=n._private.children,a=0;a1&&void 0!==arguments[1])||arguments[1],ps)},hs.forEachUp=function(e){return fs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],gs)},hs.forEachUpAndDown=function(e){return fs(this,e,!(arguments.length>1&&void 0!==arguments[1])||arguments[1],vs)},hs.ancestors=hs.parents,(us=cs={data:Eo.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),removeData:Eo.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,immutableKeys:{id:!0,source:!0,target:!0,parent:!0},updateStyle:!0}),scratch:Eo.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Eo.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),rscratch:Eo.data({field:"rscratch",allowBinding:!1,allowSetting:!0,settingTriggersEvent:!1,allowGetting:!0}),removeRscratch:Eo.removeData({field:"rscratch",triggerEvent:!1}),id:function(){var e=this[0];if(e)return e._private.data.id}}).attr=us.data,us.removeAttr=us.removeData;var ys,ms,bs=cs,xs={};function ws(e){return function(t){var n=this;if(void 0===t&&(t=!0),0!==n.length&&n.isNode()&&!n.removed()){for(var r=0,a=n[0],i=a._private.edges,o=0;ot})),minIndegree:Es("indegree",(function(e,t){return et})),minOutdegree:Es("outdegree",(function(e,t){return et}))}),ye(xs,{totalDegree:function(e){for(var t=0,n=this.nodes(),r=0;r0,c=u;u&&(l=l[0]);var d=c?l.position():{x:0,y:0};return a={x:s.x-d.x,y:s.y-d.y},void 0===e?a:a[e]}for(var h=0;h0,v=g;g&&(p=p[0]);var y=v?p.position():{x:0,y:0};void 0!==t?f.position(e,t+y[e]):void 0!==a&&f.position({x:a.x+y.x,y:a.y+y.y})}}else if(!i)return;return this}},ys.modelPosition=ys.point=ys.position,ys.modelPositions=ys.points=ys.positions,ys.renderedPoint=ys.renderedPosition,ys.relativePoint=ys.relativePosition;var Cs,Ps,Ss=ms,Bs=function(e){switch(e){case"left":case"right-inside":return"left";case"right":case"left-inside":return"right";default:return"center"}},Ds=function(e){switch(e){case"top":case"bottom-inside":return"top";case"bottom":case"top-inside":return"bottom";default:return"center"}};Cs=Ps={},Ps.renderedBoundingBox=function(e){var t=this.boundingBox(e),n=this.cy(),r=n.zoom(),a=n.pan(),i=t.x1*r+a.x,o=t.x2*r+a.x,s=t.y1*r+a.y,l=t.y2*r+a.y;return{x1:i,x2:o,y1:s,y2:l,w:o-i,h:l-s}},Ps.dirtyCompoundBoundsCache=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();return t.styleEnabled()&&t.hasCompoundNodes()?(this.forEachUp((function(t){if(t.isParent()){var n=t._private;n.compoundBoundsClean=!1,n.bbCache=null,e||t.emitAndNotify("bounds")}})),this):this},Ps.updateCompoundBounds=function(){var e=arguments.length>0&&void 0!==arguments[0]&&arguments[0],t=this.cy();if(!t.styleEnabled()||!t.hasCompoundNodes())return this;if(!e&&t.batching())return this;function n(e){if(e.isParent()){var t=e._private,n=e.children(),r="include"===e.pstyle("compound-sizing-wrt-labels").value,a={width:{val:e.pstyle("min-width").pfValue,left:e.pstyle("min-width-bias-left"),right:e.pstyle("min-width-bias-right")},height:{val:e.pstyle("min-height").pfValue,top:e.pstyle("min-height-bias-top"),bottom:e.pstyle("min-height-bias-bottom")}},i=n.boundingBox({includeLabels:r,includeOverlays:!1,useCache:!1}),o=t.position;0!==i.w&&0!==i.h||((i={w:e.pstyle("width").pfValue,h:e.pstyle("height").pfValue}).x1=o.x-i.w/2,i.x2=o.x+i.w/2,i.y1=o.y-i.h/2,i.y2=o.y+i.h/2);var s=a.width.left.value;"px"===a.width.left.units&&a.width.val>0&&(s=100*s/a.width.val);var l=a.width.right.value;"px"===a.width.right.units&&a.width.val>0&&(l=100*l/a.width.val);var u=a.height.top.value;"px"===a.height.top.units&&a.height.val>0&&(u=100*u/a.height.val);var c=a.height.bottom.value;"px"===a.height.bottom.units&&a.height.val>0&&(c=100*c/a.height.val);var d=y(a.width.val-i.w,s,l),h=d.biasDiff,f=d.biasComplementDiff,p=y(a.height.val-i.h,u,c),g=p.biasDiff,v=p.biasComplementDiff;t.autoPadding=function(e,t,n,r){if("%"!==n.units)return"px"===n.units?n.pfValue:0;switch(r){case"width":return e>0?n.pfValue*e:0;case"height":return t>0?n.pfValue*t:0;case"average":return e>0&&t>0?n.pfValue*(e+t)/2:0;case"min":return e>0&&t>0?e>t?n.pfValue*t:n.pfValue*e:0;case"max":return e>0&&t>0?e>t?n.pfValue*e:n.pfValue*t:0;default:return 0}}(i.w,i.h,e.pstyle("padding"),e.pstyle("padding-relative-to").value),t.autoWidth=Math.max(i.w,a.width.val),o.x=(-h+i.x1+i.x2+f)/2,t.autoHeight=Math.max(i.h,a.height.val),o.y=(-g+i.y1+i.y2+v)/2}function y(e,t,n){var r=0,a=0,i=t+n;return e>0&&i>0&&(r=t/i*e,a=n/i*e),{biasDiff:r,biasComplementDiff:a}}}for(var r=0;re.x2?r:e.x2,e.y1=ne.y2?a:e.y2,e.w=e.x2-e.x1,e.h=e.y2-e.y1)},Ms=function(e,t){return null==t?e:As(e,t.x1,t.y1,t.x2,t.y2)},Rs=function(e,t,n){return ft(e,t,n)},Is=function(e,t,n){if(!t.cy().headless()){var r,a,i=t._private,o=i.rstyle,s=o.arrowWidth/2;if("none"!==t.pstyle(n+"-arrow-shape").value){"source"===n?(r=o.srcX,a=o.srcY):"target"===n?(r=o.tgtX,a=o.tgtY):(r=o.midX,a=o.midY);var l=i.arrowBounds=i.arrowBounds||{},u=l[n]=l[n]||{};u.x1=r-s,u.y1=a-s,u.x2=r+s,u.y2=a+s,u.w=u.x2-u.x1,u.h=u.y2-u.y1,rn(u,1),As(e,u.x1,u.y1,u.x2,u.y2)}}},Ns=function(e,t,n){if(!t.cy().headless()){var r;r=n?n+"-":"";var a=t._private,i=a.rstyle;if(t.pstyle(r+"label").strValue){var o,s,l,u,c=t.pstyle("text-halign"),d=t.pstyle("text-valign"),h=Rs(i,"labelWidth",n),f=Rs(i,"labelHeight",n),p=Rs(i,"labelX",n),g=Rs(i,"labelY",n),v=t.pstyle(r+"text-margin-x").pfValue,y=t.pstyle(r+"text-margin-y").pfValue,m=t.isEdge(),b=t.pstyle(r+"text-rotation"),x=t.pstyle("text-outline-width").pfValue,w=t.pstyle("text-border-width").pfValue/2,E=t.pstyle("text-background-padding").pfValue,k=f,T=h,C=T/2,P=k/2;if(m)o=p-C,s=p+C,l=g-P,u=g+P;else{switch(Bs(c.value)){case"left":o=p-T,s=p;break;case"center":o=p-C,s=p+C;break;case"right":o=p,s=p+T}switch(Ds(d.value)){case"top":l=g-k,u=g;break;case"center":l=g-P,u=g+P;break;case"bottom":l=g,u=g+k}}var S=v-Math.max(x,w)-E-2,B=v+Math.max(x,w)+E+2,D=y-Math.max(x,w)-E-2,_=y+Math.max(x,w)+E+2;o+=S,s+=B,l+=D,u+=_;var A=n||"main",M=a.labelBounds,R=M[A]=M[A]||{};R.x1=o,R.y1=l,R.x2=s,R.y2=u,R.w=s-o,R.h=u-l,R.leftPad=S,R.rightPad=B,R.topPad=D,R.botPad=_;var I=m&&"autorotate"===b.strValue,N=null!=b.pfValue&&0!==b.pfValue;if(I||N){var L=I?Rs(a.rstyle,"labelAngle",n):b.pfValue,z=Math.cos(L),O=Math.sin(L),V=(o+s)/2,F=(l+u)/2;if(!m){switch(Bs(c.value)){case"left":V=s;break;case"right":V=o}switch(Ds(d.value)){case"top":F=u;break;case"bottom":F=l}}var X=function(e,t){return{x:(e-=V)*z-(t-=F)*O+V,y:e*O+t*z+F}},j=X(o,l),Y=X(o,u),q=X(s,l),W=X(s,u);o=Math.min(j.x,Y.x,q.x,W.x),s=Math.max(j.x,Y.x,q.x,W.x),l=Math.min(j.y,Y.y,q.y,W.y),u=Math.max(j.y,Y.y,q.y,W.y)}var U=A+"Rot",H=M[U]=M[U]||{};H.x1=o,H.y1=l,H.x2=s,H.y2=u,H.w=s-o,H.h=u-l,As(e,o,l,s,u),As(a.labelBounds.all,o,l,s,u)}return e}},Ls=function(e,t){if(!t.cy().headless()){var n=t.pstyle("outline-opacity").value,r=t.pstyle("outline-width").value+t.pstyle("outline-offset").value;zs(e,t,n,r,"outside",r/2)}},zs=function(e,t,n,r,a,i){if(!(0===n||r<=0||"inside"===a)){var o=t.cy().renderer(),s=o.nodeShapes[o.getNodeShape(t)];if(s){var l=t.position(),u=l.x,c=l.y,d=t.width(),h=t.height();if(s.hasMiterBounds){"center"===a&&(r/=2);var f=s.miterBounds(u,c,d,h,r);Ms(e,f)}else null!=i&&i>0&&an(e,[i,i,i,i])}}},Os=function(e,t){var n,r,a,i,o,s,l,u=e._private.cy,c=u.styleEnabled(),d=u.headless(),h=tn(),f=e._private,p=e.isNode(),g=e.isEdge(),v=f.rstyle,y=p&&c?e.pstyle("bounds-expansion").pfValue:[0],m=function(e){return"none"!==e.pstyle("display").value},b=!c||m(e)&&(!g||m(e.source())&&m(e.target()));if(b){var x=0;c&&t.includeOverlays&&0!==e.pstyle("overlay-opacity").value&&(x=e.pstyle("overlay-padding").value);var w=0;c&&t.includeUnderlays&&0!==e.pstyle("underlay-opacity").value&&(w=e.pstyle("underlay-padding").value);var E=Math.max(x,w),k=0;if(c&&(k=e.pstyle("width").pfValue/2),p&&t.includeNodes){var T=e.position();o=T.x,s=T.y;var C=e.outerWidth()/2,P=e.outerHeight()/2;As(h,n=o-C,a=s-P,r=o+C,i=s+P),c&&Ls(h,e),c&&t.includeOutlines&&!d&&Ls(h,e),c&&function(e,t){if(!t.cy().headless()){var n=t.pstyle("border-opacity").value,r=t.pstyle("border-width").pfValue,a=t.pstyle("border-position").value;zs(e,t,n,r,a)}}(h,e)}else if(g&&t.includeEdges)if(c&&!d){var S=e.pstyle("curve-style").strValue;if(n=Math.min(v.srcX,v.midX,v.tgtX),r=Math.max(v.srcX,v.midX,v.tgtX),a=Math.min(v.srcY,v.midY,v.tgtY),i=Math.max(v.srcY,v.midY,v.tgtY),As(h,n-=k,a-=k,r+=k,i+=k),"haystack"===S){var B=v.haystackPts;if(B&&2===B.length){if(n=B[0].x,a=B[0].y,n>(r=B[1].x)){var D=n;n=r,r=D}if(a>(i=B[1].y)){var _=a;a=i,i=_}As(h,n-k,a-k,r+k,i+k)}}else if("bezier"===S||"unbundled-bezier"===S||ce(S,"segments")||ce(S,"taxi")){var A;switch(S){case"bezier":case"unbundled-bezier":A=v.bezierPts;break;case"segments":case"taxi":case"round-segments":case"round-taxi":A=v.linePts}if(null!=A)for(var M=0;M(r=N.x)){var L=n;n=r,r=L}if((a=I.y)>(i=N.y)){var z=a;a=i,i=z}As(h,n-=k,a-=k,r+=k,i+=k)}if(c&&t.includeEdges&&g&&(Is(h,e,"mid-source"),Is(h,e,"mid-target"),Is(h,e,"source"),Is(h,e,"target")),c)if("yes"===e.pstyle("ghost").value){var O=e.pstyle("ghost-offset-x").pfValue,V=e.pstyle("ghost-offset-y").pfValue;As(h,h.x1+O,h.y1+V,h.x2+O,h.y2+V)}var F=f.bodyBounds=f.bodyBounds||{};on(F,h),an(F,y),rn(F,1),c&&(n=h.x1,r=h.x2,a=h.y1,i=h.y2,As(h,n-E,a-E,r+E,i+E));var X=f.overlayBounds=f.overlayBounds||{};on(X,h),an(X,y),rn(X,1);var j=f.labelBounds=f.labelBounds||{};null!=j.all?((l=j.all).x1=1/0,l.y1=1/0,l.x2=-1/0,l.y2=-1/0,l.w=0,l.h=0):j.all=tn(),c&&t.includeLabels&&(t.includeMainLabels&&Ns(h,e,null),g&&(t.includeSourceLabels&&Ns(h,e,"source"),t.includeTargetLabels&&Ns(h,e,"target")))}return h.x1=_s(h.x1),h.y1=_s(h.y1),h.x2=_s(h.x2),h.y2=_s(h.y2),h.w=_s(h.x2-h.x1),h.h=_s(h.y2-h.y1),h.w>0&&h.h>0&&b&&(an(h,y),rn(h,1)),h},Vs=function(e){var t=0,n=function(e){return(e?1:0)<0&&void 0!==arguments[0]?arguments[0]:il,t=arguments.length>1?arguments[1]:void 0,n=0;n=0;s--)o(s);return this},sl.removeAllListeners=function(){return this.removeListener("*")},sl.emit=sl.trigger=function(e,t,n){var r=this.listeners,a=r.length;return this.emitting++,H(t)||(t=[t]),cl(this,(function(e,i){null!=n&&(r=[{event:i.event,type:i.type,namespace:i.namespace,callback:n}],a=r.length);for(var o=function(){var n=r[s];if(n.type===i.type&&(!n.namespace||n.namespace===i.namespace||".*"===n.namespace)&&e.eventMatches(e.context,n,i)){var a=[i];null!=t&&function(e,t){for(var n=0;n1&&!r){var a=this.length-1,i=this[a],o=i._private.data.id;this[a]=void 0,this[e]=i,n.set(o,{ele:i,index:e})}return this.length--,this},unmergeOne:function(e){e=e[0];var t=this._private,n=e._private.data.id,r=t.map.get(n);if(!r)return this;var a=r.index;return this.unmergeAt(a),this},unmerge:function(e){var t=this._private.cy;if(!e)return this;if(e&&W(e)){var n=e;e=t.mutableElements().filter(n)}for(var r=0;r=0;t--){e(this[t])&&this.unmergeAt(t)}return this},map:function(e,t){for(var n=[],r=this,a=0;ar&&(r=s,n=o)}return{value:r,ele:n}},min:function(e,t){for(var n,r=1/0,a=this,i=0;i=0&&a1&&void 0!==arguments[1])||arguments[1],n=this[0],r=n.cy();if(r.styleEnabled()&&n){n._private.styleDirty&&(n._private.styleDirty=!1,r.style().apply(n));var a=n._private.style[e];return null!=a?a:t?r.style().getDefaultProperty(e):null}},numericStyle:function(e){var t=this[0];if(t.cy().styleEnabled()&&t){var n=t.pstyle(e);return void 0!==n.pfValue?n.pfValue:n.value}},numericStyleUnits:function(e){var t=this[0];if(t.cy().styleEnabled())return t?t.pstyle(e).units:void 0},renderedStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=this[0];return n?t.style().getRenderedStyle(n,e):void 0},style:function(e,t){var n=this.cy();if(!n.styleEnabled())return this;var r=!1,a=n.style();if(K(e)){var i=e;a.applyBypass(this,i,r),this.emitAndNotify("style")}else if(W(e)){if(void 0===t){var o=this[0];return o?a.getStylePropertyValue(o,e):void 0}a.applyBypass(this,e,t,r),this.emitAndNotify("style")}else if(void 0===e){var s=this[0];return s?a.getRawStyle(s):void 0}return this},removeStyle:function(e){var t=this.cy();if(!t.styleEnabled())return this;var n=!1,r=t.style(),a=this;if(void 0===e)for(var i=0;i0&&t.push(c[0]),t.push(s[0])}return this.spawn(t,!0).filter(e)}),"neighborhood"),closedNeighborhood:function(e){return this.neighborhood().add(this).filter(e)},openNeighborhood:function(e){return this.neighborhood(e)}}),Nl.neighbourhood=Nl.neighborhood,Nl.closedNeighbourhood=Nl.closedNeighborhood,Nl.openNeighbourhood=Nl.openNeighborhood,ye(Nl,{source:ds((function(e){var t,n=this[0];return n&&(t=n._private.source||n.cy().collection()),t&&e?t.filter(e):t}),"source"),target:ds((function(e){var t,n=this[0];return n&&(t=n._private.target||n.cy().collection()),t&&e?t.filter(e):t}),"target"),sources:Vl({attr:"source"}),targets:Vl({attr:"target"})}),ye(Nl,{edgesWith:ds(Fl(),"edgesWith"),edgesTo:ds(Fl({thisIsSrc:!0}),"edgesTo")}),ye(Nl,{connectedEdges:ds((function(e){for(var t=[],n=0;n0);return i},component:function(){var e=this[0];return e.cy().mutableElements().components(e)[0]}}),Nl.componentsOf=Nl.components;var jl=function(e,t){var n=arguments.length>2&&void 0!==arguments[2]&&arguments[2],r=arguments.length>3&&void 0!==arguments[3]&&arguments[3];if(void 0!==e){var a=new gt,i=!1;if(t){if(t.length>0&&K(t[0])&&!J(t[0])){i=!0;for(var o=[],s=new yt,l=0,u=t.length;l0&&void 0!==arguments[0])||arguments[0],r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=this,i=a.cy(),o=i._private,s=[],l=[],u=0,c=a.length;u0){for(var I=e.length===a.length?a:new jl(i,e),N=0;N0&&void 0!==arguments[0])||arguments[0],t=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],n=this,r=[],a={},i=n._private.cy;function o(e){var n=a[e.id()];t&&e.removed()||n||(a[e.id()]=!0,e.isNode()?(r.push(e),function(e){for(var t=e._private.edges,n=0;n0&&(e?k.emitAndNotify("remove"):t&&k.emit("remove"));for(var T=0;T=.001?function(t,r){for(var a=0;a<4;++a){var i=h(r,e,n);if(0===i)return r;r-=(d(r,e,n)-t)/i}return r}(t,o):0===l?o:function(t,r,a){var i,o,s=0;do{(i=d(o=r+(a-r)/2,e,n)-t)>0?a=o:r=o}while(Math.abs(i)>1e-7&&++s<10);return o}(t,r,r+a)}var p=!1;function g(){p=!0,e===t&&n===r||function(){for(var t=0;t<11;++t)s[t]=d(t*a,e,n)}()}var v=function(a){return p||g(),e===t&&n===r?a:0===a?0:1===a?1:d(f(a),t,r)};v.getControlPoints=function(){return[{x:e,y:t},{x:n,y:r}]};var y="generateBezier("+[e,t,n,r]+")";return v.toString=function(){return y},v} +/*! Runge-Kutta spring physics function generator. Adapted from Framer.js, copyright Koen Bok. MIT License: http://en.wikipedia.org/wiki/MIT_License */var Ul=function(){function e(e){return-e.tension*e.x-e.friction*e.v}function t(t,n,r){var a={x:t.x+r.dx*n,v:t.v+r.dv*n,tension:t.tension,friction:t.friction};return{dx:a.v,dv:e(a)}}function n(n,r){var a={dx:n.v,dv:e(n)},i=t(n,.5*r,a),o=t(n,.5*r,i),s=t(n,r,o),l=1/6*(a.dx+2*(i.dx+o.dx)+s.dx),u=1/6*(a.dv+2*(i.dv+o.dv)+s.dv);return n.x=n.x+l*r,n.v=n.v+u*r,n}return function e(t,r,a){var i,o,s,l={x:-1,v:0,tension:null,friction:null},u=[0],c=0,d=1e-4;for(t=parseFloat(t)||500,r=parseFloat(r)||20,a=a||null,l.tension=t,l.friction=r,o=(i=null!==a)?(c=e(t,r))/a*.016:.016;s=n(s||l,o),u.push(1+s.x),c+=16,Math.abs(s.x)>d&&Math.abs(s.v)>d;);return i?function(e){return u[e*(u.length-1)|0]}:c}}(),Hl=function(e,t,n,r){var a=Wl(e,t,n,r);return function(e,t,n){return e+(t-e)*a(n)}},Kl={linear:function(e,t,n){return e+(t-e)*n},ease:Hl(.25,.1,.25,1),"ease-in":Hl(.42,0,1,1),"ease-out":Hl(0,0,.58,1),"ease-in-out":Hl(.42,0,.58,1),"ease-in-sine":Hl(.47,0,.745,.715),"ease-out-sine":Hl(.39,.575,.565,1),"ease-in-out-sine":Hl(.445,.05,.55,.95),"ease-in-quad":Hl(.55,.085,.68,.53),"ease-out-quad":Hl(.25,.46,.45,.94),"ease-in-out-quad":Hl(.455,.03,.515,.955),"ease-in-cubic":Hl(.55,.055,.675,.19),"ease-out-cubic":Hl(.215,.61,.355,1),"ease-in-out-cubic":Hl(.645,.045,.355,1),"ease-in-quart":Hl(.895,.03,.685,.22),"ease-out-quart":Hl(.165,.84,.44,1),"ease-in-out-quart":Hl(.77,0,.175,1),"ease-in-quint":Hl(.755,.05,.855,.06),"ease-out-quint":Hl(.23,1,.32,1),"ease-in-out-quint":Hl(.86,0,.07,1),"ease-in-expo":Hl(.95,.05,.795,.035),"ease-out-expo":Hl(.19,1,.22,1),"ease-in-out-expo":Hl(1,0,0,1),"ease-in-circ":Hl(.6,.04,.98,.335),"ease-out-circ":Hl(.075,.82,.165,1),"ease-in-out-circ":Hl(.785,.135,.15,.86),spring:function(e,t,n){if(0===n)return Kl.linear;var r=Ul(e,t,n);return function(e,t,n){return e+(t-e)*r(n)}},"cubic-bezier":Hl};function Gl(e,t,n,r,a){if(1===r)return n;if(t===n)return n;var i=a(t,n,r);return null==e||((e.roundValue||e.color)&&(i=Math.round(i)),void 0!==e.min&&(i=Math.max(i,e.min)),void 0!==e.max&&(i=Math.min(i,e.max))),i}function Zl(e,t){return null!=e.pfValue||null!=e.value?null==e.pfValue||null!=t&&"%"===t.type.units?e.value:e.pfValue:e}function $l(e,t,n,r,a){var i=null!=a?a.type:null;n<0?n=0:n>1&&(n=1);var o=Zl(e,a),s=Zl(t,a);if(G(o)&&G(s))return Gl(i,o,s,n,r);if(H(o)&&H(s)){for(var l=[],u=0;u0?("spring"===d&&h.push(o.duration),o.easingImpl=Kl[d].apply(null,h)):o.easingImpl=Kl[d]}var f,p=o.easingImpl;if(f=0===o.duration?1:(n-l)/o.duration,o.applying&&(f=o.progress),f<0?f=0:f>1&&(f=1),null==o.delay){var g=o.startPosition,v=o.position;if(v&&a&&!e.locked()){var y={};Jl(g.x,v.x)&&(y.x=$l(g.x,v.x,f,p)),Jl(g.y,v.y)&&(y.y=$l(g.y,v.y,f,p)),e.position(y)}var m=o.startPan,b=o.pan,x=i.pan,w=null!=b&&r;w&&(Jl(m.x,b.x)&&(x.x=$l(m.x,b.x,f,p)),Jl(m.y,b.y)&&(x.y=$l(m.y,b.y,f,p)),e.emit("pan"));var E=o.startZoom,k=o.zoom,T=null!=k&&r;T&&(Jl(E,k)&&(i.zoom=en(i.minZoom,$l(E,k,f,p),i.maxZoom)),e.emit("zoom")),(w||T)&&e.emit("viewport");var C=o.style;if(C&&C.length>0&&a){for(var P=0;P=0;t--){(0,e[t])()}e.splice(0,e.length)},c=i.length-1;c>=0;c--){var d=i[c],h=d._private;h.stopped?(i.splice(c,1),h.hooked=!1,h.playing=!1,h.started=!1,u(h.frames)):(h.playing||h.applying)&&(h.playing&&h.applying&&(h.applying=!1),h.started||eu(0,d,e),Ql(t,d,e,n),h.applying&&(h.applying=!1),u(h.frames),null!=h.step&&h.step(e),d.completed()&&(i.splice(c,1),h.hooked=!1,h.playing=!1,h.started=!1,u(h.completes)),s=!0)}return n||0!==i.length||0!==o.length||r.push(t),s}for(var i=!1,o=0;o0?t.notify("draw",n):t.notify("draw")),n.unmerge(r),t.emit("step")}var nu={animate:Eo.animate(),animation:Eo.animation(),animated:Eo.animated(),clearQueue:Eo.clearQueue(),delay:Eo.delay(),delayAnimation:Eo.delayAnimation(),stop:Eo.stop(),addToAnimationPool:function(e){this.styleEnabled()&&this._private.aniEles.merge(e)},stopAnimationLoop:function(){this._private.animationsRunning=!1},startAnimationLoop:function(){var e=this;if(e._private.animationsRunning=!0,e.styleEnabled()){var t=e.renderer();t&&t.beforeRender?t.beforeRender((function(t,n){tu(n,e)}),t.beforeRenderPriorities.animations):function t(){e._private.animationsRunning&&Ne((function(n){tu(n,e),t()}))}()}}},ru={qualifierCompare:function(e,t){return null==e||null==t?null==e&&null==t:e.sameText(t)},eventMatches:function(e,t,n){var r=t.qualifier;return null==r||e!==n.target&&J(n.target)&&r.matches(n.target)},addEventFields:function(e,t){t.cy=e,t.target=e},callbackContext:function(e,t,n){return null!=t.qualifier?n.target:e}},au=function(e){return W(e)?new os(e):e},iu={createEmitter:function(){var e=this._private;return e.emitter||(e.emitter=new ol(ru,this)),this},emitter:function(){return this._private.emitter},on:function(e,t,n){return this.emitter().on(e,au(t),n),this},removeListener:function(e,t,n){return this.emitter().removeListener(e,au(t),n),this},removeAllListeners:function(){return this.emitter().removeAllListeners(),this},one:function(e,t,n){return this.emitter().one(e,au(t),n),this},once:function(e,t,n){return this.emitter().one(e,au(t),n),this},emit:function(e,t){return this.emitter().emit(e,t),this},emitAndNotify:function(e,t){return this.emit(e),this.notify(e,t),this}};Eo.eventAliasesOn(iu);var ou={png:function(e){return e=e||{},this._private.renderer.png(e)},jpg:function(e){var t=this._private.renderer;return(e=e||{}).bg=e.bg||"#fff",t.jpg(e)}};ou.jpeg=ou.jpg;var su={layout:function(e){var t=this;if(null!=e)if(null!=e.name){var n=e.name,r=t.extension("layout",n);if(null!=r){var a;a=W(e.eles)?t.$(e.eles):null!=e.eles?e.eles:t.$();var i=new r(ye({},e,{cy:t,eles:a}));return i}rt("No such layout `"+n+"` found. Did you forget to import it and `cytoscape.use()` it?")}else rt("A `name` must be specified to make a layout");else rt("Layout options must be specified to make a layout")}};su.createLayout=su.makeLayout=su.layout;var lu={notify:function(e,t){var n=this._private;if(this.batching()){n.batchNotifications=n.batchNotifications||{};var r=n.batchNotifications[e]=n.batchNotifications[e]||this.collection();null!=t&&r.merge(t)}else if(n.notificationsEnabled){var a=this.renderer();!this.destroyed()&&a&&a.notify(e,t)}},notifications:function(e){var t=this._private;return void 0===e?t.notificationsEnabled:(t.notificationsEnabled=!!e,this)},noNotifications:function(e){this.notifications(!1),e(),this.notifications(!0)},batching:function(){return this._private.batchCount>0},startBatch:function(){var e=this._private;return null==e.batchCount&&(e.batchCount=0),0===e.batchCount&&(e.batchStyleEles=this.collection(),e.batchNotifications={}),e.batchCount++,this},endBatch:function(){var e=this._private;if(0===e.batchCount)return this;if(e.batchCount--,0===e.batchCount){e.batchStyleEles.updateStyle();var t=this.renderer();Object.keys(e.batchNotifications).forEach((function(n){var r=e.batchNotifications[n];r.empty()?t.notify(n):t.notify(n,r)}))}return this},batch:function(e){return this.startBatch(),e(),this.endBatch(),this},batchData:function(e){var t=this;return this.batch((function(){for(var n=Object.keys(e),r=0;r0;)t.removeChild(t.childNodes[0]);e._private.renderer=null,e.mutableElements().forEach((function(e){var t=e._private;t.rscratch={},t.rstyle={},t.animation.current=[],t.animation.queue=[]}))},onRender:function(e){return this.on("render",e)},offRender:function(e){return this.off("render",e)}};cu.invalidateDimensions=cu.resize;var du={collection:function(e,t){return W(e)?this.$(e):Q(e)?e.collection():H(e)?(t||(t={}),new jl(this,e,t.unique,t.removed)):new jl(this)},nodes:function(e){var t=this.$((function(e){return e.isNode()}));return e?t.filter(e):t},edges:function(e){var t=this.$((function(e){return e.isEdge()}));return e?t.filter(e):t},$:function(e){var t=this._private.elements;return e?t.filter(e):t.spawnSelf()},mutableElements:function(){return this._private.elements}};du.elements=du.filter=du.$;var hu={},fu="t";hu.apply=function(e){for(var t=this,n=t._private.cy.collection(),r=0;r0;if(h||d&&f){var p=void 0;h&&f||h?p=u.properties:f&&(p=u.mappedProperties);for(var g=0;g1&&(v=1),s.color){var w=a.valueMin[0],E=a.valueMax[0],k=a.valueMin[1],T=a.valueMax[1],C=a.valueMin[2],P=a.valueMax[2],S=null==a.valueMin[3]?1:a.valueMin[3],B=null==a.valueMax[3]?1:a.valueMax[3],D=[Math.round(w+(E-w)*v),Math.round(k+(T-k)*v),Math.round(C+(P-C)*v),Math.round(S+(B-S)*v)];n={bypass:a.bypass,name:a.name,value:D,strValue:"rgb("+D[0]+", "+D[1]+", "+D[2]+")"}}else{if(!s.number)return!1;var _=a.valueMin+(a.valueMax-a.valueMin)*v;n=this.parse(a.name,_,a.bypass,h)}if(!n)return g(),!1;n.mapping=a,a=n;break;case o.data:for(var A=a.field.split("."),M=d.data,R=0;R0&&i>0){for(var s={},l=!1,u=0;u0?e.delayAnimation(o).play().promise().then(t):t()})).then((function(){return e.animation({style:s,duration:i,easing:e.pstyle("transition-timing-function").value,queue:!1}).play().promise()})).then((function(){n.removeBypasses(e,a),e.emitAndNotify("style"),r.transitioning=!1}))}else r.transitioning&&(this.removeBypasses(e,a),e.emitAndNotify("style"),r.transitioning=!1)},hu.checkTrigger=function(e,t,n,r,a,i){var o=this.properties[t],s=a(o);e.removed()||null!=s&&s(n,r,e)&&i(o)},hu.checkZOrderTrigger=function(e,t,n,r){var a=this;this.checkTrigger(e,t,n,r,(function(e){return e.triggersZOrder}),(function(){a._private.cy.notify("zorder",e)}))},hu.checkBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBounds}),(function(t){e.dirtyCompoundBoundsCache(),e.dirtyBoundingBoxCache()}))},hu.checkConnectedEdgesBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBoundsOfConnectedEdges}),(function(t){e.connectedEdges().forEach((function(e){e.dirtyBoundingBoxCache()}))}))},hu.checkParallelEdgesBoundsTrigger=function(e,t,n,r){this.checkTrigger(e,t,n,r,(function(e){return e.triggersBoundsOfParallelEdges}),(function(t){e.parallelEdges().forEach((function(e){e.dirtyBoundingBoxCache()}))}))},hu.checkTriggers=function(e,t,n,r){e.dirtyStyleCache(),this.checkZOrderTrigger(e,t,n,r),this.checkBoundsTrigger(e,t,n,r),this.checkConnectedEdgesBoundsTrigger(e,t,n,r),this.checkParallelEdgesBoundsTrigger(e,t,n,r)};var pu={applyBypass:function(e,t,n,r){var a=[];if("*"===t||"**"===t){if(void 0!==n)for(var i=0;it.length?i.substr(t.length):""}function s(){n=n.length>r.length?n.substr(r.length):""}for(i=i.replace(/[/][*](\s|.)+?[*][/]/g,"");;){if(i.match(/^\s*$/))break;var l=i.match(/^\s*((?:.|\s)+?)\s*\{((?:.|\s)+?)\}/);if(!l){it("Halting stylesheet parsing: String stylesheet contains more to parse but no selector and block found in: "+i);break}t=l[0];var u=l[1];if("core"!==u)if(new os(u).invalid){it("Skipping parsing of block: Invalid selector found in string stylesheet: "+u),o();continue}var c=l[2],d=!1;n=c;for(var h=[];;){if(n.match(/^\s*$/))break;var f=n.match(/^\s*(.+?)\s*:\s*(.+?)(?:\s*;|\s*$)/);if(!f){it("Skipping parsing of block: Invalid formatting of style property and value definitions found in:"+c),d=!0;break}r=f[0];var p=f[1],g=f[2];if(this.properties[p])a.parse(p,g)?(h.push({name:p,val:g}),s()):(it("Skipping property: Invalid property definition in: "+r),s());else it("Skipping property: Invalid property name in: "+r),s()}if(d){o();break}a.selector(u);for(var v=0;v=7&&"d"===t[0]&&(u=new RegExp(s.data.regex).exec(t))){if(n)return!1;var h=s.data;return{name:e,value:u,strValue:""+t,mapped:h,field:u[1],bypass:n}}if(t.length>=10&&"m"===t[0]&&(c=new RegExp(s.mapData.regex).exec(t))){if(n)return!1;if(d.multiple)return!1;var f=s.mapData;if(!d.color&&!d.number)return!1;var p=this.parse(e,c[4]);if(!p||p.mapped)return!1;var g=this.parse(e,c[5]);if(!g||g.mapped)return!1;if(p.pfValue===g.pfValue||p.strValue===g.strValue)return it("`"+e+": "+t+"` is not a valid mapper because the output range is zero; converting to `"+e+": "+p.strValue+"`"),this.parse(e,p.strValue);if(d.color){var v=p.value,y=g.value;if(!(v[0]!==y[0]||v[1]!==y[1]||v[2]!==y[2]||v[3]!==y[3]&&(null!=v[3]&&1!==v[3]||null!=y[3]&&1!==y[3])))return!1}return{name:e,value:c,strValue:""+t,mapped:f,field:c[1],fieldMin:parseFloat(c[2]),fieldMax:parseFloat(c[3]),valueMin:p.value,valueMax:g.value,bypass:n}}}if(d.multiple&&"multiple"!==r){var m;if(m=l?t.split(/\s+/):H(t)?t:[t],d.evenMultiple&&m.length%2!=0)return null;for(var b=[],x=[],w=[],E="",k=!1,T=0;T0?" ":"")+C.strValue}return d.validate&&!d.validate(b,x)?null:d.singleEnum&&k?1===b.length&&W(b[0])?{name:e,value:b[0],strValue:b[0],bypass:n}:null:{name:e,value:b,pfValue:w,strValue:E,bypass:n,units:x}}var P,S=function(){for(var r=0;rd.max||d.strictMax&&t===d.max))return null;var M={name:e,value:t,strValue:""+t+(B||""),units:B,bypass:n};return d.unitless||"px"!==B&&"em"!==B?M.pfValue=t:M.pfValue="px"!==B&&B?this.getEmSizeInPixels()*t:t,"ms"!==B&&"s"!==B||(M.pfValue="ms"===B?t:1e3*t),"deg"!==B&&"rad"!==B||(M.pfValue="rad"===B?t:(P=t,Math.PI*P/180)),"%"===B&&(M.pfValue=t/100),M}if(d.propList){var R=[],I=""+t;if("none"===I);else{for(var N=I.split(/\s*,\s*|\s+/),L=0;L0&&l>0&&!isNaN(n.w)&&!isNaN(n.h)&&n.w>0&&n.h>0)return{zoom:o=(o=(o=Math.min((s-2*t)/n.w,(l-2*t)/n.h))>this._private.maxZoom?this._private.maxZoom:o)=n.minZoom&&(n.maxZoom=t),this},minZoom:function(e){return void 0===e?this._private.minZoom:this.zoomRange({min:e})},maxZoom:function(e){return void 0===e?this._private.maxZoom:this.zoomRange({max:e})},getZoomedViewport:function(e){var t,n,r=this._private,a=r.pan,i=r.zoom,o=!1;if(r.zoomingEnabled||(o=!0),G(e)?n=e:K(e)&&(n=e.level,null!=e.position?t=jt(e.position,i,a):null!=e.renderedPosition&&(t=e.renderedPosition),null==t||r.panningEnabled||(o=!0)),n=(n=n>r.maxZoom?r.maxZoom:n)t.maxZoom||!t.zoomingEnabled?i=!0:(t.zoom=s,a.push("zoom"))}if(r&&(!i||!e.cancelOnFailedZoom)&&t.panningEnabled){var l=e.pan;G(l.x)&&(t.pan.x=l.x,o=!1),G(l.y)&&(t.pan.y=l.y,o=!1),o||a.push("pan")}return a.length>0&&(a.push("viewport"),this.emit(a.join(" ")),this.notify("viewport")),this},center:function(e){var t=this.getCenterPan(e);return t&&(this._private.pan=t,this.emit("pan viewport"),this.notify("viewport")),this},getCenterPan:function(e,t){if(this._private.panningEnabled){if(W(e)){var n=e;e=this.mutableElements().filter(n)}else Q(e)||(e=this.mutableElements());if(0!==e.length){var r=e.boundingBox(),a=this.width(),i=this.height();return{x:(a-(t=void 0===t?this._private.zoom:t)*(r.x1+r.x2))/2,y:(i-t*(r.y1+r.y2))/2}}}},reset:function(){return this._private.panningEnabled&&this._private.zoomingEnabled?(this.viewport({pan:{x:0,y:0},zoom:1}),this):this},invalidateSize:function(){this._private.sizeCache=null},size:function(){var e,t,n=this._private,r=n.container,a=this;return n.sizeCache=n.sizeCache||(r?(e=a.window().getComputedStyle(r),t=function(t){return parseFloat(e.getPropertyValue(t))},{width:r.clientWidth-t("padding-left")-t("padding-right"),height:r.clientHeight-t("padding-top")-t("padding-bottom")}):{width:1,height:1})},width:function(){return this.size().width},height:function(){return this.size().height},extent:function(){var e=this._private.pan,t=this._private.zoom,n=this.renderedExtent(),r={x1:(n.x1-e.x)/t,x2:(n.x2-e.x)/t,y1:(n.y1-e.y)/t,y2:(n.y2-e.y)/t};return r.w=r.x2-r.x1,r.h=r.y2-r.y1,r},renderedExtent:function(){var e=this.width(),t=this.height();return{x1:0,y1:0,x2:e,y2:t,w:e,h:t}},multiClickDebounceTime:function(e){return e?(this._private.multiClickDebounceTime=e,this):this._private.multiClickDebounceTime}};Tu.centre=Tu.center,Tu.autolockNodes=Tu.autolock,Tu.autoungrabifyNodes=Tu.autoungrabify;var Cu={data:Eo.data({field:"data",bindingEvent:"data",allowBinding:!0,allowSetting:!0,settingEvent:"data",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeData:Eo.removeData({field:"data",event:"data",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0}),scratch:Eo.data({field:"scratch",bindingEvent:"scratch",allowBinding:!0,allowSetting:!0,settingEvent:"scratch",settingTriggersEvent:!0,triggerFnName:"trigger",allowGetting:!0,updateStyle:!0}),removeScratch:Eo.removeData({field:"scratch",event:"scratch",triggerFnName:"trigger",triggerEvent:!0,updateStyle:!0})};Cu.attr=Cu.data,Cu.removeAttr=Cu.removeData;var Pu=function(e){var t=this,n=(e=ye({},e)).container;n&&!$(n)&&$(n[0])&&(n=n[0]);var r=n?n._cyreg:null;(r=r||{})&&r.cy&&(r.cy.destroy(),r={});var a=r.readies=r.readies||[];n&&(n._cyreg=r),r.cy=t;var i=void 0!==c&&void 0!==n&&!e.headless,o=e;o.layout=ye({name:i?"grid":"null"},o.layout),o.renderer=ye({name:i?"canvas":"null"},o.renderer);var s=function(e,t,n){return void 0!==t?t:void 0!==n?n:e},l=this._private={container:n,ready:!1,options:o,elements:new jl(this),listeners:[],aniEles:new jl(this),data:o.data||{},scratch:{},layout:null,renderer:null,destroyed:!1,notificationsEnabled:!0,minZoom:1e-50,maxZoom:1e50,zoomingEnabled:s(!0,o.zoomingEnabled),userZoomingEnabled:s(!0,o.userZoomingEnabled),panningEnabled:s(!0,o.panningEnabled),userPanningEnabled:s(!0,o.userPanningEnabled),boxSelectionEnabled:s(!0,o.boxSelectionEnabled),autolock:s(!1,o.autolock,o.autolockNodes),autoungrabify:s(!1,o.autoungrabify,o.autoungrabifyNodes),autounselectify:s(!1,o.autounselectify),styleEnabled:void 0===o.styleEnabled?i:o.styleEnabled,zoom:G(o.zoom)?o.zoom:1,pan:{x:K(o.pan)&&G(o.pan.x)?o.pan.x:0,y:K(o.pan)&&G(o.pan.y)?o.pan.y:0},animation:{current:[],queue:[]},hasCompoundNodes:!1,multiClickDebounceTime:s(250,o.multiClickDebounceTime)};this.createEmitter(),this.selectionType(o.selectionType),this.zoomRange({min:o.minZoom,max:o.maxZoom});l.styleEnabled&&t.setStyle([]);var u=ye({},o,o.renderer);t.initRenderer(u);!function(e,t){if(e.some(ae))return Gr.all(e).then(t);t(e)}([o.style,o.elements],(function(e){var n=e[0],i=e[1];l.styleEnabled&&t.style().append(n),function(e,n,r){t.notifications(!1);var a=t.mutableElements();a.length>0&&a.remove(),null!=e&&(K(e)||H(e))&&t.add(e),t.one("layoutready",(function(e){t.notifications(!0),t.emit(e),t.one("load",n),t.emitAndNotify("load")})).one("layoutstop",(function(){t.one("done",r),t.emit("done")}));var i=ye({},t._private.options.layout);i.eles=t.elements(),t.layout(i).run()}(i,(function(){t.startAnimationLoop(),l.ready=!0,U(o.ready)&&t.on("ready",o.ready);for(var e=0;e0,l=!!t.boundingBox,u=tn(l?t.boundingBox:structuredClone(n.extent()));if(Q(t.roots))e=t.roots;else if(H(t.roots)){for(var c=[],d=0;d0;){var B=C.shift(),D=T(B,P);if(D)B.outgoers().filter((function(e){return e.isNode()&&r.has(e)})).forEach(S);else if(null===D){it("Detected double maximal shift for node `"+B.id()+"`. Bailing maximal adjustment due to cycle. Use `options.maximal: true` only on DAGs.");break}}}var _=0;if(t.avoidOverlap)for(var A=0;A0&&y[0].length<=3?i/2:0),s=2*Math.PI/y[r].length*a;return 0===r&&1===y[0].length&&(o=1),{x:q+o*Math.cos(s),y:U+o*Math.sin(s)}}var c=y[r].length,d=Math.max(1===c?0:l?(u.w-2*t.padding-K.w)/((t.grid?Z:c)-1):(u.w-2*t.padding-K.w)/((t.grid?Z:c)+1),_);return{x:q+(a+1-(c+1)/2)*d,y:U+(r+1-(O+1)/2)*G}}(e),u,$[t.direction])})),this};var Ru={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,radius:void 0,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function Iu(e){this.options=ye({},Ru,e)}Iu.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,a=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,i=r.nodes().not(":parent");t.sort&&(i=i.sort(t.sort));for(var o,s=tn(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()}),l=s.x1+s.w/2,u=s.y1+s.h/2,c=(void 0===t.sweep?2*Math.PI-2*Math.PI/i.length:t.sweep)/Math.max(1,i.length-1),d=0,h=0;h1&&t.avoidOverlap){d*=1.75;var v=Math.cos(c)-Math.cos(0),y=Math.sin(c)-Math.sin(0),m=Math.sqrt(d*d/(v*v+y*y));o=Math.max(m,o)}return r.nodes().layoutPositions(this,t,(function(e,n){var r=t.startAngle+n*c*(a?1:-1),i=o*Math.cos(r),s=o*Math.sin(r);return{x:l+i,y:u+s}})),this};var Nu,Lu={fit:!0,padding:30,startAngle:1.5*Math.PI,sweep:void 0,clockwise:!0,equidistant:!1,minNodeSpacing:10,boundingBox:void 0,avoidOverlap:!0,nodeDimensionsIncludeLabels:!1,height:void 0,width:void 0,spacingFactor:void 0,concentric:function(e){return e.degree()},levelWidth:function(e){return e.maxDegree()/4},animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function zu(e){this.options=ye({},Lu,e)}zu.prototype.run=function(){for(var e=this.options,t=e,n=void 0!==t.counterclockwise?!t.counterclockwise:t.clockwise,r=e.cy,a=t.eles,i=a.nodes().not(":parent"),o=tn(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:r.width(),h:r.height()}),s=o.x1+o.w/2,l=o.y1+o.h/2,u=[],c=0,d=0;d0)Math.abs(m[0].value-x.value)>=v&&(m=[],y.push(m));m.push(x)}var w=c+t.minNodeSpacing;if(!t.avoidOverlap){var E=y.length>0&&y[0].length>1,k=(Math.min(o.w,o.h)/2-w)/(y.length+E?1:0);w=Math.min(w,k)}for(var T=0,C=0;C1&&t.avoidOverlap){var D=Math.cos(B)-Math.cos(0),_=Math.sin(B)-Math.sin(0),A=Math.sqrt(w*w/(D*D+_*_));T=Math.max(A,T)}P.r=T,T+=w}if(t.equidistant){for(var M=0,R=0,I=0;I=e.numIter)&&(Uu(r,e),r.temperature=r.temperature*e.coolingFactor,!(r.temperature=e.animationThreshold&&i(),Ne(c)):(ac(r,e),s())};c()}else{for(;u;)u=o(l),l++;ac(r,e),s()}return this},Vu.prototype.stop=function(){return this.stopped=!0,this.thread&&this.thread.stop(),this.emit("layoutstop"),this},Vu.prototype.destroy=function(){return this.thread&&this.thread.stop(),this};var Fu=function(e,t,n){for(var r=n.eles.edges(),a=n.eles.nodes(),i=tn(n.boundingBox?n.boundingBox:{x1:0,y1:0,w:e.width(),h:e.height()}),o={isCompound:e.hasCompoundNodes(),layoutNodes:[],idToIndex:{},nodeSize:a.size(),graphSet:[],indexToGraph:[],layoutEdges:[],edgeSize:r.size(),temperature:n.initialTemp,clientWidth:i.w,clientHeight:i.h,boundingBox:i},s=n.eles.components(),l={},u=0;u0){o.graphSet.push(w);for(u=0;ur.count?0:r.graph},ju=function(e,t,n,r){var a=r.graphSet[n];if(-10)var s=(u=r.nodeOverlap*o)*a/(g=Math.sqrt(a*a+i*i)),l=u*i/g;else{var u,c=$u(e,a,i),d=$u(t,-1*a,-1*i),h=d.x-c.x,f=d.y-c.y,p=h*h+f*f,g=Math.sqrt(p);s=(u=(e.nodeRepulsion+t.nodeRepulsion)/p)*h/g,l=u*f/g}e.isLocked||(e.offsetX-=s,e.offsetY-=l),t.isLocked||(t.offsetX+=s,t.offsetY+=l)}},Zu=function(e,t,n,r){if(n>0)var a=e.maxX-t.minX;else a=t.maxX-e.minX;if(r>0)var i=e.maxY-t.minY;else i=t.maxY-e.minY;return a>=0&&i>=0?Math.sqrt(a*a+i*i):0},$u=function(e,t,n){var r=e.positionX,a=e.positionY,i=e.height||1,o=e.width||1,s=n/t,l=i/o,u={};return 0===t&&0n?(u.x=r,u.y=a+i/2,u):0t&&-1*l<=s&&s<=l?(u.x=r-o/2,u.y=a-o*n/2/t,u):0=l)?(u.x=r+i*t/2/n,u.y=a+i/2,u):0>n&&(s<=-1*l||s>=l)?(u.x=r-i*t/2/n,u.y=a-i/2,u):u},Qu=function(e,t){for(var n=0;n1){var p=t.gravity*d/f,g=t.gravity*h/f;c.offsetX+=p,c.offsetY+=g}}}}},ec=function(e,t){var n=[],r=0,a=-1;for(n.push.apply(n,e.graphSet[0]),a+=e.graphSet[0].length;r<=a;){var i=n[r++],o=e.idToIndex[i],s=e.layoutNodes[o],l=s.children;if(0n)var a={x:n*e/r,y:n*t/r};else a={x:e,y:t};return a},rc=function(e,t){var n=e.parentId;if(null!=n){var r=t.layoutNodes[t.idToIndex[n]],a=!1;return(null==r.maxX||e.maxX+r.padRight>r.maxX)&&(r.maxX=e.maxX+r.padRight,a=!0),(null==r.minX||e.minX-r.padLeftr.maxY)&&(r.maxY=e.maxY+r.padBottom,a=!0),(null==r.minY||e.minY-r.padTopp&&(d+=f+t.componentSpacing,c=0,h=0,f=0)}}},ic={fit:!0,padding:30,boundingBox:void 0,avoidOverlap:!0,avoidOverlapPadding:10,nodeDimensionsIncludeLabels:!1,spacingFactor:void 0,condense:!1,rows:void 0,cols:void 0,position:function(e){},sort:void 0,animate:!1,animationDuration:500,animationEasing:void 0,animateFilter:function(e,t){return!0},ready:void 0,stop:void 0,transform:function(e,t){return t}};function oc(e){this.options=ye({},ic,e)}oc.prototype.run=function(){var e=this.options,t=e,n=e.cy,r=t.eles,a=r.nodes().not(":parent");t.sort&&(a=a.sort(t.sort));var i=tn(t.boundingBox?t.boundingBox:{x1:0,y1:0,w:n.width(),h:n.height()});if(0===i.h||0===i.w)r.nodes().layoutPositions(this,t,(function(e){return{x:i.x1,y:i.y1}}));else{var o=a.size(),s=Math.sqrt(o*i.h/i.w),l=Math.round(s),u=Math.round(i.w/i.h*s),c=function(e){if(null==e)return Math.min(l,u);Math.min(l,u)==l?l=e:u=e},d=function(e){if(null==e)return Math.max(l,u);Math.max(l,u)==l?l=e:u=e},h=t.rows,f=null!=t.cols?t.cols:t.columns;if(null!=h&&null!=f)l=h,u=f;else if(null!=h&&null==f)l=h,u=Math.ceil(o/l);else if(null==h&&null!=f)u=f,l=Math.ceil(o/u);else if(u*l>o){var p=c(),g=d();(p-1)*g>=o?c(p-1):(g-1)*p>=o&&d(g-1)}else for(;u*l=o?d(y+1):c(v+1)}var m=i.w/u,b=i.h/l;if(t.condense&&(m=0,b=0),t.avoidOverlap)for(var x=0;x=u&&(A=0,_++)},R={},I=0;I(r=yn(e,t,x[w],x[w+1],x[w+2],x[w+3])))return v(n,r),!0}else if("bezier"===i.edgeType||"multibezier"===i.edgeType||"self"===i.edgeType||"compound"===i.edgeType)for(x=i.allpts,w=0;w+5(r=vn(e,t,x[w],x[w+1],x[w+2],x[w+3],x[w+4],x[w+5])))return v(n,r),!0;m=m||a.source,b=b||a.target;var E=o.getArrowWidth(l,c),k=[{name:"source",x:i.arrowStartX,y:i.arrowStartY,angle:i.srcArrowAngle},{name:"target",x:i.arrowEndX,y:i.arrowEndY,angle:i.tgtArrowAngle},{name:"mid-source",x:i.midX,y:i.midY,angle:i.midsrcArrowAngle},{name:"mid-target",x:i.midX,y:i.midY,angle:i.midtgtArrowAngle}];for(w=0;w0&&(y(m),y(b))}function b(e,t,n){return ft(e,t,n)}function x(n,r){var a,i=n._private,o=p;a=r?r+"-":"",n.boundingBox();var s=i.labelBounds[r||"main"],l=n.pstyle(a+"label").value;if("yes"===n.pstyle("text-events").strValue&&l){var u=b(i.rscratch,"labelX",r),c=b(i.rscratch,"labelY",r),d=b(i.rscratch,"labelAngle",r),h=n.pstyle(a+"text-margin-x").pfValue,f=n.pstyle(a+"text-margin-y").pfValue,g=s.x1-o-h,y=s.x2+o-h,m=s.y1-o-f,x=s.y2+o-f;if(d){var w=Math.cos(d),E=Math.sin(d),k=function(e,t){return{x:(e-=u)*w-(t-=c)*E+u,y:e*E+t*w+c}},T=k(g,m),C=k(g,x),P=k(y,m),S=k(y,x),B=[T.x+h,T.y+f,P.x+h,P.y+f,S.x+h,S.y+f,C.x+h,C.y+f];if(mn(e,t,B))return v(n),!0}else if(ln(s,e,t))return v(n),!0}}n&&(l=l.interactive);for(var w=l.length-1;w>=0;w--){var E=l[w];E.isNode()?y(E)||x(E):m(E)||x(E)||x(E,"source")||x(E,"target")}return u},getAllInBox:function(e,t,n,r){var a=this.getCachedZSortedEles().interactive,o=2/this.cy.zoom(),s=[],l=Math.min(e,n),u=Math.max(e,n),c=Math.min(t,r),d=Math.max(t,r),h=tn({x1:e=l,y1:t=c,x2:n=u,y2:r=d}),f=[{x:h.x1,y:h.y1},{x:h.x2,y:h.y1},{x:h.x2,y:h.y2},{x:h.x1,y:h.y2}],p=[[f[0],f[1]],[f[1],f[2]],[f[2],f[3]],[f[3],f[0]]];function g(e,t,n){return ft(e,t,n)}function v(e,t){var n=e._private,r=o;e.boundingBox();var a=n.labelBounds.main;if(!a)return null;var i=g(n.rscratch,"labelX",t),s=g(n.rscratch,"labelY",t),l=g(n.rscratch,"labelAngle",t),u=e.pstyle("text-margin-x").pfValue,c=e.pstyle("text-margin-y").pfValue,d=a.x1-r-u,h=a.x2+r-u,f=a.y1-r-c,p=a.y2+r-c;if(l){var v=Math.cos(l),y=Math.sin(l),m=function(e,t){return{x:(e-=i)*v-(t-=s)*y+i,y:e*y+t*v+s}};return[m(d,f),m(h,f),m(h,p),m(d,p)]}return[{x:d,y:f},{x:h,y:f},{x:h,y:p},{x:d,y:p}]}function y(e,t,n,r){function a(e,t,n){return(n.y-e.y)*(t.x-e.x)>(t.y-e.y)*(n.x-e.x)}return a(e,n,r)!==a(t,n,r)&&a(e,t,n)!==a(e,t,r)}for(var m=0;m0?-(Math.PI-i.ang):Math.PI+i.ang),Vc(t,n,Oc),Ec=zc.nx*Oc.ny-zc.ny*Oc.nx,kc=zc.nx*Oc.nx-zc.ny*-Oc.ny,Pc=Math.asin(Math.max(-1,Math.min(1,Ec))),Math.abs(Pc)<1e-6)return xc=t.x,wc=t.y,void(Bc=_c=0);Tc=1,Cc=!1,kc<0?Pc<0?Pc=Math.PI+Pc:(Pc=Math.PI-Pc,Tc=-1,Cc=!0):Pc>0&&(Tc=-1,Cc=!0),_c=void 0!==t.radius?t.radius:r,Sc=Pc/2,Ac=Math.min(zc.len/2,Oc.len/2),a?(Dc=Math.abs(Math.cos(Sc)*_c/Math.sin(Sc)))>Ac?(Dc=Ac,Bc=Math.abs(Dc*Math.sin(Sc)/Math.cos(Sc))):Bc=_c:(Dc=Math.min(Ac,_c),Bc=Math.abs(Dc*Math.sin(Sc)/Math.cos(Sc))),Ic=t.x+Oc.nx*Dc,Nc=t.y+Oc.ny*Dc,xc=Ic-Oc.ny*Bc*Tc,wc=Nc+Oc.nx*Bc*Tc,Mc=t.x+zc.nx*Dc,Rc=t.y+zc.ny*Dc,Lc=t};function Xc(e,t){0===t.radius?e.lineTo(t.cx,t.cy):e.arc(t.cx,t.cy,t.radius,t.startAngle,t.endAngle,t.counterClockwise)}function jc(e,t,n,r){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4];return 0===r||0===t.radius?{cx:t.x,cy:t.y,radius:0,startX:t.x,startY:t.y,stopX:t.x,stopY:t.y,startAngle:void 0,endAngle:void 0,counterClockwise:void 0}:(Fc(e,t,n,r,a),{cx:xc,cy:wc,radius:Bc,startX:Mc,startY:Rc,stopX:Ic,stopY:Nc,startAngle:zc.ang+Math.PI/2*Tc,endAngle:Oc.ang-Math.PI/2*Tc,counterClockwise:Cc})}var Yc=.01,qc=Math.sqrt(.02),Wc={};function Uc(e){var t=[];if(null!=e){for(var n=0;n0?Math.max(e-t,0):Math.min(e+t,0)},S=P(T,E),B=P(C,k),D=!1;"auto"===v?g=Math.abs(S)>Math.abs(B)?a:r:v===l||v===s?(g=r,D=!0):v!==i&&v!==o||(g=a,D=!0);var _,A=g===r,M=A?B:S,R=A?C:T,I=Kt(R),N=!1;(D&&(m||x)||!(v===s&&R<0||v===l&&R>0||v===i&&R>0||v===o&&R<0)||(M=(I*=-1)*Math.abs(M),N=!0),m)?_=(b<0?1+b:b)*M:_=(b<0?M:0)+b*I;var L=function(e){return Math.abs(e)=Math.abs(M)},z=L(_),O=L(Math.abs(M)-Math.abs(_));if((z||O)&&!N)if(A){var V=Math.abs(R)<=d/2,F=Math.abs(T)<=h/2;if(V){var X=(u.x1+u.x2)/2,j=u.y1,Y=u.y2;n.segpts=[X,j,X,Y]}else if(F){var q=(u.y1+u.y2)/2,W=u.x1,U=u.x2;n.segpts=[W,q,U,q]}else n.segpts=[u.x1,u.y2]}else{var H=Math.abs(R)<=c/2,K=Math.abs(C)<=f/2;if(H){var G=(u.y1+u.y2)/2,Z=u.x1,$=u.x2;n.segpts=[Z,G,$,G]}else if(K){var Q=(u.x1+u.x2)/2,J=u.y1,ee=u.y2;n.segpts=[Q,J,Q,ee]}else n.segpts=[u.x2,u.y1]}else if(A){var te=u.y1+_+(p?d/2*I:0),ne=u.x1,re=u.x2;n.segpts=[ne,te,re,te]}else{var ae=u.x1+_+(p?c/2*I:0),ie=u.y1,oe=u.y2;n.segpts=[ae,ie,ae,oe]}if(n.isRound){var se=e.pstyle("taxi-radius").value,le="arc-radius"===e.pstyle("radius-type").value[0];n.radii=new Array(n.segpts.length/2).fill(se),n.isArcRadius=new Array(n.segpts.length/2).fill(le)}},Wc.tryToCorrectInvalidPoints=function(e,t){var n=e._private.rscratch;if("bezier"===n.edgeType){var r=t.srcPos,a=t.tgtPos,i=t.srcW,o=t.srcH,s=t.tgtW,l=t.tgtH,u=t.srcShape,c=t.tgtShape,d=t.srcCornerRadius,h=t.tgtCornerRadius,f=t.srcRs,p=t.tgtRs,g=!G(n.startX)||!G(n.startY),v=!G(n.arrowStartX)||!G(n.arrowStartY),y=!G(n.endX)||!G(n.endY),m=!G(n.arrowEndX)||!G(n.arrowEndY),b=3*(this.getArrowWidth(e.pstyle("width").pfValue,e.pstyle("arrow-scale").value)*this.arrowShapeWidth),x=Gt({x:n.ctrlpts[0],y:n.ctrlpts[1]},{x:n.startX,y:n.startY}),w=xg.poolIndex()){var v=p;p=g,g=v}var y=d.srcPos=p.position(),m=d.tgtPos=g.position(),b=d.srcW=p.outerWidth(),x=d.srcH=p.outerHeight(),E=d.tgtW=g.outerWidth(),k=d.tgtH=g.outerHeight(),T=d.srcShape=n.nodeShapes[t.getNodeShape(p)],C=d.tgtShape=n.nodeShapes[t.getNodeShape(g)],P=d.srcCornerRadius="auto"===p.pstyle("corner-radius").value?"auto":p.pstyle("corner-radius").pfValue,S=d.tgtCornerRadius="auto"===g.pstyle("corner-radius").value?"auto":g.pstyle("corner-radius").pfValue,B=d.tgtRs=g._private.rscratch,D=d.srcRs=p._private.rscratch;d.dirCounts={north:0,west:0,south:0,east:0,northwest:0,southwest:0,northeast:0,southeast:0};for(var _=0;_=qc||(q=Math.sqrt(Math.max(Y*Y,Yc)+Math.max(j*j,Yc)));var W=d.vector={x:Y,y:j},U=d.vectorNorm={x:W.x/q,y:W.y/q},H={x:-U.y,y:U.x};d.nodesOverlap=!G(q)||C.checkPoint(L[0],L[1],0,E,k,m.x,m.y,S,B)||T.checkPoint(O[0],O[1],0,b,x,y.x,y.y,P,D),d.vectorNormInverse=H,e={nodesOverlap:d.nodesOverlap,dirCounts:d.dirCounts,calculatedIntersection:!0,hasBezier:d.hasBezier,hasUnbundled:d.hasUnbundled,eles:d.eles,srcPos:m,srcRs:B,tgtPos:y,tgtRs:D,srcW:E,srcH:k,tgtW:b,tgtH:x,srcIntn:V,tgtIntn:z,srcShape:C,tgtShape:T,posPts:{x1:X.x2,y1:X.y2,x2:X.x1,y2:X.y1},intersectionPts:{x1:F.x2,y1:F.y2,x2:F.x1,y2:F.y1},vector:{x:-W.x,y:-W.y},vectorNorm:{x:-U.x,y:-U.y},vectorNormInverse:{x:-H.x,y:-H.y}}}var K=N?e:d;M.nodesOverlap=K.nodesOverlap,M.srcIntn=K.srcIntn,M.tgtIntn=K.tgtIntn,M.isRound=R.startsWith("round"),r&&(p.isParent()||p.isChild()||g.isParent()||g.isChild())&&(p.parents().anySame(g)||g.parents().anySame(p)||p.same(g)&&p.isParent())?t.findCompoundLoopPoints(A,K,_,I):p===g?t.findLoopPoints(A,K,_,I):R.endsWith("segments")?t.findSegmentsPoints(A,K):R.endsWith("taxi")?t.findTaxiPoints(A,K):"straight"===R||!I&&d.eles.length%2==1&&_===Math.floor(d.eles.length/2)?t.findStraightEdgePoints(A):t.findBezierPoints(A,K,_,I,N),t.findEndpoints(A),t.tryToCorrectInvalidPoints(A,K),t.checkForInvalidEdgeWarning(A),t.storeAllpts(A),t.storeEdgeProjections(A),t.calculateArrowAngles(A),t.recalculateEdgeLabelProjections(A),t.calculateLabelAngles(A)}},w=0;w0){var J=f,ee=Zt(J,qt(i)),te=Zt(J,qt(Q)),ne=ee;if(te2)Zt(J,{x:Q[2],y:Q[3]})0){var ve=p,ye=Zt(ve,qt(i)),me=Zt(ve,qt(ge)),be=ye;if(me2)Zt(ve,{x:ge[2],y:ge[3]})=u||m){c={cp:g,segment:y};break}}if(c)break}var b=c.cp,x=c.segment,w=(u-h)/x.length,E=x.t1-x.t0,k=s?x.t0+E*w:x.t1-E*w;k=en(0,k,1),t=Jt(b.p0,b.p1,b.p2,k),a=function(e,t,n,r){var a=en(0,r-.001,1),i=en(0,r+.001,1),o=Jt(e,t,n,a),s=Jt(e,t,n,i);return Qc(o,s)}(b.p0,b.p1,b.p2,k);break;case"straight":case"segments":case"haystack":for(var T,C,P,S,B=0,D=r.allpts.length,_=0;_+3=u));_+=2);var A=(u-C)/T;A=en(0,A,1),t=function(e,t,n,r){var a=t.x-e.x,i=t.y-e.y,o=Gt(e,t),s=a/o,l=i/o;return n=null==n?0:n,r=null!=r?r:n*o,{x:e.x+s*r,y:e.y+l*r}}(P,S,A),a=Qc(P,S)}o("labelX",n,t.x),o("labelY",n,t.y),o("labelAutoAngle",n,a)}};u("source"),u("target"),this.applyLabelDimensions(e)}},Zc.applyLabelDimensions=function(e){this.applyPrefixedLabelDimensions(e),e.isEdge()&&(this.applyPrefixedLabelDimensions(e,"source"),this.applyPrefixedLabelDimensions(e,"target"))},Zc.applyPrefixedLabelDimensions=function(e,t){var n=e._private,r=this.getLabelText(e,t),a=We(r,e._private.labelDimsKey);if(ft(n.rscratch,"prefixedLabelDimsKey",t)!==a){pt(n.rscratch,"prefixedLabelDimsKey",t,a);var i=this.calculateLabelDimensions(e,r),o=e.pstyle("line-height").pfValue,s=e.pstyle("font-size").pfValue,l=e.pstyle("text-wrap").strValue,u=ft(n.rscratch,"labelWrapCachedLines",t)||[],c="wrap"!==l?1:Math.max(u.length,1),d=s*o,h=i.width,f=i.height+(c-1)*(o-1)*s;pt(n.rstyle,"labelWidth",t,h),pt(n.rscratch,"labelWidth",t,h),pt(n.rstyle,"labelHeight",t,f),pt(n.rscratch,"labelHeight",t,f),pt(n.rscratch,"labelLineHeight",t,d),pt(n.rscratch,"labelActualDescent",t,i.labelActualDescent)}},Zc.getLabelText=function(e,t){var n=e._private,a=t?t+"-":"",i=e.pstyle(a+"label").strValue,o=e.pstyle("text-transform").value,s=function(e,r){return r?(pt(n.rscratch,e,t,r),r):ft(n.rscratch,e,t)};if(!i)return"";"none"==o||("uppercase"==o?i=i.toUpperCase():"lowercase"==o&&(i=i.toLowerCase()));var l=e.pstyle("text-wrap").value;if("wrap"===l){var u=s("labelKey");if(null!=u&&s("labelWrapKey")===u)return s("labelWrapCachedText");for(var c=i.split("\n"),d=e.pstyle("text-max-width").pfValue,h="anywhere"===e.pstyle("text-overflow-wrap").value,f=[],p=/[\s\u200b]+|$/g,g=0;gd){var b,x="",w=0,E=r(v.matchAll(p));try{for(E.s();!(b=E.n()).done;){var k=b.value,T=k[0],C=v.substring(w,k.index);w=k.index+T.length;var P=0===x.length?C:x+C+T;this.calculateLabelDimensions(e,P).width<=d?x+=C+T:(x&&f.push(x),x=C+T)}}catch(e){E.e(e)}finally{E.f()}x.match(/^[\s\u200b]+$/)||f.push(x)}else f.push(v)}s("labelWrapCachedLines",f),i=s("labelWrapCachedText",f.join("\n")),s("labelWrapKey",u)}else if("ellipsis"===l){var S=e.pstyle("text-max-width").pfValue,B="",D=!1;if(this.calculateLabelDimensions(e,i).widthS)break;B+=i[_],_===i.length-1&&(D=!0)}return D||(B+="…"),B}return i},Zc.getLabelJustification=function(e){var t=e.pstyle("text-justification").strValue,n=e.pstyle("text-halign").strValue;return"auto"===t?e.isNode()?function(e){switch(e){case"left":case"right-inside":return"right";case"right":case"left-inside":return"left";default:return"center"}}(n):"center":t},Zc.calculateLabelDimensions=function(e,t){var n=this.cy.window().document,r=e.pstyle("font-style").strValue,a=e.pstyle("font-size").pfValue,i=e.pstyle("font-family").strValue,o=e.pstyle("font-weight").strValue,s=e.pstyle("text-metrics").strValue||"font",l=this.labelCalcCanvas,u=this.labelCalcCanvasContext;if(!l){l=this.labelCalcCanvas=n.createElement("canvas"),u=this.labelCalcCanvasContext=l.getContext("2d");var c=l.style;c.position="absolute",c.left="-9999px",c.top="-9999px",c.zIndex="-1",c.visibility="hidden",c.pointerEvents="none"}u.font="".concat(r," ").concat(o," ").concat(a,"px ").concat(i);for(var d=0,h=0,f=t.split("\n"),p=f.length,g=0,v=0,y=0;y1&&void 0!==arguments[1])||arguments[1];if(t.merge(e),n)for(var r=0;r=e.desktopTapThreshold2}var P=a(t);v&&(e.hoverData.tapholdCancelled=!0);n=!0,r(g,["mousemove","vmousemove","tapdrag"],t,{x:c[0],y:c[1]});var S=function(e){return{originalEvent:t,type:e,position:{x:c[0],y:c[1]}}},B=function(){e.data.bgActivePosistion=void 0,e.hoverData.selecting||o.emit(S("boxstart")),p[4]=1,e.hoverData.selecting=!0,e.redrawHint("select",!0),e.redraw()};if(3===e.hoverData.which){if(v){var D=S("cxtdrag");b?b.emit(D):o.emit(D),e.hoverData.cxtDragged=!0,e.hoverData.cxtOver&&g===e.hoverData.cxtOver||(e.hoverData.cxtOver&&e.hoverData.cxtOver.emit(S("cxtdragout")),e.hoverData.cxtOver=g,g&&g.emit(S("cxtdragover")))}}else if(e.hoverData.dragging){if(n=!0,o.panningEnabled()&&o.userPanningEnabled()){var _;if(e.hoverData.justStartedPan){var A=e.hoverData.mdownPos;_={x:(c[0]-A[0])*s,y:(c[1]-A[1])*s},e.hoverData.justStartedPan=!1}else _={x:x[0]*s,y:x[1]*s};o.panBy(_),o.emit(S("dragpan")),e.hoverData.dragged=!0}c=e.projectIntoViewport(t.clientX,t.clientY)}else if(1!=p[4]||null!=b&&!b.pannable()){if(b&&b.pannable()&&b.active()&&b.unactivate(),b&&b.grabbed()||g==y||(y&&r(y,["mouseout","tapdragout"],t,{x:c[0],y:c[1]}),g&&r(g,["mouseover","tapdragover"],t,{x:c[0],y:c[1]}),e.hoverData.last=g),b)if(v){if(o.boxSelectionEnabled()&&P)b&&b.grabbed()&&(d(w),b.emit(S("freeon")),w.emit(S("free")),e.dragData.didDrag&&(b.emit(S("dragfreeon")),w.emit(S("dragfree")))),B();else if(b&&b.grabbed()&&e.nodeIsDraggable(b)){var M=!e.dragData.didDrag;M&&e.redrawHint("eles",!0),e.dragData.didDrag=!0,e.hoverData.draggingEles||u(w,{inDragLayer:!0});var R={x:0,y:0};if(G(x[0])&&G(x[1])&&(R.x+=x[0],R.y+=x[1],M)){var I=e.hoverData.dragDelta;I&&G(I[0])&&G(I[1])&&(R.x+=I[0],R.y+=I[1])}e.hoverData.draggingEles=!0,w.silentShift(R).emit(S("position")).emit(S("drag")),e.redrawHint("drag",!0),e.redraw()}}else!function(){var t=e.hoverData.dragDelta=e.hoverData.dragDelta||[];0===t.length?(t.push(x[0]),t.push(x[1])):(t[0]+=x[0],t[1]+=x[1])}();n=!0}else if(v){if(e.hoverData.dragging||!o.boxSelectionEnabled()||!P&&o.panningEnabled()&&o.userPanningEnabled()){if(!e.hoverData.selecting&&o.panningEnabled()&&o.userPanningEnabled()){i(b,e.hoverData.downs)&&(e.hoverData.dragging=!0,e.hoverData.justStartedPan=!0,p[4]=0,e.data.bgActivePosistion=qt(h),e.redrawHint("select",!0),e.redraw())}}else B();b&&b.pannable()&&b.active()&&b.unactivate()}return p[2]=c[0],p[3]=c[1],n?(t.stopPropagation&&t.stopPropagation(),t.preventDefault&&t.preventDefault(),!1):void 0}}),!1),e.registerBinding(t,"mouseup",(function(t){if((1!==e.hoverData.which||1===t.which||!e.hoverData.capture)&&e.hoverData.capture){e.hoverData.capture=!1;var i=e.cy,o=e.projectIntoViewport(t.clientX,t.clientY),s=e.selection,l=e.findNearestElement(o[0],o[1],!0,!1),u=e.dragData.possibleDragElements,c=e.hoverData.down,h=a(t);e.data.bgActivePosistion&&(e.redrawHint("select",!0),e.redraw()),e.hoverData.tapholdCancelled=!0,e.data.bgActivePosistion=void 0,c&&c.unactivate();var f=function(e){return{originalEvent:t,type:e,position:{x:o[0],y:o[1]}}};if(3===e.hoverData.which){var p=f("cxttapend");if(c?c.emit(p):i.emit(p),!e.hoverData.cxtDragged){var g=f("cxttap");c?c.emit(g):i.emit(g)}e.hoverData.cxtDragged=!1,e.hoverData.which=null}else if(1===e.hoverData.which){if(r(l,["mouseup","tapend","vmouseup"],t,{x:o[0],y:o[1]}),e.dragData.didDrag||e.hoverData.dragged||e.hoverData.selecting||e.hoverData.isOverThresholdDrag||(r(c,["click","tap","vclick"],t,{x:o[0],y:o[1]}),x=!1,t.timeStamp-w<=i.multiClickDebounceTime()?(b&&clearTimeout(b),x=!0,w=null,r(c,["dblclick","dbltap","vdblclick"],t,{x:o[0],y:o[1]})):(b=setTimeout((function(){x||r(c,["oneclick","onetap","voneclick"],t,{x:o[0],y:o[1]})}),i.multiClickDebounceTime()),w=t.timeStamp)),null!=c||e.dragData.didDrag||e.hoverData.selecting||e.hoverData.dragged||a(t)||(i.$(n).unselect(["tapunselect"]),u.length>0&&e.redrawHint("eles",!0),e.dragData.possibleDragElements=u=i.collection()),l!=c||e.dragData.didDrag||e.hoverData.selecting||null!=l&&l._private.selectable&&(e.hoverData.dragging||("additive"===i.selectionType()||h?l.selected()?l.unselect(["tapunselect"]):l.select(["tapselect"]):h||(i.$(n).unmerge(l).unselect(["tapunselect"]),l.select(["tapselect"]))),e.redrawHint("eles",!0)),e.hoverData.selecting){var v=i.collection(e.getAllInBox(s[0],s[1],s[2],s[3]));e.redrawHint("select",!0),v.length>0&&e.redrawHint("eles",!0),i.emit(f("boxend"));var y=function(e){return e.selectable()&&!e.selected()};"additive"===i.selectionType()||h||i.$(n).unmerge(v).unselect(),v.emit(f("box")).stdFilter(y).select().emit(f("boxselect")),e.redraw()}if(e.hoverData.dragging&&(e.hoverData.dragging=!1,e.redrawHint("select",!0),e.redrawHint("eles",!0),e.redraw()),!s[4]){e.redrawHint("drag",!0),e.redrawHint("eles",!0);var m=c&&c.grabbed();d(u),m&&(c.emit(f("freeon")),u.emit(f("free")),e.dragData.didDrag&&(c.emit(f("dragfreeon")),u.emit(f("dragfree"))))}}s[4]=0,e.hoverData.down=null,e.hoverData.cxtStarted=!1,e.hoverData.draggingEles=!1,e.hoverData.selecting=!1,e.hoverData.isOverThresholdDrag=!1,e.dragData.didDrag=!1,e.hoverData.dragged=!1,e.hoverData.dragDelta=[],e.hoverData.mdownPos=null,e.hoverData.mdownGPos=null,e.hoverData.which=null}}),!1);var k,T,C,P,S,B,D,_,A,M,R,I,N,L,z=[],O=1e5,V=function(t){var n=!1,r=t.deltaY;if(null==r&&(null!=t.wheelDeltaY?r=t.wheelDeltaY/4:null!=t.wheelDelta&&(r=t.wheelDelta/4)),0!==r){if(null==k)if(z.length>=4){k=!1;var a,i=z;if(i[0]>=5)a=function(e){for(var t=Math.abs(e[0]),n=1;n0&&(t=Wt(t,e[n]))}return t}(i),a>1&&(k=!0,O=a)}else z.push(Math.abs(r)),n=!0;else k&&(O=Math.min(Math.abs(r),O));if(!e.scrollingPage){var o=e.cy,s=o.zoom(),l=o.pan(),u=e.projectIntoViewport(t.clientX,t.clientY),c=[u[0]*s+l.x,u[1]*s+l.y];if(e.hoverData.draggingEles||e.hoverData.dragging||e.hoverData.cxtStarted||0!==e.selection[4])t.preventDefault();else if(o.panningEnabled()&&o.userPanningEnabled()&&o.zoomingEnabled()&&o.userZoomingEnabled()){var d;t.preventDefault(),e.data.wheelZooming=!0,clearTimeout(e.data.wheelTimeout),e.data.wheelTimeout=setTimeout((function(){e.data.wheelZooming=!1,e.redrawHint("eles",!0),e.redraw()}),150),n&&Math.abs(r)>5&&(r=5*Kt(r)),d=r/-250,k&&(d/=O,d*=3),d*=e.wheelSensitivity,1===t.deltaMode&&(d*=33);var h=o.zoom()*Math.pow(10,d);"gesturechange"===t.type&&(h=e.gestureStartZoom*t.scale),o.zoom({level:h,renderedPosition:{x:c[0],y:c[1]}}),o.emit({type:"gesturechange"===t.type?"pinchzoom":"scrollzoom",originalEvent:t,position:{x:u[0],y:u[1]}})}}}};e.registerBinding(e.container,"wheel",V,!0),e.registerBinding(t,"scroll",(function(t){e.scrollingPage=!0,clearTimeout(e.scrollingPageTimeout),e.scrollingPageTimeout=setTimeout((function(){e.scrollingPage=!1}),250)}),!0),e.registerBinding(e.container,"gesturestart",(function(t){e.gestureStartZoom=e.cy.zoom(),e.hasTouchStarted||t.preventDefault()}),!0),e.registerBinding(e.container,"gesturechange",(function(t){e.hasTouchStarted||V(t)}),!0),e.registerBinding(e.container,"mouseout",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseout",position:{x:n[0],y:n[1]}})}),!1),e.registerBinding(e.container,"mouseover",(function(t){var n=e.projectIntoViewport(t.clientX,t.clientY);e.cy.emit({originalEvent:t,type:"mouseover",position:{x:n[0],y:n[1]}})}),!1);var F,X,j,Y,q,W,U,H=function(e,t,n,r){return Math.sqrt((n-e)*(n-e)+(r-t)*(r-t))},K=function(e,t,n,r){return(n-e)*(n-e)+(r-t)*(r-t)};if(e.registerBinding(e.container,"touchstart",F=function(t){if(e.hasTouchStarted=!0,m(t)){f(),e.touchData.capture=!0,e.data.bgActivePosistion=void 0;var n=e.cy,a=e.touchData.now,i=e.touchData.earlier;if(t.touches[0]){var o=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);a[0]=o[0],a[1]=o[1]}if(t.touches[1]){o=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);a[2]=o[0],a[3]=o[1]}if(t.touches[2]){o=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);a[4]=o[0],a[5]=o[1]}var l=function(e){return{originalEvent:t,type:e,position:{x:a[0],y:a[1]}}};if(t.touches[1]){e.touchData.singleTouchMoved=!0,d(e.dragData.touchDragEles);var h=e.findContainerClientCoords();M=h[0],R=h[1],I=h[2],N=h[3],T=t.touches[0].clientX-M,C=t.touches[0].clientY-R,P=t.touches[1].clientX-M,S=t.touches[1].clientY-R,L=0<=T&&T<=I&&0<=P&&P<=I&&0<=C&&C<=N&&0<=S&&S<=N;var p=n.pan(),g=n.zoom();B=H(T,C,P,S),D=K(T,C,P,S),A=[((_=[(T+P)/2,(C+S)/2])[0]-p.x)/g,(_[1]-p.y)/g];if(D<4e4&&!t.touches[2]){var v=e.findNearestElement(a[0],a[1],!0,!0),y=e.findNearestElement(a[2],a[3],!0,!0);return v&&v.isNode()?(v.activate().emit(l("cxttapstart")),e.touchData.start=v):y&&y.isNode()?(y.activate().emit(l("cxttapstart")),e.touchData.start=y):n.emit(l("cxttapstart")),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!0,e.touchData.cxtDragged=!1,e.data.bgActivePosistion=void 0,void e.redraw()}}if(t.touches[2])n.boxSelectionEnabled()&&t.preventDefault();else if(t.touches[1]);else if(t.touches[0]){var b=e.findNearestElements(a[0],a[1],!0,!0),x=b[0];if(null!=x&&(x.activate(),e.touchData.start=x,e.touchData.starts=b,e.nodeIsGrabbable(x))){var w=e.dragData.touchDragEles=n.collection(),E=null;e.redrawHint("eles",!0),e.redrawHint("drag",!0),x.selected()?(E=n.$((function(t){return t.selected()&&e.nodeIsGrabbable(t)})),u(E,{addToList:w})):c(x,{addToList:w}),s(x),x.emit(l("grabon")),E?E.forEach((function(e){e.emit(l("grab"))})):x.emit(l("grab"))}r(x,["touchstart","tapstart","vmousedown"],t,{x:a[0],y:a[1]}),null==x&&(e.data.bgActivePosistion={x:o[0],y:o[1]},e.redrawHint("select",!0),e.redraw()),e.touchData.singleTouchMoved=!1,e.touchData.singleTouchStartTime=+new Date,clearTimeout(e.touchData.tapholdTimeout),e.touchData.tapholdTimeout=setTimeout((function(){!1!==e.touchData.singleTouchMoved||e.pinching||e.touchData.selecting||r(e.touchData.start,["taphold"],t,{x:a[0],y:a[1]})}),e.tapholdDuration)}if(t.touches.length>=1){for(var k=e.touchData.startPosition=[null,null,null,null,null,null],z=0;z=e.touchTapThreshold2}if(n&&e.touchData.cxt){t.preventDefault();var E=t.touches[0].clientX-M,k=t.touches[0].clientY-R,_=t.touches[1].clientX-M,I=t.touches[1].clientY-R,N=K(E,k,_,I);if(N/D>=2.25||N>=22500){e.touchData.cxt=!1,e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var z=p("cxttapend");e.touchData.start?(e.touchData.start.unactivate().emit(z),e.touchData.start=null):o.emit(z)}}if(n&&e.touchData.cxt){z=p("cxtdrag");e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.touchData.start?e.touchData.start.emit(z):o.emit(z),e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxtDragged=!0;var O=e.findNearestElement(s[0],s[1],!0,!0);e.touchData.cxtOver&&O===e.touchData.cxtOver||(e.touchData.cxtOver&&e.touchData.cxtOver.emit(p("cxtdragout")),e.touchData.cxtOver=O,O&&O.emit(p("cxtdragover")))}else if(n&&t.touches[2]&&o.boxSelectionEnabled())t.preventDefault(),e.data.bgActivePosistion=void 0,this.lastThreeTouch=+new Date,e.touchData.selecting||o.emit(p("boxstart")),e.touchData.selecting=!0,e.touchData.didSelect=!0,a[4]=1,a&&0!==a.length&&void 0!==a[0]?(a[2]=(s[0]+s[2]+s[4])/3,a[3]=(s[1]+s[3]+s[5])/3):(a[0]=(s[0]+s[2]+s[4])/3,a[1]=(s[1]+s[3]+s[5])/3,a[2]=(s[0]+s[2]+s[4])/3+1,a[3]=(s[1]+s[3]+s[5])/3+1),e.redrawHint("select",!0),e.redraw();else if(n&&t.touches[1]&&!e.touchData.didSelect&&o.zoomingEnabled()&&o.panningEnabled()&&o.userZoomingEnabled()&&o.userPanningEnabled()){if(t.preventDefault(),e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),te=e.dragData.touchDragEles){e.redrawHint("drag",!0);for(var V=0;V0&&!e.hoverData.draggingEles&&!e.swipePanning&&null!=e.data.bgActivePosistion&&(e.data.bgActivePosistion=void 0,e.redrawHint("select",!0),e.redraw())}},!1),e.registerBinding(t,"touchcancel",j=function(t){var n=e.touchData.start;e.touchData.capture=!1,n&&n.unactivate()}),e.registerBinding(t,"touchend",Y=function(t){var a=e.touchData.start;if(e.touchData.capture){0===t.touches.length&&(e.touchData.capture=!1),t.preventDefault();var i=e.selection;e.swipePanning=!1,e.hoverData.draggingEles=!1;var o=e.cy,s=o.zoom(),l=e.touchData.now,u=e.touchData.earlier;if(t.touches[0]){var c=e.projectIntoViewport(t.touches[0].clientX,t.touches[0].clientY);l[0]=c[0],l[1]=c[1]}if(t.touches[1]){c=e.projectIntoViewport(t.touches[1].clientX,t.touches[1].clientY);l[2]=c[0],l[3]=c[1]}if(t.touches[2]){c=e.projectIntoViewport(t.touches[2].clientX,t.touches[2].clientY);l[4]=c[0],l[5]=c[1]}var h,f=function(e){return{originalEvent:t,type:e,position:{x:l[0],y:l[1]}}};if(a&&a.unactivate(),e.touchData.cxt){if(h=f("cxttapend"),a?a.emit(h):o.emit(h),!e.touchData.cxtDragged){var p=f("cxttap");a?a.emit(p):o.emit(p)}return e.touchData.start&&(e.touchData.start._private.grabbed=!1),e.touchData.cxt=!1,e.touchData.start=null,void e.redraw()}if(!t.touches[2]&&o.boxSelectionEnabled()&&e.touchData.selecting){e.touchData.selecting=!1;var g=o.collection(e.getAllInBox(i[0],i[1],i[2],i[3]));i[0]=void 0,i[1]=void 0,i[2]=void 0,i[3]=void 0,i[4]=0,e.redrawHint("select",!0),o.emit(f("boxend"));g.emit(f("box")).stdFilter((function(e){return e.selectable()&&!e.selected()})).select().emit(f("boxselect")),g.nonempty()&&e.redrawHint("eles",!0),e.redraw()}if(null!=a&&a.unactivate(),t.touches[2])e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);else if(t.touches[1]);else if(t.touches[0]);else if(!t.touches[0]){e.data.bgActivePosistion=void 0,e.redrawHint("select",!0);var v=e.dragData.touchDragEles;if(null!=a){var y=a._private.grabbed;d(v),e.redrawHint("drag",!0),e.redrawHint("eles",!0),y&&(a.emit(f("freeon")),v.emit(f("free")),e.dragData.didDrag&&(a.emit(f("dragfreeon")),v.emit(f("dragfree")))),r(a,["touchend","tapend","vmouseup","tapdragout"],t,{x:l[0],y:l[1]}),a.unactivate(),e.touchData.start=null}else{var m=e.findNearestElement(l[0],l[1],!0,!0);r(m,["touchend","tapend","vmouseup","tapdragout"],t,{x:l[0],y:l[1]})}var b=e.touchData.startPosition[0]-l[0],x=b*b,w=e.touchData.startPosition[1]-l[1],E=(x+w*w)*s*s;e.touchData.singleTouchMoved||(a||o.$(":selected").unselect(["tapunselect"]),r(a,["tap","vclick"],t,{x:l[0],y:l[1]}),q=!1,t.timeStamp-U<=o.multiClickDebounceTime()?(W&&clearTimeout(W),q=!0,U=null,r(a,["dbltap","vdblclick"],t,{x:l[0],y:l[1]})):(W=setTimeout((function(){q||r(a,["onetap","voneclick"],t,{x:l[0],y:l[1]})}),o.multiClickDebounceTime()),U=t.timeStamp)),null!=a&&!e.dragData.didDrag&&a._private.selectable&&E2){for(var f=[c[0],c[1]],p=Math.pow(f[0]-e,2)+Math.pow(f[1]-t,2),g=1;g0)return g[0]}return null},f=Object.keys(d),p=0;p0?u:fn(a,i,e,t,n,r,o,s)},checkPoint:function(e,t,n,r,a,i,o,s){var l=2*(s="auto"===s?Mn(r,a):s);if(bn(e,t,this.points,i,o,r,a-l,[0,-1],n))return!0;if(bn(e,t,this.points,i,o,r-l,a,[0,-1],n))return!0;var u=r/2+2*n,c=a/2+2*n;return!!mn(e,t,[i-u,o-c,i-u,o,i+u,o,i+u,o-c])||(!!En(e,t,l,l,i+r/2-s,o+a/2-s,n)||!!En(e,t,l,l,i-r/2+s,o+a/2-s,n))}}},sd.registerNodeShapes=function(){var e=this.nodeShapes={},t=this;this.generateEllipse(),this.generatePolygon("triangle",Dn(3,0)),this.generateRoundPolygon("round-triangle",Dn(3,0)),this.generatePolygon("rectangle",Dn(4,0)),e.square=e.rectangle,this.generateRoundRectangle(),this.generateCutRectangle(),this.generateBarrel(),this.generateBottomRoundrectangle();var n=[0,1,1,0,0,-1,-1,0];this.generatePolygon("diamond",n),this.generateRoundPolygon("round-diamond",n),this.generatePolygon("pentagon",Dn(5,0)),this.generateRoundPolygon("round-pentagon",Dn(5,0)),this.generatePolygon("hexagon",Dn(6,0)),this.generateRoundPolygon("round-hexagon",Dn(6,0)),this.generatePolygon("heptagon",Dn(7,0)),this.generateRoundPolygon("round-heptagon",Dn(7,0)),this.generatePolygon("octagon",Dn(8,0)),this.generateRoundPolygon("round-octagon",Dn(8,0));var r=new Array(20),a=An(5,0),i=An(5,Math.PI/5),o=.5*(3-Math.sqrt(5));o*=1.57;for(var s=0;s=e.deqFastCost*g)break}else if(a){if(f>=e.deqCost*l||f>=e.deqAvgCost*s)break}else if(p>=e.deqNoDrawCost*hd)break;var v=e.deq(t,d,c);if(!(v.length>0))break;for(var y=0;y0&&(e.onDeqd(t,u),!a&&e.shouldRedraw(t,u,d,c)&&r())}),a(t))}}},pd=function(){return n((function e(n){var r=arguments.length>1&&void 0!==arguments[1]?arguments[1]:et;t(this,e),this.idsByKey=new gt,this.keyForId=new gt,this.cachesByLvl=new gt,this.lvls=[],this.getKey=n,this.doesEleInvalidateKey=r}),[{key:"getIdsFor",value:function(e){null==e&&rt("Can not get id list for null key");var t=this.idsByKey,n=this.idsByKey.get(e);return n||(n=new yt,t.set(e,n)),n}},{key:"addIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).add(t)}},{key:"deleteIdForKey",value:function(e,t){null!=e&&this.getIdsFor(e).delete(t)}},{key:"getNumberOfIdsForKey",value:function(e){return null==e?0:this.getIdsFor(e).size}},{key:"updateKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t),r=this.getKey(e);this.deleteIdForKey(n,t),this.addIdForKey(r,t),this.keyForId.set(t,r)}},{key:"deleteKeyMappingFor",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteIdForKey(n,t),this.keyForId.delete(t)}},{key:"keyHasChangedFor",value:function(e){var t=e.id();return this.keyForId.get(t)!==this.getKey(e)}},{key:"isInvalid",value:function(e){return this.keyHasChangedFor(e)||this.doesEleInvalidateKey(e)}},{key:"getCachesAt",value:function(e){var t=this.cachesByLvl,n=this.lvls,r=t.get(e);return r||(r=new gt,t.set(e,r),n.push(e)),r}},{key:"getCache",value:function(e,t){return this.getCachesAt(t).get(e)}},{key:"get",value:function(e,t){var n=this.getKey(e),r=this.getCache(n,t);return null!=r&&this.updateKeyMappingFor(e),r}},{key:"getForCachedKey",value:function(e,t){var n=this.keyForId.get(e.id());return this.getCache(n,t)}},{key:"hasCache",value:function(e,t){return this.getCachesAt(t).has(e)}},{key:"has",value:function(e,t){var n=this.getKey(e);return this.hasCache(n,t)}},{key:"setCache",value:function(e,t,n){n.key=e,this.getCachesAt(t).set(e,n)}},{key:"set",value:function(e,t,n){var r=this.getKey(e);this.setCache(r,t,n),this.updateKeyMappingFor(e)}},{key:"deleteCache",value:function(e,t){this.getCachesAt(t).delete(e)}},{key:"delete",value:function(e,t){var n=this.getKey(e);this.deleteCache(n,t)}},{key:"invalidateKey",value:function(e){var t=this;this.lvls.forEach((function(n){return t.deleteCache(e,n)}))}},{key:"invalidate",value:function(e){var t=e.id(),n=this.keyForId.get(t);this.deleteKeyMappingFor(e);var r=this.doesEleInvalidateKey(e);return r&&this.invalidateKey(n),r||0===this.getNumberOfIdsForKey(n)}}])}(),gd=7.99,vd={dequeue:"dequeue",downscale:"downscale",highQuality:"highQuality"},yd=ct({getKey:null,doesEleInvalidateKey:et,drawElement:null,getBoundingBox:null,getRotationPoint:null,getRotationOffset:null,isVisible:Je,allowEdgeTxrCaching:!0,allowParentTxrCaching:!0}),md=function(e,t){var n=this;n.renderer=e,n.onDequeues=[];var r=yd(t);ye(n,r),n.lookup=new pd(r.getKey,r.doesEleInvalidateKey),n.setupDequeueing()},bd=md.prototype;bd.reasons=vd,bd.getTextureQueue=function(e){var t=this;return t.eleImgCaches=t.eleImgCaches||{},t.eleImgCaches[e]=t.eleImgCaches[e]||[]},bd.getRetiredTextureQueue=function(e){var t=this.eleImgCaches.retired=this.eleImgCaches.retired||{};return t[e]=t[e]||[]},bd.getElementQueue=function(){return this.eleCacheQueue=this.eleCacheQueue||new Bt((function(e,t){return t.reqs-e.reqs}))},bd.getElementKeyToQueue=function(){return this.eleKeyToCacheQueue=this.eleKeyToCacheQueue||{}},bd.getElement=function(e,t,n,r,a){var i=this,o=this.renderer,s=o.cy.zoom(),l=this.lookup;if(!t||0===t.w||0===t.h||isNaN(t.w)||isNaN(t.h)||!e.visible()||e.removed())return null;if(!i.allowEdgeTxrCaching&&e.isEdge()||!i.allowParentTxrCaching&&e.isParent())return null;if(null==r&&(r=Math.ceil(Ht(s*n))),r<-4)r=-4;else if(s>=7.99||r>3)return null;var u=Math.pow(2,r),c=t.h*u,d=t.w*u,h=o.eleTextBiggerThanMin(e,u);if(!this.isVisible(e,h))return null;var f,p=l.get(e,r);if(p&&p.invalidated&&(p.invalidated=!1,p.texture.invalidatedWidth-=p.width),p)return p;if(f=c<=25?25:c<=50?50:50*Math.ceil(c/50),c>1024||d>1024)return null;var g=i.getTextureQueue(f),v=g[g.length-2],y=function(){return i.recycleTexture(f,d)||i.addTexture(f,d)};v||(v=g[g.length-1]),v||(v=y()),v.width-v.usedWidthr;S--)C=i.getElement(e,t,n,S,vd.downscale);P()}else{var B;if(!x&&!w&&!E)for(var D=r-1;D>=-4;D--){var _=l.get(e,D);if(_){B=_;break}}if(b(B))return i.queueElement(e,r),B;v.context.translate(v.usedWidth,0),v.context.scale(u,u),this.drawElement(v.context,e,t,h,!1),v.context.scale(1/u,1/u),v.context.translate(-v.usedWidth,0)}return p={x:v.usedWidth,texture:v,level:r,scale:u,width:d,height:c,scaledLabelShown:h},v.usedWidth+=Math.ceil(d+8),v.eleCaches.push(p),l.set(e,r,p),i.checkTextureFullness(v),p},bd.invalidateElements=function(e){for(var t=0;t=.2*e.width&&this.retireTexture(e)},bd.checkTextureFullness=function(e){var t=this.getTextureQueue(e.height);e.usedWidth/e.width>.8&&e.fullnessChecks>=10?dt(t,e):e.fullnessChecks++},bd.retireTexture=function(e){var t=e.height,n=this.getTextureQueue(t),r=this.lookup;dt(n,e),e.retired=!0;for(var a=e.eleCaches,i=0;i=t)return i.retired=!1,i.usedWidth=0,i.invalidatedWidth=0,i.fullnessChecks=0,ht(i.eleCaches),i.context.setTransform(1,0,0,1,0,0),i.context.clearRect(0,0,i.width,i.height),dt(r,i),n.push(i),i}},bd.queueElement=function(e,t){var n=this.getElementQueue(),r=this.getElementKeyToQueue(),a=this.getKey(e),i=r[a];if(i)i.level=Math.max(i.level,t),i.eles.merge(e),i.reqs++,n.updateItem(i);else{var o={eles:e.spawn().merge(e),level:t,reqs:1,key:a};n.push(o),r[a]=o}},bd.dequeue=function(e){for(var t=this,n=t.getElementQueue(),r=t.getElementKeyToQueue(),a=[],i=t.lookup,o=0;o<1&&n.size()>0;o++){var s=n.pop(),l=s.key,u=s.eles[0],c=i.hasCache(u,s.level);if(r[l]=null,!c){a.push(s);var d=t.getBoundingBox(u);t.getElement(u,d,e,s.level,vd.dequeue)}}return a},bd.removeFromQueue=function(e){var t=this.getElementQueue(),n=this.getElementKeyToQueue(),r=this.getKey(e),a=n[r];null!=a&&(1===a.eles.length?(a.reqs=Qe,t.updateItem(a),t.pop(),n[r]=null):a.eles.unmerge(e))},bd.onDequeue=function(e){this.onDequeues.push(e)},bd.offDequeue=function(e){dt(this.onDequeues,e)},bd.setupDequeueing=fd({deqRedrawThreshold:100,deqCost:.15,deqAvgCost:.1,deqNoDrawCost:.9,deqFastCost:.9,deq:function(e,t,n){return e.dequeue(t,n)},onDeqd:function(e,t){for(var n=0;n=3.99||n>2)return null;r.validateLayersElesOrdering(n,e);var o,s,l=r.layersByLevel,u=Math.pow(2,n),c=l[n]=l[n]||[];if(r.levelIsComplete(n,e))return c;!function(){var t=function(t){if(r.validateLayersElesOrdering(t,e),r.levelIsComplete(t,e))return s=l[t],!0},a=function(e){if(!s)for(var r=n+e;-4<=r&&r<=2&&!t(r);r+=e);};a(1),a(-1);for(var i=c.length-1;i>=0;i--){var o=c[i];o.invalid&&dt(c,o)}}();var d=function(t){var a=(t=t||{}).after;!function(){if(!o){o=tn();for(var t=0;t32767||s>32767)return null;if(i*s>16e6)return null;var l=r.makeLayer(o,n);if(null!=a){var d=c.indexOf(a)+1;c.splice(d,0,l)}else(void 0===t.insert||t.insert)&&c.unshift(l);return l};if(r.skipping&&!i)return null;for(var h=null,f=e.length/1,p=!i,g=0;g=f||!cn(h.bb,v.boundingBox()))&&!(h=d({insert:!0,after:h})))return null;s||p?r.queueLayer(h,v):r.drawEleInLayer(h,v,n,t),h.eles.push(v),m[n]=h}}return s||(p?null:c)},wd.getEleLevelForLayerLevel=function(e,t){return e},wd.drawEleInLayer=function(e,t,n,r){var a=this.renderer,i=e.context,o=t.boundingBox();0!==o.w&&0!==o.h&&t.visible()&&(n=this.getEleLevelForLayerLevel(n,r),a.setImgSmoothing(i,!1),a.drawCachedElement(i,t,null,null,n,true),a.setImgSmoothing(i,!0))},wd.levelIsComplete=function(e,t){var n=this.layersByLevel[e];if(!n||0===n.length)return!1;for(var r=0,a=0;a0)return!1;if(i.invalid)return!1;r+=i.eles.length}return r===t.length},wd.validateLayersElesOrdering=function(e,t){var n=this.layersByLevel[e];if(n)for(var r=0;r0){e=!0;break}}return e},wd.invalidateElements=function(e){var t=this;0!==e.length&&(t.lastInvalidationTime=Le(),0!==e.length&&t.haveLayers()&&t.updateElementsInLayers(e,(function(e,n,r){t.invalidateLayer(e)})))},wd.invalidateLayer=function(e){if(this.lastInvalidationTime=Le(),!e.invalid){var t=e.level,n=e.eles,r=this.layersByLevel[t];dt(r,e),e.elesQueue=[],e.invalid=!0,e.replacement&&(e.replacement.invalid=!0);for(var a=0;a3&&void 0!==arguments[3])||arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],o=this,s=t._private.rscratch;if((!i||t.visible())&&!s.badLine&&null!=s.allpts&&!isNaN(s.allpts[0])){var l;n&&(l=n,e.translate(-l.x1,-l.y1));var u=i?t.pstyle("opacity").value:1,c=i?t.pstyle("line-opacity").value:1,d=t.pstyle("curve-style").value,h=t.pstyle("line-style").value,f=t.pstyle("width").pfValue,p=t.pstyle("line-cap").value,g=t.pstyle("line-outline-width").value,v=t.pstyle("line-outline-color").value,y=u*c,m=u*c,b=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y;"straight-triangle"===d?(o.eleStrokeStyle(e,t,n),o.drawEdgeTrianglePath(t,e,s.allpts)):(e.lineWidth=f,e.lineCap=p,o.eleStrokeStyle(e,t,n),o.drawEdgePath(t,e,s.allpts,h),e.lineCap="butt")},x=function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:m;o.drawArrowheads(e,t,n)};if(e.lineJoin="round","yes"===t.pstyle("ghost").value){var w=t.pstyle("ghost-offset-x").pfValue,E=t.pstyle("ghost-offset-y").pfValue,k=t.pstyle("ghost-opacity").value,T=y*k;e.translate(w,E),b(T),x(T),e.translate(-w,-E)}else!function(){var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:y;e.lineWidth=f+g,e.lineCap=p,g>0?(o.colorStrokeStyle(e,v[0],v[1],v[2],n),"straight-triangle"===d?o.drawEdgeTrianglePath(t,e,s.allpts):(o.drawEdgePath(t,e,s.allpts,h),e.lineCap="butt")):e.lineCap="butt"}();a&&o.drawEdgeUnderlay(e,t),b(),x(),a&&o.drawEdgeOverlay(e,t),o.drawElementText(e,t,null,r),n&&e.translate(l.x1,l.y1)}}},Vd=function(e){if(!["overlay","underlay"].includes(e))throw new Error("Invalid state");return function(t,n){if(n.visible()){var r=n.pstyle("".concat(e,"-opacity")).value;if(0!==r){var a=this,i=a.usePaths(),o=n._private.rscratch,s=2*n.pstyle("".concat(e,"-padding")).pfValue,l=n.pstyle("".concat(e,"-color")).value;t.lineWidth=s,"self"!==o.edgeType||i?t.lineCap="round":t.lineCap="butt",a.colorStrokeStyle(t,l[0],l[1],l[2],r),a.drawEdgePath(n,t,o.allpts,"solid")}}}};Od.drawEdgeOverlay=Vd("overlay"),Od.drawEdgeUnderlay=Vd("underlay"),Od.drawEdgePath=function(e,t,n,a){var i,o=e._private.rscratch,s=t,l=!1,u=this.usePaths(),c=e.pstyle("line-dash-pattern").pfValue,d=e.pstyle("line-dash-offset").pfValue;if(u){var h=n.join("$");o.pathCacheKey&&o.pathCacheKey===h?(i=t=o.pathCache,l=!0):(i=t=new Path2D,o.pathCacheKey=h,o.pathCache=i)}if(s.setLineDash)switch(a){case"dotted":s.setLineDash([1,1]);break;case"dashed":s.setLineDash(c),s.lineDashOffset=d;break;case"solid":s.setLineDash([])}if(!l&&!o.badLine)switch(t.beginPath&&t.beginPath(),t.moveTo(n[0],n[1]),o.edgeType){case"bezier":case"self":case"compound":case"multibezier":for(var f=2;f+35&&void 0!==arguments[5]?arguments[5]:5,o=Math.min(i,r/2,a/2);e.beginPath(),e.moveTo(t+o,n),e.lineTo(t+r-o,n),e.quadraticCurveTo(t+r,n,t+r,n+o),e.lineTo(t+r,n+a-o),e.quadraticCurveTo(t+r,n+a,t+r-o,n+a),e.lineTo(t+o,n+a),e.quadraticCurveTo(t,n+a,t,n+a-o),e.lineTo(t,n+o),e.quadraticCurveTo(t,n,t+o,n),e.closePath()}Xd.eleTextBiggerThanMin=function(e,t){if(!t){var n=e.cy().zoom(),r=this.getPixelRatio(),a=Math.ceil(Ht(n*r));t=Math.pow(2,a)}return!(e.pstyle("font-size").pfValue*t5&&void 0!==arguments[5])||arguments[5],o=this;if(null==r){if(i&&!o.eleTextBiggerThanMin(t))return}else if(!1===r)return;if(t.isNode()){var s=t.pstyle("label");if(!s||!s.value)return;var l=o.getLabelJustification(t),u="glyph"===t.pstyle("text-metrics").strValue;e.textAlign=l,e.textBaseline=u?"alphabetic":"bottom"}else{var c=t.element()._private.rscratch.badLine,d=t.pstyle("label"),h=t.pstyle("source-label"),f=t.pstyle("target-label");if(c||(!d||!d.value)&&(!h||!h.value)&&(!f||!f.value))return;e.textAlign="center",e.textBaseline="bottom"}var p,g=!n;n&&(p=n,e.translate(-p.x1,-p.y1)),null==a?(o.drawText(e,t,null,g,i),t.isEdge()&&(o.drawText(e,t,"source",g,i),o.drawText(e,t,"target",g,i))):o.drawText(e,t,a,g,i),n&&e.translate(p.x1,p.y1)},Xd.getFontCache=function(e){var t;this.fontCaches=this.fontCaches||[];for(var n=0;n2&&void 0!==arguments[2])||arguments[2],r=t.pstyle("font-style").strValue,a=t.pstyle("font-size").pfValue+"px",i=t.pstyle("font-family").strValue,o=t.pstyle("font-weight").strValue,s=n?t.effectiveOpacity()*t.pstyle("text-opacity").value:1,l=t.pstyle("text-outline-opacity").value*s,u=t.pstyle("color").value,c=t.pstyle("text-outline-color").value;e.font=r+" "+o+" "+a+" "+i,e.lineJoin="round",this.colorFillStyle(e,u[0],u[1],u[2],s),this.colorStrokeStyle(e,c[0],c[1],c[2],l)},Xd.getTextAngle=function(e,t){var n,r=e._private.rscratch,a=t?t+"-":"",i=e.pstyle(a+"text-rotation");if("autorotate"===i.strValue){var o=ft(r,"labelAngle",t);n=e.isEdge()?o:0}else n="none"===i.strValue?0:i.pfValue;return n},Xd.drawText=function(e,t,n){var r=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=t._private.rscratch,o=a?t.effectiveOpacity():1;if(!a||0!==o&&0!==t.pstyle("text-opacity").value){"main"===n&&(n=null);var s,l,u=ft(i,"labelX",n),c=ft(i,"labelY",n),d=this.getLabelText(t,n);if(null!=d&&""!==d&&!isNaN(u)&&!isNaN(c)){this.setupTextStyle(e,t,a);var h,f=n?n+"-":"",p=ft(i,"labelWidth",n),g=ft(i,"labelHeight",n),v=ft(i,"labelActualDescent",n),y=t.pstyle(f+"text-margin-x").pfValue,m=t.pstyle(f+"text-margin-y").pfValue,b=t.isEdge(),x=t.pstyle("text-halign").value,w=t.pstyle("text-valign").value;b&&(x="center",w="center"),u+=y,c+=m,0!==(h=r?this.getTextAngle(t,n):0)&&(s=u,l=c,e.translate(s,l),e.rotate(h),u=0,c=0);var E=Bs(x),k=Ds(w);switch(k){case"top":break;case"center":c+=g/2;break;case"bottom":c+=g}var T=t.pstyle("text-background-opacity").value,C=t.pstyle("text-border-opacity").value,P=t.pstyle("text-border-width").pfValue,S=t.pstyle("text-background-padding").pfValue,B=t.pstyle("text-background-shape").strValue,D="round-rectangle"===B||"roundrectangle"===B,_="circle"===B;if(T>0||P>0&&C>0){var A=e.fillStyle,M=e.strokeStyle,R=e.lineWidth,I=t.pstyle("text-background-color").value,N=t.pstyle("text-border-color").value,L=t.pstyle("text-border-style").value,z=T>0,O=P>0&&C>0,V=u-S;switch(E){case"left":V-=p;break;case"center":V-=p/2}var F=c-g-S,X=p+2*S,j=g+2*S;if(z&&(e.fillStyle="rgba(".concat(I[0],",").concat(I[1],",").concat(I[2],",").concat(T*o,")")),O&&(e.strokeStyle="rgba(".concat(N[0],",").concat(N[1],",").concat(N[2],",").concat(C*o,")"),e.lineWidth=P,e.setLineDash))switch(L){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"double":e.lineWidth=P/4,e.setLineDash([]);break;default:e.setLineDash([])}if(D?(e.beginPath(),jd(e,V,F,X,j,2)):_?(e.beginPath(),function(e,t,n,r,a){var i=Math.min(r,a)/2,o=t+r/2,s=n+a/2;e.beginPath(),e.arc(o,s,i,0,2*Math.PI),e.closePath()}(e,V,F,X,j)):(e.beginPath(),e.rect(V,F,X,j)),z&&e.fill(),O&&e.stroke(),O&&"double"===L){var Y=P/2;e.beginPath(),D?jd(e,V+Y,F+Y,X-2*Y,j-2*Y,2):e.rect(V+Y,F+Y,X-2*Y,j-2*Y),e.stroke()}e.fillStyle=A,e.strokeStyle=M,e.lineWidth=R,e.setLineDash&&e.setLineDash([])}var q=2*t.pstyle("text-outline-width").pfValue;if(q>0&&(e.lineWidth=q),c-=v,"wrap"===t.pstyle("text-wrap").value){var W=ft(i,"labelWrapCachedLines",n),U=ft(i,"labelLineHeight",n),H=p/2,K=this.getLabelJustification(t);switch("auto"===K||("left"===E?"left"===K?u+=-p:"center"===K&&(u+=-H):"center"===E?"left"===K?u+=-H:"right"===K&&(u+=H):"right"===E&&("center"===K?u+=H:"right"===K&&(u+=p))),k){case"top":case"center":case"bottom":c-=(W.length-1)*U}for(var G=0;G0&&e.strokeText(W[G],u,c),e.fillText(W[G],u,c),c+=U}else q>0&&e.strokeText(d,u,c),e.fillText(d,u,c);0!==h&&(e.rotate(-h),e.translate(-s,-l))}}};var Yd={drawNode:function(e,t,n){var r,a,i=!(arguments.length>3&&void 0!==arguments[3])||arguments[3],o=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],s=!(arguments.length>5&&void 0!==arguments[5])||arguments[5],l=this,u=t._private,c=u.rscratch,d=t.position();if(G(d.x)&&G(d.y)&&(!s||t.visible())){var h,f,p=s?t.effectiveOpacity():1,g=l.usePaths(),v=!1,y=t.padding();r=t.width()+2*y,a=t.height()+2*y,n&&(f=n,e.translate(-f.x1,-f.y1));for(var m=t.pstyle("background-image").value,b=new Array(m.length),x=new Array(m.length),w=0,E=0;E0&&void 0!==arguments[0]?arguments[0]:S;l.eleFillStyle(e,t,n)},Y=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:N;l.colorStrokeStyle(e,B[0],B[1],B[2],t)},q=function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:V;l.colorStrokeStyle(e,z[0],z[1],z[2],t)},W=function(e,t,n,r){var a,i=l.nodePathCache=l.nodePathCache||[],o=Ue("polygon"===n?n+","+r.join(","):n,""+t,""+e,""+X),s=i[o],u=!1;return null!=s?(a=s,u=!0,c.pathCache=a):(a=new Path2D,i[o]=c.pathCache=a),{path:a,cacheHit:u}},U=t.pstyle("shape").strValue,H=t.pstyle("shape-polygon-points").pfValue;if(g){e.translate(d.x,d.y);var K=W(r,a,U,H);h=K.path,v=K.cacheHit}var Z=function(){if(!v){var n=d;g&&(n={x:0,y:0}),l.nodeShapes[l.getNodeShape(t)].draw(h||e,n.x,n.y,r,a,X,c)}g?e.fill(h):e.fill()},$=function(){for(var n=arguments.length>0&&void 0!==arguments[0]?arguments[0]:p,r=!(arguments.length>1&&void 0!==arguments[1])||arguments[1],a=u.backgrounding,i=0,o=0;o0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;l.hasPie(t)&&(l.drawPie(e,t,i),n&&(g||l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,X,c)))},J=function(){var n=arguments.length>0&&void 0!==arguments[0]&&arguments[0],i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:p;l.hasStripe(t)&&(e.save(),g?e.clip(c.pathCache):(l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,X,c),e.clip()),l.drawStripe(e,t,i),e.restore(),n&&(g||l.nodeShapes[l.getNodeShape(t)].draw(e,d.x,d.y,r,a,X,c)))},ee=function(){var t=(C>0?C:-C)*(arguments.length>0&&void 0!==arguments[0]?arguments[0]:p),n=C>0?0:255;0!==C&&(l.colorFillStyle(e,n,n,n,t),g?e.fill(h):e.fill())},te=function(){if(P>0){if(e.lineWidth=P,e.lineCap=A,e.lineJoin=_,e.setLineDash)switch(D){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash(R),e.lineDashOffset=I;break;case"solid":case"double":e.setLineDash([])}if("center"!==M){if(e.save(),e.lineWidth*=2,"inside"===M)g?e.clip(h):e.clip();else{var t=new Path2D;t.rect(-r/2-P,-a/2-P,r+2*P,a+2*P),t.addPath(h),e.clip(t,"evenodd")}g?e.stroke(h):e.stroke(),e.restore()}else g?e.stroke(h):e.stroke();if("double"===D){e.lineWidth=P/3;var n=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",g?e.stroke(h):e.stroke(),e.globalCompositeOperation=n}e.setLineDash&&e.setLineDash([])}},ne=function(){if(L>0){if(e.lineWidth=L,e.lineCap="butt",e.setLineDash)switch(O){case"dotted":e.setLineDash([1,1]);break;case"dashed":e.setLineDash([4,2]);break;case"solid":case"double":e.setLineDash([])}var n=d;g&&(n={x:0,y:0});var i=l.getNodeShape(t),o=P;"inside"===M&&(o=0),"outside"===M&&(o*=2);var s,u=(r+o+(L+F))/r,c=(a+o+(L+F))/a,h=r*u,f=a*c,p=l.nodeShapes[i].points;if(g)s=W(h,f,i,p).path;if("ellipse"===i)l.drawEllipsePath(s||e,n.x,n.y,h,f);else if(["round-diamond","round-heptagon","round-hexagon","round-octagon","round-pentagon","round-polygon","round-triangle","round-tag"].includes(i)){var v=0,y=0,m=0;"round-diamond"===i?v=1.4*(o+F+L):"round-heptagon"===i?(v=1.075*(o+F+L),m=-(o/2+F+L)/35):"round-hexagon"===i?v=1.12*(o+F+L):"round-pentagon"===i?(v=1.13*(o+F+L),m=-(o/2+F+L)/15):"round-tag"===i?(v=1.12*(o+F+L),y=.07*(o/2+L+F)):"round-triangle"===i&&(v=(o+F+L)*(Math.PI/2),m=-(o+F/2+L)/Math.PI),0!==v&&(h=r*(u=(r+v)/r),["round-hexagon","round-tag"].includes(i)||(f=a*(c=(a+v)/a)));for(var b=h/2,x=f/2,w=(X="auto"===X?Rn(h,f):X)+(o+L+F)/2,E=new Array(p.length/2),k=new Array(p.length/2),T=0;T0){if(r=r||n.position(),null==a||null==i){var d=n.padding();a=n.width()+2*d,i=n.height()+2*d}this.colorFillStyle(t,l[0],l[1],l[2],s),this.nodeShapes[u].draw(t,r.x,r.y,a+2*o,i+2*o,c),t.fill()}}}};Yd.drawNodeOverlay=qd("overlay"),Yd.drawNodeUnderlay=qd("underlay"),Yd.hasPie=function(e){return(e=e[0])._private.hasPie},Yd.hasStripe=function(e){return(e=e[0])._private.hasStripe},Yd.drawPie=function(e,t,n,r){t=t[0],r=r||t.position();var a,i=t.cy().style(),o=t.pstyle("pie-size"),s=t.pstyle("pie-hole"),l=t.pstyle("pie-start-angle").pfValue,u=r.x,c=r.y,d=t.width(),h=t.height(),f=Math.min(d,h)/2,p=0;if(this.usePaths()&&(u=0,c=0),"%"===o.units?f*=o.pfValue:void 0!==o.pfValue&&(f=o.pfValue/2),"%"===s.units?a=f*s.pfValue:void 0!==s.pfValue&&(a=s.pfValue/2),!(a>=f))for(var g=1;g<=i.pieBackgroundN;g++){var v=t.pstyle("pie-"+g+"-background-size").value,y=t.pstyle("pie-"+g+"-background-color").value,m=t.pstyle("pie-"+g+"-background-opacity").value*n,b=v/100;b+p>1&&(b=1-p);var x=1.5*Math.PI+2*Math.PI*p,w=(x+=l)+2*Math.PI*b;0===v||p>=1||p+b>1||(0===a?(e.beginPath(),e.moveTo(u,c),e.arc(u,c,f,x,w),e.closePath()):(e.beginPath(),e.arc(u,c,f,x,w),e.arc(u,c,a,w,x,!0),e.closePath()),this.colorFillStyle(e,y[0],y[1],y[2],m),e.fill(),p+=b)}},Yd.drawStripe=function(e,t,n,r){t=t[0],r=r||t.position();var a=t.cy().style(),i=r.x,o=r.y,s=t.width(),l=t.height(),u=0,c=this.usePaths();e.save();var d=t.pstyle("stripe-direction").value,h=t.pstyle("stripe-size");switch(d){case"vertical":break;case"righward":e.rotate(-Math.PI/2)}var f=s,p=l;"%"===h.units?(f*=h.pfValue,p*=h.pfValue):void 0!==h.pfValue&&(f=h.pfValue,p=h.pfValue),c&&(i=0,o=0),o-=f/2,i-=p/2;for(var g=1;g<=a.stripeBackgroundN;g++){var v=t.pstyle("stripe-"+g+"-background-size").value,y=t.pstyle("stripe-"+g+"-background-color").value,m=t.pstyle("stripe-"+g+"-background-opacity").value*n,b=v/100;b+u>1&&(b=1-u),0===v||u>=1||u+b>1||(e.beginPath(),e.rect(i,o+p*u,f,p*b),e.closePath(),this.colorFillStyle(e,y[0],y[1],y[2],m),e.fill(),u+=b)}e.restore()};var Wd,Ud={};function Hd(e,t,n){var r=e.createShader(t);if(e.shaderSource(r,n),e.compileShader(r),!e.getShaderParameter(r,e.COMPILE_STATUS))throw new Error(e.getShaderInfoLog(r));return r}function Kd(e,t,n){void 0===n&&(n=t);var r=e.makeOffscreenCanvas(t,n),a=r.context=r.getContext("2d");return r.clear=function(){return a.clearRect(0,0,r.width,r.height)},r.clear(),r}function Gd(e){var t=e.pixelRatio,n=e.cy.zoom(),r=e.cy.pan();return{zoom:n*t,pan:{x:r.x*t,y:r.y*t}}}function Zd(e,t){return!!t.picking||"solid"===e.pstyle("background-fill").value&&("none"===e.pstyle("background-image").strValue&&(0===e.pstyle("border-width").value||(0===e.pstyle("border-opacity").value||"solid"===e.pstyle("border-style").value)))}function $d(e,t){if(e.length!==t.length)return!1;for(var n=0;n>8&255)/255,n[2]=(e>>16&255)/255,n[3]=(e>>24&255)/255,n}function eh(e){return e[0]+(e[1]<<8)+(e[2]<<16)+(e[3]<<24)}function th(e,t){switch(t){case"float":return[1,e.FLOAT,4];case"vec2":return[2,e.FLOAT,4];case"vec3":return[3,e.FLOAT,4];case"vec4":return[4,e.FLOAT,4];case"int":return[1,e.INT,4];case"ivec2":return[2,e.INT,4]}}function nh(e,t,n){switch(t){case e.FLOAT:return new Float32Array(n);case e.INT:return new Int32Array(n)}}function rh(e,t,n,r,a,i){switch(t){case e.FLOAT:return new Float32Array(n.buffer,i*r,a);case e.INT:return new Int32Array(n.buffer,i*r,a)}}function ah(e,t,n,r){var a=i(th(e,n),3),o=a[0],s=a[1],l=a[2],u=nh(e,s,t*o),c=o*l,d=e.createBuffer();e.bindBuffer(e.ARRAY_BUFFER,d),e.bufferData(e.ARRAY_BUFFER,t*c,e.DYNAMIC_DRAW),e.enableVertexAttribArray(r),s===e.FLOAT?e.vertexAttribPointer(r,o,s,!1,c,0):s===e.INT&&e.vertexAttribIPointer(r,o,s,c,0),e.vertexAttribDivisor(r,1),e.bindBuffer(e.ARRAY_BUFFER,null);for(var h=new Array(t),f=0;ft.minMbLowQualFrames&&(t.motionBlurPxRatio=t.mbPxRBlurry)),t.clearingMotionBlur&&(t.motionBlurPxRatio=1),t.textureDrawLastFrame&&!d&&(c[t.NODE]=!0,c[t.SELECT_BOX]=!0);var m=n.style(),b=n.zoom(),x=void 0!==o?o:b,w=n.pan(),E={x:w.x,y:w.y},k={zoom:b,pan:{x:w.x,y:w.y}},T=t.prevViewport;void 0===T||k.zoom!==T.zoom||k.pan.x!==T.pan.x||k.pan.y!==T.pan.y||g&&!p||(t.motionBlurPxRatio=1),s&&(E=s),x*=l,E.x*=l,E.y*=l;var C=t.getCachedZSortedEles();function P(e,n,r,a,i){var o=e.globalCompositeOperation;e.globalCompositeOperation="destination-out",t.colorFillStyle(e,255,255,255,t.motionBlurTransparency),e.fillRect(n,r,a,i),e.globalCompositeOperation=o}function S(e,n){var i,l,c,d;t.clearingMotionBlur||e!==u.bufferContexts[t.MOTIONBLUR_BUFFER_NODE]&&e!==u.bufferContexts[t.MOTIONBLUR_BUFFER_DRAG]?(i=E,l=x,c=t.canvasWidth,d=t.canvasHeight):(i={x:w.x*f,y:w.y*f},l=b*f,c=t.canvasWidth*f,d=t.canvasHeight*f),e.setTransform(1,0,0,1,0,0),"motionBlur"===n?P(e,0,0,c,d):r||void 0!==n&&!n||e.clearRect(0,0,c,d),a||(e.translate(i.x,i.y),e.scale(l,l)),s&&e.translate(s.x,s.y),o&&e.scale(o,o)}if(d||(t.textureDrawLastFrame=!1),d){if(t.textureDrawLastFrame=!0,!t.textureCache){t.textureCache={},t.textureCache.bb=n.mutableElements().boundingBox(),t.textureCache.texture=t.data.bufferCanvases[t.TEXTURE_BUFFER];var B=t.data.bufferContexts[t.TEXTURE_BUFFER];B.setTransform(1,0,0,1,0,0),B.clearRect(0,0,t.canvasWidth*t.textureMult,t.canvasHeight*t.textureMult),t.render({forcedContext:B,drawOnlyNodeLayer:!0,forcedPxRatio:l*t.textureMult}),(k=t.textureCache.viewport={zoom:n.zoom(),pan:n.pan(),width:t.canvasWidth,height:t.canvasHeight}).mpan={x:(0-k.pan.x)/k.zoom,y:(0-k.pan.y)/k.zoom}}c[t.DRAG]=!1,c[t.NODE]=!1;var D=u.contexts[t.NODE],_=t.textureCache.texture;k=t.textureCache.viewport;D.setTransform(1,0,0,1,0,0),h?P(D,0,0,k.width,k.height):D.clearRect(0,0,k.width,k.height);var A=m.core("outside-texture-bg-color").value,M=m.core("outside-texture-bg-opacity").value;t.colorFillStyle(D,A[0],A[1],A[2],M),D.fillRect(0,0,k.width,k.height);b=n.zoom();S(D,!1),D.clearRect(k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l),D.drawImage(_,k.mpan.x,k.mpan.y,k.width/k.zoom/l,k.height/k.zoom/l)}else t.textureOnViewport&&!r&&(t.textureCache=null);var R=n.extent(),I=t.pinching||t.hoverData.dragging||t.swipePanning||t.data.wheelZooming||t.hoverData.draggingEles||t.cy.animated(),N=t.hideEdgesOnViewport&&I,L=[];if(L[t.NODE]=!c[t.NODE]&&h&&!t.clearedForMotionBlur[t.NODE]||t.clearingMotionBlur,L[t.NODE]&&(t.clearedForMotionBlur[t.NODE]=!0),L[t.DRAG]=!c[t.DRAG]&&h&&!t.clearedForMotionBlur[t.DRAG]||t.clearingMotionBlur,L[t.DRAG]&&(t.clearedForMotionBlur[t.DRAG]=!0),c[t.NODE]||a||i||L[t.NODE]){var z=h&&!L[t.NODE]&&1!==f;S(D=r||(z?t.data.bufferContexts[t.MOTIONBLUR_BUFFER_NODE]:u.contexts[t.NODE]),h&&!z?"motionBlur":void 0),N?t.drawCachedNodes(D,C.nondrag,l,R):t.drawLayeredElements(D,C.nondrag,l,R),t.debug&&t.drawDebugPoints(D,C.nondrag),a||h||(c[t.NODE]=!1)}if(!i&&(c[t.DRAG]||a||L[t.DRAG])){z=h&&!L[t.DRAG]&&1!==f;S(D=r||(z?t.data.bufferContexts[t.MOTIONBLUR_BUFFER_DRAG]:u.contexts[t.DRAG]),h&&!z?"motionBlur":void 0),N?t.drawCachedNodes(D,C.drag,l,R):t.drawCachedElements(D,C.drag,l,R),t.debug&&t.drawDebugPoints(D,C.drag),a||h||(c[t.DRAG]=!1)}if(this.drawSelectionRectangle(e,S),h&&1!==f){var O=u.contexts[t.NODE],V=t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_NODE],F=u.contexts[t.DRAG],X=t.data.bufferCanvases[t.MOTIONBLUR_BUFFER_DRAG],j=function(e,n,r){e.setTransform(1,0,0,1,0,0),r||!y?e.clearRect(0,0,t.canvasWidth,t.canvasHeight):P(e,0,0,t.canvasWidth,t.canvasHeight);var a=f;e.drawImage(n,0,0,t.canvasWidth*a,t.canvasHeight*a,0,0,t.canvasWidth,t.canvasHeight)};(c[t.NODE]||L[t.NODE])&&(j(O,V,L[t.NODE]),c[t.NODE]=!1),(c[t.DRAG]||L[t.DRAG])&&(j(F,X,L[t.DRAG]),c[t.DRAG]=!1)}t.prevViewport=k,t.clearingMotionBlur&&(t.clearingMotionBlur=!1,t.motionBlurCleared=!0,t.motionBlur=!0),h&&(t.motionBlurTimeout=setTimeout((function(){t.motionBlurTimeout=null,t.clearedForMotionBlur[t.NODE]=!1,t.clearedForMotionBlur[t.DRAG]=!1,t.motionBlur=!1,t.clearingMotionBlur=!d,t.mbFrames=0,c[t.NODE]=!0,c[t.DRAG]=!0,t.redraw()}),100)),r||n.emit("render")},Ud.drawSelectionRectangle=function(e,t){var n=this,r=n.cy,a=n.data,i=r.style(),o=e.drawOnlyNodeLayer,s=e.drawAllLayers,l=a.canvasNeedsRedraw,u=e.forcedContext;if(n.showFps||!o&&l[n.SELECT_BOX]&&!s){var c=u||a.contexts[n.SELECT_BOX];if(t(c),1==n.selection[4]&&(n.hoverData.selecting||n.touchData.selecting)){var d=n.cy.zoom(),h=i.core("selection-box-border-width").value/d;c.lineWidth=h,c.fillStyle="rgba("+i.core("selection-box-color").value[0]+","+i.core("selection-box-color").value[1]+","+i.core("selection-box-color").value[2]+","+i.core("selection-box-opacity").value+")",c.fillRect(n.selection[0],n.selection[1],n.selection[2]-n.selection[0],n.selection[3]-n.selection[1]),h>0&&(c.strokeStyle="rgba("+i.core("selection-box-border-color").value[0]+","+i.core("selection-box-border-color").value[1]+","+i.core("selection-box-border-color").value[2]+","+i.core("selection-box-opacity").value+")",c.strokeRect(n.selection[0],n.selection[1],n.selection[2]-n.selection[0],n.selection[3]-n.selection[1]))}if(a.bgActivePosistion&&!n.hoverData.selecting){d=n.cy.zoom();var f=a.bgActivePosistion;c.fillStyle="rgba("+i.core("active-bg-color").value[0]+","+i.core("active-bg-color").value[1]+","+i.core("active-bg-color").value[2]+","+i.core("active-bg-opacity").value+")",c.beginPath(),c.arc(f.x,f.y,i.core("active-bg-size").pfValue/d,0,2*Math.PI),c.fill()}var p=n.lastRedrawTime;if(n.showFps&&p){p=Math.round(p);var g=Math.round(1e3/p),v="1 frame = "+p+" ms = "+g+" fps";if(c.setTransform(1,0,0,1,0,0),c.fillStyle="rgba(255, 0, 0, 0.75)",c.strokeStyle="rgba(255, 0, 0, 0.75)",c.font="30px Arial",!Wd){var y=c.measureText(v);Wd=y.actualBoundingBoxAscent}c.fillText(v,0,Wd);c.strokeRect(0,Wd+10,250,20),c.fillRect(0,Wd+10,250*Math.min(g/60,1),20)}s||(l[n.SELECT_BOX]=!1)}};var ih="undefined"!=typeof Float32Array?Float32Array:Array;function oh(){var e=new ih(9);return ih!=Float32Array&&(e[1]=0,e[2]=0,e[3]=0,e[5]=0,e[6]=0,e[7]=0),e[0]=1,e[4]=1,e[8]=1,e}function sh(e){return e[0]=1,e[1]=0,e[2]=0,e[3]=0,e[4]=1,e[5]=0,e[6]=0,e[7]=0,e[8]=1,e}function lh(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=n[0],f=n[1];return e[0]=r,e[1]=a,e[2]=i,e[3]=o,e[4]=s,e[5]=l,e[6]=h*r+f*o+u,e[7]=h*a+f*s+c,e[8]=h*i+f*l+d,e}function uh(e,t,n){var r=t[0],a=t[1],i=t[2],o=t[3],s=t[4],l=t[5],u=t[6],c=t[7],d=t[8],h=Math.sin(n),f=Math.cos(n);return e[0]=f*r+h*o,e[1]=f*a+h*s,e[2]=f*i+h*l,e[3]=f*o-h*r,e[4]=f*s-h*a,e[5]=f*l-h*i,e[6]=u,e[7]=c,e[8]=d,e}function ch(e,t,n){var r=n[0],a=n[1];return e[0]=r*t[0],e[1]=r*t[1],e[2]=r*t[2],e[3]=a*t[3],e[4]=a*t[4],e[5]=a*t[5],e[6]=t[6],e[7]=t[7],e[8]=t[8],e}Math.hypot||(Math.hypot=function(){for(var e=0,t=arguments.length;t--;)e+=arguments[t]*arguments[t];return Math.sqrt(e)});var dh=function(){return n((function e(n,r,a,i){t(this,e),this.debugID=Math.floor(1e4*Math.random()),this.r=n,this.texSize=r,this.texRows=a,this.texHeight=Math.floor(r/a),this.enableWrapping=!0,this.locked=!1,this.texture=null,this.needsBuffer=!0,this.freePointer={x:0,row:0},this.keyToLocation=new Map,this.canvas=i(n,r,r),this.scratch=i(n,r,this.texHeight,"scratch")}),[{key:"lock",value:function(){this.locked=!0}},{key:"getKeys",value:function(){return new Set(this.keyToLocation.keys())}},{key:"getScale",value:function(e){var t=e.w,n=e.h,r=this.texHeight,a=this.texSize,i=r/n,o=t*i,s=n*i;return o>a&&(o=t*(i=a/t),s=n*i),{scale:i,texW:o,texH:s}}},{key:"draw",value:function(e,t,n){var r=this;if(this.locked)throw new Error("can't draw, atlas is locked");var a=this.texSize,i=this.texRows,o=this.texHeight,s=this.getScale(t),l=s.scale,u=s.texW,c=s.texH,d=function(e,r){if(n&&r){var a=r.context,i=e.x,s=e.row,u=i,c=o*s;a.save(),a.translate(u,c),a.scale(l,l),n(a,t),a.restore()}},h=[null,null],f=function(){d(r.freePointer,r.canvas),h[0]={x:r.freePointer.x,y:r.freePointer.row*o,w:u,h:c},h[1]={x:r.freePointer.x+u,y:r.freePointer.row*o,w:0,h:c},r.freePointer.x+=u,r.freePointer.x==a&&(r.freePointer.x=0,r.freePointer.row++)},p=function(){r.freePointer.x=0,r.freePointer.row++};if(this.freePointer.x+u<=a)f();else{if(this.freePointer.row>=i-1)return!1;this.freePointer.x===a?(p(),f()):this.enableWrapping?function(){var e=r.scratch,t=r.canvas;e.clear(),d({x:0,row:0},e);var n=a-r.freePointer.x,i=u-n,s=o,l=r.freePointer.x,f=r.freePointer.row*o,p=n;t.context.drawImage(e,0,0,p,s,l,f,p,s),h[0]={x:l,y:f,w:p,h:c};var g=n,v=(r.freePointer.row+1)*o,y=i;t&&t.context.drawImage(e,g,0,y,s,0,v,y,s),h[1]={x:0,y:v,w:y,h:c},r.freePointer.x=i,r.freePointer.row++}():(p(),f())}return this.keyToLocation.set(e,h),this.needsBuffer=!0,h}},{key:"getOffsets",value:function(e){return this.keyToLocation.get(e)}},{key:"isEmpty",value:function(){return 0===this.freePointer.x&&0===this.freePointer.row}},{key:"canFit",value:function(e){if(this.locked)return!1;var t=this.texSize,n=this.texRows,r=this.getScale(e).texW;return!(this.freePointer.x+r>t)||this.freePointer.row1&&void 0!==arguments[1]?arguments[1]:{},i=a.forceRedraw,o=void 0!==i&&i,s=a.filterEle,l=void 0===s?function(){return!0}:s,u=a.filterType,c=void 0===u?function(){return!0}:u,d=!1,h=!1,f=r(e);try{for(f.s();!(t=f.n()).done;){var p=t.value;if(l(p)){var g,v=r(this.renderTypes.values());try{var y=function(){var e=g.value,t=e.type;if(c(t)){var r=n.collections.get(e.collection),a=e.getKey(p),i=Array.isArray(a)?a:[a];if(o)i.forEach((function(e){return r.markKeyForGC(e)})),h=!0;else{var s=e.getID?e.getID(p):p.id(),l=n._key(t,s),u=n.typeAndIdToKey.get(l);void 0===u||$d(i,u)||(d=!0,n.typeAndIdToKey.delete(l),u.forEach((function(e){return r.markKeyForGC(e)})))}}};for(v.s();!(g=v.n()).done;)y()}catch(e){v.e(e)}finally{v.f()}}}}catch(e){f.e(e)}finally{f.f()}return h&&(this.gc(),d=!1),d}},{key:"gc",value:function(){var e,t=r(this.collections.values());try{for(t.s();!(e=t.n()).done;){e.value.gc()}}catch(e){t.e(e)}finally{t.f()}}},{key:"getOrCreateAtlas",value:function(e,t,n,r){var a=this.renderTypes.get(t),i=this.collections.get(a.collection),o=!1,s=i.draw(r,n,(function(t){a.drawClipped?(t.save(),t.beginPath(),t.rect(0,0,n.w,n.h),t.clip(),a.drawElement(t,e,n,!0,!0),t.restore()):a.drawElement(t,e,n,!0,!0),o=!0}));if(o){var l=a.getID?a.getID(e):e.id(),u=this._key(t,l);this.typeAndIdToKey.has(u)?this.typeAndIdToKey.get(u).push(r):this.typeAndIdToKey.set(u,[r])}return s}},{key:"getAtlasInfo",value:function(e,t){var n=this,r=this.renderTypes.get(t),a=r.getKey(e);return(Array.isArray(a)?a:[a]).map((function(a){var o=r.getBoundingBox(e,a),s=n.getOrCreateAtlas(e,t,o,a),l=i(s.getOffsets(a),2),u=l[0];return{atlas:s,tex:u,tex1:u,tex2:l[1],bb:o}}))}},{key:"getDebugInfo",value:function(){var e,t=[],n=r(this.collections);try{for(n.s();!(e=n.n()).done;){var a=i(e.value,2),o=a[0],s=a[1].getCounts(),l=s.keyCount,u=s.atlasCount;t.push({type:o,keyCount:l,atlasCount:u})}}catch(e){n.e(e)}finally{n.f()}return t}}])}(),ph=function(){return n((function e(n){t(this,e),this.globalOptions=n,this.atlasSize=n.webglTexSize,this.maxAtlasesPerBatch=n.webglTexPerBatch,this.batchAtlases=[]}),[{key:"getMaxAtlasesPerBatch",value:function(){return this.maxAtlasesPerBatch}},{key:"getAtlasSize",value:function(){return this.atlasSize}},{key:"getIndexArray",value:function(){return Array.from({length:this.maxAtlasesPerBatch},(function(e,t){return t}))}},{key:"startBatch",value:function(){this.batchAtlases=[]}},{key:"getAtlasCount",value:function(){return this.batchAtlases.length}},{key:"getAtlases",value:function(){return this.batchAtlases}},{key:"canAddToCurrentBatch",value:function(e){return this.batchAtlases.length!==this.maxAtlasesPerBatch||this.batchAtlases.includes(e)}},{key:"getAtlasIndexForBatch",value:function(e){var t=this.batchAtlases.indexOf(e);if(t<0){if(this.batchAtlases.length===this.maxAtlasesPerBatch)throw new Error("cannot add more atlases to batch");this.batchAtlases.push(e),t=this.batchAtlases.length-1}return t}}])}(),gh={SCREEN:{name:"screen",screen:!0},PICKING:{name:"picking",picking:!0}},vh=1,yh=2,mh=function(){return n((function e(n,r,a){t(this,e),this.r=n,this.gl=r,this.maxInstances=a.webglBatchSize,this.atlasSize=a.webglTexSize,this.bgColor=a.bgColor,this.debug=a.webglDebug,this.batchDebugInfo=[],a.enableWrapping=!0,a.createTextureCanvas=Kd,this.atlasManager=new fh(n,a),this.batchManager=new ph(a),this.simpleShapeOptions=new Map,this.program=this._createShaderProgram(gh.SCREEN),this.pickingProgram=this._createShaderProgram(gh.PICKING),this.vao=this._createVAO()}),[{key:"addAtlasCollection",value:function(e,t){this.atlasManager.addAtlasCollection(e,t)}},{key:"addTextureAtlasRenderType",value:function(e,t){this.atlasManager.addRenderType(e,t)}},{key:"addSimpleShapeRenderType",value:function(e,t){this.simpleShapeOptions.set(e,t)}},{key:"invalidate",value:function(e){var t=(arguments.length>1&&void 0!==arguments[1]?arguments[1]:{}).type,n=this.atlasManager;return t?n.invalidate(e,{filterType:function(e){return e===t},forceRedraw:!0}):n.invalidate(e)}},{key:"gc",value:function(){this.atlasManager.gc()}},{key:"_createShaderProgram",value:function(e){var t=this.gl,n="#version 300 es\n precision highp float;\n\n uniform mat3 uPanZoomMatrix;\n uniform int uAtlasSize;\n \n // instanced\n in vec2 aPosition; // a vertex from the unit square\n \n in mat3 aTransform; // used to transform verticies, eg into a bounding box\n in int aVertType; // the type of thing we are rendering\n\n // the z-index that is output when using picking mode\n in vec4 aIndex;\n \n // For textures\n in int aAtlasId; // which shader unit/atlas to use\n in vec4 aTex; // x/y/w/h of texture in atlas\n\n // for edges\n in vec4 aPointAPointB;\n in vec4 aPointCPointD;\n in vec2 aLineWidth; // also used for node border width\n\n // simple shapes\n in vec4 aCornerRadius; // for round-rectangle [top-right, bottom-right, top-left, bottom-left]\n in vec4 aColor; // also used for edges\n in vec4 aBorderColor; // aLineWidth is used for border width\n\n // output values passed to the fragment shader\n out vec2 vTexCoord;\n out vec4 vColor;\n out vec2 vPosition;\n // flat values are not interpolated\n flat out int vAtlasId; \n flat out int vVertType;\n flat out vec2 vTopRight;\n flat out vec2 vBotLeft;\n flat out vec4 vCornerRadius;\n flat out vec4 vBorderColor;\n flat out vec2 vBorderWidth;\n flat out vec4 vIndex;\n \n void main(void) {\n int vid = gl_VertexID;\n vec2 position = aPosition; // TODO make this a vec3, simplifies some code below\n\n if(aVertType == ".concat(0,") {\n float texX = aTex.x; // texture coordinates\n float texY = aTex.y;\n float texW = aTex.z;\n float texH = aTex.w;\n\n if(vid == 1 || vid == 2 || vid == 4) {\n texX += texW;\n }\n if(vid == 2 || vid == 4 || vid == 5) {\n texY += texH;\n }\n\n float d = float(uAtlasSize);\n vTexCoord = vec2(texX / d, texY / d); // tex coords must be between 0 and 1\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n }\n else if(aVertType == ").concat(4," || aVertType == ").concat(7," \n || aVertType == ").concat(5," || aVertType == ").concat(6,") { // simple shapes\n\n // the bounding box is needed by the fragment shader\n vBotLeft = (aTransform * vec3(0, 0, 1)).xy; // flat\n vTopRight = (aTransform * vec3(1, 1, 1)).xy; // flat\n vPosition = (aTransform * vec3(position, 1)).xy; // will be interpolated\n\n // calculations are done in the fragment shader, just pass these along\n vColor = aColor;\n vCornerRadius = aCornerRadius;\n vBorderColor = aBorderColor;\n vBorderWidth = aLineWidth;\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n }\n else if(aVertType == ").concat(1,") {\n vec2 source = aPointAPointB.xy;\n vec2 target = aPointAPointB.zw;\n\n // adjust the geometry so that the line is centered on the edge\n position.y = position.y - 0.5;\n\n // stretch the unit square into a long skinny rectangle\n vec2 xBasis = target - source;\n vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x));\n vec2 point = source + xBasis * position.x + yBasis * aLineWidth[0] * position.y;\n\n gl_Position = vec4(uPanZoomMatrix * vec3(point, 1.0), 1.0);\n vColor = aColor;\n } \n else if(aVertType == ").concat(2,") {\n vec2 pointA = aPointAPointB.xy;\n vec2 pointB = aPointAPointB.zw;\n vec2 pointC = aPointCPointD.xy;\n vec2 pointD = aPointCPointD.zw;\n\n // adjust the geometry so that the line is centered on the edge\n position.y = position.y - 0.5;\n\n vec2 p0, p1, p2, pos;\n if(position.x == 0.0) { // The left side of the unit square\n p0 = pointA;\n p1 = pointB;\n p2 = pointC;\n pos = position;\n } else { // The right side of the unit square, use same approach but flip the geometry upside down\n p0 = pointD;\n p1 = pointC;\n p2 = pointB;\n pos = vec2(0.0, -position.y);\n }\n\n vec2 p01 = p1 - p0;\n vec2 p12 = p2 - p1;\n vec2 p21 = p1 - p2;\n\n // Find the normal vector.\n vec2 tangent = normalize(normalize(p12) + normalize(p01));\n vec2 normal = vec2(-tangent.y, tangent.x);\n\n // Find the vector perpendicular to p0 -> p1.\n vec2 p01Norm = normalize(vec2(-p01.y, p01.x));\n\n // Determine the bend direction.\n float sigma = sign(dot(p01 + p21, normal));\n float width = aLineWidth[0];\n\n if(sign(pos.y) == -sigma) {\n // This is an intersecting vertex. Adjust the position so that there's no overlap.\n vec2 point = 0.5 * width * normal * -sigma / dot(normal, p01Norm);\n gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0);\n } else {\n // This is a non-intersecting vertex. Treat it like a mitre join.\n vec2 point = 0.5 * width * normal * sigma * dot(normal, p01Norm);\n gl_Position = vec4(uPanZoomMatrix * vec3(p1 + point, 1.0), 1.0);\n }\n\n vColor = aColor;\n } \n else if(aVertType == ").concat(3," && vid < 3) {\n // massage the first triangle into an edge arrow\n if(vid == 0)\n position = vec2(-0.15, -0.3);\n if(vid == 1)\n position = vec2( 0.0, 0.0);\n if(vid == 2)\n position = vec2( 0.15, -0.3);\n\n gl_Position = vec4(uPanZoomMatrix * aTransform * vec3(position, 1.0), 1.0);\n vColor = aColor;\n }\n else {\n gl_Position = vec4(2.0, 0.0, 0.0, 1.0); // discard vertex by putting it outside webgl clip space\n }\n\n vAtlasId = aAtlasId;\n vVertType = aVertType;\n vIndex = aIndex;\n }\n "),r=this.batchManager.getIndexArray(),a="#version 300 es\n precision highp float;\n\n // declare texture unit for each texture atlas in the batch\n ".concat(r.map((function(e){return"uniform sampler2D uTexture".concat(e,";")})).join("\n\t"),"\n\n uniform vec4 uBGColor;\n uniform float uZoom;\n\n in vec2 vTexCoord;\n in vec4 vColor;\n in vec2 vPosition; // model coordinates\n\n flat in int vAtlasId;\n flat in vec4 vIndex;\n flat in int vVertType;\n flat in vec2 vTopRight;\n flat in vec2 vBotLeft;\n flat in vec4 vCornerRadius;\n flat in vec4 vBorderColor;\n flat in vec2 vBorderWidth;\n\n out vec4 outColor;\n\n ").concat("\n float circleSD(vec2 p, float r) {\n return distance(vec2(0), p) - r; // signed distance\n }\n","\n ").concat("\n float rectangleSD(vec2 p, vec2 b) {\n vec2 d = abs(p)-b;\n return distance(vec2(0),max(d,0.0)) + min(max(d.x,d.y),0.0);\n }\n","\n ").concat("\n float roundRectangleSD(vec2 p, vec2 b, vec4 cr) {\n cr.xy = (p.x > 0.0) ? cr.xy : cr.zw;\n cr.x = (p.y > 0.0) ? cr.x : cr.y;\n vec2 q = abs(p) - b + cr.x;\n return min(max(q.x, q.y), 0.0) + distance(vec2(0), max(q, 0.0)) - cr.x;\n }\n","\n ").concat("\n float ellipseSD(vec2 p, vec2 ab) {\n p = abs( p ); // symmetry\n\n // find root with Newton solver\n vec2 q = ab*(p-ab);\n float w = (q.x1.0) ? d : -d;\n }\n","\n\n vec4 blend(vec4 top, vec4 bot) { // blend colors with premultiplied alpha\n return vec4( \n top.rgb + (bot.rgb * (1.0 - top.a)),\n top.a + (bot.a * (1.0 - top.a)) \n );\n }\n\n vec4 distInterp(vec4 cA, vec4 cB, float d) { // interpolate color using Signed Distance\n // scale to the zoom level so that borders don't look blurry when zoomed in\n // note 1.5 is an aribitrary value chosen because it looks good\n return mix(cA, cB, 1.0 - smoothstep(0.0, 1.5 / uZoom, abs(d))); \n }\n\n void main(void) {\n if(vVertType == ").concat(0,") {\n // look up the texel from the texture unit\n ").concat(r.map((function(e){return"if(vAtlasId == ".concat(e,") outColor = texture(uTexture").concat(e,", vTexCoord);")})).join("\n\telse "),"\n } \n else if(vVertType == ").concat(3,") {\n // mimics how canvas renderer uses context.globalCompositeOperation = 'destination-out';\n outColor = blend(vColor, uBGColor);\n outColor.a = 1.0; // make opaque, masks out line under arrow\n }\n else if(vVertType == ").concat(4," && vBorderWidth == vec2(0.0)) { // simple rectangle with no border\n outColor = vColor; // unit square is already transformed to the rectangle, nothing else needs to be done\n }\n else if(vVertType == ").concat(4," || vVertType == ").concat(7," \n || vVertType == ").concat(5," || vVertType == ").concat(6,") { // use SDF\n\n float outerBorder = vBorderWidth[0];\n float innerBorder = vBorderWidth[1];\n float borderPadding = outerBorder * 2.0;\n float w = vTopRight.x - vBotLeft.x - borderPadding;\n float h = vTopRight.y - vBotLeft.y - borderPadding;\n vec2 b = vec2(w/2.0, h/2.0); // half width, half height\n vec2 p = vPosition - vec2(vTopRight.x - b[0] - outerBorder, vTopRight.y - b[1] - outerBorder); // translate to center\n\n float d; // signed distance\n if(vVertType == ").concat(4,") {\n d = rectangleSD(p, b);\n } else if(vVertType == ").concat(7," && w == h) {\n d = circleSD(p, b.x); // faster than ellipse\n } else if(vVertType == ").concat(7,") {\n d = ellipseSD(p, b);\n } else {\n d = roundRectangleSD(p, b, vCornerRadius.wzyx);\n }\n\n // use the distance to interpolate a color to smooth the edges of the shape, doesn't need multisampling\n // we must smooth colors inwards, because we can't change pixels outside the shape's bounding box\n if(d > 0.0) {\n if(d > outerBorder) {\n discard;\n } else {\n outColor = distInterp(vBorderColor, vec4(0), d - outerBorder);\n }\n } else {\n if(d > innerBorder) {\n vec4 outerColor = outerBorder == 0.0 ? vec4(0) : vBorderColor;\n vec4 innerBorderColor = blend(vBorderColor, vColor);\n outColor = distInterp(innerBorderColor, outerColor, d);\n } \n else {\n vec4 outerColor;\n if(innerBorder == 0.0 && outerBorder == 0.0) {\n outerColor = vec4(0);\n } else if(innerBorder == 0.0) {\n outerColor = vBorderColor;\n } else {\n outerColor = blend(vBorderColor, vColor);\n }\n outColor = distInterp(vColor, outerColor, d - innerBorder);\n }\n }\n }\n else {\n outColor = vColor;\n }\n\n ").concat(e.picking?"if(outColor.a == 0.0) discard;\n else outColor = vIndex;":"","\n }\n "),i=function(e,t,n){var r=Hd(e,e.VERTEX_SHADER,t),a=Hd(e,e.FRAGMENT_SHADER,n),i=e.createProgram();if(e.attachShader(i,r),e.attachShader(i,a),e.linkProgram(i),!e.getProgramParameter(i,e.LINK_STATUS))throw new Error("Could not initialize shaders");return i}(t,n,a);i.aPosition=t.getAttribLocation(i,"aPosition"),i.aIndex=t.getAttribLocation(i,"aIndex"),i.aVertType=t.getAttribLocation(i,"aVertType"),i.aTransform=t.getAttribLocation(i,"aTransform"),i.aAtlasId=t.getAttribLocation(i,"aAtlasId"),i.aTex=t.getAttribLocation(i,"aTex"),i.aPointAPointB=t.getAttribLocation(i,"aPointAPointB"),i.aPointCPointD=t.getAttribLocation(i,"aPointCPointD"),i.aLineWidth=t.getAttribLocation(i,"aLineWidth"),i.aColor=t.getAttribLocation(i,"aColor"),i.aCornerRadius=t.getAttribLocation(i,"aCornerRadius"),i.aBorderColor=t.getAttribLocation(i,"aBorderColor"),i.uPanZoomMatrix=t.getUniformLocation(i,"uPanZoomMatrix"),i.uAtlasSize=t.getUniformLocation(i,"uAtlasSize"),i.uBGColor=t.getUniformLocation(i,"uBGColor"),i.uZoom=t.getUniformLocation(i,"uZoom"),i.uTextures=[];for(var o=0;o1&&void 0!==arguments[1]?arguments[1]:gh.SCREEN;this.panZoomMatrix=e,this.renderTarget=t,this.batchDebugInfo=[],this.wrappedCount=0,this.simpleCount=0,this.startBatch()}},{key:"startBatch",value:function(){this.instanceCount=0,this.batchManager.startBatch()}},{key:"endFrame",value:function(){this.endBatch()}},{key:"_isVisible",value:function(e,t){return!!e.visible()&&(!t||!t.isVisible||t.isVisible(e))}},{key:"drawTexture",value:function(e,t,n){var a=this.atlasManager,o=this.batchManager,s=a.getRenderTypeOpts(n);if(this._isVisible(e,s)&&(!e.isEdge()||this._isValidEdge(e))){if(this.renderTarget.picking&&s.getTexPickingMode){var l=s.getTexPickingMode(e);if(l===vh)return;if(l==yh)return void this.drawPickingRectangle(e,t,n)}var u,c=r(a.getAtlasInfo(e,n));try{for(c.s();!(u=c.n()).done;){var d=u.value,h=d.atlas,f=d.tex1,p=d.tex2;o.canAddToCurrentBatch(h)||this.endBatch();for(var g=o.getAtlasIndexForBatch(h),v=0,y=[[f,!0],[p,!1]];v=this.maxInstances&&this.endBatch()}}}}catch(e){c.e(e)}finally{c.f()}}}},{key:"setTransformMatrix",value:function(e,t,n,r){var a=!(arguments.length>4&&void 0!==arguments[4])||arguments[4],i=0;if(n.shapeProps&&n.shapeProps.padding&&(i=e.pstyle(n.shapeProps.padding).pfValue),r){var o=r.bb,s=r.tex1,l=r.tex2,u=s.w/(s.w+l.w);a||(u=1-u);var c=this._getAdjustedBB(o,i,a,u);this._applyTransformMatrix(t,c,n,e)}else{var d=n.getBoundingBox(e),h=this._getAdjustedBB(d,i,!0,1);this._applyTransformMatrix(t,h,n,e)}}},{key:"_applyTransformMatrix",value:function(e,t,n,r){var a,i;sh(e);var o=n.getRotation?n.getRotation(r):0;if(0!==o){var s=n.getRotationPoint(r);lh(e,e,[s.x,s.y]),uh(e,e,o);var l=n.getRotationOffset(r);a=l.x+(t.xOffset||0),i=l.y+(t.yOffset||0)}else a=t.x1,i=t.y1;lh(e,e,[a,i]),ch(e,e,[t.w,t.h])}},{key:"_getAdjustedBB",value:function(e,t,n,r){var a=e.x1,i=e.y1,o=e.w,s=e.h;t&&(a-=t,i-=t,o+=2*t,s+=2*t);var l=0,u=o*r;return n&&r<1?o=u:!n&&r<1&&(a+=l=o-u,o=u),{x1:a,y1:i,w:o,h:s,xOffset:l,yOffset:e.yOffset}}},{key:"drawPickingRectangle",value:function(e,t,n){var r=this.atlasManager.getRenderTypeOpts(n),a=this.instanceCount;this.vertTypeBuffer.getView(a)[0]=4,Jd(t,this.indexBuffer.getView(a)),Qd([0,0,0],1,this.colorBuffer.getView(a));var i=this.transformBuffer.getMatrixView(a);this.setTransformMatrix(e,i,r),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}},{key:"drawNode",value:function(e,t,n){var r=this.simpleShapeOptions.get(n);if(this._isVisible(e,r)){var a=r.shapeProps,i=this._getVertTypeForShape(e,a.shape);if(void 0===i||r.isSimple&&!r.isSimple(e,this.renderTarget))this.drawTexture(e,t,n);else{var o=this.instanceCount;if(this.vertTypeBuffer.getView(o)[0]=i,5===i||6===i){var s=r.getBoundingBox(e),l=this._getCornerRadius(e,a.radius,s),u=this.cornerRadiusBuffer.getView(o);u[0]=l,u[1]=l,u[2]=l,u[3]=l,6===i&&(u[0]=0,u[2]=0)}Jd(t,this.indexBuffer.getView(o));var c=this.renderTarget.picking?1:"node-body"===n?e.effectiveOpacity():1,d=this.renderTarget.picking?1:e.pstyle(a.opacity).value*c;Qd(e.pstyle(a.color).value,d,this.colorBuffer.getView(o));var h=this.lineWidthBuffer.getView(o);if(h[0]=0,h[1]=0,a.border){var f=e.pstyle("border-width").value;if(f>0){Qd(e.pstyle("border-color").value,c*e.pstyle("border-opacity").value,this.borderColorBuffer.getView(o));var p=e.pstyle("border-position").value;if("inside"===p)h[0]=0,h[1]=-f;else if("outside"===p)h[0]=f,h[1]=0;else{var g=f/2;h[0]=g,h[1]=-g}}}var v=this.transformBuffer.getMatrixView(o);this.setTransformMatrix(e,v,r),this.simpleCount++,this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},{key:"_getVertTypeForShape",value:function(e,t){switch(e.pstyle(t).value){case"rectangle":return 4;case"ellipse":return 7;case"roundrectangle":case"round-rectangle":return 5;case"bottom-round-rectangle":return 6;default:return}}},{key:"_getCornerRadius",value:function(e,t,n){var r=n.w,a=n.h;if("auto"===e.pstyle(t).value)return Mn(r,a);var i=e.pstyle(t).pfValue,o=r/2,s=a/2;return Math.min(i,s,o)}},{key:"drawEdgeArrow",value:function(e,t,n){if(e.visible()){var r,a,i,o=e._private.rscratch;if("source"===n?(r=o.arrowStartX,a=o.arrowStartY,i=o.srcArrowAngle):(r=o.arrowEndX,a=o.arrowEndY,i=o.tgtArrowAngle),!(isNaN(r)||null==r||isNaN(a)||null==a||isNaN(i)||null==i))if("none"!==e.pstyle(n+"-arrow-shape").value){var s=e.pstyle(n+"-arrow-color").value,l=e.pstyle("opacity").value*e.pstyle("line-opacity").value,u=e.pstyle("width").pfValue,c=e.pstyle("arrow-scale").value,d=this.r.getArrowWidth(u,c),h=this.instanceCount,f=this.transformBuffer.getMatrixView(h);sh(f),lh(f,f,[r,a]),ch(f,f,[d,d]),uh(f,f,i),this.vertTypeBuffer.getView(h)[0]=3,Jd(t,this.indexBuffer.getView(h)),Qd(s,l,this.colorBuffer.getView(h)),this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}}}},{key:"drawEdgeLine",value:function(e,t){if(e.visible()){var n=this._getEdgePoints(e);if(n){var r=e.pstyle("opacity").value,a=e.pstyle("line-opacity").value,i=e.pstyle("width").pfValue,o=e.pstyle("line-color").value,s=r*a;if(n.length/2+this.instanceCount>this.maxInstances&&this.endBatch(),4==n.length){var l=this.instanceCount;this.vertTypeBuffer.getView(l)[0]=1,Jd(t,this.indexBuffer.getView(l)),Qd(o,s,this.colorBuffer.getView(l)),this.lineWidthBuffer.getView(l)[0]=i;var u=this.pointAPointBBuffer.getView(l);u[0]=n[0],u[1]=n[1],u[2]=n[2],u[3]=n[3],this.instanceCount++,this.instanceCount>=this.maxInstances&&this.endBatch()}else for(var c=0;c=this.maxInstances&&this.endBatch()}}}}},{key:"_isValidEdge",value:function(e){var t=e._private.rscratch;return!t.badLine&&null!=t.allpts&&!isNaN(t.allpts[0])}},{key:"_getEdgePoints",value:function(e){var t=e._private.rscratch;if(this._isValidEdge(e)){var n=t.allpts;if(4==n.length)return n;var r=this._getNumSegments(e);return this._getCurveSegmentPoints(n,r)}}},{key:"_getNumSegments",value:function(e){return Math.min(Math.max(15,5),this.maxInstances)}},{key:"_getCurveSegmentPoints",value:function(e,t){if(4==e.length)return e;for(var n=Array(2*(t+1)),r=0;r<=t;r++)if(0==r)n[0]=e[0],n[1]=e[1];else if(r==t)n[2*r]=e[e.length-2],n[2*r+1]=e[e.length-1];else{var a=r/t;this._setCurvePoint(e,a,n,2*r)}return n}},{key:"_setCurvePoint",value:function(e,t,n,r){if(!(e.length<=2)){for(var a=Array(e.length-2),i=0;i0}},u=function(e){return"yes"===e.pstyle("text-events").strValue?yh:vh},c=function(e){var t=e.position(),n=t.x,r=t.y,a=e.outerWidth(),i=e.outerHeight();return{w:a,h:i,x1:n-a/2,y1:r-i/2}};n.drawing.addAtlasCollection("node",{texRows:e.webglTexRowsNodes}),n.drawing.addAtlasCollection("label",{texRows:e.webglTexRows}),n.drawing.addTextureAtlasRenderType("node-body",{collection:"node",getKey:t.getStyleKey,getBoundingBox:t.getElementBox,drawElement:t.drawElement}),n.drawing.addSimpleShapeRenderType("node-body",{getBoundingBox:c,isSimple:Zd,shapeProps:{shape:"shape",color:"background-color",opacity:"background-opacity",radius:"corner-radius",border:!0}}),n.drawing.addSimpleShapeRenderType("node-overlay",{getBoundingBox:c,isVisible:l("overlay"),shapeProps:{shape:"overlay-shape",color:"overlay-color",opacity:"overlay-opacity",padding:"overlay-padding",radius:"overlay-corner-radius"}}),n.drawing.addSimpleShapeRenderType("node-underlay",{getBoundingBox:c,isVisible:l("underlay"),shapeProps:{shape:"underlay-shape",color:"underlay-color",opacity:"underlay-opacity",padding:"underlay-padding",radius:"underlay-corner-radius"}}),n.drawing.addTextureAtlasRenderType("label",{collection:"label",getTexPickingMode:u,getKey:wh(t.getLabelKey,null),getBoundingBox:Eh(t.getLabelBox,null),drawClipped:!0,drawElement:t.drawLabel,getRotation:o(null),getRotationPoint:t.getLabelRotationPoint,getRotationOffset:t.getLabelRotationOffset,isVisible:s("label")}),n.drawing.addTextureAtlasRenderType("edge-source-label",{collection:"label",getTexPickingMode:u,getKey:wh(t.getSourceLabelKey,"source"),getBoundingBox:Eh(t.getSourceLabelBox,"source"),drawClipped:!0,drawElement:t.drawSourceLabel,getRotation:o("source"),getRotationPoint:t.getSourceLabelRotationPoint,getRotationOffset:t.getSourceLabelRotationOffset,isVisible:s("source-label")}),n.drawing.addTextureAtlasRenderType("edge-target-label",{collection:"label",getTexPickingMode:u,getKey:wh(t.getTargetLabelKey,"target"),getBoundingBox:Eh(t.getTargetLabelBox,"target"),drawClipped:!0,drawElement:t.drawTargetLabel,getRotation:o("target"),getRotationPoint:t.getTargetLabelRotationPoint,getRotationOffset:t.getTargetLabelRotationOffset,isVisible:s("target-label")});var d=Ae((function(){console.log("garbage collect flag set"),n.data.gc=!0}),1e4);n.onUpdateEleCalcs((function(e,t){var r=!1;t&&t.length>0&&(r|=n.drawing.invalidate(t)),r&&d()})),function(e){var t=e.render;e.render=function(n){n=n||{};var r=e.cy;e.webgl&&(r.zoom()>gd?(!function(e){var t=e.data.contexts[e.WEBGL];t.clear(t.COLOR_BUFFER_BIT|t.DEPTH_BUFFER_BIT)}(e),t.call(e,n)):(!function(e){var t=function(t){t.save(),t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,e.canvasWidth,e.canvasHeight),t.restore()};t(e.data.contexts[e.NODE]),t(e.data.contexts[e.DRAG])}(e),Ch(e,n,gh.SCREEN)))};var n=e.matchCanvasSize;e.matchCanvasSize=function(t){n.call(e,t),e.pickingFrameBuffer.setFramebufferAttachmentSizes(e.canvasWidth,e.canvasHeight),e.pickingFrameBuffer.needsDraw=!0},e.findNearestElements=function(t,n,a,o){return function(e,t,n){var a,o,s,l=function(e,t,n){var r,a,o,s,l=Gd(e),u=l.pan,c=l.zoom,d=function(e,t,n,r,a){var i=r*n+t.x,o=a*n+t.y;return[i,o=Math.round(e.canvasHeight-o)]}(e,u,c,t,n),h=i(d,2),f=h[0],p=h[1],g=6;if(r=f-g/2,a=p-g/2,s=g,0===(o=g)||0===s)return[];var v=e.data.contexts[e.WEBGL];v.bindFramebuffer(v.FRAMEBUFFER,e.pickingFrameBuffer),e.pickingFrameBuffer.needsDraw&&(v.viewport(0,0,v.canvas.width,v.canvas.height),Ch(e,null,gh.PICKING),e.pickingFrameBuffer.needsDraw=!1);var y=o*s,m=new Uint8Array(4*y);v.readPixels(r,a,o,s,v.RGBA,v.UNSIGNED_BYTE,m),v.bindFramebuffer(v.FRAMEBUFFER,null);for(var b=new Set,x=0;x=0&&b.add(w)}return b}(e,t,n),u=e.getCachedZSortedEles(),c=r(l);try{for(c.s();!(s=c.n()).done;){var d=u[s.value];if(!a&&d.isNode()&&(a=d),!o&&d.isEdge()&&(o=d),a&&o)break}}catch(e){c.e(e)}finally{c.f()}return[a,o].filter(Boolean)}(e,t,n)};var a=e.invalidateCachedZSortedEles;e.invalidateCachedZSortedEles=function(){a.call(e),e.pickingFrameBuffer.needsDraw=!0};var o=e.notify;e.notify=function(t,n){o.call(e,t,n),"viewport"===t||"bounds"===t?e.pickingFrameBuffer.needsDraw=!0:"background"===t&&e.drawing.invalidate(n,{type:"node-body"})}}(n)};var wh=function(e,t){return function(n){var r=e(n),a=xh(n,t);return a.length>1?a.map((function(e,t){return"".concat(r,"_").concat(t)})):r}},Eh=function(e,t){return function(n,r){var a=e(n);if("string"==typeof r){var i=r.indexOf("_");if(i>0){var o=Number(r.substring(i+1)),s=xh(n,t),l=a.h/s.length,u=l*o,c=a.y1+u;return{x1:a.x1,w:a.w,y1:c,h:l,yOffset:u}}}return a}};function kh(e,t){var n=e.canvasWidth,r=e.canvasHeight,a=Gd(e),i=a.pan,o=a.zoom;t.setTransform(1,0,0,1,0,0),t.clearRect(0,0,n,r),t.translate(i.x,i.y),t.scale(o,o)}function Th(e,t,n){var r=e.drawing;t+=1,n.isNode()?(r.drawNode(n,t,"node-underlay"),r.drawNode(n,t,"node-body"),r.drawTexture(n,t,"label"),r.drawNode(n,t,"node-overlay")):(r.drawEdgeLine(n,t),r.drawEdgeArrow(n,t,"source"),r.drawEdgeArrow(n,t,"target"),r.drawTexture(n,t,"label"),r.drawTexture(n,t,"edge-source-label"),r.drawTexture(n,t,"edge-target-label"))}function Ch(e,t,n){var a;e.webglDebug&&(a=performance.now());var i=e.drawing,o=0;if(n.screen&&e.data.canvasNeedsRedraw[e.SELECT_BOX]&&function(e,t){e.drawSelectionRectangle(t,(function(t){return kh(e,t)}))}(e,t),e.data.canvasNeedsRedraw[e.NODE]||n.picking){var s=e.data.contexts[e.WEBGL];n.screen?(s.clearColor(0,0,0,0),s.enable(s.BLEND),s.blendFunc(s.ONE,s.ONE_MINUS_SRC_ALPHA)):s.disable(s.BLEND),s.clear(s.COLOR_BUFFER_BIT|s.DEPTH_BUFFER_BIT),s.viewport(0,0,s.canvas.width,s.canvas.height);var l=function(e){var t=e.canvasWidth,n=e.canvasHeight,r=Gd(e),a=r.pan,i=r.zoom,o=oh();lh(o,o,[a.x,a.y]),ch(o,o,[i,i]);var s=oh();!function(e,t,n){e[0]=2/t,e[1]=0,e[2]=0,e[3]=0,e[4]=-2/n,e[5]=0,e[6]=-1,e[7]=1,e[8]=1}(s,t,n);var l,u,c,d,h,f,p,g,v,y,m,b,x,w,E,k,T,C,P,S,B,D=oh();return l=D,c=o,d=(u=s)[0],h=u[1],f=u[2],p=u[3],g=u[4],v=u[5],y=u[6],m=u[7],b=u[8],x=c[0],w=c[1],E=c[2],k=c[3],T=c[4],C=c[5],P=c[6],S=c[7],B=c[8],l[0]=x*d+w*p+E*y,l[1]=x*h+w*g+E*m,l[2]=x*f+w*v+E*b,l[3]=k*d+T*p+C*y,l[4]=k*h+T*g+C*m,l[5]=k*f+T*v+C*b,l[6]=P*d+S*p+B*y,l[7]=P*h+S*g+B*m,l[8]=P*f+S*v+B*b,D}(e),u=e.getCachedZSortedEles();if(o=u.length,i.startFrame(l,n),n.screen){for(var c=0;c0&&i>0){h.clearRect(0,0,a,i),h.globalCompositeOperation="source-over";var f=this.getCachedZSortedEles();if(e.full)h.translate(-n.x1*l,-n.y1*l),h.scale(l,l),this.drawElements(h,f),h.scale(1/l,1/l),h.translate(n.x1*l,n.y1*l);else{var p=t.pan(),g={x:p.x*l,y:p.y*l};l*=t.zoom(),h.translate(g.x,g.y),h.scale(l,l),this.drawElements(h,f),h.scale(1/l,1/l),h.translate(-g.x,-g.y)}e.bg&&(h.globalCompositeOperation="destination-over",h.fillStyle=e.bg,h.rect(0,0,a,i),h.fill())}return d},Rh.png=function(e){return Nh(e,this.bufferCanvasImage(e),"image/png")},Rh.jpg=function(e){return Nh(e,this.bufferCanvasImage(e),"image/jpeg")};var Lh={nodeShapeImpl:function(e,t,n,r,a,i,o,s){switch(e){case"ellipse":return this.drawEllipsePath(t,n,r,a,i);case"polygon":return this.drawPolygonPath(t,n,r,a,i,o);case"round-polygon":return this.drawRoundPolygonPath(t,n,r,a,i,o,s);case"roundrectangle":case"round-rectangle":return this.drawRoundRectanglePath(t,n,r,a,i,s);case"cutrectangle":case"cut-rectangle":return this.drawCutRectanglePath(t,n,r,a,i,o,s);case"bottomroundrectangle":case"bottom-round-rectangle":return this.drawBottomRoundRectanglePath(t,n,r,a,i,s);case"barrel":return this.drawBarrelPath(t,n,r,a,i)}}},zh=Vh,Oh=Vh.prototype;function Vh(e){var t=this,n=t.cy.window().document;e.webgl&&(Oh.CANVAS_LAYERS=t.CANVAS_LAYERS=4,console.log("webgl rendering enabled")),t.data={canvases:new Array(Oh.CANVAS_LAYERS),contexts:new Array(Oh.CANVAS_LAYERS),canvasNeedsRedraw:new Array(Oh.CANVAS_LAYERS),bufferCanvases:new Array(Oh.BUFFER_COUNT),bufferContexts:new Array(Oh.CANVAS_LAYERS)};var r="-webkit-tap-highlight-color",a="rgba(0,0,0,0)";t.data.canvasContainer=n.createElement("div");var i=t.data.canvasContainer.style;t.data.canvasContainer.style[r]=a,i.position="relative",i.zIndex="0",i.overflow="hidden";var o=e.cy.container();o.appendChild(t.data.canvasContainer),o.style[r]=a;var s={"-webkit-user-select":"none","-moz-user-select":"-moz-none","user-select":"none","-webkit-tap-highlight-color":"rgba(0,0,0,0)","outline-style":"none"};d&&d.userAgent.match(/msie|trident|edge/i)&&(s["-ms-touch-action"]="none",s["touch-action"]="none");for(var l=0;l