Prévias de notificações de aprovação: proteja os detalhes das ações
As prévias de notificações de aprovação podem expor ações de agentes em telas bloqueadas. Saiba o que mostrar, redigir, testar e manter dentro do app autenticado.

As prévias de notificações de aprovação merecem o mesmo threat modeling que a ação anunciada. Uma solicitação para fazer deploy de código, chamar uma API de cliente ou executar um comando remoto pode revelar informações sensíveis antes que alguém pressione «Aprovar». Se essa informação aparecer em um telefone bloqueado, em um desktop compartilhado, em uma tela de sala de reunião ou em um dispositivo vestível espelhado, o sistema de aprovação já divulgou parte da operação.
O erro mais comum é tratar a notificação como uma simples peça de infraestrutura. Ela é um canal de saída com público, retenção e controles de acesso próprios. Projete-a como um convite deliberadamente limitado para entrar em uma área protegida de decisão. Não a trate como uma versão reduzida da tela de aprovação.
A tela bloqueada é uma fronteira de exposição
Uma tela bloqueada pode ficar visível para colegas, familiares, visitantes, sistemas de câmera e qualquer pessoa que passe por uma mesa. O proprietário pode estar por perto, mas proximidade não é autenticação. Essa distinção parece óbvia até que um alerta de aprovação mostre um hostname de produção, o nome de um cliente, uma etiqueta de incidente ou a primeira linha de um comando de shell.
Muitas equipes classificam uma notificação como pouco sensível porque ela não contém um segredo. Esse teste é estreito demais. Um endpoint como billing-prod.internal, um caminho como /customers/28471/refund ou uma mensagem como Rotate compromised access token podem revelar sistemas, relacionamentos e estado operacional. Um invasor que reúna esses fragmentos não precisa de um bearer token para obter vantagem.
Pense no que um observador pode deduzir de cada campo:
- Um destino pode identificar um cliente, uma região, um produto ou um serviço de produção.
- Uma operação pode revelar que uma conta está sendo alterada, que um reembolso está pendente ou que há um incidente em andamento.
- A identidade de um agente pode mostrar em qual repositório ou tarefa um desenvolvedor está trabalhando.
- Um campo de motivo costuma conter texto de ticket copiado, entrada de usuário ou notas de incidente.
- Um resultado pode revelar dados que a ação recuperou antes de o usuário tomar uma decisão.
A tela bloqueada é apenas a primeira fronteira de exposição. Os sistemas operacionais podem mostrar o mesmo texto em uma central de notificações depois que o dispositivo é desbloqueado. Uma notificação de desktop pode permanecer no histórico depois que alguém deixa uma estação de trabalho compartilhada. Um relógio pode espelhá-la. Gravações de tela, softwares de suporte remoto e videochamadas podem capturá-la. A prévia precisa resistir a todos esses contextos.
A documentação Platform Security da Apple descreve a tela bloqueada como um estado protegido do dispositivo e coloca a autenticação do usuário no centro do acesso a dados protegidos. Esse modelo não transforma o texto da notificação em dado protegido por si só. Os apps precisam escolher o que enviam ao serviço de notificações e o que exibem antes da autenticação. Trate a configuração de privacidade do sistema operacional como uma camada, não como permissão para colocar conteúdo sensível na mensagem.
O alerta deve pedir atenção, não revelar a solicitação
Uma prévia segura informa que uma ação precisa de revisão e oferece urgência suficiente para ajudar a priorizá-la. Ela não reproduz a ação. Essa é uma distinção importante que as equipes costumam misturar: o contexto da notificação não é o contexto da aprovação.
O contexto da aprovação precisa permitir que o operador tome uma decisão informada. Talvez seja necessário mostrar o destino exato, a operação, o escopo da credencial, o processo do agente, os argumentos, o efeito esperado e o prazo. O contexto da notificação existe para levar a pessoa certa de volta à área protegida. Ele precisa de muito menos informação.
Para uma ação comum, uma prévia útil na tela bloqueada poderia dizer:
Action approval needed
A development agent requests access to a protected service.
Expires in 4 minutes. Open the app to review.
Esse texto comunica urgência e escopo geral. Não diz se o serviço lida com folha de pagamento, código-fonte, pagamentos ou um incidente interno. Não revela a URL, o método, o comando, a branch, a consulta ou a identidade de um cliente.
Compare com o tipo de mensagem que aparece em sistemas reais:
Approve POST https://payments.example.internal/v1/refunds/28471
Agent requests bearer token for customer refund. Reason: duplicate charge.
O segundo alerta não imprime o bearer token, mas ainda assim revela informação demais. Ele identifica um serviço sensível, uma ação, um objeto ligado a um cliente e um evento financeiro. Qualquer pessoa capaz de ler a prévia aprendeu algo que não estava autorizada a saber.
Use um vocabulário pequeno para o texto da prévia. «Aprovação necessária», «solicitação de acesso aguardando» e «revisão necessária» costumam bastar. Adicione uma classe de risco ampla se ela mudar a rapidez com que a pessoa deve responder: «ação externa», «acesso à produção» ou «leitura sensível». Não torne a etiqueta tão específica que ela anule o objetivo. «Exportação do banco de dados de produção» não é uma etiqueta ampla.
A tela autenticada deve fazer o oposto. Ela deve tornar a solicitação concreta o suficiente para ser recusada com segurança ou aprovada conscientemente. Esconder detalhes ali em nome da privacidade leva à aprovação às cegas, que é apenas outro tipo de falha.
A redação deve acontecer antes de a notificação sair do app
A carga de uma notificação precisa ter seu próprio esquema. Não a crie cortando um registro completo de aprovação no último momento e não dependa de uma lista de substituições de strings. As equipes adotam esse atalho porque o registro completo já existe e exibi-lo parece fácil. Ele falha quando surge um novo campo, quando uma URL vai parar em um subtítulo ou quando uma string de motivo contém dados sensíveis copiados.
Crie duas projeções explícitas a partir de uma solicitação de ação. Uma alimenta a tela de aprovação autenticada. A outra alimenta a prévia. O modelo da prévia nem deveria ter campos para URLs brutas, cabeçalhos, argumentos de comandos, trechos de resposta, nomes de segredos ou motivos livres.
Este pseudocódigo mostra o formato:
type ApprovalRecord {
requestId
agentAuthority
destination
operation
arguments
credentialReference
userReason
expiry
riskClass
}
type NotificationPreview {
requestId
title
body
expiryText
riskClass
}
function makePreview(record):
return NotificationPreview(
requestId = opaqueId(record.requestId),
title = "Action approval needed",
body = previewBody(record.riskClass),
expiryText = formatExpiry(record.expiry),
riskClass = record.riskClass
)
A propriedade importante não está na redação. Está no formato unidirecional dos dados. NotificationPreview não pode conter destination por acidente porque esse campo não existe nele. Um revisor pode inspecionar essa fronteira. Um teste pode rejeitar qualquer novo campo da prévia que inclua uma string sem limite.
Não passe o texto bruto do motivo por um sanitizador e considere o trabalho concluído. Os motivos costumam conter títulos de issues, comandos colados, endereços de e-mail, identificadores de contas e nomes internos. Padrões de redação não detectam formatos que ninguém previu. Uma frase fixa escolhida de um enum é mais segura do que uma frase controlada pelo usuário e apenas limpa.
Identificadores opacos também exigem cuidado. Um ID de aprovação como APR-10482 pode parecer inofensivo, mas um número previsível oferece ao observador um registro que ele pode correlacionar com um ticket visível ou com uma conversa posterior. Use um identificador sem significado de negócio e que não possa funcionar como token de autorização. Melhor ainda, omita-o da prévia, a menos que os fluxos de suporte realmente precisem dele.
Mantenha a solicitação completa no armazenamento criptografado do app ou em outro registro autenticado, não no corpo da notificação. Um sistema de notificações pode conservar o texto por mais tempo do que o alerta permanece visível. Suas escolhas de retenção de dados não se aplicam se outro subsistema mantiver uma cópia.
As configurações de privacidade do dispositivo ajudam, mas não podem sustentar o design
Os sistemas operacionais geralmente permitem ocultar prévias de notificações quando o dispositivo está bloqueado. Essa configuração é útil, mas um produto de aprovação não pode presumir que ela esteja ativada, seja compreendida ou seja aplicada de forma consistente em todos os dispositivos de uma pessoa.
Algumas pessoas precisam de prévias visíveis para fazer triagem de mensagens. Algumas organizações gerenciam essas configurações. Alguns dispositivos não têm código de bloqueio. Alguns usuários leem alertas em um desktop cuja tela está desbloqueada enquanto um colega está atrás deles. Um app que envia texto sensível e diz «os usuários podem desativar as prévias» transferiu uma decisão de segurança para o momento menos confiável da configuração do sistema.
Projete para três condições:
- O sistema operacional mostra a notificação completa em uma tela bloqueada.
- O sistema operacional oculta o corpo, mas mostra um título ou o nome do app.
- A tela está desbloqueada, mas outras pessoas podem vê-la.
A primeira condição determina sua carga. Se o texto for seguro ali, será mais fácil raciocinar sobre as outras duas. Se não for seguro, uma configuração do usuário apenas torna a falha intermitente.
Não deduza demais do estado do dispositivo. Um app pode saber que sua própria janela está desbloqueada, mas geralmente não sabe quem está olhando para a notificação. Mesmo um sinal confiável de tela bloqueada não resolve o problema de um projetor, monitor externo ou compartilhamento de tela. A prévia segura deve continuar segura depois da autenticação, porque as condições de visualização física estão fora do controle do app.
Há uma exceção importante: uma notificação local e autenticada dentro de uma janela do app pode mostrar os mesmos detalhes da tela de aprovação porque o app já controla o acesso àquela janela. Isso não é uma notificação do sistema. Não confunda uma caixa de entrada protegida dentro do app com um banner na tela bloqueada só porque ambas usam a palavra notificação.
Botões de aprovação nas notificações enfraquecem a fronteira de decisão
Um botão «Aprovar» em uma notificação parece eficiente. Ele também é um atalho atraente para confirmação acidental, aprovação sob coerção e perda de contexto. A pessoa vê um banner truncado, toca em um botão familiar e autoriza uma ação sem revisar seu alvo ou efeito real.
A notificação deve oferecer apenas ações que preservem a fronteira de decisão. «Abrir para revisar» é seguro porque leva o operador ao app autenticado. «Dispensar» é seguro se dispensar não negar, aprovar ou estender silenciosamente a solicitação. Um botão «Aprovar» não é seguro para ações significativas, mesmo que o sistema operacional peça o desbloqueio do dispositivo antes de executá-lo.
Autenticação e consentimento informado são verificações diferentes. A autenticação do dispositivo confirma que alguém capaz de desbloqueá-lo pressionou o botão. Ela não confirma que a pessoa viu a solicitação completa ou teve tempo de avaliá-la. A tela de aprovação deve vincular a decisão aos detalhes da solicitação, mostrar se algo mudou desde que o alerta apareceu e exigir uma nova confirmação para uma ação sensível.
Isso é ainda mais importante para solicitações de agentes. Um agente pode produzir muitas ações que parecem semelhantes à distância. Um título de notificação como «solicitação de acesso SSH» não diferencia uma verificação de status somente leitura de um comando destrutivo. A tela protegida precisa mostrar a intenção concreta antes que o operador libere a ação.
O fluxo de autorização do Sallyport mantém a decisão sobre a ação dentro do app autenticado, em vez de transformar uma notificação do sistema operacional em um controle remoto para acesso de agentes. Essa separação é menos chamativa do que uma aprovação com um toque, mas funciona melhor quando as solicitações têm consequências.
Também não ofereça um controle «lembrar desta escolha» na notificação. Alterações persistentes de permissão merecem uma área própria, um escopo claro e uma forma de inspecioná-las ou revogá-las. Um toque sonolento na tela bloqueada é um péssimo lugar para criar autoridade duradoura.
As etiquetas de risco devem descrever consequências sem nomear ativos
Um alerta vago treina as pessoas a abrir todas as notificações. Um alerta detalhado demais revela o ativo protegido. As etiquetas de risco resolvem parte dessa tensão quando descrevem a categoria da consequência, em vez do recurso.
Use categorias baseadas no que a ação pode fazer. Por exemplo, uma ação pode ler informações protegidas, alterar um serviço interno, enviar uma solicitação externa ou executar uma operação difícil de reverter. Essas categorias dão ao revisor um motivo para interromper o trabalho sem revelar o banco de dados, o cliente ou o hostname envolvido.
Evite etiquetas que misturem a sensibilidade do acesso com a urgência operacional. «Alta prioridade» diz pouco sobre o efeito da aprovação. «Gravação em produção» comunica mais, mas ainda pode revelar que há um sistema de produção envolvido. A segurança dessa expressão depende do ambiente. Uma pessoa trabalhando sozinha em um dispositivo pessoal pode aceitá-la; uma mesa de suporte compartilhada deve usar uma etiqueta mais ampla.
Defina o vocabulário por escrito e associe-o à ação antes da renderização da notificação. Se os desenvolvedores puderem improvisar o texto do título, nem o esquema mais cuidadoso do mundo salvará você. Uma regra de revisão pode ser simples: qualquer string que venha de um agente, usuário, URL, comando, corpo de requisição ou resposta remota é proibida nas prévias.
Um mapeamento prático seria:
| Propriedade da ação | Texto da prévia | Texto da área protegida |
|---|---|---|
| Lê um serviço protegido | Leitura sensível | Serviço, método, caminho e escopo exatos |
| Altera estado interno | Alteração interna | Alvo, campos alterados e efeito esperado |
| Envia dados para fora da organização | Ação externa | Destinatário, resumo da carga e destino |
| Pode ser difícil de reverter | Impacto elevado | Comando ou requisição completa e notas de recuperação |
A tabela é uma política para redatores e engenheiros, não uma promessa de que toda ação se encaixa perfeitamente em quatro categorias. Quando uma ação tiver efeitos mistos, escolha a categoria mais séria. Uma notificação que pede atenção cedo demais custa um momento. Uma notificação que esconde uma transferência externa sob «solicitação de acesso» causa uma decisão ruim.
O histórico de notificações e os dispositivos espelhados precisam de uma revisão própria
As equipes costumam testar o primeiro banner e parar por aí. O caminho completo de exposição inclui notificações retidas, resumos de notificações, espelhos em dispositivos vestíveis, retransmissões para desktops e qualquer dispositivo gerenciado que receba os mesmos alertas da conta.
Comece com uma solicitação real que contenha dados de teste deliberadamente reconhecíveis: um nome de cliente falso, um host interno falso, um endereço de e-mail falso e um argumento de comando falso. Não use valores reais de produção em testes de privacidade. Acione a solicitação e inspecione todos os lugares onde o texto pode aparecer.
Use esta sequência de testes antes de uma versão:
- Bloqueie o dispositivo principal e acione a solicitação de aprovação.
- Verifique o banner, a lista da tela bloqueada e a central de notificações depois do desbloqueio.
- Ative qualquer retransmissão de notificações configurada ou espelho em dispositivo vestível e inspecione o histórico.
- Capture a tela pelos caminhos de suporte remoto e compartilhamento de tela usados pela equipe.
- Faça a solicitação expirar ou resolva-a e depois verifique se algum texto antigo continua visível.
Registre o título e o corpo renderizados exatamente em cada ponto. Um teste bem-sucedido não é «a prévia ficou oculta no meu telefone». É «nenhum marcador de teste apareceu fora do app autenticado». Isso também detecta bugs de localização. Um modelo seguro em inglês pode se tornar inseguro quando uma string traduzida cresce e empurra um identificador interno para uma linha visível.
Preste atenção especial às notificações agrupadas. Um sistema pode mostrar a mensagem mais recente, uma contagem ou um resumo montado a partir de vários alertas. Se cada prévia individual for segura, o grupo também deverá ser. Se o código de agrupamento usar um nome de ação como «três solicitações de reembolso», ele terá reintroduzido detalhes sensíveis por um caminho secundário.
A persistência das notificações também muda a resposta a incidentes. Revogar uma sessão de agente impede solicitações futuras, mas não recolhe o texto já copiado para o histórico de notificações de um usuário ou para um dispositivo espelhado. Por isso, a minimização da prévia deve acontecer antes da autorização e da revisão de auditoria, não depois de um incidente.
Os registros de auditoria precisam de detalhes, as prévias precisam de contenção
Às vezes, as equipes de segurança tornam as prévias vagas porque também mantêm registros de auditoria vagos. Temem que registros detalhados vazem. Isso mistura dois sistemas separados, com públicos diferentes.
Um registro de auditoria deve ser completo o suficiente para reconstruir a decisão de autorização: qual processo de agente iniciou a ação, sob qual autoridade ele foi executado, o destino, a operação, o horário, a decisão e o resultado. Valores sensíveis ainda exigem tratamento cuidadoso, mas os investigadores precisam de detalhes factuais. Uma prévia não deve conter nada disso, a menos que a pessoa tenha se autenticado no app.
A distinção importa durante uma falha. Imagine que um agente solicite um comando remoto. O alerta diz «aprovação necessária» e o revisor abre o app. A área protegida mostra o comando, o host, a identidade da sessão e o prazo. O revisor recusa. Mais tarde, um engenheiro investiga o motivo e precisa do registro correspondente. A trilha de auditoria pode responder sem obrigar a notificação original a transportar o comando por todas as superfícies de exibição.
O Sallyport separa seus diários de sessões e atividades do tratamento das notificações, com ambos projetados a partir de um log de auditoria criptografado e encadeado por hash. Esse design permite que um operador inspecione ações e verifique a cadeia de auditoria offline sem usar prévias na tela bloqueada como substituto de evidências.
Não coloque hashes de auditoria, trechos de registros ou IDs brutos de correlação na notificação. Eles são úteis na interface protegida e nas ferramentas de investigação. Em uma superfície pública, criam identificadores que observadores podem coletar e correlacionar.
Uma notificação deve expirar quando a decisão subjacente expirar, e seu registro protegido deve indicar claramente esse prazo. Se uma pessoa abrir um alerta antigo, o app precisa buscar o estado atual da solicitação. Nunca deixe que um corpo de notificação em cache convença alguém de que está aprovando a mesma solicitação que existia cinco minutos antes.
Transforme as regras das prévias em testes e tente quebrá-las
Uma orientação em prosa como «evite conteúdo sensível» falhará sob pressão de entrega. Transforme-a em afirmações executadas com o construtor de notificações e em casos de teste que os revisores possam ler.
O teste mais útil é uma lista de bloqueio de origens de dados, não uma lista frágil de palavras. Rejeite qualquer campo da prévia derivado de URL, host, texto de comando, cabeçalho, corpo, rótulo de credencial, motivo livre, resposta remota, endereço de e-mail ou identificador de conta. Depois, permita apenas um conjunto restrito de modelos fixos e valores de categoria limitados.
Um fixture de teste compacto poderia ser:
record.destination = "https://claims-prod.internal/cases/FAKE-784"
record.arguments = "--account [email protected] --export"
record.userReason = "Customer Northstar reports a disputed claim"
record.riskClass = EXTERNAL_ACTION
preview = makePreview(record)
assert preview.title == "Action approval needed"
assert preview.body == "An external action requires review."
assert preview doesNotContain "claims"
assert preview doesNotContain "FAKE-784"
assert preview doesNotContain "fake.person"
assert preview doesNotContain "Northstar"
As afirmações positivas são tão importantes quanto as negativas. Elas impedem que uma alteração posterior substitua uma mensagem fixa segura por um alerta vazio e vago que os usuários aprendam a dispensar. Teste também o texto de expiração, a localização, os alertas agrupados e a renderização de acessibilidade. Leitores de tela podem ler um conteúdo que a truncagem visual oculta, portanto a saída de acessibilidade deve usar o mesmo modelo restrito de prévia.
Por fim, peça a alguém que não escreveu o recurso para ler as prévias procurando pistas operacionais. Essa pessoa perceberá o que o autor já considera normal: um codinome de projeto, uma etiqueta de ambiente conhecida ou o apelido de um serviço interno. Se alguém de fora, mas bem informado, conseguir deduzir a ação protegida, a notificação contém informação demais.
Defina como padrão a mensagem menos específica que ainda consiga obter uma resposta humana em tempo hábil. Coloque as evidências necessárias para uma aprovação real atrás da autenticação e faça cada atalho levar de volta a essas evidências. Esse design pode custar um toque. Ele evita transformar toda tela bloqueada em um canal silencioso de divulgação.
FAQ
O que uma notificação de aprovação deve mostrar na tela bloqueada?
Trate a tela bloqueada como uma superfície pública ou semipública. Mostre que uma aprovação precisa de atenção, a classe de risco e um prazo curto, mas mantenha destinos, credenciais, corpos de requisição, argumentos de comandos e resultados dentro do app autenticado.
É seguro mostrar um endpoint de API na prévia de uma notificação?
Na maioria dos casos, não. O nome do recurso pode revelar um cliente, um projeto interno, um ambiente de produção ou um incidente de segurança. Fora do app, use uma classe de recurso neutra e mostre o destino exato somente após a autenticação.
Os alertas de aprovação podem incluir um ID da ação?
Um identificador simples de aprovação pode ser aceitável se não tiver significado fora do seu sistema e não puder autorizar nada. Não use uma URL, número de conta, nome de cliente, fragmento de comando ou sequência previsível como identificador.
Notificações genéricas de aprovação causam fadiga de aprovação?
Alertas genéricos também criam perigo, porque as pessoas podem aprová-los sem contexto. Coloque o contexto importante na tela de aprovação autenticada e limite a prévia às informações necessárias para a pessoa decidir se deve abri-la.
Os usuários devem poder aprovar uma ação diretamente pela notificação?
Não. A ação de uma notificação deve apenas abrir a tela de decisão autenticada ou dispensar o alerta. Ela nunca deve aprovar uma ação, estender uma sessão, expor detalhes ocultos ou passar um token de aprovação pelo sistema de notificações.
Como classifico ações de agentes de risco para as notificações?
Classifique a operação antes de criar a mensagem. Uma leitura pode revelar dados, uma gravação altera o estado e uma ação irreversível ou externa merece uma descrição mais forte e um alerta mais destacado, mesmo que a prévia continue privada.
Como testo se as prévias de notificações vazam detalhes sensíveis?
Teste separadamente as condições de tela bloqueada, desbloqueada e compartilhada. Capture também o histórico do centro de notificações, espelhos em dispositivos vestíveis, capturas de tela e qualquer dispositivo que receba alertas encaminhados, porque cada superfície pode preservar mais conteúdo do que o primeiro banner mostra.
O que acontece quando o app não consegue saber se a tela está bloqueada?
O app deve renderizar uma alternativa segura quando não conseguir determinar o estado do dispositivo ou a configuração de privacidade do visualizador. Um alerta atrasado ou menos específico é preferível a mostrar um comando de produção ou dados de clientes em uma tela sem controle.
Quando é aceitável mostrar prévias completas de notificações?
Somente quando o destinatário não tiver outra fonte útil de contexto e a mensagem não expuser nada sensível. Em sistemas de aprovação, o padrão mais seguro é um alerta curto que instrua a pessoa a abrir o app protegido.
Como os dados da notificação devem diferir do registro de auditoria?
Mantenha os dados da prévia separados do registro de aprovação autenticado. A prévia deve ser uma projeção deliberadamente pequena e redigida, enquanto o registro protegido contém destino, escopo, identidade, motivo e decisão final.