docs: update documentation for kretprobe recvfrom fix
Update all documentation to reflect the resolved HTTP nginx capture issue via kretprobe on __x64_sys_recvfrom. Changes: - README.md: Update HTTP status table showing kretprobe is now working - docs/services/ja4ebpf.md: Replace tracepoint with kretprobe in hooks table, mark issue as resolved with validation reference - docs/architecture.md: Clarify TC HTTP plain capture is packet-level only Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
@ -93,6 +93,19 @@ Les uprobes s'attachent dynamiquement aux fonctions OpenSSL dans `libssl.so` :
|
||||
| `SSL_read` | uprobe + uretprobe | Capture les requêtes du client (direction=0) |
|
||||
| `SSL_write` | uprobe + uretprobe | Capture les réponses du serveur (direction=1) |
|
||||
|
||||
### Tracepoints/Kretprobe recvfrom (Nginx HTTP en clair)
|
||||
|
||||
Les hooks `sys_enter_recvfrom` / `sys_exit_recvfrom` capturent les appels système `recvfrom()` du serveur Nginx pour capturer le trafic HTTP en clair complet :
|
||||
|
||||
| Hook | Type | État | Rôle |
|
||||
|------|------|------|------|
|
||||
| `tp_syscalls_sys_enter_recvfrom` | tracepoint | ✅ Fonctionnel | Sauvegarde les arguments recvfrom (sockfd, buf_ptr, len) |
|
||||
| `tp_sys_exit_recvfrom` | kretprobe | ✅ Fonctionnel | Capture les données lues + émet vers pb_ginx_http |
|
||||
|
||||
**Note** : Le kretprobe sur `__x64_sys_recvfrom` remplace le tracepoint `sys_exit_recvfrom` qui échouait avec "permission denied" sur Rocky Linux 9+.
|
||||
|
||||
**Filtrage par PID nginx** : La map `nginx_pid_map` ne permet que les processus nginx identifiés via `/proc/<pid>/cmdline`.
|
||||
|
||||
**Corrélation `fd → src_ip:src_port`** (3 niveaux de priorité) :
|
||||
1. `ssl_conn_map[ssl_ptr]` — si `SSL_set_fd` a été appelé et que `fd_conn_map[fd]` contient l'IP (via accept4)
|
||||
2. `accept_map[{pid_tgid, fd}]` — cache accept4 (tracepoint kernel)
|
||||
@ -387,7 +400,38 @@ services/ja4ebpf/
|
||||
└── Makefile
|
||||
```
|
||||
|
||||
## Capabilities Linux requises (SELinux Enforcing)
|
||||
## Problèmes connus
|
||||
|
||||
### ✅ HTTP Nginx via recvfrom — RÉSOLU (2026-04-20)
|
||||
|
||||
**Solution implémentée** : Remplacement du tracepoint `sys_exit_recvfrom` par un kretprobe sur `__x64_sys_recvfrom`.
|
||||
|
||||
**Détails** : Le tracepoint exit échouait avec "permission denied" sur Rocky Linux 9+. Le kretprobe contourne cette limitation en s'attachant directement à la fonction kernel.
|
||||
|
||||
**Validation** :
|
||||
- ✅ Toutes les données HTTP capturées sans troncature (path jusqu'à 39 chars, query jusqu'à 244 chars)
|
||||
- ✅ Headers custom (X-Request-ID, X-Custom-Header) complets
|
||||
- ✅ Tests unitaires Go ajoutés et validés
|
||||
- ✅ Rapport de validation : `services/ja4ebpf/docs/CLICKHOUSE_VALIDATION_REPORT.md`
|
||||
|
||||
### Maps eBPF résumé
|
||||
|
||||
| Map | Type | Rôle |
|
||||
|-----|------|------|
|
||||
| `allowed_ports` | HASH (key=u16, val=u8) | Ports TCP autorisés (peuplée depuis Go) |
|
||||
| `ignored_src` | LPM_TRIE (key={prefixlen, data[4]}, val=u8) | CIDR/IP sources à ignorer (peuplée depuis Go) |
|
||||
| `tc_stats` | PERCPU_ARRAY (7 compteurs) | Statistiques de debug BPF |
|
||||
| `ssl_conn_map` | HASH (key=ssl_ptr, val=ssl_conn_info) | Association SSL* → fd + IP |
|
||||
| `fd_conn_map` | HASH (key=fd, val=ssl_conn_info) | Association fd → IP (depuis accept4) |
|
||||
| `accept_map` | HASH (key={pid_tgid,fd}, val=accept_event) | Cache accept4 côté BPF |
|
||||
| `ssl_args_map` | HASH (key=pid_tgid, val=ssl_read_args) | Sauvegarde arguments SSL_read/Write entry |
|
||||
| `nginx_pid_map` | HASH (key=u32, val=u8) | Filtrage recvfrom par PID nginx |
|
||||
| `nginx_read_args_map` | HASH (key=pid_tgid, val=nginx_read_args) | Sauvegarde arguments recvfrom entry |
|
||||
| `__tls_buf` | PERCPU_ARRAY (1 entrée) | Buffer temp > 512o (stack eBPF limit) |
|
||||
| `__http_buf` | PERCPU_ARRAY (1 entrée) | Buffer temp HTTP plain |
|
||||
| `__ssl_buf` | PERCPU_ARRAY (1 entrée) | Buffer temp SSL data |
|
||||
| `__nginx_buf` | PERCPU_ARRAY (1 entrée) | Buffer temp nginx HTTP |
|
||||
|
||||
|
||||
L'agent tourne sous l'utilisateur `ja4ebpf` (UID/GID 490 fixe). Les capabilities Linux accordées via `AmbientCapabilities` :
|
||||
|
||||
|
||||
Reference in New Issue
Block a user