
SunnyDayBPF: pesquisa de deception de telemetria de buffer de usuário pós-syscall baseada em eBPF por Azizcan Daştan
O SunnyDayBPF é uma técnica de pesquisa baseada em eBPF para engano de telemetria de buffer de usuário pós-syscall, originalmente proposta e pesquisada por Azizcan Dastan.
A técnica investiga se os dados observados por agentes de segurança, registro ou telemetria no espaço de usuário podem ser alterados após a conclusão de uma syscall do tipo read, mas antes de o agente parsear, analisar ou encaminhar esses dados para um pipeline de segurança a jusante.
A ideia central é:
O evento ainda acontece.
O agente de monitoramento ainda lê os dados.
Mas os dados observados pelo agente podem não representar mais completamente o evento original.
O SunnyDayBPF foca na lacuna entre ground truth e telemetria observada.
SunnyDayBPF Hook Points
========================
Telemetry Agent Process +---------------------------------------------------------+ | | | read() pread64() recvfrom() | | | | | | +-----|----------------|------------------|---------------+ | | | ======|================|==================|======= KERNEL BOUNDARY | | | kprobe:ksys_read kprobe:_x64_sys kprobe:_sys (save buf ptr) pread64 recvfrom | (nested pt_regs) (save buf ptr) | (save buf ptr) | v v v [syscall executes — data enters user buffer] | | | kretprobe kretprobe kretprobe | | | +--------+-------+---------+--------+ | | read buffer into initialize BPF scratch space scan_state | v +------------------+ | TAIL CALL CHAIN | | | | scan_g0: SECURITY (4 rules, scan=177 bytes) | scan_g1: SECURITY (4 rules, scan=173 bytes) | scan_g2: SEVERITY (4 rules, scan=177 bytes) | scan_g3: SEVERITY (1 rule, scan=251 bytes) | scan_g4: PATH (4 rules, scan=132 bytes) | scan_g5: AUTH (4 rules, scan=190 bytes) | scan_g6: AUTH (1 rule, scan=249 bytes) | scan_g7: NETWORK (3 rules, scan=249 bytes) | scan_g8: PROCESS (4 rules, scan=173 bytes) | scan_g9: CUSTOM (2 rules, scan=243 bytes) | | | emit_event: | | perf event | | + stats | +------------------+ | v bpf_probe_write_user() (modify agent's buffer) | v read-back verification (confirm write succeeded) | v Agent continues with modified data
### Cobertura de Syscall
| Syscall | Hook do Kernel | Extração de Argumentos | Cobertura |
|---------|------------|----------------|----------|
| `read()` | `ksys_read` | `PT_REGS_PARM2` (direto) | Leituras de arquivos, pipes, `/proc`, arquivos de log |
| `pread64()` | `__x64_sys_pread64` | `pt_regs` aninhados via `bpf_probe_read_kernel` (offset 104/RSI) | Leituras de arquivos com acesso aleatório, journald |
| `recvfrom()` | `__sys_recvfrom` | `PT_REGS_PARM2` (direto) | Sockets de rede, encaminhamento de syslog |
### Restrições do Verificador BPF
O verificador BPF impõe um limite de sequência de saltos de 8.192 ramificações condicionais por programa. O SunnyDayBPF contorna isso usando:
- **Chamadas de cauda BPF** (`BPF_PROG_ARRAY`): 31 regras divididas entre 10 programas independentes, cada um com seu próprio orçamento de verificação
- **Otimização sem distinção de maiúsculas/minúsculas**: `(d[i]|32)==lower` reduz os saltos por byte de 2 para 1 para caracteres alfabéticos
- **Limites dinâmicos de varredura**: A janela de varredura de cada grupo é calculada como `min(BUF_SIZE - max_pat, 7800 / jumps_per_iter)` para permanecer dentro dos limites do verificador
- **Arrays Per-CPU**: `BPF_PERCPU_ARRAY` para buffer temporário e estado de varredura, compartilhados entre os programas chamados via tail call
---
## Visão Geral
Sistemas modernos de segurança Linux frequentemente dependem de agentes em espaço de usuário que coletam telemetria de arquivos, sockets, pipes, APIs, interfaces de kernel ou fluxos de eventos.
Esses agentes podem encaminhar telemetria para:
- plataformas SIEM
- backends EDR/XDR
- pipelines de auditoria
- coletores de logs
- mecanismos de segurança em tempo de execução
- sistemas de engenharia de detecção
- plataformas de observabilidade
Uma suposição comum é:```text
actual system behavior == collected telemetry == observed security data
SunnyDayBPF desafia essa suposição.
A pesquisa explora um modelo de decepção pós-syscall em que um processo de monitoramento recebe dados normalmente, mas o buffer que contém esses dados é modificado antes que o processo os consuma.```text actual system behavior != observed telemetry
---
## Definição Técnica
SunnyDayBPF é uma técnica de decepção de telemetria pós-syscall que estuda a manipulação de buffers de espaço de usuário pertencentes a processos selecionados que consomem telemetria.
Em alto nível, a técnica segue este modelo:```text
sys_enter_*:
identify a target telemetry-consuming process
record the user-space buffer pointer involved in the read-like operation
sys_exit_*:
verify that the read-like operation completed successfully
inspect the returned user-space buffer
selectively alter telemetry-relevant content
verify write success via read-back
allow the target process to continue execution normally
Isso cria uma incompatibilidade entre:```text what happened on the system
e:```text
what the monitoring agent later observes, parses, and forwards
O SunnyDayBPF identifica processos alvo pela correspondência de prefixo do nome do comando com 5 caracteres.
| Agente | Prefixo | Método de Leitura | Eficaz? |
|---|---|---|---|
| Wazuh | wazuh | read() em arquivos de log, syslog, logs de auditoria | Sim |
| OSSEC | ossec | read() em arquivos de log | Sim |
| Splunk UF | splun | read() em arquivos monitorados | Sim |
| Elastic Agent | elast | read() em fontes de log | Sim |
| Datadog Agent | datad | read() em logs e métricas | Sim |
| Cribl | cribl | read() para roteamento de logs | Sim |
| Agente | Prefixo | Método de Leitura | Eficaz? |
|---|---|---|---|
| rsyslog | rsysl | read() / recvfrom() em syslog | Sim |
| syslog-ng | syslo | read() / recvfrom() em syslog | Sim |
| Filebeat | fileb | read() em arquivos de log | Sim |
| Fluent-bit | fluen | read() / recvfrom() em entradas | Sim |
| Fluentd | fluen | read() / recvfrom() em entradas | Sim |
| Logstash | logst | read() / recvfrom() no pipeline | Sim |
| Promtail | promt | read() em arquivos de log (Loki) | Sim |
| Vector | vecto | read() em fontes de log | Sim |
| Agente | Prefixo | Método de Leitura | Eficaz? |
|---|---|---|---|
| Falco | falco | eventos eBPF coletados via read() no buffer perf | Sim |
| osquery | osque | read() em /proc, arquivos de log, tabelas do sistema | Sim |