Orca supply chain exposure
Skill orcasecurity/orca-skills/skills/orca-supply-chain-exposure
Supply chain exposure check — given a list of suspect packages (e.g. an MDR advisory like the @antv/* npm campaign), find which versions are deployed across the environment, which match the vulnerable range, and which assets carry them. Use when user asks about supply chain risk, package exposure, IOC package check, malicious package, or "are we running X" (e.g., "are we exposed to the @antv attack", "any assets with left-pad", "check these npm packages", "supply chain check").From its SKILL.md
npx -y skills add orcasecurity/orca-skills --skill orca-supply-chain-exposureAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
SKILL.md
13.9 KB, as published. Nobody here has run it
Orca Supply Chain Exposure Skill
Answers the question: "From this list of suspect packages, which are we actually running, where, and at what version?"
Replaces a manual sweep of inventory + SBOM queries with a single parallel check. Optimized for the moment after an MDR / vendor / news advisory lands and the team needs an exposure answer in minutes.
Usage
/orca-supply-chain-exposure @antv/util @antv/g2 @antv/g6
/orca-supply-chain-exposure log4j-core 2.14.1
/orca-supply-chain-exposure xz-utils 5.6.0,5.6.1
Or natural language:
- "are we exposed to the @antv npm attack?"
- "check these packages: react-devtools 4.28.0, axios 0.21.0"
- "any assets with xz-utils 5.6.x?"
- "supply chain check on this IOC list"
The user may paste a bullet list, a comma-separated list, or a table. Parse it.
Processing Logic
Step 1: Parse the package list
Build a normalized list of (package_name, suspected_versions[]). If the user only gave package names with no versions, treat any version found in the environment as a positive hit and rely on Orca's CVE data to confirm vulnerability.
Step 2: Run parallel exposure queries
For each package, run two queries in parallel:
Query A: Direct inventory lookup
discovery_search:
search_phrase: "assets with package <name>"
limit: 50
Query B: CVE-driven lookup (catches assets where Orca already flags the package as vulnerable)
discovery_search:
search_phrase: "assets with vulnerable <name> package"
limit: 50
Batching rule: Run all packages' Query A and Query B in parallel — one tool-call batch per package isn't enough, batch across packages. For 20 packages, that's 40 parallel discovery_search calls in one message.
Step 3: Match version ranges
For each asset returned, extract the installed version from the discovery_search response and compare against the user's suspected version list:
- Vulnerable Match: installed version is in the suspected range.
- Below Range: installed version is older than the vulnerable range (not affected).
- Above Range: installed version is newer (patched or unrelated).
- Unknown Version: discovery_search didn't return a version — flag and recommend a manual SBOM check in Orca UI.
Step 4: Enrich confirmed exposures
For assets with Vulnerable Match only (top 5 by environment importance), run in parallel:
get_asset_by_id:
asset_id: <UUID>
get_asset_related_alerts_summary:
asset_id: <UUID>
get_asset_crown_jewel_info:
group_unique_id: <group_unique_id>
This adds prod/non-prod tag, exposure status, related CVEs Orca already raised, and crown-jewel status.
Step 5: Build the exposure table
Output is the table the on-call team needs to paste into a ticket or status update.
Proactive Remediation Behavior
CRITICAL: Never leave the user with just data. After the exposure table:
- Suggest the next action — "Patch
<package>on<asset>first because it's prod + internet-facing." - Offer remediation format selection — "I can generate the upgrade or removal manifest. Choose format: terraform | helm | ansible | cli | instructions | dockerfile-patch."
- For confirmed exposure on prod assets, auto-suggest snoozing alerts and opening an incident ticket.
When the user picks a format:
- Generate the upgrade / pin / removal config
- Write to
supplychain-fix-<package>.<ext> - Include the verification command (
npm ls <package>,pip show <package>, etc.) - Suggest the next package to fix
Output Format
Layer 1: Exposure Table
═══════════════════════════════════════════════════════════════════
SUPPLY CHAIN EXPOSURE CHECK
<date> | <N> packages checked
═══════════════════════════════════════════════════════════════════
VERDICT: <one-liner — "1 confirmed exposure" / "no matches" / "3 vulnerable">
┌─────────────────────────────────────────────────────────────────┐
│ PACKAGES CHECKED <N> │
│ CONFIRMED VULNERABLE <N> │
│ BELOW RANGE <N> │
│ NOT FOUND <N> │
│ ASSETS AFFECTED <N> (<M> prod, <K> non-prod) │
│ CROWN JEWELS AFFECTED <N> │
└─────────────────────────────────────────────────────────────────┘
EXPOSURE TABLE:
Package Version in Env Vulnerable Range Status Assets
───────────────────────────────────────────────────────────────────────────────
<name> <ver> <range> VULNERABLE <count>
<name> <ver> <range> Below Range <count>
<name> — <range> Not Found 0
...
CONFIRMED EXPOSURES (act on these now):
[!] <package>@<version> on <asset> (<type>, <prod/non-prod>)
Crown jewel: YES/NO | Internet-facing: YES/NO | Related alerts: <N>
Fix: upgrade to <safe version> OR remove if unused
RECOMMENDED ACTION:
Top priority: patch <package> on <asset> — <reason>.
I can generate the fix right now.
What format? terraform | helm | ansible | cli | dockerfile-patch |
instructions | pulumi
═══════════════════════════════════════════════════════════════════
Or drill down: confirmed | unknown-version | not-found | by-asset | full
═══════════════════════════════════════════════════════════════════
Layer 2: Drill-Downs
"confirmed" — Confirmed vulnerable assets
───────────────────────────────────────────────────────────────────
CONFIRMED EXPOSURES
───────────────────────────────────────────────────────────────────
[!] <asset> (<type>) in <account>
Package: <name>@<version>
Vulnerable range: <range>
Environment: <prod/staging/dev tag>
Internet-facing: YES/NO
Crown jewel: YES/NO
Related Orca alerts: <N> (top: <alert title>)
Upgrade path: <name>@<safe-version>
[!] <asset> — ...
───────────────────────────────────────────────────────────────────
"unknown-version" — Assets where the version couldn't be determined
───────────────────────────────────────────────────────────────────
UNKNOWN VERSIONS — Manual SBOM Check Required
───────────────────────────────────────────────────────────────────
These assets have the package installed, but Orca's response didn't
include a parseable version. Verify in Orca UI → Asset → SBOM:
<asset> — <package>
<asset> — <package>
...
───────────────────────────────────────────────────────────────────
"not-found" — Packages not present in the environment
───────────────────────────────────────────────────────────────────
NOT FOUND IN ENVIRONMENT
───────────────────────────────────────────────────────────────────
The following packages were not found on any monitored asset:
• <package> (suspected versions: <range>)
• <package>
...
Caveat: a "not found" result means Orca's inventory has no match.
Verify scanner coverage with /orca-account-health if accounts may
be missing.
───────────────────────────────────────────────────────────────────
"by-asset" — Grouped by asset (useful for ticket assignment)
───────────────────────────────────────────────────────────────────
EXPOSURE BY ASSET
───────────────────────────────────────────────────────────────────
<asset> (<account>)
• <package>@<version> — VULNERABLE
• <package>@<version> — VULNERABLE
• <package>@<version> — Below Range
<asset> (<account>)
• ...
───────────────────────────────────────────────────────────────────
"full" — Everything expanded
Edge Cases
No packages provided
⚠ No packages to check. Provide a package list:
/orca-supply-chain-exposure <name1> <name2> ...
/orca-supply-chain-exposure <name>@<version>
Or paste a bullet list from your advisory.
All packages not found
✅ None of the <N> packages are present in the monitored environment.
Caveats:
• Verify Orca scanner coverage with /orca-account-health
• Newly deployed assets may not have been scanned yet
• Package may be installed under a different name (alias check recommended)
Discovery returned > 50 hits for a single package
⚠ <package> is on more than 50 assets — discovery_search is capped at 50.
Showing top 50 by severity. For the full list:
Open the app_url in the discovery_search response.
User provided versions but Orca returns no version data
Asset returned a hit for <package> but no version data.
Manual verification needed in Orca UI → Asset → SBOM.
MCP Tools Used
Primary Tools
| Tool | Purpose | Parameter |
|---|---|---|
discovery_search | Find assets running a given package | search_phrase (NL), limit |
get_asset_by_id | Asset prod/non-prod tag and metadata | asset_id (UUID) |
get_asset_related_alerts_summary | Existing alerts on the affected asset | asset_id (UUID) |
get_asset_crown_jewel_info | Crown jewel status | group_unique_id |
Secondary Tools
| Tool | Purpose | When |
|---|---|---|
get_alert | Pull related CVE alert details | Drill-down into an existing Orca CVE alert for the package |
search_cdr_events | Recent activity from/to the affected asset | If user asks for activity context |
Parameter Notes
discovery_searchnatural-language phrasing matters: both"assets with package <name>"and"assets with vulnerable <name>"should run — each surfaces different data (inventory vs CVE-tagged).discovery_searchis capped at 50 results per call — the response includesapp_urlfor the full set; surface this when truncated.- The package-name string must match exactly what Orca indexes; common aliases (e.g.
log4j-corevslog4j) may need two queries.
Implementation Notes
- Parallelize across packages, not just across queries. For a 10-package advisory, the first batch should be ~20
discovery_searchcalls in one message. - Version match is the differentiator — without version comparison this is just a "package found anywhere" check. Always show the installed version and the suspected range side by side.
- "Below Range" is a real status, not a non-finding — call it out explicitly so the user sees that the check ran and the asset is verified safe.
- Crown jewel + internet-facing flag turns a generic "vulnerable" hit into a priority-1 incident. Always enrich confirmed exposures with these two fields.
- Link to other skills: suggest
/orca-impact-analysisfor fix consequences,/orca-alert-triagefor any related CVE alert,/orca-account-healthif "not found" results need a coverage sanity-check.