la madre di tutte le vulnerabilità: memory unsafety.
Buongiorno nexiani, <premessa> molti di voi sanno già di cosa si tratta ma per coloro che non sanno di cosa si tratta mi permetto una brevissima spiegazione del concetto opposto - la memory safety - estrapolata e tradotta da Wikipedia [1] --8<---------------cut here---------------start------------->8--- La memory safety (sicurezza della memoria) è la condizione di essere protetti da svariati errori software e vulnerabilità di sicurezza quando si gestisce l'accesso alla memoria --8<---------------cut here---------------end--------------->8--- Esistono linguaggi di programmazione che sono storicamente memory unsafe, tra questi il C/C++, e ne esistono altri che sono memory safe, tra questi Java, Rust e molti altri. Quando si verificano errori di programmazione nella gestione della memoria in linguaggi memory unsafe, succede che i programmi abortiscono, nel migliore dei casi, oppure espongono il sistema alle vulnerabilità di sicurezza che possono essere usate da un attaccante a proprio vantaggio. Con in linguaggi memory safe questi problemi non si verificano perché hanno meccanismi di individuazione degli errori prima che il programma scriva effettivamente in locazioni della memoria che non deve usare. (Se mi sbaglio mi corrigerete) </premessa> Perdonate la piccola divagazione, torno al punto. Un amico mi segnala questo documento di Google (non trovo a quando è aggiornato): https://www.chromium.org/Home/chromium-security/memory-safety: --8<---------------cut here---------------start------------->8--- The Chromium project finds that around 70% of our serious security bugs are memory safety problems. Our next major project is to prevent such bugs at source. [...] Around 70% of our high severity security bugs are memory unsafety problems (that is, mistakes with C/C++ pointers). Half of those are use-after-free bugs. [...] we are reaching the limits of sandboxing and site isolation. [...] We can no longer derive sufficient innovation from more processes or stronger sandboxes (though such things continue to be necessary). [...] We’re tackling the memory unsafety problem — fixing classes of bugs at scale, rather than merely containing them — by any and all means necessary, including: [...] Using safer languages anywhere applicable --8<---------------cut here---------------end--------------->8--- Poi c'è un grafico che tradurrei così: - minor costo, minor miglioramento: migliorare il codice C++ eliminando gli errori - maggior costo, maggior miglioramento: usare componenti in Rust (un linguaggio memory safe) La memory unsafety è la bestia nera della sicurezza software... da sempre, praticamente da quando si programma; per dare un'idea di quanto pesa, cito https://alexgaynor.net/2019/aug/12/introduction-to-memory-unsafety-for-vps-o...: --8<---------------cut here---------------start------------->8--- A recent study found that 60-70% of vulnerabilities in iOS and macOS are caused by memory unsafety. Microsoft estimates that 70% of all vulnerabilities in their products over the last decade have been caused by memory unsafety. Google estimated that 90% of Android vulnerabilities are memory unsafety. An analysis of 0-days that were discovered being exploited in the wild found that more than 80% of the exploited vulnerabilities were due to memory unsafety. [...] These vulnerabilities are exploited, to the peril of hospitals, human rights dissidents, and health policy experts [...] --8<---------------cut here---------------end--------------->8--- Una classe di software dove i problemi di memory safety sono all'ordine del giorno e un rischio costante per gli utenti sono i browser web, perché sono maledettamente complessi e _soprattutto_ perché interpretano codice Javascript scaricato dalle pagine che si visitiamo (se non glielo si impedisce, con evidenti conseguenze sull'esperienza utente nella navigazione). Non vorrei aprire qui una flamewar sui linguaggi di programmazione, l'argomento è complesso e non può essere discusso efficacemente via email: dico solo che ho studiato ed è da quando ho iniziato a studiare c'è sempre qualcuno che sostiene che con la buona pratica egli è capace di evitare errori di memoria in C/C++ e sono gli altri che non sono capaci di programmare. Riporto qui la **provocazione** di Gaynor (non è il solo ad aver scritto cose analoghe): --8<---------------cut here---------------start------------->8--- Using C and C++ is bad for society, bad for your reputation, and it’s bad for your customers. --8<---------------cut here---------------end--------------->8--- La questione potrebbe essere riassunta così, secondo quanto ho capito fino ad ora: 1. per diversi "componenti" di basso livello (per esempio il kernel) il vantaggio competitivo di C è ancora alto (soprattutto per la quantità di codice già scritto) e forse vale la pena investire molte ore/uomo per eliminare gli errori di gestione della memoria; 2. per i componenti più ad alto livello (applicativi) varrebbe la pena cominciare a investire seriamente sulla riscrittura del software con linguaggi memory safe. Perché lo dico qui? Perché sul software c'è ancora una mole imponente di lavoro da fare e in questa mole buona parte dello spazio è occupata dalla soluzione di questa classe di problemi che *quotidianamente* rendono insicuri i nostri sistemi digitali. Se anche Google valuta che continuare a buttare via ore e ore di sessioni di debugging per risolvere i problemi di memoria costa meno che riscrivere il (o almeno parti del) software in linguaggi memory safe, se la stessa cosa sono costretti a fare in centinaia di aziende grandi e piccole, significa che abbiamo un problema che *forse* il mercato per come è strutturato oggi non riesce a risolvere da solo. Io non lo so qual'è la soluzione, sempre che esista una soluzione applicabile (actionable). Questo dibattito però non deve rimanere "confinato" agli specialisti e TANTOMENO essere declassato a una questione di "gusti" dei programmatori sul linguaggio che preferiscono: anche i non programmatori _devono_ sapere di cosa si tratta e questo dibattito dovrebbe diventare pubblico, dovrebbe diventare **politico**; oltre che di competenze qui si tratta di avere anche adeguate risorse per affrontare questi problemi, che NON SONO dei programmatori, sono di tutti noi, sono _anche_ di sicurezza nazionale. ...però mi rendo conto di essere anche piuttosto ingenuo nello sperare che questo possa diventare un dibattito politico :-D Cordiali saluti. Giovanni. [1] https://en.wikipedia.org/wiki/Memory_safety -- Giovanni Biscuolo
Voliamo alto! :-D Trattare un tema così politicamente importante ma così tecnico su una lista multidisciplinare come questa è una sfida veramente interessante. E' difficile risponderti senza escludere involontariamente coloro che non hanno una esperienza sufficientemente approfondita e variegata di diversi linguaggi di programmazione. On 26/05/2020, Giovanni Biscuolo <giovanni@biscuolo.net> wrote:
Using C and C++ is bad for society, bad for your reputation, and it’s bad for your customers.
Io programmo in C, principalmente per gioco. ;-) E' probabilmente il mio linguaggio di programmazione preferito, sebbene utilizzi la libc di Plan 9 e dunque, secondo lo standard (che definisce anche la libreria standard), non è C. Per quanto ne so, la mia reputazione non ne ha mai risentito. D'altro canto programmo e ho programmato anche in diversi altri linguaggi per mestiere (C#, JavaScript, Haskell, Python, Lisp, Go, PHP...) ed in questi venti anni mi sono convinto che il problema (e la soluzione) non risieda nei linguaggi di programmazione. E' un problema molto più profondo. Alla radice c'è l'arretratezza della nostra disciplina. Ma questa arretratezza affonda in un terreno economico e politico sterile (il capitalismo) che ci impedisce qualsiasi vero progresso. Non è tragicamente ironico?
dico solo che ho studiato ed è da quando ho iniziato a studiare c'è sempre qualcuno che sostiene che con la buona pratica egli è capace di evitare errori di memoria in C/C++ e sono gli altri che non sono capaci di programmare.
C++ è un abominio. :-D Per C questa affermazione è abbastanza vera. Ma non nel senso in cui viene superficialmente interpretata. Il problema è la complessità del software contemporaneo. Il C funziona splendidamente se scrivi programmi piccoli, semplici e ben ordinati. I processi del sistema operativo garantiscono la memory safety. Il C invece NON funziona se vuoi scrivere programmi complicati. E purtroppo, invece, il mercato avvantaggia i sistemi complicati.
Questo dibattito però non deve rimanere "confinato" agli specialisti
Anche perché raramente si interrogano criticamente sulle ragioni storiche e politiche che hanno prodotto gli strumenti concettuali che usano. E guai a dire che l'informatica è politica! Al più accettano un po' di ethics washing... un po' di open washing...
anche i non programmatori _devono_ sapere di cosa si tratta e questo dibattito dovrebbe diventare pubblico, dovrebbe diventare **politico**;
Eh... vero! Ma è come se parlassi di metrica a chi non sa leggere l'alfabeto.
oltre che di competenze qui si tratta di avere anche adeguate risorse per affrontare questi problemi, che NON SONO dei programmatori, sono di tutti noi, sono _anche_ di sicurezza nazionale.
Vero. E' anche una questione di risorse, di investimenti... Ma è anzitutto una questione di VISIONE! Wirth aveva una visione ed Oberon-07 è l'apice della sua ricerca. Thompson e Ritchie avevano una visione. Persino Gates, con BASIC prima e con .NET poi, aveva una visione. Ma ogni visione ha implicazioni politiche profonde che sfuggono completamente persino a moltissimi programmatori! Siamo orbi circondati da ciechi. Come può diventare un tema politico?
...però mi rendo conto di essere anche piuttosto ingenuo nello sperare che questo possa diventare un dibattito politico :-D
Non direi "ingenuo". Direi piuttosto "curioso". ;-) Ma è un tema così straordinariamente enorme (e va ben al di là della memory safety, confronta http://jehanne.io/2018/11/15/simplicity-awakes.html con https://www.phoronix.com/scan.php?page=news_item&px=Linux-READFILE-System-Ca... ) che non saprei proprio come trattarlo. Giacomo
participants (2)
-
Giacomo Tesio -
Giovanni Biscuolo