Milioni binarnih datoteka kasnije. Kako je Linux jačao

Milioni binarnih datoteka kasnije. Kako je Linux jačaoTL; DR. U ovom članku istražujemo šeme očvršćavanja koje rade bez upotrebe na pet popularnih Linux distribucija. Za svaki smo uzeli zadanu konfiguraciju kernela, učitali sve pakete i analizirali sigurnosne šeme u priloženim binarnim datotekama. Distribucije koje se razmatraju su OpenSUSE 12.4, Debian 9, CentOS, RHEL 6.10 i 7, kao i Ubuntu 14.04, 12.04 i 18.04 LTS.

Rezultati potvrđuju da čak i osnovne sheme poput slaganja kanarinca i koda neovisnog o položaju još uvijek nisu usvojeni od strane svih. Situacija je još gora za kompajlere kada je u pitanju zaštita od ranjivosti poput sukoba stekova, koji je došao u centar pažnje u januaru nakon objavljivanja. informacije o sistemskim ranjivostima. Ali nije sve tako beznadežno. Značajan broj binarnih datoteka implementira osnovne metode zaštite, a njihov broj raste od verzije do verzije.

Pregled je pokazao da je najveći broj metoda zaštite implementiran u Ubuntu 18.04 na nivou OS-a i aplikacije, a slijedi ga Debian 9. S druge strane, OpenSUSE 12.4, CentOS 7 i RHEL 7 također implementiraju osnovne šeme zaštite, te zaštitu od kolizije steka. se koristi još šire s mnogo gušćim skupom zadanih paketa.

Uvod

Teško je osigurati visok kvalitet softvera. Uprkos velikom broju naprednih alata za statičku analizu koda i dinamičku analizu vremena izvršavanja, kao i značajnom napretku u razvoju kompajlera i programskih jezika, savremeni softver i dalje pati od ranjivosti koje napadači stalno iskorištavaju. Situacija je još gora u ekosistemima koji uključuju naslijeđeni kod. U takvim slučajevima, ne samo da smo suočeni s vječnim problemom pronalaženja mogućih grešaka koje se mogu iskoristiti, već smo također ograničeni strogim okvirima kompatibilnosti unatrag, koji često zahtijevaju od nas da sačuvamo ograničen, ili još gore, ranjiv ili pogrešan kod.

Ovdje na scenu stupaju metode zaštite ili učvršćivanja programa. Neke vrste grešaka ne možemo spriječiti, ali možemo otežati život napadaču i djelomično riješiti problem tako što ćemo spriječiti ili spriječiti eksploatacija ove greške. Takva zaštita se koristi u svim modernim operativnim sistemima, ali se metode uvelike razlikuju po složenosti, efikasnosti i performansama: od stack canary i ASLR do pune zaštite CFI и R.O.P.. U ovom članku ćemo pogledati koje se metode zaštite koriste u najpopularnijim Linux distribucijama u zadanoj konfiguraciji, a također ćemo ispitati svojstva binarnih datoteka koje se distribuiraju kroz sisteme upravljanja paketima svake distribucije.

CVE i sigurnost

Svi smo vidjeli članke s naslovima kao što su "Najugroženije aplikacije godine" ili "Najranjiviji operativni sistemi". Obično daju statistiku o ukupnom broju zapisa o ranjivosti poput CVE (uobičajena ranjivost i izloženost), dobijeno od Nacionalna baza podataka o ranjivosti (NVD) iz NIST i drugi izvori. Nakon toga, ove aplikacije ili OS se rangiraju prema broju CVE-ova. Nažalost, iako su CVE-ovi vrlo korisni za praćenje problema i informiranje dobavljača i korisnika, oni malo govore o stvarnoj sigurnosti softvera.

Kao primjer, uzmite u obzir ukupan broj CVE-a u posljednje četiri godine za Linux kernel i pet najpopularnijih serverskih distribucija, odnosno Ubuntu, Debian, Red Hat Enterprise Linux i OpenSUSE.

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Fig. 1

