TL;DR. I denna artikel utforskar vi hÄrdningsscheman (hardening schemes) som fungerar frÄn start i fem populÀra Linux-distributioner. För varje har vi tagit standard kÀrnkonfigurationen, laddat ner alla paket och analyserat skyddsscheman i de inbÀddade binÀra filerna. Distributioner som behandlas Àr OpenSUSE 12.4, Debian 9, CentOS, RHEL 6.10 och 7 samt Ubuntu 14.04, 12.04 och 18.04 LTS.
Resultaten bekrÀftar att Àven grundlÀggande scheman, sÄsom stack Canary och positionoberoende kod, fortfarande inte anvÀnds av alla. Situationen Àr Ànnu vÀrre för kompilatorer nÀr det kommer till skydd mot sÄrbarheter som stack clash, som kom i fokus i januari efter publiceringen . Men allt Àr inte hopplöst. En betydande del av binÀra filer implementerar grundlÀggande skyddsÄtgÀrder, och antalet ökar frÄn version till version.
Kontrollen visade att flest skyddsĂ„tgĂ€rder har implementerats i Ubuntu 18.04 pĂ„ OS- och applikationsnivĂ„, följt av Debian 9. Ă
andra sidan Àr grundlÀggande skyddsscheman ocksÄ implementerade i OpenSUSE 12.4, CentOS 7 och RHEL 7, medan skydd mot stack clash tillÀmpas Ànnu mer utbrett med en mycket tÀtare uppsÀttning standardpaket.
Introduktion
Det Àr svÄrt att sÀkerstÀlla hög kvalitet pÄ programvara. Trots det stora antalet avancerade verktyg för statisk kodanalys och dynamisk analys under körning, samt betydande framsteg inom kompilatorer och programmeringssprÄk, lider modern mjukvara fortfarande av sÄrbarheter som stÀndigt utnyttjas av angripare. Situationen Àr Ànnu svÄrare i ekosystem som inkluderar gammal kod. I sÄdana fall stÄr vi inte bara inför det eviga problemet med att hitta potentiellt exploaterbara fel, utan vi Àr ocksÄ begrÀnsade av strikta krav pÄ bakÄtkompatibilitet som ofta tvingar oss att behÄlla begrÀnsad, och Ànnu vÀrre, sÄrbar eller buggig kod.
HÀr kommer skyddsmetoder eller hÄrdning (hardening) in i bilden. Vissa typer av fel kan vi inte förhindra, men vi kan göra livet svÄrare för angriparen och delvis lösa problemet genom att förhindra eller hindra. utnyttjande dessa fel. Detta skydd anvÀnds i alla moderna operativsystem, men metoderna skiljer sig mycket Ät nÀr det gÀller komplexitet, effektivitet och prestanda: frÄn stackcanaries och till fullvÀrdigt skydd och . I denna artikel kommer vi att titta pÄ vilka skyddsÄtgÀrder som anvÀnds i de mest populÀra Linux-distributionerna i standardkonfigurationen, samt undersöka egenskaperna hos de binÀra filer som distribueras via pakethanteringssystemen för varje distribution.
CVE och sÀkerhet
Vi har alla sett artiklar med titlar som "De mest sÄrbara programvarorna under Äret" eller "De mest sÄrbara operativsystemen". Vanligtvis presenteras statistik över det totala antalet poster för sÄrbarheter av typen , erhÄllna frÄn frÄn och andra kÀllor. Dessa program eller operativsystem rangordnas senare efter antalet CVE. TyvÀrr, Àven om CVE Àr mycket anvÀndbara för att spÄra problem och informera leverantörer och anvÀndare, sÀger de lite om den verkliga sÀkerheten hos programvaran.
Som ett exempel, lÄt oss betrakta det totala antalet CVE de senaste fyra Ären för Linux-kÀrnan och fem av de mest populÀra serverdistributionerna, nÀmligen Ubuntu, Debian, Red Hat Enterprise Linux och OpenSUSE.

