Je LD_PRELOAD bypassovatelný?

neviemkto

Je LD_PRELOAD bypassovatelný?
« kdy: 03. 12. 2011, 22:04:00 »
Caute,

je LD_PRELOAD vlastnej kniznice bypassovatelny?
Ide mi o to, ze ak si napisem kniznicu, ktora bude logovat niektore syscally, tak ci ju bude mozne obist (a ak ano, tak ake znalosti su na to treba?). Ak by LD_PRELOAD prestal fungovat po specifickej (casto opakovanej) akcii ako je fork() resp. ina tvorba vlaken, tak sa na to nemozem spoliehat ani pri obycajnych statistikach.

Vdaka za odpoved.
« Poslední změna: 05. 12. 2011, 13:12:45 od Petr Krčmář »


upalse

Re:Je LD_PRELOAD bypassovatelny?
« Odpověď #1 kdy: 03. 12. 2011, 22:44:48 »
ahoj,

LD_PRELOAD zavisi uz z podstaty na environmentu, tzn kdyz ho tam odsud nekdo smaze - unsetenv("LD_PRELOAD") _a k tomu_ zavola napr system() tak uz se LD_PRELOAD neprojevi. samozrejme subprocess po execve nemusi vubec puvodni environment dostat, pripadne setuid binarka ho bude ignorovat.

praktictejsi je pouzit /etc/ld.so.preload. pokud to mozne neni, jeste jde si stav environmentu tesne pred execve hlidat (to neni jednoduche - je to nutne delat pro kazdy libc call zvlast, tj extra pro popen, system, exec* atd).

interne se preload totiz resi tesne po execve() pri hledani knihoven programu (tzv interpreter faze - /lib/ld-linux.so.2 atd), pote jeho pritomnost uz neni smerodatna.

co se tyce "obejiti" tak to mozne samozrejme jde, najit puvodni symbol pomoci dlsym(3) :)

na ucely callgraphu atd na urovni knihoven je mimojine rozumejsi pouzit LD_AUDIT - viz latrace(1).

neviemkto

Re:Je LD_PRELOAD bypassovatelny?
« Odpověď #2 kdy: 04. 12. 2011, 00:21:12 »
Diky moc

Trident

Re:Je LD_PRELOAD bypassovatelny?
« Odpověď #3 kdy: 04. 12. 2011, 13:55:30 »
Caute,

je LD_PRELOAD vlastnej kniznice bypassovatelny?
Ide mi o to, ze ak si napisem kniznicu, ktora bude logovat niektore syscally, tak ci ju bude mozne obist (a ak ano, tak ake znalosti su na to treba?). Ak by LD_PRELOAD prestal fungovat po specifickej (casto opakovanej) akcii ako je fork() resp. ina tvorba vlaken, tak sa na to nemozem spoliehat ani pri obycajnych statistikach.

Vdaka za odpoved.

No podle toho co potrebujes mne spise napadlo jestli neni lepsi vrazit cestu ke knihovne pro loader primo do ELF headeru. LD_LIBRARY_PATH a LD_PRELOAD jsou jen berlicky/prasarnicky.  V linuxu je jako prvni prohledavany ELF header  pak jdou dalsi metody(viz man k ld).

tomas

Re:Je LD_PRELOAD bypassovatelny?
« Odpověď #4 kdy: 05. 12. 2011, 09:46:26 »
Pokud nevolám knihovní funkce ale přímo int #x80 (nebo něco podobného), tak se nic z tvé knihovny volat nebude.

Pokud je binárka slinkovaná staticky, tak se nic z tvé knihovny volat nebude.

Pokud někdo odebere proměnnou prostředí...


Ivan

Re:Je LD_PRELOAD bypassovatelny?
« Odpověď #5 kdy: 05. 12. 2011, 13:04:55 »
- pokud ma binarka suid/sguid bit(na kohokoliv) tak se LD_PRELOAD ignoruje.

- setenv a unsetenv nemaji na LD_* promenne zadny vliv. glibc si pri startu uchova popie techto promennych a na jeich dalsi modifikace za behu programu nebere zretel.