Skip to content

Findings

A finding is a specific security issue, misconfiguration, compliance gap, or vulnerability discovered during an inspection run.


Browsing findings

Open a completed run and click the Findings tab. Each row shows:

Column Description
Severity critical · high · medium · low · informational
Title Short description of the issue. A green 🔧 Fix badge appears once a fix has been proposed for this finding. A finding without the badge can still have a remediation template: open it to see.
Resource Human-readable resource name (e.g. my-s3-bucket extracted from an ARN, or prod-cluster/default/my-pod for a Kubernetes resource). The raw resource_id is visible in the finding detail sheet.
Agent Which scanner discovered it
Compliance Frameworks and control IDs this finding maps to

View modes

Toggle between two views using the buttons at the top of the Findings tab:

  • All Findings - flat list of every finding in this run, sorted by severity
  • Grouped by Pattern - findings grouped by their pattern_fingerprint (same rule, same resource type). Rows are collapsible; expand a group to see all occurrences. Use this view to identify systemic issues affecting many resources at once.

Note: When navigating from the WAF tab, the view is locked to All Findings - WAF findings are associated with individual resources and do not benefit from pattern grouping.


Filtering

Use the collapsible filter sidebar (click the filter icon to toggle). All filters are applied in combination. Click Clear All to reset.

Severity

Select one or more levels (Critical, High, Medium, Low, Info). Multiple selections are OR'd - selecting Critical + High shows findings at either severity.

Cloud

Filter to a specific cloud provider: AWS, Azure, or GCP.

When a cloud provider is selected, a Region text field appears - enter a region name (e.g. us-east-1) to narrow further.

Source

Filter findings by which scanner agent produced them:

Option Agent
Cloud Cloud Inspector (AWS, Azure, GCP resource checks)
Codebase Codebase Analyzer (secrets, IaC, SAST, dependencies, SBOM)
Kubernetes Kubernetes Inspector (in-cluster security checks)
Container Container Scanner (CVE scanning, OS compliance)
WAF WAF Assessor (Well-Architected Framework findings)
Pentest Pentest Agent (uploaded reports and agent-run checks); see Penetration Testing

Codebase scanner sub-filters

When Codebase is selected, an additional Scanner section appears with fine-grained sub-filters:

Sub-filter Scanner Finding types
Secrets Gitleaks + TruffleHog Hardcoded credentials, API keys, tokens
IaC Checkov Terraform, CloudFormation, Kubernetes manifest misconfigurations
SAST Semgrep Source code security anti-patterns
Deps pip-audit + osv-scanner + govulncheck Known CVEs in dependencies
SBOM Syft + Grype License violations, package vulnerabilities

Selecting a sub-filter shows only findings from that specific scanner while keeping the source filter on Codebase. Switching to a different source (e.g. Cloud) automatically clears the scanner sub-filter.

Category

Filter by what kind of finding it is:

Category Meaning
Check A configuration check failed
Relationship A relationship between resources (e.g. an over-broad permission edge)
Secret A credential found in code
Vulnerability A CVE in a dependency or image
License A prohibited open-source license
Composite A composite alert - two findings that are dangerous together

Remediation