Fig. 1
Vad sÀger denna graf oss? Betyder ett högre antal CVE att en distribution Àr mer sÄrbar Àn en annan? Svaret Àr nej. Till exempel kommer du i denna artikel att se att Debian har mer strikta skyddsmekanismer jÀmfört med OpenSUSE eller RedHat Linux, och ÀndÄ har Debian fler CVE. Men det betyder inte nödvÀndigtvis en försvagad sÀkerhet: att ha CVE betyder inte om en sÄrbarhet Àr utnyttjad. Allvarlighetsgrader ger en uppfattning om hur sannolikt det Àr att utnyttja en sÄrbarhet, men i slutÀndan beror utnyttjande i stor utstrÀckning pÄ det skydd som finns i de drabbade systemen samt pÄ resurser och möjligheter för angriparna. Dessutom sÀger avsaknaden av CVE-rapporter ingenting om andra oregistrerande eller okÀnda SÄrbarheter. Skillnaden i CVE kan förklaras av inte bara mjukvarukvaliteten utan ocksÄ av andra faktorer, inklusive resurser som avsatts för testning eller storleken pÄ anvÀndarbasen. I vÄrt exempel kan det större antalet CVE i Debian helt enkelt indikera att Debian tillhandahÄller fler programvarupaket.
SjĂ€lvklart ger CVE-systemet anvĂ€ndbar information som gör det möjligt att skapa adekvata skydd. Ju bĂ€ttre vi förstĂ„r orsakerna till programvarufel, desto enklare blir det att identifiera potentiella utnyttjanden och utveckla motsvarande mekanismer. för upptĂ€ckte och respons. PĂ„ figur 2 visas kategorier av sĂ„rbarheter för alla distributioner under de senaste fyra Ă„ren (). Det framgĂ„r tydligt att de flesta CVE faller inom följande kategorier: DoS (Denial of Service), kodexekvering, buffertöverskridning, minneskorruption, lĂ€ckage (utexfiltrering) av information och privilegieförhöjning. Ăven om mĂ„nga CVE redovisas flera gĂ„nger i olika kategorier kvarstĂ„r generellt samma problem Ă„r efter Ă„r. I nĂ€sta del av artikeln kommer vi att utvĂ€rdera anvĂ€ndningen av olika skyddsscheman för att förhindra exploatering av de angivna sĂ„rbarheterna.