Šta nam ovaj grafikon govori? Da li veći broj CVE-a znači da je jedna distribucija ranjivija od druge? Nema odgovora. Na primjer, u ovom članku ćete vidjeti da Debian ima jače sigurnosne mehanizme u odnosu na, recimo, OpenSUSE ili RedHat Linux, a ipak Debian ima više CVE-ova. Međutim, oni ne znače nužno oslabljenu sigurnost: čak ni prisustvo CVE ne ukazuje na to da li je ranjivost eksploatisano. Rezultati ozbiljnosti daju indikaciju kako verovatno iskorištavanje ranjivosti, ali na kraju iskorištavanje uvelike ovisi o zaštiti prisutnim u pogođenim sistemima i resursima i mogućnostima napadača. Štaviše, odsustvo CVE izvještaja ne govori ništa o drugima neregistrovan ili nepoznat ranjivosti. Razlika u CVE-u može biti posljedica drugih faktora osim kvaliteta softvera, uključujući resurse dodijeljene testiranju ili veličinu korisničke baze. U našem primjeru, Debianov veći broj CVE-a može jednostavno značiti da Debian isporučuje više softverskih paketa.

Naravno, CVE sistem pruža korisne informacije koje vam omogućavaju da kreirate odgovarajuću zaštitu. Što bolje razumijemo razloge neuspjeha programa, lakše je identificirati moguće metode eksploatacije i razviti odgovarajuće mehanizme otkrivanje i odgovor. Na sl. 2 prikazuje kategorije ranjivosti za sve distribucije u posljednje četiri godine (izvor). Odmah je jasno da većina CVE-ova spada u sljedeće kategorije: uskraćivanje usluge (DoS), izvršenje koda, prelijevanje, oštećenje memorije, curenje informacija (eksfiltracija) i eskalacija privilegija. Iako se mnogi CVE broje više puta u različitim kategorijama, općenito se isti problemi nastavljaju iz godine u godinu. U sljedećem dijelu članka procijenićemo upotrebu različitih zaštitnih šema kako bi se spriječilo iskorištavanje ovih ranjivosti.

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Fig. 2

zadaci

U ovom članku namjeravamo odgovoriti na sljedeća pitanja:

  • Koja je sigurnost različitih Linux distribucija? Koji zaštitni mehanizmi postoje u aplikacijama jezgra i korisničkog prostora?
  • Kako se usvajanje sigurnosnih mehanizama promijenilo tokom vremena u svim distribucijama?
  • Koje su prosječne zavisnosti paketa i biblioteka za svaku distribuciju?
  • Koje su zaštite implementirane za svaku binarnu datoteku?

Izbor distribucija

Ispada da je teško pronaći tačnu statistiku o distribucijskim instalacijama, jer u većini slučajeva broj preuzimanja ne pokazuje broj stvarnih instalacija. Međutim, Unix varijante čine većinu serverskih sistema (na web serverima 69,2%, od statistika W3techs i drugi izvori), a njihov udio stalno raste. Stoga smo se za naše istraživanje fokusirali na distribucije dostupne izvan kutije na platformi Google Cloud. Posebno smo odabrali sljedeće OS:

Distribucija/verzija
Kernel
Build

OpenSUSE 12.4
4.12.14-95.3-zadano
#1 SMP sri 5. prosinca 06:00:48 UTC 2018 (63a8d29)

Debian 9 (rastegnuti)
4.9.0-8-amd64
#1 SMP Debian 4.9.130-2 (2018)

CentOS 6.10
2.6.32-754.10.1.el6.x86_64
#1 SMP uto 15. siječnja 17:07:28 UTC 2019

CentOS 7
3.10.0-957.5.1.el7.x86_64
#1 SMP Pet Feb 1 14:54:57 UTC 2019

Red Hat Enterprise Linux Server 6.10 (Santiago)
2.6.32-754.9.1.el6.x86_64
#1 SMP Wed Nov 21 15:08:21 EST 2018

Red Hat Enterprise Linux Server 7.6 (Maipo)
3.10.0-957.1.3.el7.x86_64
#1 SMP čet 15. novembar 17:36:42 UTC 2018

