Search
Ctrl+K
On this page
Documentation for vulnerability management, package advisory lookups via OSV.dev, host dependency tracking, and automated remediation workflows in Shuffle Security.
Shuffle Security (shuffle.security/vulnerabilities) tracks vulnerabilities across your infrastructure, third-party software, and code dependencies.
Instead of maintaining a passive spreadsheet of scanner outputs, Shuffle stores vulnerability findings inside Shuffle Core's Datastore under the shuffle-security_vulns category. Findings can be queried, filtered, enriched, and acted upon using standard Shuffle workflows.
[!NOTE] Zero License Paywalls
Vulnerabilities is a native feature available on both Shuffle Cloud and self-hosted open-source instances. Findings and host telemetry are stored directly in your datastore and do not incur extra license fees. App runs only execute when your workflows trigger.
Shuffle categorizes findings into four distinct types:
| Category | Identifier Key | Scope & Typical Sources |
|---|---|---|
| Software / CVE | software_cve | Operating system packages, installed desktop applications, and server binaries. |
| User / Identity | user_identity | IAM drift, missing MFA, stale credentials, and excessive privileges. |
| Cloud Misconfig | cloud_misconfig | Open storage buckets, permissive firewall rules, and cloud infrastructure drift. |
| Code / Dependencies | code_dependency | Third-party packages and libraries scanned from code repositories (package.json, requirements.txt, Cargo.toml, go.mod). |
All vulnerability findings are stored inside Shuffle's Datastore under the shuffle-security_vulns category. Each entry is keyed by its primary advisory identifier (e.g. CVE-2024-3094 or GHSA-7867-xwm8-2v3q) and stores a structured JSON document.
You can inspect, query, and modify records in the Datastore console:
/admin/datastore?category=shuffle-security_vulns. Automatically queries the local datastore if configured, and falls back to Shuffle Core if local storage is not initialized.https://shuffler.io/admin?tab=datastore&category=shuffle-security_vulns or /admin?tab=datastore&category=shuffle-security_vulns on self-hosted Core).shuffle-security_vulns.We've all had a scanner misbehave, an API misfire, or a test script accidentally dump dummy CVEs into production. When that happens, you might notice that the main queue at /vulnerabilities doesn't have a big red "Delete" button. That's intentional—in day-to-day triage you usually want to resolve, mitigate, or accept findings rather than deleting historical records.
If you ingested bad data and need to wipe it out completely, an admin can do that directly in the Datastore:
/admin/datastore?category=shuffle-security_vulns (if you're on self-hosted Shuffle Core, that's /admin?tab=datastore&category=shuffle-security_vulns).CVE-2024-3094).A quick heads-up: inside the Shuffle Security UI, /admin/datastore is restricted to admins (isAdmin). If you don't have admin permissions, you'll see a notice asking you to reach out to an admin on your team to clear it out.
| Field | Type | Description |
|---|---|---|
id | String | Canonical advisory identifier (e.g. CVE-2024-3094, GHSA-xxxx). Serves as the primary datastore key. |
title | String | Descriptive title or headline of the vulnerability. |
severity | String | Severity rating: critical, high, medium, or low. |
score | Number | CVSS base numerical score (e.g. 10.0 or 7.4). |
category | String | Classification: software_cve, code_dependency, user_identity, or cloud_misconfig. |
status | String | Workflow status: open, in_progress, mitigated, accepted, or resolved. |
affected_package | String | Name and version constraint of the affected component (e.g. xz-utils 5.6.0, lodash <4.17.21). |
fixed_version | String | Minimum version containing the remediation patch (e.g. 5.6.1). |
affected_hosts | Array | Endpoints running the vulnerable software or dependency, including hostname, filesystem path, and per-host resolution. |
# Upsert or update a vulnerability finding
vuln_payload = {
"id": "CVE-2024-3094",
"title": "XZ Utils Backdoor (liblzma)",
"severity": "critical",
"score": 10.0,
"category": "software_cve",
"status": "open",
"affected_package": "xz-utils 5.6.0",
"fixed_version": "5.6.1",
"affected_hosts": [
{
"hostname": "srv-prod-db-01",
"path": "/usr/lib/x86_64-linux-gnu/liblzma.so.5.6.0",
"resolution": "open"
}
]
}
# Write to Datastore
self.set_cache(
key="CVE-2024-3094",
value=vuln_payload,
category="shuffle-security_vulns"
)
All vulnerability records stored in shuffle-security_vulns are automatically versioned with immutable revisions. Every scanner sweep, automated triage run, or manual status change preserves historical snapshots:
API Call
curl -X GET 'https://uk.shuffle.security/api/v2/datastore/category/shuffle-security_vulns/{cve_id}/revisions' \ -H 'Authorization: Bearer <api_key…'
Response
No response received.
# Retrieve revision history
revisions = self.get_cache_revisions(key="CVE-2024-3094", category="shuffle-security_vulns")
# Revert to earlier verified snapshot if scan corrupted data
if len(revisions) > 1:
self.set_cache(
key="CVE-2024-3094",
value=revisions[1]["value"],
category="shuffle-security_vulns"
)
Shuffle supports multiple paths to ingest and look up vulnerabilities:
You can push findings from CI/CD pipelines, container scanners, or external security tools directly into Shuffle:
/vulnerabilities in the web app.https://<instance>/api/v1/hooks/webhook_<hook_id>
vulnerabilities_webhook workflow, which normalizes findings and writes them to the datastore.You can query the open-source vulnerability database directly from the Shuffle UI:
CVE-2024-3094), a GitHub Advisory ID (e.g. GHSA-xxxx-xxxx-xxxx), or an affected package name into the search bar at /vulnerabilities.https://api.osv.dev/v1/vulns/<id> to display advisory details, severity, affected versions, and published fixes.When endpoints run Shuffle Host Monitors with the Code Package Scanner enabled, the local agent scans project directories for manifest files (package.json, requirements.txt, Cargo.toml, go.mod). Discovered dependencies are evaluated against OSV.dev and registered in shuffle-security_vulns with the host's identity and file path.
For external scanners with REST APIs, scheduled Shuffle workflows (such as Ingest Vulnerabilities) regularly pull findings, deduplicate entries, and write them to the datastore.
A vulnerability finding is actionable when you know which systems are affected.
When Host Monitors discover a vulnerable package on an endpoint, Shuffle stores the finding with host-level granularity:
/home/user/projects/web-api/package.json).Because a vulnerability may exist across multiple servers or laptops, you can track resolution status individually for each host in the vulnerability detail view:
| Resolution Reason | Meaning |
|---|---|
| Patched | The dependency or software package has been upgraded to a non-vulnerable version. |
| Mitigated | Compensating controls (e.g. network ACLs or disabled features) neutralize the flaw. |
| Accepted | Risk is formally accepted by the tenant. |
| False Positive | The detected package is not exploitable in this specific environment. |
| Not Applicable | The vulnerable function or subcomponent is not utilized. |
The dashboard at /vulnerabilities provides an operational overview of all recorded findings:
All, Software / CVE, User / Identity, Cloud Misconfig, and Code / Deps.Critical, High, Medium, Low, or Info.Open, In Progress, Resolved, or Accepted findings.Critical, High, Medium, Low, Info).code_dependency, software_cve, etc.).osv:npm, osv:pypi, or scanner name).Open, In Progress, Resolved, Accepted).Clicking any finding navigates to /vulnerabilities/:id, displaying:
Shuffle Security checks whether your core vulnerability automation workflows are configured:
| Readiness Pillar | Verification Check | Target Workflow | Status | Purpose & Configuration |
|---|---|---|---|---|
| Vulnerability Webhook | Inbound webhook trigger running | vulnerabilities_webhook | Active | Ingests findings pushed from external scanners. Configure at /vulnerabilities -> Webhook. |
| Vulnerability Ingestion | Schedule trigger running | Ingest Vulnerabilities | Active | Regularly polls external vulnerability APIs on a recurring schedule. Activate in /usecases. |
| Vulnerability Correlation | Workflow exists with actions | Vulnerability Correlation | Active | Compares scanner results across runs and correlates findings with assets. Activate in /usecases. |
| Vulnerability Response | Automated remediation | asset_management_case_management_vuln_response_1 | In Development | Automated remediation, ticketing, and containment actions for detected vulnerabilities (coming soon). |
┌────────────────────────────────────────────────────────────────────────┐
│ Vulnerability Automation Readiness │
├────────────────────────┬───────────────────────────────────────────────┤
│ Vulnerability Webhook │ [Active] api/v1/hooks/webhook_<id> │
│ Vulnerability Ingest │ [Active] Ingest Vulnerabilities │
│ Vuln Correlation │ [Active] Vulnerability Correlation │
│ Vulnerability Response │ [In Development] Coming soon │
└────────────────────────┴───────────────────────────────────────────────┘
[!TIP] Enabling Automations
Click "Enable all" on the readiness card to generate and activate the foundational ingestion and correlation workflows, or manage them individually from the/usecasespage.
All vulnerability findings are stored directly in Shuffle's Datastore under the shuffle-security_vulns category. You can query, ingest, and update findings via the REST API, inspect them in the Datastore web console, or access them inside custom Shuffle Python apps.
Inspect and manage vulnerability records in the Datastore console:
/admin/datastore?category=shuffle-security_vulns. Uses the local datastore if available, and automatically redirects to Shuffle Core if local datastore is not configured.https://shuffler.io/admin?tab=datastore&category=shuffle-security_vulns).shuffle-security_vulns.GET /api/v1/vulnerabilitiesGET /api/v1/vulnerabilities/{id}API Call
curl -X GET 'https://<instance>/api/v1/orgs/<org_id>/list_cache?category=shuffle-security_vulns&top=100' \ -H 'Authorization: Bearer $SHUFFLE…'
Response
No response received.
API Call
curl -X POST 'https://<instance>/api/v1/orgs/<org_id>/set_cache' \ -H 'Authorization: Bearer $SHUFFLE…' \ -H 'Content-Type: application/json' \ -d '{ "category": "shuffle-security_vulns", "key": "CVE-2024-3094", "value": "{\"id\":\"CVE-2024-3094\",\"title\":\"XZ Utils Backdoor\",\"severity\":\"critical\",\"category\":\"software_cve\",\"status\":\"open\"}" }'
Response
No response received.
# Retrieve a vulnerability record from the datastore
vuln = self.get_cache("CVE-2024-3094", category="shuffle-security_vulns")
# Check status or update notes
if vuln and vuln.get("status") == "open":
print(f"Open vulnerability: {vuln.get('title')}")
vuln["status"] = "in_progress"
self.set_cache("CVE-2024-3094", vuln, category="shuffle-security_vulns")
For more details on backend API endpoints and datastore caching rules, see the API documentation.