Figur 2
Uppgifter
I den hÀr artikeln avser vi att svara pÄ följande frÄgor:
- Hur sÀker Àr de olika Linux-distributionerna? Vilka skyddsmekanismer finns i kÀrnan och i program som körs av anvÀndaren?
- Hur har acceptansen av skyddsmekanismer förÀndrats över tid för olika distributioner?
- Vilka Àr de genomsnittliga beroendena för paket och bibliotek för varje distribution?
- Vilka skydd implementeras för varje binÀrfil?
Val av distributioner
Det visar sig vara svĂ„rt att hitta exakt statistik för installationer av distributioner, eftersom antal nedladdningar i de flesta fall inte anger antalet verkliga installationer. ĂndĂ„ utgör Unix-alternativ majoriteten av serversystem (69,2 % pĂ„ webbservrar enligt W3techs och andra kĂ€llor), och deras andel vĂ€xer konstant. DĂ€rför fokuserade vi i vĂ„r forskning pĂ„ distributioner som Ă€r tillgĂ€ngliga direkt frĂ„n plattformen. I synnerhet valde vi följande operativsystem: Distribution/version
Bygg
KĂ€rna
OpenSUSE 12.4
4.12.14-95.3-default
Debian 9 (stretch)
#1 SMP Wed Dec 5 06:00:48 UTC 2018 (63a8d29)
4.9.0-8-amd64
CentOS 6.10
#1 SMP Debian 4.9.130-2 (2018-10-27)
2.6.32-754.10.1.el6.x86_64
3.10.0-957.5.1.el7.x86_64
#1 SMP Tue Jan 15 17:07:28 UTC 2019
CentOS 7
Red Hat Enterprise Linux Server 6.10 (Santiago)
#1 SMP Fri Feb 1 14:54:57 UTC 2019
2.6.32-754.9.1.el6.x86_64
Red Hat Enterprise Linux Server 7.6 (Maipo)
#1 SMP Wed Nov 21 15:08:21 EST 2018
3.10.0-957.1.3.el7.x86_64
3.10.0-957.1.3.el7.x86_64
#1 SMP Thu Nov 15 17:36:42 UTC 2018
Ubuntu 14.04 (Trusty Tahr)
4.4.0â140-generic
#166~14.04.1-Ubuntu SMP Sat Nov 17 01:52:43 UTC 20âŠ
Ubuntu 16.04 (Xenial Xerus)
4.15.0â1026-gcp
#27~16.04.1-Ubuntu SMP Fri Dec 7 09:59:47 UTC 2018
Ubuntu 18.04 (Bionic Beaver)
4.15.0â1026-gcp
#27-Ubuntu SMP Thu Dec 6 18:27:01 UTC 2018
Tabell 1
Analys
Vi kommer att granska standardkonfigurationen av kÀrnan samt egenskaperna hos paketen som finns tillgÀngliga genom paketförvaltaren för varje distribution frÄn början. DÀrmed beaktar vi endast paket frÄn standardservrarna för varje distribution, och ignorerar paket frÄn instabila repon (t.ex. 'testing' servrar i Debian) och tredjepartspaket (t.ex. Nvidia-paket frÄn standardservrar). Dessutom tar vi inte hÀnsyn till anvÀndarkompilerade kÀrnor eller konfigurationer med ökad sÀkerhet.
Analys av kÀrnkonfiguration
Vi har tillÀmpat en analyskript baserat pÄ . Vi granskar skyddskonfigurationerna som finns frÄn början i de nÀmnda distributionerna och jÀmför dem med listan frÄn (KSPP). För varje konfigurationsparameter beskriver Tabell 2 önskad instÀllning: ett kryss finns för distributioner som uppfyller KSSP:s rekommendationer (förklaringar till termerna se. ; i framtida artiklar kommer vi att berÀtta hur mÄnga av dessa skyddsmetoder uppstod och hur man kan hacka systemet i deras frÄnvaro).

Ăverlag har nya kĂ€rnor striktare instĂ€llningar frĂ„n början. Till exempel har CentOS 6.10 och RHEL 6.10 med kĂ€rnan 2.6.32 de flesta kritiska funktioner som implementerats i nya kĂ€rnor, sĂ„som , strikta RWX-behörigheter, slumpmĂ€ssig adressering eller skydd copy2usr. Det bör noteras att mĂ„nga av konfigurationsalternativen i tabellen saknas i Ă€ldre versioner av kĂ€rnan och inte Ă€r tillĂ€mpliga i praktiken â i tabellen anges detta fortfarande som en brist pĂ„ adekvat skydd. PĂ„ liknande sĂ€tt, om en konfigurationsparameter saknas i denna version, och för sĂ€kerheten mĂ„ste denna parameter inaktiveras, anses detta vara en rimlig konfiguration.
Ytterligare en punkt vid tolkning av resultaten: vissa kÀrnkonfigurationer som ökar attackytan kan samtidigt anvÀndas för sÀkerhet. SÄdana exempel inkluderar uprobes och kprobes, kÀrnmoduler samt BPF/eBPF. VÄr rekommendation Àr att anvÀnda ovan nÀmnda mekanismer för att sÀkerstÀlla verkligt skydd, eftersom de Àr svÄra att anvÀnda och utnyttjandet förutsÀtter att skadliga aktörer redan har fÄtt fÀste i systemet. Men om dessa alternativ Àr aktiverade bör systemadministratören aktivt övervaka missbruk.
NÀr vi undersöker tabell 2 nÀrmare ser vi att moderna kÀrnor erbjuder flera alternativ för att skydda sig mot utnyttjande av sÄrbarheter som informationslÀckage och stack-/heapöversvÀmning. Men vi noterar att Àven de senaste populÀra distributionerna Ànnu inte har implementerat mer avancerat skydd (till exempel med patchar ) eller modern skydd mot ÄteranvÀndningsattacker (till exempel, ). Vad som Àr Ànnu vÀrre Àr att Àven dessa mer avancerade skydd inte skyddar mot hela spektrumet av attacker. DÀrför Àr det oerhört viktigt för systemadministratörer att komplettera rimliga konfigurationer med lösningar som erbjuder upptÀckning och förebyggande av exploateringar under körning.
Applikationsanalys
Det Àr inte förvÄnande att olika distributioner har olika paketegenskaper, kompileringsalternativ, bibliotekberoenden och sÄ vidare. Skillnader finns Àven för distributioner och paket med fÄ beroenden (till exempel coreutils i Ubuntu eller Debian). För att utvÀrdera skillnaderna laddade vi ner alla tillgÀngliga paket, extraherade deras innehÄll och analyserade binÀrfiler och beroenden. För varje paket spÄrade vi andra paket som det Àr beroende av, och för varje binÀrfil spÄrade vi dess beroenden. I detta avsnitt sammanfattar vi vÄra slutsatser.
Distributioner
Totalt har vi laddat ner 361 556 paket för alla distributioner, med endast paket hÀmtade frÄn standardservrar. Vi ignorerade paket utan ELF-exekverbara filer, sÄsom kÀllkoder, typsnitt, etc. Efter filtrering Äterstod 129 569 paket som innehöll totalt 584 457 binÀra filer. Fördelningen av paket och filer per distribution visas i figur 3.