Ubuntu 14.04 (Trusty Tahr)
4.4.0–140-generički

#166~14.04.1-Ubuntu SMP Sub 17. novembar 01:52:43 UTC 20…

Ubuntu 16.04 (Xenial Xerus)
4.15.0–1026-gcp
#27~16.04.1-Ubuntu SMP Pet Dec 7 09:59:47 UTC 2018

Ubuntu 18.04 (Bionic Beaver)
4.15.0–1026-gcp
#27-Ubuntu SMP Čet Dec 6 18:27:01 UTC 2018

Tabela 1

Анализ

Hajde da proučimo podrazumevanu konfiguraciju kernela, kao i svojstva paketa dostupnih preko menadžera paketa svake distribucije van kutije. Stoga, razmatramo samo pakete iz zadanih ogledala svake distribucije, zanemarujući pakete iz nestabilnih repozitorija (kao što su Debian 'testiranje' ogledala) i pakete treće strane (kao što su Nvidia paketi iz standardnih ogledala). Osim toga, ne razmatramo prilagođene kompilacije kernela ili sigurnosno ojačane konfiguracije.

Analiza konfiguracije kernela

Primijenili smo skriptu analize na osnovu besplatni kconfig checker. Pogledajmo gotove zaštitne parametre imenovanih distribucija i uporedimo ih sa listom iz Osnovni projekat samoodbrane (KSPP). Za svaku opciju konfiguracije, Tabela 2 opisuje željenu postavku: polje za potvrdu je za distribucije koje su u skladu sa KSSP preporukama (pogledajte sljedeće za objašnjenje pojmova). ovdje; U budućim člancima ćemo objasniti koliko je ovih sigurnosnih metoda nastalo i kako hakovati sistem u njihovom odsustvu).

Milioni binarnih datoteka kasnije. Kako je Linux jačao

Milioni binarnih datoteka kasnije. Kako je Linux jačao

Općenito, novi kerneli imaju strože postavke iz kutije. Na primjer, CentOS 6.10 i RHEL 6.10 na kernelu 2.6.32 nemaju većinu kritičnih karakteristika implementiranih u novije kernele kao što su SMAP, stroge RWX dozvole, randomizacija adresa ili copy2usr zaštita. Treba napomenuti da mnoge opcije konfiguracije u tabeli nisu dostupne u starijim verzijama kernela i nisu primjenjive u stvarnosti - to je u tabeli još uvijek naznačeno kao nedostatak odgovarajuće zaštite. Isto tako, ako opcija konfiguracije nije prisutna u datoj verziji, a sigurnost zahtijeva da ta opcija bude onemogućena, ovo se smatra razumnom konfiguracijom.

Još jedna stvar koju treba uzeti u obzir prilikom tumačenja rezultata: neke konfiguracije kernela koje povećavaju površinu napada također se mogu koristiti za sigurnost. Takvi primjeri uključuju uprobes i kprobes, module kernela i BPF/eBPF. Naša preporuka je da koristite gore navedene mehanizme za pružanje stvarne zaštite, jer nisu trivijalni za korištenje i njihova eksploatacija pretpostavlja da su zlonamjerni akteri već uspostavili uporište u sistemu. Ali ako su ove opcije omogućene, administrator sistema mora aktivno pratiti zloupotrebe.

Gledajući dalje unose u Tabeli 2, vidimo da moderna jezgra pružaju nekoliko opcija za zaštitu od iskorištavanja ranjivosti kao što su curenje informacija i prelijevanje steka/hrpe. Međutim, primjećujemo da čak ni najnovije popularne distribucije još nisu implementirale složeniju zaštitu (na primjer, sa zakrpama grsecurity) ili moderna zaštita od napada ponovne upotrebe koda (npr. kombinacija randomizacije sa šemama kao što je R^X za kod). Da stvar bude gora, čak ni ove naprednije odbrane ne štite od čitavog spektra napada. Stoga je ključno za sistemske administratore da dopune pametne konfiguracije rješenjima koja nude otkrivanje i prevenciju eksploatacije tokom izvršavanja.

