Skip to main content

Methodology: what a safe Salesforce app should be

This page names the standard we measure Vulkro for Salesforce against and records, item by item, whether a detector covers it. The detector code is closed source; the standard, the rule IDs and the coverage status are public so you can check them.

The standard​

We measure against four published sources:

  1. Salesforce Well-Architected: three pillars (Trusted, Easy, Adaptable) with documented anti-patterns.
  2. The AgentExchange (formerly AppExchange) Security Review: the Security Requirements Checklist and Salesforce's ranked Top 20 vulnerabilities found in reviews.
  3. OWASP API Security Top 10: every finding carries an OWASP category.
  4. The 2025-26 Salesforce breach classes: what actually compromised real orgs (OAuth token theft, guest-user exposure, vishing, ForcedLeak).

We also compare the Apex rules of the platform's own code analyzer, which every Salesforce review runs.

How coverage is recorded​

Every requirement in those sources maps to one row with one state:

StateMeaning
CoveredA detector ships and emits a finding for it.
PartialA detector covers part; the gap is named.
PlannedIn scope, not shipped yet.
Out of scopeNot for a static, point-in-time CLI (DAST, behaviour analytics).

A row moves to Covered only when the detector and its finding ID ship in the same change, and the changelog records it.

Coverage summary​

GroupCoveredPartialPlannedOut of scope
AppExchange Top-2015005
Metadata types (security-relevant subset, ~30)29008
Apex security rules10000
Apex error-prone (security-adjacent)4002
Apex performance3000
Well-Architected anti-patterns (statically detectable subset)14001
Breach-class map5000

Top-20 coverage​

#VulnerabilityStateDetector
1CRUD / FLS enforcementCoveredapex_crud_fls
2Insecure software versionCovered (JS only)Vulnerable JavaScript libraries; Apex has no package manager
3Sharing violationCoveredapex_crud_fls, sf_agentforce
4Insecure storage of sensitive dataCoveredMetadata and source secret checks
5TLS / SSL configurationCoveredTLS checks
6Sensitive information in debugCoveredsf_apex_logging
7CSRFCoveredSecuritySettings CSRF off; sf_apex_csrf
8Stored and reflected XSSCoveredsf_visualforce, sf_lwc
9JavaScript not in static resourcesCoveredsf_apex_url_safety
10SOQL injectionCoveredApex SOQL injection
11Lightning: improper CSS loadOut of scopeCosmetic
12JavaScript in Salesforce DOM (Classic)Out of scopeClassic only
13Information disclosure on errorsCoveredsf_apex_url_safety (stack traces)
14Aura CSS outside componentOut of scopeCosmetic
15Message channel exposedCoveredsf_message_channels
16Sensitive info in URLCoveredsf_apex_url_safety
17Insecure endpointCoveredRemoteSiteSetting and HTTP checks
18Username or email enumerationOut of scopeNeeds DAST
19Password managementCoveredSecuritySettings password policy
20Password echoOut of scopeNeeds DAST

Details per item: AgentExchange Top-20 coverage.

Well-Architected​

The Trusted pillar (Secure, Compliant, Reliable) holds every security requirement and the governor-limit reliability rules. Easy and Adaptable add design anti-patterns such as hardcoded IDs and URLs and multiple triggers per object. Security findings come from vulkro-sf scan; architecture findings come from vulkro-sf antipatterns.

Code: Apex, LWC, Aura, Visualforce​

  • Apex: a sharing mode on every class; CRUD/FLS through WITH USER_MODE, AccessLevel.USER_MODE or Security.stripInaccessible; bind variables or String.escapeSingleQuotes for SOQL; no MD5, SHA-1, static IV or Math.random() tokens; secrets in Named or External Credentials, never in source; nothing sensitive in System.debug.
  • LWC and Aura: no innerHTML from untrusted data under lwc:dom="manual"; no aura:unescapedHtml on user content; message channels not exposed without need; scripts packaged as static resources.
  • Visualforce: no escape="false" on user content; <apex:includeScript> only from static resources. See Visualforce.

All ten Apex security rules of the platform code analyzer, four of its six error-prone rules and its three performance rules are covered.

Metadata​

About 30 metadata types are security relevant. Covered in depth: Profile, PermissionSet, ConnectedApp, NamedCredential, SecuritySettings (10 checks), StaticResource, and the Agentforce types (GenAiFunction, GenAiPromptTemplate, Bot). Also covered: permission set groups, external credentials, SAML and auth providers, login flows and IP ranges, remote sites, CORS and CSP trusted sites, certificates, sharing rules and sharing sets, sites, Experience Cloud networks, flows, triggers, outbound messages, external data sources and services, custom metadata, and web links. Out of scope: email templates, documents, approval, assignment and auto-response rules, groups and mobile settings.

Anti-patterns​

AP-001 to AP-014 cover SOQL, DML and describe calls in loops, hardcoded IDs and URLs, empty catch blocks, trigger design, @future in triggers, missing tests, mixed DML, unbounded SOQL and SeeAllData=true. Report-design checks are out of scope. See Well-Architected anti-patterns.

Breach classes​

Breach classWhat Vulkro flags
OAuth token theft (2025, two vendor apps)Connected Apps with Full scope and a refresh token
Experience Cloud guest-user exposureGuest profiles that read sensitive objects or View All Records
Vishing that installs a malicious Connected AppThe broad-scope app and dormant admins; the call itself is out of reach
ForcedLeak (Agentforce)Agent Apex actions on without sharing classes; prompt-grounding check planned

Details: Breach class map.

Out of scope for the CLI​

The CLI is point in time and keeps no standing connection to your org. Scheduled scans and change history across orgs are covered by Vulkro Cloud. Dynamic testing, behaviour analytics, password-reuse checks and account enumeration need a running system to probe, so a static scanner does not cover them.

See also: Well-Architected anti-patterns, AgentExchange readiness report