
SunnyDayBPF: Azizcan Daştan द्वारा eBPF-आधारित पोस्ट-सिस्कॉल उपयोगकर्ता-बफर टेलीमेट्री धोखा अनुसंधान
SunnyDayBPF एक eBPF-आधारित पोस्ट-सिस्कॉल यूज़र-बफ़र टेलीमेट्री धोखा अनुसंधान तकनीक है जिसे मूल रूप से अज़ीज़कान दस्तान द्वारा प्रस्तावित और शोधित किया गया है।
यह तकनीक इस बात की जांच करती है कि क्या उपयोगकर्ता-स्थान सुरक्षा, लॉगिंग, या टेलीमेट्री एजेंटों द्वारा देखे गए डेटा को रीड-लाइक syscall पूरा होने के बाद, लेकिन एजेंट द्वारा उस डेटा को डाउनस्ट्रीम सुरक्षा पाइपलाइन में पार्स, विश्लेषण या अग्रेषित करने से पहले बदला जा सकता है।
मुख्य विचार यह है:
घटना अभी भी होती है।
मॉनिटरिंग एजेंट अभी भी डेटा पढ़ता है।
लेकिन एजेंट द्वारा देखा गया डेटा मूल घटना का पूरी तरह से प्रतिनिधित्व नहीं कर सकता है।
SunnyDayBPF ग्राउंड ट्रुथ और देखी गई टेलीमेट्री के बीच के अंतर पर ध्यान केंद्रित करता है।
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
### सिसकॉल कवरेज
| सिसकॉल | कर्नेल हुक | आर्ग निष्कर्षण | कवरेज |
|---------|------------|----------------|----------|
| `read()` | `ksys_read` | `PT_REGS_PARM2` (प्रत्यक्ष) | फ़ाइल रीड, पाइप, `/proc`, लॉग फ़ाइलें |
| `pread64()` | `__x64_sys_pread64` | नेस्टेड `pt_regs` `bpf_probe_read_kernel` के माध्यम से (ऑफ़सेट 104/RSI) | रैंडम-एक्सेस फ़ाइल रीड, journald |
| `recvfrom()` | `__sys_recvfrom` | `PT_REGS_PARM2` (प्रत्यक्ष) | नेटवर्क सॉकेट, syslog फ़ॉरवर्डिंग |
### BPF वेरिफ़ायर बाधाएँ
BPF वेरिफ़ायर प्रति प्रोग्राम 8,192 सशर्त शाखाओं की जंप अनुक्रम सीमा लागू करता है। SunnyDayBPF इसके आसपास काम करता है:
- **BPF टेल कॉल** (`BPF_PROG_ARRAY`): 31 नियम 10 स्वतंत्र प्रोग्रामों में विभाजित, प्रत्येक का अपना वेरिफ़ायर बजट
- **केस-असंवेदनशील ऑप्टिमाइज़ेशन**: `(d[i]|32)==lower` वर्णमाला वर्णों के लिए प्रति बाइट जंप को 2 से घटाकर 1 कर देता है
- **डायनामिक स्कैन सीमाएँ**: प्रत्येक समूह की स्कैन विंडो की गणना `min(BUF_SIZE - max_pat, 7800 / jumps_per_iter)` के रूप में की जाती है ताकि वेरिफ़ायर सीमाओं के भीतर रह सके
- **प्रति-CPU सारणियाँ**: `BPF_PERCPU_ARRAY` स्क्रैच बफ़र और स्कैन स्थिति के लिए, टेल-कॉल किए गए प्रोग्रामों में साझा
---
## अवलोकन
आधुनिक लिनक्स सुरक्षा प्रणालियाँ अक्सर यूज़र-स्पेस एजेंटों पर निर्भर करती हैं जो फ़ाइलों, सॉकेट, पाइप, API, कर्नेल इंटरफ़ेस, या इवेंट स्ट्रीम से टेलीमेट्री एकत्र करते हैं।
ये एजेंट टेलीमेट्री को यहाँ अग्रेषित कर सकते हैं:
- SIEM प्लेटफ़ॉर्म
- EDR/XDR बैकएंड
- ऑडिट पाइपलाइन
- लॉग संग्राहक
- रनटाइम सुरक्षा इंजन
- डिटेक्शन इंजीनियरिंग सिस्टम
- अवलोकनीयता प्लेटफ़ॉर्म
एक सामान्य धारणा है:```text
actual system behavior == collected telemetry == observed security data
SunnyDayBPF उस धारणा को चुनौती देता है। यह शोध एक पोस्ट-सिस्कॉल धोखा मॉडल की खोज करता है जहाँ एक निगरानी प्रक्रिया सामान्य रूप से डेटा प्राप्त करती है, लेकिन उस डेटा वाले बफर को प्रक्रिया द्वारा उपभोग करने से पहले संशोधित किया जाता है।```text actual system behavior != observed telemetry
---
## तकनीकी परिभाषा
SunnyDayBPF एक पोस्ट-सिस्कॉल टेलीमेट्री धोखा तकनीक है जो चयनित टेलीमेट्री-उपभोग प्रक्रियाओं से संबंधित यूज़र-स्पेस बफ़र्स के हेरफेर का अध्ययन करती है।
उच्च स्तर पर, तकनीक इस मॉडल का अनुसरण करती है:```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
यह एक बेमेल पैदा करता है:```text what happened on the system
और:```text
what the monitoring agent later observes, parses, and forwards
SunnyDayBPF 5-अक्षर के कमांड नाम प्रीफिक्स मिलान द्वारा लक्ष्य प्रक्रियाओं की पहचान करता है।
| एजेंट | प्रीफिक्स | पढ़ने की विधि | प्रभावी? |
|---|---|---|---|
| Wazuh | wazuh | read() लॉग फ़ाइलों, syslog, ऑडिट लॉग पर | हाँ |
| OSSEC | ossec | read() लॉग फ़ाइलों पर | हाँ |
| Splunk UF | splun | read() निगरानी की गई फ़ाइलों पर | हाँ |
| Elastic Agent | elast | read() लॉग स्रोतों पर | हाँ |
| Datadog Agent | datad | read() लॉग और मीट्रिक पर | हाँ |
| Cribl | cribl | read() लॉग रूटिंग के लिए | हाँ |
| एजेंट | प्रीफिक्स | पढ़ने की विधि | प्रभावी? |
|---|---|---|---|
| rsyslog | rsysl | read() / recvfrom() syslog पर | हाँ |
| syslog-ng | syslo | read() / recvfrom() syslog पर | हाँ |
| Filebeat | fileb | read() लॉग फ़ाइलों पर | हाँ |
| Fluent-bit | fluen | read() / recvfrom() इनपुट पर | हाँ |
| Fluentd | fluen | read() / recvfrom() इनपुट पर | हाँ |
| Logstash | logst | read() / recvfrom() पाइपलाइन पर | हाँ |
| Promtail | promt | read() लॉग फ़ाइलों पर (Loki) | हाँ |
| Vector | vecto | read() लॉग स्रोतों पर | हाँ |
| एजेंट | प्रीफिक्स | पढ़ने की विधि | प्रभावी? |
|---|---|---|---|
| Falco | falco | eBPF इवेंट read() द्वारा perf बफ़र पर संग्रहित | हाँ |
| osquery | osque | read() /proc, लॉग फ़ाइलों, सिस्टम तालिकाओं पर | हाँ |
| एजेंट | प्रीफिक्स | पढ़ने की विधि | प्रभावी? |
|---|---|---|---|
| Snort | snort | recvfrom() पैकेट कैप्चर पर | हाँ |
| Suricata | suric | recvfrom() पैकेट कैप्चर पर | हाँ |
| Zeek | zeek_ | recvfrom() पैकेट कैप्चर पर | हाँ |