Approccio storico alla Progettazione del Software e alla Sicurezza Informatica
Introduzione
Denver, Colorado, 1993: uno dei più grandi e trafficati hub aeroportuali del mondo. Era stato previsto un software per controllare l’intero sistema di smistamento dei bagagli.
Fu una debacle completa, uno dei più gravi fallimenti nella storia dell’ingegneria del software. Un errore nella progettazione architetturale e logica portò l’aeroporto al collasso totale, con conseguenze finanziarie enormi e anni di studi per risolvere il problema.
Possiamo dire che da quel fallimento “nacque una stella”: la comunità internazionale cominciò a interrogarsi su come migliorare la progettazione del software, per ogni tipo di sistema informatico, dal più complesso al più semplice.
L’evoluzione della progettazione software
Dalla nascita di quello che può essere considerato come il primo software della storia, ideato da Ada Lovelace – riconosciuta come la prima programmatrice in assoluto e per questo glorificata nel 1980 chiamando ADA un nuovo linguaggio di programmazione ad alto livello – fino ai sistemi di software non più orientati al puro calcolo numerico ma alla gestione di processi complessi, lo sviluppo software ha subito trasformazioni radicali.
Passare dall’algoritmo per il calcolo dei numeri di Bernouilli alla progettazione di un sistema con innumerevoli funzioni interconnesse, ha richiesto l’introduzione di nuove figure professionali all’interno di un team sempre più vasto, con skill che non comprendevano unicamente la conoscenza di un linguaggio di programmazione, ma anche competenze di coordinamento e di interfacciamento con il cliente per definire le cosiddette “specifiche di business”, necessarie per garantire progetti chiari e privi di ambiguità.
La crisi del software e la nascita dell’Ingegneria del Software
A partire dalla fine degli anni ’60, la crisi del software si intensificò, complicata dall’accelerazione dello sviluppo tecnologico e dalla comparsa di nuovi microprocessori con circuiti integrati che spostavano sempre più i servizi verso l’informatizzazione.
Dall’ENIAC, considerato a tutti gli effetti il primo elaboratore elettronico, si passò a sistemi capaci di eseguire operazioni macchina in un tempo dell’ordine di grandezza di un miliardesimo di secondo, grazie a CPU (Central Processing Unit) sempre più potenti.
La Carnagie Mellon University, tra le più prestigiose università americane sorte nella metà degli anni sessanta, fu la frontiera della transizione da un approccio artigianale a un metodo rigorosamente scientifico. Proprio questa Università pose le basi per l’Ingegneria del Software come disciplina accademica.
L’Ingegneria del Software descrive l’intero ciclo di vita di un prodotto, dall’origine al codice macchina attraverso l’SDLC (Software Delivery Life Cycle), scomponendolo in fasi interdipendenti.
Ogni fase prevede infatti l’esecuzione di una serie di task specifici, i cui output sono a loro volta input per le fasi successive, diventando lo stato del sistema. In ogni fase è essenziale la verifica da parte del project manager, seguita dall’approvazione del committente nella fase di semi-lavorato. Per citare una famosa vignetta che ha fatto epoca tra la comunità degli analisti, tutti questi passaggi sono fondamentali per “non ritrovarsi a realizzare una montagna russa, quando era stato inteso che si voleva un’altalena, ma invece il prodotto doveva essere una ruota”.
La transizione al web e la sicurezza informatica
Da qui, la storia dell’informatica ha compiuto passi da gigante nel campo della ricerca, ma non è stato tutto semplice. Il progresso tecnologico ha portato con sé anche nuove sfide. Quando ARPANET, inizialmente destinata ad ambiti militari, fu adottata dal mondo accademico come sistema di comunicazione per lo scambio di documenti, Internet diventò “la rete” e iniziò a diffondersi rapidamente anche oltre le università.
La crescente interconnessione delle informazioni spostò progressivamente lo sviluppo del software da prodotto stand-alone, da installare su ogni singolo hardware, a servizio su Internet. La gran parte dei sistemi software furono ingegnerizzati come servizi web, pur sapendo che il protocollo TCP/IP, sebbene ampiamente utilizzato, non fosse certo il protocollo migliore per sopportare un ingente carico di traffico dati in apparati multitasking preemptive. Tutto questo per consentire a un vasto pubblico di potere usufruire di funzionalità collegandosi a un unico punto stella.
Le applicazioni software si spostarono progressivamente verso il World Wide Web. Inizialmente l’HTML dominava la scena con la creazione di Home Page statiche, ma con il tempo l’implementazione dei servizi web richiese architetture software più complesse, con moduli lato client, server e database.
Al sorgere del nuovo secolo, la proliferazione dei servizi web si orientò in modo da essere fruibili con nuove tecnologie emergenti dai dispositivi mobili come tablet e smartphone. Il ciclo di vita di un prodotto software subiva un ulteriore aumento della complessità. I linguaggi di programmazione si specializzarono sempre più: alcuni rivolti ai server, altri ai dispositivi mobili (diversificandosi addirittura a seconda del produttore), altri ai client, altri alle basi di dati, altri ai framework e i linguaggi di programmazione di base (basic, Java, ecc.), diventando sempre più meta-linguaggi, sempre più ad alto livello.
La sicurezza informatica diventa essenziale
Tutto fantastico, ma c’è un MA.
Dal momento in cui Internet divenne il canale principale attraverso il quale rendere possibile la fruizione dei servizi e raggiungere una vasta gamma di attività “senza essere visti”, una popolazione crescente cominciò a pensare di traslare su questo ambito anche le proprie attività criminali, adattandole al digitale.
Perché invece di assaltare una banca, con tutti i rischi fisici annessi e connessi, non intercettare le transazioni e impossessarsi illecitamente delle somme di denaro?
Anzi, perché non “impersonificarsi” in altri e condurre attività illecite senza essere scoperti?
Ecco che il malaffare si insinua nella rete, con proliferazione di attività fraudolente, violazione di dati personali, furti di identità spionaggio, traffici illeciti e criminosi.
Per rispondere a queste minacce, si rese necessario lo studio e l’applicazione della Sicurezza informatica nel ciclo di vita del software, con l’obiettivo di realizzare prodotti che non portassero in sé elementi utilizzabili da agenti malevoli. Nella complessità del disegno di un sistema informatico c’è sempre il rischio di tralasciare certi aspetti che poi faciliteranno soggetti interessati a scopi illeciti. Questi aspetti da evitare sono le cosiddette “vulnerabilità intrinseche“.
C’è stato bisogno di un ulteriore passo in avanti da introdurre nel rigore scientifico dell’Ingegneria del Software: l’Information Security.
Già dagli anni ’90, il NIST (National Institute of Standards and Technology) – organizzazione storicamente adibita alla migliore definizione degli standard delle unità di misura delle grandezze fisiche – aveva avviato ricerche in questo settore. Nel 2010 l’allora Presidente degli USA incaricò il NIST di occuparsi in modo più sistematico di Information Security, richiedendo in tempi record di produrre politiche, procedure, linee guida orientate alla Sicurezza informatica da destinare non a uno specifico settore di business, ma a un vasto campo di organizzazioni.
L’approccio innovativo fu quella di ragionare “per framework”, applicando i concetti base della Teoria dei Sistemi per elaborare modelli astratti, lasciando alle organizzazioni la libertà di implementazione per adattarli alle proprie esigenze. Oggi, il NIST rappresenta un punto di riferimento mondiale per ogni tipo di attività inerente l’Information Security.
Ma non è il solo: grazie ad organizzazioni no-profit e private, si è creata una vasta banca dati mondiale sulle statistiche di violazioni compiute, modalità di attacco, tentativi di esfiltrazione dati, pratiche di programmazione pericolose di per la Sicurezza Informatica e metodi per sanare specifiche debolezze con modelli di sicurezza, raccomandazioni, tool rivolti al monitoraggio delle attività su Internet, ecc.
Tuttavia, nonostante i progressi nel campo della Cyber Security e dell’Information Security, rimane fondamentale ricordare che, se l’SDLC non si evolve in S-SDLC (Secure-SDLC), i problemi di sicurezza continueranno a ripetersi e saremo sempre punto e a capo. In particolare, è essenziale prestare la massima attenzione a ogni fase nel ciclo di vita di un prodotto e agli aspetti di sicurezza, anche se ciò comporta tempi di consegna più lunghi. Solo un approccio basato sul pensiero risk-based può fare da barriera per impedire la proliferazione di prodotti software vulnerabili e pericolosi.
Purtroppo, in molti settori non si attribuisce ancora la giusta priorità alle pratiche di sicurezza e all’enforcement di quella che oggi viene presa in prestito dalla meccanica delle strutture per descrivere l’assorbimento agli urti da parte di gravi o al determinarsi di eventi instabili: la resilienza di un sistema informatico.
Nonostante il NIST consideri il self-assessment e i test di sicurezza elementi alla base di ogni framework, la prevenzione, piuttosto che la cura, non è ancora una prassi assodata. Dagli audit di sicurezza condotti dagli esperti per valutare il grado di applicazione delle regole, si evidenziano ancora troppe criticità: spesso si trascura la definizione dei test case di sicurezza, le verifiche vengono eseguite superficialmente, o ci si affida ciecamente a tool di sicurezza automatizzati.
Sebbene oggi siano disponibili numerosi strumenti avanzati, sia per l’analisi del codice sorgente che per la fase post-produzione, la sicurezza non può essere delegata interamente alla tecnologia. È fondamentale il ruolo di esperti capaci di individuare e mitigare i rischi, prevenendo possibili falle nel sistema e garantendo un approccio proattivo alla sicurezza.
DevOps e DevSecOps: la nuova frontiera della sicurezza
Al termine di questo excursus, non possiamo tralasciare quello che può essere considerata una nuova rivoluzione nel campo della progettazione dei sistemi informatici: il DevOps.
Questo approccio, che si configura come una nuova filosofia di progettazione, punta all’automazione dello sviluppo software, risolvendo la conflittualità tra sviluppatori e sistemisti, accelerando i processi di testing e rilascio. Tuttavia, certi errori del passato non devono essere ripetuti e si spera che il termine DevOps venga affiancato sempre più dal DevSecOps, che integra la sicurezza informatica in ogni fase dello sviluppo software. Perché, nonostante l’esigenza di velocità di consegna, anche in una filiera automatizzata possono esistere rischi di implementare prodotti vulnerabili alla nascita.
Un esperto di sicurezza informatica all’interno del team di sviluppo è essenziale: il pensiero risk-based, la prevenzione e i test di sicurezza continui sono la chiave per garantire software resilienti e privi di vulnerabilità, e tutto ciò non ha prezzo.
Articolo a cura del Team Governance, Risk and Compliance
Consulthink S.p.A.
info[@]consulthink.it
Leggi gli altri articoli nella ExperThinkers Room