Fórumok
Sziasztok,
Tudna segiteni valaki esetleg, ha egy struktura ezzel van definialva __randomize_layout, tipikusan egy csomo a kernelben, akkor azt hoyan tudom reprodukalni mondjuk egy kprobe vagy tracepointba?
eBPF doksi szerint
Using tracepoints 3: bpf
BPF gives us a few ways to connect to tracepoints via different program types:
BPF_PROG_TYPE_TRACEPOINT: this program type gives access to the TP_STRUCT_entry data available at tracepoint entry; i.e. the data assigned from the raw tracepoint arguments via the TP_fast_assign() section in the tracepoint definition. The tricky part with these tracepoints is the context definition must match that described in the TP_STRUCT_entry definition exactly. For example, in samples/bpf/xdp_redirect_cpu_kern.c the tracepoint format for xdp_redirect tracepoints is defined as follows
De ha randomizalt (The randstruct plugin randomly rearranges fields at compile time given a randomization seed.) akkor nem ertem, hogy fog osszetalalkozni a ketto.
Elore is koszi.
Hozzászólások
Bár segíteni nem tudok, de köszi a témát. Ezzel a módosítószóval még nem találkoztam, igaz C-vel régebben foglalkoztam ilyen alapossággal.
Itt találtam róla pár sort: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/i…
Kerestem a gcc.gnu.org doksijaiban is, de hallgat erről. Hol és hogyan van ez a gcc-ben implementálva?
A fordítókban randstruct néven fut, és az __attribute__((randomize_layout)) segítségével lehet aktiválni. Már a clang is támogatja. Szerintem csak úgy lehet debugolni, ha az eredeti kernel debuginfo rendelkezésre áll, máshol nincs tárolva a pontos struktura offset.
https://lwn.net/Articles/722293/
https://www.openwall.com/lists/kernel-hardening/2017/04/06/14
https://www.mail-archive.com/cfe-commits@lists.llvm.org/msg127918.html
Elméletileg a GDB transzparensen fel tudja oldani a randomizációt, ha a konkrét kernel debuginfója elérhető. Az eBPF kódot az eBPF Simulator nevű GDB kiegésztítés tudja kezelni, ezt a kettőt kell összehozni. Szóval ebben az esetben csak látszólagos a randomizáció, más eszközzel vagy más debuginfóval ténylegesen random.
https://www.phoronix.com/scan.php?page=news_item&px=GDB-Debugger-eBPF
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/s…
A kulcsszavak a BTF (eBPF Type Format) és CO:RE (Compile Once, Run Everywhere). Van erről egy jó összefoglaló itt: https://nakryiko.com/posts/bpf-portability-and-co-re/#the-problem-of-bp…
Illetve az eBPF Summit-on is volt erről a témáról szó (a 2. napon biztosan, itt a live stream): https://www.youtube.com/watch?v=ZNtVedFsD-k&t=10200s