Analiza aplikacija

Nije iznenađujuće da različite distribucije imaju različite karakteristike paketa, opcije kompilacije, zavisnosti biblioteke, itd. Razlike postoje čak i za povezane distribucije i paketi s malim brojem ovisnosti (na primjer, coreutils na Ubuntu ili Debian). Da bismo procenili razlike, preuzeli smo sve dostupne pakete, izdvojili njihov sadržaj i analizirali binarne datoteke i zavisnosti. Za svaki paket pratili smo ostale pakete od kojih zavisi, a za svaki binarni program pratili smo njegove zavisnosti. U ovom dijelu ukratko sumiramo zaključke.

distribucije

Ukupno smo preuzeli 361 paketa za sve distribucije, izdvajajući samo pakete iz podrazumevanih ogledala. Zanemarili smo pakete bez ELF izvršnih datoteka, kao što su izvori, fontovi, itd. Nakon filtriranja, ostalo je 556 paketa, koji sadrže ukupno 129 binarnih datoteka. Distribucija paketa i datoteka kroz distribucije prikazana je na Sl. 569.

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Fig. 3

Možda ćete primijetiti da što je modernija distribucija, sadrži više paketa i binarnih datoteka, što je i logično. Međutim, Ubuntu i Debian paketi uključuju mnogo više binarnih datoteka (i izvršnih i dinamičkih modula i biblioteka) od CentOS-a, SUSE-a i RHEL-a, što potencijalno utječe na površinu napada Ubuntu-a i Debian-a (treba napomenuti da brojevi odražavaju sve binarne datoteke svih verzija paket, odnosno neke datoteke se analiziraju više puta). Ovo je posebno važno kada uzmete u obzir zavisnosti između paketa. Dakle, ranjivost u binarnom sistemu jednog paketa može uticati na mnoge delove ekosistema, baš kao što ranjiva biblioteka može uticati na sve binarne datoteke koje je uvoze. Kao početnu tačku, pogledajmo distribuciju broja zavisnosti između paketa u različitim operativnim sistemima:

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Fig. 4

U skoro svim distribucijama, 60% paketa ima najmanje 10 zavisnosti. Osim toga, neki paketi imaju znatno veći broj zavisnosti (više od 100). Isto vrijedi i za obrnute ovisnosti paketa: kao što se i očekivalo, nekoliko paketa koriste mnogi drugi paketi u distribuciji, tako da su ranjivosti u nekolicini odabranih visoko rizične. Kao primjer, sljedeća tablica navodi 20 paketa s maksimalnim brojem obrnutih ovisnosti u SLES, Centos 7, Debian 9 i Ubuntu 18.04 (svaka ćelija označava paket i broj obrnutih ovisnosti).

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Tabela 3

Zanimljiva činjenica. Iako su svi analizirani OS napravljeni za arhitekturu x86_64, a većina paketa ima arhitekturu definiranu kao x86_64 i x86, paketi često sadrže binarne datoteke za druge arhitekture, kao što je prikazano na slici 5. XNUMX.

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Fig. 5

U sljedećem odjeljku ćemo se pozabaviti karakteristikama analiziranih binarnih datoteka.

Statistika zaštite binarnih datoteka

Kao apsolutni minimum, trebate istražiti osnovni skup sigurnosnih opcija za vaše postojeće binarne datoteke. Nekoliko Linux distribucija dolazi sa skriptama koje vrše takve provjere. Na primjer, Debian/Ubuntu ima takvu skriptu. Evo primjera njegovog rada:

$ hardening-check $(which docker)
/usr/bin/docker:
 Position Independent Executable: yes
 Stack protected: yes
 Fortify Source functions: no, only unprotected functions found!
 Read-only relocations: yes
 Immediate binding: yes

