Pular para o conteúdo

Falsos Positivos

IDRegraSeveridadeArquivoStatus
FP-01ApexCRUDViolationHighObjectTeamMemberTriggerHandler.clsSuprimido — Contexto de trigger
FP-02ApexCRUDViolationHighObjectTeamMemberController.cls (TeamMemberSelector)Suprimido — Design intencional
FP-03ApexSOQLInjectionHighObjectTeamMemberTriggerHandler.clsFalso Positivo — Fonte segura
FP-04ApexSOQLInjectionHighShareRecordQueueable.clsFalso Positivo — Whitelist
FP-05ApexSOQLInjectionHighObjectTeamMemberController.clsFalso Positivo — Fonte segura
FP-06DebugStatementsLowMúltiplos arquivosRisco Aceitável

FP-01: ApexCRUDViolation em ObjectTeamMemberTriggerHandler

Seção intitulada “FP-01: ApexCRUDViolation em ObjectTeamMemberTriggerHandler”
AtributoValor
ArquivoObjectTeamMemberTriggerHandler.cls
LinhaNível de classe
RegraApexCRUDViolation
SeveridadeHigh
StatusSuprimido com @SuppressWarnings

Razão: Este trigger handler executa em contexto de trigger onde permissões CRUD já foram validadas pelo controller chamador (ObjectTeamMemberController). O handler executa operações em nível de sistema incluindo criação automática de registros Owner e gerenciamento de registros de compartilhamento, que requerem acesso elevado.

Mitigação: Verificações CRUD são aplicadas em ObjectTeamMemberController antes que qualquer operação DML alcance o trigger.


AtributoValor
ArquivoObjectTeamMemberController.cls
Linha129-150 (classe interna)
RegraApexCRUDViolation
SeveridadeHigh
StatusSuprimido com @SuppressWarnings

Razão: A classe interna TeamMemberSelector intencionalmente usa “without sharing” para permitir que usuários vejam membros da equipe em registros aos quais têm acesso. Isso espelha o comportamento padrão do AccountTeamMember do Salesforce.

Mitigação: Usuários só podem acessar isso via componentes LWC em registros que já podem visualizar. O parâmetro recordId vem do contexto UI de um registro acessível.


FP-03: ApexSOQLInjection em ObjectTeamMemberTriggerHandler

Seção intitulada “FP-03: ApexSOQLInjection em ObjectTeamMemberTriggerHandler”
AtributoValor
ArquivoObjectTeamMemberTriggerHandler.cls
Linhas135, 305
RegraApexSOQLInjection
SeveridadeHigh
StatusFalso Positivo

Razão: O nome do objeto usado em SOQL dinâmico é derivado de um ID Salesforce usando o método da plataforma Id.valueOf(actualRecordId).getSObjectType().getDescribe().getName(). Isso não pode ser manipulado por usuários.

Padrão de Código:

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

Mitigação: Nome do objeto vem de ID Salesforce (não entrada de usuário). Bind variables usadas para valores controlados por usuário. Escape adicional aplicado como defesa em profundidade.


AtributoValor
ArquivoShareRecordQueueable.cls
Linhas138-141, 163-167
RegraApexSOQLInjection
SeveridadeHigh
StatusFalso Positivo

Razão: Nomes de objetos Share vêm de uma whitelist codificada de objetos padrão ou seguem um padrão determinístico para objetos personalizados.

Whitelist:

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

Mitigação: Nomes de objeto validados contra whitelist. Objetos personalizados seguem padrão seguro (ObjectName__c -> ObjectName__Share). Bind variables usadas para todos os valores controlados por usuário.


FP-05: ApexSOQLInjection em ObjectTeamMemberController

Seção intitulada “FP-05: ApexSOQLInjection em ObjectTeamMemberController”
AtributoValor
ArquivoObjectTeamMemberController.cls
Linha89
RegraApexSOQLInjection
SeveridadeHigh
StatusFalso Positivo

Razão: Mesmo que FP-03. Nome do objeto derivado de ID Salesforce usando API da plataforma.

Mitigação: Nome do objeto de Id.getSObjectType().getDescribe().getName(). Não pode ser falsificado. Bind variable usada para ID de registro.


AtributoValor
ArquivosObjectTeamMemberTriggerHandler.cls, ShareRecordQueueable.cls, ExpiredTeamMemberCleanupBatch.cls
RegraDebugStatements
SeveridadeLow
StatusRisco Aceitável

Razão: Debug statements são mantidos para troubleshooting de produção. Eles registram apenas em níveis ERROR/WARN e não contêm dados sensíveis.

Conteúdo registrado: Mensagens de exceção, contagens de registros, informações de status de job.

Mitigação: Saída de debug pode ser filtrada via configurações de Debug Log do Salesforce. Sem PII ou credenciais registradas.

ControleStatusImplementação
Verificações CRUD em controllersImplementadoisAccessible(), isCreateable(), isUpdateable(), isDeletable()
Aplicação FLSImplementadoPermission Sets controlam acesso a campos
Prevenção de injeção SOQLImplementadoBind variables para entrada de usuário, whitelist para nomes de objeto
Sharing modelImplementadowith sharing em controllers, without sharing apenas onde documentado
Validação de entradaImplementadoVerificações null, validação de formato, regras de negócio
Prevenção XSSImplementadoFramework LWC trata codificação de saída
VerificaçãoResultado
HTTP CalloutsNenhum — pacote não faz chamadas externas
Named CredentialsNão usado
External ObjectsNão usado
Remote Site SettingsNão necessário