Fig. 3
Det kan mÀrkas att ju modernare distributionen Àr, desto fler paket och binÀra filer innehÄller den, vilket Àr logiskt. Paketen frÄn Ubuntu och Debian innehÄller mycket fler binÀra filer (bÄde exekverbara och dynamiska moduler och bibliotek) Àn CentOS, SUSE och RHEL, vilket potentiellt pÄverkar angreppsyta för Ubuntu och Debian (det bör noteras att siffrorna speglar alla binÀrer frÄn alla versioner av paketet, dvs vissa filer analyseras flera gÄnger). Detta Àr sÀrskilt viktigt med tanke pÄ beroenden mellan paket. En sÄrbarhet i en binÀr av ett paket kan pÄverka mÄnga delar av ekosystemet, precis som en sÄrbarhet i ett bibliotek kan pÄverka alla binÀra filer som importerar det. Som referens ser vi pÄ fördelningen av antalet beroenden per paket i olika operativsystem:
Fig. 4
I nÀstan alla distributioner har 60% av paketen minst 10 beroenden. Dessutom har vissa paket betydligt fler beroenden (över 100). Detsamma gÀller för omvÀnda beroenden av paket: som förvÀntat anvÀnds flera paket av mÄnga andra paket i distributionen, sÄ sÄrbarheter i dessa fÄ utvalda har en hög risk. Som exempel listas i nÀsta tabell 20 paket med flest omvÀnda beroenden i SLES, Centos 7, Debian 9 och Ubuntu 18.04 (i varje cell anges paketet och antalet omvÀnda beroenden).

Tabell 3
Intressant nog. Ăven om alla analyserade operativsystem Ă€r byggda för arkitekturen x86_64, och de flesta paket har arkitekturen definierad som x86_64 och x86, innehĂ„ller paket ofta binĂ€ra filer för andra arkitekturer, som visas i figur 5.

