From securin-platform
Use this skill when the user asks "am I affected by this CVE", "does this threat affect my environment", "check if we're vulnerable to [ransomware / threat actor]", "correlate threats with my exposures", "what threats target my vulnerabilities", "show me the intersection of [threat] and my environment", or any question that bridges external threat intelligence with the user's specific assets and exposures. For pure CVE intelligence without environment matching use securin-cve-enrichment. Requires the Securin Platform MCP server.
How this skill is triggered — by the user, by Claude, or both
Slash command
/securin-platform:securin-threat-correlationThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Bridge **external threat intelligence** (CVEs, ransomware families, threat actors, campaigns) with the **user's environment** (assets, exposures, components). Answer the core question: *"Does this threat matter to me right now?"*
references/_shared/account-preflight.mdreferences/_shared/brand.mdreferences/_shared/composite-fields.mdreferences/_shared/composite-vs-source.mdreferences/_shared/deep-links.mdreferences/_shared/fql-grammar.mdreferences/_shared/groupby-allowlist.mdreferences/_shared/securin_logos/README.mdreferences/_shared/securin_logos/Securin_logo_purple.pngreferences/_shared/securin_logos/Securin_logo_purple.svgreferences/_shared/securin_logos/Securin_logo_rounded.pngreferences/_shared/securin_logos/Securin_logo_rounded.svgreferences/_shared/securin_logos/Securin_logo_white.pngreferences/_shared/securin_logos/Securin_logo_white.svgreferences/_shared/sorting-rules.mdreferences/_shared/source-fields.mdreferences/correlation-patterns.mdBridge external threat intelligence (CVEs, ransomware families, threat actors, campaigns) with the user's environment (assets, exposures, components). Answer the core question: "Does this threat matter to me right now?"
This skill is the inverse of securin-cve-enrichment: enrichment produces a global report on a CVE; correlation intersects that CVE (or a threat, or an actor's TTPs) with the user's real data.
See _shared/account-preflight.md. Correlation queries always touch the user's environment — you must resolve account-id(s) and validate access before any exposure/asset query. Also detect the composite-vs-source data model (see _shared/composite-vs-source.md) to use the correct asset prefix. This should also give you context about when to use *Query tools and when to use search* and aggregate* tools.
Before using this skill, read every file in the references folder, including the shared references/_shared/ docs. Prefer the cached field catalogs (source-fields.md for source mode, composite-fields.md for composite mode) over calling getApiFields — only fall back to the live tool when an entity or field is missing from the cache.
searchVulnerabilityData — CVE record + exploitation signalssearchThreatActorData — threat actor → CVE list. Actor records are flat — do NOT pass fields: ['threatActor'] (that prefix doesn't match the actual record shape and the call returns empty rows silently). Omit fields, or pass top-level keys like name, vulnerabilities, associatedGroups.searchWeaknessData — CWE root causesearchExposureData + aggregateExposureData (two calls, same filter when both list and bucket counts are needed).exposureQuery (combined search + aggregate, compositeExposure.* prefix).searchAssetData (source) or assetQuery (composite). For source bucket counts pair with aggregateAssetData.getEffectiveAccessWorkspacesgetAccountSettings — composite FF checkgetApiFields — field discoverycreateDeepLink (preferred) — call once per list/aggregation, plus once per bucket if you need per-bucket linksgetDeepLinkStep 1: Threat Intelligence → Extract CVEs / indicators
Step 2: Your Environment → Find matching exposures / assets / components
Result: Threat Exposure Assessment
Two strategies based on direction.
The user starts with a threat and wants to know if they're affected.
| If the user said… | Do |
|---|---|
CVE-XXXX-YYYY | Already a CVE — skip to A.2 |
| A threat-actor name (e.g., "Lazarus") | searchThreatActorData with bare-path filter name like 'Lazarus' (omit fields — actor records are flat) → collect the top-level vulnerabilities array (CVE IDs) |
| A ransomware family (e.g., "LockBit") | Use web search — resolve the family to a CVE list via published threat-intel and confirm with the user |
| A campaign / news event | Web search to resolve to CVE list, then confirm with the user before proceeding |
Run two calls with the same filter — searchExposureData for the row list, aggregateExposureData for the severity breakdown:
# 1) Itemized list
searchExposureData
filter: exposure.mappedAttributes.vulnerabilityIds in (<cve-list>)
AND exposure.status = 'Open'
AND "<account/workspace scope>"
# 2) Severity bucket counts (same filter)
aggregateExposureData
filter: <same as above>
aggs: [{
name: "bySeverity",
function: { type: "TERMS", field: "exposure.scores.scoreLevel", size: 10 }
}]
In case of composite mode use exposureQuery in place of the above mentioned tools for search and aggregate.
Using assetIds from the exposures (or a separate join):
# Source mode
searchAssetData
filter: asset.assetId in (<asset-ids from A.2>)
sort: "asset.scores.overallScore:desc"
# Composite mode — single call returns list + buckets
assetQuery
filter: compositeAsset.id in (<ids>)
sort: "compositeAsset.scores.overallScore:desc"
## Threat Exposure Assessment — <threat name or CVE>
**Verdict:** AFFECTED / NOT AFFECTED / PARTIAL — <N matched exposures across M assets>
### Matched CVEs
| CVE | Severity | KEV | # Exposures | Link |
|---|---|---|---|---|
| … | … | … | … | [View](<deep link>) |
### Affected Assets
| Asset | Criticality | Reachability | Workspace | # Matched Exposures | Link |
|---|---|---|---|---|---|
| … | … | … | … | … | [View](<deep link>) |
### Severity Breakdown
- Critical: 3 → [View](…)
- High: 11 → [View](…)
- Medium: 27 → [View](…)
### Recommended next steps
- Top-priority remediation: hand off to **securin-remediation-guidance** for CVE-XXXX
- Triage the full list: hand off to **securin-exposure-triage** for SLA review
The user starts with an asset or exposure and wants to know what threats target them.
aggregateExposureData
filter: exposure.status = 'Open' AND "<scope>"
aggs: [{
name: "byCve",
function: { type: "TERMS", field: "exposure.mappedAttributes.vulnerabilityIds", size: 200 }
}]
For each CVE (or batched):
searchThreatActorData filter: vulnerabilities like 'CVE-X' # bare-path FQL on the actor record; do NOT pass fields:['threatActor']
searchVulnerabilityData filter: vulnerabilityId = 'CVE-X'
## What Hunts Me — <account / workspace scope>
**Top threats targeting your open exposures:**
| Threat / Actor | Type | Your exposed CVEs | # Affected Assets | Link |
|---|---|---|---|---|
| LockBit 3.0 | Ransomware | CVE-…, CVE-… | 14 | [View](…) |
| APT29 | State actor | CVE-…, CVE-… | 3 | [View](…) |
### Recommended next steps
- Deep-dive a specific threat → **securin-cve-enrichment** for the CVE
- Remediation planning → **securin-remediation-guidance**
See _shared/fql-grammar.md for full grammar. Correlation-specific:
# Exposures matching a CVE set
"exposure.mappedAttributes.vulnerabilityIds" in ('CVE-X','CVE-Y','CVE-Z')
# Exposures on exposed-to-internet assets (source-model)
asset.reachability = 'Exposed'
# Same, composite-model
compositeAsset.reachability = 'Exposed'
# Exposures tied to CISA KEV CVEs (cross-entity to vuln index from exposures)
vulnerabilities.isCisaKEV = true
# In searchVulnerabilityData — bare path, no "vulnerabilities." prefix
vulnerabilityId = 'CVE-X'
isCisaKEV = true
searchThreatActorData with no filters → an error. Always pass a filter (and OMIT fields: ['threatActor'] — actor records are flat, so that prefix silently returns empty rows; see correlation-patterns.md).name, description, vulnerabilityCount, originCountry, targetedCountries, targetedIndustries, associatedGroups) — no threatActor. prefix.validateFilter validates both FQL syntax and field existence — a 400 response means either malformed syntax or an invalid field path. Always cross-check paths against Source data API Fields or Composite data API Fields based on the current mode of execution. Use getApiFields as a fallback when a field is not in the cache.securin-cve-enrichment.securin-exposure-triage.securin-asset-triage.securin-remediation-guidance.Securin__search_tools meta-tool to look up the right MCP tool by description.exposure.status filter isn't too narrow.exploitedInWild first, then correlate.When this skill produces aggregated or multi-row data (counts, trends, distributions, comparisons, single-CVE reports), emit a chart/graph/infographic in the Securin brand palette (#712880 / #453983 / #542ade / #987bf7 / #d7cbfb), Lato font, light theme, with the Securin logo. Default colormap uses the monotone gradient defined in _shared/brand.md. Offer customization after delivery; never default to a different brand.
npx claudepluginhub securin-public/securin-skills --plugin securin-platformGuides creation, editing, and verification of skills for AI coding agents using test-driven development with subagent scenarios. Use when authoring or debugging skills.