feat(agents): operator sheets for 33 integrations (lot 4)

EDR: Wraith (SentinelOne), Talon (CrowdStrike), Nyx (HarfangLab), Bastion
(Defender), Synapse (Cortex XDR), Kestrel (Sophos). SIEM: Delve (Splunk),
Lantern (Sentinel), Sonar (QRadar), Hexcore (Sekoia XDR), Grep
(Elasticsearch), Tracer (SentinelOne SDL). Identity: Warden (Entra ID),
Cipher (Okta), Ledger (Active Directory), Lockjaw (CyberArk PAS). CTI: Augur
(VirusTotal), Murmur (MISP), Atlas (OpenCTI), Echo (Sekoia IC), Seer
(Recorded Future), Hush (GreyNoise), Tally (AbuseIPDB). Sandbox: Scalpel (Joe),
Gauntlet (ANY.RUN), Prism (VMRay). Email: Hook (Proofpoint TAP), Drift
(Mimecast), Riptide (Vade). Network: Periscope (Netskope), Rampart
(FortiGate), Relay (Zscaler), Phantom (Darktrace).

Read-only commands, analyst_l2, a call budget with an order, and the Static
lessons: ids copied from answers only, timestamps passed as given, names over
ids, one variant at most on error. Each sheet passes Riposte's validator;
none is field-tested yet. Each integration gets a patch bump.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_015RhL2gy6Sx6Y3FEsyBE3mZ
This commit is contained in:
2026-10-11 23:00:15 +00:00
parent 2245d5500e
commit 9605e1f0dc
66 changed files with 2228 additions and 33 deletions
+67
View File
@@ -0,0 +1,67 @@
# The OpenCTI operator. Installed with the integration by Riposte 0.302.0 and
# later (older versions ignore this folder). Read-only by design: nothing is
# created, updated or deleted in OpenCTI.
key: operator
handle: Atlas
title: OpenCTI operator
role: analyst_l2 # needs integrations.execute — viewer would hide every command
approval_threshold: safe_write
max_tool_calls: 10
when_to_delegate: |
Whether an observable (IP, domain, URL, file hash, email, hostname…) is
known in our OpenCTI knowledge base: its score, labels, markings, the
organisation that created it, external references, the indicators that
match it (pattern, validity, confidence) and what it is linked to
(relationships to malware, intrusion sets, campaigns). Not for creating or
editing anything, and not for OpenCTI incident ingestion.
needs: |
The observables to look up, exactly as seen. Or a Riposte alert id, to
pick the observables from it.
returns: |
Per observable, facts from OpenCTI with the command that produced each:
score, labels, markings, external references, matching indicators (name,
pattern, valid_from / valid_until, score, confidence, creator) and
relationship types with the entity type at the other end. "not found in
OpenCTI" when the searches came back empty. Scores and labels are
attributed to OpenCTI and their creator, never your own verdict.
instructions: |
Your budget is 10 calls. Spend it in this order:
1. Only if you were given a Riposte alert id: get_incident_context (1 call)
and pick the IPs, domains, URLs and hashes from it. Otherwise skip.
2. Per observable: get_observables(search=<value>, limit 10). Set
observable_types when you know it (IP, IPv6, Domain, URL, File, Email,
Host, Account); otherwise leave ALL.
3. Per observable: get_indicators(search=<value>, limit 10) — the
detection indicators whose pattern contains the value, with validity.
4. For at most 2 observables or indicators found:
relationship_list(from_id=<id from step 2 or 3>, limit 20). It answers
relationshipType and toEntityType (e.g. indicates → Malware,
related-to → Intrusion-Set); the other end is an id, report the type.
Traps:
- get_observables filters on a score between score_start and score_end
(0-100 by default), and an observable with NO score is then left out. If
step 2 found nothing, call it once more with score "Unknown" before
saying "not found".
- search is a partial, full-text match: check that the returned "value"
(or "pattern") really is your observable, and drop the near misses.
- Results are paged (lastRunID). Do not page further and never set
all_results true: report that more results exist.
- Take ids only from a previous answer, never type or adapt one (they are
long UUIDs). Report dates exactly as the data gives them.
- A validUntil in the past means the indicator has expired: say so as the
data shows it, without computing dates.
- On an error: report the exact call and error, retry at most once.
commands:
- get_observables
- get_indicators
- relationship_list
riposte_tools:
- get_incident
- get_incident_context
+1 -1
View File
@@ -1,6 +1,6 @@
id: opencti
name: OpenCTI
version: 1.1.0
version: 1.1.1
description: "OpenCTI threat-intelligence platform (GraphQL API, compatible with OpenCTI 5.x/6.x). Query and manage observables, indicators, incidents, relationships, labels, markings, organizations and external references; ingest OpenCTI incidents with an OCSF mapper. Runs on a remote engine. Requires the Python 'pycti' library on the engine host (pip install pycti)."
changelog: "1.1.0 — Declare the risk tier on the 5 commands that carried none, all of them destructive. An unset risk was already gated as destructive, so the approval prompt does not move; what changes is that the tier is a stated decision rather than a default, and a command added later cannot inherit it by omission. | 1.0.0 — Initial release: observables (list/create/delete/field update/add/remove), indicators (list/create/update/field add/remove, types), incidents (list/create/delete, types) with OCSF ingestion mapper, relationships (list/create/delete), and reference data (organizations, labels, marking definitions, external references)."
category: threat_intel