Fig. 5
I nÀsta avsnitt dyker vi djupare in i egenskaperna hos de analyserade binÀrerna.
Statistik över skydd av binÀra filer
Som ett absolut minimum bör du studera en grundlÀggande uppsÀttning skyddsalternativ för de binÀra filer som finns. Flera Linux-distributioner levereras med skript som utför sÄdana kontroller. Till exempel finns det ett sÄdant skript i Debian/Ubuntu. HÀr Àr ett exempel pÄ dess arbete:
$ hardening-check $(which docker)
/usr/bin/docker:
Position Independent Executable: ja
Stack protected: ja
Fortify Source functions: nej, endast oskyddade funktioner hittades!
Read-only relocations: ja
Immediate binding: jaSkriptet kontrollerar fem :
- Position Independent Executable (PIE): anger om textavsnittet i programmet kan flyttas i minnet för att Ästadkomma randomisering, om ASLR Àr aktiverat i kÀrnan.
- Stack Protected: Àr stackkanarier aktiverade för att skydda mot stackkollisioner.
- Fortify Source: ersÀtts osÀkra funktioner (t.ex. strcpy) med deras sÀkrare motsvarigheter, medan de som kontrolleras i realtid anropas med sina oskyddade motsvarigheter (t.ex. memcpy istÀllet för __memcpy_chk).
- Read-only relocations (RELRO): Àr posterna i omfördelningstabellen mÀrkta som "endast lÀsning" om de aktiveras innan programmet körs.
- Immediate binding (omedelbar bindning): tillÄter lÀnkaren att hantera alla förflyttningar före programmets start (detta Àr ekvivalent med full RELRO).
Ăr de ovan nĂ€mnda mekanismerna tillrĂ€ckliga? TyvĂ€rr, nej. Det finns kĂ€nda sĂ€tt att kringgĂ„ alla ovan nĂ€mnda skydd, men ju striktare skyddet Ă€r, desto högre blir tröskeln för angriparen. Till exempel, Ă€r svĂ„rare att tillĂ€mpa om PIE och omedelbar bindning Ă€r aktiverade. PĂ„ liknande sĂ€tt krĂ€ver full ASLR mer arbete för att skapa en fungerande exploateringskod. Men avancerade angripare Ă€r redan beredda att bemöta sĂ„dana skydd: deras frĂ„nvaro pĂ„skyndar i princip hackningen. DĂ€rför Ă€r det extremt viktigt att dessa Ă„tgĂ€rder betraktas som nödvĂ€ndiga. minimum.
Vi ville studera hur mÄnga binÀra filer i de granskade distributionerna som Àr skyddade av dessa samt tre ytterligare metoder:
- Icke-exekverbart bit () förhindrar utförande i vilken region som helst som inte ska vara exekverbar, till exempel pÄ stacken och sÄ vidare.
- anger sökvÀgen som anvÀnds av dynamiska laddaren för att hitta motsvarande bibliotek. Den första Àr obligatorisk för vilket modernt system som helst: dess frÄnvaro tillÄter angripare att skriva in nyttolasten i minnet pÄ ett godtyckligt sÀtt och köra den som den Àr. För det andra hjÀlper felaktiga konfigurationer av körvÀgen till att införa osÀker kod, vilket kan leda till en rad problem (till exempel, , samt ).
- Skydd mot stackkollisioner skyddar mot attacker som tvingar stacken att överlappa med andra minnesomrÄden (som heapen). Givet de senaste exploateringarna som utnyttjar , ansÄg vi det lÀmpligt att inkludera denna mekanism i vÄr datamÀngd.
SÄ, utan vidare omsvep, gÄr vi vidare till siffrorna. Tabellerna 4 och 5 innehÄller en sammanstÀllning av analysen av körbara filer och bibliotek för olika distributioner, respektive.
- Som kan noteras, Àr NX-skydd implementerat överallt, med nÄgra fÄ undantag. Speciellt kan man notera en nÄgot lÀgre anvÀndning av detta i distributionerna Ubuntu och Debian jÀmfört med CentOS, RHEL och OpenSUSE.
- Stackcanarier saknas pÄ mÄnga stÀllen, sÀrskilt i distributioner med gamla kÀrnor. Viss framsteg har observerats i de senaste distributionerna av CentOS, RHEL, Debian och Ubuntu.
- Förutom Debian och Ubuntu 18.04, Àr stödet för PIE dÄligt i de flesta distributioner.
- Skydd mot stackkollisioner Àr svagt implementerat i OpenSUSE, CentOS 7 och RHEL 7 och praktiskt taget frÄnvarande i de andra.
- Alla distributioner med moderna kÀrnor har viss support för RELRO, dÀr Ubuntu 18.04 ligger i topp, följt av Debian.
Som nÀmnts tidigare representerar mÀtvÀrdena i denna tabell medelvÀrdet för alla versioner av den binÀra filen. Om man ser pÄ bara de senaste versionerna av filerna, kommer siffrorna att bli annorlunda (till exempel se. ). Dessutom, kontrollerar de flesta distributioner vanligtvis skyddet för endast nÄgra funktioner i den binÀra koden nÀr man rÀknar statistiken, medan vÄr analys visar den sanna procentandelen av förstÀrkta funktioner. SÄ om 5 av 50 funktioner i binÀren Àr skyddade, visar vi det med betyget 0,1 vilket motsvarar 10% förstÀrkta funktioner.

