Skip to main content

AgentExchange Top-20 vulnerabilities (Vulkro coverage)

Salesforce publishes the Top 20 vulnerabilities found in the AgentExchange (formerly AppExchange) Security Review, ranked by how often submissions fail on them. This page maps each one to the Vulkro check that covers it.

vulkro-sf scan ./my-package
vulkro-sf appexchange-report ./my-package -o report.html
#VulnerabilityVulkro coverage
1CRUD/FLS enforcementCovered: queries and DML without USER_MODE, WITH SECURITY_ENFORCED or access checks (Apex)
2Insecure software versionCovered for JavaScript: vulnerable libraries in static resources, LWC and Aura (SCA). Apex has no package manager.
3Sharing violationCovered: without sharing or no sharing keyword on reachable classes; agent actions on such classes (Apex, Agentforce)
4Insecure storage of sensitive dataCovered: secrets in Apex, LWC, static resources and metadata (Connected Apps, Named Credentials)
5TLS/SSL configurationCovered: TLS checks
6Sensitive information in debugCovered: System.debug of password, token, key or session values
7CSRFCovered: CSRF protection off in SecuritySettings; DML in a Visualforce controller constructor
8Stored and reflected XSSCovered: Visualforce and LWC and Aura
9JavaScript not in static resourcesCovered: <apex:includeScript> from an external URL
10SOQL injectionCovered: untrusted input in dynamic SOQL without binding or escaping
11Lightning: improper CSS loadOut of scope (cosmetic)
12JavaScript in Salesforce DOM (Classic)Out of scope (Classic only)
13Information disclosure on errorsCovered: Exception.getStackTraceString()
14Aura: CSS outside componentOut of scope (cosmetic)
15Message channel exposedCovered: <isExposed>true</isExposed> on a Lightning Message Channel
16Sensitive info in URLCovered: tokens, passwords or keys concatenated into PageReference or callout URLs
17Insecure endpointCovered: http:// remote sites, Named Credentials and callouts
18Username or email enumerationOut of scope (needs dynamic testing)
19Password managementCovered: password policy in SecuritySettings. Runtime behaviour needs dynamic testing.
20Password echoOut of scope (needs dynamic testing)

15 covered, 5 out of scope. The methodology explains how coverage is recorded.

Also checked, beyond the Top 20​

  • Mass assignment: JSON.deserialize into an SObject without Security.stripInaccessible.
  • Record access by ID without an access check (IDOR).
  • Flows that run DML in system mode.
  • Agentforce actions on without sharing classes (the ForcedLeak class). See the breach class map.

See also: AgentExchange readiness report, Methodology