Vývojáři projektu Grsecurity
Záplaty HKSP byly zveřejněny zaměstnancem Huawei, obsahují zmínku o Huawei v profilu GitHub a v názvu projektu používají slovo Huawei (HKSP - Huawei Kernel Self Protection). Zástupci Huawei zároveň popřeli spojení projektu HKSP se společností a uvedli, že kód byl vyvinut z osobní iniciativy zaměstnance, není oficiálním projektem Huawei a není používán v produktech společnosti. Na
HKSP zahrnuje změny jako randomizace offsetů ve struktuře cred, ochrana proti útokům na jmenný prostor identifikátoru uživatele (jmenný prostor pid), oddělení zásobníku procesů od oblasti mmap, detekce dvojitých volání funkce kfree, blokování úniků přes pseudo -FS /proc (/proc/ {moduly, klíče, uživatelé klíčů}, /proc/sys/kernel/* a /proc/sys/vm/mmap_min_addr, /proc/kallsyms), vylepšená randomizace adres v uživatelském prostoru, další Ptrace ochrana, vylepšená ochrana proti smapování a smepu, možnost zakázat odesílání dat přes raw sockety, blokování nesprávných adres v UDP socketech a kontrola integrity běžících procesů. Obsahuje také modul jádra Ksguard, který je zaměřen na odhalování pokusů o zavedení typických rootkitů.
Záplaty
Studie patche od vývojářů Grsecurity odhalila mnoho chyb a slabin v kódu a také ukázala absenci modelu hrozeb, který by jim umožnil adekvátně posoudit schopnosti projektu. Aby bylo jasné, že kód byl napsán bez použití bezpečných metod programování, je uveden příklad triviální zranitelnosti v handleru.
soubor /proc/ksguard/state, který je vytvořen s právy 0777, což znamená, že každý má přístup pro zápis. Funkce ksg_state_write, která se používá k analýze příkazů zapsaných do /proc/ksguard/state, vytváří vyrovnávací paměť tmp[32], do které se zapisují data na základě velikosti předávaného operandu, bez zohlednění velikosti cílové vyrovnávací paměti a bez kontrola parametru s velikostí řetězce. Tito. K přepsání části zásobníku jádra útočníkovi stačí napsat speciálně formátovaný řádek do /proc/ksguard/state.
static ssize_t ksg_state_write(soubor struktur *soubor, const char __user *buf,
size_t len, loff_t *offset)
{
hodnota u64;
char tmp[32];
velikost_t n = 0;
if (copy_from_user(tmp, buf, len))
návrat -1;
hodnota = simple_strtoul(tmp, '\0', 10);
...
Využití prototypu:
char buf[4096] = { };
int fd = open(“/proc/ksguard/state”, O_WRONLY);
if (fd >= 0) {
write(fd, buf, sizeof(buf));
close(fd);
}
Zdroj: opennet.ru