The Remediation section of the filter sidebar surfaces fixability as a first-class filter:

  • Has Fix toggle - show only findings that have a matching remediation template (based on the finding's check ID), or a fix that has already been proposed. Useful for building a "what can I fix right now?" work queue.
  • Fix Status dropdown - filter by the remediation workflow state. Only visible when Has Fix is enabled.
Fix Status Meaning
Proposed A remediation has been proposed for this finding but not yet approved
Approved Remediation approved; fix is ready to apply
Applied Fix has been applied and is awaiting verification

Filter state is preserved in the URL - share a link pre-filtered to "Has Fix + Proposed" to hand off a fix queue to another operator.

AI Workloads and WAF-only

Two independent toggles narrow the list to a specific finding origin regardless of the Source filter above: AI Workloads shows only AI-SPM findings, and WAF-only shows only WAF Assessor findings. Both can be combined with any other filter.

False positives

Toggle on to show only findings marked as false positives; toggle off (default) to hide them.


In addition to the instant substring search box, press Enter in the search box to run an AI-interpreted search: a short natural-language description like critical S3 findings from last week or unresolved secrets in the payments repo is translated into structured filters automatically.

The results banner shows "AI interpreted your query as..." with the filters that were actually applied, so you can verify the interpretation before trusting the results. Changing any other filter clears the natural-language search and returns to the normal instant filter.

Note: If the AI interpreter is unavailable, the search box falls back to a plain server-side substring search instead of failing outright.


Severity levels

Level Meaning
Critical Immediate risk of breach or data exposure. Address within 24 hours.
High Significant risk. Address within the current sprint.
Medium Moderate risk. Address within the current quarter.
Low Minor risk or best-practice gap.
Informational Observations with no direct security impact.

Finding detail

Click any finding to open the detail sheet. It has three tabs:

Details tab

  • Full description and evidence
  • Remediation panel - when a matching template exists, shows the best-matched remediation template with:
  • Risk badge (low / medium / high) and estimated operator time
  • Numbered step list with the specific resource ID already filled in
  • Tabbed code snippets - Steps · CLI · Terraform · IaC (only tabs with content are shown)
  • Propose Fix button - creates a remediation proposal for this finding; disabled once proposed
  • Approve button - available after a fix has been proposed; approves it for application
  • AI-suggested fix: when no deterministic remediation template matches, an LLM-generated fix may be offered instead. Accepting it opens a real, reviewable pull request on the source repository with the change; VirtualSutra never merges it or writes directly to your default branch. Requires the remediation:approve scope. If the LLM is unavailable, this control shows a clear "unavailable" state rather than a broken button.
  • Compliance controls - which specific control IDs across frameworks this finding violates
  • Raw evidence - the raw API response or scan output (expandable)

How a fix is matched to a finding

Where a scanner names the exact check that failed and that check identifies the problem on its own - infrastructure-as-code, Kubernetes and OS-compliance findings - VirtualSutra selects the remediation template by that check, never by words in the finding's title. A template is offered only when it was written for that check. Other findings, such as cloud account checks, vulnerable packages, detected secrets and web application findings, are matched by what the finding describes.

The 🔧 Fix badge and the Has Fix filter are quick indicators and do not always agree with the detail sheet. The badge appears once a fix has been proposed; the filter also lists findings whose check has a template but no proposed fix yet. A finding with neither may still show a template in its Remediation panel. If no template matches, the detail sheet shows a Remediation heading with "No matching remediation template for this finding."

History tab

Shows every run in which this finding (matched by fingerprint) has appeared:

Column Description
Run Run name and date
Severity Severity recorded in that run (may differ if it changed)
Status new, persisted, resolved, escalated, de-escalated

Use the History tab to track whether a finding has persisted across multiple scans, understand when it first appeared, or confirm it was resolved after remediation.


Composite alerts

Some findings are only alarming together. A public S3 bucket is a finding. PII in a bucket is a finding. A public bucket that contains PII is an emergency - and neither individual finding says so.

A composite alert is a single finding that says it. It is produced by fixed, reviewable rules - not by a language model - and it always names the exact findings that triggered it.

What triggers one

Composite Fires when
Internet-exposed resource has a critical vulnerability A publicly reachable resource also carries a critical CVE
Over-privileged identity has a compromised or unrotated credential An identity with broad permissions also has a leaked, hardcoded or unrotated credential
Publicly accessible storage contains PII A public storage resource also has a PII finding
Unsigned container image has a critical vulnerability An image that is unsigned (or whose signature could not be verified) also carries a critical CVE
Privileged pod is bound to a cluster-admin role A privileged pod runs in a namespace that also has a cluster-admin role binding

How they behave

  • Severity is raised one level above the worst member, capped at Critical. Two High findings that combine into a composite produce a Critical alert.
  • Select Composite in the Category filter to see only composite alerts.
  • They behave like any other finding everywhere else: they appear in reports and exports, trigger notifications (including on-call paging), can be muted or marked false positive, and deduplicate across runs so you can watch one in the History tab.

Member Findings

Open a composite alert and its detail sheet shows a Member Findings (n) list directly under the summary, above any remediation panel. Each row shows the member's severity badge and title.

  • Click a member to open it in place - the sheet swaps to that finding and the header gains a Back to … control that returns you to the composite.
  • Long lists are capped at the first 20 rows with a +n more line.

Verified safe versions on dependency fixes

When a dependency finding has a remediation, VirtualSutra checks the proposed target version against every published advisory for that package rather than trusting whichever "fixed version" the scanner happened to record. The remediation header shows one of two badges:

Badge Meaning
Verified safe: <version> That version is affected by no known advisory. Hover for when the check ran and how many advisories were considered
Unverified The version could not be confirmed. Hover for the reason

The Unverified reasons are:

Reason shown What it means
OSV enrichment is disabled or unreachable Your administrator turned the check off, or this is an air-gapped deployment. Nothing was looked up
No advisory-clear version was found Advisories exist and no published version escapes all of them - upgrading alone will not fix it
OSV lookup failed The lookup itself errored. Try again later

No badge at all means this remediation is not a dependency upgrade, so there is nothing to verify.

This is a different thing from the verification status of an applied fix

Verified safe says the version we are proposing is clean. It says nothing about whether you applied the fix. Whether a later scan confirmed an applied fix actually worked is tracked separately on the remediation's own lifecycle.


Marking false positives

If a finding does not apply to your environment, toggle Mark as false positive on the finding detail. False positives stay visible with a badge but are excluded from compliance scoring.


Deduplication

If the same underlying issue appears across multiple runs, VirtualSutra deduplicates it using a fingerprint. Deduplicated findings show a Deduplicated badge.


Issues

Persistent findings are automatically promoted to Issues - tracked entities with a full state machine:

Status Meaning
Open Active issue requiring attention
Snoozed Acknowledged; suppressed until a specified date
Dismissed Intentionally closed without remediation
Resolved Remediation confirmed

Browse all issues under the top-level Issues navigation item. Each issue links to the findings that triggered it and shows first/last seen timestamps.


Mute rules

Pattern-based mute rules suppress findings that match a fingerprint pattern, check ID, or resource path - across all runs. Manage mute rules under Settings → Mute Rules. Rules can be imported in bulk via YAML.


Resource catalog

The Resources tab on the Run Detail page groups all findings by the resource they affect, giving you a resource-centric view alongside the finding-centric Findings tab.

Each row in the resource catalog shows:

Column Description
Resource Human-readable name (e.g. my-s3-bucket, prod-cluster/default/my-pod)
Type Resource type (e.g. aws::s3::bucket, k8s:deployment, container:image; a Kubernetes workload's type is its kind, k8s:pod only for a bare or static pod)
Cloud Cloud provider (aws, azure, gcp) or k8s / container
Region Cloud region where the resource lives, if applicable
Agent Source agent that reported findings for this resource
Findings Total finding count across all severities
Worst Severity Highest severity finding on this resource

The resource catalog is read from GET /runs/{run_id}/resources. It is available as soon as the run completes and does not require any additional configuration.


On the Map tab, click View Findings → on any tile to jump to the Findings tab pre-filtered for that tile's context:

Tile type Pre-selected filter
Codebase Source = Codebase
Kubernetes Source = Kubernetes
Cloud (AWS/Azure/GCP) Cloud provider = the tile's provider

The findings are opened in All Findings (flat) view.


Attack path analysis

On the Map tab, an attack paths overlay draws directional red edges between nodes on the service map, showing multi-step chains an attacker could realistically follow. For example, an internet-facing security group into an over-privileged IAM role into a sensitive S3 bucket. Each step is numbered on the map; click a path to open the Attack Path Detail panel with the full chain, the specific findings backing each step, and the reasoning behind the chain.

Toggle the overlay off with Show attack paths if you just want the plain service map. A run with no correlated attack paths simply shows no overlay; this isn't an error state.

Note: Attack paths are generated by an LLM correlating the security graph (see below) with your findings, and are only as complete as the graph data available for that run. Treat a path as a strong lead to investigate, not a guarantee that no other paths exist.

The security graph

Behind the attack-path overlay is a graph of your environment's resources and the relationships between them (e.g. "security group X allows ingress from Y", "role A can assume role B"). The graph is built automatically from each run's findings, primarily security-group reachability and infrastructure-as-code relationship findings, and requires no separate configuration.


Effective permissions (CIEM)

Cloud Infrastructure Entitlement Management (CIEM) findings surface principals (users, roles, service accounts) whose effective permissions are broader than their attached policies suggest once role assumption, group membership, and policy composition are taken into account. For example, a role that can escalate itself to admin via iam:PassRole, or a service account with an unused Owner binding.

These show up as regular findings with finding_category: relationship, filterable and viewable the same way as any other finding. Coverage differs by provider:

Provider What's evaluated
AWS Real simulation via IAM's policy simulator. Flags principals that can reach privilege-escalation actions (iam:PassRole, sts:AssumeRole, etc.), plus assumes_role relationships extracted from trust policies
Azure Role assignments unioned across the scope hierarchy. This is an approximation, not full parity with AWS: it does not evaluate Azure ABAC conditions or data-plane actions
GCP Scoped to service-account principals, plus a direct check for roles/owner/roles/editor bindings on any principal type

CIEM runs automatically as part of a cloud inspection (there's no separate toggle), provided the account's credentials include the permissions listed in Cloud Account Configuration. If those permissions are missing, the check is not evaluated: the findings the scan did collect are kept, the account's task completes with the check named in its message and in the Cloud scan coverage record (which carries the role to grant and the command that grants it), and the run ends partial. This is the same for AWS, Azure and GCP.


AI workload security (AI-SPM)

AI Security Posture Management (AI-SPM) findings cover AI/ML services deployed in your cloud accounts: Amazon Bedrock and SageMaker, Azure OpenAI, and Google Vertex AI. Checks look for issues like missing invocation logging, absent guardrails/content filters, public network access to a model endpoint, and over-permissive execution roles.

Turn a scan on by setting enable_ai_spm on the relevant cloud account connection (Settings > Connections > Cloud) or directly in the inspection scope. Findings are tagged so you can filter to just AI workloads using the AI Workloads toggle in the filter sidebar (alongside the WAF-only toggle covered under Filtering above).

AI-SPM findings map to two additional compliance frameworks; see Compliance for exactly which risks/functions are covered and which are deliberately not claimed as covered.


Comparing runs (diff)

The Run Detail page shows a diff against the previous baseline run:

Status Meaning
New First appeared in this run
Resolved Was in the baseline, no longer present
Persisted Present in both baseline and this run
Escalated Severity increased since the baseline
De-escalated Severity decreased since the baseline