{"id":29880,"date":"2019-10-31T21:32:27","date_gmt":"2019-10-31T18:32:27","guid":{"rendered":"https:\/\/prohoster.info\/blog\/milliony-binarnikov-spustya-kak-ukreplyalsya-linux\/"},"modified":"2019-10-31T21:32:27","modified_gmt":"2019-10-31T18:32:27","slug":"milliony-binarnikov-spustya-kak-ukreplyalsya-linux","status":"publish","type":"post","link":"https:\/\/prohoster.info\/it\/blog\/milliony-binarnikov-spustya-kak-ukreplyalsya-linux","title":{"rendered":"Milioni di binari dopo. Come Linux si \u00e8 consolidato","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/bf51e5698530d4a6a44ff97f542a2a87.png\" style=\"display:block;margin: 0 auto;\" \/><b>TL;DR<\/b>. In questo articolo esploreremo gli schemi di protezione (hardening schemes) che funzionano di default in cinque popolari distribuzioni Linux. Per ciascuna abbiamo preso la configurazione del kernel predefinita, caricato tutti i pacchetti e analizzato gli schemi di protezione nei file binari incorporati. Vengono considerati i seguenti sistemi: OpenSUSE 12.4, Debian 9, CentOS, RHEL 6.10 e 7, oltre a Ubuntu 14.04, 12.04 e 18.04 LTS. <\/p>\n<p>I risultati confermano che anche gli schemi di base, come le canarini dello stack e il codice indipendente dalla posizione, non sono ancora adottati da tutti. La situazione \u00e8 ancora peggiore per i compilatori quando si tratta di proteggere contro vulnerabilit\u00e0 come lo stack clash, che ha attirato l'attenzione a gennaio dopo la pubblicazione <noindex><a rel=\"nofollow\" href=\"https:\/\/capsule8.com\/blog\/exploiting-systemd-journald-part-1\/\">di informazioni sulle vulnerabilit\u00e0 in systemd.<\/a><\/noindex>. Ma non \u00e8 tutto cos\u00ec disperato. In una parte significativa dei binari sono implementati metodi di protezione di base, e il loro numero cresce ad ogni versione. <\/p>\n<p>La verifica ha mostrato che il numero maggiore di metodi di protezione \u00e8 implementato in Ubuntu 18.04 a livello di sistema operativo e applicazioni, seguito da Debian 9. D'altra parte, anche in OpenSUSE 12.4, CentOS 7 e RHEL 7 sono implementati schemi di protezione di base, mentre la protezione contro lo stack clash \u00e8 applicata in modo pi\u00f9 ampio con un set di pacchetti predefiniti molto pi\u00f9 denso.<br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><\/p>\n<h1>Introduzione<\/h1>\n<p>\nGarantire un'alta qualit\u00e0 del software \u00e8 difficile. Nonostante l'enorme quantit\u00e0 di strumenti avanzati per l'analisi statica del codice e l'analisi dinamica durante l'esecuzione, cos\u00ec come i notevoli progressi nello sviluppo di compilatori e linguaggi di programmazione, il software moderno continua a soffrire di vulnerabilit\u00e0 che vengono costantemente sfruttate dai malintenzionati. La situazione \u00e8 ancora peggiore negli ecosistemi che includono codice obsoleto. In questi casi non solo affrontiamo il problema eterno della ricerca di potenziali errori sfruttabili, ma siamo anche limitati da rigide linee guida di retrocompatibilit\u00e0, che spesso richiedono di mantenere codice limitato, e ancor peggio vulnerabile o buggato.<\/p>\n<p>Qui entrano in gioco i metodi di protezione o di indurimento dei programmi (hardening). Alcuni tipi di errori non possiamo prevenirli, ma possiamo rendere la vita dei malintenzionati pi\u00f9 difficile e risolvere parzialmente il problema, prevenendo o ostacolando. <i>sfruttamento<\/i> queste vulnerabilit\u00e0. Tale protezione \u00e8 utilizzata in tutti i moderni sistemi operativi, ma i metodi possono variare notevolmente in complessit\u00e0, efficacia e prestazioni: dai 'canarini nello stack' (stack canaries) e <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Address_space_layout_randomization\">ASLR<\/a><\/noindex> fino a protezioni complete <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Control-flow_integrity\">CFI<\/a><\/noindex> e <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Return-oriented_programming\">ROP<\/a><\/noindex>. In questo articolo esamineremo quali metodi di protezione vengono applicati nelle distribuzioni Linux pi\u00f9 popolari con configurazioni predefinite e studieremo le propriet\u00e0 dei pacchetti binari distribuiti attraverso i sistemi di gestione dei pacchetti di ciascuna distribuzione.<\/p>\n<h3>CVE e sicurezza<\/h3>\n<p>\nTutti noi abbiamo visto articoli con titoli come 'Le applicazioni pi\u00f9 vulnerabili dell'anno' o 'I sistemi operativi pi\u00f9 vulnerabili'. Di solito, in essi viene fornita statistica sul numero totale di registrazioni di vulnerabilit\u00e0 tipo <noindex><a rel=\"nofollow\" href=\"https:\/\/cve.mitre.org\/\">CVE (Common Vulnerability and Exposures)<\/a><\/noindex>, ottenuta da <noindex><a rel=\"nofollow\" href=\"https:\/\/nvd.nist.gov\/\">National Vulnerability Database (NVD)<\/a><\/noindex> di <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nist.gov\/\">NIST<\/a><\/noindex> e altre fonti. Successivamente, queste applicazioni o sistemi operativi vengono classificati in base al numero di CVE. Sfortunatamente, sebbene le CVE siano molto utili per monitorare i problemi e informare fornitori e utenti, esse dicono poco sulla reale sicurezza del software.<\/p>\n<p>Per esempio, consideriamo il numero totale di CVE nell'ultimo quadriennio per il kernel Linux e per cinque delle distribuzioni server pi\u00f9 popolari, ovvero Ubuntu, Debian, Red Hat Enterprise Linux e OpenSUSE.<\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/16d74634f010e340aedbce441513e3f8.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 1<\/i><\/p>\n<p>Cosa ci dice questo grafico? Un numero maggiore di CVE significa che una distribuzione \u00e8 pi\u00f9 vulnerabile di un'altra? La risposta \u00e8 no. Ad esempio, in questo articolo vedrete che Debian implementa meccanismi di protezione pi\u00f9 severi rispetto, ad esempio, a OpenSUSE o RedHat Linux, eppure ha un numero maggiore di CVE. Tuttavia, ci\u00f2 non implica necessariamente una sicurezza compromessa: anche la presenza di CVE non indica se una vulnerabilit\u00e0 \u00e8 <i>sfruttabile<\/i>. I punteggi di gravit\u00e0 forniscono un'idea di quanto sia <i>probabile<\/i> sfruttare una vulnerabilit\u00e0, ma alla fine l'effettiva sfruttabilit\u00e0 dipende in larga misura dalla protezione presente nei sistemi interessati, nonch\u00e9 dalle risorse e dalle capacit\u00e0 degli aggressori. Inoltre, l'assenza di report CVE non dice nulla su altre <i>vulnerabilit\u00e0 non registrate o sconosciute<\/i> vulnerabilit\u00e0. La differenza nel CVE pu\u00f2 essere spiegata non dalla qualit\u00e0 del software, ma da altri fattori, inclusi le risorse dedicate ai test o la dimensione della base utenti. Nel nostro esempio, un numero maggiore di CVE in Debian potrebbe semplicemente indicare che Debian fornisce pi\u00f9 pacchetti software. <\/p>\n<p>Naturalmente, il sistema CVE fornisce informazioni utili che consentono di creare le protezioni adeguate. Pi\u00f9 comprendiamo le cause dei malfunzionamenti del programma, pi\u00f9 semplice risulta identificare i possibili modi di sfruttamento e sviluppare i meccanismi appropriati. <i>di rilevamento e risposta.<\/i>Nella Fig. 2 sono mostrate le categorie delle vulnerabilit\u00e0 per tutte le distribuzioni negli ultimi quattro anni (<noindex><a rel=\"nofollow\" href=\"https:\/\/www.cvedetails.com\/top-50-products.php\">fonte<\/a><\/noindex>). \u00c8 immediatamente evidente che la maggior parte delle CVE rientrano nelle seguenti categorie: attacchi di negazione del servizio (DoS), esecuzione di codice, overflow, corruzione di memoria, fuga (exfiltrazione) di informazioni ed escalation dei privilegi. Anche se molte CVE sono contabilizzate pi\u00f9 volte in diverse categorie, in generale, gli stessi problemi persistono di anno in anno. Nella parte successiva dell'articolo, valuteremo l'uso di diversi schemi di protezione per prevenire lo sfruttamento delle vulnerabilit\u00e0 indicate.<\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/45948bc64673540cfb3e1774c3247634.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 2<\/i><\/p>\n<h3>Problemi<\/h3>\n<p>\nIn questo articolo intendiamo rispondere alle seguenti domande:<\/p>\n<ul>\n<li>Qual \u00e8 la sicurezza delle diverse distribuzioni Linux? Quali meccanismi di protezione esistono nel kernel e nelle applicazioni dello spazio utente?\n<\/li>\n<li>Come \u00e8 cambiata nel tempo l'adozione dei meccanismi di protezione per le diverse distribuzioni?\n<\/li>\n<li>Quali sono le dipendenze medie dei pacchetti e delle librerie per ciascuna distribuzione?\n<\/li>\n<li>Quali protezioni sono implementate per ciascun binario?<\/li>\n<\/ul>\n<p><\/p>\n<h3>Scelta delle distribuzioni<\/h3>\n<p>\nSi scopre che \u00e8 difficile trovare statistiche accurate sulle installazioni delle distribuzioni, poich\u00e9 nella maggior parte dei casi il numero di download non indica il numero di installazioni reali. Tuttavia, le opzioni Unix costituiscono la maggior parte dei sistemi server (69,2% sui server web, secondo <noindex><a rel=\"nofollow\" href=\"https:\/\/w3techs.com\/technologies\/overview\/operating_system\/all\">statistiche<\/a><\/noindex> W3techs e altre fonti), e la loro quota \u00e8 in costante crescita. Pertanto, per la nostra ricerca ci siamo concentrati su distribuzioni disponibili 'out of the box' sulla piattaforma <noindex><a rel=\"nofollow\" href=\"https:\/\/cloud.google.com\/\">Google Cloud<\/a><\/noindex>. In particolare, abbiamo scelto i seguenti sistemi operativi:<\/p>\n<p>Distribuzione\/versione<br \/>\nIl kernel<br \/>\nBuild<\/p>\n<p>OpenSUSE 12.4<br \/>\n4.12.14-95.3-default<br \/>\n#1 SMP Wed Dec 5 06:00:48 UTC 2018 (63a8d29)<\/p>\n<p>Debian 9 (stretch)<br \/>\n4.9.0-8-amd64<br \/>\n#1 SMP Debian 4.9.130-2 (2018-10-27)<\/p>\n<p>CentOS 6.10<br \/>\n2.6.32-754.10.1.el6.x86_64<br \/>\n#1 SMP Tue Jan 15 17:07:28 UTC 2019<\/p>\n<p>CentOS 7<br \/>\n3.10.0-957.5.1.el7.x86_64<br \/>\n#1 SMP Fri Feb 1 14:54:57 UTC 2019<\/p>\n<p>Red Hat Enterprise Linux Server 6.10 (Santiago)<br \/>\n2.6.32-754.9.1.el6.x86_64<br \/>\n#1 SMP Wed Nov 21 15:08:21 EST 2018<\/p>\n<p>Red Hat Enterprise Linux Server 7.6 (Maipo)<br \/>\n3.10.0-957.1.3.el7.x86_64<br \/>\n#1 SMP Thu Nov 15 17:36:42 UTC 2018<\/p>\n<p>Ubuntu 14.04 (Trusty Tahr)<br \/>\n4.4.0\u2013140-generic<br \/>\n <br \/>\n#166~14.04.1-Ubuntu SMP Sat Nov 17 01:52:43 UTC 20\u2026<\/p>\n<p>Ubuntu 16.04 (Xenial Xerus)<br \/>\n4.15.0\u20131026-gcp<br \/>\n#27~16.04.1-Ubuntu SMP Fri Dec 7 09:59:47 UTC 2018<\/p>\n<p>Ubuntu 18.04 (Bionic Beaver)<br \/>\n4.15.0\u20131026-gcp<br \/>\n#27-Ubuntu SMP Thu Dec 6 18:27:01 UTC 2018<\/p>\n<p><i>Tabella 1<\/i> <\/p>\n<h1>Analisi<\/h1>\n<p>\nEsamineremo la configurazione del kernel predefinita e le propriet\u00e0 dei pacchetti disponibili tramite il gestore di pacchetti di ciascuna distribuzione out-of-the-box. In questo modo, consideriamo solo i pacchetti dagli specchi predefiniti di ciascuna distribuzione, ignorando i pacchetti dai repository instabili (ad esempio, gli specchi 'testing' in Debian) e i pacchetti di terze parti (ad esempio, i pacchetti Nvidia dagli specchi standard). Inoltre, non consideriamo le compilazioni del kernel personalizzate o le configurazioni con una maggiore protezione.<\/p>\n<h3>Analisi della configurazione del kernel<\/h3>\n<p>\nAbbiamo applicato uno script di analisi basato su <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/a13xp0p0v\/kconfig-hardened-check\">un verificatore kconfig open source<\/a><\/noindex>. Consideriamo i parametri di protezione predefiniti nelle distribuzioni nominate e li confrontiamo con l'elenco di <noindex><a rel=\"nofollow\" href=\"http:\/\/kernsec.org\/wiki\/index.php\/Kernel_Self_Protection_Project\/Recommended_Settings\">Kernel Self-Protection Project<\/a><\/noindex> (KSPP). Per ciascun parametro di configurazione, la tabella 2 descrive la configurazione desiderata: un segno di spunta indica le distribuzioni che soddisfano le raccomandazioni KSSP (il chiarimento dei termini \u00e8 disponibile <noindex><a rel=\"nofollow\" href=\"https:\/\/capsule8.com\/blog\/kernel-configuration-glossary\/\">qui<\/a><\/noindex>; in articoli futuri parleremo di come sono nati molti di questi metodi di protezione e di come compromettere il sistema in loro assenza).<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/dx\/oh\/o0\/dxoho0z-lifjcybajszqb-aiirq.png\"><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/b1a42826f4afc78a2b25d158100b2ba4.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/2177579e65e4fe6bb320903756a04b9b.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nIn generale, i nuovi kernel hanno impostazioni pi\u00f9 rigorose di serie. Ad esempio, CentOS 6.10 e RHEL 6.10 sul kernel 2.6.32 non hanno la maggior parte delle funzionalit\u00e0 critiche implementate nei nuovi kernel, come <noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Supervisor_Mode_Access_Prevention\">SMAP<\/a><\/noindex>, autorizzazioni RWX rigorose, randomizzazione degli indirizzi o protezione copy2usr. \u00c8 importante notare che molte delle opzioni di configurazione nella tabella sono assenti nelle versioni pi\u00f9 vecchie del kernel e non sono applicabili nella realt\u00e0 \u2014 in tabella ci\u00f2 \u00e8 comunque indicato come mancanza di protezione adeguata. Allo stesso modo, se un parametro di configurazione \u00e8 assente in questa versione e per motivi di sicurezza questo parametro deve essere disabilitato, questa \u00e8 considerata una configurazione ragionevole. <\/p>\n<p>Un altro aspetto da considerare nell'interpretazione dei risultati \u00e8 che alcune configurazioni del kernel che aumentano la superficie di attacco possono essere utilizzate anche per la sicurezza. Esempi di ci\u00f2 includono uprobes e kprobes, moduli del kernel e BPF\/eBPF. La nostra raccomandazione \u00e8 di utilizzare i meccanismi sopra citati per garantire una protezione reale, dato che non sono di immediata utilizzazione e la loro sfruttamento implica che i soggetti malevoli siano gi\u00e0 radicati nel sistema. Ma se queste opzioni sono abilitate, l'amministratore di sistema deve monitorare attivamente gli abusi.<\/p>\n<p>Analizzando ulteriormente le registrazioni della tabella 2, notiamo che i kernel moderni offrono diverse opzioni per proteggere da vulnerabilit\u00e0 come la perdita di informazioni e l'overflow dello stack\/heap. Tuttavia, notiamo che anche le distribuzioni pi\u00f9 recenti e popolari non hanno ancora implementato protezioni pi\u00f9 complesse (ad esempio, con patch <noindex><a rel=\"nofollow\" href=\"https:\/\/grsecurity.net\/\">grsecurity<\/a><\/noindex>) o protezioni moderne contro attacchi di riutilizzo del codice (ad esempio, <noindex><a rel=\"nofollow\" href=\"http:\/\/www.cs.columbia.edu\/~theofilos\/files\/slides\/krx.pdf\">una combinazione di randomizzazione con schemi di tipo R^X per il codice<\/a><\/noindex>). Ci\u00f2 che \u00e8 ancora pi\u00f9 preoccupante \u00e8 che anche questi strumenti di protezione pi\u00f9 avanzati non difendono da un'ampia gamma di attacchi. \u00c8 quindi fondamentale per gli amministratori di sistema integrare configurazioni ragionevoli con soluzioni che offrono rilevamento e prevenzione degli exploit in tempo reale.<\/p>\n<h3>Analisi delle applicazioni<\/h3>\n<p>\nNon sorprende che le diverse distribuzioni presentino caratteristiche differenti nei pacchetti, opzioni di compilazione, dipendenze delle librerie, ecc. Le differenze esistono anche per <noindex><a rel=\"nofollow\" href=\"https:\/\/upload.wikimedia.org\/wikipedia\/commons\/1\/1b\/Linux_Distribution_Timeline.svg\">distribuzioni<\/a><\/noindex> affini e pacchetti con poche dipendenze (ad esempio, coreutils in Ubuntu o Debian). Per valutare le differenze, abbiamo scaricato tutti i pacchetti disponibili, estratto il loro contenuto e analizzato i file binari e le dipendenze. Per ogni pacchetto abbiamo tracciato altri pacchetti dai quali dipende e per ogni binario abbiamo tracciato le sue dipendenze. In questa sezione presenteremo brevemente le conclusioni.<\/p>\n<h4>Distribuzioni<\/h4>\n<p>\nIn totale, abbiamo caricato 361.556 pacchetti per tutte le distribuzioni, estraendo solo pacchetti dai mirror predefiniti. Abbiamo ignorato i pacchetti privi di file eseguibili ELF, come il codice sorgente, i font, ecc. Dopo il filtraggio, sono rimasti 129.569 pacchetti, contenenti in totale 584.457 file binari. La distribuzione dei pacchetti e dei file tra le distribuzioni \u00e8 mostrata nella fig. 3.<\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/a24975fba7413ac8069c07412e5476cc.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 3<\/i><\/p>\n<p>Si pu\u00f2 notare che pi\u00f9 moderna \u00e8 la distribuzione, maggiore \u00e8 il numero di pacchetti e file binari, il che \u00e8 logico. Tuttavia, i pacchetti di Ubuntu e Debian includono molti pi\u00f9 file binari (sia eseguibili che moduli dinamici e librerie) rispetto a CentOS, SUSE e RHEL, il che potrebbe influenzare la superficie di attacco di Ubuntu e Debian (\u00e8 importante notare che i numeri riflettono tutti i binari di tutte le versioni del pacchetto, ovvero alcuni file vengono analizzati pi\u00f9 volte). Questo \u00e8 particolarmente significativo se si considerano le dipendenze tra i pacchetti. Pertanto, una vulnerabilit\u00e0 in un binario di un pacchetto pu\u00f2 influire su molte parti dell'ecosistema, proprio come una libreria vulnerabile pu\u00f2 influenzare tutti i file binari che la importano. Come punto di riferimento, esaminiamo la distribuzione del numero di dipendenze per pacchetto nei vari sistemi operativi:<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/ii\/e3\/e5\/iie3e5-ei26ezg5yvcyvtzqzl80.png\"><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/c6570e643d92103c87659e61f5d395a6.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>Figura 4<\/i> <\/p>\n<p>Quasi in tutte le distribuzioni, il 60% dei pacchetti ha almeno 10 dipendenze. Inoltre, alcuni pacchetti hanno un numero di dipendenze significativamente maggiore (oltre 100). Lo stesso vale per le dipendenze inverse dei pacchetti: come previsto, diversi pacchetti sono utilizzati da molti altri pacchetti nella distribuzione, quindi le vulnerabilit\u00e0 in questi pochi selezionati comportano un alto rischio. Ad esempio, nella seguente tabella sono elencati 20 pacchetti con il massimo numero di dipendenze inverse in SLES, CentOS 7, Debian 9 e Ubuntu 18.04 (in ogni cella \u00e8 indicato il pacchetto e il numero di dipendenze inverse).<\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/0aa544db8be1af7bffe21b6314537e18.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Tabella 3<\/i><\/p>\n<p>Fatto interessante. Sebbene tutti i sistemi operativi analizzati siano costruiti per l'architettura x86_64, e la maggior parte dei pacchetti abbia l'architettura definita come x86_64 e x86, i pacchetti spesso contengono file binari per altre architetture, come mostrato nella fig. 5.<\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/b40f607e0c2f169bd1df21bd9994de8c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Fig. 5<\/i><\/p>\n<p>Nel prossimo capitolo approfondiremo le caratteristiche dei binari analizzati.<\/p>\n<h4>Statistiche sulla protezione dei file binari<\/h4>\n<p>\nCome minimo, \u00e8 necessario studiare un insieme di opzioni di protezione di base per i file binari esistenti. Alcuni distributivi Linux vengono forniti con script che eseguono tali verifiche. Ad esempio, in Debian\/Ubuntu esiste uno script di questo tipo. Ecco un esempio del suo funzionamento:<\/p>\n<pre><code class=\"bash\">$ hardening-check $(which docker)\n\/usr\/bin\/docker:\n Eseguibile indipendente dalla posizione: s\u00ec\n Stack protetto: s\u00ec\n Funzioni di fonte fortificate: no, trovate solo funzioni non protette!\n Ridenominazioni di sola lettura: s\u00ec\n Legame immediato: s\u00ec<\/code><\/pre>\n<p>\nLo script controlla cinque <noindex><a rel=\"nofollow\" href=\"http:\/\/manpages.ubuntu.com\/manpages\/trusty\/man1\/hardening-check.1.html\">funzioni di protezione<\/a><\/noindex>:<\/p>\n<ul>\n<li>Eseguibile indipendente dalla posizione (PIE): indica se \u00e8 possibile spostare in memoria la sezione di codice del programma per ottenere la randomizzazione, se l'ASLR \u00e8 abilitato nel kernel.\n<\/li>\n<li>Stack protetto: sono attivate le canarie dello stack per proteggersi dagli attacchi di collisione dello stack.\n<\/li>\n<li>Fortify Source: le funzioni non sicure (ad esempio, strcpy) vengono sostituite con i loro equivalenti pi\u00f9 sicuri, e le chiamate verificate in fase di esecuzione vengono sostituite con le loro versioni non verificate (ad esempio, memcpy invece di __memcpy_chk).\n<\/li>\n<li>Ridenominazioni di sola lettura (RELRO): le voci della tabella delle ridenominazioni sono contrassegnate come \"sola lettura\", se sono state attivate prima dell'inizio dell'esecuzione.\n<\/li>\n<li>Legame immediato: consente all'editor di collegamenti di risolvere tutte le ridenominazioni prima dell'inizio dell'esecuzione del programma (equivalente a un RELRO completo).<\/li>\n<\/ul>\n<p>\nBastano i meccanismi sopra elencati? Purtroppo no. Sono noti metodi per eludere tutte le protezioni sopra menzionate, ma pi\u00f9 rigida \u00e8 la protezione, maggiore \u00e8 la soglia per l'attaccante. Ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.usenix.org\/system\/files\/conference\/usenixsecurity15\/sec15-paper-di-frederico.pdf\">i metodi per eludere RELRO<\/a><\/noindex> sono pi\u00f9 difficili da applicare se sono attivi PIE e legame immediato. Allo stesso modo, un ASLR completo richiede un lavoro supplementare per creare un exploit funzionante. Tuttavia, gli aggressori sofisticati sono gi\u00e0 pronti ad affrontare tali protezioni: la loro assenza accelera essenzialmente l'hacking. \u00c8 quindi estremamente importante che queste misure siano considerate necessarie. <i>almeno<\/i>. <\/p>\n<p>Volevamo studiare quante applicazioni binarie nei distributivi esaminati sono protette da queste e altre tre metodologie:<\/p>\n<ul>\n<li>Il bit non eseguibile (<noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Executable_space_protection\">NX<\/a><\/noindex>) impedisce l'esecuzione in qualsiasi zona che non dovrebbe essere eseguibile, ad esempio nell'heap dello stack, ecc.<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/en.wikipedia.org\/wiki\/Rpath\">RPATH\/RUNPATH<\/a><\/noindex> indica il percorso di esecuzione utilizzato dal caricatore dinamico per trovare le librerie appropriate. Il primo \u00e8 <i>obbligatorio<\/i> per qualsiasi sistema moderno: la sua assenza consente agli aggressori di scrivere arbitrariamente il payload nella memoria ed eseguirlo cos\u00ec com'\u00e8. Per il secondo, configurazioni errate del percorso di esecuzione aiutano a introdurre codice inaffidabile, che pu\u00f2 portare a una serie di problemi (ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nth-dimension.org.uk\/pub\/BTL.pdf\">elevazione di privilegi<\/a><\/noindex>, e inoltre <noindex><a rel=\"nofollow\" href=\"https:\/\/wiki.debian.org\/RpathIssue\">altri problemi<\/a><\/noindex>).<\/li>\n<li>La protezione contro le collisioni dello stack offre protezione contro attacchi che costringono lo stack a sovrapporsi ad altre aree di memoria (ad esempio, all'heap). Considerando gli exploit recenti che abusano <noindex><a rel=\"nofollow\" href=\"https:\/\/capsule8.com\/blog\/exploiting-systemd-journald-part-1\/\">vulnerabilit\u00e0 di collisione dell'heap in systemd<\/a><\/noindex>, abbiamo ritenuto opportuno includere questo meccanismo nel nostro set di dati.<\/li>\n<\/ul>\n<p>\nQuindi, senza ulteriori indugi, passiamo ai numeri. Le tabelle 4 e 5 contengono un riepilogo dell'analisi dei file eseguibili e delle librerie di diverse distribuzioni, rispettivamente.<\/p>\n<ul>\n<li>Come si pu\u00f2 notare, la protezione NX \u00e8 implementata ovunque, con poche eccezioni. In particolare, si pu\u00f2 notare un utilizzo leggermente pi\u00f9 basso nelle distribuzioni Ubuntu e Debian rispetto a CentOS, RHEL e OpenSUSE.\n<\/li>\n<li>Le canarini dello stack mancano in molti luoghi, specialmente nelle distribuzioni con kernel obsoleti. Alcuni progressi si osservano nelle ultime distribuzioni di CentOS, RHEL, Debian e Ubuntu.\n<\/li>\n<li>Ad eccezione di Debian e Ubuntu 18.04, nella maggior parte delle distribuzioni c'\u00e8 un cattivo supporto per PIE.\n<\/li>\n<li>La protezione delle collisioni dello stack \u00e8 debolmente implementata in OpenSUSE, CentOS 7 e RHEL 7 e praticamente assente nelle altre.\n<\/li>\n<li>Tutte le distribuzioni con kernel moderni hanno un certo supporto per RELRO, con Ubuntu 18.04 in testa e Debian al secondo posto.<\/li>\n<\/ul>\n<p>\nCome gi\u00e0 accennato, le metriche in questa tabella sono medie su tutte le versioni del file binario. Se si considerano solo le ultime versioni dei file, le cifre saranno diverse (ad esempio, vedi <noindex><a rel=\"nofollow\" href=\"http:\/\/outflux.net\/debian\/hardening\/\">i progressi di Debian con l'implementazione di PIE<\/a><\/noindex>). Inoltre, la maggior parte delle distribuzioni di solito calcola le statistiche controllando la protezione solo di alcune funzioni nel codice binario, mentre nella nostra analisi \u00e8 indicato il vero percentuale delle funzioni rinforzate. Pertanto, se in un binario sono protette 5 su 50 funzioni, daremo un punteggio di 0,1, che corrisponde al 10% delle funzioni rinforzate.<\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/82e881c5ba2a3911f3a0ffae1a3475f4.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Tabella 4. Caratteristiche di protezione per i file eseguibili mostrati nella figura 3 (implementazione delle funzioni corrispondenti in percentuale rispetto al numero totale di file eseguibili)<\/i><\/p>\n<p><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/57c8e67be7a57341105262c6e956594c.png\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<i>Tabella 5. Caratteristiche di sicurezza per le librerie mostrate nella fig. 3 (implementazione delle funzioni corrispondenti in percentuale rispetto al numero totale di librerie)<\/i><\/p>\n<p>C'\u00e8 progresso? Certamente c'\u00e8: \u00e8 evidente dalle statistiche relative a singoli distribuzioni (ad esempio, <noindex><a rel=\"nofollow\" href=\"http:\/\/outflux.net\/debian\/hardening\/\">Debian<\/a><\/noindex>), cos\u00ec come dalle tabelle sopra fornite. Come esempio, nella fig. 6 \u00e8 mostrata l'implementazione dei meccanismi di protezione in tre distribuzioni consecutive di Ubuntu LTS 5 (abbiamo omesso le statistiche sulla protezione contro gli overflow del buffer). Notiamo che da una versione all'altra un numero crescente di file supporta le 'canarini dello stack' e sempre pi\u00f9 file binari vengono forniti con protezione RELRO completa.<\/p>\n<p><noindex><a rel=\"nofollow\" href=\"https:\/\/habrastorage.org\/webt\/d1\/ni\/or\/d1niordj1hmiklmg2-w5rsk6dla.png\"><img decoding=\"async\" alt=\"Milioni di binari dopo. Come Linux si \u00e8 consolidato\" src=\"\/wp-content\/uploads\/2019\/03\/9130099db6d59106da8f0a0fc760410e.png\" style=\"display:block;margin: 0 auto;\" \/><\/a><\/noindex><br \/>\n<i>Fig. 6<\/i><\/p>\n<p>Sfortunatamente, diversi file eseguibili in diverse distribuzioni non possiedono ancora alcuna delle protezioni sopra menzionate. Ad esempio, osservando Ubuntu 18.04, possiamo notare il binario ngetty (sostituzione di getty), cos\u00ec come le shell mksh e lksh, l'interprete picolisp, i pacchetti nvidia-cuda-toolkit (un pacchetto popolare per applicazioni accelerate da GPU, come i framework di machine learning) e klibc-utils. Analogamente, il binario mandos-client (uno strumento amministrativo che consente di riavviare automaticamente le macchine con file system crittografati), cos\u00ec come il rsh-redone-client (una rielaborazione di rsh e rlogin) vengono forniti senza protezione NX, nonostante abbiano diritti SUID :(. Inoltre, in diversi binari suid non \u00e8 presente la protezione di base, come le canarini dello stack (ad esempio, il file binario Xorg.wrap dal pacchetto Xorg).<\/p>\n<h1>Riepilogo e osservazioni finali<\/h1>\n<p>\nIn questo articolo abbiamo evidenziato diverse propriet\u00e0 di sicurezza delle moderne distribuzioni Linux. L'analisi ha dimostrato che nell'ultima distribuzione di Ubuntu LTS (18.04) \u00e8 implementata in media la pi\u00f9 forte protezione a livello di OS e applicazioni tra le distribuzioni con kernel relativamente recenti, come Ubuntu 14.04, 12.04 e Debian 9. Tuttavia, le distribuzioni considerate, CentOS, RHEL e OpenSUSE nel nostro dataset, offrono per default un pacchetto pi\u00f9 ricco, e nelle ultime versioni (CentOS e RHEL) hanno una percentuale pi\u00f9 alta di implementazione della protezione contro il collision stacking, rispetto ai concorrenti basati su Debian (Debian e Ubuntu). Confrontando le versioni di CentOS e RedHat, notiamo significativi miglioramenti nell'implementazione delle stack canaries e RELRO da versioni 6 a 7, ma in media CentOS ha implementato pi\u00f9 funzionalit\u00e0 rispetto a RHEL. In generale, tutte le distribuzioni dovrebbero prestare particolare attenzione alla protezione PIE, che, ad eccezione di Debian 9 e Ubuntu 18.04, \u00e8 implementata in meno del 10% dei file binari nel nostro dataset. <\/p>\n<p>Infine, \u00e8 importante notare: anche se abbiamo condotto la ricerca manualmente, esistono molti strumenti di sicurezza (ad esempio, <noindex><a rel=\"nofollow\" href=\"https:\/\/cisofy.com\/lynis\/\">Lynis<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/www.nongnu.org\/tiger\/\">Tiger<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/hubblestack\/hubble\">Hubble<\/a><\/noindex>), che eseguono analisi e aiutano a evitare configurazioni non sicure. Sfortunatamente, anche una forte protezione in configurazioni ragionevoli non garantisce l'assenza di exploit. Ecco perch\u00e9 siamo fermamente convinti che sia fondamentale garantire <noindex><a rel=\"nofollow\" href=\"https:\/\/capsule8.com\/\">monitoraggio affidabile e prevenzione degli attacchi in tempo reale<\/a><\/noindex>, concentrandosi sui modelli di sfruttamento e prevenendoli.<\/p>\n<p>Fonte: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/444418\/\">habr.com<\/a><\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>TL;DR. \u0412 \u044d\u0442\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0435 \u043c\u044b \u0438\u0441\u0441\u043b\u0435\u0434\u0443\u0435\u043c \u0437\u0430\u0449\u0438\u0442\u043d\u044b\u0435 \u0441\u0445\u0435\u043c\u044b (hardening schemes), \u043a\u043e\u0442\u043e\u0440\u044b\u0435 \u0438\u0437 \u043a\u043e\u0440\u043e\u0431\u043a\u0438 \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0432 \u043f\u044f\u0442\u0438 \u043f\u043e\u043f\u0443\u043b\u044f\u0440\u043d\u044b\u0445 \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u0430\u0445 Linux. \u0414\u043b\u044f \u043a\u0430\u0436\u0434\u043e\u0433\u043e \u043c\u044b \u0432\u0437\u044f\u043b\u0438 \u043a\u043e\u043d\u0444\u0438\u0433\u0443\u0440\u0430\u0446\u0438\u044e \u044f\u0434\u0440\u0430 \u043f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e, \u0437\u0430\u0433\u0440\u0443\u0437\u0438\u043b\u0438 \u0432\u0441\u0435 \u043f\u0430\u043a\u0435\u0442\u044b \u0438 \u043f\u0440\u043e\u0430\u043d\u0430\u043b\u0438\u0437\u0438\u0440\u043e\u0432\u0430\u043b\u0438 \u0441\u0445\u0435\u043c\u044b \u0437\u0430\u0449\u0438\u0442\u044b \u0432\u043e \u0432\u043b\u043e\u0436\u0435\u043d\u043d\u044b\u0445 \u0434\u0432\u043e\u0438\u0447\u043d\u044b\u0445 \u0444\u0430\u0439\u043b\u0430\u0445. \u0420\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u044e\u0442\u0441\u044f \u0434\u0438\u0441\u0442\u0440\u0438\u0431\u0443\u0442\u0438\u0432\u044b OpenSUSE 12.4, Debian 9, CentOS, RHEL 6.10 \u0438 7, \u0430 \u0442\u0430\u043a\u0436\u0435 Ubuntu 14.04, 12.04 \u0438 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-29880","post","type-post","status-publish","format-standard","hentry"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.1.1 - aioseo.com -->\n\t<meta name=\"description\" content=\"TL;DR.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/it\/blog\/milliony-binarnikov-spustya-kak-ukreplyalsya-linux\" \/>\n\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.1.1\" \/>\n\t\t<meta property=\"og:locale\" content=\"it_IT\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47\u041c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0441\u043f\u0443\u0441\u0442\u044f. \u041a\u0430\u043a \u0443\u043a\u0440\u0435\u043f\u043b\u044f\u043b\u0441\u044f Linux | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"TL;DR.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/it\/blog\/milliony-binarnikov-spustya-kak-ukreplyalsya-linux\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2019-10-31T18:32:27+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2019-10-31T18:32:27+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Milioni di binari dopo. Come Linux \u00e8 stato rafforzato | ProHoster","description":"TL;DR.","canonical_url":"https:\/\/prohoster.info\/it\/blog\/milliony-binarnikov-spustya-kak-ukreplyalsya-linux","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"it_IT","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47\u041c\u0438\u043b\u043b\u0438\u043e\u043d\u044b \u0431\u0438\u043d\u0430\u0440\u043d\u0438\u043a\u043e\u0432 \u0441\u043f\u0443\u0441\u0442\u044f. \u041a\u0430\u043a \u0443\u043a\u0440\u0435\u043f\u043b\u044f\u043b\u0441\u044f Linux | ProHoster","og:description":"TL;DR.","og:url":"https:\/\/prohoster.info\/it\/blog\/milliony-binarnikov-spustya-kak-ukreplyalsya-linux","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2019-10-31T18:32:27+00:00","article:modified_time":"2019-10-31T18:32:27+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"29880","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"Article","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":"2026-01-20 22:50:20","breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-03-01 03:46:28","updated":"2026-01-20 22:50:20","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/29880","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/comments?post=29880"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/posts\/29880\/revisions"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/media?parent=29880"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/categories?post=29880"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/it\/wp-json\/wp\/v2\/tags?post=29880"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}