Tabell 4. Skyddskarakteristika för körbara filer, visade i figur 3 (implementeringen av motsvarande funktioner i procent av det totala antalet körbara filer)

Tabell 5. Skyddskarakteristik för biblioteken som visas i figur 3 (implementering av relevanta funktioner i procent av det totala antalet bibliotek)
Finns det framsteg? Definitivt: det Àr tydligt frÄn statistiken för olika distributioner (till exempel, ), samt frÄn de ovanstÄende tabellerna. Som ett exempel visas i figur 6 implementeringen av skyddsmekanismer i tre pÄ varandra följande Ubuntu LTS-distributioner 5 (vi har utelÀmnat statistiken för skydd mot stackkollaps). Vi noterar att fler och fler filer frÄn version till version stöder stackkanariefunktionen, och dessutom levereras allt fler binÀra filer med full RELRO-skydd.
Figur 6
TyvÀrr har en rad körbara filer i olika distributioner fortfarande inga av de ovan nÀmnda skydden. Till exempel, om man tittar pÄ Ubuntu 18.04, kan man se det binÀra programmet ngetty (ersÀttning för getty), samt skal mksh och lksh, tolken picolisp, paketen nvidia-cuda-toolkit (ett populÀrt paket för GPU-accelererade applikationer, som maskininlÀrningsramverk) och klibc-utils. PÄ samma sÀtt levereras det binÀra programmet mandos-client (ett administrativt verktyg som möjliggör automatisk omstart av maskiner med krypterade filsystem), samt rsh-redone-client (Äterimplementering av rsh och rlogin) utan NX-skydd, trots att de har SUID-rÀttigheter :(. Dessutom saknar flera suid-binÀrfiler grundlÀggande skydd, sÄsom stackkanariefunktion (till exempel det binÀra programmet Xorg.wrap frÄn paketet Xorg).
Sammanfattning och avslutande anmÀrkningar
I den hÀr artikeln har vi lyft fram flera sÀkerhetsegenskaper hos moderna Linux-distributioner. Analysen visade att den senaste versionen av Ubuntu LTS (18.04) i genomsnitt har det starkaste skyddet pÄ OS- och applikationsnivÄ bland distributioner med relativt nya kÀrnor, sÄsom Ubuntu 14.04, 12.04 och Debian 9. De granskade distributionerna CentOS, RHEL och OpenSUSE har emellertid i vÄr datamÀngd gynnsammare paketinstallationer som standard, och i de senaste versionerna (CentOS och RHEL) har de en högre procentandel av skydd mot stack-kollisioner jÀmfört med Debian-baserade konkurrenter (Debian och Ubuntu). NÀr vi jÀmför versioner av CentOS och RedHat mÀrker vi stora förbÀttringar i implementeringen av stack-canaries och RELRO mellan version 6 och 7, men i genomsnitt har CentOS fler funktioner implementerade Àn RHEL. Generellt sett bör alla distributioner Àgna sÀrskild uppmÀrksamhet Ät skyddet av PIE, som, med undantag för Debian 9 och Ubuntu 18.04, Àr implementerat i mindre Àn 10 % av de binÀra filerna i vÄr datamÀngd.
Slutligen bör det noteras: Àven om vi genomfört forskningen manuellt finns det mÄnga sÀkerhetsverktyg (t.ex. , , ), som utför analyser och hjÀlper till att undvika osÀkra konfigurationer. TyvÀrr garanterar Àven starka skydd i rimliga konfigurationer inte frÄnvaro av exploateringar. Det Àr dÀrför vi Àr starkt övertygade om att det Àr livsviktigt att tillhandahÄlla , med fokus pÄ exploateringsmönster och att förebygga dem.
KĂ€lla: habr.com
