Jellemzők hozzáférési rendszer kernel függvények tengelyek gnu
Jellemzők hozzáférést a rendszer működik OS GNU / Linux kernel
A. M. Kanner
Zárt részvénytársaság „OKB SAPR”, Moszkva, Oroszország
B. P. Elk, Dr. Sc. tudományok
Moszkvai Állami Egyetem Ipari (MGIU), Institute of kriptográfia, Távközlési és Informatikai Tudományos Akadémia az FSB Oroszország, Moszkva
Linux kernel ma, talán az egyetlen, egységes és egyetlen komponense minden Linux disztribúció. A legtöbb nagy gyártók (RedHat, Novell, kanonikus és t. D.) A rendelkezésre álló speciális módosításokat kernelforrásokat, de az ilyen változások vagy nem zavarhatja a referencia kód (úgynevezett „vanília” mag), vagy tovább vezetjük be a fő ága a kernel, így a kernel egy mindenki számára.
Mivel ez a funkció a Linux család lehet egyszerűen elég (kivéve néhány kompatibilitási problémák korábbi változatai a kernel), hogy dolgozzon ki a különböző kiterjesztések - kernel modulok, melyek valójában része a mag és felülírhatja / kiegészíteni a különböző funkciók, vagyis arra, hogy módosítsa a sorrendben .. munka a Linux kernel. És ezek a modulok, némi joggal, hogy kompatibilis legyen a legtöbb Linux disztribúció anélkül, hogy azokat bármilyen kódot változtatásokat.
Így Linux kernel monolit (azaz elégséges funkciók normális működését a rendszer anélkül, hogy más kiegészítések / bővítmények ..), de támogatja betölthető rendszermag modulok (LKM - Linux Kernel modulok vagy betölthető modulok), amelyet végre 0. védőgyűrű, teljes hozzáférést a berendezés, ahol a rakodását / kirakodását ilyen modulok működése során a rendszer (kernel) újraindítás nélkül.
Első pillantásra egy ilyen megközelítés tűnhet problémás a biztonság szempontjából, de meg kell érteni, hogy:
- az összes modul is terhelt / terheletlen a Linux kernel térben csak a rendszergazda (root);
- a mag, vannak speciális mechanizmusok megakadályozzák kritikus kirakodás kernelmoduljainak idején munkájukat (az alapértelmezett kernel fog MODULE_FORCE_UNLOAD opció = 0, vagyis nincs lehetőség a kényszerű kirakodás kernelmoduljainak a -force paraméter - .. „rmmod -force module.ko” );
- A modul önmagában nem kifejezetten engedélyezett intézkedések megtételére, amelyek befolyásolhatják az operációs rendszer (például az adatok módosítását struktúrák a futó folyamatokat, a hozzáférést a kernel-memória, és így tovább. n.). Az ilyen intézkedések szükség előzetes manipuláció, hanem a potenciális ezen intézkedések lehetségesek, és nem tiltott, ha kihúzza a GFP-típusú zár (Általános hiba védelem).
Ebben a tekintetben azt lehet mondani, hogy a betölthető rendszermag modulok önmagukban nem jelenthet növekvő jogosultságokkal rendszer és / vagy a biztonsági réseket. A megvalósíthatósági segítségével betölthető kernel modulokat a támadó szemszögéből rejtőzik saját jelenlétét a rendszerben, és nem több, t. E. akció után azonnal a törés egy rendszerben.
Mi hasznos lehet betölthető rendszermag modulok növelése szempontjából a rendszer biztonságát és / vagy a fejlesztés egy „függöny” védelem? Ezek a modulok is használható, hogy elkapjam a központi rendszer funkcióit annak érdekében, hogy megszervezzék saját, külső az operációs rendszer, a alrendszer hozzáférés-szabályozás az operációs rendszer.
Interfész a Linux kernel a rendszer kéri
Interface rendszer hívás (rendszerhívás interfész) egy réteg a fő operációs rendszer, mely segítségével szoftvert (a felhasználó módú) férhet hozzá a berendezés működni fájlrendszereket, és így tovább. N. Így gyakorlatilag bármilyen műveletet végrehajthat a rendszer megköveteli a hívás különben a rendszer hívás (akár írás / olvasás a fájl jogosultságok megváltoznak, dob egy új eljárás, vagy bármilyen akciók allokációs / felszabadítás), és az általános rendszer a munka rendszer hívásokat sematikusan látható. 1.
Ábra. 1. A rendszer működését Linux kernel felhasználói alkalmazások
Lefoglaló rendszer hívások
Ábra. 2. lehallgatási rendszer hívást Linux kernel modul
Most, ha module_B rakodni az első - a rendszerben semmi rossz nem fog történni - a kirakodás module_A a táblázatban a rendszer kéri az eredeti hívást „nyitott” lesz visszaállítva. Azonban, ha az első kirakodás module_A, helyreáll az eredeti rendszer hívás „nyitott”, és amikor kirakodás module_B rendszer hívás „nyitott” helyébe orep_A (ami általában nem a memória).
Segítségével LSM mechanizmus elfogó rendszer hívások
Tekintsük a példát LSM-kernel modult, amely felváltja a standard rendszer hívás mkdir annak kezelő, amely amellett, hogy létre a könyvtár jelenik dmesg egy üzenet minden alkalommal, amikor hívja a mkdir parancs:
1. Annak érdekében, hogy kernel modul elkezdte használni LSM mechanizmus inicializálási funkció és a letiltás (module_init és module_exit) kell hozzá egy hívást, hogy a következő két funkciót, illetve:
/ * Új elfogó rendszer hívások
* @return 0, ha sikeres, egyébként - a hibakódot * /
int res = register_security (hook_security_ops);
if (res) <
printk (KERN_ERR res.); visszatérés res;
>
vissza 0;
>
/ * Regisztráció megszüntetése elfogó rendszer kéri * /
int res = unregister_security (hook_security_ops);
ha (res) printk (KERN_ERR res.);
2. Amint a fenti példa LSM-kernel érzékeli saját rakodók keresztül register_security () funkció (Törli a regisztrációt keresztül unregister_security (), mindkét funkciót deklarált), átadva ezt a funkciót szerkezete:
/ * Operations lehallgató rendszer kéri * /
static struct biztonsági műveletek hooksecurityops = <.inodernkdir = inodernkdir,>;
3. Ebben az esetben a szerkezet típusa felsorolt security_operations rendszer kéri együtt funkciók (a horog), amelyek végrehajtása azonnal a végrehajtás előtt az említett rendszer hívás (ebben az esetben, mielőtt a rendszer hívást végrehajtja inode_mkdir inode_mkdir a függvényt, ami kell jelenteni az adott modulban mag ).
4. A függvény maga okozza, hogy végre a rendszer hívásokat lehet például a következő:
/ * Lehallgatás kérelem könyvtárat létrehozni * /
static int inode_mkdir (struct inode * dir, struct dentry * dentry, int mód)
printk (); vissza 0;
5. Ebben az esetben betölteni a modult a Linux kernel és a mkdir parancs, a dmesg kimenetet akkor megjelenik egy új sor a kifejezés «mkdir eltérített!», Jelezve, hogy a LSM-modul sikeresen elfogja a rendszer hívás inode_mkdir.
Az egyik jellemzője az alkalmazása LSM mechanizmus használatának hiányából számos kernel modul regisztrálni a horgot - amikor megpróbálja ellenőrizni a kernel LSM-modul egy figyelmeztetés, így amikor egy standard fordított legtöbb változata SELinux kernel fog megjelenni az Ön saját LSM biztonsági modul nem fog működni (SELinux le kernel paraméter a rakodó típusú SELinux = 0 is, nem tud hozni nincs eredmény). Ezért az ingyenesen használható saját rendszermag LSM-modullal újra kell fordítanod a Linux kernel, hogy abból kizárja a további védőeszközök (például SELinuxhoz AppArmor Tomoyo, stb.)
Különben is, biztonsági okokból verziótól kezdődően 2.6.24 Linux kernel fölött az LSM-mechanizmus (azaz hagyta ezt a mechanizmust) megszűnt exportálni lényege a Linux operációs rendszer (ez annak a ténynek köszönhető, hogy a legtöbb malware elrejti a jelenlétét a rendszerben nevezetesen használatával LSM mechanizmus).
Lehallgatás rendszer kéri betölthető rendszermag modulok (LKM)
Visszatérve a normál lefoglaló rendszer hívásokat (.. És elöntve a probléma, hogy kárt a rendszer hívás asztal, azaz, hogy ténylegesen más lehetőség, hogy helyesen lefoglaló rendszer hívások) hozzá kell adni megoldani egyszerre két problémát:
A feladat a rendszer hívás táblázat keresési lehet oldani több módon:
// értékek 32 bites Linux operációs rendszer kernel
#define START_MEM 0xc0000000
#define END_MEM 0xd0000000
unsigned long * syscall_table;
előjel nélküli hosszú hiba ** find_syscall_table () <
előjel nélküli hosszú hiba ** sctable;
előjel nélküli hosszú hiba int i = START_MEM;
míg a (I ha a (sctable [_NR_close] == (előjel nélküli hosszú hiba *) SYS bezár) visszatérés sctable [0]; i + = sizeof (void *); // találni rendszer hívás a következő táblázat syscalltable = (unsigned long *) find_syscall_table (); / * Letiltása biztonságos módba, WP beállítás bit 0 * / write_cr0 (read_cr0 () ( / * A módosításokat a rendszer hívás táblázat * / / * Vklyuchit zapgdschenngy mód beállításával egy kicsit a WP 1 * / write_cr0 (read_cr0 () | 0 10000?); Ebben az esetben a zár van társítva a processzor használt, példaként tekinthető Intel blokkolás, amelyben 0-edik bit CR (vezérlő regiszter, Control Register) kell kapcsolni, hogy 0 letiltja «védett módban», majd 1 engedélyezéséhez «védett mód »megváltoztatása után a rendszer hívás asztalra. Vannak még egyéb zárak, attól függően, hogy az architektúra, hogy milyen operációs rendszert használnak. A mechanizmus a rendszer kéri helyett a saját funkcióit lehet szervezni a következő módon: / * Új funkció, amely helyettesíti a standard rendszer hívás * / printk (<\nmkdir hijacked!\n>); / * A funkció a rendszer hívás táblázat * / #if LINUX VERSION CODE> = KERNEL_VERSION (2, 5,0) #if LINUX VERSION CODE> = KERNEL_VERSION (2, 5, 0) / * Függvény visszatérési táblázata rendszer felszólítja az eredeti állapot * / #if LINUX VERSION CODE> = KERNEL_VERSION (2, 5, 0) #if LINUX VERSION CODE> = KERNEL_VERSION (2, 5, 0) / * Funkció kernel modul inicializálása * / / * Felragasztani a tapaszt a rendszer hívás táblázat * / patch_sys_call_table (); printk ( "sys_call_table patched \ n."); / * End funkció a kernel modult * / / * Visszaadja az állam a rendszer hívás táblázat * / Ami a saját OS Linux családnak hozzáférés-szabályozás alrendszer technikai értelemben nem valami bonyolult vagy elérhetetlen. Átveheti az irányítást a rendszer kernel funkciók (rendszer hívások), amint ez a cikk meglehetősen egyszerű - tehát a fő célja, hogy fejlessze a szűrési szabályok kell hívni, ha a végrehajtási rendszer hívást kernel. [1] Chris Wright, Crispin Cowan, Stephen Smalley James Morris, Greg Kroah-Hartman. Linux Security Modules: Általános
asmlinkage int newrnkdir (struct inode * dir, struct dentry * dentry, int mód)
vissza Orig mkdir (dir, dentry, mód);
static void patch_sys_call_table ()
writecr0 (readcr0 () (
levelet CR0 (readcr0 () | 0 10000?);
#endif>
static void revert_sys_call_table ()
levelet CR0 (értsd CR0 () (
levelet CR0 (értsd CR0 () | 0 10000?);
#endif>
static int init (void)
vissza 0;
static void exit (void)
revert_sys_call_table (); printk ( „sys_call_table visszatért. \ n<); return;
Kapcsolódó cikkek