Skripta provjerava pet funkcije zaštite:

  • Position Independent Executable (PIE): Označava da li se tekstualni dio programa može premjestiti u memoriju kako bi se postigla nasumična raspodjela ako je ASLR omogućen u kernelu.
  • Stack Protected: Da li su kanari steka omogućeni za zaštitu od napada kolizije steka.
  • Učvrsti izvor: da li se nesigurne funkcije (na primjer, strcpy) zamjenjuju njihovim sigurnijim kolegama, a pozivi koji su provjereni u vrijeme izvođenja zamjenjuju se njihovim neprovjerenim kolegama (na primjer, memcpy umjesto __memcpy_chk).
  • Premještanja samo za čitanje (RELRO): Da li su unosi tablice premještanja označeni kao samo za čitanje ako su pokrenuti prije početka izvršenja.
  • Trenutačno uvezivanje: Da li runtime linker dozvoljava sve poteze prije početka izvršavanja programa (ovo je ekvivalentno punom RELRO).

Da li su gore navedeni mehanizmi dovoljni? Nažalost nema. Postoje poznati načini da se zaobiđu sve gore navedene odbrane, ali što je odbrana čvršća, to je viša letvica za napadača. Na primjer, RELRO metode zaobilaženja teže primijeniti ako su PIE i trenutno uvezivanje na snazi. Isto tako, potpuni ASLR zahtijeva dodatni rad da bi se napravio radni exploit. Međutim, sofisticirani napadači su već spremni da odgovore na takvu zaštitu: njihovo odsustvo će u suštini ubrzati hakiranje. Stoga je neophodno da se ove mjere smatraju neophodnim minimum.

Željeli smo proučiti koliko je binarnih datoteka u dotičnim distribucijama zaštićeno ovim i tri druge metode:

  • Neizvršiv bit (NX) sprečava izvršenje u bilo kojoj regiji koja ne bi trebala biti izvršna, kao što je hrpa steka, itd.
  • RPATH/RUNPATH označava putanju izvršenja koju koristi dinamički učitavač za pronalaženje odgovarajućih biblioteka. Prvi je obavezno za bilo koji moderni sistem: njegovo odsustvo omogućava napadačima da proizvoljno upišu korisni teret u memoriju i izvrše ga kakav jeste. Za drugo, pogrešne konfiguracije putanje izvršavanja pomažu u uvođenju nepouzdanog koda koji može dovesti do brojnih problema (npr. eskalacija privilegijaI drugi problemi).
  • Zaštita od sudara steka pruža zaštitu od napada koji uzrokuju da se stog preklapa sa drugim područjima memorije (kao što je hrpa). S obzirom na nedavne zloupotrebe sistemd ranjivosti u koliziji gomile, smatrali smo da je prikladno uključiti ovaj mehanizam u naš skup podataka.

Dakle, bez daljeg odlaganja, pređimo na brojke. Tabele 4 i 5 sadrže sažetak analize izvršnih datoteka i biblioteka različitih distribucija, respektivno.

  • Kao što vidite, NX zaštita je svuda implementirana, sa rijetkim izuzecima. Posebno se može primijetiti njegova nešto manja upotreba u Ubuntu i Debian distribucijama u odnosu na CentOS, RHEL i OpenSUSE.
  • Stack kanarinci nedostaju na mnogim mjestima, posebno u distribucijama sa starijim jezgrama. Određeni napredak se vidi u najnovijim distribucijama Centosa, RHEL-a, Debiana i Ubuntua.
  • S izuzetkom Debiana i Ubuntua 18.04, većina distribucija ima lošu podršku za PIE.
  • Zaštita od kolizije steka je slaba u OpenSUSE, Centos 7 i RHEL 7, i praktično ne postoji u ostalima.
  • Sve distribucije s modernim kernelima imaju određenu podršku za RELRO, s Ubuntu 18.04 koji prednjači, a Debianom na drugom mjestu.

