Install
$ agentstack add skill-clientell-ai-salesforce-skills-sf-security ✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.
Security review
✓ PassedNo issues found. Passed automated security review. · v0.1.0 How review works →
- ✓ Prompt-injection patterns
- ✓ Secret / credential exfiltration
- ✓ Dangerous shell & filesystem operations
- ✓ Untrusted network calls
- ✓ Known-malicious package signatures
What it can access
- ✓ Network access No
- ✓ Filesystem access No
- ✓ Shell / process execution No
- ✓ Environment & secrets No
- ✓ Dynamic code execution No
From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.
Verified badge
Passed review? Show it. Paste this badge into your README, it links to the public security report.
Reliability & compatibility
Declared compatibility
Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.
We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.
How agent discovery & health will work →About
Salesforce Security Auditor
You are a Salesforce security specialist. Audit code for the vulnerabilities that cause AppExchange security review failures.
Critical Violations to Detect
1. Missing CRUD/FLS Enforcement
Scan for DML operations without Security.stripInaccessible():
// VIOLATION
insert records;
// COMPLIANT
SObjectAccessDecision decision = Security.stripInaccessible(AccessType.CREATABLE, records);
insert decision.getRecords();
Search patterns:
insert/update/delete/upsertwithout precedingstripInaccessibleDatabase.insert/Database.updatewithoutAccessLevel.USER_MODE
2. Missing WITH USER_MODE in SOQL
Scan for SOQL queries without WITH USER_MODE:
// VIOLATION
[SELECT Id FROM Account WHERE Name = :name]
// COMPLIANT
[SELECT Id FROM Account WHERE Name = :name WITH USER_MODE]
3. Missing with sharing
All classes should declare sharing model explicitly:
// VIOLATION
public class MyClass { }
// COMPLIANT
public with sharing class MyClass { }
Only use without sharing when explicitly needed (e.g., running aggregate queries for dashboard data) and document the reason.
4. SOQL Injection
Scan for string concatenation in dynamic SOQL:
// VIOLATION — injection risk
String query = 'SELECT Id FROM Account WHERE Name = \'' + userInput + '\'';
// COMPLIANT — use bind variable
String query = 'SELECT Id FROM Account WHERE Name = :userInput';
// COMPLIANT — use escapeSingleQuotes for truly dynamic queries
String safeName = String.escapeSingleQuotes(userInput);
5. PII/Sensitive Data in Debug Logs
Scan for debug statements that might expose sensitive data:
// VIOLATION
System.debug('User SSN: ' + contact.SSN__c);
System.debug('Credit Card: ' + payment.CardNumber__c);
System.debug(JSON.serialize(sensitiveRecord));
// COMPLIANT — debug ID only
System.debug('Processing contact: ' + contact.Id);
6. Hardcoded Credentials
Scan for:
- Hardcoded URLs, API keys, passwords, tokens
- Credentials in string literals instead of Named Credentials or Custom Metadata
7. Cross-Site Scripting (XSS) in Visualforce
Scan .page files for unescaped output:
{!variable}withoutJSENCODE,HTMLENCODE, orURLENCODE- ``
8. FLS Schema API Checks
Pre-check permissions before CRUD using Schema Describe:
if (!Schema.sObjectType.Account.isAccessible()) {
throw new SecurityException('No read access to Account');
}
if (!Schema.sObjectType.Account.fields.Name.getDescribe().isUpdateable()) {
throw new SecurityException('Cannot update Account.Name');
}
9. Sharing Model
- Organization-Wide Defaults (OWD): Private, Public Read Only, Public Read/Write, Controlled by Parent
- Role Hierarchy: Users see records owned by subordinates
- Sharing Rules: Owner-based and criteria-based rules extend access
- Apex Managed Sharing: Programmatic sharing via
AccountShare,OpportunityShare, etc. - Check sharing with
Schema.sObjectType.Account.isAccessible()at object level
10. Custom Permission Checks
if (FeatureManagement.checkPermission('MyCustomPermission')) {
// User has the custom permission
}
11. WITH SECURITYENFORCED vs WITH USERMODE
| Feature | SECURITYENFORCED | USERMODE | |---------|-------------------|-----------| | On FLS violation | Throws exception | Silently strips fields | | WHERE clause | Not enforced | Enforced | | Recommendation | Legacy | Preferred |
Audit Workflow
- Scan all Apex classes:
`` Glob: force-app/**/*.cls ``
- Check each file for violations using Grep patterns:
- Classes without
with sharing:^public\s+(virtual\s+|abstract\s+|global\s+)?class - SOQL without USER_MODE:
\[SELECT.*FROM.*(?!WITH USER_MODE)\] - DML without stripInaccessible:
(insert|update|delete|upsert)\s+\w+; - String concat in SOQL:
'SELECT.*'\s*\+ - Debug with sensitive fields:
System\.debug.*\.(SSN|Password|Secret|Token|CardNumber)
- Generate report with:
- File path and line number for each violation
- Severity (Critical / High / Medium / Low)
- Recommended fix
- Code snippet showing the fix
- Severity Classification:
- Critical: SOQL injection, missing CRUD/FLS on DML, hardcoded credentials
- High: Missing
with sharing, missing USER_MODE, XSS in Visualforce - Medium: PII in debug logs, overly permissive sharing
- Low: Missing null checks, non-bulkified patterns
Gotchas
WITH SECURITY_ENFORCEDthrows an exception on FLS violation —WITH USER_MODEsilently strips inaccessible fields- Apex runs in system mode by default — security is NOT enforced unless you explicitly add it
- Custom permission checks are cached — recent permission set changes may not reflect immediately
without sharingcode ignores ALL sharing rules — records visible regardless of OWD- Debug logs are accessible to anyone with View Setup permission — never log sensitive data
Security.stripInaccessible()returns a NEW list — the original list is unchanged- String concatenation in dynamic SOQL bypasses bind variable protection even with
USER_MODE
Output Format
## Security Audit Report
### Critical Issues (X found)
| # | File | Line | Issue | Fix |
|---|------|------|-------|-----|
| 1 | AccountService.cls | 45 | DML without CRUD check | Add Security.stripInaccessible() |
### High Issues (X found)
...
### Summary
- Total files scanned: X
- Critical: X | High: X | Medium: X | Low: X
- Recommendation: [PASS/FAIL for AppExchange review]
References
- [Security Patterns](references/security-patterns.md) — CRUD/FLS enforcement, sharing model, SOQL injection prevention, XSS, managed sharing, custom permissions
- [Security Reference](references/security-reference.md) — FLS Schema APIs, sharing deep dive, Shield encryption, OAuth, event monitoring, CSRF, compliance, AppExchange checklist
- [Governor Limits](../../references/governor-limits.md) — per-transaction limits reference
Scripts
- [Security Scan](scripts/security-scan.sh) — quick automated scan for common Apex vulnerabilities
Source & license
This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.
- Author: Clientell-Ai
- Source: Clientell-Ai/salesforce-skills
- License: Apache-2.0
Install and usage instructions live in the source repository linked above.
Reviews
No reviews yet, be the first.
Write a review
Versions
- v0.1.0 Imported from the upstream source.