Ir al contenido

Falsos Positivos

IDReglaSeveridadArchivoEstado
FP-01ApexCRUDViolationHighObjectTeamMemberTriggerHandler.clsSuprimido — Contexto de trigger
FP-02ApexCRUDViolationHighObjectTeamMemberController.cls (TeamMemberSelector)Suprimido — Diseño intencional
FP-03ApexSOQLInjectionHighObjectTeamMemberTriggerHandler.clsFalso Positivo — Fuente segura
FP-04ApexSOQLInjectionHighShareRecordQueueable.clsFalso Positivo — Lista blanca
FP-05ApexSOQLInjectionHighObjectTeamMemberController.clsFalso Positivo — Fuente segura
FP-06DebugStatementsLowMúltiples archivosRiesgo Aceptado

FP-01: ApexCRUDViolation en ObjectTeamMemberTriggerHandler

Sección titulada «FP-01: ApexCRUDViolation en ObjectTeamMemberTriggerHandler»
AtributoValor
ArchivoObjectTeamMemberTriggerHandler.cls
LíneaNivel de clase
ReglaApexCRUDViolation
SeveridadHigh
EstadoSuprimido con @SuppressWarnings

Razón: Este manejador de trigger se ejecuta en contexto de trigger donde los permisos CRUD ya han sido validados por el controlador que lo llama (ObjectTeamMemberController). El manejador realiza operaciones a nivel de sistema incluyendo la creación automática de registros Owner y la gestión de registros compartidos, que requieren acceso elevado.

Mitigación: Las verificaciones CRUD se aplican en ObjectTeamMemberController antes de que cualquier operación DML llegue al trigger.


FP-02: ApexCRUDViolation en TeamMemberSelector

Sección titulada «FP-02: ApexCRUDViolation en TeamMemberSelector»
AtributoValor
ArchivoObjectTeamMemberController.cls
Línea129-150 (clase interna)
ReglaApexCRUDViolation
SeveridadHigh
EstadoSuprimido con @SuppressWarnings

Razón: La clase interna TeamMemberSelector usa intencionalmente “without sharing” para permitir a los usuarios ver miembros del equipo en registros a los que tienen acceso. Esto refleja el comportamiento estándar de Salesforce AccountTeamMember.

Mitigación: Los usuarios solo pueden acceder a esto mediante componentes LWC en registros que ya pueden ver. El parámetro recordId proviene del contexto de UI de un registro accesible.


FP-03: ApexSOQLInjection en ObjectTeamMemberTriggerHandler

Sección titulada «FP-03: ApexSOQLInjection en ObjectTeamMemberTriggerHandler»
AtributoValor
ArchivoObjectTeamMemberTriggerHandler.cls
Líneas135, 305
ReglaApexSOQLInjection
SeveridadHigh
EstadoFalso Positivo

Razón: El nombre del objeto usado en SOQL dinámico se deriva de un ID de Salesforce usando el método de plataforma Id.valueOf(actualRecordId).getSObjectType().getDescribe().getName(). Esto no puede ser manipulado por usuarios.

Patrón de Código:

String objectName = Id.valueOf(actualRecordId)
.getSObjectType().getDescribe().getName();
String query = 'SELECT OwnerId FROM '
+ String.escapeSingleQuotes(objectName)
+ ' WHERE Id = :actualRecordId';

Mitigación: El nombre del objeto proviene del ID de Salesforce (no entrada de usuario). Se usan variables de enlace para valores controlados por el usuario. Se aplica escape adicional como defensa en profundidad.


FP-04: ApexSOQLInjection en ShareRecordQueueable

Sección titulada «FP-04: ApexSOQLInjection en ShareRecordQueueable»
AtributoValor
ArchivoShareRecordQueueable.cls
Líneas138-141, 163-167
ReglaApexSOQLInjection
SeveridadHigh
EstadoFalso Positivo

Razón: Los nombres de objetos share provienen de una lista blanca codificada de objetos estándar o siguen un patrón determinista para objetos personalizados.

Lista Blanca:

Map<String, String> standardShareObjects = new Map<String, String>{
'Account' => 'AccountShare',
'Contact' => 'ContactShare',
'Case' => 'CaseShare',
'Lead' => 'LeadShare',
'Opportunity' => 'OpportunityShare',
'Campaign' => 'CampaignShare',
'Order' => 'OrderShare'
};

Mitigación: Nombres de objetos validados contra lista blanca. Los objetos personalizados siguen un patrón seguro (ObjectName__c -> ObjectName__Share). Se usan variables de enlace para todos los valores controlados por el usuario.


FP-05: ApexSOQLInjection en ObjectTeamMemberController

Sección titulada «FP-05: ApexSOQLInjection en ObjectTeamMemberController»
AtributoValor
ArchivoObjectTeamMemberController.cls
Línea89
ReglaApexSOQLInjection
SeveridadHigh
EstadoFalso Positivo

Razón: Igual que FP-03. Nombre de objeto derivado del ID de Salesforce usando la API de plataforma.

Mitigación: Nombre de objeto de Id.getSObjectType().getDescribe().getName(). No se puede falsificar. Se usa variable de enlace para el ID de registro.


AtributoValor
ArchivosObjectTeamMemberTriggerHandler.cls, ShareRecordQueueable.cls, ExpiredTeamMemberCleanupBatch.cls
ReglaDebugStatements
SeveridadLow
EstadoRiesgo Aceptado

Razón: Las declaraciones de depuración se conservan para solución de problemas en producción. Solo registran en niveles ERROR/WARN y no contienen datos sensibles.

Contenido registrado: Mensajes de excepción, conteos de registros, información de estado de trabajos.

Mitigación: La salida de depuración puede filtrarse mediante la configuración de Debug Log de Salesforce. No se registra PII o credenciales.

ControlEstadoImplementación
Verificaciones CRUD en controladoresImplementadoisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Aplicación de FLSImplementadoPermission Sets controlan el acceso a campos
Prevención de inyección SOQLImplementadoVariables de enlace para entrada de usuario, lista blanca para nombres de objetos
Sharing modelImplementadowith sharing en controladores, without sharing solo donde está documentado
Validación de entradaImplementadoVerificaciones de nulo, validación de formato, reglas de negocio
Prevención de XSSImplementadoEl framework LWC maneja la codificación de salida
VerificaciónResultado
Llamadas HTTPNinguna — el paquete no realiza llamadas externas
Named CredentialsNo usado
External ObjectsNo usado
Remote Site SettingsNo requerido