Kao što je već spomenuto, metrike u ovoj tabeli su prosjek za sve verzije binarne datoteke. Ako pogledate samo najnovije verzije datoteka, brojevi će biti drugačiji (na primjer, pogledajte Debian napredak s PIE implementacijom). Štoviše, većina distribucija obično testira sigurnost samo nekoliko funkcija u binarnom sistemu prilikom izračunavanja statistike, ali naša analiza pokazuje pravi postotak funkcija koje su ojačane. Stoga, ako je 5 od 50 funkcija zaštićeno u binarnom sistemu, dat ćemo mu ocjenu 0,1, što odgovara 10% funkcija koje se jačaju.

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Tabela 4. Sigurnosne karakteristike za izvršne datoteke prikazane na Sl. 3 (implementacija relevantnih funkcija u postotku od ukupnog broja izvršnih datoteka)

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Tabela 5. Sigurnosne karakteristike za biblioteke prikazane na sl. 3 (realizacija relevantnih funkcija u postotku od ukupnog broja biblioteka)

Dakle, ima li napretka? Definitivno postoji: to se može vidjeti iz statistike za pojedinačne distribucije (npr. Debian), kao i iz gornjih tabela. Kao primjer na sl. Slika 6 prikazuje implementaciju zaštitnih mehanizama u tri uzastopne distribucije Ubuntu LTS 5 (izostavili smo statistiku zaštite od kolizije steka). Primjećujemo da iz verzije u verziju sve više datoteka podržava stack canary, a također se sve više i više binarnih datoteka isporučuje s potpunom RELRO zaštitom.

Milioni binarnih datoteka kasnije. Kako je Linux jačao
Fig. 6

Nažalost, određeni broj izvršnih datoteka u različitim distribucijama još uvijek nema nijednu od gore navedenih zaštita. Na primjer, gledajući Ubuntu 18.04, primijetit ćete ngetty binary (getty zamjena), kao i mksh i lksh ljuske, picolisp interpreter, nvidia-cuda-toolkit pakete (popularni paket za GPU ubrzane aplikacije kao što su okviri za mašinsko učenje) i klibc -utils. Isto tako, binarni program mandos-client (administrativni alat koji vam omogućava da automatski ponovo pokrenete mašine sa šifrovanim sistemima datoteka) kao i rsh-redone-client (ponovna implementacija rsh i rlogin) se isporučuju bez NX zaštite, iako imaju SUID prava: (. Takođe, nekoliko suid binarnih datoteka nemaju osnovnu zaštitu kao što su stack canary (na primjer, Xorg.wrap binarni fajl iz paketa Xorg).

Sažetak i završne napomene

U ovom članku smo istakli nekoliko sigurnosnih karakteristika modernih Linux distribucija. Analiza je pokazala da najnovija Ubuntu LTS distribucija (18.04) implementira, u prosjeku, najjaču zaštitu na OS i aplikacijskom nivou među distribucijama s relativno novim kernelima, kao što su Ubuntu 14.04, 12.04 i Debian 9. Međutim, ispitane distribucije CentOS, RHEL i OpenSUSE u našem setu prema zadanim postavkama proizvodi gušći skup paketa, au najnovijim verzijama (CentOS i RHEL) imaju veći postotak zaštite od kolizije steka u odnosu na konkurente bazirane na Debianu (Debian i Ubuntu). Upoređujući CentOS i RedHat verzije, primjećujemo velika poboljšanja u implementaciji stack canaries i RELRO od verzija 6 do 7, ali u prosjeku CentOS ima više implementiranih funkcija od RHEL-a. Općenito, sve distribucije trebaju obratiti posebnu pažnju na PIE zaštitu, koja je, s izuzetkom Debiana 9 i Ubuntu 18.04, implementirana u manje od 10% binarnih datoteka u našem skupu podataka.

Na kraju, treba napomenuti da iako smo istraživanje proveli ručno, postoji mnogo dostupnih sigurnosnih alata (npr. Lynis, tigar, Hubble), koji vrše analizu i pomažu u izbjegavanju nesigurnih konfiguracija. Nažalost, čak i jaka zaštita u razumnim konfiguracijama ne garantuje odsustvo eksploatacije. Zato čvrsto vjerujemo da je važno osigurati pouzdano praćenje i prevencija napada u realnom vremenu, fokusirajući se na obrasce eksploatacije i njihovo sprječavanje.

izvor: www.habr.com

Dodajte komentar