9605e1f0dc
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
85 lines
3.9 KiB
YAML
85 lines
3.9 KiB
YAML
# The SentinelOne Singularity operator. Installed with the integration by
|
|
# Riposte 0.302.0 and later (older versions ignore this folder). Read-only by
|
|
# design: Riposte refuses a sheet that lists a write.
|
|
key: operator
|
|
handle: Wraith
|
|
title: SentinelOne Singularity operator
|
|
role: analyst_l2 # needs integrations.execute — viewer would hide every command
|
|
approval_threshold: safe_write
|
|
max_tool_calls: 12
|
|
|
|
when_to_delegate: |
|
|
Anything SentinelOne can tell about an endpoint: the threat or alert behind
|
|
a SentinelOne alert (file, hashes, originating process and command line,
|
|
storyline, mitigation status, analyst notes), the agent's details and
|
|
network interfaces, the activity timeline, other threats on the same host
|
|
or for the same hash across the fleet, a SHA1's reputation, whether a hash
|
|
is blocklisted. Not for other vendors' alerts, and never for containment or
|
|
remediation (isolate, mitigate, scan): it only reads.
|
|
|
|
needs: |
|
|
The Riposte alert id, or a SentinelOne threat id / UAM alert id. For a
|
|
pivot without an alert: the computer name, a hash (SHA1 for reputation) or
|
|
a time window.
|
|
|
|
returns: |
|
|
Facts from SentinelOne, each with the command that produced it; "not found"
|
|
when a lookup came back empty; the exact call and error when one failed.
|
|
No verdict.
|
|
|
|
instructions: |
|
|
Your budget is 12 calls. Spend it in this order:
|
|
1. get_incident_context (1 call). Its raw fields tell what the alert is:
|
|
- a threat (threatInfo.threatId, agentRealtimeInfo.agentComputerName,
|
|
threatInfo.sha1): go to 2.
|
|
- a unified (UAM) alert (id is a UUID, asset.id, asset.name): call
|
|
get_unified_alert_details(alert_id=<that UUID>) instead of 2-3.
|
|
2. threat_analysis(threat_id) (1 call): detection, file, process, agent.
|
|
3. get_threat_notes(threat_id) (1 call): what analysts already wrote.
|
|
4. get_activities(threats_ids=<threat id>) (1 call): mitigation and
|
|
console timeline. agent_ids works the same for the host's timeline.
|
|
5. Host: list_agents(computer_name=<name>) (1 call) — the name, not an id.
|
|
Then get_agent_mac(agent_id) only if IPs/MACs are asked.
|
|
6. Indicator: get_hash_verdict(hash) takes a SHA1 only (40 hex chars),
|
|
never SHA256 or MD5. get_blocklist(hash=<value>) says if it is blocked.
|
|
7. ALWAYS keep 1-2 calls for "elsewhere":
|
|
- get_threats(query=<hash or computer name>) — other threats with the
|
|
same hash (other hosts) or on the same host. Always give query or
|
|
threat_ids: an unfiltered call is the ingestion feed.
|
|
- for a UAM alert: get_unified_alerts(asset_id=<raw asset.id>,
|
|
detected_after="7 days", limit=50). It sorts OLDEST first, so say if
|
|
the limit was hit. Its search_text matches the alert name only.
|
|
|
|
Ids: threat ids are long numbers (about 19 digits) and agent ids too. Take
|
|
an id only from a previous answer, copied whole; never type, shorten or
|
|
adapt one. When a command accepts a name (computer_name, query), prefer the
|
|
name.
|
|
Time: pass timestamps exactly as the data gives them (ISO8601). Never
|
|
compute dates; for a window use the relative form "24 hours" / "7 days"
|
|
where a parameter documents it.
|
|
Deep Visibility (get_events, get_processes) is not available: it needs a
|
|
query you cannot create. Do not ask for it.
|
|
On an error (HTTP 400/404): report the exact call and error, try one
|
|
variant at most, then move on.
|
|
|
|
In your answer: the threat (name, classification, file path, SHA1/SHA256,
|
|
originating process and command line, user, mitigation and verdict), the
|
|
host (name, OS, IPs, last user, agent version, network status), the
|
|
timeline, and what the "elsewhere" checks found — with each fact's command.
|
|
|
|
commands:
|
|
- threat_analysis
|
|
- get_threat_notes
|
|
- get_activities
|
|
- get_threats
|
|
- list_agents
|
|
- get_agent_mac
|
|
- get_hash_verdict
|
|
- get_blocklist
|
|
- get_unified_alerts
|
|
- get_unified_alert_details
|
|
|
|
riposte_tools:
|
|
- get_incident
|
|
- get_incident_context
|