I principi del GDPR: liceità, correttezza, trasparenza, finalità, necessità, esattezza, minimizzazione, proporzionalità, precauzione, accountability.
Continuiamo a muovere lungo il GDPR e in particolare dobbiamo analizzare quelli che sono i cosiddetti principi che guidano il GDPR. Cosa vuol dire questo? Vuol dire che sono i principi che il legislatore europeo ha voluto riconoscere, ha voluto utilizzare come guida, l’ispirazione della sua attività normativa che viene poi concretizzata nelle norme del GDPR ma che sono anche i principi che guidano poi l’esercizio di tutte le attività che il GDPR descrive. Quindi, di fronte a qualsiasi dubbio, a qualsiasi equivoco, a qualsiasi necessità di capire se, quando, come sono state rispettate le norme del GDPR, proprio attraverso il ricorso ai principi che ne guidano l’essenza, in qualche modo, la costruzione, possiamo capire se stiamo rispettando o meno le norme. Innanzitutto diciamo che questi principi generali in tema di trattamento si applicano nei confronti di coloro, di quei titolari che svolgono attività commerciali e professionali. Dei primi principi li troviamo nell’articolo 5 del GDPR che ne descrive una sorta di elenco. Un elenco abbastanza lungo che ci fa una serie di riferimenti da cui ricaviamo questi principi. E i primi sono indicati nella lettera a del primo paragrafo dell’articolo 5 che ci dice proprio in apertura che i dati personali devono essere trattati in modo lecito, corretto e trasparente.
Quindi i nostri primi tre principi da cui partiamo sono proprio la liceità, la correttezza e la trasparenza. La liceità è quella che richiede un discorso un po’ più ampio, perché il principio di liceità è ancorato a due requisiti alternativi che riscontriamo nell’articolo successivo, nell’articolo 6. L’articolo 6, infatti ci indica quali sono le cosiddette condizioni di liceità del trattamento. Abbiamo un elenco diviso in lettere, che però possiamo suddividere in due gruppi. Le condizioni fondate sul requisito di necessità, che sono quelle dalla lettera b alla lettera f, e poi la condizione del consenso che è quella della lettera a. Iniziamo quindi da quelle fondate sul principio di necessità del trattamento, quelli appunto dalla lettera b alla lettera f. Sono tutti esempi in cui il trattamento si considera lecito, quindi le condizioni di trattamento sono lecite per diversi motivi tra loro. La prima ipotesi è quella in cui il trattamento è necessario per l’esecuzione di un contratto di cui l’interessato è parte. Quindi noi per eseguire un contratto stipulato con interessati dobbiamo necessariamente eseguire questo trattamento. Quindi noi stipuliamo un contratto però, affinché questo contratto sia eseguito è fondamentale l’attività di trattamento dei dati personali: la necessità di questo trattamento, rispetto all’esecuzione del contratto che abbiamo stipulato, rende il trattamento lecito. Un’altra ipotesi è quella in cui il titolare deve adempiere ad un obbligo legale. Per esempio pensiamo agli obblighi di tenuta della contabilità o rispetto all’emissione delle fatture. Rispetto a questi obblighi un titolare del trattamento si trova di fronte alla necessità di eseguire il trattamento dei dati e quindi automaticamente questo trattamento sarà lecito proprio perché il titolare così come svolge il trattamento, deve al contempo adempiere ad un obbligo legale. Una terza ipotesi è quella della lettera d, che fa riferimento alla salvaguardia degli interessi vitali dell’interessato. Quindi quando è necessario salvaguardare gli interessi vitali, quindi proprio quelli che riguardano la sopravvivenza della persona, allora è lecito quel trattamento perché appunto è necessario per tutelare la sua vita. In questo caso per esempio possiamo pensare all’ipotesi di trattamento dei dati che sono necessari, e sono fatti relativamente recenti, per tenere sotto controllo la diffusione di un’epidemia, oppure nei casi di catastrofi naturali, di emergenze, rispetto alle quali la salvaguardia degli interessi vitali delle persone coinvolte può comportare anche il trattamento. Ancora lettera e, è necessario quando è svolto per l’esecuzione di un interesse pubblico da parte del titolare. E poi l’ultima ipotesi, quella della lettera f, è fondata la liceità sulla necessità del trattamento dei dati quando il trattamento deve essere effettuato per perseguire quello che è un legittimo interesse del titolare. L’importante in questo caso è che il legittimo interesse del titolare non si scontri con i diritti e le libertà fondamentali dell’interessato, soprattutto se l’interessato è un soggetto di minore età. Questa valutazione è particolare, molto particolare questa ipotesi di cui alla lettera f, perché il fatto che il legittimo interesse sia tale, in realtà è una valutazione che spetta al titolare stesso. Quindi è il titolare stesso a individuare l’ipotesi in cui ritiene che il suo legittimo interesse sia tale da giustificare il trattamento. Poi, ovviamente ex-post ci può essere un controllo rispetto alla liceità o meno di questo trattamento, però a monte è il titolare stesso che ritiene il suo legittimo interesse come non preponderante rispetto ai diritti, alla libertà dell’interessato e quindi tale da giustificare il trattamento stesso. Ciò che è importante è che comunque, tra titolare e interessato in questi casi vi sia un tipo di relazione che in qualche modo giustifichi questo trattamento, nel senso che renda questo trattamento attendibile, aspettabile da parte dell’interessato. Pensiamo per esempio a quei rapporti tra clienti e venditori e poi rapporti tra dipendente e datore di lavoro, sono dei rapporti in cui effettivamente l’interessato in questi esempi è il cliente o il lavoratore, si può ragionevolmente aspettare, attendere che il titolare e quindi nell’esempio, il venditore o il datore di lavoro, debba utilizzare quei dati personali e quindi appunto queste ipotesi possono permettere il trattamento perché fungono da condizione di liceità del trattamento stesso. Quindi questi esempi dalla lettera b alla lettera f dell’articolo 6 ci indicano delle ipotesi in cui la condizione di liceità del trattamento è la necessità del trattamento.
L’altra ipotesi, quella della lettera a, è invece la più diffusa perché è il consenso dell’interessato. Quindi l’articolo 6 lettera a ci dice che il trattamento è lecito quando c’è stato il consenso dell’interessato, che sia un consenso espresso per tutte le finalità che il titolare deve perseguire. Il consenso addirittura diventa l’unica fonte di liceità del trattamento quando i dati che vengono trattati sono i dati descritti dall’articolo 9 del GDPR. I dati descritti articolo 9 sono i cosiddetti dati particolari, sono un po’ l’evoluzione di quelli che più diffusamente venivano chiamati come dati sensibili. Il GDPR supera il concetto di dato sensibile, preferendo quello di dato particolare. Dati particolari quindi a questo punto sono in realtà facilmente immaginabili perché sono dati particolari le convinzioni religiose, le opinioni politiche, i dati genetici, i dati che rivelano l’origine etnica di una persona o quelli che ne rivelano l’orientamento sessuale o quelli relativi alla salute o insomma tutta una serie di dati estremamente connessi al nucleo più intimo della identità personale. Diciamo che il consenso e le altre condizioni di liceità fondate sulla necessità sono condizioni che possiamo considerare equipollenti nel senso che sono tutte condizioni di liceità del trattamento, sono infatti dei criteri alternativi: criterio del consenso e criterio della necessità. Ciò che cambia è che mentre quando un soggetto presta direttamente il consenso siamo di fronte ad una situazione in cui abbiamo una persona che opera autonomamente una scelta discrezionale, cioè quando io fornisco il consenso sto valutando tutti quelli che sono gli aspetti in gioco, gli interessi in gioco, faccio io il bilanciamento rispetto a se voglio prestare o meno il consenso perché deve essere un consenso informato, libero, specifico e inequivocabile, quindi la scelta discrezionale è totalmente mia. Invece quando siamo di fronte ai criteri fondati sulla necessità, quindi le condizioni di liceità fondate sulla necessità, lettere da b ad f, qui la valutazione non è discrezionale del singolo interessato perché appunto la necessità del consenso è valutata a monte dal legislatore che reputa quelle situazioni come idonee a rendere il trattamento lecito.
Ciò che comunque conta è che in entrambi i casi, sia quando siamo di fronte alle condizioni di liceità fondate sul consenso, sia alle condizioni di liceità fondate sulla necessità, stiamo comunque parlando di condizioni, nel senso di presupposti della liceità. Però ciò non vuol dire che il trattamento poi sia lecito del tutto, perché la liceità va considerata in una duplice accezione. La prima accezione è questa legata ai presupposti. Quindi tutti questi requisiti stanno ad indicare quelle che sono le condizioni senza le quali non si può nemmeno iniziare il trattamento, sono la conditio sine qua non del trattamento. Se non abbiamo questa queste condizioni proprio a monte il trattamento non potrà essere lecito. Però la liceità va anche considerata in accezione più ampia quindi una liceità cosiddetta a valle: se quindi a monte guardiamo le condizioni, a valle guardiamo in concreto quelle che sono le modalità in cui tutta l’attività viene realizzata e quindi qui entrano in gioco anche gli altri principi. Innanzitutto il principio di correttezza e il principio di trasparenza. I principi di correttezza e di trasparenza, in particolare all’articolo 5 sono posti allo stesso livello della liceità, quindi liceità, correttezza e trasparenza che devono caratterizzare il trattamento. Il principio di correttezza e il principio di trasparenza come si esprimono in concreto? Tipicamente la loro espressione avviene attraverso l’informativa. L’informativa che deve essere somministrata all’interessato in un senso che sia funzionale alla formazione del suo consenso, della sua volontà di procedere al trattamento dei dati, affinché questo consenso sia appunto consapevole, sia libero. E affinché il soggetto interessato sia reso edotto di tutte quelle che sono le caratteristiche di questo trattamento e tutti i diritti che gli sono riconosciuti in virtù di questo trattamento, quindi l’informativa ci dovrà spiegare come si svolge il trattamento, per quanto tempo dura, quali sono le finalità, in più mi deve anche dire quali sono i miei diritti e quindi pensiamo per esemprio al diritto di accesso, al diritto alla cancellazione dei dati. Quindi la logica dell’informativa che appunto esprime l’essenza dei principi di correttezza e trasparenza è una logica di permettere all’interessato di prestare un consenso che sia informato. La trasparenza peraltro è un principio che generalmente riguarda il tema della tutela dei dati personali un po’ da sempre, però soltanto con il GDPR è stato effettivamente esplicitato, quindi il GDPR in ciò scrive proprio, indica, formalizza, positivizza questo principio di trasparenza come principio guida dell’attività coinvolta al trattamento dei dati personali. La trasparenza in particolare riguarda le modalità con cui i dati vengono trattati e quindi con cui vengono raccolti, con cui vengono utilizzati, con cui vengono consultati, conservati. E’ poi un principio in forza del quale si impone al titolare di indicare tutte le informazioni che deve dare all’interessato e di dare ogni tipo di comunicazione rispetto al trattamento, in un modo che sia facilmente accessibile e comprensibile e in un modo che utilizzi un linguaggio chiaro e semplice. Proprio perché l’interessato è un po’ il soggetto debole di questo rapporto, perché è colui che sta fornendo i suoi dati personali, allora deve conoscere tutte le informazioni possibili sul trattamento nel modo più chiaro, semplice, intellegibile possibile.
Infine la trasparenza a livello di informativa la concretizziamo anche nell’obbligo del titolare di rendere nota la sua identità. Quindi quando dò il consenso al trattamento di dati personali devo effettivamente avere indicato chi è il titolare che si occuperà di questo trattamento e tutte quelle che saranno le finalità del trattamento. Diciamo poi che i confini concreti della correttezza e della trasparenza sono molto poco tracciabili, sono molto sovrapposti tra loro. La correttezza possiamo intendere in un senso più legato al comportamento corretto che il titolare deve avere nei confronti dell’interessato. La trasparenza forse ci riesce a descrivere meglio il fatto che c’è necessità di una massima comprensibilità di tutto ciò arriva nel trattamento mentre la correttezza può riguardare di più i comportamenti che in concreto il titolare tiene nei confronti dell’interessato.
Ovviamente tutti questi principi, appunto correttezza, trasparenza e anche liceità devono perdurare per tutto il rapporto, deve perdurare la concretizzazione di questi principi. Quindi proprio un riconoscimento dell’esigenza che tra titolare e interessato ci sia la massima lealtà nel senso che il titolare deve garantire all’interessato di essere munito di tutti gli strumenti necessari a comprendere le modalità del trattamento, ma anche gli effetti che il trattamento può avere su di lui. Quindi leale comportamento del titolare nei confronti dell’interessato si concretizza in tutto ciò che riguarda poi la possibilità dell’interessato di scegliere liberamente il trattamento e poi di controllarlo, così come la lealtà è anche dall’interessato nei confronti del titolare ad esempio nell’esercizio del diritto all’accesso. Il diritto all’accesso deve essere svolto sempre da parte dell’interessato, in un modo che non sia abusivo, altrimenti, appunto, anche qui la lealtà viene meno. Altro principio importantissimo è il principio di finalità. Il trattamento deve essere sempre finalizzato. Il principio di finalità pone un limite intrinseco proprio all’attività del trattamento, perché il trattamento dei dati deve sempre essere effettuato nell’ambito delle finalità che il titolare ha dichiarato di svolgere, di perseguire. E ovviamente non sono finalità che il titolare sa di voler svolgere, ma sono le finalità che nell’informativa ha dichiarato di voler svolgere, proprio perché tra le finalità che il titolare persegue e le finalità che il soggetto interessato conosce, ci deve essere massima corrispondenza. E anche qui ritroviamo la correttezza di prima. Se il titolare modifica le finalità, ne aggiunge delle altre, ne toglie alcune, deve sempre aggiornare l’informativa e renderne edotto il soggetto interessato. Però, appunto, a monte è necessario individuare delle finalità, usiamo quindi una logica preventiva perché fin dall’inizio devono essere indicate le finalità che si vogliono perseguire e attraverso l’indicazione di queste finalità noi andiamo un po’ a costruire un perimetro dell’attività del titolare, un perimetro dell’attività di trattamento. E ovviamente questo perimetro deve essere inequivocabilmente chiaro e definito, non ci deve essere il dubbio di interpretare in che modo la finalità verrà perseguita, non ci deve essere la possibilità che si creino degli equivoci rispetto a quelle che sono le finalità, tant’è che si parla di finalità costruite in un senso addirittura oggettivo, proprio perché devono essere completamente manifeste ed inequivocabili, proprio perché se così non fosse il soggetto interessato non potrebbe svolgere quell’attività di controllo che dicevamo gli viene riconosciuta.
Quindi questa attività continua nel tempo e io conosco le finalità perchè il titolare nell’informativa me le ha comunicate, però se nel tempo viene svolto ad esempio un cosiddetto trattamento secondario, quindi un trattamento ulteriore rispetto a quello che era stato indicato all’inizio e che quindi può perseguire delle finalità ulteriori, allora il titolare deve indicarlo e questo è un onere che il titolare ha sempre perché deve essere sempre corretto e trasparente nei confronti dell’interessato. E la logica è sempre quella di proteggere il più possibile l’interessato, perché a maggior ragione con il progressivo sviluppo delle tecnologie informatiche, rispetto a quando un soggetto magari ha fornito il consenso la prima volta, nel tempo è possibile che il titolare entri a disposizione di strumenti, di modalità attraverso cui può incidere, impattare in modo più forte, magari rispetto a prima sulla sfera individuale del singolo, può perseguire delle finalità in più per il tipo di attività che svolge quindi la tutela che in questo modo il nostro ordinamento, l’ordinamento europeo garantisce al singolo è una tutela di imporre progressivamente al titolare di essere trasparente rispetto alle finalità che vuole perseguire. Ovviamente questo per quanto riguarda l’ipotesi in cui le finalità cambino o nel caso in cui delle prime finalità se ne aggiungano delle altre. Nell’ipotesi in cui invece le finalità non sono nuove, né cambiano, ma la finalità per cui l’interessato aveva inizialmente prestato il consenso non è più attuale quindi per esempio l’ipotesi in cui la lo scopo per cui venivano trattati i dati viene conseguito, allora in quel caso il trattamento che avviene dopo il conseguimento dello scopo che era stato dichiarato a quel punto diventa illecito: perché qui non stiamo parlando di un trattamento che si aggiunge, di finalità che si aggiungono e che vanno a completare quello inizialmente ammesso. Se siamo nell’ipotesi in cui lo scopo che era stato dichiarato è terminato, allora questo trattamento dei dati non può più continuare per finalità che vengono introdotte successivamente. Proprio perché non c’è più la condizione per il trattamento di quegli stessi dati, quel titolare non può riutilizzare i dati perché la finalità è conseguita, lo scopo è conseguito. Ovviamente alla conclusione, al raggiungimento dello scopo del trattamento, possiamo considerare equiparabili anche, ad esempio, una sopravvenuta carenza dell’interesse alla protrazione del trattamento o anche una qualsiasi insorgenza di una causa che renda addirittura illegittima la prosecuzione del trattamento.
Ovviamente a fronte di questi obblighi che sono posti a carico del titolare e quindi di rispettare le finalità del trattamento corrispondono i diritti e in questo caso è immaginabile il diritto alla cancellazione. Se per esempio valuto che il trattamento si sta perseguendo oltre le finalità indicate posso chiedere la cancellazione dei miei dati perché ricordiamoci sempre che se c’è un obbligo in capo ad una persona, proprio dal punto di vista di schema della norma, se si pone un obbligo a carico di uno, abbiamo sempre un diritto posto a carico dell’altro soggetto che ad esso si interfaccia. Quindi così come abbiamo l’obbligo delle finalità, abbiamo il diritto dell’interessato a chiedere la cancellazione.
In relazione a queste finalità, l’articolo 5, lettera b dice che le finalità oltre ad essere espresse devono essere legittime e questa legittimità andrà parametrata in funzione dello svolgimento di finalità che possano essere considerati apprezzabili da parte dell’ordinamento, dunque delle finalità dal contenuto positivo rispetto a quanto l’ordinamento naturalmente permette. Nella successiva lettera c ricaviamo il principio di necessità. La lettera c dice che è necessario che i dati abbiano un nesso di pertinenza e di adeguatezza rispetto alle finalità, cioè i dati che il trattamento utilizza, i dati che il titolare tratta sono dati che devono essere pertinenti e adeguati rispetto alle finalità. Quindi il principio di necessità è in senso ampio il principio per cui i dati trattati devono essere necessari per lo svolgimento del trattamento. In questo senso il principio di necessità ci fa intendere che non debbono essere raccolti dati eccedenti rispetto a quelli di cui il titolare ha bisogno. Quindi la logica, la ratio che il legislatore europeo persegue in questa indicazione è che la tutela della persona passa anche dalla riduzione quanto più possibile dei dati che vengono trattati rispetto a quella persona. Tutto ciò che non è necessario non deve essere trattato. In ciò possiamo dire quindi che la necessità descrive quello che viene definito in modo più dettagliato, in modo più specifico il principio di minimizzazione. Il principio di minimizzazione è proprio il principio in forza del quale i sistemi di trattamento dei dati personali devono ridurre al minimo l’utilizzo dei dati che servono. Quindi se lo stesso obiettivo lo posso raggiungere con meno dati o magari con dati anonimi o con degli pseudonimi o comunque con dei dati che non sono tali da ricondurmi direttamente all’interessato, allora devo farlo, io titolare devo rendere il trattamento il meno impattante possibile rispetto all’utilizzo dei dati che si vanno ad ad utilizzare. Non solo, a questo il principio di minimizzazione si affianca sempre il principio di esattezza. Il principio di esattezza lo ritroviamo sempre in questa lettera c, quando ci viene detto che i dati devono essere esatti. Cosa vuol dire che devono essere esatti? Vuol dire che devono essere sempre adeguati a descrivere, a rappresentare l’identità dell’interessato, quindi ciò vuol dire che devono essere anche aggiornati. Quindi l’esattezza include anche l’aggiornamento. Se dei dati non sono più idonei a descrivere, a rappresentare un certo individuo, allora non sono esatti. E quindi non possono essere più utilizzati proprio perché il titolare deve sempre trattare dati ridotti al minimo ma esatti, quindi perfettamente adeguati a descrivere il soggetto da tutelare. La differenza qual è tra questi due principi di minimizzazione e di esattezza: che la minimizzazione pone un limite all’attività del trattamento, perché dal punto di vista qualitativo e quantitativo pone proprio un limite di contenuto all’attività che il titolare svolge. Invece l’esattezza pone in capo al titolare non un limite, ma un onere e cioè l’onere di assicurarsi che ci sia sempre una fedeltà contenutistica delle informazioni che utilizza, cioè le informazioni che utilizza devono essere fedeli, rispondenti a rappresentare adeguatamente il soggetto. E quindi questo vuol dire non solo che questi devono essere fedeli all’inizio ma che anche nel tempo è necessaria una costante progressiva corrispondenza e quindi eventualmente una modifica, un aggiornamento, un’integrazione rispetto ai dati che ha nella sua disponibilità. Anche qui obbligo del titolare di rispettare l’esattezza dei dati, dall’altro lato diritto dell’interessato a chiedere la modifica, l’integrazione e l’aggiornamento dei suoi dati.
La necessità, oltre ad esprimere minimizzazione e esattezza, esprime anche quello che è stato definito il principio di precauzione. La precauzione è un’altra faccia della necessità laddove si richiede al titolare di valutare ex-ante, quindi a priori, che effettivamente il dato sia pertinente rispetto alla finalità. Ecco questa parola pertinente fonda questo principio di precauzione per cui il titolare ha l’onere, ha l’obbligo di accertarsi, di assicurare che i dati che chiede siano pertinenti rispetto al trattamento. Ancora sempre dentro la necessità si esprime il principio di proporzionalità, sempre legato alla quantità e alla qualità dei dati. Proporzionalità che diviene un canone proprio ermeneutico di tutta la disciplina. Peraltro la proporzionalità non riguarda solo il titolare, nel senso che il titolare è tenuto a ponderare l’utilizzo dei dati affinché questo utilizzo sia proporzionato alle finalità che che vuole perseguire ma addirittura con la proporzionalità andiamo ad individuare un canone ermeneutico che oltre a riguardare il titolare riguarda anche i legislatori nazionali. Ciò vuol dire che tutti i legislatori nazionali nel momento in cui intervengono rispetto alla disciplina dei dati personali per ciò che è oltre il GDPR (perché il GDPR è un regolamento, quindi i legislatori nazionali non lo possono modificare, né lo devono implementare a livello nazionale), però per qualsiasi aspetto che tratti i dati personali da un punto di vista di legislazione interna, quindi nazionale degli Stati membri, i legislatori devono sempre essere guidati da questa stella polare della proporzionalità rispetto all’utilizzo dei dati, perché dobbiamo sempre ricordarci che quando noi normiamo la disciplina dei dati personali dobbiamo sempre bilanciare l’obiettivo di tutela della persona con l’obiettivo di circolazione di dati da incentivare, favorire e promuovere nell’ambito di una economia di mercato che si fonda ormai quasi interamente sul digitale, quindi nell’ottica del funzionamento del mercato.
A chiusura dell’articolo 5 abbiamo la positivizzazione di ulteriori principi che sono in particolare il principio di integrità e di riservatezza e il principio di responsabilizzazione del titolare. Il titolare si deve occupare, deve far sì che i dati vengano posti in una condizione di adeguata sicurezza. Adeguata sicurezza vuol dire che devono essere conservati in un modo tale che consenta l’identificazione del soggetto interessato, per il tempo necessario al perseguimento delle finalità e nell’ambito di questa conservazione devono essere adottate tutte le misure necessarie a che non vi sia un trattamento illecito, una dispersione dei dati, la loro perdita, la loro distruzione, la loro cancellazione accidentale o comunque una qualsiasi forma di data breach, quindi di ingerenza di terzi rispetto ai dati detenuti dal titolare. Quindi quando l’articolo 5 dice che questa sicurezza che il titolare deve garantire deve essere adeguata, il concetto di adeguatezza delle misure di sicurezza adottate è un aspetto che riguarda innanzitutto proprio la pretesa nei confronti del titolare. E in secondo luogo ovviamente proprio la considerazione delle misure tecniche organizzative che il titolare pone in essere. In generale il titolare deve adottare le migliori misure possibili contestualizzate alla sua situazione perché ovviamente implementare delle misure di sicurezza dei dati ha un costo. Quindi anche l’adeguatezza la dobbiamo considerare in base al soggetto che è chiamato a porre in essere queste misure di sicurezza in relazione ai costi, in relazione alle possibilità e anche in relazione allo sviluppo tecnologico perché lo sviluppo tecnologico è a sua volta un parametro di sicurezza: magari determinate misure che oggi sono considerate ottimali per proteggere i dati personali nel tempo diventano meno forti, più accessibili più by-passabili magari da esperti di questo tipo di attività. E poi appunto anche lo sviluppo tecnologico oltre ai costi, alle possibilità, è un parametro per valutare l’adeguatezza delle misure che sono scelte dal titolare del trattamento per proteggere i dati. Ciò che emerge un po’ da queste battute su questa parte finale l’articolo 5 è che il GDPR spinge molto per una responsabilizzazione del titolare, quindi il titolare non può ricevere questi dati, trattarli, poi quello che succede succede. Il titolare risponde proprio di tutte le attività che riguardano i dati quindi non soltanto quelle più strettamente legate ad un utilizzo dei dati ma anche alla loro appunto protezione e in questo senso quindi il titolare viene onerato con un obbligo positivizzato di occuparsi sempre di limitare al minimo i rischi che gli interessati corrono una volta che permettono il trattamento dei loro dati personali. La logica è quella di rendere il titolare soggetto responsabile, nel senso di soggetto proattivo, allo sviluppo di ogni attività che sia idonea a garantire la tutela dei diritti e delle libertà fondamentali delle persone fisiche. Perché se io proteggo i dati personali della persona stò proteggendo ovviamente le sue libertà individuali.
Ecco, quindi, che il titolare è tenuto ad adottare tutte le garanzie indispensabili, a utilizzare, a implementare tutte le misure tecniche e organizzative idonee a assicurare la tutela dei dati delle persone fisiche. E ovviamente nel far ciò si dice che deve predisporre delle misure di tutela tecniche, organizzative, giuridiche. Già dall’utilizzo di questi termini riscontriamo come sia un tipo di contesto in cui effettivamente è necessaria la presenza di diverse figure che si occupano di questa attività di controllo del rischio da parte del titolare, proprio perché serve una visione integrata che tenga conto di tutti gli aspetti che vengono toccati dal trattamento, quindi da quelli più strettamente informatici a quelli di attività svolta dal titolare e magari anche quelle appunto più strettamente legali. Ovviamente questa sicurezza deve essere garantita nel tempo, quindi anche questo principio diventa un principio che permea l’intero rapporto perché deve essere garantita in ogni fase dell’attività di trattamento, quindi da intendersi un principio che si sviluppa in senso dinamico, deve essere ridefinita questa adeguatezza delle misure adottate nel tempo in base a quelle che sono le spese da sostenere e i progressi sotto il punto di vista tecnico. Ciò vuol dire che il titolare è tenuto a monitorare nel tempo, ad un’attività di monitoraggio per accertarsi di aver adottato le misure più adeguate, proporzionate in relazione ai rischi perché i rischi anche sono in continuo mutamento. Ciò che è importante è che esprime ancor di più la responsabilizzazione che viene fatta del titolare e che il titolare deve essere addirittura in grado di dare prova in ogni momento di aver rispettato queste regole. Quindi serve anche una formalizzazione da parte del titolare di tutte le attività che svolge per assicurarsi di aver posto in essere le migliori misure possibili. Perché gli può essere richiesto di dimostrare di aver attuato la disciplina GDPR al 100%. In questo senso il principio di responsabilizzazione rispetto al quale vengono svolte tutte le attività di cui sopra viene in qualche modo riportato nel termine della cosiddetta accountability. Si parla di accountability proprio con il termine inglese perché è qualcosa che va oltre la responsabilità, cioè non solo il titolare è responsabile ma in più è tenuto a questo ruolo, a questa funzione proattiva di tutela che insieme possono essere descritti con questa accountability, proprio perché accountability significa rendere conto. Quindi il titolare rende conto sia dal punto di vista di responsabilità sia dal punto di vista di attività che è chiamato a svolgere, quindi l’accountability proprio come un termine che va a permeare tutte le politiche, le procedure, l’agire del del titolare che deve sempre porre in essere questa attività di controllo di gestione e di prevenzione del rischio nello svolgimento del trattamento.
Gli istituti introdotti dal GDPR
Rispetto all’accountability del titolare emergono, rilevano, due istituti particolari che sono introdotti dal GDPR. Che sono a loro volta l’espressione non solo del principio di responsabilizzazione, dell’accountability del titolare ma anche della minimizzazione che abbiamo visto prima, quindi della necessità. Questi istituti sono due. Il primo è espresso dall’articolo 35 del GDPR ed è la valutazione di impatto. La valutazione di impatto deve essere eseguita, è una valutazione preventiva di impatto, deve essere eseguita ogni volta che il trattamento dei dati personali – di cui bisogna verificare la proporzionalità rispetto alle finalità – presenti dei rischi elevati per i diritti e le libertà delle persone fisiche. Quindi ogni volta che è possibile che ci sia un rischio particolarmente elevato per i diritti e le libertà delle persone fisiche, allora è necessario preventivamente fare questa valutazione di impatto. E se la valutazione di impatto ci dice che effettivamente il rischio che l’interessato corre è particolarmente elevato e le misure adottate dal titolare possono non essere in grado di tutelare l’interessato in modo nel modo opportuno, allora, prima di eseguire il trattamento, il titolare è tenuto a consultare l’Autorità Garante, il Garante per la Protezione dei Dati Personali. Quindi la valutazione di impatto come istituto nuovo introdotto dal GDPR con cui prevenire i rischi che l’interessato può correre in considerazione del trattamento che il titolare vuole svolgere.
Oltre alla valutazione preventiva di impatto, un’altra espressione della dell’accountability è quella che riscontriamo nei metodi cosiddetti di privacy by design e privacy by default, espressi dall’articolo 25 del GDPR. Privacy by design vuol dire protezione fin dalla progettazione, mentre privacy by default vuol dire protezione dei dati per impostazione predefinita. Sono dei metodi di tutela dei dati che il titolare è tenuto ad esercitare nel senso che deve far sì che il trattamento per come è impostato (impostazione predefinita) o per come progettato proprio fin dall’inizio, sia strutturato in un modo tale da impedire o comunque da limitare il più possibile il rischio di un trattamento che non protegga i dati personali. Ovviamente pure qui rientriamo nei principi citati in precedenza. Per esempio facciamo ipotesi di privacy by design, quindi protezione dei dati fin dalla progettazione, come faccio ad assicurarmi di proteggerli al meglio facendo sì che io utilizzi soltanto i dati pertinenti, soltanto i dati necessari, quindi rispettando il principio di minimizzazione, il principio di proporzionalità e principio di necessità al massimo? Sto rispettando la proporzionalità, nel senso che li utilizzo soltanto per il periodo di tempo determinato? Insomma, nel momento in cui sto rispettando tutti questi principi li concretizzo nella progettazione del mio sistema di trattamento e quindi progetto l’attività di trattamento privacy by design, dal design, della progettazione dell’attività di trattamento in modo tale da concretizzare proprio tutti gli obblighi che il GDPR mi pone come titolare. Peraltro, nel momento in cui, nonostante io abbia adottato tutte le misure più adeguate possibili, io titolare mi rendo conto che è avvenuta una violazione dei dati, ho addirittura l’obbligo della cosiddetta data breach notification. Quindi ho l’obbligo di notificare l’avvenuta violazione al Garante e l’obbligo di comunicare l’avvenuta violazione agli interessati. Lo stesso soggetto che tratta i dati rispetto ai quali si è verificata la violazione ha l’obbligo di rendere nota questa notizia sia al Garante così che possa intervenire, sia agli interessati. Peraltro in tutto questo ambito entra in gioco anche un altro soggetto che affianca il titolare che è nominato con l’acronimo di DPO che sarebbe il Data Protection Officer. Questo è un soggetto che tra le varie funzioni che ricopre con riferimento all’implementazione di tutte le regole del GDPR è incaricato in particolare proprio di verificare che il rispetto della normativa privacy sia costante, sia continuo da parte del titolare e infatti è un soggetto che poi si occupa anche di svolgere attività di rapporto, di contatto tra il titolare e l’autorità di controllo e il garante, proprio perché ha questo ruolo di verificare in concreto il rispetto della normativa.
Diritto alla riservatezza, privacy e protezione dei dati personali. Evoluzione normativa in Italia e nell’UE e terminologia di base del GDPR.
Penso che partire dal diritto alla privacy sia fondamentale proprio perché è un po’ il centro, oltre che il punto di partenza appunto di ogni discorso che riguarda la tutela e la protezione dei dati. Innanzitutto dobbiamo dire che cos’è la privacy, il concetto di privacy si è molto evoluto negli anni ed è un concetto in continua evoluzione perché ha seguito, segue e continua a seguire l’evoluzione delle tecnologie e in particolare delle tecnologie informatiche.
Il diritto alla privacy nasce in origine nell’Ottocento negli Stati Uniti, nasce nella sua concezione di diritto alla riservatezza. Quindi noi partiamo da una concezione della privacy che coincide del tutto con la riservatezza. In questo significato originario quindi stiamo andando a tutelare la sfera giuridica soggettiva personale, quella che è l’intimità della vita privata e quindi non tanto ovviamente a livello fisico, di solitudine fisica, di lasciar soli fisicamente, ma anche inteso come di evitare l’intrusione nell’intimità della vita del soggetto e quindi a difesa di quelli che sono i valori di dignità di autonomia dell’individuo rispetto appunto alla sua persona.
Questo diritto muta nel tempo perché di fronte ad una società sempre più digitalizzata, di fronte ad una società sempre più toccata dalle innovazioni del digitale e quindi da tutte le tecnologie informatiche, in qualche modo cambia e da diritto alla riservatezza in questo senso inteso passiamo ad una logica quasi più di diritto di libertà informatica. Diritto di autodeterminazione informatica, diritto di protezione rispetto ai propri dati personali. Ovviamente sempre nella logica dell’utilizzo di questi dati che ci riguardano da parte di terzi.
Perché parliamo della società odierna come società dell’informazione?
Perché è un contesto in cui, soprattutto grazie alle spinte del digitale, l’informazione circola in dei modi completamente nuovi rispetto al passato. Con una velocità, con una capacità di diffusione nettamente più estesa rispetto a quanto poteva avvenire prima dell’avvento delle tecnologie informatiche e quindi richiede un cambio di passo, un cambio di considerazione perché soprattutto attraverso l’utilizzo di internet, chiunque è in grado in qualsiasi momento, in qualsiasi luogo, di accedere a informazioni che quindi devono essere a questo punto adeguatamente tutelate. Perché chiunque può fare accesso, chiunque le può memorizzare, le può utilizzare e conseguentemente le può anche riutilizzare, può combinarle: può combinare le informazioni tra loro. E questo ha una rilevanza rispetto a quello che può emergere da questa combinazione delle informazioni e quindi dei dati personali delle persone, perché ovviamente attraverso la combinazione di diverse informazioni posso avere delle rappresentazioni virtuali delle persone e attraverso queste rappresentazioni virtuali delle persone allora le posso in qualche modo categorizzare, individualizzare rispetto ai loro gusti, alle loro preferenze, alle loro abitudini. Da qui l’originario diritto alla riservatezza come “right to be let alone” ovviamente diventa un po’ insufficiente e quindi si richiedono delle nuove forme di tutela delle persone fisiche.
Un primo momento di questo percorso si ha innanzitutto con il Trattato sul Funzionamento dell’Unione Europea (l’articolo 16), con il Trattato sull’Unione Europea (all’articolo 39) e in particolare la Carta di Nizza. La Carta di Nizza è la Carta dei diritti fondamentali dell’Unione Europea che all’articolo 8 esprime la definitiva separazione tra la vecchia concezione della privacy e la nuova concezione della privacy, quindi da riservatezza a protezione del trattamento dei dati personali. Perché all’articolo 8 della Carta di Nizza viene proprio posto il diritto alla protezione dei dati personali come un diritto che ha una posizione del tutto autonoma e distinta rispetto alla riservatezza, che infatti è indicata nella Carta di Nizza l’articolo 7. Quindi abbiamo l’articolo 7 che ci parla della riservatezza e quindi del diritto alla riservatezza rispetto alla propria vita familiare e personale privata e poi l’articolo 8 invece il diritto alla privacy modernamente inteso e quindi come diritto di ogni individuo ad essere tutelato di fronte al trattamento dei dati personali che lo riguardano.
Da un punto di vista invece più strettamente di legislazione nazionale, il primo intervento italiano di riconoscimento del diritto alla protezione dei dati personali lo abbiamo nel 1996. Nel 1996 il legislatore recepisce con la legge 675 la direttiva del 1995 n.46. Quindi la prima legge italiana è la 675 del 96 di recepimento della direttiva 46 del 95 che poi è stata in un secondo momento modificata e integrata dal decreto legislativo del 2003 n. 196; quest’ultimo è quello che noi chiamiamo Codice della Privacy. La nostra principale fonte a livello nazionale che finalmente contiene norme relative al trattamento dei dati personali in una duplice ottica: non soltanto come tutela dei diritti della personalità (tutela dell’individuo in quanto tale), ma anche con un primo approccio di regolazione rispetto alla circolazione dei dati personali.
Questo aspetto è estremamente importante perché poi è al centro del regolamento del 2016, il Regolamento Europeo del 2016 n.679, che è noto con l’acronimo GDPR che sta per General Data Protection Regulation: è oggi la nostra fonte principale. Non è venuto meno il Codice della Privacy, è ancora in vigore, però è stato completamente toccato dalla presenza del GDPR. Innanzitutto una nota sulla fonte normativa: il regolamento. Siamo di fronte ad un regolamento dell’Unione Europea, il Regolamento è una fonte normativa comunitaria estremamente importante perché il Regolamento è, in quanto tale, direttamente applicabile in tutti gli Stati membri. Ciò vuol dire che con il Regolamento si vanno a perseguire obiettivi di uniformazione. Questo aspetto è estremamente importante perché il precedente atto normativo dell’Unione Europea era stata una direttiva (la direttiva del 1995 n. 46) e questo è un cambio anche a livello culturale estremamente importante perché la direttiva come fonte di produzione normativa europea ha una funzione diversa. La direttiva deve essere recepita negli ordinamenti nazionali. quindi serve un atto normativo del legislatore nazionale che recepisca la direttiva e le direttive non devono essere applicabili così come sono scritte, perché le direttive impongono obblighi agli Stati da un punto di vista delle finalità, ma non dal punto di vista delle modalità di perseguimento del fine. Pertanto il modo in cui si persegue la finalità può cambiare da Stato a Stato e questo è estremamente rilevante in questa materia, perché se la direttiva deve essere recepita da ogni Stato, ogni Stato, poi, ha la propria legge interna di regolazione di un certo fenomeno, in questo caso la protezione dei dati personali e ciò può condurre ad una frammentazione, frammentazione a livello comunitario può voler dire incertezza e quindi siamo di fronte poi ad un sistema che prevede delle tutele diverse in base allo Stato di appartenenza. Quindi con il Regolamento abbiamo la uniformazione del diritto e con le direttive la cosiddetta armonizzazione.
Ci si è resi conto negli anni che il progresso delle tecnologie informatiche era talmente significativo che occorreva intervenire in modo più incisivo a livello comunitario e quindi si sceglie la strada del Regolamento e il legislatore italiano ha dovuto prevedere con un decreto legislativo, il Decreto legislativo n.101 del 2018, delle norme di coordinamento tra la vecchia disciplina, quindi quella del Codice della Privacy del 2003, e la nuova disciplina del GDPR che è del 2016 ed entrato in vigore nel maggio 2018. Quindi il decreto legislativo 101 del 2018 si è dovuto occupare di coordinare la disciplina nazionale con quella comune a tutti gli Stati membri dell’Unione europea.
Un aspetto estremamente rilevante del GDPR è che il GDPR porta alla massima valorizzazione e alla massima esaltazione quel dualismo che indicavo prima con riferimento al Codice della Privacy. Perché il GDPR segue un’impostazione duale che però non va letta in una logica di contrapposizione ma invece come una complementarietà degli obiettivi che persegue: da un lato il GDPR ha come obiettivo fondamentale la protezione dell’interessato, quindi il soggetto che subisce il trattamento dei suoi dati personali, accanto c’è però quello della promozione e della tutela della circolazione dei dati. Questa promozione, questa tutela va oltre la sfera dell’individuo perché si pone più in una logica di mercato. Il mercato, l’economia attuale è strettamente fondata attorno alla circolazione dei dati e quindi automaticamente occorreva guardare non solo alla logica della persona, ma anche alla regolazione del fenomeno per come tocca gli aspetti che riguardano l’economia.
La logica diviene quindi quella di tutelare l’individuo e regolare la circolazione delle informazioni.
E quindi possiamo dire che rientra a pieno titolo in quelli che ad oggi consideriamo i diritti fondamentali delle persone, il diritto alla protezione dei dati personali. E sono dei diritti fondamentali anche se in realtà quantomeno in Italia la Costituzione non li nomina. La Costituzione italiana non fa riferimento a questa situazione giuridica soggettiva quindi a quella situazione che riguarda la necessità di proteggere i dati personali delle persone. Ovviamente la nostra Costituzione è troppo risalente e non è stata modificata di recente per introdurre questo aspetto. Benchè non ci sia una indicazione esplicita nella nostra Carta, in realtà nel momento in cui la protezione dei nostri dati personali come diritto fondamentale noi lo andiamo a considerare come un diritto che concerne la circolazione delle nostre informazioni e quindi se si parla di circolazione si parla di rappresentazione verso l’esterno della nostra personalità, cioè si parla di informazioni che ci riguardano che in qualche modo stanno uscendo dalla nostra sfera più stretta, più intima di controllo personale. Quindi in questo senso la circolazione delle informazioni va letta come una esternazione delle caratteristiche della nostra personalità e quindi inevitabilmente va a toccare quella che è la nostra rappresentazione verso l’esterno. Se parliamo di rappresentazione verso l’esterno ci stiamo configurando in una posizione di relazione verso l’esterno quindi relazione con il prossimo, sia il prossimo un’altra persona fisica, sia il prossimo un’autorità pubblica, sia il prossimo un privato che agisce nella sua dimensione di attività commerciale o professionale. E quindi se ci posizioniamo nell’ambito di una attività di relazione possiamo ricondurre questo nuovo riconoscimento del diritto alla protezione dei dati personali all’interno dell’articolo due. L’articolo due, il cosiddetto trasformatore permanente della Costituzione perché è l’articolo che permette più di tutti di adeguare la protezione delle persone rispetto alla trasformazione della società negli anni, permette anche di riconoscere una “casa” per la protezione dei dati personali anche a livello costituzionale: possiamo riconoscere a livello costituzionale interno nell’articolo due in una funzione di costituzionalizzazione. In particolare con riferimento alla Corte Costituzionale vi è una sentenza rilevante addirittura del 73 la n. 38, che è particolarmente rilevante perché ha segnato la giurisprudenza di merito e di legittimità successiva perché con questa sentenza è stato proprio riconosciuto l’inserimento della riservatezza (ovviamente nel 73 ancora non si parlava di trattamento dei dati) all’interno dei diritti inviolabili dell’uomo. Quindi questa concezione della riservatezza, della privacy come un diritto inviolabile e quindi come un valore primario del nostro ordinamento costituzionale.
Ovviamente la questione si estende nel tempo perché dalla riservatezza passiamo alla protezione dei dati personali, perché di fronte allo sviluppo tecnologico – è vero che siamo di fronte a dei fattori che ormai sono da tutti considerati come strumenti tecnologici estremamente significativi per la crescita del benessere, per il miglioramento della qualità della vita – ci si è resi conto nel tempo di quanto siano altrettanto capaci di incidere poi negativamente sulle persone, sui diritti fondamentali delle persone, in tutti quei casi in cui il trattamento dei dati delle persone non dovesse essere fatto con le opportune garanzie. Da questo punto di vista il passaggio fondamentale, il cambio di mentalità si ha principalmente con il Codice della privacy che permette appunto questo collegamento molto stretto, questo avvicinamento tra la protezione dei dati personali e i diritti inviolabili, questa concezione di inviolabilità dell’essere umano che è tipicamente costituzionale. Ciò avviene nel Codice della privacy mediante il riconoscimento del diritto alla protezione dei dati che si fonda su due principi fondamentali: il primo principio è quello cosiddetto del livello elevato di tutela, quindi il livello elevato di tutela dei diritti e delle libertà fondamentali dell’individuo, il secondo è il principio di necessità del trattamento di dati che si riferiscono ad una persona. Il Codice della Privacy del 2003 è l’innovazione da questo punto di vista, perché il precedente riferimento normativo che era la legge 675 del 96 si limitava a garantire che il trattamento dei dati delle persone, quindi il trattamento dei dati personali, si realizzasse nel rispetto dei diritti e delle libertà e della dignità delle persone fisiche. Quindi noi nel 96 parliamo di trattamento che deve essere rispettoso dei diritti appunto e delle libertà e della dignità delle persone, però è come se stessimo scindendo i due momenti, invece con il Codice della Privacy del 2003 andiamo a considerare quella stessa protezione dei dati personali come tutela dei diritti, delle libertà e delle dignità dell’individuo. Qui non sono due cose che si affiancano, ma appunto diventa un ragionamento unico.
Il primo principio che guida il codice del 2003 è il principio di elevata tutela. L’elevata tutela comporta che i poteri pubblici si devono impegnare in modo effettivo alla protezione dei dati personali. È importante questa parola impegnare perché si impone uno specifico obbligo di protezione. Quindi non è soltanto una pretesa di astenersi dal generare conseguenze negative alla sfera intima della persona, non è una logica difensiva del diritto, è una logica al contrario positiva, una logica di tutela, è una logica proattiva che impegna verso la disposizione di strumenti di tutela. Per quanto riguarda invece il secondo principio: è il principio di necessità che guida il codice della privacy. Parliamo di principio di necessità nel trattamento dei dati che si traduce nella riduzione al minimo di dati da utilizzare. Quindi la logica è che quando si svolge un’attività di trattamento dei dati personali si deve ridurre il più possibile i dati, la quantità di dati che vengono utilizzati per perseguire la finalità che il trattamento persegue. Quindi utilizzerò soltanto i dati che sono necessari a perseguire le finalità del trattamento. In questo senso capiamo un ulteriore passaggio della differenza tra la vecchia concezione della privacy, quella strettamente connessa alla riservatezza, e la nuova concezione della privacy legata al trattamento dei dati, potendo dire che con la riservatezza siamo di fronte ad un diritto dal contenuto negativo, negativo nel senso di contenuto che è rivolto alla esclusione dei terzi dall’ingresso nella nostra sfera più intima, quindi da qualsiasi ingerenza di terzi nella nostra vita privata. Quindi contenuto negativo nel senso di difensivo. Quando invece parliamo di privacy come trattamento e protezione dei dati personali, parliamo di un diritto che ha un contenuto positivo, è il diritto affinché il trattamento dei dati avvenga in modo corretto, è il dirittoaffinché chi tratta i dati segua delle regole di gestione di questi dati e che chi fornisce i propri dati abbia la possibilità di autodeterminarsi a livello informativo quindi possa autodeterminare il singolo quali, quanti e come debbano circolare i dati che lo riguardano. Quindi contenuto positivo come impegno per chi li tratta e come autodeterminazione informativa per chi subisce il trattamento.
Il GDPR
Ora torniamo al contenuto proprio del GDPR. Ovviamente teniamo sempre a mente che il GDPR costituisce per noi il perno su cui si basa tutta la costruzione della visione europea del trattamento dei dati e dello sviluppo dell’economia digitale. Vediamo però adesso qualche aspetto fondamentale del GDPR innanzitutto dal punto di vista del lessico per capire tutta una serie di parole che che troviamo e quindi diremo innanzitutto che cos’è il dato personale. Il dato personale ci viene indicato dall’articolo 4 del GDPR al n.1, come qualsiasi informazione che si riferisca ad una persona fisica identificata o identificabile. Identificabile s’intende quella persona che può essere identificata anche in modo indiretto e quindi attraverso un nome, un numero di identificazione, uno pseudonimo, un identificativo online, oppure attraverso altri elementi del suo fisico o dei suoi geni o altri riferimenti alla sua identità dal punto di vista sociale, culturale, economico o politico, qualsiasi tipo di informazione che ci permetta poi di ricondurre quel dato, quell’informazione a una persona fisica. Quando parliamo invece di trattamento dei dati personali, sempre all’articolo 4 del GDPR, parliamo di qualsiasi operazione, quindi nella nozione di trattamento facciamo rientrare qualsiasi operazione o anche insieme di operazioni che siano applicate ai dati personali. Quindi qualsiasi attività rivolta ai dati personali: può essere un’attività di raccolta, può essere un’attività di registrazione, può essere un’attività di conservazione, un’attività di estrazione, un’attività di uso, di diffusione ma anche di modifica dei dati. Quando si svolge una o più di queste condotte allora siamo di fronte ad un trattamento dei dati. Chi è quindi il titolare del trattamento? il titolare del trattamento può essere una persona fisica, può essere una persona giuridica, un ente, oppure può essere anche una autorità pubblica, ciò che ci interessa è che il titolare del trattamento è il destinatario praticamente di quasi tutti gli obblighi contenuti nel GDPR. Il GDPR presenta un elenco particolarmente significativo di obblighi che sono rivolti proprio ai titolari sempre nella logica di protezione dei dati personali. In particolare, usando un sunto, il titolare del trattamento ha il compito di adottare tutte le misure necessarie alla protezione dei dati delle persone fisiche. La logica dell’adozione di queste misure è ovviamente quella di evitare o comunque di ridurre il più possibile i rischi che i dati vengano persi o ne vengano in possesso terzi non autorizzati. Queste misure sono rivolte al titolare, è il titolare che deve individuare quali siano le migliori modalità con cui proteggere i dati; ovviamente imponendo degli obblighi al titolare del trattamento, il legislatore, come si fa sempre nella produzione normativa, riconosce anche dei diritti all’interessato. Chi è l’interessato? Ogni volta che diremo la parola l’interessato ci stiamo riferendo alla persona i cui dati personali sono trattati. E questi diritti sono tutti diritti attraverso i quali l’interessato può controllare il flusso di informazioni che lo riguardano. In questo modo, quindi, può impedire che il trattamento dei suoi dati possa essere effettuato con modalità tali da ledere la sua sfera morale e la sua sfera personale. Quindi proprio dei diritti riguardanti il momento del trattamento io interessato ho la possibilità, attraverso il GDPR, di incidere rispetto le modalità con cui i miei dati sono trattati dal titolare: ad esempio sono riconosciuti i diritti all’aggiornamento, alcune informazioni che mi riguardano sono modificate e io le voglio aggiornare, modificare, le voglio rettificare, le voglio integrare o le voglio cancellare; non sono più disposto a che i miei dati siano nella disponibilità di un certo titolare quindi li voglio cancellare. La cancellazione dei dati personali è un riferimento importante perché il GDPR riconoscere per la prima volta anche il cosiddetto diritto all’oblio, che però è diverso dalla cancellazione, perché la cancellazione riguarda la situazione in cui i dati che io ho permesso che venissero utilizzati rispetto ad un certo fine non sono più necessari oppure non sono più io interessato a che vengano trattati da quel titolare. Il diritto all’oblio invece, riconosciuto all’articolo 17 del GDPR, è diverso perché riguarda proprio il diritto a far dimenticare informazioni, fatti, che riguardano il mio conto come interessato, quindi l’oblio come diritto a far dimenticare quando magari una certa informazione, un certo fatto non è più di interesse per la collettività e quindi voglio che non venga più fatto circolare nel senso che venga fatto dimenticare; invece la cancellazione riguarda proprio la cancellazione di dati rispetto ad uno specifico, a una specifica attività di trattamento.
Il consenso
Ultimo riferimento importante dal punto di vista di base del GDPR è il consenso. Il consenso è uno dei modi con cui si permette l’attività di trattamento. L’articolo 6 del GDPR fa riferimento proprio alla manifestazione del consenso dell’interessato come base giuridica per il trattamento. Quindi il trattamento da parte del titolare è permesso dal consenso dell’interessato che lo deve manifestare. Il consenso innanzitutto deve essere prestato in forma espressa, sia oralmente che per iscritto, è importante appunto che sia espresso, cioè che si sostanzi in un atto positivo idoneo a manifestare l’intenzione di asserire al trattamento. In ogni caso, la regola importante del consenso è che può essere revocato in qualsiasi momento: posso in qualsiasi momento revocarlo e non devo nemmeno dare una motivazione sulla revoca.
Quali sono però i contenuti di questo consenso? Il consenso affinché sia valido, affinché il consenso possa costituire la fonte di un trattamento di dati personali deve avere 4 caratteristiche che, ovviamente, devono sussistere contemporaneamente, non sono alternative tra loro:
la prima caratteristica è che il consenso deve essere inequivocabile. Inequivocabile vuol dire che l’interessato non deve avere alcun dubbio al fatto che con quel consenso permette un trattamento dei dati. Quindi l’inequivocabilità la individuiamo proprio nel nesso tra il consenso e il trattamento. Quindi quella mia manifestazione di consenso deve riguardare un trattamento dei dati personali;
il secondo requisito è che il consenso deve essere informato. Informato vuol dire che deve essere un consenso che sia pienamente consapevole dell’attività che verrà svolta. E quindi deve trovarsi l’interessato trovarsi di fronte ad una informativa da parte del titolare che sia comprensibile, facilmente accessibile e resa in un linguaggio chiaro e comprensibile, dal quale emerga appunto tutto ciò, tutte le informazioni necessarie che riguardano il trattamento;
il terzo requisito è la specificità, il consenso deve essere specifico, specifico vuol dire che deve essere prestato per ognuna delle finalità del trattamento. Quindi se il trattamento persegue una finalità è specifico di fronte a quella finalità, se il trattamento persegue più finalità individuate dal titolare del trattamento allora il consenso deve essere prestato per ciascuna di queste finalità che il titolare intende svolgere. Il consenso deve essere specifico perché il soggetto interessato deve avere la possibilità di raffigurarsi tutti quelli che potranno essere gli effetti scaturenti dal suo consenso;
il quarto elemento è che il consenso deve essere libero. Libero vuol dire che il consenso deve essere prestato in assenza di qualsiasi forma di condizionamento.
Ora possiamo spendere a livello strettamente tecnico-giuridico qualche parola su questo consenso e in particolare sulla natura del consenso perché come abbiamo detto la protezione dei dati personali è un diritto fondamentale. E i diritti fondamentali sono diritti che noi riteniamo diritti assoluti, diritti indisponibili, diritti intrasmissibili, diritti imprescrittibili. Quindi sono i diritti quanto più fortemente riconosciuti alle persone in quanto tali. In questo senso, visto che la protezione dei dati personali è un diritto fondamentale, alcuni autori (il tema è aperto e ci sono diverse prospettive), hanno ritenuto che il trattamento dei dati, anzi il consenso al trattamento dei dati, non ha una valenza dispositiva. Perché? Perché non riguarda una proprietà di cui si dispone e che quindi si cede ma riguarda la persona. Il consenso dell’interessato ha un riferimento che afferisce alla persona in modo costitutivo e quindi il consenso può essere una autorizzazione, può essere un atto di autorizzazione, ma non può avere valenza negoziale come se fosse un contratto e quindi il titolare del trattamento è vero che è legittimato a trattare i dati perché c’è stato il consenso, però i dati secondo questa logica continuano ad essere della persona che ha prestato il consenso. Quindi non c’è una cessione in senso stretto perché i dati col fatto che afferiscono alla persona in modo proprio costitutivo e che afferiscono alla sua sfera personale allora rispetto a questi dati non viene meno la relazione di appartenenza a colui che presta il consenso e quindi l’atto di autorizzazione in questo senso sarebbe un atto che ha il risultato di rendere lecita un’attività che altrimenti sarebbe illecita. D’altra parte ci sono invece altri autori, altri giuristi della dottrina che invece sostengono che il consenso abbia una valenza negoziale, quindi che il dato sia qualcosa che io cedo come cedo un bene. Quindi si parla in questo senso di reificazione dei dati perché io come cedo un bene ceodo i miei dati personali e quindi nel momento in cui presto il consenso cedo i miei dati che entrano nel mercato e circolano nel mercato in quanto beni suscettibili di una loro valutazione economica che quindi poi seguirà le regole del mercato.
Torniamo Regolamento e a tutto ciò che riguarda l’importanza del GDPR proprio come strumento per superare una legislazione nazionale frammentata nell’Unione Europea e quindi poi per superare i profili di incertezza rispetto alla protezione, alla circolazione di dati. Con lo strumento del Regolamento siamo arrivati alla possibilità di incentivare lo sviluppo e la diffusione dei mercati digitali in Europa in generale nell’ottica di creare un po’ quello che è un clima di fiducia rispetto a una circolazione di dati per i cittadini dell’Unione europea. Il GDPR in ciò rende effettivamente chiaro il cambio di mentalità proprio perché la direttiva europea del 95 era una direttiva che aveva una concezione un po’ più statica della protezione della privacy mentre appunto con il Regolamento andiamo verso una considerazione dinamica. Quindi una tutela non solo in riguardo all’utilizzo delle informazioni che ci riguardano e che quindi noi possiamo permettere con il consenso, ma una tutela dinamica proprio perché l’interessato può in qualche modo seguire i dati, seguire la circolazione dei dati che lo riguardano e quindi intervenire a propria protezione in ogni fase della della circolazione che avviene chiaramente sulla Rete. E tornando appunto al GDPR notiamo come questa forma di tutela è tanto significativa che addirittura ci permette di tutelare i nostri dati personali non solo come dicevamo prima nei confronti in generale dei titolari che possono essere soggetti pubblici e soggetti privati ma addirittura a proteggerci dai titolari indipendentemente da stretti limiti territoriali. L’applicazione territoriale del regolamento, che è indicato all’articolo 3 del GDPR, è particolarmente interessante perché l’ambito di applicazione va oltre l’Unione Europea. Quindi, anche se abbiamo un provvedimento normativo UE, abbiamo una tutela che va oltre i confini dell’Unione. L’unica cosa che rileva, quindi, non è il luogo in cui avviene il trattamento dei dati, ma il luogo in cui è stabilito il titolare del trattamento oltre che l’interessato chiaramente, perché se io tutelo con la mia normativa un interessato ovviamente sto parlando del cittadino europeo quindi del cittadino dell’Unione europea e degli Stati membri dell’Unione europea. Però se il cittadino da tutelare europeo e il titolare è stabilito nel senso fisico proprio nell’Unione europea allora io potrò tutelare, potrò esercitare tutti i diritti che sono riconosciuti dal GDPR e potrò imporre al titolare tutti gli obblighi che sono imposti dal GDPR, anche se il trattamento poi avviene fuori dall’Unione europea. Per quanto riguarda gli obblighi imposti ovviamente la tutela sta nel fatto che il titolare che non si dovesse conformare agli obblighi imposti sarà soggetto alle attività del Garante della protezione dei dati personali. Grandi piattaforme digitali o comunque grandi poteri privati, grandi imprese, sono costantemente oggetto di attenzione nella loro attività da parte dei garanti nazionali della protezione dei dati personali, perché poi spesso un singolo cittadino non ha nemmeno gli strumenti per rendersi conto di come i suoi dati sono stati trattati e quindi a questo punto l’attività svolta dal Garante è estremamente rilevante, estremamente significativa a tutela della collettività perché possono poi condurre a delle sanzioni pecuniarie di importi estremamente elevati che costituiscono poi l’unico vero disincentivo alla violazione degli obblighi del GDPR.
Se è fondamentale, infine, per l’applicazione del GDPR lo stabilimento del titolare nell’Unione europea ci sono casi addirittura in cui non si applica nemmeno questa regola e quindi la disciplina del GDPR si applica anche in mancanza dello stabilimento nel territorio dell’Unione Europea da parte del titolare e questi casi sono due e sono il caso in cui il trattamento di dati personali riguardi l’offerta di beni o la prestazione di servizi agli interessati, anche se l’offerta di beni o la prestazione di servizi avviene in mancanza di un corrispettivo. E poi la seconda ipotesi è quella in cui le attività di trattamento dei dati personali riguardino il monitoraggio dei comportamenti tenuti dagli interessati e ciò ha valore principalmente in tutti quei contesti di trattamento che utilizzi tecniche di profilazione, tecniche di tracciamento delle persone fisiche e che quindi siano delle tecniche che, profilando, tracciando le persone, permettano poi ai titolari del trattamento di adottare delle decisioni riferite a queste stesse persone, analizzare i loro comportamenti, prevedere le loro preferenze che possono essere le loro preferenze di consumo ma anche le loro preferenze personali, in tutti questi casi la portata applicativa del GDPR riguarda addirittura i titolari che non siano stabiliti nell’Unione europea. Questo è un elemento molto caratteristico della legislazione europea che segna la forza di questo strumento di regolazione di cui si è dotata l’Unione nel 2016, secondo una logica per cui se le informazioni, i dati personali delle persone possono circolare come avviene tramite internet a livello globale, allora anche la protezione che voglio fornire ai miei cittadini va oltre i miei limiti territoriali e cerco di estenderla il più possibile anch’essa a livello globale. È un aspetto di attenzione alla privacy estremamente significativo ed esteso e tale aspetto tra l’altro lo ritroviamo anche in quella essere la definizione del dato personale perché la definizione del dato personale è molto ampia. Perché se dico che è qualsiasi informazione con cui posso identificare una persona fisica, con questo sto dando una nozione molto ampia perché qualsiasi informazione vuol dire che se l’informazione la trovo cartacea, informazione alfabetica, numerica, acustica, fotografica, qualsiasi tipo di informazione qualunque sia la forma in cui l’informazione mi viene espressa e attraverso qualsiasi di queste informazioni posso identificare una persona e quindi tutte queste informazioni sono un dato personale, è una nozione estremamente ampia. E qual è la logica, la logica è la stessa di prima quindi così come estendo il più possibile a livello territoriale con una nozione così ampia di dato personale, pure posso estendere la tutela il più possibile perché mi permetto come legislatore europeo, di individuare in futuro tutta una serie di nuove situazioni che nel 2016 non posso considerare perché magari nel 2016 io conosco un livello di raggiungimento delle tecnologie tale per cui posso immaginarmi certe situazioni di tutela, invece così riesco a permettere un’evoluzione dell’applicazione GDPR anche attraverso le nuove situazioni che l’evoluzione tecnologica mi presenterà. Quindi una nozione di dato elastica, un nozione di dato onnicomprensiva e quindi idonea ad adeguarsi poi a tutte le situazioni che in futuro toccheranno la sfera dei dati personali delle persone fisiche perché le innovazioni e tutte le modalità con cui si permette il trattamento dei dati è in costante evoluzione. Pensiamo ora a tutto quello che ovviamente toccherà questa materia la prossima l’entrata in vigore del regolamento sull’intelligenza artificiale. Un tema completamente nuovo ma che costringe il legislatore ovviamente a stare al passo con l’evoluzione tecnologica e quindi queste nozioni ampie e poi questa portata territoriale anche particolarmente estesa permette di far fronte il più possibile all’esigenza di tutela: l’esigenza di tutela della persona che si affianca al bilanciamento degli interessi del mercato legato ai dati personali.
Appunti raccolti durante il relativo corso seguito su Skills for All by Cisco, alla cui piattaforma rimando per il materiale necessario.
Comprendere l’hacking etico e il penetration testing
Introduzione
Il termine hacker etico descrive una persona che agisce come aggressore e valuta il livello di sicurezza di una rete di computer allo scopo di ridurre al minimo i rischi. Il NIST Computer Security Resource Center (CSRC) definisce un hacker come un “utente non autorizzato che tenta o ottiene l’accesso a un sistema informativo”. Sappiamo tutti che il termine hacker è stato utilizzato in molti modi diversi e ha molte definizioni diverse. La maggior parte delle persone che lavorano nel campo della tecnologia informatica si considerano hacker per il semplice fatto che amano armeggiare. Questa ovviamente non è una cosa dannosa. Quindi, il fattore chiave nel definire l’hacking etico rispetto a quello non etico è che quest’ultimo implica intenti dannosi. Il permesso di attaccare o il permesso di testare è fondamentale e ti terrà fuori dai guai! Questo permesso di attacco viene spesso definito “l’ambito” del test (ciò che è consentito e non è consentito testare). Maggiori informazioni su questo argomento più avanti in questo modulo.
Un ricercatore di sicurezza che cerca vulnerabilità in prodotti, applicazioni o servizi web è considerato un hacker etico se rivela responsabilmente tali vulnerabilità ai fornitori o ai proprietari della ricerca mirata. Tuttavia, lo stesso tipo di “ricerca” eseguita da qualcuno che poi sfrutta la stessa vulnerabilità per ottenere l’accesso non autorizzato a una rete/sistema preso di mira verrebbe considerato un hacker non etico. Potremmo addirittura arrivare a dire che qualcuno che trova una vulnerabilità e la rende pubblica senza collaborare con un fornitore è considerato un hacker non etico, perché ciò potrebbe portare alla compromissione di reti/sistemi da parte di altri che utilizzano queste informazioni in modo dannoso.
La verità è che, come hacker etico, utilizzi gli stessi strumenti per individuare vulnerabilità e sfruttare obiettivi utilizzati dagli hacker non etici. Tuttavia, in quanto hacker etico, in genere segnaleresti le tue scoperte al fornitore o al cliente che stai aiutando a rendere la rete più sicura. Cercheresti anche di evitare di eseguire test o exploit che potrebbero essere di natura distruttiva.
L’obiettivo di un hacker etico è quello di analizzare il livello di sicurezza dell’infrastruttura di una rete o di un sistema nel tentativo di identificare ed eventualmente sfruttare potenziali punti deboli rilevati e quindi determinare se è possibile una compromissione. Questo processo è chiamato security penetration testing o hacking etico.
Suggerimento: Hacking is NOT a Crime (hackingisnotacrime.org) è un’organizzazione no-profit che tenta di aumentare la consapevolezza sull’uso peggiorativo del termine hacker. Storicamente, gli hacker sono stati descritti come malvagi o illegali. Fortunatamente, molte persone sanno già che gli hacker sono individui curiosi che vogliono capire come funzionano le cose e come renderle più sicure.
Perché è necessario eseguire un Penetration Testing?
Quindi, perché abbiamo bisogno dei test di penetrazione? Bene, prima di tutto, come persona responsabile della sicurezza e della difesa di una rete/sistema, vuoi trovare ogni possibile percorso di compromissione prima che lo facciano i malintenzionati. Da anni vengono sviluppate e implementate diverse tecniche di difesa (ad esempio antivirus, firewall, sistemi di prevenzione delle intrusioni [IPS], anti-malware). Viene altresì implementata la difesa in profondità come metodo per proteggere e difendere le nostre reti. Ma come facciamo a sapere se queste difese funzionano davvero e se sono sufficienti a tenere lontani i cattivi? Quanto sono preziosi i dati che proteggiamo e stiamo proteggendo le cose giuste? Queste sono alcune delle domande a cui dovrebbe rispondere un penetration test. Se costruisci una recinzione attorno al tuo giardino con l’intento di impedire al tuo cane di uscire, forse deve essere alta solo 1,5 metri. Tuttavia, se la tua preoccupazione non è l’uscita del cane ma l’ingresso di un intruso, allora hai bisogno di una recinzione diversa, una che dovrebbe essere molto più alta di 1,5 metri. A seconda di ciò che stai proteggendo, potresti anche voler del filo spinato sulla parte superiore della recinzione per scoraggiare ancora di più i malintenzionati. Quando si tratta di sicurezza delle informazioni, dobbiamo fare lo stesso tipo di valutazioni sulle nostre reti e sui nostri sistemi. Dobbiamo determinare cosa stiamo proteggendo e se le nostre difese possono resistere alle minacce che vengono loro imposte. È qui che entrano in gioco i penetration testing. La semplice implementazione di un firewall, un IPS, un anti-malware, una VPN, un firewall per applicazioni web (WAF) e altre moderne difese di sicurezza non è sufficiente. È inoltre necessario testarne la validità. E devi farlo regolarmente. Lo sappiamo: le reti e i sistemi cambiano costantemente. Ciò significa che anche la superficie di attacco può cambiare e, in tal caso, è necessario prendere in considerazione la possibilità di rivalutare il livello di sicurezza tramite un penetration test.
Ricerca di carriere nel PenTesting
Penso che sia importante comprendere il panorama occupazionale e i diversi ruoli e responsabilità che includono le professioni di sicurezza informatica. Un buon riferimento generale da esplorare per le descrizioni dei diversi ruoli lavorativi è il Cyber Career Pathways Tool della National Initiative for Cybersecurity Careers and Studies (NICCS). Offre un modo visivo per scoprire e confrontare diversi ruoli lavorativi di questa professione.
Interessante per capire dove si è collocati nel quadro generale della professionalità.
Threat Actors
Prima di poter comprendere in che modo un hacker etico o un penetration tester può imitare un threat actor (attore di minacce o un utente malintenzionato), è necessario comprendere i diversi tipi di autori di minacce. Di seguito sono riportati i tipi più comuni di aggressori.
pirati informatici, quelli che spesso, comunemente, vengono chiamati hacker, È sbagliato pensare che i cybercriminali puntino solamente ad eseguire attacchi in grande stile. A fianco di bersagli quali istituti governativi e bancari, sono sempre più oggetto di attacchi informatici anche PMI, liberi professionisti, sino al singolo utente domestico;
spie, sabotatori, vandali. Attualmente, diversi Governi si sono dotati delle necessarie capacità per penetrare le reti nazionali degli altri Stati (in uso sia alle autorità pubbliche che ai privati) a fini di spionaggio o per mappare i sistemi potenzialmente oggetto di un futuro attacco. Il vandalo adotta un insieme di azioni al fine di danneggiare o distruggere beni altrui materiali e non, per puro divertimento o incuria. Il sabotatore ha per obiettivo creare danni ad un sistema, dal rallentamento sino al denial of service, per i motivi più vari. È evidente che una netta distinzione tra i due attori non è possibili in quanto agiscono spesso con le medesime modalità e per gli stessi scopi;
oltre ai criminali comuni, che si rifanno al modello noto come “cybercrime-as-a-service” di cui si è parlato prima, vi sono organizzazioni criminali che hanno preso coscienza delle potenzialità dei malware andando a creare strutture commerciali efficientemente organizzate, capaci di generare sensibili profitti dalla vendita dei servizi che le botnet sono in grado di offrire;
terroristi, è possibile ipotizzare che nel prossimo futuro gruppi terroristici o singoli individui possano impiegare strumenti cibernetici offensivi ed utilizzarli contro obiettivi militari e civili. Si può far rientrare in questa categoria, quella degli attivisti, dal 2013 sempre più spesso si assiste ad una commistione tra finalità cyber criminali e forme di hacktivism. I due ambiti, originariamente distinti per background, finalità e modalità di azione, sempre più spesso trovano conveniente allearsi per raggiungere i propri obiettivi: tipologie di attacco motivate ideologicamente, con intento sostanzialmente dimostrativo, che mirano principalmente a creare un danno d’immagine e/o alla funzionalità temporanea di sistemi e reti;
personale interno, ovvero l’ “insider”, cioè il soggetto che all’interno di una organizzazione – pubblica o privata poco importa – può generare situazioni compromettenti la sicurezza o addirittura la sopravvivenza della realtà di appartenenza. L’attenzione è incentrata sia sui soggetti che ora lavorano nell’organizzazione, sia su quelli che hanno interrotto ogni rapporto. Va tenuto nella dovuta considerazione il fatto che l’attenzione agli attacchi informatici deve necessariamente essere rivolta non solo verso l’esterno, ma anche verso l’interno dell’azienda. Un dipendente particolarmente motivato potrebbe creare un danno molto maggiore rispetto a quello di un cyber attaccante, vista la sua conoscenza dell’infrastruttura e degli asset aziendali. A mio parere rappresenta una fra le minacce più gravi: partono in vantaggio rispetto ad un attaccante esterno per la conoscenza delle dinamiche interne, delle infrastrutture, ecc.., hanno già le credenziali di accesso e spesso non vengono revocate in tempo. Esempio italiano Hacking Team;
fornitori di servizi, outsourcers, nel 2013 si è assistito all’emergere di una chiara tendenza, per cui gli attaccanti hanno individuato negli outsourcer l’anello più debole da colpire per raggiungere (tipicamente sfruttandone le utenze privilegiate e le connessioni VPN) i loro bersagli primari. Questo fenomeno, data la propensione degli attaccanti a minimizzare gli sforzi, è destinato a crescere in modo esponenziale, dal momento che spesso questi fornitori sono aziende medio-piccole, con una cultura della sicurezza sensibilmente inferiore a quella dei loro grandi clienti, pur avendo di frequente accessi poco o per nulla presidiati alle loro reti ed infrastrutture;
dal crimine informatico allo state-sponsored hacking. Lo scenario attuale vede un crescente numero di attacchi informatici caratterizzati da livelli di complessità elevati, determinati dalla proliferazione di hacker al soldo di governi oppure di malware sviluppati dai governi stessi. Se il crimine informatico preoccupa gli esperti di sicurezza, il nation-state hacking non è da meno. La quasi totalità dei governi è intenta nell’ampliamento del proprio arsenale cibernetico.
Exploring Penetration Testing Methodologies
I test di penetrazione vanno ben oltre l’hacking della rete di un cliente. Un approccio casuale porterà a risultati casuali. È importante seguire metodi e standard ben noti per affrontare gli impegni di pentesting in modo organizzato e sistematico.
Dovresti comprendere le principali metodologie e standard documentati in modo da poter creare strategie che attingano ai loro punti di forza. Documentare il tuo approccio con le metodologie e gli standard che hai utilizzato fornisce inoltre responsabilità alla nostra azienda e aiuta a rendere i nostri risultati difendibili nel caso in cui sorgano problemi con i nostri clienti.
Il processo di completamento di un penetration test varia in base a molti fattori. Anche gli strumenti e le tecniche utilizzati per valutare il livello di sicurezza di una rete o di un sistema variano. Le reti e i sistemi oggetto di valutazione sono spesso molto complessi. Per questo motivo, quando si esegue un test di penetrazione è molto facile uscire dal campo di applicazione. È qui che entrano in gioco le metodologie di test.
Perché è necessario seguire una metodologia per i Penetration Test?
Come appena accennato, lo scope creep è una delle ragioni per utilizzare una metodologia specifica; tuttavia, ci sono molte altre ragioni. Ad esempio, quando esegui un test di penetrazione per un cliente, devi dimostrare che i metodi che intendi utilizzare per il test sono collaudati e veri. Utilizzando una metodologia nota, è possibile fornire la documentazione di una procedura specializzata utilizzata da molte persone.
Considerazioni ambientali
Esistono ovviamente diversi tipi di test di penetrazione. Spesso vengono combinati in un ambito più complesso di test; tuttavia, possono anche essere eseguiti come test individuali.
Di seguito è riportato un elenco di alcune delle considerazioni ambientali più comuni per i tipi di test di penetrazione odierni:
Test dell’infrastruttura di rete
Testare l’infrastruttura di rete può significare diverse cose. Ai fini di questi appunti, diciamo che è incentrato sulla valutazione del livello di sicurezza dell’effettiva infrastruttura di rete e su come questa sia in grado di aiutare a difendersi dagli attacchi. Ciò include spesso switch, router, firewall e risorse di supporto, come server e IPS di autenticazione, autorizzazione e contabilità (AAA). Un test di penetrazione sull’infrastruttura wireless può talvolta essere incluso nell’ambito di un test dell’infrastruttura di rete. Tuttavia, verrebbero eseguiti ulteriori tipi di test oltre alla valutazione della rete cablata. Ad esempio, un tester di sicurezza wireless tenterà di entrare in una rete tramite la rete wireless aggirando i meccanismi di sicurezza o violando i metodi crittografici utilizzati per proteggere il traffico. Testare l’infrastruttura wireless aiuta un’organizzazione a determinare i punti deboli nell’implementazione wireless e l’esposizione. Spesso include una mappa termica dettagliata dell’erogazione del segnale.
Test basati sulle applicazioni
Questo tipo di pen test si concentra sui test per individuare i punti deboli della sicurezza nelle applicazioni aziendali. Questi punti deboli possono includere, a titolo esemplificativo, configurazioni errate, problemi di convalida dell’input, problemi di injection e difetti logici. Poiché un’applicazione Web è generalmente creata su un server Web con un database back-end, l’ambito del test normalmente include anche il database. Tuttavia, si concentra sull’accesso al database di supporto attraverso la compromissione dell’applicazione web. Una grande risorsa che menzioniamo più volte in questo libro è l’Open Web Application Security Project (OWASP).
Test di penetrazione nel cloud
I fornitori di servizi cloud (Cloud service providers – CSP) come Azure, Amazon Web Services (AWS) e Google Cloud Platform (GCP) non hanno altra scelta se non quella di prendere molto sul serio le proprie responsabilità in materia di sicurezza e conformità. Ad esempio, Amazon ha creato il modello di responsabilità condivisa per descrivere in dettaglio le responsabilità dei clienti AWS e le responsabilità di Amazon (vedi https://aws.amazon.com/compliance/shared-responsibility-model).
La responsabilità per la sicurezza del cloud dipende dal tipo di modello cloud (software as a service [SaaS], platform as a service [PaaS] o Infrastructure as a Service [IaaS]). Ad esempio, con IaaS, il cliente (cloud consumer) è responsabile di dati, applicazioni, runtime, middleware, macchine virtuali (VM), contenitori e sistemi operativi nelle VM. Indipendentemente dal modello utilizzato, la sicurezza del cloud è responsabilità sia del cliente che del fornitore del cloud. Questi dettagli devono essere elaborati prima della firma di un contratto di cloud computing. Questi contratti variano a seconda delle esigenze di sicurezza del cliente. Le considerazioni includono il ripristino di emergenza, gli accordi sul livello di servizio (service-level agreements – SLA), l’integrità dei dati e la crittografia. Ad esempio, la crittografia viene fornita end-to-end o solo presso il fornitore di servizi cloud? Inoltre, chi gestisce le chiavi di crittografia: il CSP o il client?
Nel complesso, vuoi assicurarti che il CSP disponga degli stessi livelli di sicurezza (logico, fisico e amministrativo) che avresti per i servizi che controlli. Quando esegui test di penetrazione nel cloud, devi capire cosa puoi fare e cosa non puoi fare. La maggior parte dei CSP dispone di linee guida dettagliate su come eseguire valutazioni della sicurezza e test di penetrazione nel cloud. Indipendentemente da ciò, esistono molte potenziali minacce quando le organizzazioni passano a un modello cloud. Ad esempio, anche se i tuoi dati sono nel cloud, devono risiedere in un luogo fisico da qualche parte. Il tuo fornitore di servizi cloud dovrebbe accettare per iscritto di fornire il livello di sicurezza richiesto per i tuoi clienti. Ad esempio, il collegamento seguente include la policy di supporto clienti AWS per il penetration testing: https://aws.amazon.com/security/penetration-testing.
Nota: molti penetration tester ritengono che l’aspetto fisico del test sia il più divertente perché vengono essenzialmente pagati per entrare nella struttura di un obiettivo. Questo tipo di test può aiutare a evidenziare eventuali punti deboli nel perimetro fisico nonché eventuali meccanismi di sicurezza presenti, come guardie, cancelli e recinzioni. Il risultato dovrebbe essere una valutazione dei controlli di sicurezza fisica esterni. La maggior parte dei compromessi oggi inizia con una sorta di attacco di ingegneria sociale. Potrebbe trattarsi di una telefonata, un’e-mail, un sito Web, un messaggio SMS e così via. È importante testare come i tuoi dipendenti gestiscono questo tipo di situazioni. Questo tipo di test viene spesso omesso dall’ambito di un test di penetrazione principalmente perché coinvolge principalmente il test delle persone anziché della tecnologia. Nella maggior parte dei casi il management non è d’accordo con questo tipo di approccio. Tuttavia, è importante avere una visione reale degli ultimi metodi di attacco. Il risultato di un test di ingegneria sociale dovrebbe essere quello di valutare il programma di sensibilizzazione alla sicurezza in modo da poterlo migliorare. Non dovrebbe servire a identificare gli individui che non superano il test. Uno degli strumenti di cui parleremo di più in un modulo successivo è il Social-Engineer Toolkit (SET), creato da Dave Kennedy. Questo è un ottimo strumento per eseguire campagne di test di ingegneria sociale.
Suggerimento: i programmi Bug Bounty consentono ai ricercatori di sicurezza e ai penetration tester di ottenere un riconoscimento (e spesso un compenso monetario) per aver individuato vulnerabilità in siti Web, applicazioni o qualsiasi altro tipo di sistema. Aziende come Microsoft, Apple e Cisco e persino istituzioni governative come il Dipartimento della Difesa degli Stati Uniti (DoD) utilizzano programmi di bug bounty per premiare i professionisti della sicurezza quando trovano vulnerabilità nei loro sistemi. Molte società di sicurezza, come HackerOne, Bugcrowd, Intigriti e SynAck, forniscono piattaforme per aziende e professionisti della sicurezza per partecipare a programmi bug bounty. Questi programmi sono diversi dai tradizionali test di penetrazione, ma hanno un obiettivo simile: individuare le vulnerabilità della sicurezza per consentire all’organizzazione di risolverle prima che gli aggressori possano sfruttare tali vulnerabilità. Suggerimenti e risorse per la ricompensa dei bug nel seguente repository GitHub: https://github.com/The-Art-of-Hacking/h4cker/tree/master/bug-bounties.
Quando si parla di metodi di penetration test, è probabile che si sentano i termini ambiente sconosciuto (precedentemente noto come black-box), ambiente noto (precedentemente noto come white-box) e ambiente parzialmente noto (precedentemente noto come grey-box). test. Questi termini vengono utilizzati per descrivere la prospettiva da cui viene eseguito il test, nonché la quantità di informazioni fornite al tester:
Test in ambiente sconosciuto
In un test di penetrazione in un ambiente sconosciuto, al tester viene generalmente fornita solo una quantità molto limitata di informazioni. Ad esempio, al tester possono essere forniti solo i nomi di dominio e gli indirizzi IP che rientrano nell’ambito di un particolare target. L’idea di questo tipo di limitazione è di far sì che il tester inizi con la prospettiva che potrebbe avere un utente malintenzionato esterno. In genere, un utente malintenzionato individua innanzitutto un obiettivo e quindi inizia a raccogliere informazioni sull’obiettivo, utilizzando informazioni pubbliche, e ottiene sempre più informazioni da utilizzare negli attacchi. Il tester non avrebbe una conoscenza preliminare dell’organizzazione e dell’infrastruttura del target. Un altro aspetto dei test in ambiente sconosciuto è che a volte il personale di supporto di rete del target potrebbe non ricevere informazioni su quando esattamente avrà luogo il test. Ciò consente anche lo svolgimento di un esercizio di difesa ed elimina il problema di un bersaglio che si prepara per il test e non fornisce una visione del mondo reale di come appare realmente la situazione di sicurezza.
Test dell’ambiente noto
In un penetration test in un ambiente noto, il tester inizia con una quantità significativa di informazioni sull’organizzazione e sulla sua infrastruttura. Al tester verrebbero normalmente forniti elementi come diagrammi di rete, indirizzi IP, configurazioni e un set di credenziali utente. Se l’ambito include una valutazione dell’applicazione, al tester potrebbe essere fornito anche il codice sorgente dell’applicazione di destinazione. L’idea di questo tipo di test è identificare il maggior numero possibile di buchi di sicurezza. In un test in un ambiente sconosciuto, lo scopo potrebbe essere solo quello di identificare un percorso all’interno dell’organizzazione e fermarsi lì. Con i test in ambienti noti, l’ambito è in genere molto più ampio e include il controllo della configurazione della rete interna e la scansione dei computer desktop per individuare eventuali difetti. Tempo e denaro sono in genere fattori decisivi nella determinazione del tipo di test di penetrazione da completare. Se un’azienda ha preoccupazioni specifiche su un’applicazione, un server o un segmento dell’infrastruttura, può fornire informazioni su quell’obiettivo specifico per ridurre la portata e la quantità di tempo dedicato al test ma ottenere comunque i risultati desiderati. Con la sofisticatezza e le capacità degli avversari attuali, è probabile che la maggior parte delle reti prima o poi venga compromessa e un approccio white-box non è una cattiva opzione.
Test ambientale parzialmente noto
Un test di penetrazione in un ambiente parzialmente noto è in qualche modo un approccio ibrido tra test in ambiente sconosciuto e noto. Con i test dell’ambiente parzialmente noto, ai tester potrebbero essere fornite le credenziali ma non la documentazione completa dell’infrastruttura di rete. Ciò consentirebbe ai tester di fornire comunque i risultati dei loro test dal punto di vista di un aggressore esterno. Considerando il fatto che la maggior parte delle compromissioni iniziano dal client e si diffondono attraverso la rete, un buon approccio sarebbe un ambito in cui i tester iniziano dall’interno della rete e hanno accesso a una macchina client. Quindi potrebbero ruotare all’interno della rete per determinare quale sarebbe l’impatto di una compromissione.
Types of Penetration Tests – Indagine su standard e metodologie diverse
Esistono numerose metodologie di test di penetrazione in circolazione da un po’ di tempo e continuano ad essere aggiornate man mano che emergono nuove minacce.
Di seguito è riportato un elenco di alcune delle metodologie di test di penetrazione più comuni e di altri standard:
MITRE ATT&CK
Il framework MITRE ATT&CK (https://attack.mitre.org) è una risorsa straordinaria per conoscere le tattiche, le tecniche e le procedure (tactics, techniques, and procedures -TTP) di un avversario. Sia i professionisti della sicurezza offensiva (penetration tester, red teamer, cacciatori di bug e così via) che gli addetti alla risposta agli incidenti e i team di caccia alle minacce utilizzano oggi il framework MITRE ATT&CK. Il framework MITRE ATT&CK è una raccolta di diverse matrici di tattiche, tecniche e sottotecniche. Queste matrici, tra cui Enterprise ATT&CK Matrix, Network, Cloud, ICS e Mobile, elencano le tattiche e le tecniche utilizzate dagli avversari mentre si preparano a un attacco, inclusa la raccolta di informazioni (intelligence open source [OSINT], identificazione delle debolezze tecniche e delle persone, e altro) nonché diverse tecniche di sfruttamento e post-sfruttamento.
OWASP WSTG
La OWASP Web Security Testing Guide (WSTG) è una guida completa focalizzata sul test delle applicazioni web. È una raccolta di molti anni di lavoro dei membri OWASP. OWASP WSTG copre le fasi di alto livello dei test di sicurezza delle applicazioni web e approfondisce i metodi di test utilizzati. Ad esempio, arriva fino a fornire vettori di attacco per testare attacchi cross-site scripting (XSS), attacchi XML external entità (XXE), cross-site request forgery (CSRF) e attacchi SQL injection; nonché su come prevenire e mitigare questi attacchi. Dal punto di vista dei test di sicurezza delle applicazioni web, OWASP WSTG è la guida più dettagliata e completa disponibile. Puoi trovare OWASP WSTG e le relative informazioni sul progetto su https://owasp.org/www-project-web-security-testing-guide/.
NIST SP 800-115
La pubblicazione speciale (SP) 800-115 è un documento creato dal National Institute of Standards and Technology (NIST), che fa parte del Dipartimento del commercio degli Stati Uniti. NIST SP 800-115 fornisce alle organizzazioni linee guida sulla pianificazione e la conduzione di test sulla sicurezza delle informazioni. Ha sostituito il precedente documento standard, SP 800-42. SP 800-115 è considerato uno standard di settore per la guida ai test di penetrazione ed è citato in molti altri standard e documenti di settore. È possibile accedere al NIST SP 800-115 all’indirizzo https://csrc.nist.gov/publications/detail/sp/800-115/final.
OSSTMM
Il Manuale della metodologia di test della sicurezza open source (Open Source Security Testing Methodology Manual – OSSTMM), sviluppato da Pete Herzog, esiste da molto tempo. Distribuito dall’Institute for Security and Open Methodologies (ISECOM), l’OSSTMM è un documento che definisce test di sicurezza ripetibili e coerenti (https://www.isecom.org). L’OSSTMM ha le seguenti sezioni chiave:
Operational Security Metrics
Trust Analysis
Work Flow
Human Security Testing
Physical Security Testing
Wireless Security Testing
Telecommunications Security Testing
Data Networks Security Testing
Compliance Regulations
Reporting with the Security Test Audit Report (STAR)
PTES
Il Penetration Testing Execution Standard (PTES) (http://www.pentest-standard.org) fornisce informazioni sui tipi di attacchi e metodi e fornisce informazioni sugli strumenti più recenti disponibili per eseguire i metodi di test. PTES prevede sette fasi distinte:
Pre-engagement interactions
Intelligence gathering
Threat modeling
Vulnerability analysis
Exploitation
Post-exploitation
Reporting
ISSAF
L’Information Systems Security Assessment Framework (ISSAF) è un’altra metodologia di test di penetrazione simile alle altre presenti in questo elenco con alcune fasi aggiuntive. ISSAF copre le seguenti fasi:
Information gathering
Network mapping
Vulnerability identification
Penetration
Gaining access and privilege escalation
Enumerating further
Compromising remote users/sites
Maintaining access
Covering the tracks
Confronta le metodologie di Pentesting
Ci sono così tante parti in movimento in un test di penetrazione che è facile perdere traccia di ciò che è stato trattato e di ciò che non lo è stato.
Nessuna singola metodologia è adatta ai requisiti di ogni incarico; tuttavia è importante fondare la propria attività su standard e metodologie sviluppate da organizzazioni di sicurezza ed esperti riconosciuti.
Costruisci il tuo laboratorio
Le abilità si acquisiscono con la pratica, ma come puoi esercitarti se non hai qualcosa su cui farlo?
Quando si tratta di test di penetrazione, un ambiente di laboratorio adeguato è molto importante. L’aspetto di questo ambiente dipende dal tipo di test che stai eseguendo. Anche i tipi di strumenti utilizzati in un laboratorio variano in base a diversi fattori. Qui tocchiamo solo alcuni dei tipi di strumenti utilizzati nei penetration test. Che tu stia eseguendo test di penetrazione sulla rete di un cliente, sulla tua rete o su un dispositivo specifico, hai sempre bisogno di un qualche tipo di ambiente di laboratorio da utilizzare per i test. Ad esempio, quando si testa la rete di un cliente, molto probabilmente si eseguirà la maggior parte dei test sugli ambienti di produzione o di staging del cliente perché questi sono gli ambienti di cui un cliente si preoccupa in genere di proteggere adeguatamente. Poiché questo potrebbe essere un ambiente di rete critico, devi essere sicuro che i tuoi strumenti siano collaudati e veri – ed è qui che entra in gioco il tuo ambiente di test di laboratorio. Dovresti sempre testare i tuoi strumenti e le tue tecniche nel tuo ambiente di laboratorio prima di eseguirli contro un cliente rete. Non vi è alcuna garanzia che gli strumenti utilizzati non rompano qualcosa. In effetti, molti strumenti sono progettati per “rompere le cose”. È quindi necessario sapere cosa aspettarsi prima di utilizzare gli strumenti su una rete di clienti. Quando si testa un dispositivo o una soluzione specifica che si trova solo in un ambiente di laboratorio, c’è meno preoccupazione di danneggiare qualcosa. Con questo tipo di test, in genere si utilizza una rete chiusa che può essere facilmente ripristinata se necessario.
Esistono molte distribuzioni Linux diverse che includono strumenti e risorse per test di penetrazione, come Kali Linux (kali.org), Parrot OS (parrotsec.org) e BlackArch (blackarch.org). Queste distribuzioni Linux forniscono un ambiente molto conveniente per iniziare a conoscere i diversi strumenti e metodologie di sicurezza utilizzati nei pen test. Puoi implementare un laboratorio di test di penetrazione basico utilizzando solo un paio di VM in ambienti di virtualizzazione come Virtual Box (virtualbox.org) o VMware Workstation/Fusion (vmware.com).
La Figura 1-1 mostra due VM (una con sistema operativo Parrot e un’altra con un sistema Microsoft Windows vulnerabile). Le due VM sono connesse tramite una configurazione di switch virtuale e una “rete solo host”. Questo tipo di configurazione consente di eseguire diversi attacchi e inviare pacchetti IP tra VM senza che tali pacchetti lascino il sistema fisico (bare metal).
Figura 1-1 – Ambiente di laboratorio di Penetration Testing di base con due VM.
Suggerimento: è possibile avviare un laboratorio di apprendimento di base con una sola VM. Ad esempio, Omar Santos ha creato un ambiente di apprendimento gratuito chiamato WebSploit Labs che puoi distribuire su una singola VM. Include numerose risorse, strumenti di sicurezza informatica e diverse applicazioni intenzionalmente vulnerabili in esecuzione nei contenitori Docker. WebSploit Labs include più di 450 esercizi diversi che puoi completare per mettere in pratica le tue abilità in un ambiente sicuro. È possibile ottenere ulteriori informazioni su WebSploit Labs su websploit.org. La VM scaricata nel lab più avanti in questo argomento è una versione personalizzata dell’ambiente lab di Omar Santos.
La Figura 1-2 mostra una topologia più elaborata per un ambiente di laboratorio di test di penetrazione.
Requisiti e linee guida per i laboratori di penetration testing
Ora analizziamo un po’ più a fondo come potrebbe apparire un ambiente di laboratorio per test di penetrazione e alcune best practice per la creazione di un laboratorio di questo tipo. La tabella seguente contiene un elenco di requisiti e linee guida per un tipico ambiente di test di penetrazione.
Requisiti o linee guida
Descrizione
Network chiuso
È necessario garantire un accesso controllato da e verso l’ambiente di laboratorio e un accesso limitato a Internet
Ambiente informatico virtualizzato
Ciò consente una facile distribuzione e ripristino dei dispositivi sottoposti a test
Ambiente realistico
Se stai allestendo un ambiente di test, dovrebbe corrispondere il più fedelmente possibile all’ambiente reale
Monitoraggio della “salute”
Quando qualcosa si blocca, devi essere in grado di determinare il motivo per cui è successo
Risorse hardware sufficienti
È necessario essere sicuri che la mancanza di risorse non sia la causa di risultati falsi
Sistemi operativi multipli
Molte volte vorrai testare o convalidare un risultato da un altro sistema. È sempre bene eseguire test su diversi sistemi operativi per vedere se i risultati differiscono
Strumenti duplicati
Un ottimo modo per convalidare un risultato è eseguire lo stesso test con uno strumento diverso per vedere se i risultati sono gli stessi
Obiettivi pratici
Devi esercitarti a usare i tuoi strumenti. Per fare ciò, è necessario esercitarsi su obiettivi noti per essere vulnerabili
Elenco di requisiti e linee guida per un tipico ambiente di test di penetrazione
Quali strumenti dovresti utilizzare nel tuo laboratorio?
Ci dedicheremo appieno agli strumenti di penetration testing in seguito. Pertanto, questa sezione “graffia” solo la superficie. Fondamentalmente, gli strumenti utilizzati nei test di penetrazione dipendono dal tipo di test che stai eseguendo. Se stai eseguendo test nell’ambiente di un cliente, probabilmente valuterai varie superfici di attacco, come ad esempio l’infrastruttura di rete, l’infrastruttura wireless, i server Web, i server di database, i sistemi Windows o i sistemi Linux.
Gli strumenti basati sull’infrastruttura di rete potrebbero includere strumenti per lo sniffing o la manipolazione del traffico, inondando i dispositivi di rete e aggirando firewall e IPS. A scopo di test wireless, potresti utilizzare strumenti per violare la crittografia wireless, rimuovere l’autorizzazione dei dispositivi di rete ed eseguire attacchi sul percorso (chiamati anche attacchi man-in-the-middle).
Quando si testano applicazioni e servizi web, è possibile trovare una serie di strumenti automatizzati creati appositamente per la scansione e il rilevamento delle vulnerabilità web, nonché strumenti di test manuali come i proxy di intercettazione. Alcuni di questi stessi strumenti possono essere utilizzati per verificare le vulnerabilità del database (come le vulnerabilità SQL injection).
Per testare le piattaforme server e client in un ambiente, è possibile utilizzare una serie di strumenti automatizzati di scansione delle vulnerabilità per identificare elementi come software obsoleto e configurazioni errate. Con l’intenso sviluppo rivolto alle piattaforme mobili, c’è una crescente necessità di testare queste applicazioni e i server che le supportano. Per tali test, è necessario un altro set di strumenti specifici per testare le applicazioni mobili e le API back-end con cui in genere comunicano. E non bisogna dimenticare gli strumenti di fuzzing, che vengono normalmente utilizzati per testare la robustezza dei protocolli.
Suggerimento: Omar Santos ha creato un repository GitHub che include numerose risorse sulla sicurezza informatica. È presente una sezione dedicata a fornire indicazioni su come costruire diversi laboratori di test di penetrazione e dove trovare applicazioni, server e strumenti vulnerabili per esercitare le proprie capacità in un ambiente sicuro. È possibile accedere al repository su https://h4cker.org/github. Puoi accedere direttamente alla sezione “Building Your Own Cybersecurity Lab and Cyber Range” su https://github.com/The-Art-of-Hacking/h4cker/tree/master/build_your_own_lab.
Cosa succede se rompi qualcosa?
Essere in grado di ripristinare l’ambiente di laboratorio è importante per molte ragioni. Come discusso in precedenza, quando si eseguono test di penetrazione, si rompono le cose; a volte quando rompi le cose, non si riprendono da sole. Ad esempio, quando stai testando applicazioni web, alcuni degli attacchi che invii inseriranno dati fasulli nei campi del modulo e tali dati probabilmente finiranno nel database, quindi il tuo database sarà riempito con quei dati fasulli. Ovviamente, in un ambiente di produzione, questa non è una buona cosa. I dati immessi possono anche essere di natura dannosa, come attacchi di scripting e injection. Ciò può causare anche il danneggiamento del database. Naturalmente, sai che questo sarebbe un problema in un ambiente di produzione. È un problema anche in un ambiente di laboratorio se non si dispone di un modo semplice per il ripristino. Senza un metodo di ripristino rapido, probabilmente rimarresti bloccato nella ricostruzione del sistema sottoposto a test. Questo può richiedere molto tempo e, se lo stai facendo per un cliente, può influire sulla tua sequenza temporale complessiva.
L’utilizzo di un qualche tipo di ambiente virtuale è l’ideale in quanto offre funzionalità di snapshot e ripristino dello stato del sistema. A volte, però, questo non è possibile. Ad esempio, potresti testare un sistema che non può essere virtualizzato. In tal caso, è necessario disporre di un backup completo del sistema o dell’ambiente. In questo modo, puoi tornare rapidamente indietro e testare se qualcosa si danneggia, perché molto probabilmente lo farà. Dopotutto, stai eseguendo test di penetrazione.
Raccolta di informazioni e scansione delle vulnerabilità
Introduzione
Il primo passo che un autore di minacce compie quando pianifica un attacco è raccogliere informazioni sull’obiettivo. Questo atto di raccolta di informazioni è noto come ricognizione. Gli aggressori utilizzano strumenti di scansione ed enumerazione insieme alle informazioni pubbliche disponibili su Internet per creare un dossier su un obiettivo. Come puoi immaginare, come penetration tester, devi anche replicare questi metodi per determinare l’esposizione delle reti e dei sistemi che stai cercando di difendere. Questo modulo inizia con una discussione su cosa sia la ricognizione in generale e sulla differenza tra metodi passivi e attivi. Imparerai brevemente alcuni degli strumenti e delle tecniche più comuni utilizzati. Da lì, il modulo approfondisce il processo di scansione delle vulnerabilità e il funzionamento degli strumenti di scansione, incluso come analizzare i risultati dello scanner delle vulnerabilità per fornire risultati utili ed esplorare il processo di sfruttamento delle informazioni raccolte nella fase di sfruttamento. Il modulo si conclude con la trattazione di alcune delle sfide più comuni da considerare quando si eseguono scansioni di vulnerabilità.
Effettuare la Ricognizione Passiva
Ricognizione
La ricognizione è sempre il primo passo in un attacco informatico. Un aggressore deve prima raccogliere informazioni sul bersaglio per avere successo. In effetti, il termine ricognizione è ampiamente utilizzato nel mondo militare per descrivere la raccolta di informazioni sul nemico, come informazioni sulla posizione, sulle capacità e sui movimenti del nemico. Questo tipo di informazioni è necessario per eseguire con successo un attacco. La ricognizione in un impegno di test di penetrazione consiste tipicamente nella scansione e nell’enumerazione. Ma che aspetto ha la ricognizione dal punto di vista di un attaccante?
Ricognizione Attiva vs. Ricognizione Passiva
La ricognizione attiva è un metodo di raccolta di informazioni in cui gli strumenti utilizzati inviano effettivamente sonde alla rete o ai sistemi target per ottenere risposte che vengono poi utilizzate per determinare la posizione della rete o del sistema. Queste sonde possono utilizzare vari protocolli e più livelli di aggressività, in genere in base a cosa viene scansionato e quando. Ad esempio, potresti eseguire la scansione di un dispositivo come una stampante che non dispone di uno stack TCP/IP o di un hardware di rete molto robusto. Inviando sonde attive, potresti mandare in crash un dispositivo del genere. La maggior parte dei dispositivi moderni non presenta questo problema; tuttavia, è possibile, quindi quando si esegue la scansione attiva, è necessario esserne consapevoli e regolare di conseguenza le impostazioni dello scanner.
La ricognizione passiva è un metodo di raccolta di informazioni in cui gli strumenti non interagiscono direttamente con il dispositivo o la rete di destinazione. Esistono molteplici metodi di ricognizione passiva. Alcuni implicano l’utilizzo di database di terze parti per raccogliere informazioni. Altri utilizzano anche strumenti in modo tale da non essere rilevati dal bersaglio. Questi strumenti, in particolare, funzionano semplicemente ascoltando il traffico sulla rete e utilizzando l’intelligenza per dedurre informazioni sulla comunicazione dei dispositivi in rete. Questo approccio è molto meno invasivo su una rete ed è altamente improbabile che questo tipo di ricognizione possa mandare in crash un sistema come una stampante. Dato che non produce traffico, è improbabile che venga rilevato e non solleva alcun flag sulla rete che sta monitorando. Un altro scenario in cui uno scanner passivo potrebbe rivelarsi utile sarebbe quello per un penetration tester che deve eseguire analisi su una rete di produzione che non può essere interrotta. La tecnica di ricognizione passiva che utilizzi dipende dal tipo di informazioni che desideri ottenere. Uno degli aspetti più importanti dell’apprendimento dei penetration test è lo sviluppo di una buona metodologia che ti aiuterà a selezionare gli strumenti e le tecnologie appropriati da utilizzare durante il coinvolgimento.
Gli strumenti e i metodi comuni di ricognizione attiva includono quanto segue:
Host enumeration
Network enumeration
User enumeration
Group enumeration
Network share enumeration
Web page enumeration
Application enumeration
Service enumeration
Packet crafting
Gli strumenti e i metodi comuni di ricognizione passiva includono quanto segue:
In questa sezione spiegheremo cos’è l’OS command injection, descriveremo come le vulnerabilità possono essere rilevate e sfruttate, spiegheremo alcuni comandi e tecniche utili per diversi sistemi operativi e riassumeremo come prevenire l’OS command injection.
Che cos’è l’OS command injection?
L’OS command injection (nota anche come iniezione della shell) è una vulnerabilità della sicurezza Web che consente a un utente malintenzionato di eseguire comandi arbitrari del sistema operativo (OS) sul server che esegue un’applicazione e in genere di compromettere completamente l’applicazione e tutti i suoi dati. Molto spesso, un utente malintenzionato può sfruttare una vulnerabilità legata all’OS command injection per compromettere altre parti dell’infrastruttura di hosting, sfruttando le relazioni di fiducia per indirizzare l’attacco verso altri sistemi all’interno dell’organizzazione.
Esecuzione di comandi arbitrari
Consideriamo un’applicazione per lo shopping che consenta all’utente di visualizzare se un articolo è disponibile in un particolare negozio. È possibile accedere a queste informazioni tramite un URL come:
Per fornire le informazioni sulle scorte, l’applicazione deve interrogare vari sistemi legacy. Per ragioni storiche, la funzionalità viene implementata richiamando un comando di shell con gli ID del prodotto e del negozio come argomenti:
stockreport.pl 381 29
Questo comando restituisce lo stato delle scorte per l’articolo specificato, che viene restituito all’utente.
Poiché l’applicazione non implementa difese contro l’OS command injection, un utente malintenzionato può inviare il seguente input per eseguire un comando arbitrario:
& echo aiwefwlguh &
Se questo input viene inviato nel parametro productID, il comando eseguito dall’applicazione è:
stockreport.pl & echo aiwefwlguh & 29
Il comando echo fa semplicemente sì che la stringa fornita venga ripetuta nell’output ed è un modo utile per testare alcuni tipi di command injection del sistema operativo. Il carattere & è un separatore di comandi della shell, quindi ciò che viene eseguito sono in realtà tre comandi separati uno dopo l’altro. Di conseguenza, l’output restituito all’utente è:
Error - productID was not provided
aiwefwlguh
29: command not found
Le tre linee di output dimostrano che:
Il comando stockreport.pl originale è stato eseguito senza gli argomenti previsti e quindi ha restituito un messaggio di errore.
Il comando echo inserito è stato eseguito e la stringa fornita è stata riprodotta nell’output.
L’argomento originale 29 è stato eseguito come comando, causando un errore.
Posizionare il separatore & dopo il comando inserito è generalmente utile perché separa il comando inserito da tutto ciò che segue il punto di iniezione. Ciò riduce la probabilità che quello che segue impedisca l’esecuzione del comando inserito.
Una volta identificata una vulnerabilità di command injection del sistema operativo, è generalmente utile eseguire alcuni comandi iniziali per ottenere informazioni sul sistema che è stato compromesso. Di seguito è riportato un riepilogo di alcuni comandi utili sulle piattaforme Linux e Windows:
Scopo del comando
Linux
Windows
Nome dell’utente corrente
whoami
whoami
Sistema operativo
uname -a
ver
Configurazione di rete
ifconfig
ipconfig /all
Connessioni di rete
netstat -an
netstat -an
Processi in esecuzione
ps -ef
tasklist
Comandi utili
Vulnerabilità Blind OS command injection
Molti casi di command injection del sistema operativo sono vulnerabilità cieche. Ciò significa che l’applicazione non restituisce l’output del comando all’interno della sua risposta HTTP. Le vulnerabilità cieche possono ancora essere sfruttate, ma sono necessarie tecniche diverse.
Considera un sito web che consenta agli utenti di inviare feedback sul sito. L’utente inserisce il proprio indirizzo e-mail e il messaggio di feedback. L’applicazione lato server genera quindi un’e-mail all’amministratore del sito contenente il feedback. Per fare ciò, chiama il programma di posta con i dettagli inviati. Per esempio:
mail -s “This site is great” -aFrom:peter@normal-user.net feedback@vulnerable-website.com
L’output del comando mail (se presente) non viene restituito nelle risposte dell’applicazione, pertanto l’utilizzo del payload echo non sarebbe efficace. In questa situazione, è possibile utilizzare una serie di altre tecniche per rilevare e sfruttare una vulnerabilità.
Rilevamento del blind OS command injection utilizzando ritardi temporali
È possibile utilizzare un comando iniettato che attiverà un ritardo temporale, consentendo di confermare che il comando è stato eseguito in base al tempo impiegato dall’applicazione per rispondere. Il comando ping è un modo efficace per farlo, poiché consente di specificare il numero di pacchetti ICMP da inviare e quindi il tempo impiegato per l’esecuzione del comando:
& ping -c 10 127.0.0.1 &
Questo comando farà sì che l’applicazione esegua il ping della scheda di rete loopback per 10 secondi.
Sfruttare il blind OS command injection reindirizzando l’output
Puoi reindirizzare l’output del comando inserito in un file all’interno della radice web che puoi quindi recuperare utilizzando il browser. Ad esempio, se l’applicazione fornisce risorse statiche dalla posizione del file system /var/www/static, puoi inviare il seguente input:
& whoami > /var/www/static/whoami.txt &
Il carattere > invia l’output del comando whoami al file specificato. È quindi possibile utilizzare il browser per recuperare https://vulnerable-website.com/whoami.txt per recuperare il file e visualizzare l’output del comando inserito.
Sfruttare il blind OS command injection utilizzando tecniche fuori banda (OAST).
Puoi utilizzare un command injection che attiverà un’interazione di rete fuori banda con un sistema da te controllato, utilizzando le tecniche OAST.. Per esempio:
& nslookup kgji2ohoyw.web-attacker.com &
Questo payload utilizza il comando nslookup per provocare una ricerca DNS per il dominio specificato. L’aggressore può monitorare il verificarsi della ricerca specificata e quindi rilevare che il comando è stato inserito con successo.
È possibile utilizzare una varietà di metacaratteri della shell per eseguire attacchi di command injection del sistema operativo.
Un certo numero di caratteri funziona come separatori di comandi, consentendo di concatenare i comandi. I seguenti separatori di comandi funzionano sia sui sistemi basati su Windows che su Unix:
&
&&
|
||
I seguenti separatori di comandi funzionano solo su sistemi basati su Unix:
;
Nuova riga (0x0a oppure \n)
Sui sistemi basati su Unix, puoi anche utilizzare i backtick o il carattere del dollaro per eseguire l’esecuzione in linea di un comando inserito all’interno del comando originale:
`
comando iniettato `
$ (
comando iniettato)
Si noti che i diversi metacaratteri della shell hanno comportamenti leggermente diversi che potrebbero influenzare il loro funzionamento in determinate situazioni.
A volte, l’input che controlli appare tra virgolette nel comando originale. In questa situazione, è necessario terminare il contesto citato (utilizzando “ oppure ’) prima di utilizzare i metacaratteri della shell adatti per inserire un nuovo comando.
Come prevenire gli attacchi di OS command injection
Di gran lunga il modo più efficace per prevenire le vulnerabilità di OS command injection è non richiamare mai i comandi del sistema operativo dal codice a livello di applicazione. Praticamente in ogni caso, esistono modi alternativi per implementare la funzionalità richiesta utilizzando API della piattaforma più sicure.
Se si ritiene inevitabile richiamare i comandi del sistema operativo con l’input fornito dall’utente, è necessario eseguire una valida convalida dell’input. Alcuni esempi di validazione efficace includono:
Convalida rispetto a una whitelist di valori consentiti.
Convalidare che l’input è un numero.
Convalidare che l’input contenga solo caratteri alfanumerici, nessun’altra sintassi o spazi bianchi.
Non tentare mai di ripulire l’input eseguendo l’escape dei metacaratteri della shell. In pratica, questo è semplicemente troppo soggetto a errori e vulnerabile alle attività di un utente malintenzionato esperto.
Continua il percorso di apprendimento suggerito da “PortSwigger Academy”. Consiglio di iscriversi alla piattaforma, seguire le lezioni e soprattutto svolgere e completare i lab 🙂
Directory traversal
In questa sezione spiegheremo cos’è il “directory traversal” o “path traversal”, descriveremo come eseguire attacchi di directory traversal e aggirare gli ostacoli comuni e spiegheremo come prevenire tali vulnerabilità.
Cos’è il directory traversal?
L’attraversamento delle directory “directory traversal” (noto anche come attraversamento del percorso dei file “path traversal”) è una vulnerabilità della sicurezza Web che consente a un utente malintenzionato di leggere file arbitrari sul server su cui è in esecuzione un’applicazione. Ciò potrebbe includere codice e dati dell’applicazione, credenziali per sistemi back-end e file sensibili del sistema operativo. In alcuni casi, un utente malintenzionato potrebbe essere in grado di scrivere su file arbitrari sul server, consentendogli di modificare i dati o il comportamento dell’applicazione e, infine, di assumere il pieno controllo del server.
Lettura di file arbitrari tramite directory traversal
Considera un’applicazione per lo shopping che visualizza immagini di articoli in vendita. Le immagini vengono caricate tramite codice HTML come il seguente:
<img src="/loadImage?filename=218.png">
L’URL loadImage accetta un parametro filename e restituisce il contenuto del file specificato. I file immagine stessi sono archiviati su disco nella posizione /var/www/images/. Per restituire un’immagine, l’applicazione aggiunge il filename richiesto a questa directory di base e utilizza un’API del file system per leggere il contenuto del file. Nel caso precedente, l’applicazione legge dal seguente percorso:
/var/www/images/218.png
L’applicazione non implementa difese contro gli attacchi di directory traversal, quindi un utente malintenzionato può richiedere il seguente URL per recuperare un file arbitrario dal file system del server:
Ciò fa sì che l’applicazione legga dal seguente percorso di file:
/var/www/images/../../../etc/passwd
La sequenza ../ è valida all’interno di un percorso di file e significa salire di un livello nella struttura delle directory. Le tre sequenze ../ consecutive salgono da /var/www/images/ alla root del filesystem, e quindi il file che viene effettivamente letto è:
/etc/passwd
Sui sistemi operativi basati su Unix, questo è un file standard contenente i dettagli degli utenti registrati sul server.
Su Windows, sia ../ che ..\ sono sequenze di directory traversal valide e un attacco equivalente per recuperare un file del sistema operativo standard sarebbe:
Ostacoli comuni allo sfruttamento delle vulnerabilità del file path traversal
Molte applicazioni che inseriscono l’input dell’utente nei percorsi dei file implementano una sorta di difesa contro gli attacchi di path traversal e questi possono spesso essere aggirati.
Se un’applicazione rimuove o blocca le sequenze di directory traversal dal nome file fornito dall’utente, potrebbe essere possibile aggirare la difesa utilizzando una varietà di tecniche.
Potresti essere in grado di utilizzare un percorso assoluto dalla radice del filesystem, come filename=/etc/passwd, per fare riferimento direttamente a un file senza utilizzare alcuna sequenza trasversale.
Potresti essere in grado di utilizzare sequenze di attraversamento nidificate, come ….// o ….\/, che torneranno a sequenze di attraversamento semplici quando la sequenza interna viene rimossa.
In alcuni contesti, ad esempio in un percorso URL o nel parametro del filename di una richiesta multipart/form-data, i server Web potrebbero eliminare qualsiasi sequenza di attraversamento della directory prima di passare l’input all’applicazione. A volte è possibile ignorare questo tipo di sanificazione mediante la codifica dell’URL, o anche la doppia codifica dell’URL, i caratteri ../, risultando rispettivamente in %2e%2e%2f o %252e%252e%252f. Anche varie codifiche non standard, come ..%c0%af o ..%ef%bc%8f, possono funzionare allo stesso modo.
Per gli utenti di Burp Suite Professional, Burp Intruder fornisce un elenco di payload predefinito (Fuzzing – path traversal), che contiene una varietà di sequenze di percorso trasversale codificate che puoi provare.
Se un’applicazione richiede che il nome file fornito dall’utente inizi con la cartella di base prevista, ad esempio /var/www/images, potrebbe essere possibile includere la cartella di base richiesta seguita da sequenze di attraversamento adeguate. Per esempio:
Se un’applicazione richiede che il nome file fornito dall’utente termini con un’estensione di file prevista, ad esempio .png, potrebbe essere possibile utilizzare un byte null per terminare in modo efficace il percorso del file prima dell’estensione richiesta. Per esempio:
Il modo più efficace per prevenire le vulnerabilità legate al file path traversal è evitare del tutto di passare l’input fornito dall’utente alle API del filesystem. Molte funzioni dell’applicazione che eseguono questa operazione possono essere riscritte per fornire lo stesso comportamento in modo più sicuro.
Se si ritiene inevitabile passare l’input fornito dall’utente alle API del filesystem, è necessario utilizzare insieme due livelli di difesa per prevenire gli attacchi:
L’applicazione dovrebbe convalidare l’input dell’utente prima di elaborarlo. Idealmente, la convalida dovrebbe essere confrontata con una whitelist di valori consentiti. Se ciò non è possibile per la funzionalità richiesta, la convalida dovrebbe verificare che l’input contenga solo contenuti consentiti, ad esempio caratteri puramente alfanumerici.
Dopo aver convalidato l’input fornito, l’applicazione dovrebbe aggiungere l’input alla directory di base e utilizzare un’API del file system della piattaforma per canonizzare il percorso. Dovrebbe verificare che il percorso canonizzato inizi con la directory di base prevista.
Di seguito è riportato un esempio di un semplice codice Java per convalidare il percorso canonico di un file in base all’input dell’utente:
File file = new File(BASE_DIRECTORY, userInput);
if (file.getCanonicalPath().startsWith(BASE_DIRECTORY)) {
// process file
}
Continua il percorso di apprendimento suggerito da “PortSwigger Academy”. Consiglio di iscriversi alla piattaforma, seguire le lezioni e soprattutto svolgere e completare i lab 🙂
Authentication
Authentication vulnerabilities
Almeno concettualmente, le vulnerabilità dell’autenticazione sono alcuni dei problemi più semplici da comprendere. Tuttavia, possono essere tra i più critici a causa dell’ovvia relazione tra autenticazione e sicurezza. Oltre a consentire potenzialmente agli aggressori l’accesso diretto a dati e funzionalità sensibili, espongono anche una superficie di attacco aggiuntiva per ulteriori exploit. Per questo motivo, imparare a identificare e sfruttare le vulnerabilità di autenticazione, incluso come aggirare le comuni misure di protezione, è un’abilità fondamentale.
In questa sezione, esamineremo alcuni dei meccanismi di autenticazione più comuni utilizzati dai siti Web e discuteremo le potenziali vulnerabilità in essi. Evidenzieremo sia le vulnerabilità intrinseche nei diversi meccanismi di autenticazione, sia alcune vulnerabilità tipiche introdotte dalla loro implementazione impropria. Infine, forniremo alcune indicazioni di base su come garantire che i propri meccanismi di autenticazione siano il più solidi possibile.
Cos’è l’autenticazione?
L’autenticazione è il processo di verifica dell’identità di un determinato utente o client. In altre parole, implica assicurarsi che siano davvero chi affermano di essere. Almeno in parte, i siti Web sono esposti a chiunque sia connesso a Internet per progettazione. Pertanto, robusti meccanismi di autenticazione sono un aspetto integrante di un’efficace sicurezza web.
Esistono tre fattori di autenticazione in cui è possibile classificare diversi tipi di autenticazione:
Qualcosa che conosci, come una password o la risposta a una domanda di sicurezza. Questi sono a volte indicati come “fattori di conoscenza”.
Qualcosa che hai, cioè un oggetto fisico come un telefono cellulare o un token di sicurezza. Questi sono talvolta indicati come “fattori di possesso”.
Qualcosa che sei o fai, ad esempio, i tuoi dati biometrici o modelli di comportamento. Questi sono talvolta indicati come “fattori di inerenza”.
I meccanismi di autenticazione si basano su una gamma di tecnologie per verificare uno o più di questi fattori.
Qual è la differenza tra autenticazione e autorizzazione?
L’autenticazione è il processo di verifica che un utente sia veramente chi afferma di essere, mentre l’autorizzazione implica la verifica se un utente è autorizzato a fare qualcosa.
Nel contesto di un sito Web o di un’applicazione Web, l’autenticazione determina se qualcuno che tenta di accedere al sito con il nome utente Carlos123 è realmente la stessa persona che ha creato l’account.
Una volta che Carlos123 è stato autenticato, le sue autorizzazioni determinano se è autorizzato o meno, ad esempio, ad accedere alle informazioni personali su altri utenti o eseguire azioni come l’eliminazione dell’account di un altro utente.
Come nascono le vulnerabilità di autenticazione?
In generale, la maggior parte delle vulnerabilità nei meccanismi di autenticazione si presenta in due modi:
I meccanismi di autenticazione sono deboli perché non riescono a proteggere adeguatamente dagli attacchi di forza bruta.
I difetti logici o la scarsa codifica nell’implementazione consentono a un utente malintenzionato di aggirare completamente i meccanismi di autenticazione. Questo è talvolta indicato come “autenticazione interrotta”.
In molte aree dello sviluppo web, i difetti logici (logic flaws) causeranno semplicemente un comportamento imprevisto del sito Web, il che potrebbe rappresentare o meno un problema di sicurezza. Tuttavia, poiché l’autenticazione è fondamentale per la sicurezza, la probabilità che una logica di autenticazione errata esponga il sito Web a problemi di sicurezza è chiaramente elevata.
Qual è l’impatto dell’autenticazione vulnerabile?
L’impatto delle vulnerabilità di autenticazione può essere molto grave. Una volta che un utente malintenzionato ha aggirato l’autenticazione o si è introdotto con la forza bruta nell’account di un altro utente, ha accesso a tutti i dati e le funzionalità dell’account compromesso. Se sono in grado di compromettere un account con privilegi elevati, come un amministratore di sistema, potrebbero assumere il pieno controllo dell’intera applicazione e potenzialmente ottenere l’accesso all’infrastruttura interna.
Anche la compromissione di un account con privilegi limitati potrebbe comunque concedere a un utente malintenzionato l’accesso a dati che altrimenti non dovrebbe avere, come informazioni aziendali sensibili dal punto di vista commerciale. Anche se l’account non ha accesso a dati sensibili, potrebbe comunque consentire all’attaccante di accedere a pagine aggiuntive, che forniscono un’ulteriore superficie di attacco. Spesso, alcuni attacchi ad alta gravità non saranno possibili da pagine accessibili pubblicamente, ma potrebbero essere possibili da una pagina interna.
Vulnerabilità nei meccanismi di autenticazione
Il sistema di autenticazione di un sito Web è generalmente costituito da diversi meccanismi distinti in cui possono verificarsi vulnerabilità. Alcune vulnerabilità sono ampiamente applicabili in tutti questi contesti, mentre altre sono più specifiche per la funzionalità fornita.
Esamineremo più da vicino alcune delle vulnerabilità più comuni nelle seguenti aree:
Si noti che molti dei laboratori richiedono di enumerare nomi utente e password di forza bruta. Per venirci in aiuto, “PortSwigger Academy” fornisce un elenco di usernames e passwords da utilizzare per risolvere i lab.
Vulnerabilità nei meccanismi di autenticazione di terze parti
Se si è interessati ai meccanismi di autenticazione,“PortSwigger Academy” consiglia, dopo aver completato i principali laboratori di autenticazione, di provare ad affrontare i loro laboratori di autenticazione OAuth.
Prevenzione degli attacchi ai propri meccanismi di autenticazione
Abbiamo dimostrato diversi modi in cui i siti Web possono essere vulnerabili a causa del modo in cui implementano l’autenticazione. Per ridurre il rischio di tali attacchi sui propri siti web, ci sono diversi principi generali che dovresti sempre cercare di seguire.
In questa sezione esamineremo più da vicino alcune delle vulnerabilità più comuni che si verificano nei meccanismi di accesso basati su password. Suggeriremo anche modi in cui questi possono essere potenzialmente sfruttati. Ci sono anche alcuni laboratori interattivi in modo da esercitarsi sullo sfruttamento di tali vulnerabilità.
Per i siti Web che adottano un processo di accesso basato su password, gli utenti si registrano per un account da soli o ricevono un account da un amministratore. Questo account è associato a un nome utente univoco e una password segreta, che l’utente inserisce in un modulo di accesso per autenticarsi.
In questo scenario, il semplice fatto di conoscere la password segreta è considerato una prova sufficiente dell’identità dell’utente. Di conseguenza, la sicurezza del sito web verrebbe compromessa se un utente malintenzionato fosse in grado di ottenere o indovinare le credenziali di accesso di un altro utente.
Ciò può essere ottenuto in vari modi, come esploreremo di seguito.
Attacchi di forza bruta
Un attacco di forza bruta si verifica quando un utente malintenzionato utilizza un sistema di tentativi ed errori nel tentativo di indovinare credenziali utente valide. Questi attacchi sono in genere automatizzati utilizzando elenchi di parole di nomi utente e password. L’automazione di questo processo, in particolare utilizzando strumenti dedicati, consente potenzialmente a un utente malintenzionato di effettuare un numero elevato di tentativi di accesso ad alta velocità.
La forzatura bruta non è sempre solo un caso di ipotesi completamente casuali su nomi utente e password. Utilizzando anche la logica di base o le conoscenze pubblicamente disponibili, gli aggressori possono perfezionare gli attacchi di forza bruta per fare ipotesi molto più plausibili. Ciò aumenta notevolmente l’efficienza di tali attacchi. I siti Web che si basano sull’accesso basato su password come unico metodo di autenticazione degli utenti possono essere altamente vulnerabili se non implementano una protezione di forza bruta sufficiente.
Brute-forcing usernames
I nomi utente sono particolarmente facili da indovinare se sono conformi a uno schema riconoscibile, come un indirizzo e-mail. Ad esempio, è molto comune vedere gli accessi aziendali nel formato nome.cognome@società.com. Tuttavia, anche se non esiste uno schema ovvio, a volte vengono creati anche account con privilegi elevati utilizzando nomi utente prevedibili, come admin o administrator.
Durante l’audit, controlla se il sito web rivela pubblicamente potenziali nomi utente. Ad esempio, sei in grado di accedere ai profili utente senza effettuare il login? Anche se il contenuto effettivo dei profili è nascosto, il nome utilizzato nel profilo a volte è uguale al nome utente di accesso. Dovresti anche controllare le risposte HTTP per vedere se sono stati divulgati indirizzi email. Occasionalmente, le risposte contengono indirizzi e-mail di utenti con privilegi elevati come amministratori e supporto IT.
Brute-forcing passwords
Allo stesso modo, le password possono subire attacchi a forza bruta, con difficoltà che variano in base alla forza della password. Molti siti Web adottano una qualche forma di politica delle password, che costringe gli utenti a creare password ad alta entropia che, almeno in teoria, sono più difficili da decifrare utilizzando la sola forza bruta. Ciò comporta in genere l’applicazione delle password con:
Un numero minimo di caratteri
Un misto di lettere minuscole e maiuscole
Almeno un carattere speciale
Tuttavia, mentre le password ad alta entropia sono difficili da decifrare solo per i computer, possiamo utilizzare una conoscenza di base del comportamento umano per sfruttare le vulnerabilità che gli utenti introducono inconsapevolmente a questo sistema. Invece di creare una password complessa con una combinazione casuale di caratteri, gli utenti spesso prendono una password che possono ricordare e cercano di forzarla affinché si adatti alla politica della password. Ad esempio, se mypassword non è consentito, gli utenti possono provare qualcosa come Mypassword1! o invece Myp4$$w0rd.
Nei casi in cui la politica richiede agli utenti di modificare regolarmente le proprie password, è anche normale che gli utenti apportino solo modifiche minori e prevedibili alla propria password preferita. Ad esempio, Miapassword1! diventa Miapassword1? o Miapassword2!.
Questa conoscenza delle credenziali probabili e dei modelli prevedibili significa che gli attacchi di forza bruta possono spesso essere molto più sofisticati, e quindi efficaci, rispetto alla semplice ripetizione di ogni possibile combinazione di caratteri.
Username enumeration
L’enumerazione del nome utente è quando un utente malintenzionato è in grado di osservare i cambiamenti nel comportamento del sito Web per identificare se un determinato nome utente è valido.
L’enumerazione del nome utente in genere si verifica nella pagina di accesso, ad esempio, quando si immette un nome utente valido ma una password errata, oppure nei moduli di registrazione quando si immette un nome utente già utilizzato. Ciò riduce notevolmente il tempo e lo sforzo necessari per forzare un accesso in quanto l’attaccante è in grado di generare rapidamente un elenco ristretto di nomi utente validi.
Durante il tentativo di applicare la forza bruta a una pagina di accesso, dovresti prestare particolare attenzione a eventuali differenze in:
Codici di stato: durante un attacco di forza bruta, è probabile che il codice di stato HTTP restituito sia lo stesso per la stragrande maggioranza delle ipotesi perché la maggior parte di esse sarà sbagliata. Se un’ipotesi restituisce un codice di stato diverso, questa è una forte indicazione che il nome utente era corretto. È consigliabile che i siti web restituiscano sempre lo stesso codice di stato indipendentemente dal risultato, ma questa pratica non viene sempre seguita.
Messaggi di errore: a volte il messaggio di errore restituito è diverso a seconda che sia il nome utente che la password siano errati o solo la password sia errata. È buona prassi che i siti Web utilizzino messaggi generici identici in entrambi i casi, ma a volte si insinuano piccoli errori di battitura. Un solo carattere fuori posto distingue i due messaggi, anche nei casi in cui il carattere non è visibile sulla pagina visualizzata.
Tempi di risposta: se la maggior parte delle richieste è stata gestita con un tempo di risposta simile, tutte quelle che si discostano da questo suggeriscono che dietro le quinte stava accadendo qualcosa di diverso. Questa è un’altra indicazione che il nome utente indovinato potrebbe essere corretto. Ad esempio, un sito Web potrebbe verificare solo se la password è corretta se il nome utente è valido. Questo passaggio aggiuntivo potrebbe causare un leggero aumento del tempo di risposta. Questo può essere sottile, ma un utente malintenzionato può rendere questo ritardo più evidente inserendo una password eccessivamente lunga che il sito web richiede molto più tempo per essere gestita.
È molto probabile che un attacco di forza bruta comporti molte ipotesi fallite prima che l’aggressore comprometta con successo un account. Logicamente, la protezione dalla forza bruta ruota attorno al tentativo di rendere il più complicato possibile l’automazione del processo e rallentare la velocità con cui un utente malintenzionato può tentare l’accesso. I due modi più comuni per prevenire gli attacchi di forza bruta sono:
bloccare l’account a cui l’utente remoto sta tentando di accedere se effettua troppi tentativi di accesso non riusciti;
bloccare l’indirizzo IP dell’utente remoto se effettua troppi tentativi di accesso in rapida successione.
Entrambi gli approcci offrono diversi gradi di protezione, ma nessuno dei due è invulnerabile, soprattutto se implementato utilizzando una logica errata.
Ad esempio, a volte potresti scoprire che il tuo IP viene bloccato se non riesci ad accedere troppe volte. In alcune implementazioni, il contatore del numero di tentativi falliti si reimposta se il proprietario IP accede correttamente. Ciò significa che un utente malintenzionato dovrebbe semplicemente accedere al proprio account ogni pochi tentativi per impedire che questo limite venga raggiunto.
In questo caso, è sufficiente includere semplicemente le proprie credenziali di accesso a intervalli regolari nell’elenco delle parole per rendere questa difesa praticamente inutile.
Un modo in cui i siti Web tentano di prevenire la forzatura bruta è bloccare l’account se vengono soddisfatti determinati criteri sospetti, in genere un determinato numero di tentativi di accesso non riusciti. Proprio come con i normali errori di accesso, anche le risposte del server che indicano che un account è bloccato possono aiutare un utente malintenzionato a enumerare i nomi utente.
Il blocco di un account offre una certa protezione contro la forzatura bruta mirata a un account specifico. Tuttavia, questo approccio non riesce a prevenire adeguatamente gli attacchi di forza bruta in cui l’aggressore tenta semplicemente di accedere a qualsiasi account casuale possibile.
Ad esempio, è possibile utilizzare il seguente metodo per aggirare questo tipo di protezione:
Stabilire un elenco di nomi utente candidati che potrebbero essere validi. Ciò potrebbe avvenire tramite l’enumerazione dei nomi utente o semplicemente in base a un elenco di nomi utente comuni.
Decidi un elenco molto ristretto di password che ritieni possa avere almeno un utente. Fondamentalmente, il numero di password selezionate non deve superare il numero di tentativi di accesso consentiti. Ad esempio, se hai calcolato che il limite è di 3 tentativi, devi scegliere un massimo di 3 tentativi di password.
Utilizzando uno strumento come Burp Intruder, prova ciascuna delle password selezionate con ciascuno dei nomi utente candidati. In questo modo, puoi tentare di forzare ogni account senza attivare il blocco dell’account. È necessario che un singolo utente utilizzi una delle tre password per compromettere un account.
Inoltre, il blocco degli account non protegge dagli attacchi di credential stuffing. Ciò comporta l’utilizzo di un enorme dizionario di coppie nome utente: password, composto da credenziali di accesso autentiche rubate durante le violazioni dei dati. Il credential stuffing si basa sul fatto che molte persone riutilizzano lo stesso nome utente e la stessa password su più siti Web e, pertanto, esiste la possibilità che alcune delle credenziali compromesse nel dizionario siano valide anche sul sito Web di destinazione. Il blocco dell’account non protegge dal credential stuffing perché ciascun nome utente viene tentato una sola volta. Il credential stuffing è particolarmente pericoloso perché a volte può portare l’aggressore a compromettere molti account diversi con un solo attacco automatizzato.
User rate limiting
Un altro modo in cui i siti Web cercano di prevenire gli attacchi di forza bruta è attraverso la limitazione della frequenza degli utenti. In questo caso, effettuare troppe richieste di accesso in un breve periodo di tempo causa il blocco del tuo indirizzo IP. In genere, l’IP può essere sbloccato solo in uno dei seguenti modi:
automaticamente dopo che è trascorso un certo periodo di tempo;
manualmente da un amministratore;
manualmente dall’utente dopo aver completato con successo un CAPTCHA.
La limitazione della frequenza degli utenti è talvolta preferita al blocco dell’account poiché è meno incline all’enumerazione dei nomi utente e agli attacchi di negazione del servizio. Tuttavia, non è ancora completamente sicuro. Come abbiamo visto in un esempio in un laboratorio precedente, esistono diversi modi in cui un utente malintenzionato può manipolare il proprio IP apparente per aggirare il blocco.
Poiché il limite si basa sulla frequenza delle richieste HTTP inviate dall’indirizzo IP dell’utente, a volte è anche possibile aggirare questa difesa se si riesce a indovinare più password con una singola richiesta.
Sebbene sia piuttosto vecchio, la sua relativa semplicità e facilità di implementazione significa che a volte potresti vedere utilizzata l’autenticazione di base HTTP. Nell’autenticazione di base HTTP, il client riceve un token di autenticazione dal server, che viene costruito concatenando nome utente e password e codificandolo in Base64. Questo token viene memorizzato e gestito dal browser, che lo aggiunge automaticamente all’intestazione Authorization di ogni richiesta successiva come segue:
Authorization: Basic base64(username:password)
Per una serie di motivi, questo non è generalmente considerato un metodo di autenticazione sicuro. Innanzitutto, comporta l’invio ripetuto delle credenziali di accesso dell’utente ad ogni richiesta. A meno che il sito Web non implementi anche l’HSTS, le credenziali dell’utente possono essere catturate in un attacco man-in-the-middle.
Inoltre, le implementazioni dell’autenticazione di base HTTP spesso non supportano la protezione dalla forza bruta. Poiché il token è costituito esclusivamente da valori statici, ciò può renderlo vulnerabile alla forza bruta.
L’autenticazione di base HTTP è inoltre particolarmente vulnerabile agli exploit legati alla sessione, in particolare CSRF, contro i quali non offre di per sé alcuna protezione.
In alcuni casi, lo sfruttamento dell’autenticazione di base HTTP vulnerabile potrebbe garantire a un utente malintenzionato solo l’accesso a una pagina apparentemente poco interessante. Tuttavia, oltre a fornire un’ulteriore superficie di attacco, le credenziali esposte in questo modo potrebbero essere riutilizzate in altri contesti più riservati.
In questa sezione esamineremo alcune delle vulnerabilità che possono verificarsi nei meccanismi di autenticazione a più fattori. Ci sono anche diversi laboratori interattivi per dimostrare come sfruttare queste vulnerabilità nell’autenticazione a più fattori.
Molti siti Web si affidano esclusivamente all’autenticazione a fattore singolo utilizzando una password per autenticare gli utenti. Tuttavia, alcuni richiedono agli utenti di dimostrare la propria identità utilizzando più fattori di autenticazione.
La verifica dei fattori biometrici non è pratica per la maggior parte dei siti web. Tuttavia, è sempre più comune vedere l’autenticazione a due fattori (2FA) sia obbligatoria che facoltativa basata su qualcosa che conosci e qualcosa che possiedi. Ciò di solito richiede agli utenti di inserire sia una password tradizionale che un codice di verifica temporaneo da un dispositivo fisico fuori banda in loro possesso.
Token di autenticazione a due fattori
I codici di verifica vengono solitamente letti dall’utente da un dispositivo fisico di qualche tipo. Molti siti Web ad alta sicurezza ora forniscono agli utenti un dispositivo dedicato a questo scopo, come il token RSA o il dispositivo con tastiera utilizzato per accedere al servizio bancario online o al laptop di lavoro. Oltre ad essere realizzati appositamente per la sicurezza, questi dispositivi dedicati hanno anche il vantaggio di generare direttamente il codice di verifica. È anche comune che i siti Web utilizzino un’app mobile dedicata, come Google Authenticator, per lo stesso motivo.
Alcuni siti web, invece, inviano i codici di verifica al cellulare dell’utente sotto forma di messaggio di testo. Anche se tecnicamente questo sta ancora verificando il fattore “qualcosa che hai”, è aperto ad abusi. Innanzitutto, il codice viene trasmesso tramite SMS anziché essere generato dal dispositivo stesso. Ciò crea la possibilità che il codice venga intercettato. Esiste anche il rischio di SIM Swapping, per cui l’aggressore si procura in modo fraudolento una carta SIM con il numero di telefono della vittima. L’aggressore riceverebbe quindi tutti i messaggi SMS inviati alla vittima, compreso quello contenente il codice di verifica.
Bypassare l’autenticazione a due fattori
A volte, l’implementazione dell’autenticazione a due fattori è viziata al punto che può essere completamente aggirata.
Se all’utente viene prima richiesto di inserire una password e poi un codice di verifica in una pagina separata, l’utente si trova effettivamente in uno stato di “accesso” prima di aver inserito il codice di verifica. In questo caso, vale la pena verificare se è possibile passare direttamente alle pagine “solo loggato” dopo aver completato il primo passaggio di autenticazione. Occasionalmente, scoprirai che un sito Web in realtà non controlla se hai completato o meno il secondo passaggio prima di caricare la pagina.
La logica difettosa nell’autenticazione a due fattori significa che dopo che un utente ha completato il passaggio iniziale di accesso, il sito Web non verifica adeguatamente che lo stesso utente stia completando il secondo passaggio.
Ad esempio, l’utente accede con le normali credenziali nel primo passaggio come segue:
POST /login-steps/first HTTP/1.1
Host: vulnerable-website.com
...
username=carlos&password=qwerty
Gli viene quindi assegnato un cookie relativo all’account, prima di essere portato alla seconda fase del processo di accesso:
HTTP/1.1 200 OK
Set-Cookie: account=carlos
GET /login-steps/second HTTP/1.1
Cookie: account=carlos
Quando si invia il codice di verifica, la richiesta utilizza questo cookie per determinare a quale account l’utente sta tentando di accedere:
POST /login-steps/second HTTP/1.1
Host: vulnerable-website.com
Cookie: account=carlos
...
verification-code=123456
n questo caso, un utente malintenzionato potrebbe accedere utilizzando le proprie credenziali, ma poi modificare il valore del cookie dell’account con qualsiasi nome utente arbitrario quando invia il codice di verifica.
POST /login-steps/second HTTP/1.1
Host: vulnerable-website.com
Cookie: account=victim-user
...
verification-code=123456
Ciò è estremamente pericoloso se l’aggressore è in grado di forzare il codice di verifica in quanto gli consentirebbe di accedere ad account di utenti arbitrari basati interamente sul loro nome utente. Non avrebbero nemmeno bisogno di conoscere la password dell’utente.
Come per le password, i siti web devono adottare misure per impedire la forzatura bruta del codice di verifica 2FA. Ciò è particolarmente importante perché il codice è spesso un semplice numero di 4 o 6 cifre. Senza un’adeguata protezione dalla forza bruta, decifrare un codice del genere è banale. Alcuni siti Web tentano di impedire ciò disconnettendo automaticamente un utente se inserisce un certo numero di codici di verifica errati. Ciò è inefficace nella pratica perché un utente malintenzionato avanzato può persino automatizzare questo processo in più fasi creando macro per Burp Intruder. A questo scopo è possibile utilizzare anche l’estensione Turbo Intruder.
Vulnerabilità in altri meccanismi di autenticazione
In questa sezione esamineremo alcune delle funzionalità supplementari correlate all’autenticazione e dimostreremo come queste possano essere vulnerabili. Vi sono anche diversi laboratori interattivi che possono essere utilizzati per mettere in pratica l’argomento.
Oltre alla funzionalità di accesso di base, la maggior parte dei siti Web fornisce funzionalità supplementari per consentire agli utenti di gestire il proprio account. Ad esempio, gli utenti in genere possono modificare la propria password o reimpostarla quando la dimenticano. Questi meccanismi possono anche introdurre vulnerabilità che possono essere sfruttate da un utente malintenzionato.
I siti web di solito fanno attenzione a evitare vulnerabilità ben note nelle loro pagine di accesso. Ma è facile trascurare il fatto che è necessario adottare misure simili per garantire che le funzionalità correlate siano altrettanto robuste. Ciò è particolarmente importante nei casi in cui un utente malintenzionato è in grado di creare il proprio account e, di conseguenza, ha un facile accesso per studiare queste pagine aggiuntive.
Mantenere gli utenti connessi
Una caratteristica comune è la possibilità di rimanere connesso anche dopo aver chiuso una sessione del browser. Di solito si tratta di una semplice casella etichettata come “Ricordami” o “Resta connesso”.
Questa funzionalità viene spesso implementata generando un token “ricordami” di qualche tipo, che viene quindi archiviato in un cookie persistente. Poiché il possesso di questo cookie consente effettivamente di bypassare l’intero processo di accesso, è buona norma che questo cookie sia poco pratico da indovinare. Tuttavia, alcuni siti Web generano questo cookie in base a una concatenazione prevedibile di valori statici, come il nome utente e un timestamp. Alcuni addirittura utilizzano la password come parte del cookie. Questo approccio è particolarmente pericoloso se un utente malintenzionato è in grado di creare il proprio account perché può studiare il proprio cookie e potenzialmente dedurre come viene generato. Una volta elaborata la formula, possono provare a forzare i cookie di altri utenti per ottenere l’accesso ai loro account.
Alcuni siti Web presumono che se il cookie è crittografato in qualche modo non sarà individuabile anche se utilizza valori statici. Sebbene ciò possa essere vero se eseguito correttamente, la “crittografia” ingenua del cookie utilizzando una semplice codifica bidirezionale come Base64 non offre alcuna protezione di sorta. Anche l’utilizzo di una crittografia adeguata con una funzione hash unidirezionale non è completamente a prova di bomba. Se l’aggressore è in grado di identificare facilmente l’algoritmo di hashing e non viene utilizzato alcun salt, può potenzialmente forzare il cookie semplicemente eseguendo l’hashing dei propri elenchi di parole. Questo metodo può essere utilizzato per aggirare i limiti dei tentativi di accesso se un limite simile non viene applicato alle ipotesi sui cookie.
Anche se l’aggressore non è in grado di creare il proprio account, potrebbe comunque riuscire a sfruttare questa vulnerabilità. Utilizzando le tecniche consuete, come XSS, un utente malintenzionato potrebbe rubare il cookie “ricordami” di un altro utente e dedurre da quello come è costruito il cookie. Se il sito web è stato creato utilizzando un framework open source, i dettagli chiave della costruzione dei cookie potrebbero anche essere documentati pubblicamente.
In alcuni rari casi, potrebbe essere possibile ottenere la password effettiva di un utente in chiaro da un cookie, anche se è sottoposta ad hashing. Online sono disponibili versioni con hash di elenchi di password noti, quindi se la password dell’utente appare in uno di questi elenchi, decodificare l’hash a volte può essere banale come semplicemente incollarlo in un motore di ricerca. Ciò dimostra l’importanza del salt in una crittografia efficace.
In pratica, è un dato di fatto che alcuni utenti dimenticheranno la propria password, quindi è normale avere un modo per reimpostarla. Poiché in questo scenario la consueta autenticazione basata su password è ovviamente impossibile, i siti Web devono fare affidamento su metodi alternativi per assicurarsi che l’utente reale reimposti la propria password. Per questo motivo, la funzionalità di reimpostazione della password è intrinsecamente pericolosa e deve essere implementata in modo sicuro.
Esistono diversi modi in cui questa funzionalità viene comunemente implementata, con diversi gradi di vulnerabilità.
Invio password tramite e-mail
Dovrebbe essere ovvio che inviare agli utenti la loro password attuale non dovrebbe mai essere possibile se un sito web gestisce le password in modo sicuro. Alcuni siti Web generano invece una nuova password e la inviano all’utente tramite e-mail.
In generale è da evitare l’invio di password persistenti su canali non sicuri. In questo caso, la sicurezza si basa sulla scadenza della password generata dopo un periodo molto breve o sulla modifica immediata della password da parte dell’utente. Altrimenti, questo approccio è altamente suscettibile agli attacchi man-in-the-middle.
Anche la posta elettronica non è generalmente considerata sicura dato che le caselle di posta sono persistenti e non realmente progettate per l’archiviazione sicura di informazioni riservate. Molti utenti inoltre sincronizzano automaticamente la propria casella di posta tra più dispositivi attraverso canali non sicuri.
Reimpostazione delle password utilizzando un URL
Un metodo più efficace per reimpostare le password consiste nell’inviare agli utenti un URL univoco che li indirizzi a una pagina di reimpostazione della password. Le implementazioni meno sicure di questo metodo utilizzano un URL con un parametro facilmente indovinabile per identificare quale account viene reimpostato, ad esempio:
In questo esempio, un utente malintenzionato potrebbe modificare il parametro utente per fare riferimento a qualsiasi nome utente identificato. Verrebbero quindi indirizzati direttamente a una pagina in cui possono potenzialmente impostare una nuova password per questo utente arbitrario.
Un’implementazione migliore di questo processo consiste nel generare un token ad alta entropia difficile da indovinare e creare l’URL di reimpostazione basato su quello. Nella migliore delle ipotesi, questo URL non dovrebbe fornire suggerimenti su quale password dell’utente viene reimpostata.
Quando l’utente visita questo URL, il sistema dovrebbe verificare se questo token esiste sul back-end e, in tal caso, quale password dell’utente deve reimpostare. Questo token dovrebbe scadere dopo un breve periodo di tempo ed essere distrutto immediatamente dopo la reimpostazione della password.
Tuttavia, alcuni siti Web non riescono a convalidare nuovamente il token quando viene inviato il modulo di reimpostazione. In questo caso, un utente malintenzionato potrebbe semplicemente visitare il modulo di reimpostazione dal proprio account, eliminare il token e sfruttare questa pagina per reimpostare la password di un utente arbitrario.
Se l’URL nell’e-mail di reimpostazione viene generato dinamicamente, anche questo potrebbe essere vulnerabile all’avvelenamento da reimpostazione della password. In questo caso, un utente malintenzionato può potenzialmente rubare il token di un altro utente e utilizzarlo per modificare la propria password.
In genere, la modifica della password comporta l’immissione della password corrente e quindi della nuova password due volte. Queste pagine si basano fondamentalmente sullo stesso processo di verifica della corrispondenza dei nomi utente e delle password attuali come fa una normale pagina di accesso. Pertanto, queste pagine possono essere vulnerabili alle stesse tecniche.
La funzionalità di modifica della password può essere particolarmente pericolosa se consente a un utente malintenzionato di accedervi direttamente senza aver effettuato l’accesso come utente vittima. Ad esempio, se il nome utente viene fornito in un campo nascosto, un utente malintenzionato potrebbe essere in grado di modificare questo valore nella richiesta per prendere di mira utenti arbitrari. Questo può essere potenzialmente sfruttato per enumerare nomi utente e password a forza bruta.
Ho seguito il percorso di apprendimento suggerito da “PortSwigger Academy” per essere indirizzato nella giusta direzione. Consiglio di iscriversi alla piattaforma, seguire le lezioni e soprattutto svolgere e completare i lab 🙂
SQL injection
Cos’è l’ SQL injection (SQLi)?
SQL injection (SQLi) è una vulnerabilità della sicurezza Web che consente a un utente malintenzionato di interferire con le query che un’applicazione effettua al proprio database. Generalmente consente a un utente malintenzionato di visualizzare dati che normalmente non è in grado di recuperare. Ciò potrebbe includere dati appartenenti ad altri utenti o qualsiasi altro dato a cui l’applicazione stessa è in grado di accedere. In molti casi, un utente malintenzionato può modificare o eliminare questi dati, causando modifiche persistenti al contenuto o al comportamento dell’applicazione.
In alcune situazioni, un utente malintenzionato può intensificare un attacco SQL injection per compromettere il server sottostante o un’altra infrastruttura back-end oppure eseguire un attacco denial-of-service.
Qual è l’impatto di un attacco SQL injection riuscito?
Un attacco SQL injection riuscito può comportare l’accesso non autorizzato a dati sensibili, come password, dettagli della carta di credito o informazioni personali dell’utente. Molte violazioni dei dati di alto profilo negli ultimi anni sono state il risultato di attacchi SQL injection, che hanno portato a danni alla reputazione e multe normative. In alcuni casi, un utente malintenzionato può ottenere una backdoor persistente nei sistemi di un’organizzazione, portando a una compromissione a lungo termine che può passare inosservata per un periodo prolungato.
Come rilevare le vulnerabilità di SQL injection
La maggior parte delle vulnerabilità di SQL injection può essere trovata in modo rapido e affidabile utilizzando lo scanner di vulnerabilità Web di Burp Suite.
L’SQL injection può essere rilevata manualmente utilizzando una serie sistematica di test su ogni punto di ingresso nell’applicazione. Ciò comporta in genere:
Inserendo il carattere di apice singolo ’ e cercando errori o altre anomalie.
Invio di una sintassi specifica di SQL che restituisce il valore di base (originale) del punto di ingresso e un valore diverso e ricerca di differenze sistematiche nelle risposte dell’applicazione risultanti.
Invio di condizioni booleane come OR 1=1 e OR 1=2 e ricerca delle differenze nelle risposte dell’applicazione.
Invio di payload progettati per attivare ritardi temporali durante l’esecuzione all’interno di una query SQL e ricerca delle differenze nel tempo impiegato per rispondere.
Invio di payload OASTprogettati per attivare un’interazione di rete fuori banda quando eseguita all’interno di una query SQL e monitoraggio di eventuali interazioni risultanti.
SQL injection in diverse parti della query
La maggior parte delle vulnerabilità di SQL injection si verifica all’interno della clausola WHERE di una query SELECT. Questo tipo di SQL injection è generalmente ben compreso dai tester esperti.
Ma le vulnerabilità di SQL injection possono in linea di principio verificarsi in qualsiasi posizione all’interno della query e all’interno di diversi tipi di query. Le altre posizioni più comuni in cui si verifica l’iniezione SQL sono:
Nelle istruzioni UPDATE, all’interno dei valori aggiornati o nella clausola WHERE.
Nelle istruzioni INSERT, all’interno dei valori inseriti.
Nelle istruzioni SELECT, all’interno del nome della tabella o della colonna.
Nelle istruzioni SELECT, all’interno della clausola ORDER BY.
Esempi di iniezione SQL
Esiste un’ampia varietà di vulnerabilità, attacchi e tecniche di SQL injection, che si verificano in situazioni diverse. Alcuni esempi comuni di SQL injection includono:
Recupero di dati nascosti, in cui è possibile modificare una query SQL per restituire risultati aggiuntivi.
Attacchi UNION, in cui è possibile recuperare dati da diverse tabelle di database.
Blind SQL injection, in cui i risultati di una query che controlli non vengono restituiti nelle risposte dell’applicazione.
Recupero di dati nascosti
Considera un’applicazione per lo shopping che mostra i prodotti in diverse categorie. Quando l’utente fa clic sulla categoria Regali, il browser richiede l’URL:
Ciò fa sì che l’applicazione esegua una query SQL per recuperare i dettagli dei prodotti rilevanti dal database:
SELECT * FROM products WHERE category = ’Gifts’ AND released = 1
Questa query SQL chiede al database di restituire:
tutti i dettagli (*)
dalla tabella dei prodotti
dove la categoria è Regali
e rilasciato è 1.
La restrizione released = 1 viene utilizzata per nascondere i prodotti che non sono stati rilasciati. Per i prodotti non rilasciati, presumibilmente released = 0.
L’applicazione non implementa alcuna difesa contro gli attacchi SQL injection, quindi un utente malintenzionato può costruire un attacco come:
SELECT * FROM products WHERE category = ’Gifts’--’ AND released = 1
La cosa fondamentale qui è che la sequenza di doppio trattino — è un indicatore di commento in SQL e significa che il resto della query viene interpretato come un commento. Ciò rimuove efficacemente il resto della query, quindi non include più AND released = 1. Ciò significa che vengono visualizzati tutti i prodotti, inclusi i prodotti non rilasciati.
Andando oltre, un utente malintenzionato può fare in modo che l’applicazione visualizzi tutti i prodotti in qualsiasi categoria, comprese le categorie di cui non è a conoscenza:
La query modificata restituirà tutti gli elementi in cui la categoria è Regali o 1 è uguale a 1. Poiché 1=1 è sempre vero, la query restituirà tutti gli elementi.
Avvertimento
Prestare attenzione quando si inserisce la condizione OR 1=1 in una query SQL. Anche se questo può essere innocuo nel contesto iniziale in cui stai effettuando l’iniezione, è normale che le applicazioni utilizzino i dati di una singola richiesta in più query diverse. Se la tua condizione raggiunge un’istruzione UPDATE o DELETE, ad esempio, ciò può comportare una perdita accidentale di dati.
Considera un’applicazione che consente agli utenti di accedere con un nome utente e una password. Se un utente invia il nome utente wiener e la password bluecheese, l’applicazione controlla le credenziali eseguendo la seguente query SQL:
SELECT * FROM users WHERE username = ’wiener’ AND password = ’bluecheese’
Se la query restituisce i dettagli di un utente, l’accesso ha esito positivo. In caso contrario, viene rifiutato.
In questo caso, un utente malintenzionato può accedere come qualsiasi utente senza password semplicemente utilizzando la sequenza di commenti SQL, per rimuovere il controllo della password dalla clausola WHERE della query. Ad esempio, inviando il nome utente administrator’– e una password vuota si ottiene la seguente query:
SELECT * FROM users WHERE username = ’administrator’--’ AND password =’’
Questa query restituisce l’utente il cui nome utente è administrator e fa accedere correttamente l’attaccante come quell’utente.
Nei casi in cui i risultati di una query SQL vengono restituiti all’interno delle risposte dell’applicazione, un utente malintenzionato può sfruttare una vulnerabilità di SQL injection per recuperare i dati da altre tabelle all’interno del database. Questa operazione viene eseguita utilizzando la parola chiave UNION, che consente di eseguire un’ulteriore query SELECT e aggiungere i risultati alla query originale.
Ad esempio, se un’applicazione esegue la seguente query contenente l’input dell’utente “Gift”:
SELECT name, description FROM products WHERE category = ’Gifts’
quindi un utente malintenzionato può inviare l’input:
’ UNION SELECT username, password users--
Ciò farà sì che l’applicazione restituisca tutti i nomi utente e le password insieme ai nomi e alle descrizioni dei prodotti.
Molte istanze di SQL injection sono vulnerabilità cieche. Ciò significa che l’applicazione non restituisce i risultati della query SQL o i dettagli di eventuali errori del database all’interno delle sue risposte. Le vulnerabilità cieche possono ancora essere sfruttate per accedere a dati non autorizzati, ma le tecniche coinvolte sono generalmente più complicate e difficili da eseguire.
A seconda della natura della vulnerabilità e del database interessato, è possibile utilizzare le seguenti tecniche per sfruttare le vulnerabilità della blind SQL injection:
È possibile modificare la logica della query per attivare una differenza rilevabile nella risposta dell’applicazione a seconda della verità di una singola condizione. Ciò potrebbe comportare l’inserimento di una nuova condizione in una logica booleana o l’attivazione condizionale di un errore come una divisione per zero.
È possibile attivare in modo condizionale un ritardo nell’elaborazione della query, consentendo di dedurre la verità della condizione in base al tempo impiegato dall’applicazione per rispondere.
È possibile attivare un’interazione di rete fuori banda utilizzando le tecniche OAST. Questa tecnica è estremamente potente e funziona in situazioni in cui le altre tecniche non funzionano. Spesso puoi estrarre direttamente i dati tramite il canale fuori banda, ad esempio inserendo i dati in una ricerca DNS per un dominio che controlli.
L’iniezione SQL di primo ordine si verifica quando l’applicazione prende l’input dell’utente da una richiesta HTTP e, nel corso dell’elaborazione di tale richiesta, incorpora l’input in una query SQL in modo non sicuro.
Nell’iniezione SQL di secondo ordine (nota anche come iniezione SQL archiviata), l’applicazione riceve l’input dell’utente da una richiesta HTTP e lo archivia per un utilizzo futuro. Questo di solito viene fatto inserendo l’input in un database, ma non si verifica alcuna vulnerabilità nel punto in cui i dati sono archiviati. Successivamente, durante la gestione di una richiesta HTTP diversa, l’applicazione recupera i dati archiviati e li incorpora in una query SQL in modo non sicuro.
L’iniezione SQL di secondo ordine si verifica spesso in situazioni in cui gli sviluppatori sono a conoscenza delle vulnerabilità dell’iniezione SQL e quindi gestiscono in modo sicuro il posizionamento iniziale dell’input nel database. Quando i dati vengono successivamente elaborati, sono considerati sicuri, poiché sono stati precedentemente inseriti nel database in modo sicuro. A questo punto, i dati vengono gestiti in modo non sicuro, perché lo sviluppatore li ritiene erroneamente attendibili.
Esame del database
Alcune funzionalità principali del linguaggio SQL sono implementate allo stesso modo su piattaforme di database popolari e così tanti modi per rilevare e sfruttare le vulnerabilità di SQL injection funzionano in modo identico su diversi tipi di database.
Tuttavia, ci sono anche molte differenze tra i database comuni. Ciò significa che alcune tecniche per rilevare e sfruttare l’iniezione SQL funzionano in modo diverso su piattaforme diverse. Per esempio:
Dopo l’identificazione iniziale di una vulnerabilità SQL injection, è generalmente utile ottenere alcune informazioni sul database stesso. Queste informazioni possono spesso aprire la strada a un ulteriore sfruttamento.
È possibile interrogare i dettagli della versione per il database. Il modo in cui ciò viene fatto dipende dal tipo di database, quindi puoi dedurre il tipo di database da qualsiasi tecnica funzioni. Ad esempio, su Oracle puoi eseguire:
SELECT * FROM v$version
È inoltre possibile determinare quali tabelle di database esistono e quali colonne contengono. Ad esempio, sulla maggior parte dei database è possibile eseguire la seguente query per elencare le tabelle:
In tutti i laboratori finora, hai utilizzato la stringa di query per iniettare il tuo payload SQL dannoso. Tuttavia, è importante notare che è possibile eseguire attacchi SQL injection utilizzando qualsiasi input controllabile elaborato come query SQL dall’applicazione. Ad esempio, alcuni siti Web accettano input in formato JSON o XML e lo utilizzano per interrogare il database.
Questi diversi formati possono persino fornire modi alternativi per offuscare gli attacchi (obfuscate attacks) che altrimenti sarebbero bloccati a causa di WAF e altri meccanismi di difesa. Le implementazioni deboli spesso cercano solo parole chiave SQL injection comuni all’interno della richiesta, quindi potresti essere in grado di aggirare questi filtri semplicemente codificando o eseguendo l’escape dei caratteri nelle parole chiave proibite. Ad esempio, la seguente SQL injection basata su XML utilizza una sequenza di escape XML per codificare il carattere S in SELECT:
La maggior parte delle istanze di SQL injection può essere prevenuta utilizzando query con parametri (note anche come istruzioni preparate) anziché la concatenazione di stringhe all’interno della query.
Il seguente codice è vulnerabile all’iniezione SQL perché l’input dell’utente è concatenato direttamente nella query:
Questo codice può essere facilmente riscritto in modo da impedire all’input dell’utente di interferire con la struttura della query:
PreparedStatement statement = connection.prepareStatement("SELECT * FROM products WHERE category = ?");
statement.setString(1, input);
ResultSet resultSet = statement.executeQuery();
Le query con parametri possono essere utilizzate per qualsiasi situazione in cui l’input non attendibile viene visualizzato come dati all’interno della query, inclusi la clausola WHERE e i valori in un’istruzione INSERT o UPDATE. Non possono essere utilizzati per gestire l’input non attendibile in altre parti della query, come i nomi di tabelle o colonne o la clausola ORDER BY. La funzionalità dell’applicazione che inserisce dati non attendibili in quelle parti della query dovrà adottare un approccio diverso, ad esempio inserire nella whitelist i valori di input consentiti o utilizzare una logica diversa per fornire il comportamento richiesto.
Affinché una query con parametri sia efficace nel prevenire l’iniezione SQL, la stringa utilizzata nella query deve essere sempre una costante hardcoded e non deve mai contenere dati variabili di alcuna origine. Non essere tentato di decidere caso per caso se un elemento di dati è attendibile e continua a utilizzare la concatenazione di stringhe all’interno della query per i casi considerati sicuri. È fin troppo facile commettere errori sulla possibile origine dei dati o che le modifiche in altro codice violino le ipotesi su quali dati sono contaminati.
Appunti raccolti durante il relativo corso seguito su Skills for All by Cisco, alla cui piattaforma rimando per il materiale necessario.
Reliable Networks
Network Architecture
Sei mai stato impegnato a lavorare online, solo per vedere “Internet andare giù”? Molto probabilmente hai “solo” perso la connessione. È molto frustrante. Con così tante persone nel mondo che si affidano all’accesso alla rete per lavorare e imparare, è imperativo che le reti siano affidabili. In questo contesto, affidabilità significa più della tua connessione a Internet. Questo argomento si concentra sui quattro aspetti dell’affidabilità della rete.
Il ruolo della rete è cambiato da una rete di soli dati a un sistema che consente la connessione di persone, dispositivi e informazioni in un ambiente di rete convergente ricco di contenuti multimediali. Affinché le reti funzionino in modo efficiente e crescano in questo tipo di ambiente, la rete deve essere costruita su un’architettura di rete standard.
Le reti supportano anche un’ampia gamma di applicazioni e servizi. Devono operare su molti tipi diversi di cavi e dispositivi, che costituiscono l’infrastruttura fisica. Il termine architettura di rete, in questo contesto, si riferisce alle tecnologie che supportano l’infrastruttura ei servizi programmati e le regole, o protocolli, che spostano i dati attraverso la rete.
Man mano che le reti si evolvono, abbiamo appreso che ci sono quattro caratteristiche fondamentali che gli “architetti” di rete devono affrontare per soddisfare le aspettative degli utenti:
Tolleranza ai guasti
Scalabilità
Qualità del servizio (QoS)
Sicurezza
Fault Tolerance
Una rete tollerante ai guasti è quella che limita il numero di dispositivi interessati durante un guasto. È costruita per consentire un ripristino rapido quando si verifica un tale errore. Queste reti dipendono da più percorsi tra l’origine e la destinazione di un messaggio. Se un percorso fallisce, i messaggi vengono immediatamente inviati su un collegamento diverso. La presenza di più percorsi verso una destinazione è nota come ridondanza.
L’implementazione di una rete a commutazione di pacchetto è un modo in cui le reti affidabili forniscono ridondanza. La commutazione di pacchetto suddivide il traffico in pacchetti che vengono instradati su una rete condivisa. Un singolo messaggio, come un’e-mail o un flusso video, viene suddiviso in più blocchi di messaggi, chiamati pacchetti. Ogni pacchetto ha le necessarie informazioni di indirizzamento dell’origine e della destinazione del messaggio. I router all’interno della rete commutano i pacchetti in base alle condizioni della rete in quel momento. Ciò significa che tutti i pacchetti in un singolo messaggio potrebbero prendere percorsi molto diversi verso la stessa destinazione. Nella figura, l’utente non è a conoscenza e non è influenzato dal router che sta cambiando dinamicamente il percorso quando un collegamento fallisce.
Scalability
Una rete scalabile si espande rapidamente per supportare nuovi utenti e applicazioni. Lo fa senza degradare le prestazioni dei servizi a cui accedono gli utenti esistenti. La figura mostra come aggiungere facilmente una nuova rete a una rete esistente. Queste reti sono scalabili perché i progettisti seguono standard e protocolli accettati. Ciò consente ai fornitori di software e hardware di concentrarsi sul miglioramento di prodotti e servizi senza dover progettare un nuovo insieme di regole per operare all’interno della rete.
Quality of Service
La qualità del servizio (QoS) è oggi un requisito crescente delle reti. Le nuove applicazioni disponibili per gli utenti sulle reti, come le trasmissioni voce e video in diretta, creano maggiori aspettative per la qualità dei servizi forniti. Hai mai provato a guardare un video con interruzioni e pause costanti? Man mano che dati, voce e contenuti video continuano a convergere sulla stessa rete, QoS diventa un meccanismo primario per gestire la congestione e garantire una consegna affidabile dei contenuti a tutti gli utenti.
La congestione si verifica quando la domanda di larghezza di banda supera la quantità disponibile. La larghezza di banda della rete è misurata nel numero di bit che possono essere trasmessi in un singolo secondo, o bit al secondo (bps). Quando vengono tentate comunicazioni simultanee attraverso la rete, la richiesta di larghezza di banda di rete può superare la sua disponibilità, creando congestione di rete.
Quando il volume di traffico è maggiore di quello che può essere trasportato attraverso la rete, i dispositivi manterranno i pacchetti in memoria fino a quando le risorse non saranno disponibili per trasmetterli. Nella figura, un utente richiede una pagina Web e un altro è impegnato in una telefonata. Con una politica QoS in atto, il router può gestire il flusso di dati e traffico vocale, dando priorità alle comunicazioni vocali se la rete subisce una congestione. L’obiettivo di QoS è dare la priorità al traffico sensibile al tempo. Ciò che è importante è il tipo di traffico, non il contenuto del traffico.
Network Security
L’infrastruttura di rete, i servizi ei dati contenuti nei dispositivi collegati alla rete sono risorse personali e aziendali cruciali. Gli amministratori di rete devono affrontare due tipi di problemi di sicurezza della rete: sicurezza dell’infrastruttura di rete e sicurezza delle informazioni.
La protezione dell’infrastruttura di rete include la protezione fisica dei dispositivi che forniscono la connettività di rete e la prevenzione dell’accesso non autorizzato al software di gestione che risiede su di essi, come mostrato nella figura.
Gli amministratori di rete devono inoltre proteggere le informazioni contenute nei pacchetti trasmessi sulla rete e le informazioni memorizzate sui dispositivi collegati alla rete. Per raggiungere gli obiettivi della sicurezza della rete, ci sono tre requisiti principali.
Riservatezza – Riservatezza dei dati significa che solo i destinatari previsti e autorizzati possono accedere e leggere i dati.
Integrità – L’integrità dei dati assicura agli utenti che le informazioni non sono state alterate durante la trasmissione, dall’origine alla destinazione.
Disponibilità: la disponibilità dei dati garantisce agli utenti un accesso tempestivo e affidabile ai servizi dati per gli utenti autorizzati.
Hierarchical Network Design
Physical and Logical Addresses
Il nome di una persona di solito non cambia. L’indirizzo di una persona, d’altra parte, si riferisce a dove vive la persona e può cambiare. Su un host, l’indirizzo MAC non cambia; è fisicamente assegnato alla scheda NIC host ed è noto come indirizzo fisico. L’indirizzo fisico rimane lo stesso indipendentemente dalla posizione dell’host sulla rete.
L’indirizzo IP è simile all’indirizzo di una persona. È noto come indirizzo logico perché viene assegnato logicamente in base a dove si trova l’host. L’indirizzo IP, o indirizzo di rete, viene assegnato a ciascun host da un amministratore di rete in base alla rete locale.
Gli indirizzi IP contengono due parti. Una parte identifica la porzione di rete. La porzione di rete dell’indirizzo IP sarà la stessa per tutti gli host connessi alla stessa rete locale. La seconda parte dell’indirizzo IP identifica il singolo host su quella rete. All’interno della stessa rete locale, la parte host dell’indirizzo IP è univoca per ciascun host, come mostrato nella figura.
Sia il MAC fisico che gli indirizzi IP logici sono necessari affinché un computer comunichi su una rete gerarchica, proprio come sono necessari sia il nome che l’indirizzo di una persona per inviare una lettera.
Hierarchical Analogy
Immagina quanto sarebbe difficile la comunicazione se l’unico modo per inviare un messaggio a qualcuno fosse usare il nome della persona. Se non ci fossero indirizzi stradali, città, paesi o confini nazionali, consegnare un messaggio a una persona specifica in tutto il mondo sarebbe quasi impossibile.
Su una rete Ethernet, l’indirizzo MAC dell’host è simile al nome di una persona. Un indirizzo MAC indica l’identità individuale di un host specifico, ma non indica dove si trova l’host sulla rete. Se tutti gli host su Internet (milioni e milioni di essi) fossero identificati ciascuno solo dal proprio indirizzo MAC univoco, immagina quanto sarebbe difficile individuarne uno solo.
Inoltre, la tecnologia Ethernet genera una grande quantità di traffico di trasmissione affinché gli host possano comunicare. Le trasmissioni vengono inviate a tutti gli host all’interno di una singola rete. Le trasmissioni consumano larghezza di banda e rallentano le prestazioni della rete. Cosa accadrebbe se i milioni di host collegati a Internet fossero tutti in una rete Ethernet e utilizzassero le trasmissioni?
Per questi due motivi, le grandi reti Ethernet costituite da molti host non sono efficienti. È meglio dividere reti più grandi in parti più piccole e più gestibili. Un modo per dividere reti più grandi è utilizzare un modello di progettazione gerarchico.
Access, Distribution, and Core
Il traffico IP viene gestito in base alle caratteristiche e ai dispositivi associati a ciascuno dei tre livelli del modello di progettazione della rete gerarchica: accesso, distribuzione e nucleo.
Livello di accesso (Access Layer)
Il livello di accesso fornisce un punto di connessione per i dispositivi degli utenti finali alla rete e consente a più host di connettersi ad altri host tramite un dispositivo di rete, solitamente uno switch, come il Cisco 2960-XR mostrato nella figura, o un punto di accesso wireless. In genere, tutti i dispositivi all’interno di un singolo livello di accesso avranno la stessa porzione di rete dell’indirizzo IP.
Se un messaggio è destinato a un host locale, in base alla parte di rete dell’indirizzo IP, il messaggio rimane locale. Se è destinato a una rete diversa, viene passato al livello di distribuzione. Gli switch forniscono la connessione ai dispositivi del livello di distribuzione, in genere un dispositivo di livello 3 come un router o uno switch di livello 3.
Livello di distribuzione (Distribution Layer)
Il livello di distribuzione fornisce un punto di connessione per reti separate e controlla il flusso di informazioni tra le reti. In genere contiene switch più potenti, come la serie Cisco C9300 mostrata nella figura, rispetto al livello di accesso e ai router per l’instradamento tra le reti. I dispositivi del livello di distribuzione controllano il tipo e la quantità di traffico che fluisce dal livello di accesso al livello principale.
Livello centrale (Core Layer)
Il livello centrale è un livello backbone ad alta velocità con connessioni ridondanti (backup). È responsabile del trasporto di grandi quantità di dati tra più reti finali. I dispositivi del livello principale includono in genere switch e router molto potenti e ad alta velocità, come il Cisco Catalyst 9600 mostrato nella figura. L’obiettivo principale del livello principale è trasportare i dati rapidamente.
Reliable Networks – Riepilogo
Man mano che le reti si evolvono, abbiamo appreso che ci sono quattro caratteristiche di base che gli architetti di rete devono affrontare per soddisfare le aspettative degli utenti: tolleranza ai guasti, scalabilità, QoS e sicurezza.
Una rete tollerante ai guasti limita il numero di dispositivi interessati durante un guasto. Consente un ripristino rapido quando si verifica un tale errore. Queste reti dipendono da più percorsi tra l’origine e la destinazione di un messaggio. Se un percorso fallisce, i messaggi vengono immediatamente inviati su un collegamento diverso.
Una rete scalabile si espande rapidamente per supportare nuovi utenti e applicazioni. Lo fa senza degradare le prestazioni dei servizi a cui accedono gli utenti esistenti. Le reti possono essere scalabili perché i progettisti seguono standard e protocolli accettati.
QoS è oggi un requisito crescente delle reti. Man mano che dati, voce e contenuti video continuano a convergere sulla stessa rete, QoS diventa un meccanismo primario per gestire la congestione e garantire una consegna affidabile dei contenuti a tutti gli utenti. La larghezza di banda della rete è misurata in bps. Quando vengono tentate comunicazioni simultanee attraverso la rete, la richiesta di larghezza di banda di rete può superare la sua disponibilità, creando congestione di rete. L’obiettivo di QoS è dare la priorità al traffico sensibile al tempo. Ciò che è importante è il tipo di traffico, non il contenuto del traffico.
Gli amministratori di rete devono affrontare due tipi di problemi di sicurezza della rete: sicurezza dell’infrastruttura di rete e sicurezza delle informazioni. Gli amministratori di rete devono inoltre proteggere le informazioni contenute nei pacchetti trasmessi sulla rete e le informazioni memorizzate sui dispositivi collegati alla rete. Esistono tre requisiti principali per raggiungere gli obiettivi della sicurezza di rete: riservatezza, integrità e disponibilità.
Hierarchical Networks Design
Gli indirizzi IP contengono due parti. Una parte identifica la porzione di rete. La porzione di rete del’indirizzo IP sarà la stessa per tutti gli host connessi alla stessa rete locale. La seconda parte dell’indirizzo IP identifica il singolo host su quella rete. Sia il MAC fisico che gli indirizzi IP logici sono necessari affinché un computer comunichi su una rete gerarchica.
Il Centro connessioni di rete e condivisione su un PC mostra le informazioni di rete di base e imposta le connessioni, comprese le reti attive e se sei connesso via cavo o wireless a Internet e all’interno della tua LAN. Puoi visualizzare le proprietà delle tue connessioni qui.
Su una rete Ethernet, l’indirizzo MAC dell’host è simile al nome di una persona. Un indirizzo MAC indica l’identità individuale di un host specifico, ma non indica dove si trova l’host sulla rete. Se tutti gli host su Internet (milioni e milioni di essi) fossero identificati ciascuno solo dal proprio indirizzo MAC univoco, immagina quanto sarebbe difficile individuarne uno solo. È meglio dividere reti più grandi in parti più piccole e più gestibili. Un modo per dividere reti più grandi è utilizzare un modello di progettazione gerarchico.
Le reti gerarchiche si adattano bene. Il livello di accesso fornisce un punto di connessione per i dispositivi degli utenti finali alla rete e consente a più host di connettersi ad altri host tramite un dispositivo di rete, in genere uno switch o un punto di accesso wireless. In genere, tutti i dispositivi all’interno di un singolo livello di accesso avranno la stessa porzione di rete dell’indirizzo IP. Il livello di distribuzione fornisce un punto di connessione per reti separate e controlla il flusso di informazioni tra le reti. I dispositivi del livello di distribuzione controllano il tipo e la quantità di traffico che fluisce dal livello di accesso al livello principale. Il livello centrale è un livello backbone ad alta velocità con connessioni ridondanti. È responsabile del trasporto di grandi quantità di dati tra più reti finali. L’obiettivo principale del livello principale è trasportare i dati rapidamente.
Cloud and Virtualization
Types of Clouds
Esistono quattro modelli di cloud principali:
Cloud pubblici: le applicazioni e i servizi basati su cloud offerti in un cloud pubblico vengono resi disponibili alla popolazione in generale. I servizi possono essere gratuiti o offerti su un modello pay-per-use, come il pagamento per l’archiviazione online. Il cloud pubblico utilizza Internet per fornire servizi.
Cloud privati: le applicazioni e i servizi basati su cloud offerti in un cloud privato sono destinati a un’organizzazione o entità specifica, ad esempio il governo. Un cloud privato può essere configurato utilizzando la rete privata di un’organizzazione, sebbene ciò possa essere costoso da creare e mantenere. Un cloud privato può anche essere gestito da un’organizzazione esterna con una rigorosa sicurezza di accesso.
Cloud ibridi: un cloud ibrido è costituito da due o più cloud (ad esempio: parte privata, parte pubblica), in cui ogni parte rimane un oggetto separato, ma entrambi sono collegati tramite un’unica architettura. Gli individui su un cloud ibrido sarebbero in grado di avere gradi di accesso a vari servizi in base ai diritti di accesso degli utenti.
Cloud della comunità: viene creato un cloud della comunità per l’uso esclusivo da parte di una comunità specifica. Le differenze tra cloud pubblici e community cloud sono le esigenze funzionali che sono state personalizzate per la comunità. Ad esempio, le organizzazioni sanitarie devono rimanere conformi alle politiche e alle leggi che richiedono autenticazione e riservatezza speciali.
Cloud Computing and Virtualization
I termini “cloud computing” e “virtualizzazione” sono spesso usati in modo intercambiabile; tuttavia, significano cose diverse. La virtualizzazione è la base del cloud computing. Senza di esso, il cloud computing, poiché è ampiamente implementato, non sarebbe possibile.
Oltre un decennio fa, VMware ha sviluppato una tecnologia di virtualizzazione che ha consentito a un sistema operativo host di supportare uno o più sistemi operativi client. La maggior parte delle tecnologie di virtualizzazione ora si basa su questa tecnologia. La trasformazione dei server dedicati in server virtualizzati è stata adottata e viene rapidamente implementata nei data center e nelle reti aziendali.
Virtualizzazione significa creare una versione virtuale piuttosto che fisica di qualcosa, come un computer. Un esempio potrebbe essere l’esecuzione di un ‘computer Linux’ sul tuo PC Windows, cosa che farai più avanti in laboratorio.
Per apprezzare appieno la virtualizzazione, è innanzitutto necessario comprendere parte della storia della tecnologia dei server. Storicamente, i server aziendali erano costituiti da un sistema operativo server, come Windows Server o Linux Server, installato su hardware specifico, come mostrato nella figura. Tutta la RAM del server, la potenza di elaborazione e lo spazio su disco rigido sono stati dedicati al servizio fornito (ad es. Web, servizi di posta elettronica, ecc.).
Il problema principale con questa configurazione è che quando un componente si guasta, il servizio fornito da questo server diventa non disponibile. Questo è noto come un singolo punto di errore. Un altro problema era che i server dedicati erano sottoutilizzati. I server dedicati spesso sono rimasti inattivi per lunghi periodi di tempo, in attesa che si presentasse la necessità di fornire il servizio specifico che forniscono. Questi server sprecavano energia e occupavano più spazio di quanto fosse garantito dalla quantità di servizio fornito. Questo è noto come espansione incontrollata del server.
Advantages of Virtualization
Uno dei principali vantaggi della virtualizzazione è il costo complessivo ridotto:
Sono necessarie meno apparecchiature: la virtualizzazione consente il consolidamento dei server, che richiede meno dispositivi fisici e riduce i costi di manutenzione.
Viene consumata meno energia: il consolidamento dei server riduce i costi mensili di alimentazione e raffreddamento.
È richiesto meno spazio: il consolidamento dei server riduce la quantità di spazio richiesto.
Questi sono ulteriori vantaggi della virtualizzazione:
Prototipazione più semplice: è possibile creare rapidamente laboratori autonomi, operanti su reti isolate, per testare e creare prototipi di implementazioni di rete.
Provisioning del server più rapido: la creazione di un server virtuale è molto più rapida rispetto al provisioning di un server fisico.
Aumento del tempo di attività del server: la maggior parte delle piattaforme di virtualizzazione del server ora offre funzionalità avanzate di tolleranza agli errori ridondanti.
Ripristinodi emergenza migliorato: la maggior parte delle piattaforme di virtualizzazione dei server aziendali dispone di software che può aiutare a testare e automatizzare il failover prima che si verifichi un disastro.
Supporto legacy: la virtualizzazione può prolungare la durata dei sistemi operativi e delle applicazioni, fornendo più tempo alle organizzazioni per migrare verso soluzioni più recenti.
Hypervisors
L’hypervisor è un programma, firmware o hardware che aggiunge un livello di astrazione sopra l’hardware fisico. Il livello di astrazione viene utilizzato per creare macchine virtuali che hanno accesso a tutto l’hardware della macchina fisica come CPU, memoria, controller del disco e NIC. Ognuna di queste macchine virtuali esegue un sistema operativo completo e separato. Con la virtualizzazione, non è raro che 100 server fisici vengano consolidati come macchine virtuali su 10 server fisici che utilizzano hypervisor.
Hypervisor di tipo 1 – Approccio ‘Bare Metal’.
Gli hypervisor di tipo 1 sono anche chiamati approccio ‘bare metal’ perché l’hypervisor è installato direttamente sull’hardware. Gli hypervisor di tipo 1 vengono generalmente utilizzati su server aziendali e dispositivi di rete del data center.
Con gli hypervisor di tipo 1, l’hypervisor viene installato direttamente sul server o sull’hardware di rete. Quindi, le istanze di un sistema operativo vengono installate sull’hypervisor, come mostrato nella figura. Gli hypervisor di tipo 1 hanno accesso diretto alle risorse hardware; pertanto, sono più efficienti delle architetture ospitate. Gli hypervisor di tipo 1 migliorano scalabilità, prestazioni e robustezza.
Hypervisor di tipo 2 – Approccio ‘ospitato’.
Un hypervisor di tipo 2 è un software che crea ed esegue istanze VM. Il computer, su cui un hypervisor supporta una o più macchine virtuali, è una macchina host. Gli hypervisor di tipo 2 sono anche chiamati hypervisor ospitati. Questo perché l’hypervisor è installato sopra il sistema operativo esistente, come macOS, Windows o Linux. Quindi, una o più istanze aggiuntive del sistema operativo vengono installate sopra l’hypervisor, come mostrato nella figura. Un grande vantaggio degli hypervisor di tipo 2 è che non è necessario il software della console di gestione.
Nota: è importante assicurarsi che la macchina host sia sufficientemente robusta per installare ed eseguire le macchine virtuali, in modo che non esaurisca le risorse.
Cloud and Cloud Services – Rielpilogo
In generale, quando si parla di cloud, si parla di data center, cloud computing e virtualizzazione. I data center sono in genere strutture di grandi dimensioni che forniscono enormi quantità di alimentazione, raffreddamento e larghezza di banda. Solo le aziende molto grandi possono permettersi i propri data center. La maggior parte delle organizzazioni più piccole affitta i servizi da un fornitore di servizi cloud.
I servizi cloud includono quanto segue:
SaaS – Software come servizio
PaaS – Piattaforma come servizio
IaaS – Infrastruttura come servizio
Esistono quattro modelli di cloud primari, come mostrato nella figura.
Cloud pubblici: le applicazioni e i servizi basati su cloud offerti in un cloud pubblico vengono resi disponibili alla popolazione in generale.
Cloud privati: le applicazioni e i servizi basati su cloud offerti in un cloud privato sono destinati a un’organizzazione o entità specifica, ad esempio il governo.
Cloud ibridi: un cloud ibrido è costituito da due o più cloud, in cui ogni parte rimane un oggetto separato, ma entrambi sono collegati tramite un’unica architettura.
Cloud della comunità: viene creato un cloud della comunità per l’uso esclusivo da parte di una comunità specifica. Le differenze tra cloud pubblici e community cloud sono le esigenze funzionali che sono state personalizzate per la comunità.
La virtualizzazione è la base del cloud computing. Senza di esso, il cloud computing, poiché è ampiamente implementato, non sarebbe possibile. Virtualizzazione significa creare una versione virtuale piuttosto che fisica di qualcosa, come un computer. Un esempio potrebbe essere l’esecuzione di un ‘computer Linux’ sul tuo PC Windows.
Virtualization
Uno dei principali vantaggi della virtualizzazione è il costo complessivo ridotto:
Sono necessarie meno apparecchiature: la virtualizzazione consente il consolidamento dei server, che richiede meno dispositivi fisici e riduce i costi di manutenzione.
Viene consumata meno energia: il consolidamento dei server riduce i costi mensili di alimentazione e raffreddamento.
È richiesto meno spazio: il consolidamento dei server riduce la quantità di spazio richiesto.
Questi sono ulteriori vantaggi della virtualizzazione:
Prototipazione più semplice: è possibile creare rapidamente laboratori autonomi, operanti su reti isolate, per testare e creare prototipi di implementazioni di rete.
Provisioningdel server più rapido: la creazione di un server virtuale è molto più rapida rispetto al provisioning di un server fisico.
Aumentodel tempo di attività del server: la maggior parte delle piattaforme di virtualizzazione del server ora offre funzionalità avanzate di tolleranza agli errori ridondanti.
Ripristinodi emergenza migliorato: la maggior parte delle piattaforme di virtualizzazione dei server aziendali dispone di software che può aiutare a testare e automatizzare il failover prima che si verifichi un disastro.
Supportolegacy: la virtualizzazione può prolungare la durata dei sistemi operativi e delle applicazioni, fornendo più tempo alle organizzazioni per migrare verso soluzioni più recenti.
L’hypervisor è un programma, firmware o hardware che aggiunge un livello di astrazione sopra l’hardware fisico. Il livello di astrazione viene utilizzato per creare macchine virtuali che hanno accesso a tutto l’hardware della macchina fisica come CPU, memoria, controller del disco e NIC. Ognuna di queste macchine virtuali esegue un sistema operativo completo e separato.
Gli hypervisor di tipo 1 sono anche chiamati approccio ‘bare metal’ perché l’hypervisor è installato direttamente sull’hardware. Gli hypervisor di tipo 1 vengono generalmente utilizzati su server aziendali e dispositivi di rete del data center.
Un hypervisor di tipo 2 è un software che crea ed esegue istanze VM. Il computer, su cui un hypervisor supporta una o più macchine virtuali, è una macchina host. Gli hypervisor di tipo 2 sono anche chiamati hypervisor ospitati. Questo perché l’hypervisor è installato sopra il sistema operativo esistente, come macOS, Windows o Linux. Quindi, una o più istanze aggiuntive del sistema operativo vengono installate sopra l’hypervisor. Un grande vantaggio degli hypervisor di tipo 2 è che non è necessario il software della console di gestione.
Binary and IPv4 Addresses
Gli indirizzi IPv4 iniziano come binari, una serie di soli 1 e 0. Questi sono difficili da gestire, quindi gli amministratori di rete devono convertirli in decimale. Questo argomento mostra alcuni modi per farlo.
Il binario è un sistema di numerazione costituito dalle cifre 0 e 1 chiamate bit. Al contrario, il sistema di numerazione decimale è composto da 10 cifre che includono da 0 a 9.
Il binario è importante per noi da capire perché host, server e dispositivi di rete utilizzano l’indirizzamento binario. In particolare, utilizzano indirizzi IPv4 binari, come mostrato nella figura, per identificarsi a vicenda.
Ogni indirizzo è costituito da una stringa di 32 bit, suddivisa in quattro sezioni chiamate ottetti. Ogni ottetto contiene 8 bit (o 1 byte) separati da un punto. Ad esempio, al PC1 nella figura viene assegnato l’indirizzo IPv4 11000000.10101000.00001010.00001010. Il suo indirizzo gateway predefinito sarebbe quello dell’interfaccia R1 Gigabit Ethernet 11000000.10101000.00001010.00000001.
Il binario funziona bene con host e dispositivi di rete. Tuttavia, è molto difficile per gli esseri umani lavorare con loro.
Per facilità d’uso da parte delle persone, gli indirizzi IPv4 sono comunemente espressi in notazione decimale puntata. Al PC1 viene assegnato l’indirizzo IPv4 192.168.10.10 e il suo indirizzo gateway predefinito è 192.168.10.1, come mostrato nella figura.
Per una solida comprensione dell’indirizzamento di rete, è necessario conoscere l’indirizzamento binario e acquisire abilità pratiche nella conversione tra indirizzi IPv4 binari e decimali puntati. Questa sezione tratterà come eseguire la conversione tra i sistemi di numerazione in base due (binari) e in base 10 (decimali).
Hexadecimal and IPv6 Addresses
Ora sai come convertire binario in decimale e decimale in binario. Hai bisogno di quell’abilità per comprendere l’indirizzamento IPv4 nella tua rete. Ma è altrettanto probabile che utilizzi indirizzi IPv6 nella tua rete. Per comprendere gli indirizzi IPv6, devi essere in grado di convertire da esadecimale a decimale e viceversa.
Proprio come il decimale è un sistema numerico in base dieci, l’esadecimale è un sistema in base sedici. Il sistema numerico in base sedici utilizza le cifre da 0 a 9 e le lettere dalla A alla F. La figura mostra i valori decimali ed esadecimali equivalenti per il binario da 0000 a 1111.
Binario ed esadecimale funzionano bene insieme perché è più facile esprimere un valore come singola cifra esadecimale piuttosto che come quattro bit binari.
Il sistema di numerazione esadecimale viene utilizzato nelle reti per rappresentare gli indirizzi IP versione 6 e gli indirizzi MAC Ethernet.
Gli indirizzi IPv6 hanno una lunghezza di 128 bit e ogni 4 bit è rappresentato da una singola cifra esadecimale; per un totale di 32 valori esadecimali. Gli indirizzi IPv6 non fanno distinzione tra maiuscole e minuscole e possono essere scritti in minuscolo o maiuscolo.
Come mostrato nella figura, il formato preferito per scrivere un indirizzo IPv6 è x:x:x:x:x:x:x:x, con ogni “x” composta da quattro valori esadecimali. Quando ci riferiamo a 8 bit di un indirizzo IPv4 usiamo il termine ottetto. In IPv6, hextet è il termine non ufficiale usato per fare riferimento a un segmento di 16 bit o quattro valori esadecimali. Ogni “x” è un singolo hextet, 16 bit o quattro cifre esadecimali.
La topologia di esempio nella figura mostra gli indirizzi esadecimali IPv6.
The Rise of Ethernet
Agli albori del networking, ogni fornitore utilizzava i propri metodi proprietari per l’interconnessione dei dispositivi di rete e dei protocolli di rete. Se avevi acquistato apparecchiature da fornitori diversi, non c‘era alcuna garanzia che le apparecchiature funzionassero insieme. L’apparecchiatura di un fornitore poteva non comunicare con lapparecchiatura di un altro.
Man mano che le reti diventavano più diffuse, sono stati sviluppati standard che definivano le regole in base alle quali operavano le apparecchiature di rete di diversi fornitori. Gli standard sono utili per il networking in molti modi:
Facilitare la progettazione
Semplificare lo sviluppo del prodotto
Promuovere la concorrenza
Fornire interconnessioni coerenti
Facilitare la formazione
Fornire più scelte di fornitori per i clienti
Non esiste un protocollo standard di rete locale ufficiale, ma nel tempo una tecnologia, Ethernet, è diventata più comune delle altre. I protocolli Ethernet definiscono come vengono formattati i dati e come vengono trasmessi sulla rete cablata. Gli standard Ethernet specificano i protocolli che operano a livello 1 e livello 2 del modello OSI. Ethernet è diventato uno standard de facto, il che significa che è la tecnologia utilizzata da quasi tutte le reti locali cablate, come mostrato nella figura.
Ethernet Evolution
“The Institute of Electrical and Electronics Engineers, o IEE””, mantiene gli standard di rete, inclusi gli standard Ethernet e wireless. I comitati IEEE sono responsabili dell’approvazione e del mantenimento degli standard per le connessioni, i requisiti dei media e i protocolli di comunicazione. Ad ogni standard tecnologico viene assegnato un numero che fa riferimento al comitato responsabile dell’approvazione e del mantenimento dello standard. Il comitato responsabile degli standard Ethernet è 802.3.
Dalla creazione di Ethernet nel 1973, gli standard si sono evoluti per specificare versioni più veloci e flessibili della tecnologia. Questa capacità di Ethernet di migliorare nel tempo è uno dei motivi principali per cui è diventato così popolare. Ogni versione di Ethernet ha uno standard associato. Ad esempio, 802.3 100BASE-T rappresenta 100 Megabit Ethernet utilizzando standard di cavo a doppino intrecciato. La notazione standard si traduce come:
100 è la velocità in Mbps
BASE sta per trasmissione in banda base
T sta per il tipo di cavo, in questo caso doppino intrecciato.
Le prime versioni di Ethernet erano relativamente lente a 10 Mbps. Le ultime versioni di Ethernet funzionano a 10 Gigabit al secondo e oltre. Immagina quanto siano più veloci queste nuove versioni rispetto alle reti Ethernet originali.
Ethernet Frames
Ethernet Encapsulation
Ethernet è una delle due tecnologie LAN utilizzate oggi, insieme alle LAN wireless (WLAN). Ethernet utilizza comunicazioni cablate, inclusi doppino intrecciato, collegamenti in fibra ottica e cavi coassiali.
Ethernet opera nel livello di collegamento dati e nel livello fisico. È una famiglia di tecnologie di rete definite negli standard IEEE 802.2 e 802.3. Ethernet supporta larghezze di banda dati di quanto segue:
10 Mbps
100 Mbps
1000 Mbps (1 Gbps)
10,000 Mbps (10 Gbps)
40,000 Mbps (40 Gbps)
100,000 Mbps (100 Gbps)
Come mostrato nella figura, gli standard Ethernet definiscono sia i protocolli Layer 2 che le tecnologie Layer 1.
Ethernet and the OSI Model
Ethernet è definita dal livello di collegamento dati e dai protocolli del livello fisico.
Data Link Sublayers
I protocolli LAN/MAN IEEE 802, incluso Ethernet, utilizzano i seguenti due sottolivelli separati del livello di collegamento dati per funzionare. Sono il Logical Link Control (LLC) e il Media Access Control (MAC), come mostrato in figura.
Ricordiamo che LLC e MAC hanno i seguenti ruoli nel livello di collegamento dati:
Sottolivello LLC: questo sottolivello IEEE 802.2 comunica tra il software di rete ai livelli superiori e l’hardware del dispositivo ai livelli inferiori. Mette informazioni nel frame che identifica quale protocollo di livello di rete viene utilizzato per il frame. Queste informazioni consentono a più protocolli Layer 3, come IPv4 e IPv6, di utilizzare la stessa interfaccia di rete e lo stesso supporto.
Sottolivello MAC: questo sottolivello (IEEE 802.3, 802.11 o 802.15 ad esempio) è implementato nell’hardware ed è responsabile dell’incapsulamento dei dati e del controllo dell’accesso ai supporti. Fornisce l’indirizzamento del livello di collegamento dati ed è integrato con varie tecnologie di livello fisico.
MAC Sublayer
Il sottolivello MAC è responsabile dell’incapsulamento dei dati e dell’accesso ai media.
Incapsulamento dei dati
L’incapsulamento dei dati IEEE 802.3 include quanto segue:
Frame Ethernet – Questa è la struttura interna del frame Ethernet.
IndirizzamentoEthernet: il frame Ethernet include sia un indirizzo MAC di origine che uno di destinazione per fornire il frame Ethernet dalla scheda di rete Ethernet alla scheda di rete Ethernet sulla stessa LAN.
Rilevamentoerrori Ethernet: il frame Ethernet include un trailer FCS (frame check sequence) utilizzato per il rilevamento degli errori.
Accesso ai media
Come mostrato nella figura, il sottolivello MAC IEEE 802.3 include le specifiche per diversi standard di comunicazione Ethernet su vari tipi di supporti, tra cui rame e fibra.
Ethernet Standards in the MAC Sublayer
Ricordiamo che l’Ethernet legacy che utilizza una topologia a bus o hub è un mezzo half-duplex condiviso. Ethernet su un supporto half-duplex utilizza un metodo di accesso basato sulla contesa, CSMA/CD (Carrier Sense Multiple Access/Collision Detection), che garantisce che un solo dispositivo stia trasmettendo alla volta. CSMA/CD consente a più dispositivi di condividere lo stesso supporto half-duplex, rilevando una collisione quando più di un dispositivo tenta di trasmettere contemporaneamente. Fornisce inoltre un algoritmo di back-off per la ritrasmissione.
Le LAN Ethernet di oggi utilizzano switch che operano in full-duplex. Le comunicazioni full-duplex con switch Ethernet non richiedono il controllo degli accessi tramite CSMA/CD.
Ethernet Frame Fields
La dimensione minima del frame Ethernet è di 64 byte e il massimo previsto è di 1518 byte. Ciò include tutti i byte dal campo dell”indirizzo MAC di destinazione attraverso il campo FCS (frame check sequence). Il campo del preambolo non è incluso quando si descrive la dimensione della cornice.
Nota: la dimensione del frame può essere maggiore se sono inclusi requisiti aggiuntivi, come il tagging VLAN.
Qualsiasi frame di lunghezza inferiore a 64 byte è considerato un “frammento di collisione” o “frame runt” e viene automaticamente scartato dalle stazioni riceventi. I frame con più di 1500 byte di dati sono considerati “jumbo” o “baby giant frame”.
Se la dimensione di un frame trasmesso è inferiore al minimo o superiore al massimo, il dispositivo ricevente elimina il frame. È probabile che i frame persi siano il risultato di collisioni o altri segnali indesiderati. Sono considerati non validi. I frame jumbo sono in genere supportati dalla maggior parte degli switch e delle NIC Fast Ethernet e Gigabit Ethernet.
La figura mostra ciascun campo nel frame Ethernet. Fare riferimento alla tabella per ulteriori informazioni sulla funzione di ciascun campo.
MAC Address and Hexadecimal
Nel networking, gli indirizzi IPv4 sono rappresentati utilizzando il sistema numerico in base dieci decimale e il sistema numerico in base 2 binario. Gli indirizzi IPv6 e gli indirizzi Ethernet sono rappresentati utilizzando il sistema numerico a base esadecimale di sedici. Per capire l’esadecimale, devi prima avere molta familiarità con il binario e il decimale.
Il sistema di numerazione esadecimale utilizza i numeri da 0 a 9 e le lettere dalla A alla F.
Un indirizzo MAC Ethernet è costituito da un valore binario a 48 bit. L’esadecimale viene utilizzato per identificare un indirizzo Ethernet perché una singola cifra esadecimale rappresenta quattro bit binari. Pertanto, un indirizzo MAC Ethernet a 48 bit può essere espresso utilizzando solo 12 valori esadecimali.
La figura confronta i valori decimali ed esadecimali equivalenti per i binari da 0000 a 1111.
Equivalenti decimali e binari da 0 a F esadecimale
Dato che 8 bit (un byte) è un raggruppamento binario comune, il numero binario da 00000000 a 11111111 può essere rappresentato in esadecimale come l’intervallo da 00 a FF, come mostrato nella figura successiva.
Equivalenti decimali, binari ed esadecimali selezionati
Quando si utilizza l’esadecimale, gli zeri iniziali vengono sempre visualizzati per completare la rappresentazione a 8 bit. Ad esempio, nella tabella, il valore binario 0000 1010 è mostrato in esadecimale come 0A.
I numeri esadecimali sono spesso rappresentati dal valore preceduto da 0x (ad esempio, 0x73) per distinguere tra valori decimali ed esadecimali nella documentazione.
L’esadecimale può anche essere rappresentato da un pedice 16 o dal numero esadecimale seguito da una H (ad esempio, 73H).
Potrebbe essere necessario convertire tra valori decimali ed esadecimali. Se tali conversioni sono necessarie, convertire il valore decimale o esadecimale in binario, quindi convertire il valore binario in decimale o esadecimale a seconda dei casi.
Unicast MAC Address
In Ethernet, vengono utilizzati diversi indirizzi MAC per le comunicazioni unicast, broadcast e multicast di livello 2.
Un indirizzo MAC unicast è l’indirizzo univoco utilizzato quando un frame viene inviato da un singolo dispositivo di trasmissione a un singolo dispositivo di destinazione.
La figura mostra come viene elaborato un fotogramma unicast. In questo esempio l’indirizzo MAC di destinazione e l’indirizzo IP di destinazione sono entrambi unicast.
Nell’esempio mostrato, un host con indirizzo IPv4 192.168.1.5 (sorgente) richiede una pagina web dal server all’indirizzo IPv4 unicast 192.168.1.200. Per inviare e ricevere un pacchetto unicast, è necessario che nell’intestazione del pacchetto IP sia presente un indirizzo IP di destinazione. Nell’intestazione del frame Ethernet deve essere presente anche un indirizzo MAC di destinazione corrispondente. L’indirizzo IP e l’indirizzo MAC si combinano per fornire i dati a un host di destinazione specifico.
Il processo utilizzato da un host di origine per determinare l’indirizzo MAC di destinazione associato a un indirizzo IPv4 è noto come ARP (Address Resolution Protocol). Il processo utilizzato da un host di origine per determinare l’indirizzo MAC di destinazione associato a un indirizzo IPv6 è noto come Neighbor Discovery (ND).
Nota: l’indirizzo MAC di origine deve essere sempre un unicast.
Broadcast MAC Address
Un frame di trasmissione Ethernet viene ricevuto ed elaborato da ogni dispositivo sulla LAN Ethernet. Le caratteristiche di una trasmissione Ethernet sono le seguenti:
Ha un indirizzo MAC di destinazione di FF-FF-FF-FF-FF-FF in esadecimale (48 in binario).
Viene invaso da tutte le porte dello switch Ethernet tranne la porta in entrata.
Non viene inoltrato da un router.
Se i dati incapsulati sono un pacchetto broadcast IPv4, ciò significa che il pacchetto contiene un indirizzo IPv4 di destinazione che ha tutti quelli (1) nella parte host. Questa numerazione nell’indirizzo significa che tutti gli host su quella rete locale (dominio di trasmissione) riceveranno ed elaboreranno il pacchetto.
La figura mostra come viene elaborato un frame di trasmissione. In questo esempio l’indirizzo MAC di destinazione e l’indirizzo IP di destinazione sono entrambi broadcast.
Come mostrato , l’host di origine invia un pacchetto di trasmissione IPv4 a tutti i dispositivi sulla sua rete. L’indirizzo di destinazione IPv4 è un indirizzo di trasmissione, 192.168.1.255. Quando il pacchetto broadcast IPv4 è incapsulato nel frame Ethernet, l’indirizzo MAC di destinazione è l’indirizzo MAC broadcast di FF-FF-FF-FF-FF-FF in esadecimale (48 unità in binario).
DHCP per IPv4 è un esempio di protocollo che utilizza indirizzi broadcast Ethernet e IPv4.
Tuttavia, non tutte le trasmissioni Ethernet trasportano un pacchetto di trasmissione IPv4. Ad esempio, le richieste ARP non utilizzano IPv4, ma il messaggio ARP viene inviato come trasmissione Ethernet.
Multicast MAC Address
Un frame multicast Ethernet viene ricevuto ed elaborato da un gruppo di dispositivi sulla LAN Ethernet che appartengono allo stesso gruppo multicast. Le caratteristiche di un multicast Ethernet sono le seguenti:
Esiste un indirizzo MAC di destinazione 01-00-5E quando i dati incapsulati sono un pacchetto multicast IPv4 e un indirizzo MAC di destinazione 33-33 quando i dati incapsulati sono un pacchetto multicast IPv6.
Esistono altri indirizzi MAC di destinazione multicast riservati per quando i dati incapsulati non sono IP, come Spanning Tree Protocol (STP) e Link Layer Discovery Protocol (LLDP).
Viene allagato su tutte le porte dello switch Ethernet tranne la porta in entrata, a meno che lo switch non sia configurato per lo snooping multicast.
Non viene inoltrato da un router, a meno che il router non sia configurato per instradare pacchetti multicast.
Se i dati incapsulati sono un pacchetto multicast IP, ai dispositivi che appartengono a un gruppo multicast viene assegnato un indirizzo IP del gruppo multicast. L’intervallo di indirizzi multicast IPv4 va da 224.0.0.0 a 239.255.255.255. L’intervallo di indirizzi multicast IPv6 inizia con ff00::/8. Poiché gli indirizzi multicast rappresentano un gruppo di indirizzi (a volte chiamato gruppo host), possono essere utilizzati solo come destinazione di un pacchetto. L’origine sarà sempre un indirizzo unicast.
Come per gli indirizzi unicast e broadcast, l’indirizzo IP multicast richiede un indirizzo MAC multicast corrispondente per consegnare i frame su una rete locale. L’indirizzo MAC multicast è associato e utilizza le informazioni di indirizzamento provenienti dall’indirizzo multicast IPv4 o IPv6.
La figura mostra come viene elaborato un fotogramma multicast. In questo esempio, l’indirizzo MAC di destinazione e l’indirizzo IP di destinazione sono entrambi multicast.
I protocolli di routing e altri protocolli di rete utilizzano l’indirizzamento multicast. Anche applicazioni come software video e di imaging possono utilizzare l’indirizzamento multicast, sebbene le applicazioni multicast non siano così comuni.
Switch Fundamentals
Ora che sai tutto sugli indirizzi MAC Ethernet, è il momento di parlare di come uno switch utilizza questi indirizzi per inoltrare (o scartare) i frame ad altri dispositivi su una rete. Se uno switch inoltrasse semplicemente ogni frame ricevuto su tutte le porte, la tua rete sarebbe così congestionata che probabilmente si fermerebbe completamente.
Uno switch Ethernet di livello 2 utilizza gli indirizzi MAC di livello 2 per prendere decisioni di inoltro. È completamente all’oscuro dei dati (protocollo) trasportati nella porzione di dati del frame, come un pacchetto IPv4, un messaggio ARP o un pacchetto ND IPv6. Lo switch prende le sue decisioni di inoltro basandosi esclusivamente sugli indirizzi MAC Ethernet di livello 2.
Uno switch Ethernet esamina la sua tabella degli indirizzi MAC per prendere una decisione di inoltro per ciascun frame, a differenza degli hub Ethernet legacy che ripetono i bit su tutte le porte tranne la porta in entrata. Nella figura, lo switch a quattro porte è stato appena acceso. La tabella mostra la tabella degli indirizzi MAC che non ha ancora appreso gli indirizzi MAC per i quattro PC collegati.
Nota: gli indirizzi MAC vengono abbreviati in questo argomento a scopo dimostrativo.
La tabella degli indirizzi MAC dello switch è vuota.
Nota: la tabella degli indirizzi MAC viene talvolta definita tabella CAM (Content Addressable Memory). Sebbene il termine tabella CAM sia abbastanza comune, ai fini di questo corso ci riferiremo ad esso come tabella di indirizzi MAC.
Switch Learning and Forwarding
Lo switch crea dinamicamente la tabella degli indirizzi MAC esaminando l’indirizzo MAC di origine dei frame ricevuti su una porta. Lo switch inoltra i frame cercando una corrispondenza tra l’indirizzo MAC di destinazione nel frame e una voce nella tabella degli indirizzi MAC.
Esaminare l’indirizzo MAC di origine
Ogni frame che entra in uno switch viene controllato per nuove informazioni da apprendere. Lo fa esaminando l’indirizzo MAC di origine del frame e il numero di porta in cui il frame è entrato nello switch. Se l’indirizzo MAC di origine non esiste, viene aggiunto alla tabella insieme al numero di porta in entrata. Se l’indirizzo MAC di origine esiste, lo switch aggiorna il timer di aggiornamento per quella voce nella tabella. Per impostazione predefinita, la maggior parte degli switch Ethernet mantiene una voce nella tabella per 5 minuti.
Nella figura, ad esempio, il PC-A sta inviando un frame Ethernet al PC-D. La tabella mostra che lo switch aggiunge l’indirizzo MAC per PC-A alla tabella degli indirizzi MAC.
Nota: se l’indirizzo MAC di origine esiste nella tabella ma su una porta diversa, lo switch lo tratta come una nuova voce. La voce viene sostituita utilizzando lo stesso indirizzo MAC ma con il numero di porta più attuale.
PC-A invia un frame Ethernet.
Lo switch aggiunge il numero di porta e l’indirizzo MAC per il PC-A alla tabella degli indirizzi MAC.
Trova l’indirizzo MAC di destinazione
Se l’indirizzo MAC di destinazione è un indirizzo unicast, lo switch cercherà una corrispondenza tra l’indirizzo MAC di destinazione del frame e una voce nella sua tabella degli indirizzi MAC. Se l’indirizzo MAC di destinazione è nella tabella, inoltrerà il frame fuori dalla porta specificata. Se l’indirizzo MAC di destinazione non è nella tabella, lo switch inoltrerà il frame a tutte le porte tranne la porta in entrata. Questo è chiamato unicast sconosciuto.
Come mostrato nella figura, lo switch non ha l’indirizzo MAC di destinazione nella sua tabella per PC-D, quindi invia il frame a tutte le porte tranne la porta 1.
Nota: se l’indirizzo MAC di destinazione è un broadcast o un multicast, il frame viene distribuito anche su tutte le porte tranne la porta in ingresso.
L’indirizzo MAC di destinazione non è nella tabella.
Lo switch inoltra il frame a tutte le altre porte.
Filtering Frames
Poiché uno switch riceve frame da diversi dispositivi, è in grado di popolare la sua tabella di indirizzi MAC esaminando l’indirizzo MAC di origine di ogni frame. Quando la tabella degli indirizzi MAC dello switch contiene l’indirizzo MAC di destinazione, è in grado di filtrare il frame e inoltrare una singola porta.
PC-D to switch
Nella figura, PC-D sta rispondendo a PC-A. Lo switch rileva l’indirizzo MAC del PC-D nel frame in entrata sulla porta 4. Lo switch quindi inserisce l’indirizzo MAC del PC-D nella tabella degli indirizzi MAC associata alla porta 4.
Lo switch aggiunge il numero di porta e l’indirizzo MAC per PC-D alla sua tabella degli indirizzi MAC.
Switch to PC-A
Successivamente, poiché lo switch ha l’indirizzo MAC di destinazione per PC-A nella tabella degli indirizzi MAC, invierà il frame solo dalla porta 1, come mostrato nella figura.
Lo switch dispone di una voce dell’indirizzo MAC per la destinazione.
Lo switch filtra il frame, inviandolo solo alla porta 1.
PC-A to switch to PC-D
Successivamente, PC-A invia un altro frame a PC-D, come mostrato nella figura. La tabella degli indirizzi MAC contiene già l’indirizzo MAC per PC-A; pertanto, il timer di aggiornamento di cinque minuti per quella voce viene reimpostato. Successivamente, poiché la tabella degli switch contiene l’indirizzo MAC di destinazione per PC-D, invia il frame solo alla porta 4.
Lo switch riceve un altro frame dal PC-A e aggiorna il timer per l’immissione dell’indirizzo MAC per la porta 1.
Lo switch dispone di una voce recente per l’indirizzo MAC di destinazione e filtra il frame, inoltrandolo solo alla porta 4.
MAC Address Tables on Connected Switches
Uno switch può avere più indirizzi MAC associati a una singola porta. Questo è comune quando lo switch è collegato a un altro switch. Lo switch avrà una voce della tabella degli indirizzi MAC separata per ogni frame ricevuto con un indirizzo MAC di origine diverso.
Send the Frame to the Default Gateway
Quando un dispositivo ha un indirizzo IP che si trova su una rete remota, il frame Ethernet non può essere inviato direttamente al dispositivo di destinazione. Invece, il frame Ethernet viene inviato all’indirizzo MAC del gateway predefinito, il router.
Nota: il pacchetto IP inviato dal PC-A a una destinazione su una rete remota ha un indirizzo IP di origine di PC-A e un indirizzo IP di destinazione dell’host remoto. Il pacchetto IP di ritorno avrà l’indirizzo IP di origine dell’host remoto e l’indirizzo IP di destinazione sarà quello del PC-A.
Ethernet – Riepilogo
Non esiste un protocollo standard di rete locale ufficiale, ma nel tempo una tecnologia, Ethernet, è diventata più comune delle altre. I protocolli Ethernet definiscono come vengono formattati i dati e come vengono trasmessi sulla rete cablata. Gli standard Ethernet specificano i protocolli che operano a livello 1 e livello 2 del modello OSI. Ethernet è diventato uno standard de facto, il che significa che è la tecnologia utilizzata da quasi tutte le reti locali cablate.
IEEE mantiene gli standard di rete, inclusi gli standard Ethernet e wireless. Ad ogni standard tecnologico viene assegnato un numero che fa riferimento al comitato responsabile dell’approvazione e del mantenimento dello standard. Lo standard Ethernet 802.3 è migliorato nel tempo.
Gli switch Ethernet possono inviare un frame a tutte le porte (esclusa la porta da cui è stato ricevuto). Ogni host che riceve questo frame esamina l’indirizzo MAC di destinazione e lo confronta con il proprio indirizzo MAC. È la scheda NIC Ethernet che esamina e confronta l’indirizzo MAC. Se non corrisponde all’indirizzo MAC dell’host, il resto del frame viene ignorato. Quando è una corrispondenza, quell’host riceve il resto del frame e il messaggio che contiene.
Ethernet Frames
Ethernet è definita dai protocolli di livello di collegamento dati 802.2 e 802.3. Ethernet supporta larghezze di banda dati da 10 Mbps fino a 100 Gps. I protocolli LAN/MAN EEE 802, incluso Ethernet, utilizzano due sottolivelli separati del livello di collegamento dati per funzionare: LLC e MAC.
Sottolivello LLC: questo sottolivello IEEE 802.2 comunica tra il software di rete ai livelli superiori e l’hardware del dispositivo ai livelli inferiori. Mette informazioni nel frame che identifica quale protocollo di livello di rete viene utilizzato per il frame. Queste informazioni consentono a più protocolli Layer 3, come IPv4 e IPv6, di utilizzare la stessa interfaccia di rete e lo stesso supporto.
Sottolivello MAC: questo sottolivello (IEEE 802.3, 802.11 o 802.15 ad esempio) è implementato nell’hardware ed è responsabile dell’incapsulamento dei dati e del controllo dell’accesso ai supporti. Fornisce l’indirizzamento del livello di collegamento dati ed è integrato con varie tecnologie di livello fisico. L’incapsulamento dei dati include il frame Ethernet, l’indirizzamento Ethernet e il rilevamento degli errori Ethernet.
Le LAN Ethernet di oggi utilizzano switch che operano in full-duplex. Le comunicazioni full-duplex con switch Ethernet non richiedono il controllo degli accessi tramite CSMA/CD. La dimensione minima del frame Ethernet è di 64 byte e il massimo previsto è di 1518 byte. I campi sono Preambolo e Delimitatore frame iniziale, Indirizzo MAC di destinazione, Indirizzo MAC di origine, Tipo/Lunghezza, Dati e FCS. Ciò include tutti i byte dal campo dell’indirizzo MAC di destinazione attraverso il campo FCS.
Ethernet MAC Address
Un indirizzo MAC Ethernet è costituito da un valore binario a 48 bit. L’esadecimale viene utilizzato per identificare un indirizzo Ethernet perché una singola cifra esadecimale rappresenta quattro bit binari. Pertanto, un indirizzo MAC Ethernet a 48 bit può essere espresso utilizzando solo 12 valori esadecimali.
Un indirizzo MAC unicast è l’indirizzo univoco utilizzato quando un frame viene inviato da un singolo dispositivo di trasmissione a un singolo dispositivo di destinazione. Il processo utilizzato da un host di origine per determinare l’indirizzo MAC di destinazione associato a un indirizzo IPv4 è ARP. Il processo utilizzato da un host di origine per determinare l’indirizzo MAC di destinazione associato a un indirizzo IPv6 è ND.
Le caratteristiche di una trasmissione Ethernet sono le seguenti:
Ha un indirizzo MAC di destinazione di FF-FF-FF-FF-FF-FF in esadecimale (48 in binario).
Viene invaso da tutte le porte dello switch Ethernet tranne la porta in entrata.
Non viene inoltrato da un router.
Le caratteristiche di un multicast Ethernet sono le seguenti:
Esiste un indirizzo MAC di destinazione 01-00-5E quando i dati incapsulati sono un pacchetto multicast IPv4 e un indirizzo MAC di destinazione 33-33 quando i dati incapsulati sono un pacchetto multicast IPv6.
Esistono altri indirizzi MAC di destinazione multicast riservati per quando i dati incapsulati non sono IP, come STP e LLDP.
Viene allagato su tutte le porte dello switch Ethernet tranne la porta in entrata, a meno che lo switch non sia configurato per lo snooping multicast.
Non viene inoltrato da un router, a meno che il router non sia configurato per instradare pacchetti multicast.
The MAC Address Table
Uno switch Ethernet di livello 2 utilizza gli indirizzi MAC di livello 2 per prendere decisioni di inoltro. È completamente all’oscuro dei dati (protocollo) trasportati nella porzione di dati del frame. Uno switch Ethernet esamina la sua tabella degli indirizzi MAC per prendere una decisione di inoltro per ciascun frame. La tabella degli indirizzi MAC viene talvolta definita tabella CAM.
Lo switch crea dinamicamente la tabella degli indirizzi MAC esaminando l’indirizzo MAC di origine dei frame ricevuti su una porta. Lo switch inoltra i frame cercando una corrispondenza tra l’indirizzo MAC di destinazione nel frame e una voce nella tabella degli indirizzi MAC. Se l’indirizzo MAC di destinazione è un indirizzo unicast, lo switch cercherà una corrispondenza tra l’indirizzo MAC di destinazione del frame e una voce nella sua tabella degli indirizzi MAC. Se l’indirizzo MAC di destinazione è nella tabella, inoltrerà il frame fuori dalla porta specificata. Se l’indirizzo MAC di destinazione non è nella tabella, lo switch inoltrerà il frame a tutte le porte tranne la porta in entrata. Questo è chiamato unicast sconosciuto.
Poiché uno switch riceve frame da diversi dispositivi, è in grado di popolare la sua tabella di indirizzi MAC esaminando l’indirizzo MAC di origine di ogni frame. Quando la tabella degli indirizzi MAC dello switch contiene l’indirizzo MAC di destinazione, è in grado di filtrare il frame e inoltrare una singola porta. Uno switch può avere più indirizzi MAC associati a una singola porta. Questo è comune quando lo switch è collegato a un altro switch. Lo switch avrà una voce della tabella degli indirizzi MAC separata per ogni frame ricevuto con un indirizzo MAC di origine diverso. Quando un dispositivo ha un indirizzo IP che si trova su una rete remota, il frame Ethernet non può essere inviato direttamente al dispositivo di destinazione. Invece, il frame Ethernet viene inviato all’indirizzo MAC del gateway predefinito, il router.
Network Layer Characteristics
Data Encapsulation
The Network Layer
Il livello di rete, o OSI Layer 3, fornisce servizi per consentire ai dispositivi finali di scambiare dati attraverso le reti. Come mostrato nella figura, IP versione 4 (IPv4) e IP versione 6 (IPv6) sono i principali protocolli di comunicazione a livello di rete. Altri protocolli a livello di rete includono protocolli di routing come OSPF (Open Shortest Path First) e protocolli di messaggistica come ICMP (Internet Control Message Protocol).
Per realizzare comunicazioni end-to-end attraverso i confini della rete, i protocolli del livello di rete eseguono quattro operazioni di base:
Indirizzamento dei dispositivi finali: i dispositivi finali devono essere configurati con un indirizzo IP univoco per l’identificazione sulla rete.
Incapsulamento: il livello di rete incapsula l’unità dati del protocollo (PDU) dal livello di trasporto in un pacchetto. Il processo di incapsulamento aggiunge informazioni sull’intestazione IP, come l’indirizzo IP degli host di origine (invio) e di destinazione (ricezione). Il processo di incapsulamento viene eseguito dall’origine del pacchetto IP.
Routing: il livello di rete fornisce servizi per indirizzare i pacchetti a un host di destinazione su un’altra rete. Per viaggiare su altre reti, il pacchetto deve essere elaborato da un router. Il ruolo del router è selezionare il percorso migliore e indirizzare i pacchetti verso l’host di destinazione in un processo noto come instradamento. Un pacchetto può attraversare molti router prima di raggiungere l’host di destinazione. Ogni router attraversato da un pacchetto per raggiungere l’host di destinazione è chiamato hop.
De-incapsulamento: quando il pacchetto arriva al livello di rete dell’host di destinazione, l’host controlla l’intestazione IP del pacchetto. Se l’indirizzo IP di destinazione all’interno dell’intestazione corrisponde al proprio indirizzo IP, l’intestazione IP viene rimossa dal pacchetto. Dopo che il pacchetto è stato de-incapsulato dal livello di rete, la PDU di livello 4 risultante viene passata al servizio appropriato al livello di trasporto. Il processo di de-incapsulamento viene eseguito dall’host di destinazione del pacchetto IP.
A differenza del livello di trasporto (OSI Layer 4), che gestisce il trasporto dei dati tra i processi in esecuzione su ciascun host, i protocolli di comunicazione del livello di rete (ovvero IPv4 e IPv6) specificano la struttura del pacchetto e l’elaborazione utilizzata per trasportare i dati da un host all’altro ospite. Il funzionamento indipendentemente dai dati contenuti in ciascun pacchetto consente al livello di rete di trasportare pacchetti per più tipi di comunicazioni tra più host.
IP Encapsulation
IP incapsula il segmento del livello di trasporto (il livello appena sopra il livello di rete) o altri dati aggiungendo un’intestazione IP. L’intestazione IP viene utilizzata per consegnare il pacchetto all’host di destinazione.
La figura illustra come la PDU del livello di trasporto viene incapsulata dalla PDU del livello di rete per creare un pacchetto IP.
Il processo di incapsulamento dei dati strato per strato consente ai servizi ai diversi livelli di svilupparsi e ridimensionarsi senza influire sugli altri livelli. Ciò significa che i segmenti del livello di trasporto possono essere prontamente impacchettati da IPv4 o IPv6 o da qualsiasi nuovo protocollo che potrebbe essere sviluppato in futuro.
L’intestazione IP viene esaminata dai dispositivi di livello 3 (ovvero router e switch di livello 3) mentre viaggia attraverso una rete fino alla sua destinazione. È importante notare che le informazioni sull’indirizzamento IP rimangono le stesse dal momento in cui il pacchetto lascia l’host di origine fino a quando non arriva all’host di destinazione, tranne quando vengono tradotte dal dispositivo che esegue la traduzione degli indirizzi di rete (NAT) per IPv4.
I router implementano protocolli di routing per instradare i pacchetti tra le reti. Il routing eseguito da questi dispositivi intermedi esamina l’indirizzamento del livello di rete nell’intestazione del pacchetto. In tutti i casi, la porzione di dati del pacchetto, cioè la PDU del livello di trasporto incapsulato o altri dati, rimane invariata durante i processi del livello di rete.
Characteristics of IP
L’IP è stato progettato come un protocollo con un sovraccarico ridotto. Fornisce solo le funzioni necessarie per consegnare un pacchetto da una sorgente a una destinazione su un sistema di reti interconnesse. Il protocollo non è stato progettato per tracciare e gestire il flusso di pacchetti. Queste funzioni, se richieste, vengono eseguite da altri protocolli su altri livelli, principalmente TCP a livello 4.
Queste sono le caratteristiche di base dell’IP:
Senza connessione: non esiste alcuna connessione con la destinazione stabilita prima dell’invio dei pacchetti di dati.
Best Effort: l’IP è intrinsecamente inaffidabile perché la consegna dei pacchetti non è garantita.
Indipendente dal supporto: il funzionamento è indipendente dal supporto (ad es. rame, fibra ottica o wireless) che trasporta i dati.
Connectionless
L’IP è senza connessione, il che significa che nessuna connessione end-to-end dedicata viene creata dall’’IP prima che i dati vengano inviati. La comunicazione senza connessione è concettualmente simile all’invio di una lettera a qualcuno senza avvisare il destinatario in anticipo. La figura riassume questo punto chiave.
Connectionless – Analogy
Le comunicazioni dati senza connessione funzionano secondo lo stesso principio. Come mostrato nella figura, l’IP non richiede uno scambio iniziale di informazioni di controllo per stabilire una connessione end-to-end prima che i pacchetti vengano inoltrati.
Connectionless – Network
Best Effort
IP inoltre non richiede campi aggiuntivi nell’intestazione per mantenere una connessione stabilita. Questo processo riduce notevolmente l’overhead dell’IP. Tuttavia, senza una connessione end-to-end prestabilita, i mittenti non sanno se i dispositivi di destinazione sono presenti e funzionanti durante l’invio dei pacchetti, né se la destinazione riceve il pacchetto o se il dispositivo di destinazione è in grado di accedere e leggere il pacchetto.
Il protocollo IP non garantisce che tutti i pacchetti consegnati vengano effettivamente ricevuti. La figura illustra la caratteristica di consegna inaffidabile o best-effort del protocollo IP.
In quanto protocollo a livello di rete inaffidabile, l’IP non garantisce che tutti i pacchetti inviati verranno ricevuti. Altri protocolli gestiscono il processo di tracciamento dei pacchetti e ne garantiscono la consegna.
Media Independent
Inaffidabile significa che l’IP non ha la capacità di gestire e recuperare pacchetti non consegnati o corrotti. Questo perché mentre i pacchetti IP vengono inviati con informazioni sulla posizione di consegna, non contengono informazioni che possono essere elaborate per informare il mittente se la consegna è andata a buon fine. I pacchetti possono arrivare a destinazione danneggiati, fuori sequenza o per niente. L’IP non fornisce alcuna capacità per la ritrasmissione dei pacchetti se si verificano errori.
Se vengono recapitati pacchetti fuori ordine o mancano pacchetti, le applicazioni che utilizzano i dati oi servizi di livello superiore devono risolvere questi problemi. Ciò consente all’IP di funzionare in modo molto efficiente. Nella suite di protocolli TCP/IP, l’affidabilità è il ruolo del protocollo TCP a livello di trasporto.
L’IP opera indipendentemente dai supporti che trasportano i dati ai livelli inferiori dello stack del protocollo. Come mostrato nella figura, i pacchetti IP possono essere comunicati come segnali elettronici su cavo in rame, come segnali ottici su fibra o in modalità wireless come segnali radio.
I pacchetti IP possono viaggiare su diversi media.
Il livello di collegamento dati OSI è responsabile di prendere un pacchetto IP e prepararlo per la trasmissione sul mezzo di comunicazione. Ciò significa che la consegna dei pacchetti IP non è limitata a nessun mezzo particolare.
C’è, tuttavia, una caratteristica principale del supporto che il livello di rete considera: la dimensione massima della PDU che ogni supporto può trasportare. Questa caratteristica è indicata come l’unità massima di trasmissione (MTU). Parte della comunicazione di controllo tra il livello di collegamento dati e il livello di rete è la definizione di una dimensione massima per il pacchetto. Il livello di collegamento dati trasmette il valore MTU al livello di rete. Il livello di rete determina quindi quanto possono essere grandi i pacchetti.
In alcuni casi, un dispositivo intermedio, solitamente un router, deve suddividere un pacchetto IPv4 quando lo inoltra da un supporto a un altro supporto con un MTU inferiore. Questo processo è chiamato frammentazione del pacchetto o frammentazione. La frammentazione causa latenza. I pacchetti IPv6 non possono essere frammentati dal router.
IPv4 Packet
IPv4 Packet Header
IPv4 è uno dei principali protocolli di comunicazione a livello di rete. L’intestazione del pacchetto IPv4 viene utilizzata per garantire che questo pacchetto venga consegnato alla fermata successiva lungo il percorso verso il dispositivo finale di destinazione.
L’intestazione di un pacchetto IPv4 è costituita da campi contenenti informazioni importanti sul pacchetto. Questi campi contengono numeri binari che vengono esaminati dal processo Layer 3.
IPv4 Packet Header Fields
I valori binari di ciascun campo identificano varie impostazioni del pacchetto IP. I diagrammi di intestazione del protocollo, che vengono letti da sinistra a destra e dall’alto verso il basso, forniscono un elemento visivo a cui fare riferimento quando si discute dei campi del protocollo. Il diagramma dell’intestazione del protocollo IP nella figura identifica i campi di un pacchetto IPv4.
Campi nell’intestazione del pacchetto IPv4
I campi significativi nell’intestazione IPv4 includono quanto segue:
Versione: contiene un valore binario a 4 bit impostato su 0100 che lo identifica come pacchetto IPv4.
Differentiated Services o DiffServ (DS): precedentemente chiamato campo del tipo di servizio (ToS), il campo DS è un campo a 8 bit utilizzato per determinare la priorità di ciascun pacchetto. I sei bit più significativi del campo DiffServ sono i bit del punto di codice dei servizi differenziati (DSCP) e gli ultimi due bit sono i bit di notifica esplicita della congestione (ECN).
Time to Live (TTL): TTL contiene un valore binario a 8 bit utilizzato per limitare la durata di un pacchetto. Il dispositivo di origine del pacchetto IPv4 imposta il valore TTL iniziale. Viene diminuito di uno ogni volta che il pacchetto viene elaborato da un router. Se il campo TTL scende a zero, il router scarta il pacchetto e invia un messaggio ICMP (Internet Control Message Protocol) Time Exceeded all’indirizzo IP di origine. Poiché il router diminuisce il TTL di ciascun pacchetto, il router deve anche ricalcolare il checksum dell’intestazione.
Protocollo: questo campo viene utilizzato per identificare il protocollo di livello successivo. Questo valore binario a 8 bit indica il tipo di payload di dati trasportato dal pacchetto, che consente al livello di rete di passare i dati al protocollo di livello superiore appropriato. I valori comuni includono ICMP (1), TCP (6) e UDP (17).
HeaderChecksum: viene utilizzato per rilevare la corruzione nell’intestazione IPv4.
Indirizzo IPv4 di origine: contiene un valore binario a 32 bit che rappresenta l’indirizzo IPv4 di origine del pacchetto. L’indirizzo IPv4 di origine è sempre un indirizzo unicast.
Indirizzo IPv4 di destinazione: contiene un valore binario a 32 bit che rappresenta l’indirizzo IPv4 di destinazione del pacchetto. L’indirizzo IPv4 di destinazione è un indirizzo unicast, multicast o broadcast.
I due campi a cui si fa più comunemente riferimento sono gli indirizzi IP di origine e di destinazione. Questi campi identificano da dove proviene il pacchetto e dove sta andando. In genere, questi indirizzi non cambiano durante il viaggio dall’origine alla destinazione.
I campi Internet Header Length (IHL), Total Length e Header Checksum vengono utilizzati per identificare e convalidare il pacchetto.
Altri campi vengono utilizzati per riordinare un pacchetto frammentato. Nello specifico, il pacchetto IPv4 utilizza i campi Identification, Flags e Fragment Offset per tenere traccia dei frammenti. Un router potrebbe dover frammentare un pacchetto IPv4 quando lo inoltra da un supporto a un altro con un MTU più piccolo.
I campi Opzioni e Padding sono usati raramente e non rientrano nell’ambito di questo modulo.
IPv6 Packet
Limitations of IPv4
IPv4 è ancora in uso oggi. Questo argomento riguarda IPv6, che alla fine sostituirà IPv4. Per capire meglio perché è necessario conoscere il protocollo IPv6, è utile conoscere i limiti di IPv4 e i vantaggi di IPv6.
Nel corso degli anni, sono stati sviluppati protocolli e processi aggiuntivi per affrontare nuove sfide. Tuttavia, anche con le modifiche, IPv4 presenta ancora tre problemi principali:
Impoverimento dell’indirizzo IPv4: IPv4 dispone di un numero limitato di indirizzi pubblici univoci. Sebbene esistano circa 4 miliardi di indirizzi IPv4, il numero crescente di nuovi dispositivi abilitati per IP, connessioni sempre attive e la potenziale crescita delle regioni meno sviluppate hanno aumentato la necessità di più indirizzi.
Mancanza di connettività end-to-end: la Network Address Translation (NAT) è una tecnologia comunemente implementata nelle reti IPv4. NAT consente a più dispositivi di condividere un singolo indirizzo IPv4 pubblico. Tuttavia, poiché l’indirizzo IPv4 pubblico è condiviso, l’indirizzo IPv4 di un host di rete interno è nascosto. Questo può essere problematico per le tecnologie che richiedono la connettività end-to-end.
Maggiore complessità della rete: sebbene NAT abbia esteso la durata di IPv4, era inteso solo come meccanismo di transizione a IPv6. NAT nelle sue varie implementazioni crea ulteriore complessità nella rete, creando latenza e rendendo più difficile la risoluzione dei problemi.
IPv6 Overview
All’inizio degli anni ’90, l’Internet Engineering Task Force (IETF) iniziò a preoccuparsi dei problemi con IPv4 e iniziò a cercare un sostituto. Questa attività ha portato allo sviluppo di IP versione 6 (IPv6). IPv6 supera i limiti di IPv4 ed è un potente miglioramento con funzionalità che si adattano meglio alle esigenze di rete attuali e prevedibili.
I miglioramenti forniti da IPv6 includono quanto segue:
Maggiore spazio degli indirizzi: gli indirizzi IPv6 si basano su un indirizzamento gerarchico a 128 bit rispetto a IPv4 a 32 bit.
Migliore gestione dei pacchetti: l’intestazione IPv6 è stata semplificata con meno campi.
Elimina la necessità di NAT: con un numero così elevato di indirizzi IPv6 pubblici, non è necessario NAT tra un indirizzo IPv4 privato e un IPv4 pubblico. Ciò evita alcuni dei problemi indotti dal NAT sperimentati dalle applicazioni che richiedono connettività end-to-end.
Lo spazio degli indirizzi IPv4 a 32 bit fornisce circa 4.294.967.296 indirizzi univoci. Lo spazio degli indirizzi IPv6 fornisce 340.282.366.920.938.463.463.374.607.431.768.211.456 o 340 indirizzi undecillion. Questo è più o meno equivalente a ogni granello di sabbia sulla Terra.
La figura fornisce un’immagine per confrontare lo spazio degli indirizzi IPv4 e IPv6.
Campi dell’intestazione del pacchetto IPv4 nell’intestazione del pacchetto IPv6
Uno dei principali miglioramenti del design di IPv6 rispetto a IPv4 è l’intestazione IPv6 semplificata.
Ad esempio, l’intestazione IPv4 è composta da un’intestazione di lunghezza variabile di 20 ottetti (fino a 60 byte se viene utilizzato il campo Opzioni) e 12 campi di intestazione di base, esclusi il campo Opzioni e il campo Padding.
Per IPv6, alcuni campi sono rimasti gli stessi, alcuni campi hanno cambiato nome e posizione e alcuni campi IPv4 non sono più obbligatori, come evidenziato nella figura.
IPv4 Packet Header
La figura mostra i campi dell’intestazione del pacchetto IPv4 che sono stati mantenuti, spostati, modificati, nonché quelli che non sono stati mantenuti nell’intestazione del pacchetto IPv6.
Al contrario, l’intestazione IPv6 semplificata mostrata nella figura successiva è costituita da un’intestazione di lunghezza fissa di 40 ottetti (in gran parte a causa della lunghezza degli indirizzi IPv6 di origine e di destinazione).
L’intestazione semplificata IPv6 consente un’elaborazione più efficiente delle intestazioni IPv6.
IPv6 Packet Header
La figura mostra i campi dell’intestazione del pacchetto IPv4 che sono stati mantenuti o spostati insieme ai nuovi campi dell’intestazione del pacchetto IPv6.
IPv6 Packet Header
Il diagramma dell’intestazione del protocollo IP nella figura identifica i campi di un pacchetto IPv6.
Campi nell’intestazione del pacchetto IPv6
I campi nell’intestazione del pacchetto IPv6 includono quanto segue:
Versione: questo campo contiene un valore binario a 4 bit impostato su 0110 che lo identifica come pacchetto IP versione 6.
Classe di traffico: questo campo a 8 bit è equivalente al campo Servizi differenziati IPv4 (DS).
Etichetta di flusso: questo campo a 20 bit suggerisce che tutti i pacchetti con la stessa etichetta di flusso ricevono lo stesso tipo di gestione da parte dei router.
Lunghezzapayload: questo campo a 16 bit indica la lunghezza della porzione di dati o payload del pacchetto IPv6. Ciò non include la lunghezza dell’intestazione IPv6, che è un’intestazione fissa di 40 byte.
Intestazionesuccessiva: questo campo a 8 bit equivale al campo Protocollo IPv4. Indica il tipo di carico utile dei dati trasportato dal pacchetto, consentendo al livello di rete di passare i dati al protocollo di livello superiore appropriato.
HopLimit: questo campo a 8 bit sostituisce il campo IPv4 TTL. Questo valore viene decrementato di un valore pari a 1 da ciascun router che inoltra il pacchetto. Quando il contatore raggiunge lo 0, il pacchetto viene scartato e un messaggio ICMPv6 Time Exceeded viene inoltrato all’host di invio. Questo indica che il pacchetto non ha raggiunto la sua destinazione perché il limite di hop è stato superato. A differenza di IPv4, IPv6 non include un checksum dell’intestazione IPv6, poiché questa funzione viene eseguita sia a livello inferiore che superiore. Ciò significa che il checksum non deve essere ricalcolato da ciascun router quando diminuisce il campo Hop Limit, il che migliora anche le prestazioni della rete.
Indirizzo IPv6 di origine: questo campo a 128 bit identifica l’indirizzo IPv6 dell’host di invio.
Indirizzo IPv6 di destinazione: questo campo a 128 bit identifica l’indirizzo IPv6 dell’host ricevente.
Un pacchetto IPv6 può anche contenere intestazioni di estensione (EH), che forniscono informazioni facoltative sul livello di rete. Le intestazioni di estensione sono facoltative e vengono posizionate tra l’intestazione IPv6 e il payload. Gli EH vengono utilizzati per la frammentazione, la sicurezza, per supportare la mobilità e altro ancora.
A differenza di IPv4, i router non frammentano i pacchetti IPv6 instradati.
Network Layer Summary
Caratteristiche del livello di rete
Il livello di rete, o OSI Layer 3, fornisce servizi per consentire ai dispositivi finali di scambiare dati attraverso le reti. IPv4 e IPv6 sono i principali protocolli di comunicazione a livello di rete. Altri protocolli a livello di rete includono protocolli di routing come OSPF e protocolli di messaggistica come ICMP.
I protocolli a livello di rete eseguono quattro operazioni: indirizzamento dei dispositivi finali, incapsulamento, instradamento e de-incapsulamento. IPv4 e IPv6 specificano la struttura del pacchetto e l’elaborazione utilizzata per trasportare i dati da un host a un altro host. Il funzionamento indipendentemente dai dati contenuti in ciascun pacchetto consente al livello di rete di trasportare pacchetti per più tipi di comunicazioni tra più host.
IP incapsula il segmento del livello di trasporto o altri dati aggiungendo un’intestazione IP. L’intestazione IP viene utilizzata per consegnare il pacchetto all’host di destinazione. L’intestazione IP viene esaminata dai router e dagli switch Layer 3 mentre viaggia attraverso una rete fino alla sua destinazione. Le informazioni sull’indirizzamento IP rimangono le stesse dal momento in cui il pacchetto lascia l’host di origine fino a quando non arriva all’host di destinazione, tranne quando viene tradotto dal dispositivo che esegue NAT per IPv4.
Le caratteristiche di base dell’IP sono che è: senza connessione, massimo sforzo e indipendente dai media. L’IP è senza connessione, il che significa che nessuna connessione end-to-end dedicata viene creata dall’IP prima che i dati vengano inviati. L’IP non richiede campi aggiuntivi nell’intestazione per mantenere una connessione stabilita. Ciò riduce l’overhead dell’IP. I mittenti non sanno se i dispositivi di destinazione sono presenti e funzionanti durante l’invio dei pacchetti, né sanno se la destinazione riceve il pacchetto o se il dispositivo di destinazione è in grado di accedere e leggere il pacchetto. L’IP opera indipendentemente dai supporti che trasportano i dati ai livelli inferiori dello stack del protocollo. I pacchetti IP possono essere comunicati come segnali elettronici su cavo in rame, come segnali ottici su fibra o in modalità wireless come segnali radio. Una caratteristica del supporto che il livello di rete considera è la dimensione massima della PDU che ogni supporto può trasportare, o MTU.
Pacchetto IPv4
L’intestazione del pacchetto IPv4 viene utilizzata per garantire che un pacchetto venga consegnato alla fermata successiva lungo il percorso verso il dispositivo finale di destinazione. L’intestazione di un pacchetto IPv4 è costituita da campi contenenti numeri binari che vengono esaminati dal processo di livello 3. I campi significativi nell’intestazione IPv4 includono: versione, DS, TTL, protocollo, checksum dell’intestazione, indirizzo IPv4 di origine e indirizzo IPv4 di destinazione.
I campi IHL, Total Length e Header Checksum vengono utilizzati per identificare e convalidare il pacchetto. Il pacchetto IPv4 utilizza i campi Identification, Flags e Fragment Offset per tenere traccia dei frammenti. Un router potrebbe dover frammentare un pacchetto IPv4 quando lo inoltra da un supporto a un altro con un MTU più piccolo.
Pacchetto IPv6
IPv4 presenta limitazioni, tra cui: esaurimento degli indirizzi IPv4, mancanza di connettività end-to-end e maggiore complessità della rete. IPv6 supera i limiti di IPv4. I miglioramenti forniti da IPv6 includono quanto segue: maggiore spazio degli indirizzi, migliore gestione dei pacchetti ed elimina la necessità di NAT.
Lo spazio degli indirizzi IPv4 a 32 bit fornisce circa 4.294.967.296 indirizzi univoci. Lo spazio degli indirizzi IPv6 fornisce 340.282.366.920.938.463.463.374.607.431.768.211.456 o 340 indirizzi undecillion. Questo è più o meno equivalente a ogni granello di sabbia sulla Terra.
I campi dell’intestazione semplificata IPv6 includono: versione, classe di traffico, etichetta di flusso, lunghezza del payload, intestazione successiva, limite hop, indirizzo IP di origine e indirizzo IP di destinazione. Un pacchetto IPv6 può anche contenere EH, che fornisce informazioni opzionali sul livello di rete. Le intestazioni di estensione sono facoltative e vengono posizionate tra l’intestazione IPv6 e il payload. Gli EH vengono utilizzati per la frammentazione, la sicurezza, per supportare la mobilità e altro ancora. A differenza di IPv4, i router non frammentano i pacchetti IPv6 instradati.
IPv4 Address Structure
Network and Host Portions
Un indirizzo IPv4 è un indirizzo gerarchico a 32 bit costituito da una parte di rete e una parte host. Quando si determina la porzione di rete rispetto alla porzione host, è necessario guardare il flusso a 32 bit, come mostrato nella figura.
IPv4 Address
I bit all’interno della porzione di rete dell’indirizzo devono essere identici per tutti i dispositivi che risiedono nella stessa rete. I bit all’interno della parte host dell’indirizzo devono essere univoci per identificare un host specifico all’interno di una rete. Se due host hanno lo stesso schema di bit nella porzione di rete specificata del flusso a 32 bit, questi due host risiederanno nella stessa rete.
Ma come fanno gli host a sapere quale parte dei 32 bit identifica la rete e quale identifica l’host? Questo è il ruolo della subnet mask.
The Subnet Mask
Come mostrato nella figura, l’assegnazione di un indirizzo IPv4 a un host richiede quanto segue:
IndirizzoIPv4: questo è l’indirizzo IPv4 univoco dell’host.
Mascheradi sottorete: viene utilizzata per identificare la parte di rete/host dell’indirizzo IPv4.
Configurazione IPv4 su un computer Windows
Nota: è necessario un indirizzo IPv4 del gateway predefinito per raggiungere le reti remote e gli indirizzi IPv4 del server DNS sono necessari per tradurre i nomi di dominio in indirizzi IPv4.
La maschera di sottorete IPv4 viene utilizzata per differenziare la parte di rete dalla parte host di un indirizzo IPv4. Quando un indirizzo IPv4 viene assegnato a un dispositivo, la maschera di sottorete viene utilizzata per determinare l’indirizzo di rete del dispositivo. L’indirizzo di rete rappresenta tutti i dispositivi sulla stessa rete.
La figura successiva mostra la maschera di sottorete a 32 bit nei formati decimale puntato e binario.
Maschera di sottorete
Si noti come la subnet mask sia una sequenza consecutiva di 1 bit seguita da una sequenza consecutiva di 0 bit.
Per identificare le porzioni di rete e host di un indirizzo IPv4, la maschera di sottorete viene confrontata bit per bit con l’indirizzo IPv4, da sinistra a destra, come mostrato nella figura.
Associazione di un indirizzo IPv4 alla sua subnet mask
Si noti che la subnet mask in realtà non contiene la rete o la parte host di un indirizzo IPv4, ma indica semplicemente al computer dove cercare la parte dell’indirizzo IPv4 che è la parte di rete e quale parte è la parte host.
Il processo effettivo utilizzato per identificare la parte di rete e la parte host è chiamato ANDing.
La lunghezza del prefisso
Esprimere gli indirizzi di rete e gli indirizzi host con l’indirizzo della maschera di sottorete decimale con punti può diventare complicato. Fortunatamente, esiste un metodo alternativo per identificare una subnet mask, un metodo chiamato lunghezza del prefisso.
La lunghezza del prefisso è il numero di bit impostati su 1 nella subnet mask. È scritto in “notazione barra”, che è indicato da una barra (/) seguita dal numero di bit impostato su 1. Pertanto, contare il numero di bit nella maschera di sottorete e anteporlo con una barra.
Fare riferimento alla tabella per gli esempi. La prima colonna elenca varie subnet mask che possono essere utilizzate con un indirizzo host. La seconda colonna visualizza l’indirizzo binario a 32 bit convertito. L’ultima colonna mostra la lunghezza del prefisso risultante.
Nota: un indirizzo di rete viene anche definito prefisso o prefisso di rete. Pertanto, la lunghezza del prefisso è il numero di 1 bit nella subnet mask.
Quando si rappresenta un indirizzo IPv4 utilizzando una lunghezza del prefisso, l’indirizzo IPv4 viene scritto seguito dalla lunghezza del prefisso senza spazi. Ad esempio, 192.168.10.10 255.255.255.0 verrebbe scritto come 192.168.10.10/24. L’utilizzo di vari tipi di lunghezze di prefisso verrà discusso in seguito. Per ora, l’attenzione sarà sul prefisso /24 (ovvero 255.255.255.0)
Determinazione della rete: AND logico
Un AND logico è una delle tre operazioni booleane utilizzate nella logica booleana o digitale. Gli altri due sono OR e NOT. L’operazione AND viene utilizzata per determinare l’indirizzo di rete.
L’AND logico è il confronto di due bit che producono i risultati mostrati di seguito. Nota come solo un 1 AND 1 produce un 1. Qualsiasi altra combinazione risulta in uno 0.
1 AND 1 = 1
0 AND 1 = 0
1 AND 0 = 0
0 AND 0 = 0
Nota: nella logica digitale, 1 rappresenta True e 0 rappresenta False. Quando si utilizza un’operazione AND, entrambi i valori di input devono essere True (1) affinché il risultato sia True (1).
Per identificare l’indirizzo di rete di un host IPv4, l’indirizzo IPv4 è logicamente AND, bit per bit, con la maschera di sottorete. L’operazione AND tra l’indirizzo e la maschera di sottorete produce l’indirizzo di rete
Per illustrare come viene utilizzato AND per rilevare un indirizzo di rete, si consideri un host con indirizzo IPv4 192.168.10.10 e subnet mask 255.255.255.0, come mostrato nella figura:
Indirizzo host IPv4 (192.168.10.10): l’indirizzo IPv4 dell’host nei formati decimale puntato e binario.
Subnet mask (255.255.255.0): la subnet mask dell’host nei formati decimale puntato e binario.
Indirizzo di rete (192.168.10.0): l’operazione AND logica tra l’indirizzo IPv4 e la maschera di sottorete genera un indirizzo di rete IPv4 mostrato nei formati decimale puntato e binario.
Utilizzando la prima sequenza di bit come esempio, si noti che l’operazione AND viene eseguita sull’1 bit dell’indirizzo host con l’1 bit della subnet mask. Ciò si traduce in un bit 1 per l’indirizzo di rete. 1 AND 1 = 1.
L’operazione AND tra un indirizzo host IPv4 e una maschera di sottorete determina l’indirizzo di rete IPv4 per questo host. In questo esempio, l’operazione AND tra l’indirizzo host di 192.168.10.10 e la subnet mask 255.255.255.0 (/24), risulta nell’indirizzo di rete IPv4 di 192.168.10.0/24. Questa è un’importante operazione IPv4, in quanto indica all’host a quale rete appartiene.
Struttura dell’indirizzo IPv4 – Riepilogo
Un indirizzo IPv4 è un indirizzo gerarchico a 32 bit costituito da una parte di rete e una parte host. Quando si determina la porzione di rete rispetto alla porzione host, è necessario esaminare il flusso a 32 bit. I bit all’interno della porzione di rete dell’indirizzo devono essere identici per tutti i dispositivi che risiedono nella stessa rete. I bit all’interno della parte host dell’indirizzo devono essere univoci per identificare un host specifico all’interno di una rete. Se due host hanno lo stesso schema di bit nella porzione di rete specificata del flusso a 32 bit, questi due host risiederanno nella stessa rete.
La maschera di sottorete IPv4 viene utilizzata per differenziare la parte di rete dalla parte host di un indirizzo IPv4. Quando un indirizzo IPv4 viene assegnato a un dispositivo, la maschera di sottorete viene utilizzata per determinare l’indirizzo di rete del dispositivo. L’indirizzo di rete rappresenta tutti i dispositivi sulla stessa rete.
Un metodo alternativo per identificare una subnet mask, un metodo chiamato lunghezza del prefisso. La lunghezza del prefisso è il numero di bit impostati su 1 nella subnet mask. È scritto in “notazione barra”, che è indicato da una barra (/) seguita dal numero di bit impostato su 1. Ad esempio, 192.168.10.10 255.255.255.0 verrebbe scritto come 192.168.10.10/24.
L’operazione AND viene utilizzata per determinare l’indirizzo di rete. L’AND logico è il confronto di due bit. Nota come solo un 1 AND 1 produce un 1. Qualsiasi altra combinazione risulta in uno 0.
1 AND 1 = 1
0 AND 1 = 0
1 AND 0 = 0
0 AND 0 = 0
Per identificare l’indirizzo di rete di un host IPv4, l’indirizzo IPv4 è logicamente AND, bit per bit, con la maschera di sottorete. L’operazione AND tra l’indirizzo e la maschera di sottorete produce l’indirizzo di rete.
Address Resolution
ARP
Se la tua rete utilizza il protocollo di comunicazione IPv4, l’Address Resolution Protocol, o ARP, è ciò di cui hai bisogno per mappare gli indirizzi IPv4 agli indirizzi MAC. Questo argomento spiega come funziona ARP.
Ogni dispositivo IP su una rete Ethernet ha un indirizzo MAC Ethernet univoco. Quando un dispositivo invia un frame Ethernet Layer 2, contiene questi due indirizzi:
Indirizzo MAC di destinazione: l’indirizzo MAC Ethernet del dispositivo di destinazione sullo stesso segmento di rete locale. Se l’host di destinazione si trova su un’altra rete, l’indirizzo di destinazione nel frame sarà quello del gateway predefinito (ovvero il router).
Indirizzo MAC di origine: l’indirizzo MAC della scheda di rete Ethernet sull’host di origine.
La figura illustra il problema quando si invia un frame a un altro host sullo stesso segmento su una rete IPv4.
Per inviare un pacchetto a un altro host sulla stessa rete IPv4 locale, un host deve conoscere l’indirizzo IPv4 e l’indirizzo MAC del dispositivo di destinazione. Gli indirizzi IPv4 di destinazione del dispositivo sono noti o risolti in base al nome del dispositivo. Tuttavia, gli indirizzi MAC devono essere rilevati.
Un dispositivo utilizza il protocollo ARP (Address Resolution Protocol) per determinare l’indirizzo MAC di destinazione di un dispositivo locale quando ne conosce l’indirizzo IPv4.
ARP fornisce due funzioni di base:
Risoluzione degli indirizzi IPv4 in indirizzi MAC
Mantenimento di una tabella di mappature da IPv4 a indirizzi MAC
Funzioni ARP
Quando un pacchetto viene inviato al livello di collegamento dati per essere incapsulato in un frame Ethernet, il dispositivo fa riferimento a una tabella nella sua memoria per trovare l’indirizzo MAC mappato all’indirizzo IPv4. Questa tabella è memorizzata temporaneamente nella memoria RAM e chiamata tabella ARP o cache ARP.
Il dispositivo di invio cercherà nella sua tabella ARP un indirizzo IPv4 di destinazione e un indirizzo MAC corrispondente.
Se l’indirizzo IPv4 di destinazione del pacchetto si trova sulla stessa rete dell’indirizzo IPv4 di origine, il dispositivo cercherà l’indirizzo IPv4 di destinazione nella tabella ARP.
Se l’indirizzo IPv4 di destinazione si trova su una rete diversa dall’indirizzo IPv4 di origine, il dispositivo cercherà nella tabella ARP l’indirizzo IPv4 del gateway predefinito.
In entrambi i casi, la ricerca riguarda un indirizzo IPv4 e un indirizzo MAC corrispondente per il dispositivo.
Ogni voce, o riga, della tabella ARP associa un indirizzo IPv4 a un indirizzo MAC. Chiamiamo la relazione tra i due valori una mappa. Ciò significa semplicemente che è possibile individuare un indirizzo IPv4 nella tabella e scoprire l’indirizzo MAC corrispondente. La tabella ARP salva temporaneamente (memorizza nella cache) la mappatura per i dispositivi sulla LAN.
Se il dispositivo individua l’indirizzo IPv4, il suo indirizzo MAC corrispondente viene utilizzato come indirizzo MAC di destinazione nel frame. Se non viene trovata alcuna voce, il dispositivo invia una richiesta ARP.
Operazione ARP – Richiesta ARP
Una richiesta ARP viene inviata quando un dispositivo deve determinare l’indirizzo MAC associato a un indirizzo IPv4 e non dispone di una voce per l’indirizzo IPv4 nella sua tabella ARP.
I messaggi ARP sono incapsulati direttamente all’interno di un frame Ethernet. Non esiste un’intestazione IPv4. La richiesta ARP è incapsulata in un frame Ethernet utilizzando le seguenti informazioni di intestazione:
Indirizzo MAC di destinazione: si tratta di un indirizzo di trasmissione FF-FF-FF-FF-FF-FF che richiede a tutte le NIC Ethernet sulla LAN di accettare ed elaborare la richiesta ARP.
Indirizzo MAC di origine: questo è l’indirizzo MAC del mittente della richiesta ARP.
Tipo: i messaggi ARP hanno un campo tipo di 0x806. Questo informa la NIC ricevente che la porzione di dati del frame deve essere passata al processo ARP.
Poiché le richieste ARP sono broadcast, vengono inviate a tutte le porte dallo switch, ad eccezione della porta ricevente. Tutti i NIC Ethernet sulla LAN elaborano le trasmissioni e devono consegnare la richiesta ARP al proprio sistema operativo per l’elaborazione. Ogni dispositivo deve elaborare la richiesta ARP per verificare se l’indirizzo IPv4 di destinazione corrisponde al proprio. Un router non inoltrerà le trasmissioni su altre interfacce.
Solo un dispositivo sulla LAN avrà un indirizzo IPv4 che corrisponde all’indirizzo IPv4 di destinazione nella richiesta ARP. Tutti gli altri dispositivi non risponderanno.
Operazione ARP – Risposta ARP
Solo il dispositivo con l’indirizzo IPv4 di destinazione associato alla richiesta ARP risponderà con una risposta ARP. La risposta ARP è incapsulata in un frame Ethernet utilizzando le seguenti informazioni di intestazione:
Indirizzo MAC di destinazione: questo è l’indirizzo MAC del mittente della richiesta ARP.
Indirizzo MAC di origine: questo è l’indirizzo MAC del mittente della risposta ARP.
Tipo: i messaggi ARP hanno un campo tipo di 0x806. Questo informa la NIC ricevente che la porzione di dati del frame deve essere passata al processo ARP.
Solo il dispositivo che ha originariamente inviato la richiesta ARP riceverà la risposta ARP unicast. Dopo aver ricevuto la risposta ARP, il dispositivo aggiungerà l’indirizzo IPv4 e l’indirizzo MAC corrispondente alla sua tabella ARP. I pacchetti destinati a quell’indirizzo IPv4 possono ora essere incapsulati in frame utilizzando il corrispondente indirizzo MAC.
Se nessun dispositivo risponde alla richiesta ARP, il pacchetto viene eliminato perché non è possibile creare un frame.
Le voci nella tabella ARP sono contrassegnate da un timestamp. Se un dispositivo non riceve un frame da un particolare dispositivo prima della scadenza del timestamp, la voce per questo dispositivo viene rimossa dalla tabella ARP.
Inoltre, le voci della mappa statica possono essere inserite in una tabella ARP, ma ciò avviene raramente. Le voci della tabella ARP statica non scadono nel tempo e devono essere rimosse manualmente.
Nota: IPv6 utilizza un processo simile a ARP per IPv4, noto come ICMPv6 Neighbor Discovery (ND). IPv6 utilizza i messaggi di sollecitazione dei vicini e di annunci dei vicini, in modo simile alle richieste ARP IPv4 e alle risposte ARP.
Ruolo ARP nelle comunicazioni remote
Quando l’indirizzo IPv4 di destinazione non si trova sulla stessa rete dell’indirizzo IPv4 di origine, il dispositivo di origine deve inviare il frame al proprio gateway predefinito. Questa è l’interfaccia del router locale. Ogni volta che un dispositivo di origine ha un pacchetto con un indirizzo IPv4 su un’altra rete, incapsula quel pacchetto in un frame utilizzando l’indirizzo MAC di destinazione del router.
L’indirizzo IPv4 del gateway predefinito è memorizzato nella configurazione IPv4 degli host. Quando un host crea un pacchetto per una destinazione, confronta l’indirizzo IPv4 di destinazione e il proprio indirizzo IPv4 per determinare se i due indirizzi IPv4 si trovano sulla stessa rete Layer 3. Se l’host di destinazione non si trova sulla stessa rete, l’origine controlla la sua tabella ARP per una voce con l’indirizzo IPv4 del gateway predefinito. Se non c’è una voce, utilizza il processo ARP per determinare un indirizzo MAC del gateway predefinito.
Rimozione di voci da una tabella ARP
Per ogni dispositivo, un timer della cache ARP rimuove le voci ARP che non sono state utilizzate per un periodo di tempo specificato. I tempi variano a seconda del sistema operativo del dispositivo. Ad esempio, i sistemi operativi Windows più recenti memorizzano le voci della tabella ARP tra 15 e 45 secondi, come illustrato nella figura.
I comandi possono essere utilizzati anche per rimuovere manualmente alcune o tutte le voci nella tabella ARP. Dopo che una voce è stata rimossa, il processo per l’invio di una richiesta ARP e la ricezione di una risposta ARP deve ripetersi per inserire la mappa nella tabella ARP.
Tabelle ARP sui dispositivi
Su un router Cisco, il comando show ip arp viene utilizzato per visualizzare la tabella ARP, come mostrato nella figura.
Su un PC Windows 10, il comando arp –a viene utilizzato per visualizzare la tabella ARP, come mostrato nella figura.
Problemi ARP – Trasmissioni ARP e Spoofing ARP
Come frame broadcast, una richiesta ARP viene ricevuta ed elaborata da ogni dispositivo sulla rete locale. Su una tipica rete aziendale, queste trasmissioni avrebbero probabilmente un impatto minimo sulle prestazioni della rete. Tuttavia, se un numero elevato di dispositivi viene acceso e tutti iniziano ad accedere ai servizi di rete contemporaneamente, potrebbe verificarsi una riduzione delle prestazioni per un breve periodo di tempo, come mostrato nella figura. Dopo che i dispositivi hanno inviato le trasmissioni ARP iniziali e hanno appreso gli indirizzi MAC necessari, qualsiasi impatto sulla rete sarà ridotto al minimo
In alcuni casi, l’uso di ARP può comportare un potenziale rischio per la sicurezza. Un attore di minacce può utilizzare lo spoofing ARP per eseguire un attacco di avvelenamento ARP. Questa è una tecnica utilizzata da un attore di minacce per rispondere a una richiesta ARP per un indirizzo IPv4 che appartiene a un altro dispositivo, come il gateway predefinito, come mostrato nella figura. L’autore della minaccia invia una risposta ARP con il proprio indirizzo MAC. Il destinatario della risposta ARP aggiungerà l’indirizzo MAC errato alla sua tabella ARP e invierà questi pacchetti all’autore della minaccia.
Gli switch di livello aziendale includono tecniche di mitigazione note come ispezione ARP dinamica (DAI).
Address Resolution – Riepilogo
ARP
Per inviare un pacchetto a un altro host sulla stessa rete IPv4 locale, un host deve conoscere l’indirizzo IPv4 e l’indirizzo MAC del dispositivo di destinazione. Gli indirizzi IPv4 di destinazione del dispositivo sono noti o risolti in base al nome del dispositivo. Tuttavia, gli indirizzi MAC devono essere rilevati. Un dispositivo utilizza ARP per determinare l’indirizzo MAC di destinazione di un dispositivo locale quando ne conosce l’indirizzo IPv4. ARP fornisce due funzioni di base: la risoluzione degli indirizzi IPv4 in indirizzi MAC e il mantenimento di una tabella di mappature da IPv4 a indirizzi MAC.
Il dispositivo di invio cercherà nella sua tabella ARP un indirizzo IPv4 di destinazione e un indirizzo MAC corrispondente.
Se l’indirizzo IPv4 di destinazione del pacchetto si trova sulla stessa rete dell’indirizzo IPv4 di origine, il dispositivo cercherà l’indirizzo IPv4 di destinazione nella tabella ARP.
Se l’indirizzo IPv4 di destinazione si trova su una rete diversa dall’indirizzo IPv4 di origine, il dispositivo cercherà nella tabella ARP l’indirizzo IPv4 del gateway predefinito.
Ogni voce, o riga, della tabella ARP associa un indirizzo IPv4 a un indirizzo MAC. Chiamiamo la relazione tra i due valori una mappa. I messaggi ARP sono incapsulati direttamente all’interno di un frame Ethernet. Non esiste un’intestazione IPv4. La richiesta ARP è incapsulata in un frame Ethernet utilizzando le seguenti informazioni di intestazione:
Indirizzo MAC di destinazione: si tratta di un indirizzo di trasmissione FF-FF-FF-FF-FF-FF che richiede a tutte le NIC Ethernet sulla LAN di accettare ed elaborare la richiesta ARP.
Indirizzo MAC di origine: questo è l’indirizzo MAC del mittente della richiesta ARP.
Tipo: i messaggi ARP hanno un campo tipo di 0x806. Questo informa la NIC ricevente che la porzione di dati del frame deve essere passata al processo ARP.
Poiché le richieste ARP sono broadcast, vengono inviate a tutte le porte dallo switch, ad eccezione della porta ricevente. Solo il dispositivo con l’indirizzo IPv4 di destinazione associato alla richiesta ARP risponderà con una risposta ARP. Dopo aver ricevuto la risposta ARP, il dispositivo aggiungerà l’indirizzo IPv4 e l’indirizzo MAC corrispondente alla sua tabella ARP.
Quando l’indirizzo IPv4 di destinazione non si trova sulla stessa rete dell’indirizzo IPv4 di origine, il dispositivo di origine deve inviare il frame al proprio gateway predefinito. Questa è l’interfaccia del router locale. Ogni volta che un dispositivo di origine ha un pacchetto con un indirizzo IPv4 su un’altra rete, incapsula quel pacchetto in un frame utilizzando l’indirizzo MAC di destinazione del router. L’indirizzo IPv4 del gateway predefinito è memorizzato nella configurazione IPv4 degli host. Se l’host di destinazione non si trova sulla stessa rete, l’origine controlla la sua tabella ARP per una voce con l’indirizzo IPv4 del gateway predefinito. Se non c’è una voce, utilizza il processo ARP per determinare un indirizzo MAC del gateway predefinito.
Per ogni dispositivo, un timer della cache ARP rimuove le voci ARP che non sono state utilizzate per un periodo di tempo specificato. I tempi variano a seconda del sistema operativo del dispositivo. I comandi possono essere utilizzati per rimuovere manualmente alcune o tutte le voci nella tabella ARP.
Su un router Cisco, il comando show ip arp viene utilizzato per visualizzare la tabella ARP. Su un PC Windows 10, il comando arp –a viene utilizzato per visualizzare la tabella ARP.
Come frame broadcast, una richiesta ARP viene ricevuta ed elaborata da ogni dispositivo sulla rete locale. Se si accende un numero elevato di dispositivi e tutti iniziano ad accedere ai servizi di rete contemporaneamente, potrebbe verificarsi una riduzione delle prestazioni per un breve periodo di tempo. In alcuni casi, l’uso di ARP può comportare un potenziale rischio per la sicurezza.
Un attore di minacce può utilizzare lo spoofing ARP per eseguire un attacco di avvelenamento ARP. Questa è una tecnica utilizzata da un attore di minacce per rispondere a una richiesta ARP per un indirizzo IPv4 che appartiene a un altro dispositivo, come il gateway predefinito. L’autore della minaccia invia una risposta ARP con il proprio indirizzo MAC. Il destinatario della risposta ARP aggiungerà l’indirizzo MAC errato alla sua tabella ARP e invierà questi pacchetti all’autore della minaccia.
DNS Services
Domain Name System
Esistono altri protocolli specifici del livello dell’applicazione progettati per semplificare l’ottenimento degli indirizzi per i dispositivi di rete. Questi servizi sono essenziali perché sarebbe molto dispendioso in termini di tempo ricordare gli indirizzi IP anziché gli URL o configurare manualmente tutti i dispositivi in una rete medio-grande. Questo argomento approfondisce i servizi di indirizzamento IP, DNS e DHCP.
Nelle reti di dati, i dispositivi sono etichettati con indirizzi IP numerici per inviare e ricevere dati sulle reti. I nomi di dominio sono stati creati per convertire l’indirizzo numerico in un nome semplice e riconoscibile.
Su Internet, i nomi di dominio completi (FQDN), come http://www.cisco.com, sono molto più facili da ricordare per le persone rispetto a 198.133.219.25, che è l’effettivo indirizzo numerico di questo server. Se Cisco decide di modificare l’indirizzo numerico di www.cisco.com, è trasparente per l’utente perché il nome di dominio rimane lo stesso. Il nuovo indirizzo viene semplicemente collegato al nome di dominio esistente e la connettività viene mantenuta.
Il protocollo DNS definisce un servizio automatizzato che abbina i nomi delle risorse con l’indirizzo di rete numerico richiesto. Include il formato per query, risposte e dati. Le comunicazioni del protocollo DNS utilizzano un unico formato chiamato messaggio. Questo formato di messaggio viene utilizzato per tutti i tipi di query client e risposte del server, messaggi di errore e trasferimento di informazioni sui record di risorse tra i server.
Passo 1
L’utente digita un FQDN nel campo Indirizzo di un’applicazione browser.
Passo 2
Una query DNS viene inviata al server DNS designato per il computer client.
Passo 3
Il server DNS abbina l’FQDN con il suo indirizzo IP.
Passo 4
La risposta alla query DNS viene inviata al client con l’indirizzo IP per l’FQDN.
Passo 5
Il computer client utilizza l’indirizzo IP per effettuare richieste al server.
Formato del messaggio DNS
Il server DNS archivia diversi tipi di record di risorse utilizzati per risolvere i nomi. Questi record contengono il nome, l’indirizzo e il tipo di record. Alcuni di questi tipi di record sono i seguenti:
A – Un indirizzo IPv4 del dispositivo finale
NS – Un server dei nomi autorevole
AAAA – Un indirizzo IPv6 del dispositivo finale (pronunciato quad-A)
MX – Un record di scambio di posta
Quando un client effettua una query, il processo DNS del server esamina innanzitutto i propri record per risolvere il nome. Se non è in grado di risolvere il nome utilizzando i record archiviati, contatta altri server per risolvere il nome. Dopo che una corrispondenza è stata trovata e restituita al server richiedente originale, il server memorizza temporaneamente l’indirizzo numerico nel caso in cui venga richiesto nuovamente lo stesso nome.
Il servizio client DNS su PC Windows memorizza anche i nomi risolti in precedenza. Il comando ipconfig /displaydns visualizza tutte le voci DNS memorizzate nella cache.
Come mostrato nella tabella, il DNS utilizza lo stesso formato di messaggio tra i server, costituito da una domanda, una risposta, un’autorizzazione e informazioni aggiuntive per tutti i tipi di query client e risposte del server, messaggi di errore e trasferimento di informazioni sui record di risorse.
Gerarchia DNS
Il protocollo DNS utilizza un sistema gerarchico per creare un database per fornire la risoluzione dei nomi, come mostrato nella figura. Il DNS utilizza i nomi di dominio per formare la gerarchia.
La struttura dei nomi è suddivisa in piccole zone gestibili. Ogni server DNS mantiene un file di database specifico ed è responsabile solo della gestione delle mappature nome-IP per quella piccola porzione dell’intera struttura DNS. Quando un server DNS riceve una richiesta per la traduzione di un nome che non si trova all’interno della sua zona DNS, il server DNS inoltra la richiesta a un altro server DNS all’interno della zona appropriata per la traduzione. Il DNS è scalabile perché la risoluzione del nome host è distribuita su più server.
I diversi domini di primo livello (TLD: top-level domains) rappresentano il tipo di organizzazione o il paese di origine. Esempi di domini di primo livello sono i seguenti:
.com – un’azienda o un settore
.org – un’organizzazione senza scopo di lucro
.au – Australia
.co – Colombia
Il comando nslookup
Quando si configura un dispositivo di rete, vengono forniti uno o più indirizzi di server DNS che il client DNS può utilizzare per la risoluzione dei nomi. Di solito, l’ISP fornisce gli indirizzi da utilizzare per i server DNS. Quando un’applicazione utente richiede di connettersi a un dispositivo remoto in base al nome, il client DNS richiedente interroga il server dei nomi per risolvere il nome in un indirizzo numerico.
I sistemi operativi dei computer dispongono anche di un’utilità chiamata nslookup che consente all’utente di interrogare manualmente i server dei nomi per risolvere un determinato nome host. Questa utilità può anche essere utilizzata per risolvere i problemi di risoluzione dei nomi e per verificare lo stato corrente dei server dei nomi.
In questa figura, quando viene emesso il comando nslookup, viene visualizzato il server DNS predefinito configurato per l’host. Il nome di un host o di un dominio può essere inserito al prompt di nslookup. L’utilità nslookup ha molte opzioni disponibili per test approfonditi e verifica del processo DNS.
Controllo sintassi – Il comando nslookup
From the Windows command prompt, enter the nslookup command to begin a manual query of the name servers.
C:>nslookup
Default Server: Unknown
Address: 10.10.10.1
The output lists the name and IP address of the DNS server configured in the client. Note that the DNS server address can be manually configured, or dynamically learned, through DHCP. You are now in nslookup mode. Enter the domain name www.cisco.com.
www.cisco.com
Server: UnKnown
Address: 10.10.10.1
Non-authoritative answer:
Name: e2867.dsca.akamaiedge.net
Addresses: 2600:1404:a:395::b33
2600:1404:a:38e::b33
172.230.155.162
Aliases: www.cisco.com
www.cisco.com.akadns.net
wwwds.cisco.com.edgekey.net
wwwds.cisco.com.edgekey.net.globalredir.akadns.net
The output lists IP addresses related to www.cisco.com that the server ’e2867’ currently has in its database. Notice that IPv6 addresses are also listed. In addition, various aliases are shown that will resolve to www.cisco.com.
Enter the exit command to leave nslookup mode and return to the Windows command line.
exit
You can directly query the DNS servers by simply adding the domain name to the nslookup command.
Enter nslookup www.google.com.
C:>nslookup www.google.com
Server: UnKnown
Address: 10.10.10.1
Non-authoritative answer:
Name: www.google.com
Addresses: 2607:f8b0:4000:80f::2004
172.217.12.36
=========================================
You are now working from Linux command prompt. The nslookup command is the same.
Enter the nslookup command to begin a manual query of the name servers.
Enter www.cisco.com at the > prompt.
Enter the exit command to leave nslookup mode and return to the Linux command line.
user@cisconetacad$nslookup
Server: 127.0.1.1
Address: 127.0.1.1#53
www.cisco.com
Non-authoritative answer:
www.cisco.com canonical name = www.cisco.com.akadns.net.
www.cisco.com.akadns.net canonical name = wwwds.cisco.com.edgekey.net.
wwwds.cisco.com.edgekey.net canonical name = wwwds.cisco.com.edgekey.net.globalredir.akadns.net.
wwwds.cisco.com.edgekey.net.globalredir.akadns.net canonical name = e144.dscb.akamaiedge.net.
Name: e144.dscb.akamaiedge.net
Address: 23.60.112.170
exit
As in Windows, you can directly query the DNS servers by simply adding the domain name to the nslookup command. Enter nslookup www.google.com.
user@cisconetacad$nslookup www.google.com
Server: 127.0.0.53
Address: 127.0.0.53#53
Non-authoritative answer:
Name: www.google.com
Address: 172.217.6.164
Name: www.google.com
Address: 2607:f8b0:4000:812::2004
You successfully used the nslookup command to verify the status of domain names.
DHCP Services
Protocollo di configurazione dinamica dell’host
Il servizio DHCP (Dynamic Host Configuration Protocol) per IPv4 automatizza l’assegnazione di indirizzi IPv4, subnet mask, gateway e altri parametri di rete IPv4. Questo è indicato come indirizzamento dinamico. L’alternativa all’indirizzamento dinamico è l’indirizzamento statico. Quando si utilizza l’indirizzamento statico, l’amministratore di rete inserisce manualmente le informazioni sull’indirizzo IP sugli host.
Quando un host si connette alla rete, viene contattato il server DHCP e viene richiesto un indirizzo. Il server DHCP sceglie un indirizzo da un intervallo configurato di indirizzi chiamato pool e lo assegna (affitta) all’host.
Su reti più grandi o dove la popolazione di utenti cambia frequentemente, DHCP è preferito per l’assegnazione degli indirizzi. Potrebbero arrivare nuovi utenti e avere bisogno di connessioni; altri potrebbero avere nuovi computer che devono essere collegati. Piuttosto che utilizzare l’indirizzamento statico per ogni connessione, è più efficiente avere indirizzi IPv4 assegnati automaticamente tramite DHCP.
DHCP può allocare indirizzi IP per un periodo di tempo configurabile, chiamato periodo di lease. Il periodo di lease è un’impostazione DHCP importante. Quando il periodo di lease scade o il server DHCP riceve un messaggio DHCPRELEASE, l’indirizzo viene restituito al pool DHCP per il riutilizzo. Gli utenti possono spostarsi liberamente da un luogo all’altro e ristabilire facilmente le connessioni di rete tramite DHCP.
Come mostra la figura, vari tipi di dispositivi possono essere server DHCP. Il server DHCP nella maggior parte delle reti medio-grandi è in genere un server locale basato su PC dedicato. Con le reti domestiche, il server DHCP si trova solitamente sul router locale che collega la rete domestica all’ISP.
Molte reti utilizzano sia il DHCP che l’indirizzamento statico. DHCP viene utilizzato per host generici, come i dispositivi degli utenti finali. L’indirizzamento statico viene utilizzato per i dispositivi di rete, come router gateway, switch, server e stampanti.
DHCP per IPv6 (DHCPv6) fornisce servizi simili per i client IPv6. Una differenza importante è che DHCPv6 non fornisce un indirizzo gateway predefinito. Questo può essere ottenuto dinamicamente solo dal messaggio di annuncio del router.
DHCP Messages
Come mostrato nella figura, quando un dispositivo IPv4 configurato con DHCP si avvia o si connette alla rete, il client trasmette un messaggio di rilevamento DHCP (DHCPDISCOVER) per identificare eventuali server DHCP disponibili sulla rete. Un server DHCP risponde con un messaggio di offerta DHCP (DHCPOFFER), che offre un lease al client. Il messaggio di offerta contiene l’indirizzo IPv4 e la subnet mask da assegnare, l’indirizzo IPv4 del server DNS e l’indirizzo IPv4 del gateway predefinito. L’offerta di lease comprende anche la durata della lease stessa.
Il client può ricevere più messaggi DHCPOFFER se sulla rete locale è presente più di un server DHCP. Pertanto, deve scegliere tra di essi e invia un messaggio di richiesta DHCP (DHCPREQUEST) che identifica il server esplicito e l’offerta di lease che il client sta accettando. Un client può anche scegliere di richiedere un indirizzo che gli era stato precedentemente assegnato dal server.
Supponendo che l’indirizzo IPv4 richiesto dal client o offerto dal server sia ancora disponibile, il server restituisce un messaggio di riconoscimento DHCP (DHCPACK) che conferma al client che il lease è stato finalizzato. Se l’offerta non è più valida, il server selezionato risponde con un messaggio di riconoscimento negativo DHCP (DHCPNAK). Se viene restituito un messaggio DHCPNAK, il processo di selezione deve ricominciare con la trasmissione di un nuovo messaggio DHCPDISCOVER. Dopo che il client ha il lease, deve essere rinnovato prima della scadenza del lease tramite un altro messaggio DHCPREQUEST.
Il server DHCP garantisce che tutti gli indirizzi IP siano univoci (lo stesso indirizzo IP non può essere assegnato contemporaneamente a due diversi dispositivi di rete). La maggior parte degli ISP utilizza DHCP per assegnare gli indirizzi ai propri clienti.
DHCPv6 ha una serie di messaggi simili a quelli per DHCPv4. I messaggi DHCPv6 sono SOLICIT, ADVERTISE, INFORMATION REQUEST e REPLY.
IP Addressing Services – Riepilogo
Nelle reti di dati, i dispositivi sono etichettati con indirizzi IP numerici per inviare e ricevere dati sulle reti. I nomi di dominio sono stati creati per convertire l’indirizzo numerico in un nome semplice e riconoscibile. Il protocollo DNS definisce un servizio automatizzato che abbina i nomi delle risorse con l’indirizzo di rete numerico richiesto. Le comunicazioni del protocollo DNS utilizzano un unico formato chiamato messaggio. Questo formato di messaggio viene utilizzato per tutti i tipi di query client e risposte del server, messaggi di errore e trasferimento di informazioni sui record di risorse tra i server.
Il server DNS archivia diversi tipi di record di risorse utilizzati per risolvere i nomi. Questi record contengono il nome, l’indirizzo e il tipo di record. Il DNS utilizza lo stesso formato di messaggio tra i server, costituito da una domanda, risposta, autorità e informazioni aggiuntive per tutti i tipi di query client e risposte del server, messaggi di errore e trasferimento di informazioni sui record di risorse.
Il DNS utilizza i nomi di dominio per formare la gerarchia. La struttura dei nomi è suddivisa in zone. Ogni server DNS mantiene un file di database specifico ed è responsabile solo della gestione delle mappature nome-IP per quella piccola porzione dell’intera struttura DNS. Quando un server DNS riceve una richiesta per la traduzione di un nome che non si trova all’interno della sua zona DNS, il server DNS inoltra la richiesta a un altro server DNS all’interno della zona appropriata per la traduzione. Il DNS è scalabile perché la risoluzione del nome host è distribuita su più server.
I sistemi operativi dei computer dispongono di un’utilità chiamata Nslookup che consente all’utente di interrogare manualmente i server dei nomi per risolvere un determinato nome host. Questa utilità può anche essere utilizzata per risolvere i problemi di risoluzione dei nomi e per verificare lo stato corrente dei server dei nomi. Quando viene emesso il comando nslookup, viene visualizzato il server DNS predefinito configurato per l’host. Il nome di un host o di un dominio può essere inserito al prompt di nslookup.
Su reti più grandi, DHCP è preferito per l’assegnazione degli indirizzi. Piuttosto che utilizzare l’indirizzamento statico per ogni connessione, è più efficiente avere indirizzi IPv4 assegnati automaticamente tramite DHCP. DHCP può allocare indirizzi IP per un periodo di tempo configurabile, chiamato periodo di lease. Quando il periodo di lease scade o il server DHCP riceve un messaggio DHCPRELEASE, l’indirizzo viene restituito al pool DHCP per il riutilizzo. Gli utenti possono spostarsi liberamente da un luogo all’altro e ristabilire facilmente le connessioni di rete tramite DHCP.
DHCPv6 fornisce servizi simili per i client IPv6. Una differenza importante è che DHCPv6 non fornisce un indirizzo gateway predefinito. Questo può essere ottenuto dinamicamente solo dal messaggio “Router Advertisement” del router.
Quando un dispositivo IPv4 configurato con DHCP si avvia o si connette alla rete, il client trasmette un messaggio DHCPDISCOVER per identificare eventuali server DHCP disponibili sulla rete.
Un server DHCP risponde con un messaggio DHCPOFFER, che offre un lease al client. Il client invia un messaggio DHCPREQUEST che identifica il server esplicito e l’offerta di leasing che il client sta accettando.
Supponendo che l’indirizzo IPv4 richiesto dal client, o offerto dal server, sia ancora disponibile, il server restituisce un messaggio DHCPACK che conferma al client che il lease è stato finalizzato. Se l’offerta non è più valida, il server selezionato risponde con un messaggio DHCPNAK. Se viene restituito un messaggio DHCPNAK, il processo di selezione deve ricominciare con la trasmissione di un nuovo messaggio DHCPDISCOVER.
DHCPv6 ha una serie di messaggi simili a quelli per DHCPv4. I messaggi DHCPv6 sono SOLICIT, ADVERTISE, INFORMATION REQUEST, and REPLY.
Transport Layer
Transportation of Data – Role of the Transport Layer
I programmi a livello di applicazione generano dati che devono essere scambiati tra gli host di origine e di destinazione. Il livello di trasporto è responsabile delle comunicazioni logiche tra le applicazioni in esecuzione su host diversi. Ciò può includere servizi come la creazione di una sessione temporanea tra due host e la trasmissione affidabile di informazioni per un’applicazione.
Come mostrato nella figura, il livello di trasporto è il collegamento tra il livello dell’applicazione e i livelli inferiori responsabili della trasmissione in rete.
Il livello di trasporto non è a conoscenza del tipo di host di destinazione, del tipo di supporto su cui devono viaggiare i dati, del percorso seguito dai dati, della congestione su un collegamento o delle dimensioni della rete.
Il livello di trasporto include due protocolli:
Transmission Control Protocol (TCP)
User Datagram Protocol (UDP)
Responsabilità del livello di trasporto
Il livello di trasporto ha molte responsabilità.
-Monitoraggio delle singole conversazioni
A livello di trasporto, ogni set di dati che scorre tra un’applicazione di origine e un’applicazione di destinazione è noto come conversazione e viene monitorato separatamente. È responsabilità del livello di trasporto mantenere e tenere traccia di queste molteplici conversazioni.
Come illustrato nella figura, un host può avere più applicazioni che comunicano simultaneamente attraverso la rete.
La maggior parte delle reti ha una limitazione sulla quantità di dati che possono essere inclusi in un singolo pacchetto. Pertanto, i dati devono essere suddivisi in parti gestibili.
-Segmentazione dei dati e riassemblaggio dei segmenti
È responsabilità del livello di trasporto suddividere i dati dell’applicazione in blocchi di dimensioni adeguate. A seconda del protocollo del livello di trasporto utilizzato, i blocchi del livello di trasporto sono chiamati segmenti o datagrammi. La figura illustra il livello di trasporto utilizzando diversi blocchi per ogni conversazione.
Il livello di trasporto divide i dati in blocchi più piccoli (ad esempio, segmenti o datagrammi) che sono più facili da gestire e trasportare.
-Aggiunge informazioni di intestazione
Il protocollo del livello di trasporto aggiunge anche informazioni di intestazione contenenti dati binari organizzati in diversi campi a ciascun blocco di dati. Sono i valori in questi campi che consentono ai vari protocolli del livello di trasporto di eseguire diverse funzioni nella gestione della comunicazione dei dati.
Ad esempio, le informazioni di intestazione vengono utilizzate dall’host ricevente per riassemblare i blocchi di dati in un flusso di dati completo per il programma a livello di applicazione ricevente.
Il livello di trasporto garantisce che anche con più applicazioni in esecuzione su un dispositivo, tutte le applicazioni ricevano i dati corretti.
-Identificazione delle applicazioni
Il livello di trasporto deve essere in grado di separare e gestire più comunicazioni con diverse esigenze di requisiti di trasporto. Per passare i flussi di dati alle applicazioni appropriate, il livello di trasporto identifica l’applicazione di destinazione utilizzando un identificatore chiamato numero di porta. Come illustrato nella figura, a ogni processo software che deve accedere alla rete viene assegnato un numero di porta univoco per quell’host.
-Multiplexing di conversazione
L’invio di alcuni tipi di dati (ad esempio, un video in streaming) attraverso una rete, come un flusso di comunicazione completo, può consumare tutta la larghezza di banda disponibile. Ciò impedirebbe che si verifichino contemporaneamente altre conversazioni di comunicazione. Renderebbe inoltre difficile il recupero degli errori e la ritrasmissione dei dati danneggiati.
Come mostrato nella figura, il livello di trasporto utilizza la segmentazione e il multiplexing per consentire l’interlacciamento di diverse conversazioni di comunicazione sulla stessa rete.
Il controllo degli errori può essere eseguito sui dati nel segmento, per determinare se il segmento è stato alterato durante la trasmissione
Transport Layer Protocols
L’IP riguarda solo la struttura, l’indirizzamento e l’instradamento dei pacchetti. L’IP non specifica come avviene la consegna o il trasporto dei pacchetti.
I protocolli del livello di trasporto specificano come trasferire i messaggi tra host e sono responsabili della gestione dei requisiti di affidabilità di una conversazione. Il livello di trasporto include i protocolli TCP e UDP.
Diverse applicazioni hanno diversi requisiti di affidabilità del trasporto. Pertanto, TCP/IP fornisce due protocolli a livello di trasporto, come mostrato nella figura.
Transmission Control Protocol (TCP)
L’IP riguarda solo la struttura, l’indirizzamento e l’instradamento dei pacchetti, dal mittente originale alla destinazione finale. IP non è responsabile di garantire la consegna o di determinare se è necessario stabilire una connessione tra il mittente e il destinatario.
TCP è considerato un protocollo di livello di trasporto affidabile e completo, che garantisce che tutti i dati arrivino a destinazione. TCP include campi che garantiscono la consegna dei dati dell’applicazione. Questi campi richiedono un’ulteriore elaborazione da parte degli host di invio e ricezione.
Nota: TCP divide i dati in segmenti.
Il trasporto CP è analogo all’invio di pacchi tracciati dall’origine alla destinazione. Se un ordine di spedizione è suddiviso in più pacchi, un cliente può controllare online per vedere l’ordine della consegna.
TCP fornisce affidabilità e controllo del flusso utilizzando queste operazioni di base:
Numerare e tenere traccia dei segmenti di dati trasmessi a un host specifico da un’applicazione specifica;
Riconoscere i dati ricevuti;
Ritrasmettere tutti i dati non riconosciuti dopo un certo periodo di tempo;
Sequenza di dati che potrebbero arrivare nell’ordine sbagliato;
Invia i dati a una velocità efficiente, accettabile dal destinatario.
Per mantenere lo stato di una conversazione e tenere traccia delle informazioni, il TCP deve prima stabilire una connessione tra il mittente e il destinatario. Questo è il motivo per cui TCP è noto come protocollo orientato alla connessione.
User Datagram Protocol (UDP)
UDP è un protocollo a livello di trasporto più semplice di TCP. Non fornisce affidabilità e controllo del flusso, il che significa che richiede meno campi di intestazione. Poiché i processi UDP del mittente e del destinatario non devono gestire l’affidabilità e il controllo del flusso, ciò significa che i datagrammi UDP possono essere elaborati più velocemente dei segmenti TCP. UDP fornisce le funzioni di base per la consegna di datagrammi tra le applicazioni appropriate, con un sovraccarico e un controllo dei dati molto ridotti.
Nota: UDP divide i dati in datagrammi, detti anche segmenti.
UDP è un protocollo senza connessione. Poiché UDP non fornisce affidabilità o controllo del flusso, non richiede una connessione stabilita. Poiché UDP non tiene traccia delle informazioni inviate o ricevute tra il client e il server, UDP è noto anche come protocollo senza stato.
UDP è anche noto come protocollo di consegna best-effort perché non vi è alcun riconoscimento che i dati siano stati ricevuti a destinazione. Con UDP, non ci sono processi a livello di trasporto che informano il mittente di una consegna riuscita.
UDP è come inserire una normale lettera ordinaria nella posta. Il mittente della lettera non è a conoscenza della disponibilità del destinatario a ricevere la lettera. Né l’ufficio postale è responsabile del tracciamento della lettera o di informare il mittente se la lettera non arriva alla destinazione finale.
Il giusto protocollo del livello di trasporto per l’applicazione giusta
Alcune applicazioni possono tollerare una certa perdita di dati durante la trasmissione sulla rete, ma i ritardi nella trasmissione sono inaccettabili. Per queste applicazioni, UDP è la scelta migliore perché richiede meno overhead di rete. UDP è preferibile per applicazioni come Voice over IP (VoIP). I riconoscimenti e la ritrasmissione rallenterebbero la consegna e renderebbero inaccettabile la conversazione vocale.
UDP viene utilizzato anche dalle applicazioni di richiesta e risposta in cui i dati sono minimi e la ritrasmissione può essere eseguita rapidamente. Ad esempio, DNS (Domain Name System) utilizza UDP per questo tipo di transazione. Il client richiede indirizzi IPv4 e IPv6 per un nome di dominio noto da un server DNS. Se il client non riceve una risposta entro un tempo prestabilito, semplicemente invia nuovamente la richiesta.
Ad esempio, se uno o due segmenti di un flusso video in diretta non arrivano, si crea un’interruzione momentanea nel flusso. Ciò può apparire come distorsione nell’immagine o nel suono, ma potrebbe non essere visibile all’utente. Se il dispositivo di destinazione dovesse tenere conto della perdita di dati, lo streaming potrebbe essere ritardato durante l’attesa delle ritrasmissioni, causando un notevole degrado dell’immagine o del suono. In questo caso è meglio rendere il miglior media possibile con i segmenti ricevuti e rinunciare all’affidabilità.
Per altre applicazioni è importante che tutti i dati arrivino e che possano essere elaborati nella sequenza corretta. Per questi tipi di applicazioni, TCP viene utilizzato come protocollo di trasporto. Ad esempio, applicazioni come database, browser Web e client di posta elettronica richiedono che tutti i dati inviati arrivino a destinazione nelle condizioni originali. Eventuali dati mancanti potrebbero corrompere una comunicazione, rendendola incompleta o illeggibile. Ad esempio, è importante quando si accede alle informazioni bancarie sul Web per assicurarsi che tutte le informazioni siano inviate e ricevute correttamente.
Gli sviluppatori di applicazioni devono scegliere il tipo di protocollo di trasporto appropriato in base ai requisiti delle applicazioni. Il video può essere inviato tramite TCP o UDP. Le applicazioni che eseguono lo streaming di audio e video archiviati in genere utilizzano TCP. L’applicazione utilizza TCP per eseguire il buffering, il sondaggio della larghezza di banda e il controllo della congestione, al fine di controllare meglio l’esperienza dell’utente.
Il video e la voce in tempo reale di solito utilizzano UDP, ma possono anche utilizzare TCP o sia UDP che TCP. Un’applicazione di videoconferenza può utilizzare UDP per impostazione predefinita, ma poiché molti firewall bloccano UDP, l’applicazione può essere inviata anche tramite TCP.
Le applicazioni che eseguono lo streaming di audio e video archiviati utilizzano TCP. Ad esempio, se improvvisamente la tua rete non è in grado di supportare la larghezza di banda necessaria per guardare un film su richiesta, l’applicazione sospende la riproduzione. Durante la pausa, potresti vedere un messaggio “buffering…” mentre TCP lavora per ristabilire il flusso. Quando tutti i segmenti sono in ordine e viene ripristinato un livello minimo di larghezza di banda, la sessione TCP riprende e la riproduzione del film riprende.
La figura riassume le differenze tra UDP e TCP.
Proprietà del protocollo richieste: VeloceBasso sovraccaricoNon richiede riconoscimentiNon invia nuovamente i dati persiFornisce i dati non appena arrivano
Proprietà del protocollo richieste: AffidabileRiconosce i datiInvia nuovamente i dati persiFornisce i dati in ordine sequenziale
Panoramica del TCP
Funzionalità TCP
TCP e UDP sono i due protocolli del livello di trasporto. Ecco maggiori dettagli su cosa fa TCP e quando è una buona idea usarlo al posto di UDP.
Per comprendere le differenze tra TCP e UDP, è importante capire come ogni protocollo implementa specifiche caratteristiche di affidabilità e come ogni protocollo tiene traccia delle conversazioni.
Oltre a supportare le funzioni di base di segmentazione e riassemblaggio dei dati, TCP fornisce anche i seguenti servizi:
Stabilisce una sessione: TCP è un protocollo orientato alla connessione che negozia e stabilisce una connessione (o sessione) permanente tra i dispositivi di origine e di destinazione prima di inoltrare qualsiasi traffico. Attraverso l’istituzione della sessione, i dispositivi negoziano la quantità di traffico che può essere inoltrata in un determinato momento e i dati di comunicazione tra i due possono essere strettamente gestiti.
Garantisce una consegna affidabile: per molte ragioni, è possibile che un segmento venga danneggiato o perso completamente, mentre viene trasmesso sulla rete. TCP garantisce che ogni segmento inviato dall’origine arrivi a destinazione.
Fornisce la consegna nello stesso ordine: poiché le reti possono fornire più percorsi con velocità di trasmissione diverse, i dati possono arrivare nell’ordine sbagliato. Numerando e mettendo in sequenza i segmenti, TCP garantisce che i segmenti vengano riassemblati nell’ordine corretto.
Supporta il controllo del flusso: gli host di rete hanno risorse limitate (ad es. memoria e potenza di elaborazione). Quando TCP è consapevole che queste risorse sono sovraccaricate, può richiedere che l’applicazione mittente riduca la velocità del flusso di dati. Questo viene fatto dal TCP che regola la quantità di dati trasmessi dalla sorgente. Il controllo del flusso può impedire la necessità di ritrasmettere i dati quando le risorse dell’host ricevente sono sovraccariche.
Per ulteriori informazioni su TCP, cercare in Internet l’RFC 793.
TCP Header
TCP è un protocollo stateful, il che significa che tiene traccia dello stato della sessione di comunicazione. Per tenere traccia dello stato di una sessione, TCP registra quali informazioni ha inviato e quali informazioni sono state riconosciute. La sessione con stato inizia con l’istituzione della sessione e termina con la chiusura della sessione.
Un segmento TCP aggiunge 20 byte (ovvero 160 bit) di overhead durante l’incapsulamento dei dati del livello dell’applicazione. La figura mostra i campi in un’intestazione TCP.
Campi di intestazione TCP
La tabella identifica e descrive i dieci campi in un’intestazione TCP.
Applicazioni che utilizzano TCP
TCP è un buon esempio di come i diversi livelli della suite di protocolli TCP/IP abbiano ruoli specifici. TCP gestisce tutte le attività associate alla divisione del flusso di dati in segmenti, fornendo affidabilità, controllando il flusso di dati e riordinando i segmenti. TCP libera l’applicazione dalla necessità di gestire qualsiasi di queste attività. Le applicazioni, come quelle mostrate nella figura, possono semplicemente inviare il flusso di dati al livello di trasporto e utilizzare i servizi di TCP.
Panoramica dell’UDP
Funzionalità UDP
UDP, cosa fa e quando è una buona idea usarlo al posto di TCP. UDP è un protocollo di trasporto best-effort, leggero e offre la stessa segmentazione e riassemblaggio dei dati del TCP, ma senza l’affidabilità e il controllo del flusso del TCP.
UDP è un protocollo così semplice che di solito viene descritto in termini di ciò che non fa rispetto a TCP.
Le funzionalità UDP includono quanto segue:
I dati vengono ricostruiti nell’ordine in cui vengono ricevuti.
Tutti i segmenti persi non vengono reinviati.
Non è prevista la creazione di una sessione.
L’invio non viene informato sulla disponibilità delle risorse.
Per ulteriori informazioni su UDP, cercare RFC su Internet.
Intestazione UDP
UDP è un protocollo senza stato, ovvero né il client né il server tengono traccia dello stato della sessione di comunicazione. Se l’affidabilità è richiesta quando si utilizza UDP come protocollo di trasporto, deve essere gestito dall’applicazione.
Uno dei requisiti più importanti per fornire video e voce in diretta sulla rete è che i dati continuino a fluire rapidamente. Le applicazioni video e vocali dal vivo possono tollerare una certa perdita di dati con effetti minimi o nulli e sono perfettamente adatte a UDP.
I blocchi di comunicazione in UDP sono chiamati datagrammi o segmenti. Questi datagrammi vengono inviati al meglio dal protocollo del livello di trasporto.
L’intestazione UDP è molto più semplice dell’intestazione TCP perché ha solo quattro campi e richiede 8 byte (cioè 64 bit). La figura mostra i campi in un’intestazione UDP.
Campi di intestazione UDP
La tabella identifica e descrive i quattro campi in un’intestazione UDP.
Applicazioni che utilizzano UDP
Esistono tre tipi di applicazioni più adatte per UDP:
Applicazioni video e multimediali dal vivo: queste applicazioni possono tollerare una certa perdita di dati, ma richiedono un ritardo minimo o nullo. Gli esempi includono VoIP e video in streaming live.
Applicazioni di richiesta e risposta semplici: applicazioni con transazioni semplici in cui un host invia una richiesta e può ricevere o meno una risposta. Gli esempi includono DNS e DHCP.
Applicazioni che gestiscono autonomamente l’affidabilità: comunicazioni unidirezionali in cui il controllo del flusso, il rilevamento degli errori, i riconoscimenti e il ripristino degli errori non sono richiesti o possono essere gestiti dall’applicazione. Gli esempi includono SNMP e TFTP.
La figura identifica le applicazioni che richiedono UDP.
Sebbene DNS e SNMP utilizzino UDP per impostazione predefinita, entrambi possono utilizzare anche TCP. DNS utilizzerà TCP se la richiesta DNS o la risposta DNS supera i 512 byte, ad esempio quando una risposta DNS include molte risoluzioni di nomi. Analogamente, in alcune situazioni ’’amministratore di rete potrebbe voler configurare SNMP per l’utilizzo di TCP.
Port Numbers
Comunicazioni multiple separate
Ci sono alcune situazioni in cui TCP è il protocollo giusto per certe attività e altre situazioni in cui dovrebbe essere utilizzato UDP. Indipendentemente dal tipo di dati trasportati, sia TCP che UDP utilizzano i numeri di porta.
I protocolli del livello di trasporto TCP e UDP utilizzano i numeri di porta per gestire più conversazioni simultanee. Come mostrato nella figura, i campi di intestazione TCP e UDP identificano un numero di porta dell’applicazione di origine e di destinazione.
Il numero di porta di origine è associato all’applicazione di origine sull’host locale, mentre il numero di porta di destinazione è associato all’applicazione di destinazione sull’host remoto.
Ad esempio, supponiamo che un host stia avviando una richiesta di pagina web da un server web. Quando l’host avvia la richiesta della pagina Web, il numero della porta di origine viene generato dinamicamente dall’host per identificare in modo univoco la conversazione. Ogni richiesta generata da un host utilizzerà un diverso numero di porta di origine creato dinamicamente. Questo processo consente a più conversazioni di verificarsi contemporaneamente.
Nella richiesta, il numero della porta di destinazione è ciò che identifica il tipo di servizio richiesto al web server di destinazione. Ad esempio, quando un client specifica la porta 80 nella porta di destinazione, il server che riceve il messaggio sa che vengono richiesti servizi Web.
Un server può offrire più di un servizio contemporaneamente, come i servizi Web sulla porta 80, mentre offre la creazione di una connessione FTP (File Transfer Protocol) sulla porta 21.
Socket Pairs
Le porte di origine e di destinazione sono posizionate all’interno del segmento. I segmenti vengono quindi incapsulati all’interno di un pacchetto IP. Il pacchetto IP contiene l’indirizzo IP dell’origine e della destinazione. La combinazione dell’indirizzo IP di origine e del numero di porta di origine o dell’indirizzo IP di destinazione e del numero di porta di destinazione è nota come socket.
Nell’esempio in figura, il PC sta richiedendo contemporaneamente FTP e servizi web dal server di destinazione.
Nell’esempio, la richiesta FTP generata dal PC include gli indirizzi MAC Layer 2 e gli indirizzi IP Layer 3. La richiesta identifica anche il numero di porta sorgente 1305 (cioè generata dinamicamente dall’host) e la porta di destinazione, identificando i servizi FTP sulla porta 21. L’host ha anche richiesto una pagina web dal server utilizzando gli stessi indirizzi Layer 2 e Layer 3 . Tuttavia, utilizza il numero di porta di origine 1099 (ovvero generato dinamicamente dall’host) e la porta di destinazione che identifica il servizio Web sulla porta 80.
Il socket viene utilizzato per identificare il server e il servizio richiesto dal client. Un socket client potrebbe avere questo aspetto, con 1099 che rappresenta il numero della porta di origine: 192.168.1.5:1099
Il socket su un server Web potrebbe essere 192.168.1.7:80
Insieme, questi due socket si combinano per formare una coppia di socket: 192.168.1.5:1099, 192.168.1.7:80
I socket consentono a più processi, in esecuzione su un client, di distinguersi l’uno dall’altro e a più connessioni a un processo server di essere distinti l’uno dall’altro.
Il numero di porta di origine funge da indirizzo di ritorno per l’applicazione richiedente. Il livello di trasporto tiene traccia di questa porta e dell’applicazione che ha avviato la richiesta in modo che quando viene restituita una risposta, possa essere inoltrata all’applicazione corretta.
Gruppi di numeri di porta
L’Internet Assigned Numbers Authority (IANA) è l’organizzazione degli standard responsabile dell’assegnazione di vari standard di indirizzamento, inclusi i numeri di porta a 16 bit. I 16 bit utilizzati per identificare i numeri di porta di origine e di destinazione forniscono un intervallo di porte da 0 a 65535.
La IANA ha suddiviso la gamma di numeri nei seguenti tre gruppi di porte
Nota: alcuni sistemi operativi client possono utilizzare numeri di porta registrati anziché numeri di porta dinamici per l’assegnazione delle porte di origine.
La tabella mostra alcuni numeri di porta noti comuni e le relative applicazioni associate.
Alcune applicazioni possono utilizzare sia TCP che UDP. Ad esempio, DNS utilizza UDP quando i client inviano richieste a un server DNS. Tuttavia, la comunicazione tra due server DNS utilizza sempre il protocollo TCP.
Cerca nel sito Web IANA il registro delle porte per visualizzare l’elenco completo dei numeri di porta e delle applicazioni associate.
Il comando netstat
Le connessioni TCP inspiegabili possono rappresentare una grave minaccia per la sicurezza. Possono indicare che qualcosa o qualcuno è connesso all’host locale. A volte è necessario sapere quali connessioni TCP attive sono aperte e in esecuzione su un host in rete. Netstat è un’importante utility di rete che può essere utilizzata per verificare tali connessioni. Come mostrato di seguito, utilizzare il comando netstat per elencare i protocolli in uso, l’indirizzo locale e i numeri di porta, l’indirizzo esterno e i numeri di porta e lo stato della connessione.
Per impostazione predefinita, il comando netstat tenterà di risolvere gli indirizzi IP in nomi di dominio e numeri di porta in applicazioni note. L’opzione -n può essere utilizzata per visualizzare indirizzi IP e numeri di porta nella loro forma numerica.
Processo di comunicazione TCP
Processi del server TCP
Comprendere il ruolo dei numeri di porta aiuta a cogliere i dettagli del processo di comunicazione TCP. In questa parte verranno trattati anche i processi di handshake a tre vie TCP e di terminazione della sessione.
Ogni processo dell’applicazione in esecuzione su un server è configurato per utilizzare un numero di porta. Il numero di porta viene assegnato automaticamente o configurato manualmente da un amministratore di sistema.
Un singolo server non può avere due servizi assegnati allo stesso numero di porta all’interno degli stessi servizi del livello di trasporto. Ad esempio, un host che esegue un’applicazione server Web e un’applicazione di trasferimento file non può essere configurata per utilizzare la stessa porta, ad esempio la porta TCP 80.
Un’applicazione server attiva assegnata a una porta specifica è considerata aperta, il che significa che il livello di trasporto accetta ed elabora i segmenti indirizzati a quella porta. Qualsiasi richiesta client in entrata indirizzata al socket corretto viene accettata e i dati vengono passati all’applicazione server. Su un server possono essere aperte più porte contemporaneamente, una per ciascuna applicazione server attiva.
– Client che inviano richieste TCP
Il client 1 richiede i servizi Web e il client 2 richiede il servizio di posta elettronica dello stesso server.
– Richieste di porte di destinazione
Il client 1 richiede i servizi Web utilizzando la porta di destinazione nota 80 (HTTP) e il client 2 richiede il servizio di posta elettronica utilizzando la porta nota 25 (SMTP).
– Richieste di porte di origine
Le richieste del client generano dinamicamente un numero di porta di origine. In questo caso, il client 1 utilizza la porta di origine 49152 e il client 2 utilizza la porta di origine 51152.
– Porte di destinazione della risposta
Quando il server risponde alle richieste del client, inverte le porte di destinazione e di origine della richiesta iniziale. Si noti che la risposta del server alla richiesta Web ora ha la porta di destinazione 49152 e la risposta e-mail ora ha la porta di destinazione 51152.
– Porte di origine della risposta
La porta di origine nella risposta del server è la porta di destinazione originale nelle richieste iniziali.
Creazione della connessione TCP
In alcune culture, quando due persone si incontrano, spesso si salutano stringendosi la mano. Entrambe le parti interpretano l’atto di stringere la mano come un segnale per un saluto amichevole. Le connessioni sulla rete sono simili. Nelle connessioni TCP, il client host stabilisce la connessione con il server utilizzando il processo di handshake a tre vie.
Passo 1. SIN
Il client di avvio richiede una sessione di comunicazione client-server con il server.
Passo 2. ACK e SYN
Il server riconosce la sessione di comunicazione client-server e richiede una sessione di comunicazione server-client.
Passo 3. ACK
Il client di avvio riconosce la sessione di comunicazione server-client.
L’handshake a tre vie convalida che l’host di destinazione è disponibile per la comunicazione. In questo esempio, l’host A ha convalidato la disponibilità dell’host B.
Session Termination
Per chiudere una connessione, il flag di controllo Finish (FIN) deve essere impostato nell’intestazione del segmento. Per terminare ogni sessione TCP unidirezionale, viene utilizzato un handshake bidirezionale, costituito da un segmento FIN e un segmento di riconoscimento (ACK). Pertanto, per terminare una singola conversazione supportata da TCP, sono necessari quattro scambi per terminare entrambe le sessioni. Sia il client che il server possono avviare la terminazione.
Nell’esempio, i termini client e server vengono usati come riferimento per semplicità, ma qualsiasi coppia di host che ha una sessione aperta può avviare il processo di terminazione.
Passo 1. FIN
Quando il client non ha più dati da inviare nel flusso, invia un segmento con il flag FIN impostato.
Passo 2. ACK
Il server invia un ACK per confermare la ricezione del FIN per terminare la sessione dal client al server.
Passo 3. FIN
Il server invia un FIN al client per terminare la sessione server-client.
Passo 4. ACK
Il client risponde con un ACK per riconoscere il FIN dal server.
Quando tutti i segmenti sono stati riconosciuti, la sessione è chiusa.
Analisi dell’handshake a tre vie TCP
Gli host mantengono lo stato, tengono traccia di ogni segmento di dati all’interno di una sessione e scambiano informazioni su quali dati vengono ricevuti utilizzando le informazioni nell’intestazione TCP. TCP è un protocollo full-duplex, in cui ogni connessione rappresenta due sessioni di comunicazione unidirezionali. Per stabilire la connessione, gli host eseguono un handshake a tre vie. Come mostrato nella figura, i bit di controllo nell’intestazione TCP indicano l’avanzamento e lo stato della connessione.
Queste sono le funzioni dell’handshake a tre vie:
Stabilisce che il dispositivo di destinazione è presente sulla rete.
Verifica che il dispositivo di destinazione disponga di un servizio attivo e accetti richieste sul numero di porta di destinazione che il client di avvio intende utilizzare.
Informa il dispositivo di destinazione che il client di origine intende stabilire una sessione di comunicazione su quel numero di porta.
Al termine della comunicazione, le sessioni vengono chiuse e la connessione termina. I meccanismi di connessione e sessione abilitano la funzione di affidabilità TCP.
Campo dei bit di controllo
I sei bit nel campo Bit di controllo dell’intestazione del segmento TCP sono noti anche come flag. Un flag è un bit impostato su on o off.
I flag dei sei bit di controllo sono i seguenti:
URG – Campo puntatore urgente significativo
ACK – Flag di riconoscimento utilizzato per stabilire la connessione e terminare la sessione
PSH – Funzione push
RST – Ripristina la connessione quando si verifica un errore o un timeout
SYN – Sincronizza i numeri di sequenza utilizzati nella creazione della connessione
FIN – Niente più dati dal mittente e utilizzato per terminare la sessione
Cerca in Internet per saperne di più sui flag PSH e URG.
Affidabilità e controllo del flusso
Affidabilità TCP – Consegna garantita e ordinata
Il motivo per cui TCP è il protocollo migliore per alcune applicazioni è perché, a differenza di UDP, invia nuovamente i pacchetti scartati e il numero di pacchetti per indicare il loro ordine corretto prima della consegna. TCP può anche aiutare a mantenere il flusso di pacchetti in modo che i dispositivi non vengano sovraccaricati.
Ci possono essere momenti in cui i segmenti TCP non arrivano a destinazione. Altre volte, i segmenti TCP potrebbero arrivare fuori ordine. Affinché il messaggio originale sia compreso dal destinatario, tutti i dati devono essere ricevuti e i dati in questi segmenti devono essere riassemblati nell’ordine originale. I numeri di sequenza vengono assegnati nell’intestazione di ciascun pacchetto per raggiungere questo obiettivo. Il numero di sequenza rappresenta il primo byte di dati del segmento TCP.
Durante l’impostazione della sessione, viene impostato un numero di sequenza iniziale (ISN – initial sequence number). Questo ISN rappresenta il valore iniziale dei byte trasmessi all’applicazione ricevente. Man mano che i dati vengono trasmessi durante la sessione, il numero di sequenza viene incrementato del numero di byte che sono stati trasmessi. Questo tracciamento dei byte di dati consente di identificare e riconoscere in modo univoco ogni segmento. I segmenti mancanti possono quindi essere identificati.
L’ISN non inizia da uno ma è effettivamente un numero casuale. Questo serve a prevenire alcuni tipi di attacchi dannosi. Per semplicità, utilizzeremo un ISN pari a 1 per gli esempi di questo modulo.
I numeri di sequenza dei segmenti indicano come riassemblare e riordinare i segmenti ricevuti, come mostrato nella figura.
I segmenti TCP vengono riordinati alla destinazione
Il processo TCP di ricezione inserisce i dati da un segmento in un buffer di ricezione. I segmenti vengono quindi posizionati nell’ordine di sequenza corretto e passati al livello dell’applicazione una volta riassemblati. Tutti i segmenti che arrivano con numeri di sequenza non ordinati vengono trattenuti per un’elaborazione successiva. Quindi, quando arrivano i segmenti con i byte mancanti, questi segmenti vengono elaborati in ordine.
Affidabilità TCP – Numeri di sequenza e riconoscimenti
Una delle funzioni del TCP è garantire che ogni segmento raggiunga la sua destinazione. I servizi TCP sull’host di destinazione riconoscono i dati che sono stati ricevuti dall’applicazione di origine.
Affidabilità TCP – Perdita di dati e ritrasmissione
Non importa quanto sia ben progettata una rete, occasionalmente si verificano perdite di dati. TCP fornisce metodi per gestire queste perdite di segmento. Tra questi c’è un meccanismo per ritrasmettere segmenti per dati non riconosciuti.
Il numero di sequenza (SEQ) e il numero di riconoscimento (ACK) vengono utilizzati insieme per confermare la ricezione dei byte di dati contenuti nei segmenti trasmessi. Il numero SEQ identifica il primo byte di dati nel segmento che viene trasmesso. TCP utilizza il numero ACK inviato all’origine per indicare il byte successivo che il destinatario si aspetta di ricevere. Questo si chiama riconoscimento delle aspettative.
Prima dei miglioramenti successivi, TCP poteva riconoscere solo il byte successivo previsto. Ad esempio, nella figura, utilizzando i numeri di segmento per semplicità, l’host A invia i segmenti da 1 a 10 all’host B. Se arrivano tutti i segmenti tranne i segmenti 3 e 4, l’host B risponderà con un riconoscimento specificando che il prossimo segmento previsto è il segmento 3. L’host A non ha idea se siano arrivati o meno altri segmenti. L’host A, quindi, invierà nuovamente i segmenti da 3 a 10. Se tutti i segmenti inviati di nuovo sono arrivati correttamente, i segmenti da 5 a 10 sarebbero duplicati. Questo può portare a ritardi, congestioni e inefficienze.
I sistemi operativi host oggi in genere utilizzano una funzionalità TCP opzionale chiamata riconoscimento selettivo (SACK), negoziata durante l’handshake a tre vie. Se entrambi gli host supportano SACK, il ricevitore può riconoscere esplicitamente quali segmenti (byte) sono stati ricevuti, inclusi eventuali segmenti discontinui. L’host di invio dovrebbe quindi solo ritrasmettere i dati mancanti. Ad esempio, nella figura successiva, sempre utilizzando i numeri di segmento per semplicità, l’host A invia i segmenti da 1 a 10 all’host B. Se arrivano tutti i segmenti tranne i segmenti 3 e 4, l’host B può confermare di aver ricevuto i segmenti 1 e 2 (ACK 3) e riconoscere selettivamente i segmenti da 5 a 10 (SACK 5-10). L’host A dovrebbe solo inviare nuovamente i segmenti 3 e 4.
Nota: TCP in genere invia ACK per ogni altro pacchetto, ma altri fattori che esulano dall’ambito di questo argomento potrebbero alterare questo comportamento.
TCP utilizza i timer per sapere quanto tempo attendere prima di inviare nuovamente un segmento. Nella figura, riprodurre il video e fare clic sul collegamento per scaricare il file PDF. Il video e il file PDF esaminano la perdita e la ritrasmissione dei dati TCP.
TCP Flow Control – Window Size and Acknowledgments
TCP fornisce anche meccanismi per il controllo del flusso. Il controllo del flusso è la quantità di dati che la destinazione può ricevere ed elaborare in modo affidabile. Il controllo del flusso aiuta a mantenere l’affidabilità della trasmissione TCP regolando la velocità del flusso di dati tra origine e destinazione per una determinata sessione. Per fare ciò, l’intestazione TCP include un campo a 16 bit chiamato dimensione della finestra.
La figura mostra un esempio di dimensioni della finestra e riconoscimenti.
Esempio di dimensione della finestra TCP
La dimensione della finestra determina il numero di byte che possono essere inviati prima di attendere un riconoscimento. Il numero di riconoscimento è il numero del prossimo byte previsto.
La dimensione della finestra è il numero di byte che il dispositivo di destinazione di una sessione TCP può accettare ed elaborare contemporaneamente. In questo esempio, la dimensione della finestra iniziale del PC B per la sessione TCP è di 10.000 byte. A partire dal primo byte, numero di byte 1, l’ultimo byte che il PC A può inviare senza ricevere un riconoscimento è il byte 10.000. Questa è nota come finestra di invio del PC A. La dimensione della finestra è inclusa in ogni segmento TCP in modo che la destinazione possa modificare la dimensione della finestra in qualsiasi momento a seconda della disponibilità del buffer.
La dimensione iniziale della finestra viene concordata quando viene stabilita la sessione TCP durante l’handshake a tre vie. Il dispositivo di origine deve limitare il numero di byte inviati al dispositivo di destinazione in base alle dimensioni della finestra della destinazione. Solo dopo che il dispositivo di origine riceve una conferma che i byte sono stati ricevuti, può continuare a inviare altri dati per la sessione. In genere, la destinazione non attenderà la ricezione di tutti i byte della dimensione della finestra prima di rispondere con un riconoscimento. Man mano che i byte vengono ricevuti ed elaborati, la destinazione invierà conferme per informare l’origine che può continuare a inviare byte aggiuntivi.
Ad esempio, è tipico che il PC B non attenda fino a quando tutti i 10.000 byte sono stati ricevuti prima di inviare un riconoscimento. Ciò significa che il PC A può regolare la sua finestra di invio man mano che riceve riconoscimenti dal PC B. Come mostrato nella figura, quando il PC A riceve un riconoscimento con il numero di riconoscimento 2.921, che è il prossimo byte previsto. La finestra di invio del PC A incrementerà 2.920 byte. Ciò modifica la finestra di invio da 10.000 byte a 12.920. Il PC A può ora continuare a inviare altri 10.000 byte al PC B purché non invii più della sua nuova finestra di invio a 12.920.
Una destinazione che invia conferme mentre elabora i byte ricevuti e la regolazione continua della finestra di invio di origine sono note come finestre scorrevoli. Nell’esempio precedente, la finestra di invio del PC A aumenta o scorre di altri 2.921 byte da 10.000 a 12.920.
Se la disponibilità dello spazio del buffer della destinazione diminuisce, può ridurre le dimensioni della finestra per informare l’origine di ridurre il numero di byte che dovrebbe inviare senza ricevere un riconoscimento.
Nota: i dispositivi oggi utilizzano il protocollo di finestre scorrevoli. Il ricevitore in genere invia un riconoscimento dopo ogni due segmenti che riceve. Il numero di segmenti ricevuti prima di essere riconosciuti può variare. Il vantaggio delle finestre scorrevoli è che consente al mittente di trasmettere continuamente segmenti, purché il ricevitore riconosca i segmenti precedenti.
Controllo del flusso TCP – Dimensione massima del segmento (Maximum Segment Size – MSS)
Nella figura, la sorgente sta trasmettendo 1.460 byte di dati all’interno di ciascun segmento TCP. Si tratta in genere della dimensione massima del segmento (MSS) che il dispositivo di destinazione può ricevere. L’MSS fa parte del campo delle opzioni nell’intestazione TCP che specifica la massima quantità di dati, in byte, che un dispositivo può ricevere in un singolo segmento TCP. La dimensione MSS non include l’intestazione TCP. L’MSS è in genere incluso durante l’handshake a tre vie.
Un MSS comune è di 1.460 byte quando si utilizza IPv4. Un host determina il valore del suo campo MSS sottraendo le intestazioni IP e TCP dall’unità di trasmissione massima Ethernet (MTU – maximum transmission unit). Su un’interfaccia Ethernet, l’MTU predefinito è 1500 byte. Sottraendo l’intestazione IPv4 di 20 byte e l’intestazione TCP di 20 byte, la dimensione MSS predefinita sarà di 1460 byte, come mostrato nella figura.
Controllo del flusso TCP – Prevenzione della congestione
Quando si verifica una congestione su una rete, i pacchetti vengono scartati dal router sovraccarico. Quando i pacchetti contenenti segmenti TCP non raggiungono la loro destinazione, vengono lasciati senza riconoscimento. Determinando la velocità con cui i segmenti TCP vengono inviati ma non riconosciuti, la sorgente può assumere un certo livello di congestione della rete.
Ogni volta che si verifica una congestione, si verificherà altresì la ritrasmissione dei segmenti TCP persi dall’origine. Se la ritrasmissione non è adeguatamente controllata, la ritrasmissione aggiuntiva dei segmenti TCP può peggiorare ulteriormente la congestione. Non solo nuovi pacchetti con segmenti TCP vengono introdotti nella rete, ma anche l’effetto di feedback dei segmenti TCP ritrasmessi che sono stati persi si aggiungerà alla congestione. Per evitare e controllare la congestione, TCP utilizza diversi meccanismi, timer e algoritmi di gestione della congestione.
Se l’origine determina che i segmenti TCP non vengono riconosciuti o non vengono riconosciuti in modo tempestivo, può ridurre il numero di byte che invia prima di ricevere un riconoscimento. Come illustrato nella figura, il PC A rileva la presenza di congestione e, pertanto, riduce il numero di byte che invia prima di ricevere un riconoscimento dal PC B.
I numeri di riconoscimento sono per il prossimo byte previsto e non per un segmento. I numeri di segmento utilizzati sono semplificati a scopo illustrativo.
Si noti che è l’origine che sta riducendo il numero di byte non riconosciuti che invia e non la dimensione della finestra determinata dalla destinazione.
Nota: le spiegazioni dei meccanismi, dei timer e degli algoritmi di gestione della congestione effettivi esulano dallo scopo di questo corso.
Comunicazione UDP
UDP Low Overhead rispetto all’affidabilità
Come spiegato in precedenza, UDP è perfetto per le comunicazioni che devono essere veloci, come il VoIP. Questo argomento spiega in dettaglio perché UDP è perfetto per alcuni tipi di trasmissione. Come mostrato nella figura, UDP non stabilisce una connessione. UDP fornisce un trasporto di dati a basso sovraccarico perché ha un’intestazione di datagramma piccola e nessun traffico di gestione della rete.
Riassemblaggio del datagramma UDP
Come i segmenti con TCP, quando i datagrammi UDP vengono inviati a una destinazione, spesso prendono percorsi diversi e arrivano nell’ordine sbagliato. UDP non tiene traccia dei numeri di sequenza come fa TCP. UDP non ha modo di riordinare i datagrammi nel loro ordine di trasmissione, come mostrato nella figura.
Pertanto, UDP riassembla semplicemente i dati nell’ordine in cui sono stati ricevuti e li inoltra all’applicazione. Se la sequenza dei dati è importante per l’applicazione, l’applicazione stessa deve identificare la sequenza corretta e determinare come devono essere elaborati i dati.
UDP: senza connessione e inaffidabile
Processi e richieste del server UDP
Analogamente alle applicazioni basate su TCP, alle applicazioni server basate su UDP vengono assegnati numeri di porta noti o registrati, come mostrato nella figura. Quando queste applicazioni o processi sono in esecuzione su un server, accettano i dati abbinati al numero di porta assegnato. Quando UDP riceve un datagramma destinato a una di queste porte, inoltra i dati dell’applicazione all’applicazione appropriata in base al suo numero di porta.
Server UDP in ascolto richieste
Processi client UDP
Come con TCP, la comunicazione client-server viene avviata da un’applicazione client che richiede dati da un processo server. Il processo client UDP seleziona dinamicamente un numero di porta dall’intervallo di numeri di porta e lo utilizza come porta di origine per la conversazione. La porta di destinazione è in genere il numero di porta noto o registrato assegnato al processo del server.
Dopo che un client ha selezionato le porte di origine e di destinazione, la stessa coppia di porte viene utilizzata nell’intestazione di tutti i datagrammi della transazione. Per i dati restituiti al client dal server, i numeri di porta di origine e di destinazione nell’intestazione del datagramma sono invertiti.
Client che inviano richieste UDP
Il client 1 invia una richiesta DNS mentre il client 2 richiede i servizi di autenticazione RADIUS dello stesso server.
Porte di destinazione della richiesta UDP
Il client 1 invia una richiesta DNS utilizzando la porta di destinazione nota 53 mentre il client 2 richiede i servizi di autenticazione RADIUS utilizzando la porta di destinazione registrata 1812.
Porte di origine della richiesta UDP
Le richieste dei client generano dinamicamente i numeri di porta di origine. In questo caso, il client 1 utilizza la porta di origine 49152 e il client 2 utilizza la porta di origine 51152.
Destinazione risposta UDP
Quando il server risponde alle richieste del client, inverte le porte di destinazione e di origine della richiesta iniziale. Nella risposta del server alla richiesta DNS è ora la porta di destinazione 49152 e la risposta di autenticazione RADIUS è ora la porta di destinazione 51152.
Porte di origine della risposta UDP
Le porte di origine nella risposta del server sono le porte di destinazione originali nelle richieste iniziali.
Transport Layer – Riepilogo
I programmi a livello di applicazione generano dati che devono essere scambiati tra gli host di origine e di destinazione. Il livello di trasporto è responsabile delle comunicazioni logiche tra le applicazioni in esecuzione su host diversi. Il livello di trasporto include due protocolli: Transmission Control Protocol TCP e User Datagram Protocol UDP.
Monitoraggio delle singole conversazioni: a livello di trasporto, ogni set di dati che scorre tra un’applicazione di origine e un’applicazione di destinazione è noto come conversazione e viene monitorato separatamente. È responsabilità del livello di trasporto mantenere e tenere traccia di queste molteplici conversazioni.
Segmentazione dei dati e riassemblaggio dei segmenti: è responsabilità del livello di trasporto dividere i dati dell’applicazione in blocchi di dimensioni adeguate. A seconda del protocollo del livello di trasporto utilizzato, i blocchi del livello di trasporto sono chiamati segmenti o datagrammi.
Aggiungi informazioni di intestazione: il protocollo del livello di trasporto aggiunge anche informazioni di intestazione contenenti dati binari organizzati in diversi campi a ciascun blocco di dati.
Identificazione delle applicazioni: il livello di trasporto deve essere in grado di separare e gestire più comunicazioni con diverse esigenze di trasporto.
Conversation Multiplexing: l’invio di alcuni tipi di dati (ad esempio, un video in streaming) attraverso una rete, come un flusso di comunicazione completo, può consumare tutta la larghezza di banda disponibile. Il livello di trasporto utilizza la segmentazione e il multiplexing per consentire l’intercalazione di diverse conversazioni di comunicazione sulla stessa rete.
I protocolli del livello di trasporto specificano come trasferire i messaggi tra host e sono responsabili della gestione dei requisiti di affidabilità di una conversazione. Il livello di trasporto include i protocolli TCP e UDP.
TCP fornisce affidabilità e controllo del flusso utilizzando queste operazioni di base:
Numerare e tenere traccia dei segmenti di dati trasmessi a un host specifico da un’applicazione specifica
Riconoscere i dati ricevuti
Ritrasmettere tutti i dati non riconosciuti dopo un certo periodo di tempo
Sequenza di dati che potrebbero arrivare nell’ordine sbagliato
Invia i dati a una velocità efficiente accettabile dal destinatario
Per mantenere lo stato di una conversazione e tenere traccia delle informazioni, il TCP deve prima stabilire una connessione tra il mittente e il destinatario. Questo è il motivo per cui TCP è noto come protocollo orientato alla connessione.
UDP è un protocollo senza connessione. Poiché UDP non fornisce affidabilità o controllo del flusso, non richiede una connessione stabilita. Poiché UDP non tiene traccia delle informazioni inviate o ricevute tra il client e il server, UDP è noto anche come protocollo senza stato. UDP è anche noto come protocollo di consegna best-effort perché non vi è alcun riconoscimento che i dati siano stati ricevuti a destinazione. Con UDP, non ci sono processi a livello di trasporto che informano il mittente di una consegna riuscita. UDP è preferibile per applicazioni come VoIP. I riconoscimenti e la ritrasmissione rallenterebbero la consegna e renderebbero inaccettabile la conversazione vocale. UDP viene utilizzato anche dalle applicazioni di richiesta e risposta in cui i dati sono minimi e la ritrasmissione può essere eseguita rapidamente.
Per altre applicazioni è importante che tutti i dati arrivino e che possano essere elaborati nella sequenza corretta. Per questi tipi di applicazioni, TCP viene utilizzato come protocollo di trasporto. Ad esempio, applicazioni come database, browser Web e client di posta elettronica richiedono che tutti i dati inviati arrivino a destinazione nelle condizioni originali. Eventuali dati mancanti potrebbero corrompere una comunicazione, rendendola incompleta o illeggibile.
Panoramica TCP
Oltre a supportare le funzioni di base di segmentazione e riassemblaggio dei dati, TCP fornisce anche i seguenti servizi:
Stabilisce una sessione: TCP è un protocollo orientato alla connessione che negozia e stabilisce una connessione (o sessione) permanente tra i dispositivi di origine e di destinazione prima di inoltrare qualsiasi traffico. Attraverso l’istituzione della sessione, i dispositivi negoziano la quantità di traffico che può essere inoltrata in un determinato momento e i dati di comunicazione tra i due possono essere gestiti da vicino.
Garantisce una consegna affidabile: per molte ragioni, è possibile che un segmento venga danneggiato o perso completamente, mentre viene trasmesso sulla rete. TCP garantisce che ogni segmento inviato dall’origine arrivi a destinazione.
Fornisce la consegna nello stesso ordine: poiché le reti possono fornire più percorsi con velocità di trasmissione diverse, i dati possono arrivare nell’ordine sbagliato. Numerando e mettendo in sequenza i segmenti, TCP garantisce che i segmenti vengano riassemblati nell’ordine corretto.
Supporta il controllo del flusso: gli host di rete hanno risorse limitate (ad es. memoria e potenza di elaborazione). Quando TCP è consapevole che queste risorse sono sovraccaricate, può richiedere che l’applicazione mittente riduca la velocità del flusso di dati. Questo viene fatto dal TCP che regola la quantità di dati trasmessi dalla sorgente. Il controllo del flusso può impedire la necessità di ritrasmettere i dati quando le risorse dell’host ricevente sono sovraccariche.
TCP è un protocollo stateful, il che significa che tiene traccia dello stato della sessione di comunicazione. Per tenere traccia dello stato di una sessione, TCP registra quali informazioni ha inviato e quali informazioni sono state riconosciute. La sessione con stato inizia con l’istituzione della sessione e termina con la chiusura della sessione.
I dieci campi nell’intestazione TCP sono i seguenti:
Porta di origine: un campo a 16 bit utilizzato per identificare l’applicazione di origine in base al numero di porta.
Porta di destinazione: un campo a 16 bit utilizzato per identificare l’applicazione di destinazione in base al numero di porta.
Numero di sequenza: un campo a 32 bit utilizzato per il riassemblaggio dei dati.
Numero di riconoscimento: un campo a 32 bit utilizzato per indicare che i dati sono stati ricevuti e il byte successivo previsto dall’origine.
Lunghezza intestazione: un campo a 4 bit noto come “offset dati” che indica la lunghezza dell’intestazione del segmento TCP.
Riservato: un campo a 6 bit riservato per uso futuro.
Bit di controllo: un campo a 6 bit che include codici bit, o flag, che indicano lo scopo e la funzione del segmento TCP.
Dimensione finestra: campo a 16 bit utilizzato per indicare il numero di byte che possono essere accettati contemporaneamente.
Checksum: un campo a 16 bit utilizzato per il controllo degli errori dell’intestazione del segmento e dei dati.
Urgent: un campo a 16 bit utilizzato per indicare se i dati contenuti sono urgenti.
TCP è un buon esempio di come i diversi livelli della suite di protocolli TCP/IP abbiano ruoli specifici. TCP gestisce tutte le attività associate alla divisione del flusso di dati in segmenti, fornendo affidabilità, controllando il flusso di dati e riordinando i segmenti. TCP libera l’applicazione dalla necessità di gestire qualsiasi di queste attività. HTTP, FTP, SMTP e SSH possono semplicemente inviare il flusso di dati al livello di trasporto e utilizzare i servizi di TCP.
Panoramica UDP
UDP è un protocollo di trasporto leggero che offre la stessa segmentazione e riassemblaggio dei dati del TCP, ma senza l’affidabilità e il controllo del flusso del TCP.
Le funzionalità UDP includono quanto segue:
I dati vengono ricostruiti nell’ordine in cui vengono ricevuti.
Tutti i segmenti persi non vengono reinviati.
Non è prevista la creazione di una sessione.
L’invio non viene informato sulla disponibilità delle risorse.
UDP è un protocollo senza stato, ovvero né il client né il server tengono traccia dello stato della sessione di comunicazione. Se l’affidabilità è richiesta quando si utilizza UDP come protocollo di trasporto, deve essere gestito dall’applicazione.
I blocchi di comunicazione in UDP sono chiamati datagrammi o segmenti. Questi datagrammi vengono inviati al meglio dal protocollo del livello di trasporto. L’intestazione UDP è molto più semplice dell’intestazione TCP perché ha solo quattro campi e richiede 8 byte (cioè 64 bit).
I quattro campi nell’intestazione UDP sono i seguenti:
Porta di origine: un campo a 16 bit utilizzato per identificare l’applicazione di origine in base al numero di porta.
Porta di destinazione: un campo a 16 bit utilizzato per identificare l’applicazione di destinazione in base al numero di porta.
Lunghezza: un campo a 16 bit che indica la lunghezza dell’intestazione del datagramma UDP.
Checksum: un campo a 16 bit utilizzato per il controllo degli errori dell’intestazione e dei dati del datagramma.
Ci sono tre tipi di applicazioni che sono più adatte per UDP: video in diretta e applicazioni multimediali, semplici applicazioni di richiesta e risposta, applicazioni che gestiscono l’affidabilità da sole.
Numeri di porta
I protocolli del livello di trasporto TCP e UDP utilizzano i numeri di porta per gestire più conversazioni simultanee. I campi di intestazione TCP e UDP identificano un numero di porta dell’applicazione di origine e di destinazione. Il numero di porta di origine è associato all’applicazione di origine sull’host locale, mentre il numero di porta di destinazione è associato all’applicazione di destinazione sull’host remoto.
Le porte di origine e di destinazione sono posizionate all’interno del segmento. I segmenti vengono quindi incapsulati all’interno di un pacchetto IP. Il pacchetto IP contiene l’indirizzo IP dell’origine e della destinazione. La combinazione dell’indirizzo IP di origine e del numero di porta di origine o dell’indirizzo IP di destinazione e del numero di porta di destinazione è nota come socket.
Il socket viene utilizzato per identificare il server e il servizio richiesto dal client. Un socket client potrebbe avere questo aspetto, con 1099 che rappresenta il numero della porta di origine: 192.168.1.5:1099. Il socket su un server Web potrebbe essere 192.168.1.7:80. Insieme, questi due socket si combinano per formare una coppia di socket: 192.168.1.5:1099, 192.168.1.7:80. I socket consentono a più processi, in esecuzione su un client, di distinguersi l’uno dall’altro e a più connessioni a un processo server di essere distinti l’uno dall’altro.
IANA è l’organizzazione degli standard responsabile dell’assegnazione di vari standard di indirizzamento, inclusi i numeri di porta a 16 bit. I 16 bit utilizzati per identificare i numeri di porta di origine e di destinazione forniscono un intervallo di porte da 0 a 65535.
La IANA ha suddiviso la gamma di numeri nei seguenti tre gruppi di porte:
Porte note (da 0 a 1.023)
Porte registrate (da 1.024 a 49.151)
Porte private e/o dinamiche (da 49.152 a 65.535)
Le connessioni TCP inspiegabili possono rappresentare una grave minaccia per la sicurezza. Possono indicare che qualcosa o qualcuno è connesso all’host locale. Netstat è un’importante utility di rete che può essere utilizzata per verificare tali connessioni. Utilizzare il comando netstat per elencare i protocolli in uso, l’indirizzo locale e i numeri di porta, l’indirizzo esterno e i numeri di porta e lo stato della connessione. Per impostazione predefinita, il comando netstat tenterà di risolvere gli indirizzi IP in nomi di dominio e numeri di porta in applicazioni note.
Processo di comunicazione TCP
Il motivo per cui TCP è il protocollo migliore per alcune applicazioni è perché, a differenza di UDP, invia nuovamente i pacchetti scartati e il numero di pacchetti per indicare il loro ordine corretto prima della consegna. TCP può anche aiutare a mantenere il flusso di pacchetti in modo che i dispositivi non vengano sovraccaricati.
I numeri di sequenza vengono assegnati nell’intestazione di ciascun pacchetto per garantire che tutti i segmenti arrivino a destinazione nell’ordine corretto. Il numero di sequenza rappresenta il primo byte di dati del segmento TCP. Durante l’impostazione della sessione, viene impostato un ISN. Questo ISN rappresenta il valore iniziale dei byte trasmessi all’applicazione ricevente. Man mano che i dati vengono trasmessi durante la sessione, il numero di sequenza viene incrementato del numero di byte che sono stati trasmessi. Questo tracciamento dei byte di dati consente di identificare e riconoscere in modo univoco ogni segmento. I segmenti mancanti possono quindi essere identificati.
Il numero SEQ e il numero ACK sono usati insieme per confermare la ricezione dei byte di dati contenuti nei segmenti trasmessi. Il numero SEQ identifica il primo byte di dati nel segmento che viene trasmesso. TCP utilizza il numero ACK inviato all’origine per indicare il byte successivo che il destinatario si aspetta di ricevere. Questo si chiama riconoscimento delle aspettative.
TCP fornisce anche meccanismi per il controllo del flusso. Il controllo del flusso è la quantità di dati che la destinazione può ricevere ed elaborare in modo affidabile. Il controllo del flusso aiuta a mantenere l’affidabilità della trasmissione TCP regolando la velocità del flusso di dati tra origine e destinazione per una determinata sessione. Per fare ciò, l’intestazione TCP include un campo a 16 bit chiamato dimensione della finestra.
La dimensione della finestra determina il numero di byte che possono essere inviati prima di attendere un riconoscimento. Il numero di riconoscimento è il numero del prossimo byte previsto. La dimensione iniziale della finestra viene concordata quando viene stabilita la sessione TCP durante l’handshake a tre vie. Il dispositivo di origine deve limitare il numero di byte inviati al dispositivo di destinazione in base alle dimensioni della finestra della destinazione. Solo dopo che il dispositivo di origine riceve una conferma che i byte sono stati ricevuti, può continuare a inviare altri dati per la sessione.
L’MSS fa parte del campo delle opzioni nell’intestazione TCP che specifica la massima quantità di dati, in byte, che un dispositivo può ricevere in un singolo segmento TCP. La dimensione MSS non include l’intestazione TCP. L’MSS è in genere incluso durante l’handshake a tre vie.
Ogni volta che si verifica una congestione, si verificherà altresì la ritrasmissione dei segmenti TCP persi dall’origine. Se la ritrasmissione non è adeguatamente controllata, la ritrasmissione aggiuntiva dei segmenti TCP può peggiorare ulteriormente la congestione. Per evitare e controllare la congestione, TCP utilizza diversi meccanismi, timer e algoritmi di gestione della congestione.
Comunicazioni UDP
UDP non stabilisce una connessione. UDP fornisce un trasporto di dati a basso sovraccarico perché ha un’intestazione di datagramma piccola e nessun traffico di gestione della rete.
Come i segmenti con TCP, quando i datagrammi UDP vengono inviati a una destinazione, spesso prendono percorsi diversi e arrivano nell’ordine sbagliato. UDP non tiene traccia dei numeri di sequenza come fa TCP. Pertanto, UDP riassembla semplicemente i dati nell’ordine in cui sono stati ricevuti e li inoltra all’applicazione.
Analogamente alle applicazioni basate su TCP, alle applicazioni server basate su UDP vengono assegnati numeri di porta noti o registrati. Quando queste applicazioni o processi sono in esecuzione su un server, accettano i dati abbinati al numero di porta assegnato. Quando UDP riceve un datagramma destinato a una di queste porte, inoltra i dati dell’applicazione all’applicazione appropriata in base al suo numero di porta.
Dopo che un client ha selezionato le porte di origine e di destinazione, la stessa coppia di porte viene utilizzata nell’intestazione di tutti i datagrammi della transazione. Per i dati restituiti al client dal server, i numeri di porta di origine e di destinazione nell’intestazione del datagramma sono invertiti.
La riga di comando di Cisco IOS
IOS Navigation
L’interfaccia della riga di comando di Cisco IOS
L’interfaccia della riga di comando (command line interface – CLI) di Cisco IOS è un programma basato su testo che consente di immettere ed eseguire i comandi di Cisco IOS per configurare, monitorare e gestire i dispositivi Cisco. L’interfaccia a riga di comando di Cisco può essere utilizzata con attività di gestione in banda o fuori banda.
I comandi CLI vengono utilizzati per modificare la configurazione del dispositivo e per visualizzare lo stato corrente dei processi sul router. Per gli utenti esperti, la CLI offre molte funzionalità che consentono di risparmiare tempo per la creazione di configurazioni sia semplici che complesse. Quasi tutti i dispositivi di rete Cisco utilizzano una CLI simile. Quando il router ha completato la sequenza di accensione e viene visualizzato il prompt Router>, è possibile utilizzare la CLI per immettere i comandi Cisco IOS, come mostrato nell’output del comando.
I tecnici che hanno familiarità con i comandi IOS e il funzionamento della CLI trovano facile monitorare e configurare una varietà di dispositivi di rete diversi perché gli stessi comandi di base vengono utilizzati per configurare uno switch e un router. La CLI dispone di un ampio sistema di guida che assiste gli utenti nella configurazione e nel monitoraggio dei dispositivi.
Primary Command Modes
Tutti i dispositivi di rete richiedono un sistema operativo e possono essere configurati utilizzando la CLI o una GUI. L’utilizzo della CLI può fornire all’amministratore di rete un controllo e una flessibilità più precisi rispetto all’utilizzo della GUI. Questo argomento discute l’utilizzo della CLI per navigare in Cisco IOS.
Come funzione di sicurezza, il software Cisco IOS separa l’accesso alla gestione nelle seguenti due modalità di comando:
Modalità EXEC utente: questa modalità ha capacità limitate ma è utile per le operazioni di base. Consente solo un numero limitato di comandi di monitoraggio di base ma non consente l’esecuzione di comandi che potrebbero modificare la configurazione del dispositivo. La modalità EXEC dell’utente è identificata dal prompt CLI che termina con il simbolo >.
Modalità EXEC con privilegi: per eseguire i comandi di configurazione, un amministratore di rete deve accedere alla modalità EXEC con privilegi. Le modalità di configurazione superiori, come la modalità di configurazione globale, possono essere raggiunte solo dalla modalità EXEC privilegiata. La modalità EXEC privilegiata può essere identificata dal prompt che termina con il simbolo #.
La tabella riassume le due modalità e visualizza i prompt CLI predefiniti di uno switch e router Cisco.
Una nota sulle attività di verifica della sintassi
Quando stai imparando a modificare le configurazioni dei dispositivi, potresti voler iniziare in un ambiente sicuro e non di produzione prima di provarlo su apparecchiature reali. Esistono diversi strumenti di simulazione per aiutarti a sviluppare le tue capacità di configurazione e risoluzione dei problemi. Poiché si tratta di strumenti di simulazione, in genere non dispongono di tutte le funzionalità delle apparecchiature reali. Uno di questi strumenti è il Controllo sintassi. In ogni Syntax Checker, ti viene data una serie di istruzioni per inserire una serie specifica di comandi. Non è possibile avanzare in Syntax Checker a meno che non venga immesso il comando esatto e completo come specificato. Strumenti di simulazione più avanzati, come Packet Tracer, ti consentono di inserire comandi abbreviati, proprio come faresti su apparecchiature reali.
Controllo sintassi – Navigazione tra le modalità IOS
Utilizzare l’attività Controllo sintassi per navigare tra le righe di comando IOS su uno switch.
Enter privileged EXEC mode using the enable command.
Switch>enable
Return to user EXEC mode using the disable command.
Switch#disable
Re-enter privileged EXEC mode.
Switch>enable
Enter global configuration mode using the configure terminal command.
Switch#configure terminal
Exit global configuration mode and return to privileged EXEC mode using the exit command.
Switch(config)#exit
Re-enter global configuration mode.
Switch#configure terminal
Enter line subconfiguration mode for the console port using the line console 0 command.
Switch(config)#line console 0
Return to global configuration mode using the exit command.
Switch(config-line)#exit
Enter VTY line subconfiguration mode using the line vty 0 15 command.
Switch(config)#line vty 0 15
Return to global configuration mode.
Switch(config-line)#exit
Enter the VLAN 1 interface subconfiguration mode using the interface vlan 1 command.
Switch(config)#interface vlan 1
From interface configuration mode, switch to line console subconfiguration mode using the line console 0 global configuration command.
Switch(config-if)#line console 0
Return to privileged EXEC mode using the end command.
Switch(config-line)#end
You successfully navigated between the various IOS command line modes.
La struttura di comando
Struttura dei comandi IOS di base
Un amministratore di rete deve conoscere la struttura dei comandi IOS di base per poter utilizzare la CLI per la configurazione del dispositivo.
Un dispositivo Cisco IOS supporta molti comandi. Ogni comando IOS ha un formato specifico, o sintassi, e può essere eseguito solo nella modalità appropriata. La sintassi generale per un comando, mostrata nella figura, è il comando seguito da eventuali parole chiave e argomenti appropriati.
Parola chiave – Questo è un parametro specifico definito nel sistema operativo (nella figura, protocolli ip).
Argomento – Questo non è predefinito; è un valore o una variabile definita dall’utente (nella figura, 192.168.10.5).
Dopo aver immesso ogni comando completo, comprese eventuali parole chiave e argomenti, premere il tasto Invio per inviare il comando all’interprete dei comandi.
Sintassi dei comandi IOS
Un comando potrebbe richiedere uno o più argomenti. Per determinare le parole chiave e gli argomenti richiesti per un comando, fare riferimento alla sintassi del comando. La sintassi fornisce il modello, o formato, che deve essere utilizzato quando si immette un comando.
Come identificato nella tabella, il testo in grassetto indica i comandi e le parole chiave immessi come mostrato. Il testo in corsivo indica un argomento per il quale l’utente fornisce il valore.
Ad esempio, la sintassi per l’utilizzo del comando description è descriptionstring. L’argomento è un valore stringa fornito dall’utente. Il comando description viene in genere utilizzato per identificare lo scopo di un’interfaccia. Ad esempio, immettendo il comando description Connects to the main headquarter office switch, descrive dove si trova l’altro dispositivo alla fine della connessione.
I seguenti esempi dimostrano le convenzioni utilizzate per documentare e utilizzare i comandi IOS:
pingip-address – Il comando è ping e l’argomento definito dall’utente di indirizzo-ip è l’indirizzo IP del dispositivo di destinazione. Ad esempio, ping 10.10.10.5.
tracerouteip-address – Il comando è traceroute e l’argomento definito dall’utente di ip-address è l’indirizzo IP del dispositivo di destinazione. Ad esempio, traceroute 192.168.254.254.
Se un comando è complesso con più argomenti, potresti vederlo rappresentato in questo modo:
Il comando sarà in genere seguito da una descrizione dettagliata del comando e da ciascun argomento nel Cisco IOS Command Reference.
Il Cisco IOS Command Reference è l’ultima fonte di informazioni per un particolare comando IOS.
Tasti di scelta rapida e scorciatoie
La CLI IOS fornisce tasti di scelta rapida e scorciatoie che semplificano la configurazione, il monitoraggio e la risoluzione dei problemi.
I comandi e le parole chiave possono essere abbreviati al numero minimo di caratteri che identificano una selezione univoca. Ad esempio, il comando configure può essere abbreviato in conf perché configure è l’unico comando che inizia con conf. Una versione ancora più breve, con, non funzionerà perché più di un comando inizia con con. Le parole chiave possono anche essere abbreviate.
La tabella elenca le sequenze di tasti per migliorare la modifica della riga di comando.
Nota: mentre il tasto Delete in genere elimina il carattere a destra del prompt, la struttura dei comandi IOS non riconosce il tasto Delete.
Quando l’output di un comando produce più testo di quello che può essere visualizzato in una finestra di terminale, l’IOS visualizzerà un prompt “–More–”. La tabella seguente descrive le sequenze di tasti che possono essere utilizzate quando viene visualizzato questo prompt.
Questa tabella elenca i comandi utilizzati per uscire da un’operazione.
View Device Information
Cisco IOS Show Commands
Cisco IOS fornisce comandi per verificare il funzionamento delle interfacce router e switch.
I comandi show della CLI di Cisco IOS visualizzano informazioni rilevanti sulla configurazione e il funzionamento del dispositivo. I tecnici di rete utilizzano ampiamente i comandi show per visualizzare i file di configurazione, controllare lo stato delle interfacce e dei processi del dispositivo e verificare lo stato operativo del dispositivo. Lo stato di quasi ogni processo o funzione del router può essere visualizzato utilizzando un comando show.
I comandi show comunemente usati e quando usarli sono elencati nella tabella.
show running-config
Verifica la configurazione e le impostazioni correnti.
show interfaces
Verifica lo stato dell’interfaccia e visualizza eventuali messaggi di errore.
show ip interface
Verifica le informazioni di livello 3 di un’interfaccia.
show arp
Verifica l’elenco degli host conosciuti sulla LAN Ethernet locale.
show ip route
Verifica le informazioni di instradamento di livello 3.
show protocols
Verifica quali protocolli sono operativi.
show version
Verifica la memoria, le interfacce e le licenze del dispositivo.
The Cisco IOS Command Line – Riepilogo
Navigate the IOS
La CLI di Cisco IOS è un programma basato su testo che consente di immettere ed eseguire i comandi di Cisco IOS per configurare, monitorare e gestire i dispositivi Cisco. L’interfaccia a riga di comando di Cisco può essere utilizzata con attività di gestione in banda o fuori banda.
I comandi CLI vengono utilizzati per modificare la configurazione del dispositivo e per visualizzare lo stato corrente dei processi sul router. Quando il router ha completato la sequenza di accensione e viene visualizzato il prompt Router>, è possibile utilizzare la CLI per immettere i comandi Cisco IOS.
Come funzione di sicurezza, il software Cisco IOS separa l’accesso alla gestione nelle seguenti due modalità di comando:
Modalità EXEC utente: questa modalità è utile per le operazioni di base. Consente un numero limitato di comandi di monitoraggio di base ma non consente l’esecuzione di comandi che potrebbero modificare la configurazione del dispositivo. La modalità EXEC dell’utente è identificata dal prompt CLI che termina con il simbolo >.
Modalità EXEC con privilegi: per eseguire i comandi di configurazione, un amministratore di rete deve accedere alla modalità EXEC con privilegi. La modalità EXEC privilegiata può essere identificata dal prompt che termina con il simbolo #. Le modalità di configurazione superiori, come la global configuration mode, possono essere raggiunte solo dalla modalità EXEC privilegiata. La modalità di configurazione globale è identificata dal prompt della CLI che termina con (config)#.
I comandi utilizzati per navigare tra le diverse modalità di comando IOS sono:
enable
disable
configure terminal
exit
end
Ctrl+Z
line console 0
line vty 0 15
interface vlan 1
The Command Structure
Ogni comando IOS ha un formato specifico, o sintassi, e può essere eseguito solo nella modalità appropriata. La sintassi generale per un comando è il comando seguito da eventuali parole chiave e argomenti appropriati. La parola chiave è un parametro specifico definito nel sistema operativo. L’argomento non è predefinito; è un valore o una variabile definita dall’utente.
La sintassi fornisce il modello, o formato, che deve essere utilizzato quando si immette un comando. Il testo in grassetto indica i comandi e le parole chiave immessi come mostrato.
Il testo in corsivo indica un argomento per il quale l’utente fornisce il valore.
Le parentesi quadre [x] indicano un elemento facoltativo (parola chiave o argomento).
Le parentesi graffe {x} indicano un elemento obbligatorio (parola chiave o argomento).
Build a Small Cisco Network
Basic Switch Configuration
Allo switch Cisco devono essere assegnate solo le informazioni di sicurezza di base prima di essere connesso alla rete. Gli elementi solitamente configurati su uno switch LAN includono: nome host, informazioni sull’indirizzo IP di gestione, password e informazioni descrittive.
Il nome host dello switch è il nome configurato del dispositivo. Proprio come a ogni computer o stampante viene assegnato un nome, le apparecchiature di rete devono essere configurate con un nome descrittivo. È utile se il nome del dispositivo include la posizione in cui verrà installato lo switch. Un esempio potrebbe essere: SW_Bldg_R-Room_216.
Un indirizzo IP di gestione è necessario solo se si prevede di configurare e gestire lo switch tramite una connessione in banda sulla rete. Un indirizzo di gestione consente di raggiungere il dispositivo tramite client Telnet, SSH o HTTP. Le informazioni sull’indirizzo IP che devono essere configurate su uno switch sono essenzialmente le stesse configurate su un PC: indirizzo IP, subnet mask e gateway predefinito.
Per rendere sicuro uno switch LAN Cisco, è necessario configurare le password su ciascuno dei vari metodi di accesso alla riga di comando. I requisiti minimi includono l’assegnazione di password ai metodi di accesso remoto, come Telnet, SSH e la connessione alla console. È inoltre necessario assegnare una password alla modalità privilegiata in cui è possibile apportare modifiche alla configurazione.
Nota: Telnet invia il nome utente e la password in chiaro e non è considerato sicuro. SSH crittografa il nome utente e la password ed è, quindi, un metodo più sicuro.
Configuration Tasks
Prima di configurare uno switch, rivedere le seguenti attività iniziali di configurazione dello switch:
Configura il nome del dispositivo:
hostnamename
Secure user EXEC mode:
line console 0
passwordpassword
login
Secure remote Telnet / SSH access:
line vty 0 15
passwordpassword
login
Secure privileged EXEC mode:
enable secretpassword
Proteggi tutte le password nel file di configurazione:
service password-encryption
Fornire notifica legale:
banner motddelimiter message delimiter
Configurare l’SVI di gestione:
interface vlan 1
ip addressip-address subnet-mask
no shutdown
Salva la configurazione:
copy running-config startup-config
Sample Switch Configuration
Cambiare la configurazione dell’interfaccia virtuale
Per accedere allo switch in remoto, è necessario configurare un indirizzo IP e una subnet mask sull’interfaccia virtuale dello switch (SVI). Per configurare un SVI su uno switch, utilizzare il comando interface vlan 1 global configuration. Vlan 1 non è un’interfaccia fisica reale ma virtuale. Successivamente, assegnare un indirizzo IPv4 utilizzando il comando di configurazione dell’interfaccia ip addressip-address subnet-mask. Infine, abilita l’interfaccia virtuale utilizzando il comando di configurazione dell’interfaccia no shutdown.
Dopo che lo switch è stato configurato con questi comandi, lo switch dispone di tutti gli elementi IPv4 pronti per la comunicazione sulla rete locale.
Nota: analogamente agli host Windows, anche gli switch configurati con un indirizzo IPv4 in genere devono disporre di un gateway predefinito assegnato. Questo può essere fatto usando il comando di configurazione globale ip default-gatewayip-address. Il parametro ip-address sarebbe l’indirizzo IPv4 del router locale sulla rete, come mostrato nell’esempio. Tuttavia, in questo argomento configurerai solo una rete con switch e host. I router verranno configurati successivamente.
Configurare le impostazioni iniziali del router
Le seguenti attività devono essere completate durante la configurazione delle impostazioni iniziali su un router.
Step 1. Configurare il nome del dispositivo.
Step 2. Secure privileged EXEC mode.
Step 3. Secure user EXEC mode.
Step 4. Secure remote Telnet / SSH access.
Step 5. Secure all passwords in the config file.
Step 6. Provide legal notification.
Step 7. Save the configuration.
Esempio di configurazione di base del router
In questo esempio, il router R1 verrà configurato con le impostazioni iniziali. Per configurare il nome del dispositivo per R1, utilizzare i seguenti comandi.
Nota: notare come il prompt del router ora visualizza il nome host del router.
Tutti gli accessi al router devono essere protetti. La modalità EXEC privilegiata fornisce all’utente l’accesso completo al dispositivo e alla relativa configurazione, pertanto è necessario proteggerlo.
I seguenti comandi proteggono la modalità EXEC con privilegi e la modalità EXEC dell’utente, abilitano l’accesso remoto Telnet e SSH e crittografano tutte le password in testo normale (ad esempio, l’EXEC dell’utente e la linea vty). È molto importante utilizzare una password complessa quando si protegge la modalità EXEC privilegiata perché questa modalità consente l’accesso alla configurazione del dispositivo.
L’avviso legale avverte gli utenti che il dispositivo dovrebbe essere accessibile solo agli utenti autorizzati. La notifica legale è configurata come segue:
Se il router dovesse essere configurato con i comandi precedenti e perdesse accidentalmente l’alimentazione, la configurazione del router andrebbe persa. Per questo motivo è importante salvare la configurazione quando vengono implementate le modifiche. Il seguente comando salva la configurazione nella NVRAM:
Enter global configuration mode to configure the name of the router as “R1”.
Router>enable
Router#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Router(config)#hostname R1
Configure ’class’ as the secret password.
R1(config)#enable secret class
Configure ’cisco’ as the console line password, require users to login, and return to global configuration mode.
R1(config)#line console 0
R1(config-line)#password cisco
R1(config-line)#login
R1(config-line)#exit
For vty lines 0 through 4, configure ’cisco’ as the password, require users to login, enable SSH and Telnet access, and return to global configuration mode.
R1(config)#line vty 0 4
R1(config-line)#password cisco
R1(config-line)#login
R1(config-line)#transport input ssh telnet
R1(config-line)#exit
Encrypt all clear text passwords.
R1(config)#service password-encryption
Enter the banner ’Authorized Access Only!’ and use # as the delimiting character.
R1(config)#banner motd #Authorized Access Only!#
Exit global configuration mode.
R1(config)#exit
R1#
You have successfully configured the initial settings on router R1.
Mettere in sicurezza i dispositivi
Suggerimenti per la password
Per proteggere i dispositivi di rete, è importante utilizzare password complesse. Ecco le linee guida standard da seguire:
Utilizzare una password lunga almeno otto caratteri, preferibilmente 10 o più caratteri. Una password più lunga è una password più sicura.
Rendi le password complesse. Includere un mix di lettere maiuscole e minuscole, numeri, simboli e spazi, se consentito.
Evita password basate sulla ripetizione, parole comuni del dizionario, sequenze di lettere o numeri, nomi utente, nomi di parenti o animali domestici, informazioni biografiche, come date di nascita, numeri ID, nomi di antenati o altre informazioni facilmente identificabili.
Digitare deliberatamente una password in modo errato. Ad esempio, Smith = Smyth = 5mYth o Security = 5ecur1ty.
Cambia spesso le password. Se una password viene inconsapevolmente compromessa, la finestra di opportunità per l’autore della minaccia di utilizzare la password è limitata.
Non annotare le password e lasciarle in luoghi ovvi come sulla scrivania o sul monitor.
Le tabelle mostrano esempi di password complesse e deboli.
Sui router Cisco, gli spazi iniziali vengono ignorati per le password, ma gli spazi dopo il primo carattere no. Pertanto, un metodo per creare una password complessa consiste nell’usare la barra spaziatrice e creare una frase composta da molte parole. Questa è chiamata passphrase. Una passphrase è spesso più facile da ricordare di una semplice password. È anche più lungo e più difficile da indovinare.
Accesso remoto sicuro
Esistono diversi modi per accedere a un dispositivo per eseguire attività di configurazione. Uno di questi modi consiste nell’utilizzare un PC collegato alla porta della console sul dispositivo. Questo tipo di connessione viene spesso utilizzato per la configurazione iniziale del dispositivo.
L’impostazione di una password per l’accesso alla connessione della console viene eseguita in modalità di configurazione globale. Questi comandi impediscono agli utenti non autorizzati di accedere alla modalità utente dalla porta della console.
Quando il dispositivo è connesso alla rete, è possibile accedervi tramite la connessione di rete tramite SSH o Telnet. SSH è il metodo preferito perché è più sicuro. Quando si accede al dispositivo tramite la rete, viene considerata una connessione vty. La password deve essere assegnata alla porta vty. La seguente configurazione viene utilizzata per abilitare l’accesso SSH allo switch.
Un esempio di configurazione è mostrato nella finestra di comando.
Per impostazione predefinita, molti switch Cisco supportano fino a 16 linee vty numerate da 0 a 15. Il numero di linee vty supportate su un router Cisco varia in base al tipo di router e alla versione IOS. Tuttavia, cinque è il numero più comune di linee vty configurate su un router. Queste linee sono numerate da 0 a 4 per impostazione predefinita, anche se è possibile configurare linee aggiuntive. È necessario impostare una password per tutte le linee vty disponibili. La stessa password può essere impostata per tutte le connessioni.
Per verificare che le password siano impostate correttamente, utilizzare il comando show running-config. Queste password sono memorizzate nella configurazione in esecuzione in testo normale. È possibile impostare la crittografia su tutte le password memorizzate all’interno del router in modo che non vengano lette facilmente da persone non autorizzate. Il comando di configurazione globale service password-encryption assicura che tutte le password siano crittografate.
Con l’accesso remoto protetto sullo switch, ora puoi configurare SSH.
Abilita SSH
Prima di configurare SSH, lo switch deve essere configurato minimamente con un nome host univoco e le impostazioni di connettività di rete corrette.
Step 1. Verificare il supporto SSH.
Utilizzare il comando show ip ssh per verificare che lo switch supporti SSH. Se lo switch non esegue un IOS che supporta le funzionalità crittografiche, questo comando non viene riconosciuto.
Step 2. Configurare il dominio IP.
Configurare il nome di dominio IP della rete utilizzando il comando ip domain-namedomain-name global configuration mode. Nella configurazione di esempio riportata di seguito, il valore del domain-name è cisco.com.
Step 3. Genera coppie di chiavi RSA.
Non tutte le versioni dell’IOS sono predefinite per SSH versione 2 e SSH versione 1 presenta difetti di sicurezza noti. Per configurare SSH versione 2, eseguire il comando ip ssh version 2 global configuration mode. La generazione di una coppia di chiavi RSA abilita automaticamente SSH. Utilizzare il comando crypto key generate rsa global configuration mode per abilitare il server SSH sullo switch e generare una coppia di chiavi RSA. Durante la generazione delle chiavi RSA, all’amministratore viene richiesto di inserire una lunghezza del modulo. La configurazione di esempio nella figura utilizza una dimensione del modulo di 1.024 bit. Una lunghezza del modulo maggiore è più sicura, ma richiede più tempo per la generazione e l’utilizzo.
Nota: per eliminare la coppia di chiavi RSA, utilizzare il comando crypto key zeroize rsa global configuration mode. Dopo l’eliminazione della coppia di chiavi RSA, il server SSH viene disabilitato automaticamente.
Step 4. Configurare l’autenticazione utente.
Il server SSH può autenticare gli utenti localmente o utilizzare un server di autenticazione. Per utilizzare il metodo di autenticazione locale, creare una coppia nome utente e password con il comando usernameusernamesecretpassword global configuration mode. Nell’esempio, all’utente admin viene assegnata la password ccna.
Step 5. Configurare le linee vty.
Abilitare il protocollo SSH sulle linee vty utilizzando il comando transport input ssh line configuration mode. Catalyst 2960 ha linee vty che vanno da 0 a 15. Questa configurazione impedisce le connessioni non SSH (come Telnet) e limita lo switch ad accettare solo connessioni SSH. Utilizzare il comando line vty global configuration mode e quindi il comando login local line configuration mode per richiedere l’autenticazione locale per le connessioni SSH dal database dei nomi utente locale.
Step 6. Abilita SSH versione 2.
Per impostazione predefinita, SSH supporta entrambe le versioni 1 e 2. Quando si supportano entrambe le versioni, nell’output di show ip ssh viene visualizzato come supporto della versione 1.99. La versione 1 presenta vulnerabilità note. Per questo motivo, si consiglia di abilitare solo la versione 2. Abilitare la versione SSH utilizzando il comando di configurazione globale ip ssh version 2.
Controllo sintassi – Configura SSH
Utilizzare questo controllo sintassi per configurare SSH sullo switch S1
Set the domain name to cisco.com and generate the 1024 bit rsa key.
S1(config)#ip domain-name cisco.com
S1(config)#crypto key generate rsa
The name for the keys will be: S1.cisco.com
Choose the size of the key modulus in the range of 360 to 4096 for your General Purpose Keys. Choosing a key modulus greater than 512 may take a few minutes.
How many bits in the modulus [512]:1024
% Generating 1024 bit RSA keys, keys will be non-exportable...
[OK] (elapsed time was 4 seconds)
S1(config)#
*Mar 1 02:20:18.529: %SSH-5-ENABLED: SSH 1.99 has been enabled
Create a local user admin with the password ccna. Set all vty lines to use ssh and local login for remote connections. Exit out to global configuration mode.
S1(config)#username admin secret ccna
S1(config)#line vty 0 15
S1(config-line)#transport input ssh
S1(config-line)#login local
S1(config-line)#exit
S1(config)#
%SYS-5-CONFIG_I: Configured from console by console
Configure S1 to use SSH 2.0.
S1(config)#ip ssh version 2
S1(config)#
You successfully configured SSH on all VTY lines.
Verificare SSH
Su un PC, un client SSH come PuTTY viene utilizzato per connettersi a un server SSH. Per gli esempi sono stati configurati:
Nella figura, il tecnico sta avviando una connessione SSH all’indirizzo IPv4 della VLAN SVI di S1. Viene visualizzato il software del terminale PuTTY.
Dopo aver fatto clic su Apri in PuTTY, all’utente viene richiesto un nome utente e una password. Utilizzando la configurazione dell’esempio precedente, vengono immessi il nome utente admin e la password ccna. Dopo aver immesso la combinazione corretta, l’utente è connesso tramite SSH alla CLI sullo switch Catalyst 2960.
Per visualizzare i dati di versione e configurazione per SSH sul dispositivo configurato come server SSH, utilizzare il comando show ip ssh. Nell’esempio, SSH versione 2 è abilitato. Per verificare le connessioni SSH al dispositivo, utilizzare il comando show ssh.
Configurare il gateway predefinito
Gateway predefinito su un host
Se la tua rete locale ha un solo router, sarà il router del gateway e tutti gli host e gli switch sulla tua rete devono essere configurati con queste informazioni. Se la tua rete locale ha più router, devi selezionarne uno come router gateway predefinito. Questo argomento spiega come configurare il gateway predefinito su host e switch.
Affinché un dispositivo finale possa comunicare sulla rete, deve essere configurato con le informazioni sull’indirizzo IP corrette, incluso l’indirizzo del gateway predefinito. Il gateway predefinito viene utilizzato solo quando l’host desidera inviare un pacchetto a un dispositivo su un’altra rete. L’indirizzo del gateway predefinito è in genere l’indirizzo dell’interfaccia del router collegato alla rete locale dell’host. L’indirizzo IP del dispositivo host e l’indirizzo dell’interfaccia del router devono trovarsi nella stessa rete.
Ad esempio, si supponga una topologia di rete IPv4 costituita da un router che interconnette due LAN separate. G0/0/0 è connesso alla rete 192.168.10.0, mentre G0/0/1 è connesso alla rete 192.168.11.0. Ciascun dispositivo host è configurato con l’indirizzo gateway predefinito appropriato.
In questo esempio, se PC1 invia un pacchetto a PC2, il gateway predefinito non viene utilizzato. Invece, PC1 indirizza il pacchetto con l’indirizzo IPv4 di PC2 e inoltra il pacchetto direttamente a PC2 attraverso lo switch.
Cosa succede se PC1 ha inviato un pacchetto a PC3? PC1 indirizzerebbe il pacchetto con l’indirizzo IPv4 di PC3, ma inoltrerebbe il pacchetto al suo gateway predefinito, che è l’interfaccia G0/0/0 di R1. Il router accetta il pacchetto e accede alla sua tabella di instradamento per determinare che G0/0/1 è l’interfaccia di uscita appropriata in base all’indirizzo di destinazione. R1 quindi inoltra il pacchetto fuori dall’interfaccia appropriata per raggiungere PC3.
Lo stesso processo si verificherebbe su una rete IPv6, sebbene ciò non sia mostrato nella topologia. I dispositivi userebbero l’indirizzo IPv6 del router locale come gateway predefinito.
Gateway predefinito su uno switch
Uno switch che interconnette i computer client è in genere un dispositivo di livello 2. Pertanto, uno switch di livello 2 non richiede un indirizzo IP per funzionare correttamente. Tuttavia, è possibile configurare una configurazione IP su uno switch per fornire a un amministratore l’accesso remoto allo switch.
Per connettersi e gestire uno switch su una rete IP locale, deve disporre di un’interfaccia virtuale dello switch (SVI) configurata. L’SVI è configurata con un indirizzo IPv4 e una subnet mask sulla LAN locale. Lo switch deve inoltre disporre di un indirizzo gateway predefinito configurato per gestire in remoto lo switch da un’altra rete.
L’indirizzo del gateway predefinito è in genere configurato su tutti i dispositivi che comunicheranno oltre la loro rete locale.
Per configurare un gateway predefinito IPv4 su uno switch, utilizzare il comando di configurazione globale ip default-gatewayip-address. L’indirizzo IP configurato è l’indirizzo IPv4 dell’interfaccia del router locale connesso allo switch.
La figura mostra un amministratore che stabilisce una connessione remota per commutare S1 su un’altra rete.
In questo esempio, l’host amministratore utilizzerà il proprio gateway predefinito per inviare il pacchetto all’interfaccia G0/0/1 di R1. R1 inoltrerebbe il pacchetto a S1 dalla sua interfaccia G0/0/0. Poiché l’indirizzo IPv4 di origine del pacchetto proveniva da un’altra rete, S1 richiederebbe un gateway predefinito per inoltrare il pacchetto all’interfaccia G0/0/0 di R1. Pertanto, S1 deve essere configurato con un gateway predefinito per poter rispondere e stabilire una connessione SSH con l’host amministrativo.
Nota: i pacchetti originati dai computer host collegati allo switch devono già avere l’indirizzo del gateway predefinito configurato sui rispettivi sistemi operativi del computer host.
Uno switch per gruppi di lavoro può anche essere configurato con un indirizzo IPv6 su un SVI. Tuttavia, lo switch non richiede la configurazione manuale dell’indirizzo IPv6 del gateway predefinito. Lo switch riceverà automaticamente il gateway predefinito dal messaggio ICMPv6 Router Advertisement inviato dal router.
Controllo sintassi – Configurare il gateway predefinito
Utilizzare questo correttore di sintassi per esercitarsi nella configurazione del gateway predefinito di uno switch di livello 2.
Enter global configuration mode.
S1#configure terminal
Enter configuration commands, one per line. End with CNTL/Z.
Configure 192.168.10.1 as the default gateway for S1.
S1(config)#ip default-gateway 192.168.10.1
S1(config)#
You have successfully set the default gateway on switch S1.
Costruire una piccola rete Cisco – Riepilogo
Basic Switch Configuration
Gli elementi da configurare su uno switch LAN includono nome host, informazioni sull’indirizzo IP di gestione, password e informazioni descrittive. Un indirizzo di gestione consente di raggiungere il dispositivo tramite client Telnet, SSH o HTTP. Le informazioni sull’indirizzo IP che devono essere configurate su uno switch includono l’indirizzo IP, la subnet mask e il gateway predefinito. Per proteggere uno switch LAN Cisco, configurare le password su ciascuno dei vari metodi di accesso alla riga di comando. Assegna le password ai metodi di accesso remoto, come Telnet, SSH e la connessione alla console. Assegnare anche una password alla modalità privilegiata in cui è possibile apportare modifiche alla configurazione.
Per accedere allo switch in remoto, configurare un indirizzo IP e una subnet mask su SVI. Utilizzare il comando di configurazione globale interface vlan 1. Assegnare un indirizzo IPv4 utilizzando il comando di configurazione dell’interfaccia ip addressip-address subnet-mask. Infine, abilita l’interfaccia virtuale utilizzando il comando di configurazione dell’interfaccia no shutdown. Dopo che lo switch è stato configurato con questi comandi, lo switch dispone di tutti gli elementi IPv4 pronti per la comunicazione sulla rete.
Step 5. Proteggi tutte le password nel file di configurazione.
Step 6. Fornire notifica legale.
Step 7. Salva la configurazione.
Tutti gli accessi al router devono essere protetti. La modalità EXEC privilegiata fornisce all’utente l’accesso completo al dispositivo e alla relativa configurazione, pertanto è necessario proteggerlo. È molto importante utilizzare una password complessa quando si protegge la modalità EXEC privilegiata perché questa modalità consente l’accesso alla configurazione del dispositivo. L’avviso legale avverte gli utenti che il dispositivo dovrebbe essere accessibile solo agli utenti autorizzati. La configurazione del router andrebbe persa se il router perdesse l’alimentazione. Per questo motivo è importante salvare la configurazione quando vengono implementate le modifiche.
Secure the Devices
Per proteggere i dispositivi di rete, è importante utilizzare password complesse. Una password complessa combina caratteri alfanumerici e, se consentito, include simboli e uno spazio. Un altro metodo per creare una password complessa consiste nell’usare la barra spaziatrice e creare una frase composta da molte parole, chiamata passphrase. Una passphrase è spesso più facile da ricordare rispetto a una password sicura. È anche più lungo e più difficile da indovinare.
L’impostazione di una password per l’accesso alla connessione della console viene eseguita in modalità di configurazione globale. Ciò impedisce agli utenti non autorizzati di accedere alla modalità utente dalla porta della console. Quando il dispositivo è connesso alla rete, è possibile accedervi tramite la connessione di rete tramite SSH o Telnet. SSH è il metodo preferito perché è più sicuro. Quando si accede al dispositivo tramite la rete, viene considerata una connessione vty. La password deve essere assegnata alla porta vty. Cinque è il numero più comune di linee vty configurate su un router. Queste linee sono numerate da 0 a 4 per impostazione predefinita, anche se è possibile configurare linee aggiuntive. È necessario impostare una password per tutte le linee vty disponibili. La stessa password può essere impostata per tutte le connessioni.
Per verificare che le password siano impostate correttamente, utilizzare il comando show running-config. Queste password sono memorizzate nella configurazione in esecuzione in testo normale. È possibile impostare la crittografia su tutte le password memorizzate all’interno del router. Il comando di configurazione globale service password-encryption assicura che tutte le password siano crittografate.
To enable SSH
Step 1. Verifica il supporto SSH: show ip ssh
Step 2. Configurare il dominio IP: ip domain-namedomain-name
Step 3. Genera coppie di chiavi RSA: crypto key generate rsa
Per visualizzare i dati di versione e configurazione per SSH sul dispositivo configurato come server SSH, utilizzare il comando show ip ssh. Nell’esempio, SSH versione 2 è abilitato. Per verificare le connessioni SSH al dispositivo, utilizzare il comando show ssh.
Configure the Default Gateway
Se la tua rete locale ha un solo router, sarà il router del gateway e tutti gli host e gli switch sulla tua rete devono essere configurati con queste informazioni. Se la tua rete locale ha più router, devi selezionarne uno come router gateway predefinito. Il gateway predefinito viene utilizzato solo quando l’host desidera inviare un pacchetto a un dispositivo su un’altra rete. L’indirizzo del gateway predefinito è in genere l’indirizzo dell’interfaccia del router collegato alla rete locale dell’host. L’indirizzo IP del dispositivo host e l’indirizzo dell’interfaccia del router devono trovarsi nella stessa rete.Per connettersi e gestire uno switch su una rete IP locale, deve disporre di un SVI configurato. L’SVI è configurato con un indirizzo IPv4 e una subnet mask sulla LAN locale. Lo switch deve inoltre disporre di un indirizzo gateway predefinito configurato per gestire in remoto lo switch da un’altra rete. Per configurare un gateway predefinito IPv4 su uno switch, utilizzare il comando di configurazione globale ip default-gatewayip-address. L’indirizzo IP configurato è l’indirizzo IPv4 dell’interfaccia del router locale connesso allo switch.
ICMP
Messaggi ICMP
Messaggi ICMPv4 e ICMPv6
Sebbene IP sia solo un protocollo best-effort, la suite TCP/IP fornisce messaggi di errore e messaggi informativi durante la comunicazione con un altro dispositivo IP. Questi messaggi vengono inviati utilizzando i servizi di ICMP. Lo scopo di questi messaggi è fornire feedback su problemi relativi all’elaborazione dei pacchetti IP in determinate condizioni, non rendere affidabile l’IP. I messaggi ICMP non sono richiesti e spesso non sono consentiti all’interno di una rete per motivi di sicurezza.
ICMP è disponibile sia per IPv4 che per IPv6. ICMPv4 è il protocollo di messaggistica per IPv4. ICMPv6 fornisce gli stessi servizi per IPv6 ma include funzionalità aggiuntive. In questo corso verrà utilizzato il termine ICMP in riferimento sia a ICMPv4 che a ICMPv6.
I tipi di messaggi ICMP e i motivi per cui vengono inviati sono numerosi. I messaggi ICMP comuni a ICMPv4 e ICMPv6 e discussi in questo modulo includono:
Raggiungibilità dell’host
Destinazione o servizio irraggiungibile
Tempo superato
Raggiungibilità dell’host
Un messaggio ICMP Echo può essere utilizzato per testare la raggiungibilità di un host su una rete IP. L’host locale invia una richiesta Echo ICMP a un host. Se l’host è disponibile, l’host di destinazione risponde con una risposta Echo. Questo utilizzo dei messaggi ICMP Echo è alla base dell’utilità ping.
Destinazione o servizio non raggiungibile
Quando un host o un gateway riceve un pacchetto che non può consegnare, può utilizzare un messaggio ICMP Destination Unreachable per notificare all’origine che la destinazione o il servizio non è raggiungibile. Il messaggio includerà un codice che indica il motivo per cui non è stato possibile consegnare il pacchetto.
Alcuni dei codici Destination Unreachable per ICMPv4 sono i seguenti:
0 – Net unreachable
1 – Host unreachable
2 – Protocol unreachable
3 – Port unreachable
Alcuni dei codici Destination Unreachable per ICMPv6 sono i seguenti:
0 – No route to destination
1 – Communication with the destination is administratively prohibited (e.g., firewall)
2 – Beyond scope of the source address
3 – Address unreachable
4 – Port unreachable
Nota: ICMPv6 ha codici simili ma leggermente diversi per i messaggi Destination Unreachable.
Tempo scaduto
Un messaggio ICMPv4 Time Exceeded viene utilizzato da un router per indicare che un pacchetto non può essere inoltrato perché il campo TTL (Time to Live) del pacchetto è stato decrementato a 0. Se un router riceve un pacchetto e diminuisce il campo TTL nel pacchetto IPv4 a zero, scarta il pacchetto e invia un messaggio Time Exceeded all’host di origine.
ICMPv6 invia anche un messaggio Time Exceeded se il router non può inoltrare un pacchetto IPv6 perché il pacchetto è scaduto. Invece del campo IPv4 TTL, ICMPv6 utilizza il campo IPv6 Hop Limit per determinare se il pacchetto è scaduto.
Nota: i messaggi Time Exceeded vengono utilizzati dallo strumento traceroute.
Messaggi ICMPv6
I messaggi informativi e di errore trovati in ICMPv6 sono molto simili ai messaggi di controllo e di errore implementati da ICMPv4. Tuttavia, ICMPv6 ha nuove caratteristiche e funzionalità migliorate che non si trovano in ICMPv4. I messaggi ICMPv6 sono incapsulati in IPv6.
ICMPv6 include quattro nuovi protocolli come parte del Neighbor Discovery Protocol (ND o NDP).
La messaggistica tra un router IPv6 e un dispositivo IPv6, inclusa l’allocazione dinamica degli indirizzi, è la seguente:
Messaggio di sollecitazione del router (RS) – Router Solicitation (RS) message
Messaggio di annuncio del router (RA) – Router Advertisement (RA) message
La messaggistica tra dispositivi IPv6, inclusi il rilevamento di indirizzi duplicati e la risoluzione degli indirizzi, è la seguente:
Messaggio di sollecitazione del vicino (NS) – Neighbor Solicitation (NS) message
Messaggio di annuncio del vicino (NA) – Neighbor Advertisement (NA) message
Nota: ICMPv6 ND include anche il messaggio di reindirizzamento, che ha una funzione simile al messaggio di reindirizzamento utilizzato in ICMPv4.
RA message
I messaggi RA vengono inviati dai router abilitati per IPv6 ogni 200 secondi per fornire informazioni di indirizzamento agli host abilitati per IPv6. Il messaggio RA può includere informazioni di indirizzamento per l’host come il prefisso, la lunghezza del prefisso, l’indirizzo DNS e il nome di dominio. Un host che utilizza la configurazione automatica dell’indirizzo senza stato (SLAAC – Stateless Address Autoconfiguration) imposterà il proprio gateway predefinito sull’indirizzo link-local del router che ha inviato la RA.
R1 invia un messaggio RA, “Ciao a tutti i dispositivi abilitati per IPv6. Sono R1 e puoi utilizzare SLAAC per creare un indirizzo unicast globale IPv6. Il prefisso è 2001:db8:acad:1::/64. A proposito, usa il mio indirizzo link-local fe80::1 come gateway predefinito.”
RS message
Un router abilitato per IPv6 invierà anche un messaggio RA in risposta a un messaggio RS. Nella figura, PC1 invia un messaggio RS per determinare come ricevere dinamicamente le informazioni sull’indirizzo IPv6.
R1 risponde alla RS con un messaggio RA.
PC1 invia un messaggio RS, “Ciao, ho appena avviato. C’è un router IPv6 sulla rete? Ho bisogno di sapere come ottenere dinamicamente le informazioni sull’indirizzo IPv6.”
R1 risponde con un messaggio RA. “Ciao a tutti i dispositivi abilitati per IPv6. Sono R1 e potete usare SLAAC per creare un indirizzo unicast globale IPv6. Il prefisso è 2001:db8:acad:1::/64. A proposito, usate il mio indirizzo link-local fe80::1 come gateway predefinito.”
NS message
Quando a un dispositivo viene assegnato un indirizzo unicast IPv6 globale o unicast link-local, può eseguire il rilevamento di indirizzi duplicati (DAD – duplicate address detection) per garantire che l’indirizzo IPv6 sia univoco. Per verificare l’univocità di un indirizzo, il dispositivo invierà un messaggio NS con il proprio indirizzo IPv6 come indirizzo IPv6 di destinazione, come mostrato nella figura.
Se un altro dispositivo sulla rete ha questo indirizzo, risponderà con un messaggio NA. Questo messaggio NA notificherà al dispositivo di invio che l’indirizzo è in uso. Se un messaggio NA corrispondente non viene restituito entro un certo periodo di tempo, l’indirizzo unicast è univoco e accettabile per l’uso.
Nota: DAD non è richiesto, ma RFC 4861 consiglia di eseguire DAD su indirizzi unicast.
PC1 invia un messaggio NS per verificare l’univocità di un indirizzo, “Chiunque abbia l’indirizzo IPv6 2001:db8:acad:1::10, mi manderà il suo indirizzo MAC?”
Test Ping e Traceroute
Ping – Verifica connettività
Nell’argomento precedente, sono stati presentati gli strumenti ping e traceroute (tracert). In questo argomento, imparerai a conoscere le situazioni in cui viene utilizzato ogni strumento e come utilizzarli. Ping è un’utilità di test IPv4 e IPv6 che utilizza la richiesta echo ICMP e i messaggi di risposta echo per testare la connettività tra gli host.
Per testare la connettività a un altro host su una rete, viene inviata una richiesta echo all’indirizzo host utilizzando il comando ping. Se l’host all’indirizzo specificato riceve la richiesta echo, risponde con una risposta echo. Quando viene ricevuta ogni risposta echo, ping fornisce un feedback sul tempo intercorso tra l’invio della richiesta e la ricezione della risposta. Questa può essere una misura delle prestazioni della rete.
Ping ha un valore di timeout per la risposta. Se non viene ricevuta una risposta entro il timeout, ping fornisce un messaggio che indica che non è stata ricevuta una risposta. Ciò potrebbe indicare che c’è un problema, ma potrebbe anche indicare che le funzionalità di sicurezza che bloccano i messaggi ping sono state abilitate sulla rete. È comune che il primo ping vada in timeout se è necessario eseguire la risoluzione dell’indirizzo (ARP o ND) prima di inviare la richiesta Echo ICMP.
Dopo che tutte le richieste sono state inviate, l’utilità ping fornisce un riepilogo che include la percentuale di successo e il tempo medio di andata e ritorno verso la destinazione.
I tipi di test di connettività eseguiti con ping includono quanto segue:
Ping del loopback locale
Ping del gateway predefinito
Ping dell’host remoto
Eseguire il ping del loopback
Il ping può essere utilizzato per testare la configurazione interna di IPv4 o IPv6 sull’host locale. Per eseguire questo test, eseguire il ping dell’indirizzo di loopback locale di 127.0.0.1 per IPv4 (::1 per IPv6).
Una risposta da 127.0.0.1 per IPv4 o ::1 per IPv6 indica che l’IP è installato correttamente sull’host. Questa risposta viene dal livello di rete. Questa risposta, tuttavia, non indica che gli indirizzi, le maschere o i gateway siano configurati correttamente. Né indica nulla sullo stato del livello inferiore dello stack di rete. Questo verifica semplicemente l’IP attraverso il livello di rete dell’IP. Un messaggio di errore indica che TCP/IP non è operativo sull’host.
Il ping dell’host locale conferma che TCP/IP è installato e funzionante sull’host locale.
Il ping 127.0.0.1 fa sì che un dispositivo esegua il ping da solo.
Eseguire il ping del gateway predefinito
È inoltre possibile utilizzare il ping per testare la capacità di un host di comunicare sulla rete locale. Questo viene generalmente fatto eseguendo il ping dell’indirizzo IP del gateway predefinito dell’host. Un ping riuscito al gateway predefinito indica che l’host e l’interfaccia del router che funge da gateway predefinito sono entrambi operativi sulla rete locale.
Per questo test, viene spesso utilizzato l’indirizzo del gateway predefinito perché il router è normalmente sempre operativo. Se l’indirizzo del gateway predefinito non risponde, è possibile inviare un ping all’indirizzo IP di un altro host sulla rete locale noto per essere operativo.
Se il gateway predefinito o un altro host risponde, l’host locale può comunicare correttamente sulla rete locale. Se il gateway predefinito non risponde ma un altro host lo fa, ciò potrebbe indicare un problema con l’interfaccia del router che funge da gateway predefinito.
Una possibilità è che sull’host sia stato configurato l’indirizzo del gateway predefinito errato. Un’altra possibilità è che l’interfaccia del router possa essere completamente operativa ma abbia una sicurezza applicata che le impedisce di elaborare o rispondere alle richieste di ping.
L’host esegue il ping del suo gateway predefinito, inviando una richiesta echo ICMP. Il gateway predefinito invia una risposta eco a conferma della connettività.
Eseguire il ping di un host remoto
Il ping può anche essere utilizzato per testare la capacità di un host locale di comunicare attraverso una rete. L’host locale può eseguire il ping di un host IPv4 operativo di una rete remota, come mostrato nella figura. Il router utilizza la sua tabella di routing IP per inoltrare i pacchetti.
Se questo ping ha esito positivo, è possibile verificare il funzionamento di un’ampia parte dell’internetwork. Un ping riuscito attraverso l’internetwork conferma la comunicazione sulla rete locale, il funzionamento del router che funge da gateway predefinito e il funzionamento di tutti gli altri router che potrebbero trovarsi nel percorso tra la rete locale e la rete dell’host remoto.
Inoltre, è possibile verificare la funzionalità dell’’host remoto. Se l’host remoto non fosse in grado di comunicare al di fuori della sua rete locale, non avrebbe risposto.
Nota: molti amministratori di rete limitano o proibiscono l’ingresso di messaggi ICMP nella rete aziendale; pertanto, la mancanza di una risposta ping potrebbe essere dovuta a restrizioni di sicurezza.
Traceroute – Prova il percorso
Il ping viene utilizzato per testare la connettività tra due host ma non fornisce informazioni sui dettagli dei dispositivi tra gli host. Traceroute (tracert) è un’utilità che genera un elenco di hop che sono stati raggiunti con successo lungo il percorso. Questo elenco può fornire importanti informazioni di verifica e risoluzione dei problemi. Se i dati raggiungono la destinazione, la traccia elenca l’interfaccia di ogni router nel percorso tra gli host. Se i dati falliscono in qualche salto lungo il percorso, l’indirizzo dell’ultimo router che ha risposto alla traccia può fornire un’indicazione di dove si trovano il problema o le restrizioni di sicurezza.
Tempo di andata e ritorno (RTT – Round Trip Time)
L’utilizzo di traceroute fornisce il tempo di andata e ritorno per ogni hop lungo il percorso e indica se un hop non risponde. Il tempo di andata e ritorno è il tempo impiegato da un pacchetto per raggiungere l’host remoto e per il ritorno della risposta dell’host. Un asterisco (*) viene utilizzato per indicare un pacchetto perso o senza risposta.
Queste informazioni possono essere utilizzate per individuare un router problematico nel percorso o possono indicare che il router è configurato per non rispondere. Se il display mostra tempi di risposta elevati o perdite di dati da un particolare hop, ciò indica che le risorse del router o le sue connessioni potrebbero essere stressate.
IPv4 TTL e IPv6 Hop Limit
Traceroute utilizza una funzione del campo TTL in IPv4 e del campo Hop Limit in IPv6 nelle intestazioni di livello 3, insieme al messaggio ICMP Time Exceeded.
La prima sequenza di messaggi inviati da traceroute avrà un valore di campo TTL pari a 1. Ciò fa sì che il TTL del pacchetto IPv4 scada al primo router. Questo router risponde quindi con un messaggio ICMPv4 Time Exceeded. Traceroute ora ha l’indirizzo del primo hop.
Traceroute quindi incrementa progressivamente il campo TTL (2, 3, 4…) per ogni sequenza di messaggi. Ciò fornisce la traccia dell’indirizzo di ciascun hop man mano che i pacchetti scadono ulteriormente lungo il percorso. Il campo TTL continua ad essere incrementato fino al raggiungimento della destinazione oppure viene incrementato fino a un massimo predefinito.
Una volta raggiunta la destinazione finale, l’host risponde con un messaggio ICMP Port Unreachable o un messaggio ICMP Echo Reply invece del messaggio ICMP Time Exceeded
ICMP – Riepilogo
ICMP Message
Sebbene IP sia solo un protocollo best-effort, la suite TCP/IP fornisce messaggi di errore e messaggi informativi durante la comunicazione con un altro dispositivo IP. Questi messaggi vengono inviati utilizzando i servizi di ICMP. Lo scopo di questi messaggi è fornire feedback su problemi relativi all’elaborazione dei pacchetti IP in determinate condizioni, non rendere affidabile l’IP. ICMP è disponibile sia per IPv4 che per IPv6. ICMPv4 è il protocollo di messaggistica per IPv4. ICMPv6 fornisce gli stessi servizi per IPv6 ma include funzionalità aggiuntive.
Un messaggio ICMP Echo può essere utilizzato per testare la raggiungibilità di un host su una rete IP. L’host locale invia una richiesta Echo ICMP a un host. Se l’host è disponibile, l’host di destinazione risponde con una risposta Echo.
Quando un host o un gateway riceve un pacchetto che non può consegnare, può utilizzare un messaggio ICMP Destination Unreachable per notificare all’origine che la destinazione o il servizio non è raggiungibile. Il messaggio includerà un codice che indica il motivo per cui non è stato possibile consegnare il pacchetto.
Un messaggio ICMPv4 Time Exceeded viene utilizzato da un router per indicare che un pacchetto non può essere inoltrato perché il campo TTL del pacchetto è stato decrementato a 0. Se un router riceve un pacchetto e riduce a zero il campo TTL nel pacchetto IPv4, scarta il pacchetto e invia un messaggio Time Exceeded all’host di origine.
ICMPv6 invia anche un messaggio Time Exceeded se il router non può inoltrare un pacchetto IPv6 perché il pacchetto è scaduto. I messaggi informativi e di errore trovati in ICMPv6 sono molto simili ai messaggi di controllo e di errore implementati da ICMPv4. Tuttavia, ICMPv6 include quattro nuovi protocolli come parte di ND o NDP, come segue:
RS message
RA message
NS message
NA message
Test Ping e Traceroute
Per testare la connettività a un altro host su una rete, viene inviata una richiesta echo all’indirizzo host utilizzando il comando ping. Se l’host all’indirizzo specificato riceve la richiesta echo, risponde con una risposta echo. Quando viene ricevuta ogni risposta echo, ping fornisce un feedback sul tempo intercorso tra l’invio della richiesta e la ricezione della risposta. Questa può essere una misura delle prestazioni della rete. Ping ha un valore di timeout per la risposta. Se non viene ricevuta una risposta entro il timeout, ping fornisce un messaggio che indica che non è stata ricevuta una risposta.
I tipi di test di connettività eseguiti con ping includono quanto segue:
Pinging del loopback locale: il ping può essere utilizzato per testare la configurazione interna di IPv4 o IPv6 sull’host locale. Per eseguire questo test, eseguire il ping dell’indirizzo di loopback locale.
Pinging del gateway predefinito: questo viene generalmente eseguito eseguendo il ping dell’indirizzo IP del gateway predefinito dell’host. Un ping riuscito al gateway predefinito indica che l’host e l’interfaccia del router che funge da gateway predefinito sono entrambi operativi sulla rete locale.
Pinging dell’host remoto: un ping riuscito attraverso l’internetwork conferma la comunicazione sulla rete locale, il funzionamento del router che funge da gateway predefinito e il funzionamento di tutti gli altri router che potrebbero trovarsi nel percorso tra la rete locale e la rete di l’host remoto.
tracert è un’utilità che genera un elenco di hop che sono stati raggiunti con successo lungo il percorso. Questo elenco può fornire importanti informazioni di verifica e risoluzione dei problemi. Se i dati raggiungono la destinazione, trace elenca l’interfaccia di ogni router nel percorso tra gli host. Se i dati falliscono in qualche salto lungo il percorso, l’indirizzo dell’ultimo router che ha risposto al trace può fornire un’indicazione di dove si trovano il problema o le restrizioni di sicurezza.
Il tempo di andata e ritorno è il tempo impiegato da un pacchetto per raggiungere l’host remoto e per il ritorno della risposta dell’host. Un asterisco (*) viene utilizzato per indicare un pacchetto perso o senza risposta. Traceroute utilizza una funzione del campo TTL in IPv4 e del campo Hop Limit in IPv6 nelle intestazioni di livello 3, insieme al messaggio ICMP Time Exceeded.
La RAM, acronimo dell’inglese Random Access Memory ovvero memoria ad accesso casuale, è un tipo di memoria volatile caratterizzata dal permettere l’accesso diretto a qualunque indirizzo di memoria con lo stesso tempo di accesso.
Nella memoria RAM vengono copiati (“caricati”) i programmi che la CPU deve eseguire. Una volta chiuso il programma le modifiche effettuate verranno salvate e i programmi verranno automaticamente ricopiati sul disco rigido.
Per le sue caratteristiche viene utilizzata come memoria primaria nei computer più comuni. Poiché i dati vanno persi allo spegnimento del dispositivo, l’acquisizione della RAM deve essere eseguita a sistema acceso.
Quando è utile acquisire la RAM?
L’esecuzione di tale attività consentirà di ricavare informazioni relative a:
presenza di malware, o comunque particolari processi in esecuzione;
eventuali passphrases in chiaro riconducibili a container crittografici;
dati temporanei che non sono stati ancora memorizzati;
dati riconducibili alla navigazioni in incognito;
…
DUMP
Il DUMP: è un elemento di un database contenente un riepilogo della struttura delle tabelle del database medesimo e/o i relativi dati, ed è normalmente nella forma di una lista di dichiarazioni SQL. Tale dump è usato per lo più per fare il backup del database, poiché i suoi contenuti possono essere ripristinati nel caso di perdita di dati. I database “corrotti” (ossia, i cui dati non sono più utilizzabili in seguito ad una modifica “distruttiva” di qualche parametro di formato) possono spesso essere rigenerati mediante l’analisi del dump.
Con l’espressione inglese core dump s’intende specificamente lo stato registrato della memoria di un programma in un determinato momento, specie quando tale programma si sia chiuso “inaspettatamente” (crash).
(https://it.wikipedia.org/wiki/Dump)
Acquisizione della memoria volatile
Vi sono molti software per acquisire/analizzare la RAM:
Volatility
Rekall
Mandiant Memoryze
AccessData FTK Imager
Windows Memory Reader
Mac Memory Reader
MoonSols Windows Memory
DumpIt
Belcasoft RAM capture
Fmem (Linux)
e altri ancora…
DART – Digital Advanced Response Toolkit
DART è una collezione di programmi portabili per live forensics inclusa nel sistema DEFT (www.deftlinux.net). Contiene :
programmi per Windows, Linux e per Mac OS X;
ulteriore corposa sezione di programmi command line;
struzioni e script per il completamento del pacchetto con i software non ridistribuibili.
Ha inoltre ottenuto il permesso esclusivo da diversi sviluppatori per la distribuzione dei loro tool in DEFT/DART (ViaForensics, MonSools, CrowdInspect, Mandiant, Belkasoft, Carvey, ASH368, CyberMarshall, ecc.)
Volatility
Volatility è un software open source multi piattaforma (Windows, Linux, Mac) che consente di effettuare analisi del dump della RAM.
Il vantaggio di questo software è che è “modulare” ovvero espandibile tramite l’ausilio di plugin che variano in base alle esigenze.
Periodicamente vengono rilasciati nuovi plugin per la soluzione di nuove esigenze.
filescan scansiona tutti i file aperti nel dump e li elenca
hashdump elenca gli utenti con relativi hash delle password
dlllist elenca le dll caricate
procdump esegue il dump dei processi
pslist elenca i processi in esecuzione
sockscan scansiona oggetti sul socket
screenshot salva dei pseudo screenshot del desktop • dumpfiles salva tutti i file presenti nella memoria
Image identification
Per avviare un’analisi di memoria con Volatility, l’identificazione del tipo di immagine di memoria è un passo obbligatorio.
Per verificare il sistema di provenienza della nostra acquisizione di memoria, utilizziamo il comando:
imageinfo
vol.py -f win-mem-image.bin imageinfo
Questo plugin fornirà le informazioni essenziali per la successiva analisi in quanto permette di identificare il profilo che verrà utilizzato da tutti gli altri plugin.
Utilizzeremo il comando imageinfo per ottenere un riepilogo ad alto livello del campione di memoria che si sta analizzando. Questo comando viene spesso usato per identificare il sistema operativo, il service pack e l’architettura hardware (32 o 64 bit), ma contiene anche altre informazioni utili come l’indirizzo DTB e l’ora in cui il campione è stato raccolto
Nota:
DTB (directory table base) used for address translation. Although identity paging helps translate some static addresses found in System.map, it doesn’t work for all regions of memory. Thus, performing full-scale memory forensics (i.e., list walking, accessing process memory) requires the capability to translate virtual addresses based on the algorithm used by the CPU. For this to be possible, you must find the initial directory table base (DTB). This is a very simple operation because the address of the initial DTB (swapper_pg_dir) is stored in both the System.map file and within the identity-mapped region of the kernel.
PAE (Physical Address Extension, Estensione dell’indirizzo fisico) è una caratteristica di alcuni processori x86 e x86-64 che permette di usare più di 4 gigabyte di memoria fisica nei sistemi a 32 bit – in concomitanza con il supporto appropriato del sistema operativo. Il PAE è supportato dagli Intel Pentium Pro (e successivi) compresi tutti gli ultimi processori Pentium (ad eccezione delle versioni con bus a 400 MHz del Pentium M) – e allo stesso modo dall’AMD Athlon (e successivi).
L’output di imageinfo indica il profilo suggerito da utilizzare come parametro a –profile = PROFILE nell’impiego di altri plugin. È possibile che vengano suggeriti più di un profilo se questi ultimi sono strettamente connessi. Viene visualizzato anche l’indirizzo della struttura KDBG (abbreviazione per _KDDEBUGGER_DATA64) che verrà utilizzata da plugin come pslist e da moduli per trovare rispettivamente gli heads di processo e di moduli stessi. In alcuni casi, particolarmente in campioni di memoria più grandi, potrebbero essere presenti più strutture KDBG. Allo stesso modo, se ci sono più processori, otterremo l’indirizzo KPCR e il numero di CPU per ciascuno di essi.
I plugin esplorano automaticamente i valori KPCR e KDBG quando ne hanno bisogno. Tuttavia, è possibile specificare i valori per qualsiasi plugin fornendo —kpcr = ADDRESS o —kdbg = ADDRESS. Fornendo il profilo e KDBG (o in mancanza quello KPCR) ad altri comandi di Volatility, otterremo risultati più precisi e più veloci. Nota: il pluginimageinfo non funziona sui file di ibernazione, a meno che il profilo corretto non venga fornito in anticipo. Ciò è dovuto al fatto che le definizioni delle strutture importanti variano tra diversi sistemi operativi.
Nota: The KDBG is a structure maintained by the Windows kernel for debugging purposes. It contains a list of the running processes and loaded kernel modules. It also contains some version information that allows you to determine if a memory dump came from a Windows XP system versus Windows 7, what Service Pack was installed, and the memory model (32-bit vs 64-bit).
kdbgscan
Al contrario di imageinfo che fornisce semplicemente suggerimenti sul profilo, kdbgscan è progettato per identificare positivamente il profilo corretto ed il corretto indirizzo KDBG (se sono molteplici). Questo plugin esegue la scansione delle firme KDBGHeader collegate ai profili di Volatility ed applica controlli per ridurre i falsi positivi. La ridondanza dell’output e il numero di controlli per ridurre i falsi positivi che possono essere eseguiti dipende dal fatto se Volatility riesce a trovare un DTB, quindi se già si conosce il profilo corretto (o se si ha un suggerimento di profilo da imageinfo), assicurarsi di utilizzarlo.
Ecco un esempio di quando questo plugin può essere utile. Si supponga che il dump della memoria sia di un sistema Windows 2003 SP2 x64, ma pslist non mostra alcun processo. Il pluginpslist si basa sulla ricerca dell’ heads degli elenchi dei processi indicato da KDBG. Tuttavia, il plugin prende il primo KDBG trovato nel campione di memoria, che non è sempre il migliore. È possibile scontrarsi con questo problema se un KDBG con un puntatore PsActiveProcessHead non valido viene trovato in un dump (ad es. con un offset fisico inferiore) rispetto al KDBG valido.
Osservare come kdbgscan raccoglie due strutture KDBG: una non valida (con 0 processi e 0 moduli) viene trovata prima all’indirizzo 0xf80001172cb0 e una valida (con 37 processi e 116 moduli) si trova successivamente all’indirizzo 0xf80001175cf0. Per ovviare al problema con pslist per questo esempio, è sufficiente fornire il pluginplk -kdbg = 0xf80001175cf0.
Processi e DLL
Iniziamo ad analizzare la lista dei processi.
Una volta identificato il profilo corretto, possiamo iniziare ad analizzare i processi in memoria e, quando il dump proviene da un sistema Windows, le DLL caricate.
pslist
Per elencare i processi di un sistema, utilizziamo il comando pslist. In questo modo viene visualizzata la lista doppiamente collegata a cui punta PsActiveProcessHead e mostra l’offset, il nome del processo, l’ID del processo, l’ID del processo principale, il numero di thread, il numero di handle e la data/ora all’avvio ed al termine del processo. A partire dalla versione 2.1 mostra anche l’ID di sessione e se è un processo Wow64 (Windows 32-bit on Windows64-bit, ovvero Windows 32 bit su Windows 64 bit; usa uno spazio di indirizzamento a 32 bit su un kernel a 64 bit).
Questo plugin non rileva processi nascosti o non collegati (ma psscan può farlo).
In caso di processi con 0 thread, 0 handle e/o un tempo di termine non vuoto, il processo potrebbe non essere ancora attivo.
Nota: WoW64 (Windows 32-bit on Windows 64-bit, in italiano windows 32 bit su windows 64 bit) è un sottosistema del sistema operativo Windows capace di far funzionare le applicazioni nate a 32 bit ed è incluso in tutte le versioni di Windows a 64 bit (incluso Windows XP Professional x64 Edition, Windows Server 2003 x64 Edition e Windows XP 64-bit Edition). WOW64 supplisce a tutte le differenze tra Windows a 32 ed a 64 bit, in particolare i cambiamenti strutturali dello stesso sistema operativo.
pslist
Come di seguito si può notare, regsvr32.exe risulta terminato anche se ancora presente nell’elenco “attivo”. Si noti inoltre che i due processi System e smss.exe non avranno un ID sessione, poiché il System viene avviato prima che le sessioni vengano stabilite e smss.exe è il gestore della propria sessione.
Per impostazione predefinita, pslist mostra offset virtuali per il _EPROCESS ma l’offset fisico può essere ottenuto con l’opzione -P
pstree
Per visualizzare l’elenco dei processi in forma di albero, utilizzare il comando pstree. Questo enumera i processi usando la stessa tecnica di pslist, quindi non mostrerà processi nascosti o non collegati. I processi figli sono indicati usando indentazioni ed i punti.
psscan
Per enumerare i processi utilizzando la scansione dei pool tags (_POOL_HEADER), utilizzare il comando psscan. Questo plugin può trovare processi che sono stati precedentemente interrotti (inattivi) e processi che sono stati nascosti o scollegati da un rootkit. Il rovescio della medaglia è che i rootkit possono ancora nascondersi sovrascrivendo i valori del pool tag (sebbene non siano comunemente visti).
Se un processo è stato precedentemente chiuso, il campo Timeexitedmostrerà il tempo di uscita. Se si vuole ricercare un processo nascosto (come visualizzare le sue DLL), allora si avrà bisogno dell’offset fisico dell’oggetto _EPROCESS, che è mostrato nella colonna più a sinistra. Quasi tutti i plug-in relativi al processo utilizzano un parametro –OFFSET per poter lavorare con processi nascosti.
Nota: A pool tag is a four-byte character that is associated with a dynamically allocated chunk of pool memory. The tag is specified by a driver when it allocates the memory. (https://blogs.technet.microsoft.com/askperf/2008/04/11/an-introduction-to-pool-tags/)
psdispscan
Questo plugin è simile a psscan, ma enumera i processi eseguendo la scansione di DISPATCHER_HEADER invece dei pool tags. Questo fornisce un modo alternativo per rilevare oggetti _EPROCESS nel caso in cui un utente malintenzionato tentasse di nascondersi modificando i pool tags. Questo plugin non è ben gestito e supporta solo XP x86. Per usarlo, è necessario digitare: –plugins = contrib / plugins su riga di comando
dlllist
Per visualizzare le DLL caricate di un processo, si utilizza il comando dlllist. Il comando scorre la lista delle strutture _LDR_DATA_TABLE_ENTRY a cui fa riferimento l’InLoadOrderModuleList del PEB. Le DLL vengono aggiunte automaticamente a questo elenco quando un processo chiama LoadLibrary (o altra derivata come LdrLoadDll) e non vengono rimossi finché FreeLibrary non viene chiamato e il conteggio dei riferimenti raggiunge lo zero. La colonna del conteggio dei load indica se una DLL è stata caricata staticamente (ad esempio come risultato dell’exe o di un’altra tabella di importazione della DLL) o caricata in modo dinamico.
Per visualizzare le DLL per un processo specifico anziché tutti i processi, si utilizza il filtro -p o —pid. Inoltre, nel seguente output, si nota che si sta analizzando un processo Wow64. I processi di Wow64 hanno un elenco limitato di DLL negli elenchi PEB, ma ciò non significa che siano le uniche DLL caricate nello spazio degli indirizzi del processo. Quindi Volatility ricorderà di usare i ldrmodules per questi processi. Per visualizzare le DLL per un processo nascosto o scollegato da un rootkit, utilizzare prima psscan per ottenere lo offset fisico dell’oggetto EPROCESS e fornirlo con — offset = OFFSET. Il plug-in “rimbalzerà” e determinerà l’indirizzo virtuale di EPROCESS e quindi acquisirà uno spazio indirizzo per accedere al PEB
Nota:
Win32 Process Environment Block (PEB)
PID (Process Id – identificatore unico del processo nel sistema. Non appena il sistema interpreta un comando, per la sua esecuzione viene creato un processo indipendente dotato di un numero di identificazione (PID) esclusivo. Il sistema utilizza il PID per tenere traccia dello stato corrente di ogni processo.
dlldump
Per estrarre una DLL dallo spazio di memoria di un processo e scaricarla su disco per l’analisi, utilizzare il comando dlldump. La sintassi è quasi la stessa di quella che per dlllist. È possibile il dump di
tutte le DLL da tutti i processi;
tutte le DLL da un processo specifico (con —pid = PID);
tutte le DLL da un processo nascosto / non collegato (con –offset = OFFSET);
un PE da qualsiasi punto della memoria del processo (con –base = BASEADDR), questa opzione è utile per estrarre DLL nascoste;
una o più DLL che corrispondono a un’espressione regolare (—regex = REGEX), case sensitive o meno (—ignore-case).
Se l’estrazione non riesce, come mostrato in figura, probabilmente alcune delle pagine di memoria di quella DLL non erano residenti in memoria (a causa del paging). In particolare, questo è un problema se la prima pagina che contiene l’intestazione PE e quindi i mapping delle sezioni PE non sono disponibili. In questi casi si può ancora estrarre il segmento di memoria usando il comando vaddump, ma si dovrà ricostruire manualmente l’intestazione PE e correggere le sezioni (se si ha intenzione di analizzare con IDA Pro). Per eseguire il dump di un file PE che non esiste nell’elenco delle DLL (ad esempio, a causa code injectiono maliciousunlinking), è sufficiente specificare l’indirizzo di base del PE del processo in memoria:
vol.py --profile=WinXPSP3x86 -f win7.dmp dlldump --pid=492 -D out --base=0x00680000
È possibile specificare un offset per EPROCESS se la DLL di interesse è in un processo nascosto:
vol.py --profile=WinXPSP3x86 -f win7.dmp dlldump -o 0x3e3f64e8 -D out --base=0x00680000
handles
Per visualizzare gli handles aperti in un processo, utilizzare il comando handles. Questo vale per i file, le chiavi di registro, i mutexes, i named pipes, gli eventi, le windows, i desktop, i thread e tutti gli altri tipi di oggetti esecutivi sicuri. A partire dalla versione 2.1, l’output include il valore di handle e l’accesso concesso per ciascun oggetto
È possibile visualizzare gli handle per un particolare processo specificando —pid = PID o l’offset fisico di una struttura _EPROCESS (—physical-offset=OFFSET). È possibile anche filtrare per tipo di oggetto usando -t o —object-type=OBJECTTYPE.
Il tipo di oggetto può essere uno qualsiasi dei nomi visualizzati dal comando windbg “object\ObjectTypes“.
In alcuni casi, la colonna dettagli potrebbe essere vuota (ad esempio, se gli oggetti non hanno nomi).
Per default, saranno visualizzati sia gli oggetti con nome che quelli senza. Tuttavia, se è possibile nascondere i risultati meno significativi e mostrare solo oggetti con nome, usando il parametro —silent per questo plugin.
getsids
Per visualizzare i SID (Security Identifiers) associati a un processo, si utilizza il comando getsids. Ciò può aiutare a identificare i processi che hanno maliciouslyescalatedprivileges e quali processi appartengono a utenti specifici.
cmdscan
Il plugincmdscan ricerca in memoria csrss.exe su XP/2003/Vista/2008 e conhost.exe su Windows 7 poiché potrebbero essere stati sostituiti da un utente malintenzionato attraverso una shell della console (cmd.exe). Questo plugin trova strutture note come COMMAND_HISTORY cercando un valore costante noto (MaxHistory) e quindi applicando i controlli di integrità. Il valore predefinito è 50 su sistemi Windows, ovvero i 50 comandi più recenti vengono salvati. È possibile modificarlo utilizzando il parametro —max_history=NUMBER. Le strutture utilizzate da questo plugin non sono pubbliche (ad esempio, Microsoft non produce PDB per loro), quindi non sono disponibili in WinDBG o in qualsiasi altro framework forense. Oltre ai comandi inseriti in una shell, questo plugin mostra:
il nome del processo host della console (csrss.exe o conhost.exe);
il nome dell’applicazione che utilizza la console (qualunque processo stia utilizzando cmd.exe);
la posizione dei buffer della cronologia dei comandi, incluso il buffer corrente di «conteggio», l’ultimo comando aggiunto e l’ultimo comando visualizzato; l’handle del processo applicazione
A causa della tecnica di scansione utilizzata da questo plugin, è possibile ricavare la cronologia dei comandi da console sia attive sia chiuse.
consoles
Simile a cmdscan, il pluginconsoles trova i comandi che sono stati digitati in cmd.exe o eseguiti tramite backdoor. Tuttavia, anziché eseguire la scansione di COMMAND_HISTORY, questo plugin esegue la scansione di CONSOLE_INFORMATION. Il vantaggio principale di questo plugin è che non solo visualizza i comandi digitati (anche da chi compier un’intrusione!), ma comprende l’intero buffer dello schermo (input e output). Ad esempio, invece di vedere il solo comando “dir“, verrà riportato esattamente ciò che è stato visualizzato, inclusi tutti i file e le directory elencati dal comando “dir“.
Notare come l’utente sembra non riesca a trovare lo strumento dd.exe per la copia di dati. Quasi 20 errori di battitura più tardi, lo trova e lo usa.
Inoltre, questo plugin mostra quanto segue:
titolo della finestra della console originale e titolo della finestra della console corrente;
il nome e il pid dei processi allegati (scorre LIST_ENTRY per enumerarli tutti se più di uno);
qualsiasi alias associato ai comandi eseguiti. Ad esempio, gli autori di attacchi possono registrare un alias in modo che digitando “hello” venga effettivamente eseguito “cd system“;
le coordinate dello schermo della console cmd.exe.
verinfo
Per visualizzare le informazioni sulla versione incorporate nei file PE, utilizzare il comando verinfo. Non tutti i file PE hanno informazioni sulla versione e molti autori di malware lo forgiano per includere dati falsi; ciò nonostante può essere molto utile per identificare i binari e creare correlazioni con altri file.
Questo plugin supporta solo le informazioni sulla versione da file eseguibili e DLL, ma in seguito verrà ampliato per includere i moduli del kernel. Se si desidera filtrare in base al nome del modulo, utilizzare le opzioni —regex = REGEX e/o —ignore-case.
enumfunc
Questo plugin enumera le funzioni importate ed esportate da processi, DLL e driver del kernel. Nello specifico, gestisce le funzioni importate ed esportate per nome o numero ordinale e le esportazioni inoltrate. L’output sarà molto dettagliato nella maggior parte dei casi (le funzioni esportate da ntdll, msvcrt e kernel32 possono raggiungere più di 1000 voci ciascuna). Quindi è possibile ridurre l’eccesso di risultati filtrando i criteri con le opzioni da riga di comando (vds -h) oppure si può sfruttare il codice in enumfunc.py come esempio per l’uso delle funzioni API di per l’analisi delle tabelle IAT e EAT. Ad esempio, il pluginapihooks sfrutta le API di importazione ed esportazione per trovare le funzioni in memoria durante il controllo degli hook.
È possibile utilizzare –s per la ricerca di processi e driver del kernel. Questo può essere utile se si sta cercando di enumerare le funzioni in processi o driver nascosti.
Nota: IAT e EAT: tabelle degli indirizzi di importazione/esportazione situate all’interno del PE.
Per mostrare le funzioni esportate dai processi in memoria, usare -P e –E :
Per mostrare le funzioni importate dai processi in memoria, usare -K e –I :
Process Memory
Se proviamo ad analizzare la memoria più a fondo, senza soffermarsi solo sui processi, possiamo trovare altre informazioni interessanti.
memmap
Il comando memmap mostra esattamente quali pagine sono residenti in memoria, dato un DTB di processo specifico (o DTB del kernel se si utilizza questo plugin sul processo Idle o System). Verrà mostrato l’indirizzo virtuale della pagina, l’offset fisico corrispondente e la dimensione della pagina. Le informazioni generate da questo plugin provengono dal metodo get_available_addresses. Dalla versione 2.1, la nuova colonna DumpFileOffset aiuta a correlare l’output di memmap con il filedump prodotto dal pluginmemdump.
Ad esempio, in base all’output qui sopra, la pagina all’indirizzo virtuale 0x0000000000058000 del processo di memoria System può essere trovata all’offset 0x00000000162ed000 del file win7_trial_64bit.raw. Dopo aver utilizzato memdump per estrarre la memoria indirizzabile del processo System, è possibile trovare questa pagina all’offset 0x8000.
Per estrarre tutte le pagine residenti in memoria di un processo in un singolo file, utilizzare il comando memdump, specificando la directory di destinazione con -D o —dump-dir = DIR.
A questo punto dovremmo essere in grado di formulare un’affermazione riguardante la relazione delle pagine mappate ed estratte:
procdump
Per eseguire il dump di un processo eseguibile, si utilizza il comando procdump. È possibile usare i flag —unsafe o -u per ignorare determinati controlli di integrità utilizzati durante l’analisi dell’intestazione PE. Alcuni malware falsificheranno intenzionalmente i campi delle dimensioni nell’intestazione PE per evitare che gli strumenti di dumping della memoria funzionino.
Usare –memory per includere lo slack space tra le sezioni PE che non sono allineate alla pagina, altrimenti si otterrà un file che ricorda più il file su disco, prima che le sezioni vengano espanse.
procmemdump e procexedump(dalla ver. 2.4 di Volatility)
Quando gli eseguibili vengono caricati dal disco, Windows utilizza l’intestazione PE per determinare il numero di pagine, e con quali autorizzazioni, verranno allocate per ciascuna sezione. L’intestazione descrive la dimensione e la posizione di ciascuna sezione sul disco e le sue dimensioni e posizione in memoria. Poiché le sezioni devono essere allineate alla pagina in memoria, ma non sul disco, questo in genere comporta l’aggiunta di spazio tra le sezioni quando vengono caricate in memoria. Ci sono anche modifiche apportate in memoria a causa di rilocazioni e funzioni importate.
Durante il recupero degli eseguibili dalla memoria, esistono alcune limitazioni del tool di ripristino, per esempio le pagine dell’eseguibile potrebbero non essere nel pagefile.sys, o non essere valide, o non essere state ancora caricate.
procmemdump
Con questo comando si può recuperare la rappresentazione in memoria di un eseguibile. Ciò significa che nei file generati da questo plugin le pagine sono allineate in memoria, non allineate al disco.
Con questo comando si può recuperare ancora l’eseguibile, ma questa volta è possibile riallineare le sezioni così come erano sul disco. Ciò avviene analizzando l’intestazione PE in memoria e usato per annullare alcune delle modifiche apportate al momento del caricamento.
vadinfo
Il comando vadinfo visualizza informazioni estese sui nodi VAD di un processo. In particolare, mostra:
l’indirizzo della struttura MMVAD nella memoria del kernel;
gli indirizzi virtuali iniziali e finali nella memoria di processo a cui appartiene la struttura MMVAD;
il tag VAD;
i flag VAD, i flag di controllo, ecc;
il nome del file mappato in memoria (se ne esiste uno); la costante di protezione della memoria (permessi).
Nota: VAD (virtual address descriptor), è l’acronimo di descrittore di indirizzo virtuale. Il kernel di Windows organizza la memoria allocata dal processo (o dal kernel) in un albero di assegnazioni con tag VAD. C’è una differenza tra la protezione originale e la protezione corrente. La protezione originale è derivata dal parametro flProtect in VirtualAlloc. Ad esempio è possibile riservare la memoria (MEM_RESERVE) con la protezione PAGE_NOACCESS (protezione originale). Successivamente, è possibile chiamare di nuovo VirtualAlloc per eseguire il commit (MEM_COMMIT) e specificare PAGE_READWRITE (diventa la protezione corrente). Il comando vadinfo mostra solo la protezione originale. Pertanto, solo perché si legge PAGE_NOACCESS, non significa che il codice nella regione non possa essere letto, scritto o eseguito.
vadtree
Per visualizzare i nodi VAD come una struttura ad albero, si può utilizzare il comando vadtree.
Se si desidera visualizzare l’albero binario nel formato Graphviz, è sufficiente aggiungere –output = dot –output-file = graph.dot al proprio comando. Quindi sarà possibile aprire graph.dot con un qualsiasi visualizzatore compatibile con Graphviz. Questo plugin supporta anche la codifica a colori dell’output in base alle regioni che contengono stack, heap, file mappati, DLL, ecc.
vaddump
Per estrarre l’intervallo di pagine descritto da un nodo VAD, si utilizza il comando vaddump. È simile al memdump, eccetto che le pagine che appartengono a ciascun nodo VAD sono collocate in file separati (denominati in base agli indirizzi di inizio e fine) invece di un grande file conglomerato. Se alcune pagine dell’intervallo non sono residenti in memoria, vengono riempite con 0 utilizzando il metodo zread () dello spazio di indirizzo.
La ragione per cui esiste il campo PhysicalOffset è che in questo modo è possibile distinguere tra due processi con lo stesso nome.
iehistory
Questo plugin recupera frammenti di file di cache della cronologia IE in index.dat Può trovare collegamenti accessibili (via FTP o HTTP), collegamenti reindirizzati (– REDR) e voci cancellate (– LEAK). Si applica a qualsiasi processo che carica e utilizza la libreria wininet.dll, non solo per Internet Explorer. In genere include “esplora risorse” di Windows e persino campioni di malware.
Kernel Memory e Objects
modules
Per visualizzare l’elenco dei driver del kernel caricati sul sistema, si utilizza il comando modules. Scorre la lista delle strutture LDR_DATA_TABLE_ENTRY indicate da PsLoadedModuleList.
Simile al comando pslist, si basa sulla ricerca della struttura KDBG. In rari casi, potrebbe essere necessario utilizzare kdbgscan per trovare l’indirizzo della struttura KDBG più appropriato e quindi fornirlo a questo plugin come — kdbg = ADDRESS.
Poiché questo plugin “scorre la lista”, in genere è possibile presumere che l’ordine di visualizzazione dei moduli nell’output sia l’ordine in cui questi sono stati caricati nel sistema. Nell’esempio è stato caricato dapprima ntoskrnl.exe, seguito da hal.dll e così via.
L’output mostra l’offset della struttura LDR_DATA_TABLE_ENTRY, che è un indirizzo virtuale per default, ma può essere specificato come indirizzo fisico con lo switch -P come mostrato in figura. In entrambi i casi, la colonna Base è l’indirizzo virtuale della base del modulo nella memoria del kernel (dove ci si aspetterebbe di trovare l’intestazione PE).
Nota:
Kernel Debugging Block (KDBG), è una struttura gestita dal kernel di Windows a scopo di debug. Contiene un elenco dei processi in esecuzione e dei moduli del kernel caricati. Contiene anche alcune informazioni sulla versione che consentono di determinare se un dump della memoria proviene da un sistema Windows XP piuttosto che Windows 7, quale Service Pack è stato installato e il modello di memoria (32 bit vs 64 bit).
Modules non riesce a trovare i driver del kernel nascosti/non collegati, per questo scopo usare modscan.
modscan
Il comando modscan trova le strutture LDR_DATA_TABLE_ENTRY analizzando la memoria fisica per i pool tags. Questo può raccogliere driver, anche quelli precedentemente scaricati che sono stati nascosti/scollegati dai rootkit. A differenza di modules, l’ordine dei risultati non ha alcuna relazione con l’ordine in cui sono stati caricati i driver. Come si può notare in figura, infatti, DumpIt.sys riporta l’offset fisico più basso, ma probabilmente era uno degli ultimi driver da caricare (dato che era usato per acquisire la memoria).
moddump
Per estrarre un driver del kernel in un file, si utilizza il comando moddump, indicando la directory di destinazione con -D o —dump-dir = DIR. Senza parametri aggiuntivi, tutti i driver identificati da modlist verranno scaricati. Se si desidera un driver specifico, fornire un’espressione regolare del nome del driver con —regex = REGEX o l’indirizzo base del modulo con –base = BASE.
Simile a dlldump, se le parti critiche dell’intestazione PE non sono residenti in memoria, la ricostruzione/estrazione del driver potrebbe non riuscire. Inoltre, per i driver mappati in sessioni diverse (come win32k.sys), non esiste attualmente alcun modo per specificare quale sessione utilizzare quando si acquisisce il driver.
filescan
Per trovare FILE_OBJECT nella memoria fisica utilizzando la scansione dei tag pool, si può utilizzare il comando filescan. Verranno trovati i file aperti anche se un rootkit li nasconde sul disco e se li aggancia ad alcune funzioni API per nascondere gli handle aperti su un sistema live. L’output mostra l’offset fisico di FILE_OBJECT, il nome del file, il numero di puntatori all’oggetto, il numero di handle per l’oggetto e le autorizzazioni concesse all’oggetto
symlinkscan
Questo plugin esegue la scansione degli oggetti di collegamento simbolici e mostra le loro informazioni. In passato, questo era stato utilizzato per collegare lettere di unità (ad esempio D :, E :, F :, ecc) a veri volumi di crittografia (ad esempio \ Device \ TrueCryptVolume).
dumpfiles
Un concetto importante per ogni analista informatico (non solo forense), così come per coloro che hanno a che fare coi sistemi operativi, è intimamente familiare con il caching. I file vengono memorizzati nella cache per sostenere le prestazioni del sistema quando i file stessi vengono utilizzati e acceduti. Ciò rende la cache una fonte preziosa da una prospettiva forense dal momento che si è in grado di recuperare i file che erano correttamente in uso. I file scaricati dalla memoria possono quindi essere elaborati con strumenti esterni.
Esistono diverse opzioni per il plugindumpfiles:
Nota: al contrario del file carving che non si preoccupa di come gli oggetti sono mappati in memoria. I file potrebbero non essere completamente mappati in memoria (anche per le prestazioni), quindi le sezioni mancanti sono riempite con degli zero.
Per impostazione predefinita, il dumpfiles esegue l’iterazione attraverso il VAD, estraendo tutti i file mappati come DataSectionObject, ImageSectionObject o SharedCacheMap. Da un punto di vista investigativo, tuttavia, si potrebbe voler eseguire una ricerca più mirata. È possibile utilizzare i flag -r e -i per specificare un’espressione regolare senza distinzione tra maiuscole e minuscole di un nome di file. Nell’output riportato è possibile vedere da dove è stato eseguito il dump dei file (DataSectionObject, ImageSectionObject o SharedCacheMap), l’offset di _FILE_OBJECT, il PID del processo il cui VAD conteneva il file e il percorso del file su disco:
Il nome dump file è nel formato:
file. [PID]. [OFFSET] .ext
OFFSET è l’offset di SharedCacheMap o di _CONTROL_AREA, non di _FILE_OBJECT.
L’estensione (EXT) può essere:
img – ImageSectionObject
dat – DataSectionObject
vacb – SharedCacheMap
Possiamo osservare nel -S/–summary-file per recuperare il nome originale del file :
È inoltre possibile utilizzare lo scriptparsesummary.py per analizzare l’output JSON del file di riepilogo. Quanto segue mostra un esempio di utilizzo dello script. Oltre al nome del file originale, del PID del processo con il file aperto e la dimensione, è possibile vedere quali pagine erano presenti e quali mancanti e di conseguenza riempite con degli zer0 nell’output di riepilogo analizzato:
È possibile usare, inoltre, l’opzione -n/–name per scaricare i file con il nome originale.
Non tutti i file saranno attualmente attivi o nel VAD e tali file non verranno scaricati quando si utilizza l’opzione -r/–regex. Per questi file è possibile prima cercare un _FILE_OBJECT e quindi usare il flag-Q/–physoffset per estrarre il file. I file speciali NTFS sono esempi di file che devono essere scaricati in modo specifico.
L’opzione -f/–filter consente di specificare quale parte del file si desidera eseguire il dump (DataSectionObject, ImageSectionObject o SharedCacheMap).
Ad esempio, se si desidera visualizzare solo le informazioni di stato per un file eseguibile, è possibile specificare —filter = ImageSectionObject.
unloadedmodules
Windows memorizza le informazioni sui driver scaricati di recente a scopo di debug. Questo fornisce un modo alternativo per determinare cosa è successo su un sistema, oltre ai ben noti moduli e pluginmodscan.
Networking
connections
Per visualizzare le connessioni TCP attive al momento dell’acquisizione della memoria, si utilizza il comando connections. Questo modulo scorre la tabella handle in tcpip.sys e visualizza le connessioni correnti. L’output include l’offset virtuale di _TCPT_OBJECT per default, quello fisico può essere ottenuto con l’opzione –P.
Note:
funziona solo per x86 e x64, Windows XP e Windows 2003 Server;
se si utilizza un’immagine ibernata, questo potrebbe non funzionare perché Windows chiude tutte le connessioni prima della sospensione. Si potrebbe trovare più efficace invece connscan.
connscan
Per trovare le strutture _TCPT_OBJECT utilizzando la scansione dei pool tags, si ricorre al comando connscan. È possibile rilevare, oltre alle connessioni attive, anche quelle precedenti terminate.
Note:
funziona solo per x86 e x64, Windows XP e Windows 2003 Server;
nell’output in esempio, alcuni campi sono stati parzialmente sovrascritti, ma alcune informazioni sono ancora presenti; infatti, il campo PID dell’ultima voce è 0, ma tutti gli altri campi sono ancora intatti. Quindi, a fronte di maggiori falsi positivi, si ottiene il vantaggio di rilevare quante più informazioni possibili.
sockets
Per rilevare socket di ascolto per qualsiasi protocollo (TCP, UDP, RAW, ecc.), si utilizzare il comando socket. In questo modo viene visualizzato un elenco di strutture socket aperte indicate nel modulo tcpip.sys.
L’output include l’offset virtuale di _ADDRESS_OBJECT per impostazione predefinita. L’offset fisico può essere ottenuto con lìopzione -P. Funziona solo per x86 e x64, Windows XP e Windows 2003 Server.
sockscan
Per trovare le strutture _ADDRESS_OBJECT utilizzando la scansione dei pool tag, si ricorre al comando sockscan. Come con connscan, è possibile raccogliere dati residui e artefatti da socket precedenti.
Funziona solo per x86 e x64, Windows XP e Windows 2003 Server.
netscan
Per eseguire la scansione degli artefatti di rete in Windows Vista a 32 e 64 bit, Windows 2008 Server e Windows 7, si utilizza il comando netscan. Questo trova endpoint TCP, listener TCP, endpoint UDP e listener UDP. Distingue tra IPv4 e IPv6, stampa l’IP locale e remoto (se possibile), la porta locale e remota (se possibile), quando il socket è stato collegato o quando è stata stabilita la connessione e lo stato corrente (solo per le connessioni TCP).
netscan utilizza la scansione dei pool tag.
Note:
Un endpoint è una coppia (indirizzo IP, porta), una connessione è una coppia di endpoint (sorgente, destinazione).
Esistono almeno 2 modi alternativi per enumerare connessioni e socket sui sistemi operativi Vista. Uno di questi utilizza le partizioni e le tabelle hash dinamiche, che è il modo in cui funziona netstat.exe sui sistemi Windows. L’altro include bitmap e port pool.
Port pools e bitmap rappresenta un altro approccio per enumerare l’attività di rete nei dump della memoria. Questi ports pool contengono una bitmap di 65535 bit (un bit rappresenta ciascuna porta su un sistema) e un numero uguale di puntatori alle strutture _PORT_ASSIGNMENT. Un modo estremamente rapido per determinare quali porte sono in uso su un sistema è semplicemente quello di scansionare la bitmap (0 = non usato, 1 = usato). Se è impostato un bit, Windows utilizza l’indice del bit per calcolare l’indirizzo della corrispondente struttura: TCPLISTENER, TCP_ENDPOINT o UDP_ENDPOINT.
Windows Registry
hivescan
Per trovare gli indirizzi fisici di CMHIVE (registry hives) in memoria, utilizzare il comando hivescan.
Questo plugin non è generalmente utile da solo. Dovrebbe essere ereditato da altri plugin (come hivelist trattato di seguito) che si basano su CMHIVE e interpretano le informazioni trovate in nello stesso registro.
Per individuare gli indirizzi virtuali degli hive del registro di sistema nella memoria e i percorsi completi per l’hive corrispondente sul disco, si utilizza il comando hivelist. Se si desidera stampare valori da un certo hive, eseguire prima questo comando in modo da poter rilevare l’indirizzo dell’hives.
Nota: il registro si trova in una serie di file binari, che prendono il nome di hive (“alveare”).
Windows NT-based systems store the registry in a binary file format which can be exported, loaded and unloaded by the Registry Editor in these operating systems. The following system Registry files are stored in %SystemRoot%\System32\Config\:
Sam – HKEY_LOCAL_MACHINE\SAMSecurity – HKEY_LOCAL_MACHINE\SECURITY
Software – HKEY_LOCAL_MACHINE\SOFTWARE
System – HKEY_LOCAL_MACHINE\SYSTEM
Default – HKEY_USERS\.DEFAULT
Userdiff – Not associated with a hive. Used only when upgrading operating systems
The following file is stored in each user’s profile folder:
%UserProfile%\Ntuser.dat – HKEY_USERS\<User SID> (linked to by HKEY_CURRENT_USER)
For Windows 2000, Server 2003 and Windows XP, the following additional user-specific file is used for file associations and COM information:
%UserProfile%\Local Settings\Application Data\Microsoft\Windows\Usrclass.dat (path is localized) – HKEY_USERS\<User SID>_Classes (HKEY_CURRENT_USER\Software\Classes)
For Windows Vista and later, the path was changed to:
%UserProfile%\AppData\Local\Microsoft\Windows\Usrclass.dat (path is not localized) alias %LocalAppData%\Microsoft\Windows\Usrclass.dat – HKEY_USERS\<User SID>_Classes (HKEY_CURRENT_USER\Software\Classes)
Windows 2000 kept an alternate copy of the registry hives (.ALT) and attempts to switch to it when corruption is detected. Windows XP and Windows Server 2003 do not maintain a System.alt hive because NTLDR on those versions of Windows can process the System.log file to bring up to date a System hive that has become inconsistent during a shutdown or crash. In addition, the %SystemRoot%\Repair folder contains a copy of the system’s registry hives that were created after installation and the first successful startup of Windows. Each registry data file has an associated file with a “.log” extension that acts as a transaction log that is used to ensure that any interrupted updates can be completed upon next startup. Internally, registry files are split into 4 kB “bins” that contain collections of “cells”.
printkey
Per visualizzare sottochiavi, valori, dati e tipi di dati contenuti in una chiave di registro specificata, utilizzare il comando printkey. Per default cercherà tutti gli hives e fornirà le informazioni (se trovate) per la chiave richiesta. Pertanto, se la chiave si trova in più di un hive, le informazioni relative alla chiave verranno fornite per ciascun hive che la contiene.
Nell’esempio, è mostrato come ricercare informazioni nella chiave HKEY_LOCAL_MACHINE \ Microsoft \ Security Center \ Svc.
Nota: se si sta utilizzando Volatility su Windows, è necessario racchiudere la chiave tra virgolette.
Qui possiamo vedere come appare l’output quando più hive (DEFAULT e ntuser.dat) contengono la stessa chiave “Software \ Microsoft \ Windows NT \ CurrentVersion“.
Se si desidera restringere la ricerca a un hive specifico, printkeyaccetta anche un indirizzo virtuale dell’hive. Ad esempio, per visualizzare il contenuto di HKEY_LOCAL_MACHINE, utilizzare il comando come mostrato in figura.
Nota: l’offset viene ricavato dall’outputhivelist precedente.
hivedump
Per elencare in modo ricorsivo tutte le sottochiavi di un hive, si utilizza il comando hivedump fornendo l’indirizzo virtuale dell’hive desiderato.
hashdump
Per estrarre e decodificare le credenziali del dominio memorizzate nel registro, utilizzare il comando hashdump.
Per utilizzare hashdump, passare l’indirizzo virtuale dell’hive SYSTEM con l’opzione -y e l’indirizzo virtuale dell’hive SAM con –s.
Gli hash possono ora essere sottoposti a software per il password cracking come John the Ripper, rainbowtables, HashCat, ecc.
È possibile che una chiave del registro di sistema non sia disponibile in memoria. Quando ciò accade, potrebbe occorrere il seguente errore: “ERROR: volatility.plugins.registry.lsadump: Unable to read hashes from registry“
È possibile provare a vedere se sono disponibili le chiavi corrette: “CurrentControlSet\Control\lsa” da SYSTEM e “SAM\Domains\Account” da SAM.
Per prima cosa è necessario ottenere il “CurrentControlSet“, per questo possiamo usare volshell (sostituire [SYSTEM REGISTRY ADDRESS] con l’offset ottenuto da hivelist):
Quindi usare il pluginprintkey per verificare che le chiavi e i loro dati siano lì. Poiché “CurrentControlSet” è 1 nell’esempio, come primo comando utilizzeremo “ControlSet001” :
In mancanza della chiave avremmo il messaggio di errore: “The requested key could not be found in the hive(s) searched”.
lsadump
Per scaricare i LSA secrets dal registro, si utilizza il comando lsadump. Mostrerà informazioni quali la password predefinita (per i sistemi con autologin abilitato), la chiave pubblica RDP e le credenziali utilizzate da DPAPI.
Le possibili voci sono:
$MACHINE.ACC: autenticazione del dominio Microsoft;
DefaultPassword: password utilizzata per accedere a Windows quando è abilitato l’accesso automatico.
NL$KM: chiave segreta utilizzata per crittografare le password del dominio memorizzate nella cache;
L$RTMTIMEBOMB_*: timestamp che indica la data in cui una copia non attivata di Windows cesserà di funzionare. L$HYDRAENCKEY_*: chiave privata utilizzata per il Remote Desktop Protocol (RDP). Se si dispone anche di una cattura dei pacchetti da un sistema attaccato tramite RDP, è possibile estrarre la chiave pubblica del client dal pacchetto catturato, e la chiave privata del server dalla memoria; quindi decifrare il traffico.
Note:
I LSA secrets sono uno speciale spazio di archiviazione protetto per i dati importanti utilizzati dalla Local Security Authority (LSA) in Windows. LSA è progettato per la gestione della politica di sicurezza locale di un sistema, il controllo, l’autenticazione, la registrazione degli utenti sul sistema, la memorizzazione di dati privati. I dati sensibili degli utenti e del sistema sono memorizzati nei secrets. L’accesso a tutti i dati segreti è disponibile solo per il sistema.
È possibile utilizzare una firma digitale per firmare i file con estensione rdp utilizzati per le connessioni a desktop virtuali tramite Connessione RemoteApp e desktop. Sono inclusi i file rdp utilizzati per le connessioni ai pool di desktop virtuali e ai desktop personali virtuali.Il file RDP (Remote Desktop Protocol) contiene il token EndpointFedAuth. Il possesso di tale file consente di accedere alla console di una macchina virtuale specifica.
Data Protectionapplicationprogramminginterface (DPAPI), a partire da Windows 2000, il sistema operativo ha iniziato a fornire un’interfaccia di programmazione delle applicazioni (API) per la protezione dei dati. Questa API di protezione dei dati (DPAPI) è una coppia di chiamate di funzione che forniscono servizi di protezione dei dati a livello di sistema operativo ai processi dell’utente e di sistema.
userassist
Per ottenere le chiavi di registro UserAssist è possibile utilizzare il pluginuserassist. UserAssist tiene traccia dei programmi eseguiti, del numero di esecuzioni e dell’ultima data e ora di esecuzione
Note:
Per maggiori informazioni vds il post del pluginUserAssist per volatility di Gleeda.
I sistemi Windows mantengono un set di chiavi nel database del registro (chiavi UserAssist) per tenere traccia dei programmi eseguiti. Il numero di esecuzioni e l’ultima data e ora di esecuzione sono disponibili in queste chiavi. Le informazioni all’interno dei valori binari UserAssist contengono solo dati statistici sulle applicazioni lanciate dall’utente tramite Windows Explorer. I programmi avviati tramite la riga di comando (cmd.exe) non compaiono in queste chiavi di registro. Da un punto di vista forense, essere in grado di decodificare queste informazioni può essere molto utile.
shellbags
Questo plugin analizza e visualizza le informazioni Shellbag ottenute dal registro. Ci sono due opzioni per l’output: verbose (default) e il formato bodyfile.
In Shellbags possono essere trovate queste informazioni:
dimensioni e preferenze delle windows;
impostazioni di visualizzazione icone e cartelle;
metadati come i timestamp MAC
file e tipo di file utilizzati più di recente (zip, directory, programma di installazione);
file, cartelle, file zip, programmi di installazione (anche se cancellati);
condivisioni di rete e di cartelle;
metadati associati a uno dei tipi sopra elencati che possono includere timestamp e percorsi assoluti; volumi crittografici True Crypt.
Note:
“Shellbags” è un termine comunemente usato per descrivere una raccolta di chiavi del registro di sistema che consente al “sistema operativo Windows di tracciare le preferenze di visualizzazione della finestra utente specifiche per Windows Explorer”.
Un’altra opzione è usare —output = body per il formato file TSK 3.x bodyfile. È possibile utilizzare questa opzione quando si desidera combinare l’output di mftparser e timeliner. È possibile anche includere un identificatore di macchina nell’intestazione del bodyfile con il flag–machine (questo è utile quando si combinano timeline da più macchine). Solo gli elementi ITEMPOS e FILE_ENTRY vengono generati con il formato bodyfile.
Note:
TSK 3.x bodyfile: the body file is an intermediate file when creating a timeline of file activity. It is a pipe (“|”) delimited text file that contains one line for each file.
Mftparser: this plugin scans for potential Master File Table (MFT) entries in memory (using “FILE” and “BAAD” signatures) and prints out information for certain attributes, currently: $FILE_NAME ($FN), $STANDARD_INFORMATION ($SI), $FN and $SI attributes from the $ATTRIBUTE_LIST, $OBJECT_ID (default output only) and resident $DATA.
Timeliner: this timeliner plugin creates a timeline from various artifacts in memory.
shimcache
Questo plugin analizza la chiave di registro Application Compatibility Shim Cache.
I metadati dei file che vengono eseguiti su un sistema Windows sono collocati all’interno di questa struttura dati sul sistema in esecuzione. Al momento dell’arresto del sistema, questa struttura dati viene serializzata sul registro in uno dei due percorsi del registro in base alla versione del sistema operativo.
dumpregistry
Il plugindumpregistry consente di scaricare l’hive del registro di sistema sul disco. Per default, il plugin eseguirà il dump di tutti i file di registro (inclusi i registri virtuali come HARDWARE) sul disco, tuttavia è possibile specificare l’offset virtuale per un hive specifico per scaricare solo un registro alla volta. Un avvertimento sull’utilizzo di questo plugin (o del plugindumpfiles) è che potrebbero esserci dei buchi nel dump del registro che potrebbero bloccare questi tools se non abbastanza robusti per gestire file “corrotti”. Questi buchi sono indicati nell’output come: Physical layer returned None for index 2000, filling with NULL.
Si noti che il registro HARDWARE ha “Data” come tipo. Questo perché le prime celle del registro vengono azzerate. Se si esamina il registro con un editor esadecimale, si vedranno chiavi e valori validi.
È inoltre possibile scaricare un solo registro alla volta utilizzando l’offset virtuale dell’hive.
Analisi e conversione dei crash dump e degli hibernation files
Volatility supporta dump di memoria in diversi formati, questo per garantire la massima compatibilità con i differenti strumenti di acquisizione.
È possibile analizzare i file di ibernazione, i crash dump, i core dump di Virtualbox, ecc. nello stesso modo di qualsiasi dump di memoria e Volatility rileverà il formato di file alla base e applicherà lo spazio di indirizzamento appropriato.
È possibile anche la convertire tra formati di file.
crashinfo
Le informazioni nell’intestazione del crashdump possono essere visualizzate utilizzando il comando crashinfo.
hibinfo
Il comando hibinfo rivela informazioni aggiuntive memorizzate negli hibernation file, incluse lo stato dei registri di controllo, come CR0, ecc. Identifica anche l’ora in cui è stato creato il file di ibernazione, lo stato del file di ibernazione e la versione di Windows in ibernazione.
Note:
A control register is a processor register which changes or controls the general behavior of a CPU or other digital device. Common tasks performed by control registers include interrupt control, switching the addressing mode, paging control, and coprocessor control.
CR0. The CR0 register is 32 bits long on the 386 and higher processors. On x86-64 processors in long mode, it (and the other control registers) is 64 bits long. CR0 has various control flags that modify the basic operation of the processor.
imagecopy
Il comando imagecopy consente di convertire qualsiasi tipo di indirizzo di uno spazio (come un crashdump, un file di ibernazione, un core dumpdi virtualbox, uno snapshot di vmware) in un’immagine di memoria grezza. Questa conversione è necessaria se alcuni degli strumenti forensi supportano solo la lettura di dump di memoria grezzi.
Il profilo dovrebbe essere specificato per questo comando, quindi se non si conosce, ricorrere prima ai comandi kdbgscan o imageinfo. Il file di output è specificato con il flag-O.
Lo stato di avanzamento viene aggiornato man mano che il file viene convertito.
raw2dmp
Per convertire un dump di memoria grezza (ad esempio da un’acquisizione win32dd o un file VMware.vmem) in un crashdump di Microsoft, si utilizza il comando raw2dmp.
È utile se si desidera caricare la memoria nel WinDbg kernel debugger per l’analisi.
vboxinfo
Per estrarre dettagli da un virtualbox core dump, si ricorre al comando vboxinfo.
vmwareinfo
Utilizzare questo plugin per analizzare le informazioni dell’intestazione del vmss (vmwaresaved state) o del vmsn (vmwaresnapshot).
I metadati contengono i registri della CPU, l’intero file di configurazione VMX, le informazioni sull’esecuzione della memoria e gli screenshotsPNG della VM ospite.
Note:
The snapshot feature is most useful when you want to preserve the state of the virtual machine so you can return to the same state repeatedly.
When you suspend a virtual machine, a file with a .vmss extension is created. This file contains the entire state of the virtual machine.
You can take a screenshot of a virtual machine and save it to the clipboard, to a file, or to both a file and the clipboard.
When a take a screenshot of a virtual machine, the image is saved as a portable network graphics (.png) file by default. On Windows hosts, you can also save the screenshot as a bitmap (.bmp) file.
Note: while some VMware products store guest memory in .vmem files, other products (such as ESX) create these .vmsn or .vmss files when you suspend or take snapshots of running virtual machines. Since ESX is typically used for larger virtualization environments (compared to VMware Fusion or VMware Desktop), the capability to analyze .vmss/.vmsn can be critical in corporate IR/forensics.
You can convert a .vmss/.vmsn to a raw dd-style memory dump by extracting the physical memory runs to a separate file. To do this, use the imagecopy plugin.
hpakinfo
Questo plugin mostra informazioni da un dump di memoria con formato hpak creato da FDPro.exe.
hpakextract
Se si dispone di un file hpak il cui contenuto è compresso, è possibile estrarre e decomprimere l’immagine della memoria fisica utilizzando questo plugin.
Filesystem
mbrparser
Esegue la scansione e analizza i potenziali Master Boot Records (MBR). Ci sono diverse opzioni per trovare i MBR e filtrare l’output. Sebbene questo plugin sia stato scritto pensando ai bootkit di Windows, può essere utilizzato anche con campioni di memoria di altri sistemi.
Quando viene eseguito senza opzioni aggiuntive, mbrparser esegue la scansione e restituisce informazioni su tutti i potenziali MBR definiti dalla firma (‘\x55\xaa‘) rilevati in memoria. Le informazioni includono: disassemblaggio del codice di avvio (deve essere installato distorm3) e informazioni sulla partizione. Questo probabilmente genererà falsi positivi.
Se distorm3 non è installato, l’opzione -H /–hex può essere utilizzata per ottenere l’intera sezione bootcode in hex invece che disassemblata:
$ vol.py -f [sample] mbrparser -H
Se l’offset fisico dell’MBR è noto, può essere specificato con l’opzione -o/– offset=
Il Bootkit è una recente tipologia di virus informatico, che si può vedere come un ibrido tra un virus del tipo che infetta i boot-sector e un virus tipo rootkit. Questo tipo di virus è molto difficile da eliminare in quanto è invisibile (quasi totalmente) dal suo PC infetto.
Distorm3 Powerful Disassembler Library For x86/AMD64.
Se l’hash MD5 del bootcode desiderato è noto, è possibile specificarlo utilizzando l’opzione -M/–hash (l’hash del bootcodefino all’istruzione RET – «Return from Procedure» ):
oppure l’opzione -F/–fullhash (l’hash del bootcode completo):
Per ridurre i falsi positivi esiste un’opzione di controllo -C/–check che controlla la tabella delle partizioni per trovarne una avviabile (di tipo noto) e non vuota (NTFS, FAT*, ecc.):
Esiste anche un’opzione per cambiare l’offset per l’inizio del disassemblaggio. Questo può essere utile per analizzare macchine (come Windows XP) che copiano solo la parte del bootcode MBR che non è stata ancora eseguita.
Ad esempio, prima di modificare l’offset:
dopo aver modificato l’offset iniziale:
mftparser
Questo plugin analizza le potenziali voci della Master File Table (MFT) in memoria (utilizzando le firme “FILE” e “BAAD“) e visualizza le informazioni per determinati attributi, attualmente: $FILE_NAME ($FN), $STANDARD_INFORMATION ($SI), $FN e $SI da $ATTRIBUTE_LIST, $OBJECT_ID (solo output predefinito) e $DATI residenti. Le opzioni di interesse includono:
–machine : nome del computer da aggiungere all’intestazione della timeline (utile quando si combinano timeline da più macchine);
-D/–dump-dir : directory di output;
–output=body : visualizza l’output nel formato Sleuthkit 3.X;
–no-check : visualizza tutte le voci incluse quelle con timestamp nullo;
-E/–entry-size : modifica la dimensione della voce MFT di 1024 byte predefinita;
-O/–offset : visualizza la voce MFT con un dato offset (delimitato da virgole).
Note:
Questo plugin ha spazio per l’espansione, tuttavia VTypes per altri attributi sono già inclusi.
Vtypes: A representation of structures used in the OS, such as size, names, members, types, and offsets
Questo plugin potrebbe impiegare un po’ di tempo prima dell’esecuzione dell’output, poiché prima esegue la scansione e quindi costruisce l’albero delle directory con percorsi di file completi.
Esempio (output predefinito):
Anche l’output di bodyfile è un’opzione. Si consiglia di archiviare l’output in un file utilizzando l’opzione –output-file, poiché potrebbe essere piuttosto lungo. Quanto segue mostra la creazione di un bodyfile usando mftparser durante il dumping dei file residenti. È anche possibile vedere un file di interesse creato sul sistema (f.txt) e recuperato nella directory di output:
mactime
L’utility mactime di Sleuthkit può essere utilizzata per generare il bodyfile in modo leggibile:
Windows GUI
sessions
Visualizza l’elenco dei dettagli di _MM_SESSION_SPACE sulle sessioni di accesso utente.
Ogni volta che si verifica un accesso, il kernel di Windows crea una nuova sessione, che è fondamentalmente un contenitore per processi e oggetti (come windowsstations e desktop) che appartengono alla sessione.
L’analisi di queste strutture di sessione permette di rilevare le sessioni di accesso attive (e in alcuni casi terminate) da dump di memoria basati su Windows, inclusi i processi associati, i moduli del kernel, il pool. La struttura principale per una sessione è, appunto, _MM_SESSION_SPACE
Nota: gli elenchi di processi rilevati da questo plugin vengono sfruttati dal pluginpsxview per il rilevamento dei rootkit.
wndscan
wndscan è un pool scanner per il tag WINDOWSTATION. Questo comando fornisce informazioni dettagliate sulle windows stations e sui processi che interagiscono con gli appunti. Questo comando potrebbe essere utilizzato in un’indagine per mostrare che un processo specifico stava usando gli appunti.
Verrà visualizzato:
nome della Window Station;
ID di sessione;
AtomTable;
Desktop;
processo di visualizzazione degli appunti; numero di elementi negli appunti.
Note:
Una sessione è composta da tutti i processi e da altri oggetti di sistema che rappresentano la sessione di accesso di un singolo utente. Questi oggetti includono tutte le finestre, i desktop e le Windows Stations. Un desktop è un’area del pool di paging specifica della sessione e carica nello spazio di memoria del kernel. Questa area è da dove vengono allocati gli oggetti della GUI della sessione privata. Una Windows Stations è fondamentalmente un limite di sicurezza per contenere desktop e processi. Quindi, una sessione può contenere più di una Windows Station e ogni stazione Windows può avere più desktop.
Una atom table è una tabella definita dal sistema che memorizza stringhe e identificatori corrispondenti. Un’applicazione inserisce una stringa in una atom table e riceve un numero intero a 16 bit, chiamato atom, che può essere utilizzato per accedere alla stringa. Una stringa che è stata collocata in una atom table è chiamata atom name.
Gli atoms sono stringhe che possono essere facilmente condivise tra processi nella stessa sessione. Tuttavia, anziché passare il valore di stringa effettiva o eseguire operazioni di confronto tra stringhe, le atom table forniscono un’implementazione più semplice e veloce. In breve, un processo aggiunge un atom a una atom table passando una stringa a una funzione come AddAtom o GlobalAddAtom (o indirettamente tramite una API).
Le API AddAtom restituiscono un identificativo intero che il processo o altri processi possono utilizzare per recuperare la stringa. Una atom table è un «bucket hash» che contiene il numero intero di mapping di stringhe.
deskscan
Poolscanner per il tagDESKTOP (desktops)
deskscan enumera i desktop, le allocazioni dell’heap del desktop e i thread associati. Può essere utilizzato per i seguenti scopi:
aiuta a trovare i roguedesktop utilizzati per nascondere le applicazioni dagli utenti connessi;
rileva i desktop creati da ransomware;
collega i thread ai loro desktop;
analizza l’heap del desktop per individuare corruzioni della memoria; cerca le allocazioni dell’heap del desktop del profilo per individuare gli oggetti USER.
atomscan
Pool scanner per _RTL_ATOM_TABLE
Il plugin atomscan individua le tabelle atom nella memoria fisica cercando i pool tag e quindi eseguendo controlli di integrità nei campi Signature e NameLength. Non include gli atom locali del processo. Gli atom sono riportati nell’ordine in cui sono stati trovati, a meno che non si specifichi:
—sort-by=atom (ordina per ID atom)
–sort-by=refcount (ordina per numero di riferimenti all’atom). Usando questo plugin è possibile trovare i window messages registrati, i percorsi delle DLL sospette «rogue injected», i nomi delle classi window, ecc.
atoms
Lo svantaggio di atomscan è che non esiste un modo chiaro per collegare una tabella atom alla sua sessione proprietaria o alla window station.
Viene fornito, quindi, anche un secondo plugin, atoms, che è in grado di eseguire l’associazione. Questo plugin visualizza le atom table delle sessioni e delle window. Questo plugin mostrerà le informazioni sulla atom table e collegherà ogni voce alla sessione e alla window station che lo possiede. Questa informazione può essere utile nelle indagini sui malware scoprendo artefatti che molte persone non considererebbero nel tentativo di coprire le loro tracce.
clipboard
Questo comando può estrarre le informazioni memorizzate negli appunti. L’opzione –v visualizzerà i dati degli appunti in formato esadecimale.
Nota: in caso di copia e incolla di un file da Windows Explorer, il contenuto dell’intero file non viene copiato negli appunti, ma solo il percorso completo.
eventhooks
Questo comando enumera gli hook di eventi installati tramite l’API SetWinEventHook.
Visualizza gli ID evento (minimo e massimo) a cui si applica l’hook, i thread interessati, i processi proprietari e l’offset alla procedura di hook.
Gli hook degli eventi vengono installati chiamando SetWinEventHook. L’enumerazione degli hook avviene analizzando la struttura tagEVENTHOOK attraverso il plugineventhook di Volatility.
Nota: eventMin ed eventMax si riferiscono all’evento di sistema più basso e più elevato a cui si applica l’hook. Nell’esempio l’hook proviene da MENU avvia e arresta delle operazioni. Inoltre ihmod è un indice di un’array di atoms, un valore di -1 indica che la procedura offPfn con valore 0xf6264 si trova all’interno del processo di hooking.
messagehooks
Questo comando visualizza gli hook di messaggi sia locali che globali, installati tramite le API SetWindowsHookEx. Questo è un trucco comune utilizzato dal malware per iniettare codice in altri processi e registrare sequenze di tasti, registrare movimenti del mouse, ecc.
creenshot
Questo comando prende uno screenshot da ogni desktop sul sistema. Enumera le finestre per ogni desktop nel loro ordine Z (focus front-to-back). Prende le coordinate sinistra, destra, superiore e inferiore di ogni finestra dalla struttura tagWND e disegna rettangoli con PIL (Python Imaging Library).
Esempio: due utenti hanno eseguito l’accesso a Windows 7 con la commutazione rapida dell’utente (ctrl+alt+canc, quindi opzione «cambia utente»). Ogni utente ha lasciato aperte varie finestre. Dopo aver acquisito la memoria ed eseguito il plugin degli screenshot, avremo uno screenshot per ogni desktop.
Nota: PIL (Python Imaging Library) necessita della lib jepg.
userhandles
Questo comando individua la struttura tagSHAREDINFO specifica della sessione, scorre le strutture aheList (un array di _HANDLEENTRY). Determina se ogni voce di handle è di proprietà di un thread o di un processo, mostra il tipo di oggetto e il relativo offset nello spazio di sessione. Il risultato mostrato da questo plugin non è molto dettagliato, ma ha lo scopo di presentare una panoramica degli oggetti USER attualmente in uso da ogni thread o processo; e funge da API per altri plugin che desiderano dettagli maggiori su un tipo di oggetto. Ad esempio i plugingditimers e eventhooks sfruttano le API di questo plugin.
gditimers
Questo comando sfrutta l’API della tabella di handleUSER (come descritto per userhandles) e per ogni TYPE_TIMER, dereferenzia l’oggetto come tag TIMER e mostra i dettagli sui campi.
Nota: il malware utilizza spesso i timer per pianificare le funzioni di routine, come contattare un server C2 o assicurarsi che un processo nascosto rimanga nascosto.
windows
Questo comando enumera tutte le finestre (visibili o meno) in tutti i desktop del sistema. Scorre le windows nel loro ordine Z (cioè front-end-focus) a partire dal valore spwnd del desktop (la finestra in primo piano). Per ogni finestra mostra i dettagli sul titolo della finestra, gli atoms di classe, il thread e il processo proprietario, le proprietà di visibilità, le coordinate sinistra/destra/alto/basso, i flag e gli ex-flag e l’indirizzo della procedura della windows.
wintree
Questo comando enumera le finestre nello stesso modo del precedente comando Windows, ma stampa meno dettagli in modo che la relazione genitore/figlio possa essere facilmente espressa in una forma ad albero. Invece di una vista “piatta”, è possibile vedere quali finestre sono contenute in altre finestre.
Windows Malwares
Sebbene tutti i comandi forniti da Volatility possano aiutare a scoprire malware (in un modo o nell’altro), ve ne sono alcuni progettati specificamente per la ricerca di rootkit e codice malevolo.
malfind
Il comando malfind aiuta a trovare codice e DLL nascoste o iniettate nella memoria in «modalità utente», in base a caratteristiche quali tagVAD e autorizzazioni.
Se si desidera salvare le copie estratte dei segmenti di memoria identificati da malfind, fornire semplicemente una directory di output con -D o –dump-dir = DIR. In questo caso, una copia decompressa di un binario malevolo iniettato verrebbe salvata sul disco.
Note:
malfind non rileva DLL immesse in un processo utilizzando CreateRemoteThread ->LoadLibrary. Le DLL iniettate con questa tecnica non sono nascoste e quindi è possibile visualizzarle con dlllist. Lo scopo malfind è individuare le DLL che i metodi e gli strumenti standard non rilevano.
Nell’esempio malfind viene utilizzato per rilevare la presenza di Zeus. Il primo segmento di memoria (a partire da 0x01600000) è stato rilevato perché il suo eseguibile, contrassegnato come privato (non condiviso tra processi) e con un tagVadS… il che significa che non c’è alcun file di memoria mappato che occupa già lo spazio. Sulla base di uno disassembly dei dati trovati a questo indirizzo, sembra contenere alcune API hook trampolinestubs.
Il secondo segmento di memoria (a partire da 0x015D0000) è stato rilevato perché conteneva un eseguibile che non è elencato negli elenchi dei moduli di PEB.
yarascan
Volatility ha diversi motori di scansione per trovare modelli semplici come i pool tag in spazi di indirizzi fisici o virtuali. Tuttavia, se è necessario cercare elementi più complessi come le espressioni regolari o le regole composte (cioè cercare “questo” e non “quello”), è possibile utilizzare il comando yarascan. Questo plugin può aiutare a localizzare qualsiasi sequenza di byte (come istruzioni di assembly con caratteri jolly), espressioni regolari, stringhe ANSI o stringhe Unicode in modalità utente o memoria del kernel. È possibile creare un file di regole YARA e specificarlo come —yara-file = RULESFILE. Oppure, se si sta cercando qualcosa di semplice, si può specificare i criteri come —yara-rules = RULESTEXT.
Creiamo una firma yara come segue:
Identifichiamo il processo corrispondente alla firma yara:
Per cercare le firme definite nel file rules.yar, in qualsiasi processo e visualizzare i risultati sullo schermo:
Per cercare una stringa semplice in qualsiasi processo e scaricare i segmenti di memoria che contengono una corrispondenza:
Per cercare un byte pattern nella memoria del kernel, si può utilizzare la tecnica mostrata in esempio. La ricerca viene effettuata nella memoria in blocchi da 1 MB, in tutte le sessioni.
Nota: Nell’esempio si cerca il malware TDL3 che opera applicando una hard-patch agli adattatori SCSI sul disco (a volte atapi.sys o vmscsi.sys). In particolare, aggiunge un po’ di codice shell alla sezione .rsrcdel file e quindi modifica AddressOfEntryPoint in modo che punti al codice della shell. Questo è il metodo di persistenza principale di TDL3. Una delle istruzioni univoche nel codice shell è cmpdwordptr [‘3LDT’] così è possibile creare una firma YARA da questi opcode.
Per cercare un determinato modello di byte in un particolare processo:
Per cercare un’espressione regolare in un particolare processo:
svcscan
Volatility permette di elencare i servizi senza utilizzare le API di Windows su una macchina live. Per vedere quali servizi sono registrati nel dump di memoria, si può usare il comando svcscan. L’output mostra l’ID del processo di ciascun servizio (se è attivo e si riferisce a un processo usermode), il nome del servizio, il nome visualizzato del servizio, il tipo di servizio e lo stato corrente. Mostra anche il percorso binario per il servizio registrato, che sarà un file EXE per i servizi di usermode e un nome del driver per i servizi che vengono eseguiti dalla modalità kernel.
A partire da dalla versione 2.3 di Volatility è disponibile l’opzione –verbose che controlla la chiave del registro di sistema ServiceDll e segnala quale DLL ospita il servizio. Questa è una funzionalità critica poiché il malware molto comunemente installa servizi che utilizzano svchost.exe (il processo di servizio host condiviso) e implementa il codice malevolo reale in una DLL.
ldrmodules
Esistono molti modi per nascondere una DLL. Uno dei modi prevede lo scollegamento della DLL da uno (o tutti) degli elenchi collegati nel PEB. Tuttavia, in questo caso, vi sono ancora informazioni contenute all’interno del VAD (Virtual Address Descriptor) che identifica l’indirizzo di base della DLL e il suo percorso completo su disco. Per fare un riferimento incrociato a queste informazioni (note come file mappati in memoria) con le 3 liste PEB, si utilizza il comando ldrmodules. Per ogni file PE mappato in memoria, il comando ldrmodules visualizza True o False se il PE esiste negli elenchi PEB.
Poiché le liste PEB e DLL che esse contengono sono tutte esistenti in modalità utente, è anche possibile che il malware nasconda (o oscuri) una DLL semplicemente sovrascrivendo il percorso. Gli strumenti che cercano solo le voci non collegate possono non considerare che il malware potrebbe sovrascrivere C:\bad.dll per mostrare C:\windows\system32\kernel32.dll. Quindi è possibile utilizzare l’opzione -v o –verbose con ldrmodules per vedere il percorso completo di tutte le voci.
Poiché le liste PEB e DLL che esse contengono sono tutte esistenti in modalità utente, è anche possibile che il malware nasconda (o oscuri) una DLL semplicemente sovrascrivendo il percorso. Gli strumenti che cercano solo le voci non collegate possono non considerare che il malware potrebbe sovrascrivere C:\bad.dll per mostrare C:\windows\system32\kernel32.dll. Quindi è possibile utilizzare l’opzione -v o –verbose con ldrmodules per vedere il percorso completo di tutte le voci.
impscan
Per poter eseguire il reverse engineering del codice che si trova nel dump della memoria, è necessario vedere quali funzioni il codice importa. In altre parole, quali funzioni API chiama. Quando si esegue il dump dei file binari con dlldump, moddump o procdump, l’IAT (Import AddressTable) potrebbe non essere ricostruito correttamente a causa dell’elevata probabilità che una o più pagine nell’intestazione PE o IAT non siano residenti in memoria (paged). Impscan, invece, identifica le chiamate alle API senza analizzare lo IAT di un PE. Funziona anche se il malware cancella completamente l’intestazione PE e funziona sui driver del kernel.
Prendendo il malwareCoreflood come esempio, nella figura si nota che questo malware ha eliminato l’intestazione PE una volta caricata nel processo di destinazione (chiamando VirtualFree nell’ImageBase della DLL iniettata).
È possibile utilizzare malfind per rilevare la presenza di Coreflood in base ai criteri tipici (autorizzazioni di pagina, tagVAD, ecc.).
Si noti come l’indirizzo di base del PE non contiene la solita intestazione “MZ“.
Nota: le versioni precedenti di impscan creavano automaticamente un IDB con etichetta da utilizzare con IDA Pro. Questa funzionalità è stata temporaneamente disabilitata, ma tornerà in futuro quando verranno introdotte altre funzionalità simili.
Supponiamo che si voglia estrarre la copia decompressa di Coreflood e vedere le sue API importate. Utilizzare impscan specificando come indirizzo di base quello fornito da malfind. In questo caso, si utilizza l’indirizzo di base nella forma 0x1000 per tenere conto della pagina mancante nella ImageBase reale.
Se non si specifica un indirizzo di base con -b o –base, si finirà con la scansione del modulo principale del processo (cioè IEXPLORE.EXE poiché è -p 2044) per le funzioni importate. È anche possibile specificare l’indirizzo di base di un driver del kernel per analizzare il driver per le funzioni importate in modalità kernel.
Laqma loads a kernel driver named lanmandrv.sys. If you extract it with moddump, the IAT will be corrupt. So use impscan to rebuild it:
$ python vol.py -f laqma.vmem impscan -b 0xfca29000
Volatility Foundation Volatility Framework 2.4
IAT Call Module Function
---------- ---------- -------------------- --------
0xfca2a080 0x804ede90 ntoskrnl.exe IofCompleteRequest
0xfca2a084 0x804f058c ntoskrnl.exe IoDeleteDevice
0xfca2a088 0x80568140 ntoskrnl.exe IoDeleteSymbolicLink
0xfca2a08c 0x80567dcc ntoskrnl.exe IoCreateSymbolicLink
0xfca2a090 0x805a2130 ntoskrnl.exe MmGetSystemRoutineAddress
0xfca2a094 0x805699e0 ntoskrnl.exe IoCreateDevice
0xfca2a098 0x80544080 ntoskrnl.exe ExAllocatePoolWithTag
0xfca2a09c 0x80536dc3 ntoskrnl.exe wcscmp
0xfca2a0a0 0x804fdbc0 ntoskrnl.exe ZwOpenKey
0xfca2a0a4 0x80535010 ntoskrnl.exe _except_handler3
0xfca2a3ac 0x8056df44 ntoskrnl.exe NtQueryDirectoryFile
0xfca2a3b4 0x8060633e ntoskrnl.exe NtQuerySystemInformation
0xfca2a3bc 0x805bfb78 ntoskrnl.exe NtOpenProcess
The next example shows impscan on an x64 driver and using the render_idc output format. This gives you an IDC file you can import into IDA Pro to apply labels to the function calls.
$ python vol.py -f ~/Desktop/win7_trial_64bit.raw --profile=Win7SP0x64 impscan -b 0xfffff88003980000 --output=idc --output-file=imps.idc
Volatility Foundation Volatility Framework 2.4
$ cat imps.idc
#include <idc.idc>
static main(void) {
MakeDword(0xFFFFF8800398A000);
MakeName(0xFFFFF8800398A000, "KeSetEvent");
MakeDword(0xFFFFF8800398A008);
MakeName(0xFFFFF8800398A008, "PsTerminateSystemThread");
MakeDword(0xFFFFF8800398A010);
MakeName(0xFFFFF8800398A010, "KeInitializeEvent");
MakeDword(0xFFFFF8800398A018);
MakeName(0xFFFFF8800398A018, "PsCreateSystemThread");
MakeDword(0xFFFFF8800398A020);
MakeName(0xFFFFF8800398A020, "KeWaitForSingleObject");
MakeDword(0xFFFFF8800398A028);
MakeName(0xFFFFF8800398A028, "ZwClose");
MakeDword(0xFFFFF8800398A030);
MakeName(0xFFFFF8800398A030, "RtlInitUnicodeString");
[snip]
MakeDword(0xFFFFF8800398A220);
MakeName(0xFFFFF8800398A220, "RtlAnsiCharToUnicodeChar");
MakeDword(0xFFFFF8800398A228);
MakeName(0xFFFFF8800398A228, "__C_specific_handler");
Exit(0);}
apihooks
Per trovare gli hook dell’API in modalità utente o kernel, si usa il pluginapihooks. Questo comando trova: IAT, EAT, Inline style hooks e diversi tipi speciali di hook. Per gli Inline hook, rileva CALL e JMP in posizioni dirette e indirette e rileva sequenze di istruzioni PUSH/RET. Rileva anche CALL o JMP ai registri dopo che un valore immediato (indirizzo) viene spostato nel registro. I tipi speciali di hook che rileva includono l’hook di syscall in ntdll.dll e le chiamate a pagine di codice sconosciute nella memoria del kernel. A partire dalla versione 2.1 di Volatility, apihooks rileva anche le tabelle delle procedure winsock agganciate, include un formato di output più semplice da leggere, supporta il multiple hop disassembly e può eseguire una scansione più rapida della memoria ignorando i processi e le DLL non critiche.
Inline hookssono quelli in cui i primi pochi byte del prologo di una funzione vengono modificati in un JMP che punta al codice del rootkit. Questo è il modo in cui la maggior parte dei trojan funziona se fanno hooking in «linea» e anche la maggior parte delle librerie di hookAPI.
Ecco un esempio di rilevamento degli hookIAT installati dal malware Coreflood. Il modulo di hook è sconosciuto perché non esiste alcun modulo (DLL) associato alla memoria in cui esiste il codice rootkit. Per estrarre il codice contenente gli hook, occorre:
tentare con malfind al fine di trovarlo ed estrarlo automaticamente;
utilizzare i comandi volshell dd/db per eseguire la scansione a ritroso e cercare un’intestazione MZ. Quindi passare l’indirizzo a dlldump come valore –base;
utilizzare vaddump per estrarre tutti i segmenti di codice in singoli file (denominati in base all’indirizzo iniziale e finale), quindi trovare il file che contiene gli intervalli 0x7ff82.
Here is an example of detecting the Inline hooks installed by Silentbanker. Note the multiple hop disassembly which is new in 2.1. It shows the first hop of the hook at 0x7c81caa2 jumps to 0xe50000. Then you also see a disassembly of the code at 0xe50000 which executes the rest of the trampoline.
$ python vol.py -f silentbanker.vmem -p 1884 apihooks
Volatility Foundation Volatility Framework 2.4
************************************************************************
Hook mode: Usermode
Hook type: Inline/Trampoline
Process: 1884 (IEXPLORE.EXE)
Victim module: kernel32.dll (0x7c800000 - 0x7c8f4000)
Function: kernel32.dllExitProcess at 0x7c81caa2
Hook address: 0xe50000
Hooking module: <unknown>
Disassembly(0):
0x7c81caa2 e959356384 JMP 0xe50000
0x7c81caa7 6aff PUSH -0x1
0x7c81caa9 68b0f3e877 PUSH DWORD 0x77e8f3b0
0x7c81caae ff7508 PUSH DWORD [EBP+0x8]
0x7c81cab1 e846ffffff CALL 0x7c81c9fc
Disassembly(1):
0xe50000 58 POP EAX
0xe50001 680500e600 PUSH DWORD 0xe60005
0xe50006 6800000000 PUSH DWORD 0x0
0xe5000b 680000807c PUSH DWORD 0x7c800000
0xe50010 6828180310 PUSH DWORD 0x10031828
0xe50015 50 PUSH EAX
[snip]
Here is an example of detecting the PUSH/RET Inline hooks installed by Laqma:
$ python vol.py -f laqma.vmem -p 1624 apihooks
Volatility Foundation Volatility Framework 2.4
************************************************************************
Hook mode: Usermode
Hook type: Inline/Trampoline
Process: 1624 (explorer.exe)
Victim module: USER32.dll (0x7e410000 - 0x7e4a0000)
Function: USER32.dllMessageBoxA at 0x7e45058a
Hook address: 0xac10aa
Hooking module: Dll.dll
Disassembly(0):
0x7e45058a 68aa10ac00 PUSH DWORD 0xac10aa
0x7e45058f c3 RET
0x7e450590 3dbc04477e CMP EAX, 0x7e4704bc
0x7e450595 00742464 ADD [ESP+0x64], DH
0x7e450599 a118000000 MOV EAX, [0x18]
0x7e45059e 6a00 PUSH 0x0
0x7e4505a0 ff DB 0xff
0x7e4505a1 70 DB 0x70
Disassembly(1):
0xac10aa 53 PUSH EBX
0xac10ab 56 PUSH ESI
0xac10ac 57 PUSH EDI
0xac10ad 90 NOP
0xac10ae 90 NOP
[snip]
Here is an example of the duqu style API hooks which moves an immediate value into a register and then JMPs to it.
************************************************************************
Hook mode: Usermode
Hook type: Inline/Trampoline
Process: 1176 (lsass.exe)
Victim module: ntdll.dll (0x7c900000 - 0x7c9af000)
Function: ntdll.dllZwQuerySection at 0x7c90d8b0
Hook address: 0x980a02
Hooking module: <unknown>
Disassembly(0):
0x7c90d8b0 b8020a9800 MOV EAX, 0x980a02
0x7c90d8b5 ffe0 JMP EAX
0x7c90d8b7 03fe ADD EDI, ESI
0x7c90d8b9 7fff JG 0x7c90d8ba
0x7c90d8bb 12c2 ADC AL, DL
0x7c90d8bd 1400 ADC AL, 0x0
0x7c90d8bf 90 NOP
0x7c90d8c0 b8a8000000 MOV EAX, 0xa8
0x7c90d8c5 ba DB 0xba
0x7c90d8c6 0003 ADD [EBX], AL
Disassembly(1):
0x980a02 55 PUSH EBP
0x980a03 8bec MOV EBP, ESP
0x980a05 51 PUSH ECX
0x980a06 51 PUSH ECX
0x980a07 e8f1fdffff CALL 0x9807fd
0x980a0c 8945fc MOV [EBP-0x4], EAX
0x980a0f e872feffff CALL 0x980886
0x980a14 8945f8 MOV [EBP-0x8], EAX
0x980a17 83 DB 0x83
0x980a18 7df8 JGE 0x980a12
Here is an example of using apihooks to detect the syscall patches in ntdll.dll (using a Carberp sample):
$ python vol.py -f carberp.vmem -p 1004 apihooks
Volatility Foundation Volatility Framework 2.4
************************************************************************
Hook mode: Usermode
Hook type: NT Syscall
Process: 1004 (explorer.exe)
Victim module: ntdll.dll (0x7c900000 - 0x7c9af000)
Function: NtQueryDirectoryFile
Hook address: 0x1da658f
Hooking module: <unknown>
Disassembly(0):
0x7c90d750 b891000000 MOV EAX, 0x91
0x7c90d755 ba84ddda01 MOV EDX, 0x1dadd84
0x7c90d75a ff12 CALL DWORD [EDX]
0x7c90d75c c22c00 RET 0x2c
0x7c90d75f 90 NOP
0x7c90d760 b892000000 MOV EAX, 0x92
0x7c90d765 ba DB 0xba
0x7c90d766 0003 ADD [EBX], AL
Disassembly(1):
0x1da658f 58 POP EAX
0x1da6590 8d056663da01 LEA EAX, [0x1da6366]
0x1da6596 ffe0 JMP EAX
0x1da6598 c3 RET
0x1da6599 55 PUSH EBP
0x1da659a 8bec MOV EBP, ESP
0x1da659c 51 PUSH ECX
0x1da659d 8365fc00 AND DWORD [EBP+0xfffffffc], 0x0
0x1da65a1 688f88d69b PUSH DWORD 0x9bd6888f
[snip]
Here is an example of using apihooks to detect the Inline hook of a kernel mode function:
$ python vol.py apihooks -f rustock.vmem
************************************************************************
Hook mode: Kernelmode
Hook type: Inline/Trampoline
Victim module: ntoskrnl.exe (0x804d7000 - 0x806cf980)
Function: ntoskrnl.exeIofCallDriver at 0x804ee130
Hook address: 0xb17a189d
Hooking module: <unknown>
Disassembly(0):
0x804ee130 ff2580c25480 JMP DWORD [0x8054c280]
0x804ee136 cc INT 3
0x804ee137 cc INT 3
0x804ee138 cc INT 3
0x804ee139 cc INT 3
0x804ee13a cc INT 3
0x804ee13b cc INT 3
0x804ee13c 8bff MOV EDI, EDI
0x804ee13e 55 PUSH EBP
0x804ee13f 8bec MOV EBP, ESP
0x804ee141 8b4d08 MOV ECX, [EBP+0x8]
0x804ee144 83f929 CMP ECX, 0x29
0x804ee147 72 DB 0x72
Disassembly(1):
0xb17a189d 56 PUSH ESI
0xb17a189e 57 PUSH EDI
0xb17a189f 8bf9 MOV EDI, ECX
0xb17a18a1 8b7708 MOV ESI, [EDI+0x8]
0xb17a18a4 3b35ab6d7ab1 CMP ESI, [0xb17a6dab]
0xb17a18aa 7509 JNZ 0xb17a18b5
0xb17a18ac 52 PUSH EDX
0xb17a18ad 57 PUSH EDI
0xb17a18ae e8c6430000 CALL 0xb17a5c79
0xb17a18b3 eb6a JMP 0xb17a191f
Here is an example of using apihooks to detect the calls to an unknown code page from a kernel driver. In this case, malware has patched tcpip.sys with some malicious redirections.
$ python vol.py -f rustock-c.vmem apihooks
Volatility Foundation Volatility Framework 2.4
************************************************************************
Hook mode: Kernelmode
Hook type: Unknown Code Page Call
Victim module: tcpip.sys (0xf7bac000 - 0xf7c04000)
Function: <unknown>
Hook address: 0x81ecd0c0
Hooking module: <unknown>
Disassembly(0):
0xf7be2514 ff15bcd0ec81 CALL DWORD [0x81ecd0bc]
0xf7be251a 817dfc03010000 CMP DWORD [EBP+0xfffffffc], 0x103
0xf7be2521 7506 JNZ 0xf7be2529
0xf7be2523 57 PUSH EDI
0xf7be2524 e8de860000 CALL 0xf7beac07
0xf7be2529 83 DB 0x83
0xf7be252a 66 DB 0x66
0xf7be252b 10 DB 0x10
Disassembly(1):
0x81ecd0c0 0e PUSH CS
0x81ecd0c1 90 NOP
0x81ecd0c2 83ec04 SUB ESP, 0x4
0x81ecd0c5 c704246119c481 MOV DWORD [ESP], 0x81c41961
0x81ecd0cc cb RETF
[snip]
idt
Per visualizzare l’IDT del sistema (Interrupt DescriptorTable), si utilizza il comando idt. Se nel sistema sono presenti più processori, viene visualizzato l’IDT per ogni singola CPU. Sarà visualizzato: il numero della CPU, il selettore GDT (Global DescriptorTable), l’indirizzo corrente e il modulo proprietario, il nome della sezione PE in cui risiede la funzione IDT. Se si fornisce il parametro –verbose, verrà visualizzato uno disassembly della funzione IDT. Alcuni rootkit agganciano la voce IDT di KiSystemService, ma la indirizzano a una routine all’interno del modulo NT (dove KiSystemService dovrebbe puntare). Tuttavia, a quell’indirizzo, c’è un Inline hook. Il seguente output mostra un esempio di come Volatility può identificarlo.
Note:
module, parte del kernel, è il primo modulo ad essere caricato.
Si noti nella figura come la voce 0x2E per KiSystemService si trovi nella sezione .rsrc di ntoskrnl.exe invece di .text come tutti gli altri.
Per ottenere maggiori dettagli sulla possibile modifica IDT, utilizzare –verbose.
gdt
Per visualizzare il GDT (Global DescriptorTable) del sistema, si utilizza il comando gdt. Questo è utile per rilevare i rootkit (Alipop per esempio) che installano una call gate in modo che i programmi in modalità utente possano chiamare direttamente nel kernel mode (usando un’istruzione CALL FAR).
Se il sistema ha più CPU, viene mostrato il GDT per ciascun processore. Nell’output riportato in figura, è possibile vedere che il selettore 0x3e0 è stato infettato e utilizzato ai fini di un call gate a 32 bit. L’indirizzo del call gate è 0x8003f000, ovvero dove l’esecuzione continua.
Nota: Sistema di protezione ideato da Intel. Sofisticati meccanismi chiamatigateregolano in maniera rigida l’esecuzione di interrupt (interrupt gate), processi (task gate) e le chiamate al sistema operativo(call gate). Nel caso in cui si verifica un’interruzione o un’eccezione (sia esso esterna, cioè provocata da una periferica, o interna, provocata dal codice), viene prelevato un opportuno selettore della GDT (l’interrupt gate, appunto) che specifica in maniera precisa quale codice dev’essere eseguito, e le necessarie restrizioni. I task gate vengono, invece, utilizzati per memorizzare lo stato di un processo e semplificare il passaggio dall’uno all’altro. Infine per le call gate il meccanismo è analogo, ma il relativo gate offre in più la possibilità di specificare se e quanti parametri passare dall’applicazione al sistema operativo, sfruttando i relativi stack per la copia di questi valori.
volshell
Se si desidera approfondire l’analisi, è possibile suddividere il risultato con volshell come mostrato in figura. Quindi disassemblare il codice all’indirizzo del call gate.
threads
Il comando fornisce informazioni dettagliate sui thread, incluso il contenuto dei registri di ciascun thread (se disponibile), un disassemblaggio del codice all’indirizzo iniziale del thread e vari altri campi che possono essere rilevanti per un’analisi. Poiché ogni sistema ha centinaia di thread, rendendo difficile l’ordinamento, questo comando associa tag descrittivi ai thread che trova (e quindi è possibile filtrare per nome del tag con il parametro -F o –filter). Se non si specifica alcun filtro, il comando genererà informazioni su tutti i thread. Altrimenti, specificare un singolo filtro o più filtri separati da virgole.
$ python vol.py -f test.vmem threads -L
Volatility Foundation Volatility Framework 2.4
Tag Description
-------------- --------------
DkomExit Detect inconsistencies wrt exit times and termination
HwBreakpoints Detect threads with hardware breakpoints
ScannerOnly Detect threads no longer in a linked list
HideFromDebug Detect threads hidden from debuggers
OrphanThread Detect orphan threads
AttachedProcess Detect threads attached to another process
HookedSSDT Detect threads using a hooked SSDT
SystemThread Detect system threads
In figura un esempio di ricerca di thread attualmente in esecuzione nel contesto di un processo diverso dal processo proprietario del thread.
Innanzitutto, viene visualizzato l’indirizzo virtuale dell’oggetto ETHREAD insieme all’ID processo e all’IDthread. Successivamente verranno visualizzati tutti i tag associati al thread (SystemThread, AttachedProcess, HookedSSDT), i tempi di creazione/uscita, lo stato, la priorità, l’indirizzo iniziale, ecc. Mostra la base SSDT insieme all’indirizzo di ogni tabella di servizio e qualsiasi funzione collegata nelle tabelle. Infine, viene visualizzato uno disassembly dell’indirizzo iniziale del thread.
callbacks
Volatility permette di visualizzare un varietà di importanti routine di notifica e kernel callback. Con questo comando è possibile visualizzare:
PsSetCreateProcessNotifyRoutine (creazione del processo).
PsSetCreateThreadNotifyRoutine (creazione del thread).
PsSetImageLoadNotifyRoutine (caricamento di immagine/DLL).
IoRegisterFsRegistrationChange (registrazione del file system).
KeRegisterBugCheck e KeRegisterBugCheckReasonCallback.
CmRegisterCallback (registro callback su XP).
CmRegisterCallbackEx (registro callback su Vista e 7).
IoRegisterShutdownNotification (callback di chiusura).
DbgSetDebugPrintCallback (debug visualizza callback su Vista e 7).
DbgkLkmdRegisterCallback (debugcallbacks su 7).
Note:
Rootkit, suite anti-virus, strumenti di analisi dinamici (Sysinternals’ Process Monitor e Tcpview) e molti componenti del kernel di Windows usano questi callback per monitorare eventi.
The KeRegisterBugCheckReasonCallback routine registers a BugCheckDumpIoCallback, BugCheckSecondaryDumpDataCallback, or BugCheckAddPagesCallback routine, which executes when the operating system issues a bug check.
Here's an example of detecting the thread creation callback installed by the BlackEnergy 2 malware. You can spot the malicious callback because the owner is 00004A2A - and BlackEnergy 2 uses a module name composed of eight hex characters.
$ python vol.py -f be2.vmem callbacks
Volatility Foundation Volatility Framework 2.4
Type Callback Owner
PsSetCreateThreadNotifyRoutine 0xff0d2ea7 00004A2A
PsSetCreateProcessNotifyRoutine 0xfc58e194 vmci.sys
KeBugCheckCallbackListHead 0xfc1e85ed NDIS.sys (Ndis miniport)
KeBugCheckCallbackListHead 0x806d57ca hal.dll (ACPI 1.0 - APIC platform UP)
KeRegisterBugCheckReasonCallback 0xfc967ac0 mssmbios.sys (SMBiosData)
KeRegisterBugCheckReasonCallback 0xfc967a78 mssmbios.sys (SMBiosRegistry)
[snip]
Here is an example of detecting the malicious process creation callback installed by the Rustock rootkit (points to memory owned by \Driver\pe386).
$ python vol.py -f rustock.vmem callbacks
Volatility Foundation Volatility Framework 2.4
Type Callback Owner
PsSetCreateProcessNotifyRoutine 0xf88bd194 vmci.sys
PsSetCreateProcessNotifyRoutine 0xb17a27ed '\\Driver\\pe386'
KeBugCheckCallbackListHead 0xf83e65ef NDIS.sys (Ndis miniport)
KeBugCheckCallbackListHead 0x806d77cc hal.dll (ACPI 1.0 - APIC platform UP)
KeRegisterBugCheckReasonCallback 0xf8b7aab8 mssmbios.sys (SMBiosData)
KeRegisterBugCheckReasonCallback 0xf8b7aa70 mssmbios.sys (SMBiosRegistry)
KeRegisterBugCheckReasonCallback 0xf8b7aa28 mssmbios.sys (SMBiosDataACPI)
KeRegisterBugCheckReasonCallback 0xf76201be USBPORT.SYS (USBPORT)
KeRegisterBugCheckReasonCallback 0xf762011e USBPORT.SYS (USBPORT)
KeRegisterBugCheckReasonCallback 0xf7637522 VIDEOPRT.SYS (Videoprt)
[snip]
Here is an example of detecting the malicious registry change callback installed by the Ascesso rootkit. There is one CmRegisterCallback pointing to 0x8216628f which does not have an owner. You also see two GenericKernelCallback with the same address. This is because notifyroutines finds callbacks in multiple ways. It combines list traversal and pool tag scanning. This way, if the list traversal fails, we can still find information with pool tag scanning. However, the Windows kernel uses the same types of pool tags for various callbacks, so we label those as generic.
$ python vol.py -f ascesso.vmem callbacks
Volatility Foundation Volatility Framework 2.4
Type Callback Owner
IoRegisterShutdownNotification 0xf853c2be ftdisk.sys (\Driver\Ftdisk)
IoRegisterShutdownNotification 0x805f5d66 ntoskrnl.exe (\Driver\WMIxWDM)
IoRegisterShutdownNotification 0xf83d98f1 Mup.sys (\FileSystem\Mup)
IoRegisterShutdownNotification 0xf86aa73a MountMgr.sys (\Driver\MountMgr)
IoRegisterShutdownNotification 0x805cdef4 ntoskrnl.exe (\FileSystem\RAW)
CmRegisterCallback 0x8216628f UNKNOWN (--)
GenericKernelCallback 0xf888d194 vmci.sys
GenericKernelCallback 0x8216628f UNKNOWN
GenericKernelCallback 0x8216628f UNKNOWN
driverirp
Per visualizzare la tabella IRP (Major Function) di un driver, si utilizza il comando driverirp. Questo comando eredita da driverscan in modo che sia in grado di individuare DRIVER_OBJECTs. Quindi scorre la tabella delle funzioni, visualizzando lo scopo di ciascuna funzione, l’indirizzo della funzione e il modulo proprietario dell’indirizzo.
Molti driver inoltrano le loro funzioni IRP ad altri driver per scopi legittimi, quindi rilevare le funzioni hookIRP sulla basate dei moduli contenuti non è un buon metodo, quindi verrà visualizzato tutto e lasciato giudicare all’analista. Il comando controlla anche gli Inlinehook delle funzioni IRP e opzionalmente visualizza un disassembly delle istruzioni all’indirizzo IRP (utilizzare l’opzione -v o —verbose). Questo comando genera informazioni per tutti i driver, a meno che non si specifichi un filtro di espressioni regolari.
Nell’output non è evidente che il drivervmscsi.sys sia stato infettato dal rootkit (TDL3 nell’esempio). Sebbene tutti gli IRP facciano riferimento a vmscsi.sys, essi puntano ad uno stub messo in evidenza in quell’area da TDL3 al fine proprio di bypassare gli strumenti di rilevamento dei rootkit. Per ottenere informazioni più dettagliate, si utilizza –verbose.
Ora è possibile vedere che TDL3 reindirizza tutti gli IRP al proprio stub nel driver vmscsi.sys. Il codice salta a qualsiasi indirizzo indicato da 0xffdf0308 una posizione nella regione KUSER_SHARED_DATA.
Nota: un metodo “stub” o semplicemente stub nell’Ingegneria del software è una porzione di codice utilizzata in sostituzione di altre funzionalità software. Uno stub può simulare il comportamento di codice esistente (come una Routine su un sistema remoto) o COM, e temporaneo sostituto di codice ancora da sviluppare. Gli stub sono perciò molto utili durante il porting di software, l’elaborazione distribuita e in generale durante lo sviluppo di software e il software testing.
devicetree
Windows utilizza un’architettura di driver a livelli o una catena di driver in modo che più driver possano ispezionare o rispondere a un IRP. I rootkit spesso inseriscono driver (o dispositivi) in questa catena per nascondere file, nascondere connessioni di rete, carpire sequenze di tasti o movimenti del mouse, ecc… Il plugindevicetree mostra la relazione di un oggetto driver con i suoi dispositivi (scorrendo _DRIVER_OBJECT.DeviceObject.NextDevice) e su tutti i dispositivi collegati (_DRIVER_OBJECT.DeviceObject.AttachedDevice). In figura, Stuxnet ha infettato \FileSystem\Ntfs allegando un dispositivo malevolo senza nome. Sebbene il dispositivo stesso sia senza nome, l’oggetto device identifica il suo driver (\Driver\ MRxNet).
Nota: il plugindevicetree utilizza “DRV” per indicare i driver, “DEV” per indicare i dispositivi e “ATT” per indicare i dispositivi collegati.
psxview
Questo plugin consente di rilevare processi nascosti confrontando ciò che contiene PsActiveProcessHead con quanto riportato da varie altre fonti di elenchi di processi, ovvero:
PsActiveProcessHeadlinkedlist;
EPROCESS pool scanning;
ETHREAD pool scanning (quindi fa riferimento al proprio EPROCESS);
Nella figura viene rilevata la presenza del malwareProlaco. “False” in qualsiasi colonna indica che manca il rispettivo processo. È possibile affermare che “1_doc_RCData_61” sia sospetto poiché compare in ogni colonna tranne pslist (PsActiveProcessHead).
Nota: su Windows Vista e Windows 7 l’elenco interno dei processi in csrss.exe non è disponibile. Potrebbe anche non esserlo in alcune immagini XP in caso di pagine non risiedenti in memoria.
timers
Questo comando visualizza i timer del kernel installati (KTIMER) e tutti i DPC associati (Deferred Procedure Calls, chiamate di procedure differite). Alcuni rootkit (come Zero Access, Rustock e Stuxnet) registrano i timer con un DPC. Sebbene il malware cerchi di essere invisibile e nascondersi del kernel, trovando i KTIMER ed osservando l’indirizzo del DPC, è possibile trovare rapidamente gli intervalli del codice dannoso. In figura si noti come uno dei timer ha un modulo UNKNOWN (il DPC punta a una regione sconosciuta della memoria del kernel). Questo è in definitiva il nascondiglio del rootkit.
Nota: i timer sono elencati in modi diversi a seconda del sistema operativo. Windows memorizza i timer nelle variabili globali per XP, 2003, 2008 e Vista. Dal Windows 7, i timer si trovano in regioni specifiche del processore al di fuori del KPCR (Kernel Processor Control Region). A partire dalla versione 2.1 di Volatility , se ci sono più CPU, il plugintimer trova tutti i KPCR e visualizza i timer associati a ciascuna CPU.
Miscellaneous
strings
Data un’immagine e un file contenente righe nel formato <decimal_offset>: <string>, o <decimal_offset> <string>, visualizza il corrispondente processo e gli indirizzi virtuali in cui è possibile trovare quella stringa. L’input previsto per questo tool è l’output dell’utilityStrings di Microsoft Sysinternals o di altra utility che fornisce un formato offset:string. Si noti che gli offset di input sono offset fisici dall’inizio del file/immagine.
SysinternalsStrings può essere utilizzato su Linux/Mac usando Wine. L’output dovrebbe essere reindirizzato a un file da utilizzare con il pluginstrings di Volatility. Alcuni esempi di utilizzo:
Windows:
Il completamento di SysinternalsStrings può richiedere tempo. Gli switch-q e -o sono imperativi poiché assicurano che l’intestazione non venga visualizzata (–q) e che vi sia un offset per ogni riga (-o).
Linux/Mac, è possibile utilizzare Sysinternals Strings con Wine:
Note:
se si sta usando il comando strings GNU, usare il flag -td per produrre offset in decimale (il plugin non accetta offset esadecimali).
È anche possibile utilizzare l’utility GNU strings fornita con Linux e Mac (l’utility strings predefinita su Mac non ha il supporto Unicode, è possibile installare il pacchetto GNU binutils per ottenere un’utilitystrings che funzioni). Usare il flag -td per ottenere l’offset decimale e fare un secondo passaggio con il flag -el per ottenere stringhe Unicode (little endian). Si noti che il secondo passaggio aggiunge (>>) al file esistente:
$ strings -a -td win7.dd > win7_strings.txt
$ strings -a -td -el win7.dd >> win7_strings.txt
Il risultato dovrebbe essere un file di testo che contiene l’offset e le stringhe dell'immagine, ad esempio:
16392:@@@
17409:
17441:
17473:"""
17505:###
17537:$$$
17569:%%%
17601:&&&
17633:'''
17665:(((
17697:)))
17729:***
EnCase Keyword Export. È possibile anche utilizzare EnCase per esportare parole chiave e offset in questo formato con qualche ritocco. Una cosa da notare è che EnCase esporta il testo in UTF-16 con un BOM di (U + FEFF) che può causare problemi con il pluginstrings (il Byte Order Mark (BOM) è una piccola sequenza di byte che viene posizionata all’inizio di un flusso di dati di puro testo (tipicamente un file) per indicarne il tipo di codifica Unicode). Un esempio di file delle parole chiave esportate:
File Offset Hit Text
114923 DHCP
114967 DHCP
115892 DHCP
115922 DHCP
115952 DHCP
116319 DHCP
Ora modificando il file rimuovendo l'intestazione e le tabulazioni, abbiamo:
114923:DHCP
114967:DHCP
115892:DHCP
115922:DHCP
115952:DHCP
116319:DHCP
Mediante un editor esadecimale noteremo che trattasi di UTF-16 ed ha BOM di (U + FEFF).
$ file export.txt
export.txt: Little-endian UTF-16 Unicode text, with CRLF, CR line terminators
$ xxd export.txt |less
0000000: fffe 3100 3100 3400 3900 3200 3300 3a00 ..1.1.4.9.2.3.:.
Dobbiamo convertirlo in ANSI o UTF-8. In Windows è possibile aprire il file di testo e utilizzare la finestra di dialogo "Salva con nome" per salvare il file come ANSI (nel menu a discesa "Codifica"). In Linux puoi usare iconv:
$ iconv -f UTF-16 -t UTF-8 export.txt > export1.txt
NOTA: è necessario accertarsi che NON ci siano righe vuote nel file "stringhe" finale.
Ora possiamo vedere la differenza nel modo in cui questi due file sono gestiti:
$ python vol.py -f Bob.vmem --profile=WinXPSP2x86 strings -s export.txt
Volatility Foundation Volatility Framework 2.4
ERROR : volatility.plugins.strings: String file format invalid.
$ python vol.py -f Bob.vmem --profile=WinXPSP2x86 strings -s export1.txt
Volatility Foundation Volatility Framework 2.4
0001c0eb [kernel:2147598571] DHCP
0001c117 [kernel:2147598615] DHCP
0001c4b4 [kernel:2147599540] DHCP
0001c4d2 [kernel:2147599570] DHCP
0001c4f0 [kernel:2147599600] DHCP
0001c65f [kernel:2147599967] DHCP
0001c686 [kernel:2147600006] DHCP
L’output di strings di Volatility è molto dettagliato ed è meglio reindirizzarlo o salvarlo in un file. Il seguente comando salva l’output usando l’opzione –output-file e il nome “win7_vol_strings.txt”:
Di default, strings fornisce solo l’output per i processi trovati scorrendo la lista a cui punta PsActiveProcessHead oltre agli indirizzi del kernel. strings può anche fornire l’output per i processi nascosti utilizzando l’opzione –S:
Il pluginstrings richiede un po’ di tempo per essere completato. Al termine, si dovrebbe avere un file di output con ogni riga nel seguente formato:
In figura un esempio di output ove è possibile vedere riferimenti a PID e kernel:
Una volta ottenuto l’output, è possibile vedere quale processo ha la stringa sospetta in memoria. È possibile usare grep per la stringa o il pattern a seconda del contesto, ad esempio:
Per tutti gli IP:
Per tutti gli URL:
volshell
Per esplorare in modo interattivo un’immagine di memoria, si usa il comando volshell. Questo fornisce un’interfaccia simile a WinDbg nel dump della memoria. Ad esempio è possibile:
elencare i processi;
passare al contesto di un processo;
mostrare i tipi di strutture/oggetti;
sovrapporre un tipo su un dato indirizzo;
scorrere le liste collegate; disassemblare il codice a un dato indirizzo.
Nota: volshell può sfruttare IPython se è installato. Questo aggiungerà il completamento della tabulazione e la cronologia dei comandi salvati.
Per utilizzare volshell:
Volendo vedere cosa c’è all’indirizzo 0x779f0000 nella memoria di explorer.exe, si visualizzerà innanzitutto i processi in modo da poter ottenere il PID o l’offset di EPROCESS di explorer.
Nota: se si desidera visualizzare i dati nella memoria del kernel, non è necessario prima cambiare i contesti.
Ora ci si sposta al contesto di explorer e si visualizzano dati con db (visualizza come hexdnump) o dd (visualizzato come double-words):
Osserviamo un PE all’indirizzo 0x779f0000 in explorer.exe. Se si desidera disassemblare le istruzioni in RVA (Relative Virtual Address) 0x2506 in PE, è possibile nel modo seguente:
Per i membri in un oggetto EPROCESS per il sistema operativo specificato, procedere come segue:
Per sovrapporre i tipi di EPROCESS all’offset per explorer.exe, procedere come segue:
comandi db, dd, dt e dis accettano tutti un parametro opzionale “space” che consente di specificare uno spazio di indirizzo. Si otterranno dati diversi a seconda dello spazio di indirizzo utilizzato. Volshell ha alcune impostazioni predefinite e regole che è importante evidenziare:
se non si fornisce uno spazio di indirizzo e non si è passati a un contesto di processo con cc, verrà utilizzato lo spazio del kernel predefinito (System process);
se non si fornisce uno spazio di indirizzo e si è passati a un contesto di processo con cc, si utilizzerà lo spazio del processo attivo/corrente;
se si fornisce esplicitamente uno spazio di indirizzo, verrà utilizzato quest’ultimo.
Si immagini che dopo aver utilizzato uno dei comandi di scansione (psscan, connscan, ecc.) si teme di aver rilevato un falso positivo. Poiché i comandi di scansione emettono un offset fisico (offset nel file di immagine della memoria), si potrebbe esplorare i dati intorno al potenziale falso positivo per determinare se alcuni membri della struttura appaiono avere un senso o meno. Un modo per farlo è aprire il dump della memoria in un visualizzatore esadecimale e passare all’offset fisico per visualizzare i byte grezzi. Tuttavia, un modo migliore è usare volshell e sovrapporre la domanda della struttura al presunto offset fisico. Questo permetterà di vedere i campi interpretati come il loro tipo previsto (DWORD, string, short, ecc.).
Ecco un esempio. Prima istanziare uno spazio di indirizzamento fisico:
Supponendo che il presunto falso positivo per un EPROCESS sia a 0x433308:
Un altro trucco è usare volshell in modo non interattivo. Ad esempio, supponendo di voler conertire un indirizzo nella memoria del kernel nel corrispondente offset fisico.
Quindi l’indirizzo 0x823c8830 del kernel si traduce in offset fisico 0x25c8830 nel file di immagine della memoria. È possibile seguire più comandi in sequenza in questo modo:
bioskbd
Per leggere le sequenze di tasti dall’area del BIOS della memoria, si può utilizzare il comando bioskbd. Con questo comando è possibile rivelare le password digitate nei BIOS di HP, Intel e Lenovo e nei software SafeBoot, TrueCrypt e BitLocker. A seconda del tool utilizzato per acquisire la memoria, non tutte le immagini di memoria conterranno l’area del BIOS necessaria.
patcher
Il pluginpatcher accetta un singolo argomento -x seguito da un file XML. Il file XML, che specifica le patch richieste, è formattato come segue:
Attenzione: è necessario abilitare il supporto per la scrittura e quindi il dump della memoria verrà modificato.
L’elemento radice del file XML è sempre patchfile e contiene un numero qualsiasi di elementi di patchinfo. Quando viene eseguito il patchfile, viene effettua una scansione della memoria per ogni patchinfo, tentando di eseguire la scansione utilizzando il metodo specificato nell’attributo method. Attualmente l’unico metodo di supporto è pagescan e questo deve essere esplicitamente dichiarato in ogni elemento di patchinfo.
Ogni elemento di patchinfo di tipo pagescan contiene un singolo elemento constraints e un singolo elemento patches. La scansione procede quindi su ciascuna pagina in memoria, verificando che tutti i vincoli suddetti siano soddisfatti e, in tal caso, vengono eseguite le istruzioni specificate nell’elemento patches.
L’elemento constraints contiene un numero qualsiasi di elementi match che prendono uno specifico attributo offset (specificando dove all’interno della pagina deve avvenire la corrispondenza) e quindi contengono una stringa esadecimale per i byte che dovrebbero corrispondere.
L’elemento patch contiene, invece, un numero qualsiasi di elementi setbytes che prendono uno specifico attributo offset (specificando dove con la pagina la patch dovrebbe modificare i dati) e quindi contiene una stringa esadecimale per i byte che dovrebbero essere scritti nella pagina. Nota: quando si esegue il pluginpatcher, non verrà apportata alcuna modifica alla memoria a meno che non sia stata specificata l’opzione di scrittura -w sulla riga di comando.
pagecheck Il pluginpagecheck utilizza un DTB del kernel (dal processo System/Idle) e determina quali pagine devono essere residenti in memoria (utilizzando il metodo AddressSpace.get_available_pages). Per ogni pagina, tenta di accedere ai dati della pagina ed ai dettagli dei report, come gli indirizzi PDE e PTE se il tentativo fallisce. Questo è un plugin di diagnostica, di solito utile per la risoluzione dei “buchi” in uno spazio degli indirizzi.
Note:
Questo plugin non è ben supportato. È nella directory contrib e attualmente funziona solo con spazi di indirizzi x86 non PAE.
DTB (directory table base) used for address translation. Although identity paging helps translate some static addresses found in System.map, it doesn’t work for all regions of memory. Thus, performing full-scale memory forensics (i.e., list walking, accessing process memory) requires the capability to translate virtual addresses based on the algorithm used by the CPU. For this to be possible, you must find the initial directory table base (DTB). This is a very simple operation because the address of the initial DTB (swapper_pg_dir) is stored in both the System.map file and within the identity-mapped region of the kernel.
PDE (page directory entry) l processore x86 divide lo spazio di indirizzamento fisico (memoria fisica) in pagine da 4KB ciascuna. Quindi per avere 4GB di memoria avremo bisogno di 1M (1024×1024) di 4KB pagine. Per fare questo viene usata una struttura a 2 livelli. Il primo livello è la Page Directory mentre il secondo è rappresentato dalla Page Table. Quindi avremo una prima tabella, la Page Directory(PD), composta da 1024 elementi, e ognuna di queste punta ad una Page Table(PT) che contiene, a sua volta,1024 elementi i quali puntano alle pagine (quelle da 4KB).
PTE (page table entry) Una PTE (Page Table Entry) è l’ elemento di base per il mapping tra la memoria virtuale (o logica) e quella fisica. La memoria virtuale viene divisa in pagine, la dimensione di una pagina può variare a seconda dell’architettura del processore, per esempio x86 e x64 definiscono entrambi pagine di 4KB (4096 byte) mentre Itanium ha una pagina di 8KB. Ogni pagina virtuale può avere una PTE associata che descrive se essa è valida (ovvero disponibile al processore) ed in caso affermativo quale pagina di memoria fisica corrisponde alla pagina virtuale di interesse.
Il plugintimeliner crea una timeline da varie risorse in memoria accedendo alle seguenti fonti (gli elementi tra parentesi sono filtri che possono essere utilizzati con il flag –type per ottenere solo gli elementi di tale artefatto):
È possibile filtrare per una qualsiasi delle opzioni indicate in modo da avere un output più focalizzato usando il flag–type:
Esistono tre opzioni per l’output:
•testo predefinito;
•il formato bodyfile;
un file Excel.
È possibile anche includere un identificatore di macchina nell’intestazione con il flag–machine (questo è utile quando si combinano timeline da più macchine). In figura l’output di testo predefinito:
Se non si desidera eseguire un ulteriore passaggio di importazione, è possibile utilizzare l’opzione —output=xlsx con –output-file = [FILE] (OUTPUT) per salvare direttamente in un file Excel 2007 (è necessario che OpenPyxl sia installato).
Un’altra alternativa è usare l’opzione —output=body per il formato TSK 3.x bodyfile. È possibile utilizzare questa opzione di output quando si desidera combinare l’output di timeliner, mftparser e shellbags. Per default tutti, tranne il timestampLastWrite del registro di sistema, sono inclusi nell’output di timeliner, poiché l’ottenimento dei timestamp del registro di sistema è piuttosto laborioso. Per aggiungerli all’output, è sufficiente aggiungere l’opzione —type=Registry quando si esegue Volatility. È inoltre possibile limitare l’attenzione dei timestamp del registro di sistema precisando un nome di registro specifico (come —hive=SYSTEM) o utente (—user = Jim) o entrambi (–hive = UsrClass.dat —user = jim). Queste opzioni sono case insensitive.
Dato un dump di una memoria (useremo l’acquisizione RAMWin7Ultimate.mem creata per l’esercitazione), la prima operazione da effettuare è quella di identificarne il «profilo», ovvero verificare il sistema di provenienza dell’acquisizione di memoria:
vol.py -f RAMWin7Ultimate.mem imageinfo
«Win7SP1x64» è il profilo del sistema di provenienza e sarà utilizzato da tutti gli altri plugin per la successiva analisi.
Dall’analisi del file di dump possiamo estrarre diverse informazioni come la versione del sistema operativo, il numero di CPU, gli indirizzi fisici per ciascun processore, la data e ora relativa alla creazione del dump:
Identificato il profilo, è possibile procedere all’analisi del dump di memoria utilizzando i plugin di volatility:
Poichè filescan può produrre un output voluminoso, è consigliabile salvare l’elenco in un file.txt:
pslist: un’altra informazione utile che possiamo estrapolare dal file di dump della RAM è quella relativa ai processi che erano in esecuzione sulla macchina al momento del dump:
Con pslist possiamo ricercare un dato processo specificandone il nome, utilizzando l’opzione –n. Potremmo, ad esempio, ricercare se un determinato processo era in esecuzione al momento dell’acquisizione della memoria:
psxview: poiché pslist non mostrerà i processi nascosti o non collegati, è possibile utilizzare il pluginpsxview per rilevare processi nascosti confrontando ciò che contiene PsActiveProcessHead con quanto riportato da varie altre fonti di elenchi di processi:
vadtree: il kernel di Windows organizza la memoria allocata dal processo (o dal kernel) in un albero di assegnazioni con tag VAD (Virtual Address Descriptor, acronimo di descrittore di indirizzo virtuale). Possiamo utilizzare questo plugin per visualizzare i nodi VAD del processo come una struttura ad albero:
Ancora meglio, possiamo visualizzare la struttura ad albero in modo grafico, salvando l’output nel formato Graphviz mediante l’opzione –output=dot –output-file=graph.dot:
Quindi sarà possibile aprire graph.dot con un qualsiasi visualizzatore compatibile con Graphviz. Questo plugin supporta anche la codifica a colori dell’output in base alle regioni che contengono stack, heap, file mappati, DLL, ecc.
Utilizzando il pluginpslist si è potuto constatare che mentre è stato effettuato il dump della memoria era in esecuzione wordpad(PID 2988).
Poiché procdump estrae un processo eseguibile e dumpfiles salva tutti i file (o un determinato file) presenti nella memoria, potremmo aver bisogno, invece, di estrarre tutte le pagine residenti in memoria legate ad un processo.
Nel caso di wordpad.exe, ad esempio, ciò potrebbe permettere di risalire all’eventuale testo digitato, che non sarebbe rilevabile con la sola estrazione del processo (procdump) né tantomeno del singolo file (dumpfiles). Allo scopo, si utilizza il pluginmemdump che consente di estrarre tutte le pagine residenti in memoria di un processo in un singolo file:
Il file così ottenuto può essere analizzato con altri strumenti (visualizzatori esadecimali, p.e.) alla ricerca di eventuali ed ulteriori informazioni.
Nel nostro esempio si è utilizzato l’editor esadecimale WinHex come interprete di dati, il quale ha permesso di estrarre un file con estensione .rtf al cui interno era presente la stringa di testo “Hello!”.
iehistory: questo plugin recupera frammenti di file di cache della cronologia IE in index.dat. Si applica a qualsiasi processo che carica e utilizza la libreria wininet.dll e quindi non solo per Internet Explorer, ma include anche “esplora risorse”.
userassist: con questo plugin è possibile ottenere le chiavi di registro UserAssist, che tiene traccia dei programmi eseguiti, del numero di esecuzioni e dell’ultima data e ora di esecuzione:
shimcache: questo plugin analizza la chiave di registro Application Compatibility Shim Cache, alla ricerca dei metadati dei file che vengono eseguiti su un sistema Windows:
deskscan: enumera i desktop, le allocazioni dell’heap del desktop ed i thread associati. In ambiente GUI, un desktop è essenzialmente un contenitore per le finestre delle applicazioni e gli oggetti dell’interfaccia utente:
imeliner: crea una timeline delle risorse in memoria accedendo al varie fonti (quest’ultime verranno indicate tra parentesi quadre):
hivelist: individua gli indirizzi virtuali degli hive del registro di sistema nella memoria e i percorsi completi per l’hive corrispondente sul disco.
Il registro di sistema contiene informazioni a cui il sistema operativo fa continuamente riferimento mentre viene utilizzato, quali i profili di tutti gli utenti, le applicazioni installate nel computer e i tipi di documenti creati da ciascuna applicazione, le impostazioni delle finestre, le proprietà delle cartelle e le icone delle applicazioni, i componenti hardware presenti nel sistema e le porte in uso.
Un hive del registro di sistema è un gruppo di chiavi, sottochiavi e valori che dispone di una serie di file di supporto contenenti copie di backup dei relativi dati. È possibile visualizzare gli hive del registro caricati in memoria con il seguente comando:
Verrà mostrato per ciascun hive, il relativo indirizzo fisico e virtuale.
I due indirizzi evidenziati in figura sono gli indirizzi virtuali degli hive di SAM e SYSTEM. Questi due hive contengono informazioni sufficienti ad estrarre gli hash delle password di Windows.
Ricorrendo al plugin hashdump, potremo visualizzare gli utenti con relativi hash delle password. Per utilizzare hashdump, occorre fornire l’indirizzo virtuale dell’hive SYSTEM con l’opzione -y e l’indirizzo virtuale dell’hive SAM con –s. In questo modo verranno estratte le credenziali dei domini memorizzate nel registro.
lsadump: permette di visualizzare i LSA secrets dal registro, ovvero mostrerà informazioni quali la password predefinita (per i sistemi con autologin abilitato), la chiave pubblica RDP e le credenziali utilizzate da DPAPI:
Oltre ai plugin trattati nell’esempio precedente, volatility ne ha altri a corredo, specificatamente implementati per l’analisi dei dump di memoria con macchina virtuale in esecuzione (virtualbox, vmware). Useremo l’acquisizione RAMWin7Ultimate.vmem ottenuta da un dump di memoria con macchina virtuale in esecuzione (vmware, per la precisione):
vmwareinfo: con questo plugin possiamo analizzare le informazioni dell’intestazione del vmss (vmwaresaved state) o del vmsn (vmwaresnapshot). Ciò consentirà di visualizzare i registri della CPU, l’intero file di configurazione VMX, le informazioni sull’esecuzione della memoria:
Master Executive di II livello in Cyber Security – Anno Accademico 2015-2016, estratto dalla mia tesi.
“There are two types of companies: those who have been hacked, and those who don’t yet know they have been hacked”
John Chambers, Executive Chairman Cisco Systems. World Economic Forum 2015
“… possiamo affermare che il 2016 è stato complessivamente l’anno peggiore di sempre in termini di evoluzione delle minacce “cyber” e dei relativi impatti, non solo dal punto di vista quantitativo ma anche e soprattutto da quello qualitativo.”
Rapporto Clusit 2017
Questa era la mia prefazione alla tesi redatta nel 2016, ma considerando quanto scritto nel “Rapporto Clusit 2023”:
“Osservando la situazione dal punto di vista quantitativo, negli ultimi 5 anni la situazione è peggiorata nettamente, seguendo un trend pressoché costante. Confrontando i numeri del 2018 con quelli del 2022 la crescita del numero di attacchi rilevati è stata del 60% … Oltre alla maggiore frequenza, anche la nostra valutazione della Severity media (indice di gravità) di questi attacchi è drasticamente peggiorata, il che rappresenta un significativo moltiplicatore dei danni.”
Anello debole: l’uomo. La forza di una catena, si dice, si misura da quella del suo anello più debole.
Cap.1 La Minaccia Cyber nelle Aziende
La vulnerabilità dei sistemi informatici è oggi riconosciuta a livello globale. Cittadini, aziende e governi subiscono attacchi sempre più frequenti e difficili da contrastare. L’ultimo “Rapporto Clusit” sulla sicurezza ICT evidenzia che la capacità complessiva di attivare protezioni efficaci è ancora debole.
La minaccia cyber
Con minaccia cibernetica intendiamo l’insieme delle condotte controindicate che possono essere realizzate nel e tramite lo spazio cibernetico ovvero in danno di quest’ultimo e dei suoi elementi costitutivi. La minaccia si sostanzia nei c.d. attacchi cibernetici: azioni più o meno automatizzate sulle reti da parte di singoli individui o organizzazioni, statuali e non, finalizzate a distruggere, danneggiare o ostacolare il regolare funzionamento dei sistemi, delle reti o dei sistemi attuatori di processo da essi controllati ovvero a compromettere l’autenticità, l’integrità, la disponibilità e la riservatezza dei dati ivi custoditi o che vi transitano[1].
Una caratteristica saliente della minaccia cibernetica è la sua asimmetricità. L’attaccante infatti:
può colpire a grandissima distanza, da dovunque nel mondo esista un accesso alla rete;
potenzialmente può attaccare sistemi particolarmente sofisticati e protetti sfruttandone anche una sola vulnerabilità;
può agire con tempi tali da non consentire un’efficace reazione difensiva;
può rimanere anonimo o comunque non facilmente individuabile rendendo in tal modo estremamente complessa e difficile una corretta risposta da parte dell’attaccato.
In cosa consiste la Cyber Security?
Sui giornali, ai convegni, nelle presentazioni commerciali si evidenzia una notevole confusione in merito al significato dell’espressione “Cyber Security”.
Ma possiamo dire che “La cyber security è quella pratica che consente a una entità̀ (ad esempio, organizzazione, cittadino, nazione ecc.) la protezione dei propri asset fisici e la confidenzialità̀, integrità̀ e disponibilità̀ delle proprie informazioni dalle minacce che arrivano dal cyber space”.[2]
Dove, “the Cyberspace” è definito come “il complesso ambiente derivante dall’interazione tra persone, software e servizi su Internet tramite dispositivi tecnologici e reti connesse, che non esiste in nessuna forma fisica”[3]
In sintesi, proteggere gli assetti della propria organizzazione significa garantire i seguenti tre obiettivi:
riservatezza,le informazioni devono essere accessibili direttamente o indirettamente solo alle persone (o ai sistemi) che ne hanno diritto e che sono espressamente autorizzate a conoscerle;
integrità, i dati e le rispettive informazioni devono essere protette da alterazioni, quali modifiche, danneggiamenti o cancellazioni improprie, anche accidentali;
disponibilità, i dati e le rispettive informazioni devono essere sempre accessibili agli utilizzatori che ne hanno diritto nei tempi e nei modi previsti.
Il dato è la rappresentazione oggettiva di un fatto o evento che consenta la sua trasmissione oppure interpretazione da parte di un soggetto umano o di uno strumento informatico.
L’informazione è l’interpretazione e il significato assegnato a uno o più dati.
Cap.2 I Possibili “Nemici”
Già nel Rapporto CLUSIT 2015, alla luce dei trend individuati si leggeva: “dunque la vera questione per i difensori (con riferimento ai dati, alle infrastrutture informatiche ed a tutti quei servizi, molti dei quali critici, oggi realizzati tramite l’ICT) non è più “se”, ma “quando” si subirà un attacco informatico (dalle conseguenze più o meno dannose), e quali saranno gli impatti conseguenti”.
Questa tendenza si è ulteriormente consolidata e nel 2016, il principale problema non è tanto che si verrà attaccati (tutti lo sono ormai costantemente, per lo più tramite sistemi automatizzati, nella sfera personale e professionale, per i motivi più disparati), ma quali saranno gli impatti degli attacchi andati a buon fine sulla sicurezza di organizzazioni, utenti, clienti e partner, e come impedire al maggior numero possibile di incidenti di verificarsi.
Tipi di minaccia
A seconda degli attori e delle finalità si usa distinguere la minaccia cibernetica in quattro macro-categorie. Si parla in tal caso di:
criminalità cibernetica (cyber-crime): complesso delle attività con finalità criminali (quali, per esempio, la truffa o frode telematica, il furto d’identità, la sottrazione indebita di informazioni o di creazioni e proprietà intellettuali);
spionaggio cibernetico (cyber-espionage): acquisizione indebita di dati/informazioni sensibili, proprietarie o classificate;
terrorismo cibernetico (cyber-terrorism): insieme delle azioni ideologicamente motivate, volte a condizionare uno stato o un’organizzazione internazionale;
guerra cibernetica (cyber-warfare): insieme delle attività e delle operazioni militari pianificate e condotte allo scopo di conseguire effetti nel predetto ambiente.
Europol, nel suo rapporto IOCTA[4] sugli otto trend del cyber crime nel 2016, li ha classificati in:
crime-as-a-service: il crimine diventa una commodity che si compra al “supermercato” (nero) criminale. Il crimine informatico e la criminalità ordinaria sono sempre più vicini grazie al modello noto come “cybercrime-as-a-service” in cui esperti hacker offrono prodotti e servizi a gruppi criminali che intendono differenziare le proprie attività;
i ransomware, la nuova edizione dell’estorsione;
l’uso criminale dei dati nelle forme di truffe od estorsioni più sofisticate;
le frodi nei pagamenti;
la pedopornografia online e gli abusi;
l’abuso di darknet per attività illecite;
il social engineering, ora rivolto anche ai vertici aziendali per frodi articolate;
l’uso distorto delle valute virtuali, divenute lo strumento di pagamento degli illeciti.
Gli autori
pirati informatici, quelli che spesso, comunemente, vengono chiamati hacker, È sbagliato pensare che i cybercriminali puntino solamente ad eseguire attacchi in grande stile. A fianco di bersagli quali istituti governativi e bancari, sono sempre più oggetto di attacchi informatici anche PMI, liberi professionisti, sino al singolo utente domestico;
spie, sabotatori, vandali. Attualmente, diversi Governi si sono dotati delle necessarie capacità per penetrare le reti nazionali degli altri Stati (in uso sia alle autorità pubbliche che ai privati) a fini di spionaggio o per mappare i sistemi potenzialmente oggetto di un futuro attacco. Il vandalo adotta un insieme di azioni al fine di danneggiare o distruggere beni altrui materiali e non, per puro divertimento o incuria. Il sabotatore ha per obiettivo creare danni ad un sistema, dal rallentamento sino al denial of service, per i motivi più vari. È evidente che una netta distinzione tra i due attori non è possibili in quanto agiscono spesso con le medesime modalità e per gli stessi scopi;
oltre ai criminali comuni, che si rifanno al modello noto come “cybercrime-as-a-service” di cui si è parlato prima, vi sono organizzazioni criminali che hanno preso coscienza delle potenzialità dei malware andando a creare strutture commerciali efficientemente organizzate, capaci di generare sensibili profitti dalla vendita dei servizi che le botnet[5] sono in grado di offrire;
terroristi, è possibile ipotizzare che nel prossimo futuro gruppi terroristici o singoli individui possano impiegare strumenti cibernetici offensivi ed utilizzarli contro obiettivi militari e civili. Si può far rientrare in questa categoria, quella degli attivisti, dal 2013 sempre più spesso si assiste ad una commistione tra finalità cyber criminali e forme di hacktivism. I due ambiti, originariamente distinti per background, finalità e modalità di azione, sempre più spesso trovano conveniente allearsi per raggiungere i propri obiettivi: tipologie di attacco motivate ideologicamente, con intento sostanzialmente dimostrativo, che mirano principalmente a creare un danno d’immagine e/o alla funzionalità temporanea di sistemi e reti;
personale interno, ovvero l’ “insider”, cioè il soggetto che all’interno di una organizzazione – pubblica o privata poco importa – può generare situazioni compromettenti la sicurezza o addirittura la sopravvivenza della realtà di appartenenza. L’attenzione è incentrata sia sui soggetti che ora lavorano nell’organizzazione, sia su quelli che hanno interrotto ogni rapporto. Va tenuto nella dovuta considerazione il fatto che l’attenzione agli attacchi informatici deve necessariamente essere rivolta non solo verso l’esterno, ma anche verso l’interno dell’azienda. Un dipendente particolarmente motivato potrebbe creare un danno molto maggiore rispetto a quello di un cyber attaccante, vista la sua conoscenza dell’infrastruttura e degli asset aziendali. A mio parere rappresenta una fra le minacce più gravi: partono in vantaggio rispetto ad un attaccante esterno per la conoscenza delle dinamiche interne, delle infrastrutture, ecc.., hanno già le credenziali di accesso e spesso non vengono revocate in tempo. Esempio italiano Hacking Team;
fornitori di servizi, outsourcers, nel 2013 si è assistito all’emergere di una chiara tendenza, per cui gli attaccanti hanno individuato negli outsourcer l’anello più debole da colpire per raggiungere (tipicamente sfruttandone le utenze privilegiate e le connessioni VPN) i loro bersagli primari. Questo fenomeno, data la propensione degli attaccanti a minimizzare gli sforzi, è destinato a crescere in modo esponenziale, dal momento che spesso questi fornitori sono aziende medio-piccole, con una cultura della sicurezza sensibilmente inferiore a quella dei loro grandi clienti, pur avendo di frequente accessi poco o per nulla presidiati alle loro reti ed infrastrutture;
dal crimine informatico allo state-sponsored hacking. Lo scenario attuale vede un crescente numero di attacchi informatici caratterizzati da livelli di complessità elevati, determinati dalla proliferazione di hacker al soldo di governi oppure di malware sviluppati dai governi stessi. Se il crimine informatico preoccupa gli esperti di sicurezza, il nation-state hacking non è da meno. La quasi totalità dei governi è intenta nell’ampliamento del proprio arsenale cibernetico.
Cap.3 Il Rischio Cyber per le Imprese
Vulnerabilità e potenziali attacchi
In questo capitolo vengono elencate le principali tipologie di attacchi e di vulnerabilità che possono essere riscontrate nella pratica, per lo sviluppo sicuro delle applicazioni, nell’ottica di identificare un modello adeguato da utilizzare nella identificazione delle contromisure da adottare per il profilo di sicurezza di una applicazione.
Per realizzare un profilo di sicurezza efficace, sarà infatti necessario conoscere innanzitutto quali sono i potenziali attacchi che più verosimilmente potranno essere riscontrati nell’ambito di una applicazione.
L’identificazione di queste possibili situazioni critiche potrà essere quindi utilizzata secondo un approccio probabilistico nella successiva fase di analisi dei rischi, per la individuazione delle contromisure che più convenientemente sia il caso di adottare.
Un potenziale attacco può essere definito come l’attuazione di una delle possibili minacce per un sistema, mentre la vulnerabilità è una debolezza all’interno del sistema stesso e che rende possibile il verificarsi di quel potenziale attacco.
La vulnerabilità può essere causata da un disegno di analisi non adeguato, da errori di configurazione o da tecniche di programmazione non sicure o inappropriate. Una insufficiente validazione dell’input è un esempio di vulnerabilità a livello di sicurezza delle applicazioni e che potrebbe causare il verificarsi di attacchi tramite input maliziosi.
La distribuzione dei potenziali attacchi suddivisi per categoria di vulnerabilità, come riportato di seguito, fornisce una rappresentazione delle aree dove più frequentemente si verificano problemi in termini di sicurezza delle applicazioni e può costituire uno strumento di supporto da seguire nelle fasi di sviluppo e di analisi.
Categoria di Vulnerabilità
Potenziale attacco
Validazione dell’input
Buffer overflow; Script XSS; SQL injection; Altre forme di iniezione di codice (O.S., LDAP) Canonicizzazione.
Autenticazione
Network eavesdropping; Brute force attacks; Dictionary attacks; Cookie replay; Furto di credenziali.
Autorizzazione
Elevazione di privilegi, Violazione di dati riservati, Accesso a funzionalità non autorizzate Data tampering; Luring attacks.
Gestione della Configurazione
Accessi non autorizzati ad interfacce di amministrazione; Accessi non autorizzati a file di configurazione; Reperimento in chiaro di dati riguardanti la configurazione; Assegnazione di account non individuali; Processi e account del servizio con privilegi troppo elevati.
Categoria di Vulnerabilità
Potenziale attacco
Dati Sensibili
Accesso a dati sensibili in memoria o file system; Network eavesdropping; Data tampering.
Gestione delle Sessioni
Session hijacking; Session replay; Man in the middle.
Crittografia
Gestione o generazione non appropriata delle chiavi; Crittografia debole.
Manipolazione di Parametri
Manipolazione di query string; Manipolazione di campi relativi a maschere di input, inclusi campi hidden; Manipolazione di Cookie; Manipolazione di header HTTP
Gestione delle eccezioni/errori
Information disclosure; Denial of service.
Audit e Log
Negazione di aver effettuato una operazione; Violazione di una applicazione senza lasciare tracce; Cancellazione delle proprie tracce.
Per effettuare in maniera sistematica una identificazione delle possibili minacce per una applicazione, un approccio valido consiste nella verifica delle vulnerabilità che sono ad essa applicabili.
Una volta individuate le vulnerabilità a cui l’applicazione potrebbe essere soggetta, si potranno identificare le possibili minacce, o attacchi potenziali ad essa collegate e le corrispondenti contromisure da adottare.
Validazione dell’Input
In questa categoria ricadono le tecniche di filtraggio di una applicazione che debba accettare dei dati di input, e che portano alla accettazione o al rifiuto degli stessi, dopo averne verificato la validità. Si ha una vulnerabilità di questo tipo ad esempio quando:
un programma non gestisce correttamente un errore di sintassi nell’input;
un modulo accetta parametri di input esterni e arbitrari senza validarli;
un modulo non gestisce correttamente dei campi di input non valorizzati;
un campo non è stato definito correttamente per tipo, numero di caratteri, ecc.
Per gli attacchi che ricadono in questa categoria, dovrebbe essere generalmente applicata una strategia di difesa in profondità, sinteticamente definita in tre passi:
il primo consiste nello stabilire delle limitazioni per accettare in input soltanto dati validi, definendo dei filtri riguardanti tipo, formato, lunghezza e range;
il secondo, rifiutare i dati non validi, è meno robusto del primo dato che non sarà sempre possibile prevedere le eventuali varianti di un input illegittimo;
per il terzo, l’obiettivo consiste nel rendere innocui altri dati potenzialmente dannosi, una tecnica potrà essere ad esempio la eliminazione degli spazi presenti alla fine della stringa di input.
Buffer overflow (Applicabilità: Applicazioni Web Oriented e Client Server). Un Buffer overflow è una situazione di errore che si può verificare durante l’esecuzione di un programma, quando la lunghezza effettiva dell’input supera il suo valore massimo previsto. Un programma avente una vulnerabilità di questo tipo potrebbe essere sfruttato illecitamente, introducendo input di tipo malizioso con lunghezza superiore alle capacità del buffer. Ciò avviene solitamente nell’ambito di una chiamata ad una funzione: in occasione di una CALL, la CPU si preoccupa infatti di salvare in memoria l’indirizzo di ritorno (EIP), per poter riprendere dopo il return l’istruzione immediatamente successiva alla CALL stessa. Se il corrispondente buffer dichiarato in memoria, tipicamente nello stack, viene sovrascritto da una quantità di dati tale da causarne lo “straripamento” in zone di memoria adiacenti, ciò provocherà anche la sovrascrittura dell’indirizzo di ritorno del chiamante, necessario per puntare all’istruzione successiva. In questo contesto, come descritto nell’esempio, sarà possibile sostituire l’indirizzo di ritorno della funzione con un altro indirizzo scelto dall’attaccante, modificando il flusso di esecuzione del programma allo scopo di eseguire codice arbitrario.
XSS – Cross-Site Scripting (Applicabilità: Applicazioni Web Oriented). Un attacco di tipo script XSS, o Cross-Site scripting, consiste nel provocare l’esecuzione di codice arbitrario di tipo HTML e script da esso eseguibili (quali Javascript) attraverso il browser, utilizzando l’applicazione come veicolo per l’attacco. Vulnerabilità XSS si verificano quando un’applicazione presenta all’utente (nel browser) delle informazioni ricevute precedentemente in input qualora queste non siano state opportunamente validate. Se l’input contiene caratteri che, quando sottoposti al browser, rappresentano codice (HTML, Javascript), si ottiene un attacco in cui si provoca l’esecuzione di codice arbitrario, che avverrà nel contesto di sicurezza del browser.
SQL Injection (Applicabilità: Applicazioni Web oriented, Client server). Un attacco di questo tipo consiste nello sfruttare vulnerabilità presenti nel meccanismo di validazione dell’input, al fine di eseguire comandi arbitrari nel database.
Autenticazione
È il processo in cui una entità prova la identità di un’altra entità, tipicamente attraverso credenziali come user name e password, relative ad una applicazione. Gli aspetti fondamentali collegati all’autenticazione riguardano:
la identificazione dei punti in cui richiedere l’autenticazione all’interno dell’applicazione, tipicamente nelle zone che delimitano un’area di ‘Trust’;
la validazione di credenziali, che nelle applicazioni Web vengono trasmesse tramite form HTML (o, meno comunemente per le implicazioni di sicurezza associate, utilizzando schemi quali http basic o digest authentication);
l’assegnazione di un token all’utente per la sua identificazione.
I punti da considerare per una corretta strategia di protezione sono i seguenti:
evitare il passaggio di credenziali ‘in chiaro’ attraverso la rete e utilizzare canali di comunicazione sicuri;
memorizzare i dati relativi alle credenziali in maniera crittografata o utilizzare eventualmente algoritmi di hash;
identificare univocamente l’utente che si è autenticato, proteggendo i suoi cookie di autenticazione.
Network eavesdropping (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di attacco, ossia ‘spiare attraverso la rete’ potrebbe andare a buon fine se le credenziali relative all’autenticazione vengono passate in chiaro dal client al server. I dati HTTP che viaggiano in chiaro nella rete sono soggetti a questo tipo di attacco, che viene perpetrato attraverso software di monitoraggio della rete al fine di intercettare e/o modificare dati riservati. Da tenere in considerazione che il protocollo HTTP impiega solo una semplice codifica Base64 prima di trasmettere le password.
Brute force attack (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di attacco è mirato verso la individuazione automatica delle password o altre informazioni sensibili. L’attacco consiste nella possibilità di ‘craccare’ (to crack = rompere) la password o altre informazioni riservate, codificate con meccanismi crittografici o di hashing, verificando tutte le combinazioni possibili per le informazioni in oggetto (ad es., tutte le combinazioni di username, password).
Dictionary attack (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di attacco è mirato verso la individuazione automatica delle password. Se le password da conservare in memoria vengono codificate tramite un meccanismo di hashing, il meccanismo di autenticazione avviene ricodificando con lo stesso meccanismo la password digitata dall’utente ed effettuando il confronto del valore ottenuto con il corrispondente valore memorizzato nel database. Se un attaccante riesce ad ottenere la lista delle password codificate, potrà cercare di individuare il meccanismo di decodifica (Brute Force). In aggiunta a ciò, un attacco di questo tipo (Dictionary attack) viene perpetrato con l’ausilio di appositi programmi che effettuano delle iterazioni, utilizzando tutte le parole di un dizionario (o di più dizionari di lingua diversa), effettuando poi l’hashing per ognuna delle parole possibili. L’hashing risultante viene poi confrontato con il corrispondente valore del database. Per questo motivo viene sconsigliato l’uso di password troppo semplici.
Cookie replay (Applicabilità: Applicazioni Web Oriented). Con questo tipo di attacco, si cerca di impadronirsi dei cookie di autenticazione dell’utente utilizzando software di monitoraggio, replicandone poi il contenuto per accedere all’applicazione, impersonificando un utente legittimo. Un attacco di questo tipo può verificarsi quando il canale di comunicazione non è cifrato (ad es., si utilizza http) e l’attaccante ha la capacità di osservare traffico in transito dalla vittima.
Furto di credenziali (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Se una applicazione contempla l’uso di propri ‘contenitori’ relativi a credenziali dell’utente, il suo meccanismo di sicurezza potrebbe essere meno robusto di quello fornito dalla piattaforma di riferimento.
Autorizzazione/profilazione
Le autorizzazioni/profilazioni connesse con una applicazione riguardano sia le modalità con cui essa accede a risorse, database e/o operazioni sia se e con quali diritti gli utenti finali accedono a loro volta all’applicazione stessa.
Le principali implicazioni che derivano da vulnerabilità imputabili ad una inappropriata gestione delle autorizzazioni sono:
Elevazione di privilegi (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di attacco, collegato con la fase di assegnazione delle autorizzazioni, consiste nella possibilità che qualcuno possa allargare il proprio campo di azione, utilizzando privilegi non consentiti per il proprio account, come ad esempio i diritti assegnati ad un gruppo di amministratori. L’attacco avviene solitamente in modo indiretto, dato che spesso deve sfruttare altre vulnerabilità (es. un buffer overflow) presenti nell’applicazione per poter essere messo in pratica.
Violazione di dati riservati (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di minaccia riguarda i dati gestiti da una applicazione e consiste nella possibilità di visualizzazione di dati riservati da parte di un utente non autorizzato.
Data tampering (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di minaccia riguarda i diritti assegnati agli utenti e consiste nella possibilità di modifica dei dati da parte di un utente non autorizzato.
Luring attacks (Applicabilità: Applicazioni Web Oriented). Questo tipo di problema, che rientra nella categoria di attacchi che comportano una elevazione di privilegi, consiste nella possibilità, da parte di una entità, di richiamarne un’altra avente privilegi superiori, ossia che consentano di effettuare una certa operazione altrimenti non autorizzata.
Gestione della configurazione
Questa categoria riguarda le applicazioni dotate di interfacce e funzionalità che permettono a sviluppatori, operatori e amministratori di gestire:
parametri di configurazione di un sito web;
contenuti delle pagine Web;
account degli utenti;
informazioni sugli user profile;
stringhe di connessione al database;
routine di manutenzione e amministrazione.
Questo tipo di vulnerabilità potrebbe permettere ad un attaccante di accedere al sito con privilegi di amministratore. Se, ad esempio, un application server è dotato di funzioni di amministrazione remota, un accesso non sicuro alla interfaccia di amministrazione potrebbe permettere l’ingresso e la modifica di qualsiasi informazione.
Accessi non autorizzati ad interfacce di amministrazione (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di minaccia potrebbe riguardare quelle applicazioni dotate di interfacce, interne od esterne all’applicazione stessa, tramite le quali sia possibile effettuare operazioni di gestione e di configurazione.
Accessi non autorizzati a file di configurazione (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questa minaccia riguarda le informazioni contenute nei file di configurazione (o file .ini nelle applicazioni client server) che, a causa della loro natura, devono essere protette da accessi non autorizzati.
Reperimento in chiaro di dati riguardanti la configurazione (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questa minaccia è collegata con la precedente: oltre a riguardare la limitazione degli accessi sui file contenenti dati di configurazione, comporta l’adozione di un meccanismo di difesa in profondità attraverso la crittografia dei dati sensibili/critici o delle stringhe di connessione.
Assegnazione di account non individuali (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questa minaccia riguarda la possibilità da parte di un attaccante di modificare informazioni relative alla configurazione ed all’amministrazione di sistemi e siti e di accedere a dati riservati senza una adeguata tracciabilità delle operazioni e della persona che le ha effettuate attraverso le attività di auditing e logging.
Processi e account del servizio con privilegi troppo elevati (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Un importante aspetto per una corretta configurazione dell’applicazione è rappresentato dall’assegnazione di minimi privilegi agli account di processo usati per esempio per eseguire il processo Web server e gli account di servizio usati per accedere alle risorse e ai sistemi.
Dati sensibili
Questa categoria è soggetta ad una varietà considerevole di possibili tentativi di visualizzazione o modifica di dati riservati, e può riguardare sia dati memorizzati, sia dati che viaggiano sulla rete.
I meccanismi principali per gestire la privacy di queste informazioni sono:
la crittografia;
l’integrità attraverso codici di autenticazione del messaggio (MAC).
Accesso a dati sensibili in memoria (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Network eavesdropping (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Data tampering (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Queste minacce si riferiscono alla possibilità da parte di alcuni utenti malintenzionati di accedere in maniera non autorizzata a dati riservati, memorizzati su qualsiasi tipo supporto.
Gestione delle sessioni
Questo tipo di vulnerabilità costituisce un aspetto critico per una applicazione, e le applicazioni Web in particolare devono utilizzare sessioni per tenere traccia delle richieste di ogni utente: il protocollo HTTP non offre questa funzionalità e quindi ogni applicazione deve implementarla in qualche modo.
Session hijacking (Applicabilità: Applicazioni Web Oriented). La tecnica di questo attacco consiste nell’attendere che qualcuno porti a termine con successo il proprio processo di autenticazione, al fine di sfruttare in seguito la medesima connessione, anche quando il legittimo utente ne ha terminato l’utilizzo.
Session replay (Applicabilità: Applicazioni Web Oriented). Questa minaccia riguarda la possibilità di sfruttare informazioni riguardanti la sessione, intercettate come descritto nel punto precedente, al fine di bypassare il meccanismo di autenticazione. In altre parole è l’utilizzo delle autorizzazioni da parte dell’hacker senza che esse gli siano state date. Se ad esempio il token relativo alla sessione è presente in chiaro all’interno di un cookie o di una URL, potrebbe essere intercettato (Session hijacking) e poi riutilizzato.
Man in the middle (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questo tipo di attacco può riguardare un qualsiasi tipo di richiesta inviata attraverso la rete nel corso di una comunicazione client/server. Consiste nella alterazione dei messaggi nella fase di passaggio fra mittente e destinatario, prima dell’effettivo arrivo a destinazione. Il messaggio falsificato viene accettato come vero dal destinatario, che intraprende le azioni corrispondenti. Analogamente, quando in seguito viene inviata una risposta, anche questa viene falsificata. In tal modo nessuna delle due parti si renderà mai conto di essere stata attaccata.
Session Riding (Applicabilità: Applicazioni Web Oriented). Session Riding, altrimenti detta Cross-Site Request Forgery, rappresenta una classe di vulnerabilità che consente di inviare comandi ad applicazioni web tramite un (inconsapevole) utente, mediante l’invio a quest’ultimo di email o inducendolo a visitare apposite pagine web.
Crittografia
Di fronte all’esigenza di trattare informazioni sensibili dal punto di vista della sicurezza, cosa abbastanza comune per un gran numero di applicazioni, potrebbe essere necessario utilizzare un algoritmo di crittografia. In tal caso, il meccanismo prescelto non dovrà essere utilizzato in maniera impropria. Probabilmente, l’errore più comune è rappresentato da codice di crittografia realizzato autonomamente, solitamente debole e semplice da violare.
È importante assicurarsi che l’algoritmo scelto sia adatto al lavoro che deve svolgere e allo stesso tempo bisogna assicurarsi di usare una giusta dimensione della chiave che garantisca un sufficiente grado di sicurezza. Generalmente più grande è la chiave, maggiore sarà il livello di sicurezza, ma più onerosa la sua implementazione.
Di seguito vengono analizzate le minacce (solitamente sottovalutate) che possono essere sfruttate affinché gli attacchi possano avere successo e quindi compromettere la sicurezza delle applicazioni.
La seguente lista sintetizza gli algoritmi più diffusi e le chiavi che essi implementano:
Data Encryption Standard (DES) chiave a 64 bit suddivisa in 8 blocchi da 8 bit (8 bytes) – Simmetrico (chiave privata);
TripleDES (3DES) chiavi a 128 bit o 192 bit (16 o 24 bytes) – Simmetrico (chiave privata);
Rijndael 128 –256 bit (16-32 bytes) – Simmetrico (chiave privata);
RSA 1024 bit (128 bytes) Asimmetrico (chiave pubblica).
Gestione o generazione non appropriata delle chiavi (Applicabilità: Applicazioni Web Oriented, Client server). Gli utenti malintenzionati possono decriptare i dati se essi hanno accesso alla chiave di encriptyng o possono dedurla. Alcuni utenti malintenzionati potrebbero scoprire le chiavi se le stesse sono generate in maniera non casuale od utilizzando degli algoritmi fai da te. Questo tipo di minaccia, utilizzabile da un attacco, ha una probabilità di fallimento che è direttamente proporzionale alla robustezza del meccanismo di generazione e gestione delle chiavi crittografiche.
Crittografia debole (Applicabilità: Applicazioni Web, Applicazioni Client server). Un algoritmo di crittografia non offre nessuna sicurezza se può essere decodificato, ossia è vulnerabile ad un attacco di tipo “Brute Force”. Gli algoritmi “fai da te” sono particolarmente vulnerabili se non testati adeguatamente. È d’obbligo in questi casi l’utilizzo di algoritmi noti e accuratamente testati. Questo tipo di vulnerabilità ha una probabilità di insuccesso direttamente proporzionale alla robustezza dell’algoritmo di crittografia utilizzato.
Manipolazione di parametri
In questa categoria ricadono le applicazioni Web in cui avvenga un passaggio di parametri fra client e applicazione. Ciò potrebbe riguardare stringhe contenenti query, campi della maschera di input, cookie e header HTTP.
Manipolazione di stringhe contenenti query (Applicabilità: Applicazioni Web). Le stringhe di query sono porzioni di una URL dinamica che contengono parametri per la generazione di una pagina. La manipolazione di questi dati è solitamente una operazione abbastanza semplice e non esistono metodi robusti per prevenirla, soprattutto se i parametri vengono passati tramite una HTTP GET da client a server, che provoca la loro successiva visualizzazione all’interno della URL.
Manipolazione di campi relativi a maschere di input (Applicabilità: Applicazioni Web). Quando un utente inserisce dati in una pagina HTML, questi vengono solitamente memorizzati come valori di campi del form e inviati in chiaro all’applicazione come una richiesta HTTP (GET o POST). Questi campi potrebbero essere modificati per bypassare le routine di validazione del client e la manipolazione potrebbe riguardare tutti i campi presenti nel form, compresi quelli nascosti.
Manipolazione di Cookie (Applicabilità: Applicazioni Web). I cookie sono un conveniente meccanismo di memorizzazione delle preferenze utente e di altri dati, fra cui i session token. Esistono due diverse tipologie di cookie:
Cookie persistenti;
Cookie non-persistenti
I cookie di tipo persistente sono memorizzati in file di testo che si trovano sul client, e sono validi per un determinato periodo, stabilito in base alla corrispondente data di scadenza. I cookie di tipo non-persistente sono memorizzati sul client nella RAM, e vengono cancellati quando il browser viene chiuso oppure il cookie viene terminato da uno script di logoff. Entrambe le tipologie sono suscettibili a manomissioni da parte del client, che li invia successivamente al server effettuando richieste tramite header HTTP, ad esempio per ottenere l’accesso ad un sito Web, oppure utilizzando Javascript.
Manipolazione di header http (Applicabilità: Applicazioni Web). Gli header HTTP sono informazioni di controllo, che vengono scambiate fra client e Web server nelle richieste HTTP. Gli header relativi al client vengono solitamente indicati come request header, mentre i response header sono quelli relativi al server. Il cookie può essere considerato un esempio di response header. Queste informazioni sono solitamente contenute in una riga ASCII di testo, ed hanno un nome ed un valore. Normalmente, i web browser non consentono la modifica degli header, e un attaccante dovrà scrivere un apposito programma che effettua la richiesta HTTP, oppure utilizzare degli strumenti facilmente reperibili in rete, che consentono di modificare i dati inviati dal browser (proxies).
Gestione delle eccezioni/errori
Una corretta gestione degli errori non deve esporre informazioni sulla struttura interna dell’applicazione ad eventuali attacchi. Le applicazioni che non effettuano una corretta gestione delle eccezioni sono vulnerabili da questo punto di vista.
Information disclosure (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Con questo tipo di attacco si cerca di provocare un errore dell’applicazione, al fine di ottenere informazioni riguardanti l’applicazione stessa, come ad esempio: versione della piattaforma, nomi di server, stringhe contenenti comandi SQL, e stringhe di connessione al database.
Denial of Service (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Un attacco di questo tipo viene solitamente effettuato inviando intenzionalmente un input errato ad una applicazione. Questo per due scopi principali:
causare un errore che riveli informazioni di dettaglio sull’applicazione;
provocare il crash dell’applicazione o di una sua componente.
Se tutte le eccezioni non sono state opportunamente catturate e gestite, questa eventualità potrebbe verificarsi.
Audit e Log
L’audit è una tecnica che permette di determinare e scoprire a posteriori le violazioni sulla sicurezza e si basa sulla creazione di log (di solito file) in cui registrare gli eventi e/o statistiche che una entità effettua sul sistema in oggetto. Questo tipo di tecnica dovrebbe essere utilizzata per individuare, riparare e possibilmente prevenire il maggior numero possibile di attività illecite. I log forniscono un meccanismo per analizzare lo stato di sicurezza del sistema, anche per determinare se un’azione richiesta metterà il sistema in uno stato non sicuro o per determinare la sequenza degli eventi che conducono il sistema in uno stato di non sicurezza.
Si raccomanda di registrare almeno le azioni riguardanti le seguenti tipologie di eventi delle applicazioni:
lettura dati sensibili;
scrittura dati sensibili;
cancellazione di ogni tipologia di dato;
tutti gli eventi di autenticazione (login, logout, e log failure)
tutti i tentativi di modifica autorizzazioni includendo data e ora, se è avvenuto con successo o è stato rifiutato, la risorsa o la funzione alla quale si autorizza, e l’utente che ha chiesto l’autorizzazione.
Si riportano i problemi che possono far sì che il meccanismo di log non possa fornire le informazioni necessarie per stabilire lo stato di sicurezza del sistema.
Negazione di aver effettuato una operazione (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). L’attacco consiste nella possibilità di ripudio di una azione o di una transazione che è realmente avvenuta facendola apparire come se non fosse mai stata eseguita.
Violazione di una applicazione senza lasciare tracce (Applicabilità: Applicazioni Web Oriented, Client server, MainFrame). Questa minaccia consiste nell’attacco a un’applicazione utilizzando uno dei metodi descritti in precedenza senza che ci sia conoscenza del cambiamento sullo stato del sistema.
Vediamo ora alcuni delle minacce più diffuse:
Defacement
Il web defacement è la modifica non autorizzata di come visivamente appare un sito web. Tale azione è ormai un elemento ricorrente in Internet e le motivazioni che spingono un attaccante ad agire in questo modo sono molteplici, incluse la dimostrazione di abilità, le ragioni ideologiche, la truffa ed il ricatto con implicazioni prevalentemente di danno economico. La gravità di questo problema è ormai diventata incontrovertibile, come dimostrato da numerosi dati di fatto. Attacchi di questo genere sono ormai effettuati in maniera automatizzata ed in larga scala, in modo analogo a quanto avviene con la propagazione dei virus e degli worm. I contenuti originari vengono sostituiti con testi e/o immagini irridenti e critici, a volte “nonsense” (o apparentemente tali).
Un defacement mina la credibilità del sito colpito, che dimostra di essere vulnerabile. Pur interferendo con la comunicazione del sito colpito, il danno non è permanente. La modifica del sito web viene effettuata ottenendo un accesso al server che lo ospita.
Attacchi di Denial of Service (DoS) e Distributed Denial of Service (DDoS)
La sigla DoS di Denial of Service si traduce letteralmente in negazione del servizio. Si tratta di un malfunzionamento dovuto ad un attacco informatico in cui si esauriscono deliberatamente le risorse di un sistema informatico che fornisce un servizio, ad esempio un sito web, fino a renderlo non più in grado di erogare il servizio. Alcuni mirano solo ad un servizio, ad esempio Web, SMTP, FTP, etc., altri invece mirano a mettere fuori uso completamente il server o, addirittura, un’intera rete.
Gli attacchi DDoS (Distributed Denial of Service) amplificano la portata di tali minacce.
Gli attacchi di tipo DDoS sono molto più insidiosi da bloccare perché:
la potenza dell’attacco (volume dei dati trasmessi, banda occupata, etc.) è maggiore, di vari ordini di grandezza, rispetto a quella possibile attraverso un DoS;
è praticamente impossibile bloccare l’attaccante nella considerazione che sono decine di migliaia di computer infetti che perpetrano l’attacco;
è praticamente impossibile riconoscere il traffico autorizzato da quello non autorizzato, visto che i computer partecipanti alla botnet sono dislocati, praticamente in tutto il globo.
Attacchi man in the middle.
Consistono nell’intercettazione da parte dell’attaccante della comunicazione legittima in corso tra due attori. Tramite diverse tecniche, che si differenziano attraverso la tipologia di connessione in corso, l’attaccante osserva lo scambio di informazioni tra le due parti, e al momento più opportuno si sostituisce a una delle due per ottenere quanto desidera.
Un classico esempio di questa tipologia di attacco, che sta mietendo sempre più vittime anche in Italia, viene denominato man in the mail: a seguito della violazione dell’account di posta di uno dei due attori coinvolti, l’attaccante è in grado di assistere alle conversazioni email. In questo modo egli può carpire quante più informazioni sulle persone coinvolte e al momento opportuno sostituirsi ad una di esse in maniera esemplare. L’unico modo per evitare il verificarsi di tali truffe è chiedere una conferma certa da parte del ricevente e in caso di dubbi stoppare l’attività di bonifico.
Malware
Il termine malware indica genericamente un qualsiasi software creato con il solo scopo di causare danni più o meno gravi ad un computer, ai dati degli utenti del computer, o a un sistema informatico su cui viene installato. Si conoscono molte categorie di malware, anche se spesso questi programmi sono composti di più parti interdipendenti e rientrano pertanto in più di una classe. Tra questi i più frequenti sono:
Virus: sono parti di codice che si diffondono copiandosi all’interno di altri programmi, o in una particolare sezione del disco fisso, in modo da essere eseguiti ogni volta che il file infetto viene aperto. Si trasmettono da un computer a un altro tramite lo spostamento di file infetti ad opera degli utenti;
Worm: il loro scopo è rallentare il sistema con operazioni inutili o dannose;
Trojan horse: software che contengono istruzioni dannose che vengono eseguite all’insaputa dell’utilizzatore, per diffondersi devono essere consapevolmente inviati alla vittima;
Backdoor: consentono un accesso non autorizzato al sistema su cui sono in esecuzione;
Spyware: software che vengono usati per raccogliere informazioni dal sistema su cui sono istallati e per trasmetterle ad un destinatario interessato, le informazioni carpite possono andare dalle abitudini di navigazione fino alle password e alle chiavi crittografiche di un utente;
Dialer: questi programmi si occupano di gestire la connessione ad Internet tramite la normale linea telefonica, possono essere utilizzati in modo illecito, modificando il numero telefonico chiamato dalla connessione predefinita con uno a tariffazione speciale, allo scopo di trarne illecito profitto all’insaputa dell’utente;
Hijacker: questi programmi si appropriano di applicazioni di navigazione in rete (soprattutto browser) e causano l’apertura automatica di pagine web indesiderate;
Keylogger: sono dei programmi in grado di registrare tutto ciò che un utente digita su una tastiera o che copia e incolla rendendo così possibile il furto di password o di dati che potrebbero interessare qualcun altro.
Il loro numero e la varietà, unite alla loro rapida evoluzione ed obsolescenza non consentono di classificarli al fine di raggiungere una loro tipizzazione sanzionatoria. La Convenzione di Budapest ha quindi evitato deliberatamente di sanzionare specificamente le varie forme di malware, anche soltanto limitandosi alle tipologie più ricorrenti, al fine di evitare la rapida perdita di attualità delle norme ivi contenute. Tuttavia è possibile ricondurre anche i malware sotto specifiche disposizioni della Convenzione avendo riguardo alla funzionalità ed ai danni prodotti dai malware che sono, invece, suscettibili di catalogazione e di tipizzazione normativa. Vengono in considerazione le norme[6] che sanzionano l’accesso abusivo, l’interruzione e l’intercettazione di comunicazioni telematiche, le varie forme di danneggiamento aventi ad oggetto dati, programmi o sistemi, le norme che sanzionano la disponibilità e la cessione a terzi di programmi realizzati al fine di accedere illegalmente a computer e sistemi protetti ovvero al fine di danneggiarli, i programmi concepiti per l’alterazione e la falsificazione di informazioni presenti in banche dati pubbliche o private, i malware specificamente progettati per recare un danno economico e conseguire un profitto tramite l’interferenza sul funzionamento di computer o sistemi.
Advanced Persistent Threats
L’anno 2014 è stato caratterizzato da numerosi attacchi del tipo Advanced Persistent Threat (APT), basati su malware già noti in passato ma riutilizzati secondo una nuova connotazione. Gli APT sono schemi di attacco articolati, mirati a specifiche entità o organizzazioni, e che si contraddistinguono per un accurato studio del bersaglio preventivo e che spesso continua anche durante l’attacco, per l’impiego di tool e malware sofisticati e per la lunga durata o persistenza nel tempo cercando di rimanere inosservati per continuare a perpetrare quanto più possibile il proprio effetto.
Crimini di identità
Il nuovo contesto tecnologico, la diffusione capillare di Internet e fenomeni quali i social network hanno fatto sì, infatti, che l’attenzione dei criminali si rivolgesse verso nuove forme di cybercrime che hanno ragione di esistere in quanto sfruttano l’immaterialità del cyberspace.
Questa nuove forme di crimini informatici si sostanziano in abusi di profili identitari altrui nel cyberspace, ovvero il furto d’identità digitale, il phishing, l’abuso di identità “virtuale”, le frodi identitarie, fenomeni questi che possono essere ricondotti nella categoria generale degli “identity crime”.
Tale categoria comprende in pratica tutte quelle condotte delittuose che comportano una aggressione all’identità digitale altrui, dovendosi intendere con tale espressione quell’insieme di informazioni presenti online e relative ad una persona, un ente, un brand, ecc.
I crimini di identità si dividono in due categorie: i furti d’identità, cioè la sottrazione di dati personali di persone esistenti o decedute e le frodi d’identità, cioè la creazione di un’identità fittizia, basata su dati falsi o manomessi (mescolando dati reali di più persone).
La tecnica più diffusa per il furto di identità è il phishing: può essere definito come “una metodologia di comportamento sociale indirizzata a carpire informazioni personali o abitudini e stili di vita”. Attraverso tale tecnica si induce l’utente a fornire dati personali che consentono l’accesso ad informazioni riservate.
Social Engineering. La dissimulazione disonesta: l’ingegneria sociale
Non importa di quali tecnologie di sicurezza sia dotata un’azienda, l’investimento in soluzioni all’avanguardia potrebbe essere inficiato dal comportamento di un solo utente, manipolato con un attacco di ingegneria sociale. Non esiste alcuna tecnologia che permetta di prevenirlo o di difendersi. Per esserne immuni è necessario essere addestrati.
L’ingegneria sociale è in generale l’arte di indurre le persone a compiere determinate azioni dissimulando il reale obiettivo dell’attacco. L’ingegnere sociale è abile a mascherare la propria identità, fingendosi un’altra persona: in tal modo, attraverso la conversazione o altre interazioni, riesce a ricavare informazioni che altrimenti non otterrebbe.
In ambito security il social engineering viene utilizzato come metodo di intrusione e spesso l’attività di social engineering è strettamente collegata a quella di phishing. L’evoluzione del cybercrime negli ultimi anni evidenzia la tendenza all’utilizzo congiunto di tecniche avanzate di malware e social engineering per lanciare attacchi sempre più sofisticati e difficili da prevedere o rilevare, tali da provocare danni ingenti e a volte irreparabili ai sistemi di sicurezza aziendali, con conseguenti perdite economiche, perdita di dati sensibili e informazioni strategiche, danno alla reputazione.
Operazioni estorsive. Cifratura di file con ransomware
Questa tipologia di attacchi si sta evolvendo e raffinando sempre più. Il metodo di diffusione più comune è quello dell’email, che viene camuffata ad arte per assomigliare ad esempio ad una fattura o ad un ordine di un potenziale cliente. Il fine dell’attaccante è quello di indurre l’utente ad eseguire il download dell’allegato presente sulla mail ricevuta, in modo tale da poter eseguire l’installazione del virus sulla macchina target. Una volta installato, il ransomware esegue una cifratura di quanti più file riesce a infettare, includendo non solo la macchina locale su cui è stato scaricato, ma anche le eventuali cartelle condivise. Per ottenere la chiave di decifrazione la vittima deve pagare un riscatto, solitamente sotto forma di Bitcoin, la moneta digitale utilizzata sempre più dai cybercriminali per le transazioni di questo genere, in quanto difficilmente rintracciabili.
Ultimamente questo tipo di ransomware (locker-ransomware), è stato gradualmente soppiantato da un più insidioso crypto-ransomware, codici che criptano i soli documenti lasciando però accesso al sistema che invece risulterà vuoto e chiedendo un riscatto (generalmente nell’ordine delle centinaia di dollari) per riottenere i documenti in chiaro.
Questa particolare forma di malware è cresciuta di molto anche grazie alla diffusione di servizi di ransomware as a service gestiti da gruppi criminali che affittano servizi completi di ransomware a chi decide di gestire in proprio le campagne di estorsione informatica.
Attacchi alle infrastrutture Cloud
L’utilizzo del Cloud computing ha introdotto nuove sfide che aziende e organizzazioni di ogni tipo e dimensione hanno la necessità di affrontare. Le politiche e procedure disegnate attraverso esperienze decennali nella gestione delle minacce on-premise[7], continuano ad avere la loro validità anche negli ambienti public e hybrid cloud, ma non sono più sufficienti: c’è la forte necessità per i team di sicurezza di mantenersi aggiornati sulle nuove tipologie di minacce che il cloudcomputing deve affrontare, per definire la migliore strategia di protezione. Tali minacce possono essere introdotte da caratteristiche peculiari dei servizi cloud o per effetto dell’interconnessione tra l’ambiente on-premise con quello cloud.
Strategia di un attacco
Per individuare le vulnerabilità all’interno di una applicazione possono essere sfruttate diverse forme di interazione, i cui passi principali sono:
controllo e identificazione: l’obiettivo dell’attacco viene studiato al fine di identificare congiuntamente le caratteristiche di una applicazione, ossia ad esempio i servizi ed i protocolli utilizzati, le corrispondenti vulnerabilità e punti di accesso. In primo luogo si potrà simulare il normale utilizzo da parte di un utente e a tale scopo sarà sufficiente un qualunque client http;
infiltrazione: dopo aver studiato ed identificato l’obiettivo, il passo successivo sarà quello di cercare una strada che permetta di infiltrarsi nel sistema. Se la sicurezza della rete e la sicurezza dell’host saranno state ben salvaguardate, sarà presa di mira la sicurezza delle applicazioni;
appropriazione di privilegi: dopo aver trovato una via di ingresso, il prossimo passo potrebbe consistere nel tentativo di ottenere diritti di accesso ancora più elevati, per allargare il proprio campo di azione. Se nella corrispondente gestione della configurazione sono stati previsti processi e account del servizio con privilegi troppo elevati, ciò faciliterà questa tipologia di intervento. Per questo motivo il principio del minimo privilegio resta sempre una contromisura molto importante da adottare;
mantenimento di un accesso: dopo aver ottenuto l’accesso ad un sistema, si cercherà di mantenerlo, provvedendo anche a semplificarlo per il futuro ed a cancellarne le tracce. Un esempio potrebbe consistere nell’installazione di programmi di back-door, che lasciano aperta la strada o anche nella scelta di un account adatto. Per coprire le proprie tracce, sarà poi effettuata una pulizia dei log, che costituiscono un altro potenziale obiettivo di attacco ed è per questo motivo che i file di log dovrebbero essere salvaguardati ed analizzati sistematicamente;
negazione del servizio (Denial of Service): alcuni attaccanti che non riescano ad ottenere l’accesso ad un sistema, spesso cambiano obiettivo, cercando di impedire agli utenti legittimi di utilizzare l’applicazione, per altri ancora, questo può essere invece l’obiettivo primario.
Cap.4 Le Investigazioni Digitali
Lo “stato” della digital forensics in Italia si è, negli ultimi anni, evoluto sensibilmente e, fortunatamente, in maniera abbastanza omogenea. Sin dagli anni duemila, la scienza che studia la corretta identificazione, acquisizione, produzione e, in senso lato, “resistenza” in giudizio della fonte di prova digitale ha vantato anche in Italia uno sviluppo lineare che ha riguardato tutti i settori coinvolti, nessuno escluso: il mondo dell’accademia, le Forze dell’Ordine, la magistratura e l’avvocatura e il mondo dei consulenti, dei tecnici, degli esperti, delle associazioni e delle aziende che producono software ed hardware per la digital forensics (soggetti, questi, giustamente più votati a un approccio alla materia tecnico e d’immediata utilità, compresa la formazione nell’utilizzo di tali strumenti, sovente complessi). Ciò ha portato a uno sviluppo equilibrato del settore, cosa molto utile e apprezzabile in un ambito che viene a toccare, come è noto, i diritti fondamentali dell’individuo.
Prova digitale: «È da considerarsi prova digitale il dato e la rispettiva informazione avente valore probatorio, ricavati da un accertamento tecnico-scientifico di tipo informatico, svolto nell’ambito di un procedimento penale o civile.»
L’aspetto più importante, e che è divenuto la questione centrale, è che la digital forensics ha intaccato alcuni concetti base ritenuti universalmente validi in ambito legale, i quali devono essere in qualche modo ricodificati o quantomeno riadattati all’inarrestabile evoluzione tecnologica del mondo digitale.
Ad esempio…
La dematerializzazione
In generale il processo di dematerializzazione è stato largamente introdotto quando, anche la PA, ha cercato di trasformare l’enorme massa di documentazione cartacea in suo possesso in file su una memoria di massa digitale.
A questo va aggiunto che si è cercato non solo di implementare l’archiviazione in tal senso, ma anche le procedure, spostando le attività umane su flussi descritti e contenuti in complessi database (archivi elettronici) e software basati su articolate reti di computer.
Il completo processo di dematerializzazione, però, e mi riferisco in Italia, impiegherà lunghi periodi, lasciando ancora alla carta un centralissimo ed indiscutibile compito in qualsiasi ambito documentale e procedurale.
Uno dei motivi fondamentali di tale difficoltà di avanzamento è la mancanza di fiducia verso il digitale, che ha sicuramente mostrato la sua pervasività ed indispensabilità, ma ha parimenti evidenziato un’assoluta incapacità di gestire sicurezza, affidabilità e disponibilità dei dati:
sicurezza: stabilire chi (identità) è autorizzato a fare cosa (attività) e con quali dati (informazioni) ed evitare che non autorizzati svolgano procedure o accedano a dati loro vietati. Non esiste ad oggi un sistema tecnico completamente sicuro per i sistemi digitali, soprattutto quando sono in rete, è indispensabile una politica di gestione della sicurezza che coinvolga anche le persone;
affidabilità: garanzia che i dati registrati restino integri nel tempo. La maggior parte delle memorie digitali si danneggia con frequenza molto più alta della carta, che resta il supporto di memoria al momento più longevo;
disponibilità: garanzia che i dati restino disponibili agli autorizzati quando questi lo richiedono. Spesso tra guasti di sistema, difficoltà di connessione, ecc. i dati, pur essendo presenti in una rete complessa, non sono disponibili.
Succede poi che in Italia sicurezza, affidabilità e disponibilità vengono percepiti come costi sia dalle PA che dalle aziende e non come investimenti e quindi si cerca di “spenderci il meno possibile” conseguendo sistemi deboli e mediamente mal funzionanti che vengono rafforzati solo nelle aree in cui non se ne può fare a meno (es. aree riservate o critiche).
La dematerializzazione nella digital forensics
Nella digital forensics i problemi appena visti per la dematerializzazione in generale, non solo esistono, ma sono rafforzati dalla pesantezza e rilevanza dell’attività considerata che è quantomeno un’indagine civile/penale. Ogni volta infatti che si devono affrontare questioni critiche in cui si rischiano grosse ripercussioni per degli errori è naturale irrigidirsi. Si può passare immediatamente a considerare l’aspetto digital forensics centrale di tale faccenda mediante un esempio base di semplice e diretta comprensione. Qualora un PC contenga nella sua memoria di massa (hard disk) alcuni dati di estremo interesse, per un’indagine di PG nei confronti del suo possessore, se ne può disporre il sequestro (fisico) per poi consentire ad un CT di svolgere un’analisi forense approfondita consegnandogli l’oggetto. La domanda però è perché disporre un sequestro fisico dello strumento quando NON si è interessati a tutto quello che contiene ma solo ad alcuni dati in esso registrati.
In definitiva si è stabilito un nuovo concetto di sequestro virtuale in cui l’oggetto del sequestro non è la “cosa” ma il “dato”. Va dunque distinto il “contenitore” rispetto al “contenuto”.
Il punto massimo sul reperto virtuale e sulla dematerializzazione, lo si ha con i sistemi cloud. In breve un cloud system è un sistema che usa Internet come semplice rete di appoggio, combinando il lavoro di migliaia di server in tutto il mondo, ciò a determinare una serie di servizi.
Il computer virtuale su cloud o computer remoto è un intero sistema di elaborazione che NON esiste fisicamente ma solo virtualmente (è definito scientificamente macchina virtuale distribuita). Il suo sequestro può essere SOLO di natura virtuale ed il reperto che ne consegue è un insieme di dati che difficilmente potrà sussistere solo in un hard disk.
In altre parole NON è sempre possibile registrare questa fonte di prova su una nostra memoria locale, tale contenitore non è adeguato. L’unico modo di gestire la situazione è lasciare il computer virtuale nel cloud e chiedere al gestore del cloud di “congelarlo” lì dove si trova, ad esclusivo uso di PG ed AG e dei loro CT e periti.
Cyberspace vs. “domicilio informatico”
A differenza di circa venti anni fa, l’investigatore moderno volente o nolente si trova proiettato ad indagare in un mondo parallelo ed intangibile che costituisce di fatto una sorta di quinta dimensione, ossia il cyberspace. Ma cosa s’intende con tale termine di origine anglosassone? Una definizione formale ed esaustiva l’ha fornita la ISO 27032:2012, la quale ha sancito che è intendersi come “l’ambiente virtuale generato dall’interazione tra persone, software e servizi Internet ottenuti attraverso l’uso di sistemi informatici e telematici interconnessi tra loro.
Attualmente tale ambiente operativo non è formalmente definito in specifiche norme del nostro sistema giudiziario, ma oramai per consuetudine possiamo dire che esso è assimilato al concetto di “domicilio informatico” sancito dalla nostra Suprema Corte nel seguente modo: “… deve ritenersi “domicilio informatico” …quello spazio ideale (ma anche fisico in cui sono contenuti i dati informatici) di pertinenza della persona, cui si estende la tutela della riservatezza della sfera individuale, quale bene anche costituzionalmente protetto (art. 15 Cost.)…”[8].
Alla luce di tale asserto, possiamo senza dubbio dire che attualmente l’ordinamento penale conosce un duplice significato del termine “domicilio”:
uno in senso reale, inteso come “spazio ideale di pertinenza della persona, al quale estendere la tutela della riservatezza della sfera individuale, quale bene anche costituzionalmente protetto (art. 14 Cost.)”[9];
uno in senso virtuale, che si differenzia dal primo per la morfologia del perimetro, il quale è caratterizzato da una “geometria variabile” nella disponibilità diretta della parte. Dalla dinamicità di tale ambiente deriva che il suo contenuto informativo non necessariamente coincide con quello del dispositivo fisico assicurato, ma può essere distribuito anche in aree diverse dal territorio nazionale[10], come ad esempio il cloud[11], il cui paradigma ha di fatto stravolto il “modus investigandi” che si era consolidato nel tempo.
L’impatto del Cloud Computing nell’attività investigativa
Come noto il principale problema derivante dalle indagini in materia di criminalità informatica in Internet è l’ “aterritorialità”.
Si pongono dunque problemi che si collocano a diversi livelli:
livello investigativo: ampio terreno da monitorare;
livello procedurale: chi è competente a fare cosa;
livello di diritto penale: a quale legge penale, di quale Stato, bisogna fare riferimento.
Tali difficoltà vengono ulteriormente amplificate quando l’attività antigiuridica viene realizzata per mezzo dei servizi c.d. “cloud based” (es. Social Network, Cloud Storage, ecc.) i quali sono fortemente caratterizzati da elementi come:
ubiquità, specie da parte di client leggeri come quelli previsti per i dispositivi mobile (es. smartphone, tablet, ecc.). A riscontro basti pensare che, mentre la Polizia Giudiziaria sta attuando una perquisizione informatica in un account Google, ancorché in presenza della parte, un soggetto terzo potrebbe contemporaneamente accedere e modificare, se non cancellare del tutto, gli elementi di prova utili per le indagini vanificando/compromettendo l’esito della stessa;
“depemetralizzazione” e condivisione delle risorse secondo un modello multitenant (letteralmente, “con più affittuari” – es. cartelle o file condivisi). In tale modello le risorse fisiche e virtuali sono assegnate e riassegnate dinamicamente ai consumatori, sulla base delle loro esigenze (es. un documento GDoc scritto e revisionato da più soggetti). C’è inoltre un’indipendenza dalla locazione, in cui si trovano di fatto i consumatori e chi gli fornisce il servizio (CSP – Cloud Service Provider) infatti questi, per quanto appreso, non hanno né il controllo né la conoscenza dell’ubicazione geografica delle risorse utilizzate. È tuttavia possibile che i CSP abbiano il controllo sulla locazione a un livello di astrazione più alto, ad esempio la nazione (spesso questo è necessario per motivi prevalentemente legislativi);
ridondanza, come una risorsa complessa può essere distribuita in più datacenter, altrettanto la stessa può essere ripetuta più e più volte per bilanciare il carico di lavoro del CSP.
Accertamenti informatici in ambito aziendale
Le attività investigative che vedono coinvolti sistemi informatici e/o telematici possono essere svolti anche in ambito aziendale, il cui contesto operativo necessita di accorgimenti diversi dalla privata dimora.
Ricerca Informativa
Al fine di circoscrivere e dettagliare nella maniera più precisa possibile sia l’area fisica che virtuale della scena criminis, gli eventuali sospettati, nonché gli elementi di reato, si rende necessario dapprima assumere informazioni da chi ricopre il ruolo di “responsabile dei sistemi informativi”[12] circa “policy aziendali” in materia di:
sicurezza fisica, relativamente, ad esempio:
all’esistenza di apparati di videosorveglianza e rispettivo periodo di data retention[13];
policy di accesso all’edificio (es. accesso tramite badge);
eventuale gestione in outsourcing (società terze) per la manutenzione dei sistemi precedentemente elencati;
sicurezza logica, relativamente, ad esempio:
alla mappatura dell’infrastruttura di rete (subnet[14], assegnazione statica o dinamica degli IP[15], antivirus, firewall[16], IDS[17], DMZ[18] ecc.);
regola di accesso al sistema telematico, ossia solo in locale (intranet) o anche da remoto (extranet);
ai criteri di autenticazione (es. password, two step verification[19], strong authentication[20]) e rispettivi permessi (amministratore, operatore di sistema, ecc.) degli utenti accreditati al sistema informatico aziendale;
presenza di sistemi di cifratura degli hard disk (es. BitLocket, File Vault, Volumi crittografici, ecc.) ed acquisizione delle rispettive passphrase;
presenza di un CSIRT[21] ed eventuali ticket aperti nel periodo di interesse per le indagini;
metodi di logging e rispettivo periodo di data retention[22] di ciascun sistema di sicurezza;
eventuale gestione in outsourcing (società terze) per la manutenzione dei sistemi precedentemente elencati.
Tali dichiarazioni potranno trovare riscontro dalla consultazione del Documento di valutazione rischi, ovvero del Modello di organizzazione e gestione.
Le misure tecniche
Da un punto di vista meramente pratico, le misure tecniche da adottare sui dati, informazioni e programmi ritenuti di interesse per le indagini, potranno essere attuate seguendo le raccomandazioni fornite dall’ISO 27037:2012. Tale documento definisce sia chi sono i soggetti, che le tecniche di acquisizione che questi potranno adottare sulla scena del crimine aziendale nel pieno rispetto dei principi giuridici e requisiti investigativi riconosciuti su scala transnazionale.
In ambito internazionale vengono identificate le seguenti figure professionali, quali soggetti devoluti alla gestione delle fonti di prova digitali rinvenute sulla scena del crimine informatico:
DEFR (Digital Evidence First Responder – ISO 27037:2012 Pt. 3.7), questi viene coinvolto nelle fasi di identificazione, repertamento e/o acquisizione e preservazione della fonte di prova digitale. Tale figura professionale non dovrebbe necessariamente svolgere un’attività di analisi.
DES (Digital Evidence Specialist – ISO 27037:2012 Pt. 3.8), questi fornisce supporto tecnico al DEFR nelle fasi di identificazione, repertamento e/o acquisizione e preservazione delle fonti di prova digitale. Il DES deve essere caratterizzato da una formazione di tipo accademico e di comprovata esperienza nel settore tecnico-investigativo.
L’operato di tali soggetti deve avvenire nel rispetto dei seguenti principi e requisiti comuni alla maggior parte dei sistemi giurisdizionali internazionali:
rilevanza/pertinenza (relevance): secondo cui bisogna dimostrare di aver acquisito e/o repertato solo elementi di pertinenza con il contesto d’indagine, avendo cura di motivarne le ragioni;
affidabilità/attendibilità (reliability): secondo cui ogni processo che caratterizza la scena del crimine informatico dovrebbe essere verificabile e ripetibile. L’attuazione di tali processi dovrebbe garantire l’intera riproducibilità dell’attività tecnico-investigativa;
sufficienza/proporzionalità (sufficiency): in cui il DEFR si assicura di avere a disposizione sufficiente materiale su cui svolgere le indagini;
verificabilità (auditability): secondo cui dovrebbe essere possibile per una parte terza, autorizzata dall’A.G. (es. il Consulente Tecnico), poter accertare tutte le attività poste in essere sia dal DEFR che dal DES sulla scena del crimine informatico;
ripetibilità (repeatability): secondo cui si producono gli stessi risultati con lo stesso test nello stesso ambiente;
riproducibilità (riproducibility): secondo cui si producono gli stessi risultati con ambiente diverso, quindi anche tool diversi;
giustificabilità (justifiability): secondo cui il DEFR dovrebbe essere in grado di poter giustificare la metodologia attuata per quel particolare contesto investigativo caratterizzato da vincoli giuridici, tecnologici e logistici, oltreché di competenze tecniche dello stesso operatore.
Ricostruzione degli eventi
La differenza sostanziale tra le indagini classiche e quelle in materia di criminalità informatica in Internet è l’ “aterritorialità”.
Tale vincolo solleva problemi a diversi livelli:
territoriale: assenza di confini ben definiti;
livello processuale: chi è competente a fare cosa;
legislativo: Autorità Giudiziaria competente ad indagare o giudicare.
Tali elementi, uniti a vincoli di carattere tecnologico, ostacolano, se non rendendo impossibile, l’operazione di ricostruzione del percorso utilizzato dall’autore del reato, non consentendo così l’individuazione della postazione dalla quale è stato posto in essere il comportamento illecito.
A tale risultato potrà pervenirsi unicamente seguendo a ritroso il cammino dell’informazione illecita, dal destinatario ad un provider (sovente con sede all’estero), e da questi sino al client dell’autore del reato.
Nel caso in cui la postazione sia nella disponibilità di più soggetti, sarà necessario correlare l’attività tecnico-investigativa con gli elementi di prova[23] ricavati con modalità classica, al fine di dimostrare una disponibilità univoca del mezzo di un determinato lasso temporale.
Qualora bisognasse svolgere operazioni di analisi inerente un sistema di rete può essere conveniente, in prima approssimazione, suddividere le tematiche legate al Network Forensics in due classi, a seconda si tratti di live analysis o post mortem analysis, per una collocazione nell’ambito codicistico penale procedurale che separi, seppur in modo non esaustivo, lo stato pre – e post – discovery.
In ottica post mortem delle attività correlate all’utilizzo per fini criminali della rete, a contrario del contesto del mondo reale, si avranno a disposizione generalmente solo pochi ed incerti elementi:
indirizzo IP[24] (dove IP sta per Internet Protocol) è l’elemento fondamentale che permette, all’interno di una rete di calcolatori, di individuare un nodo della rete stessa. Gli indirizzi IP sono utilizzati dal protocollo IP per gestire l’instradamento delle comunicazioni tra tutte le macchine connesse a Internet;
i file di log, sul quale registrati gli eventi in ordine cronologico (consente di stabilire: un determinato utente in un particolare giorno ed ora si è collegato alla rete tramite un provider; data ed ora della sessione di navigazione; quale indirizzo IP temporaneo ha avuto in assegnazione per la durata della connessione; l’indirizzo IP utilizzato per la sessione di navigazione; quali informazioni ha inviato o ricevuto per mezzo dell’indirizzo IP assegnato; anagrafica dell’intestatario di un contratto di utenza Intenet);
l’URL, l’Uniform Resource Locator, è una sequenza di caratteri che identifica univocamente l’indirizzo di una risorsa in Internet, come ad esempio un documento o un’immagine.
Risposta alle intrusioni
Nel caso in cui si è vittima di un accesso abusivo nella propria infrastruttura, di seguito vengono proposte le procedure di risposta alle intrusioni:
analisi di tutte le informazioni disponibili che caratterizzano una intrusione:
registrazione di tutte le informazioni che possono essere perse o non registrate durante una procedura di backup (connessioni di rete correnti, processi attivi o ibernati, utenti connessi, file aperti, informazioni volatili);
backup dei sistemi compromessi: realizzare almeno due backup completi dei sistemi e dei dati utente identificati come compromessi, utilizzare supporti proteggibili via hardware o non riscrivibili;
isolare i sistemi compromessi (trasferimento dei file di backup su un sistema di test isolato dai sistemi di produzione, restore dei sistemi compromessi sul sistema di test, analisi diretta da effettuarsi sul sistema di test);
ricerca di tracce di intrusione su altri sistemi. Gli intrusori abitualmente creano più di un punto di accesso in una rete dove abbiano conquistato un accesso. Nel caso sia stata rilevata una intrusione sarà necessario controllare tutti gli altri sistemi simili al sistema violato;
esame dei log file generati dai firewall, router, e network monitor. Gli attacchi spesso lasciano tracce che possono condurre all’individuazione dei sistemi;
identificazione dell’attacco ad un sistema. Dopo aver conquistato l’accesso ad un sistema, l’intrusore può cercare di cancellare tutti i log file o alcuni specifici log entry, e quindi è possibile non trovare alcuna di queste utili informazioni. A volte la cancellazione dei log entry è rilevabile, in questo caso è la prova di una attività sospetta ed è necessario procedere ad analisi più approfondite;
identificazione delle attività eseguite durante un attacco ad un sistema (analizzare in vari log file, come quegli specifici sistemi di Intrusion Detection);
raccolta e conservazione delle informazioni associate ad un’intrusione:
raccolta di tutte le informazioni relative ad un’intrusione. Raccogliere le informazioni ricavate dai log dei sistemi e delle reti degli ambienti compromessi, dai sistemi di intrusion detection, firewall, router ed altri strumenti. Raccogliere i backup completi e parziali, documentare le schermate dei sistemi con screen-shots, videoregistrazioni e fotografie;
raccolta delle prove. Designare un responsabile per la raccolta delle prove e per il mantenimento dei contatti con l’Autorità Giudiziaria e con eventuali agenzie investigative private. Al fine di assicurare che le raccolte abbiano valore legale, le procedure di raccolta e conservazione delle stesse dovranno essere effettuate in accordo con la legislazione vigente;
conservazione delle prove. Tutte le informazioni registrate elettronicamente saranno archiviate fuori linea e conservate in luogo fisicamente sicuro;
eliminazione di tutti gli strumenti utilizzati per l’intrusione:
modifica di tutte le password su tutti i sistemi ove sia stata riscontrata un’intrusione;
reinstallazione completa dei sistemi compromessi. Nel caso in cui sia difficoltoso o troppo oneroso verificare i checksum crittografici del sistema compromesso si dovrà procedere alla reinstallazione integrale del sistema utilizzando i supporti di distribuzione originali o delle copie sicuramente conformi;
rimozione di tutti i programmi utilizzati per realizzare l’intrusione e di tutte le modifiche determinate dall’intrusione;reinstallazione dei programmi eseguibili e dei file binari dai supporti di distribuzione originali;
revisione delle configurazioni del sistema. Dovranno essere verificati i file di configurazione del sistema;
determinare se sussistono vulnerabilità nel sistema e nella rete e correggerle;
migliorare gli strumenti di protezione per limitare l’esposizione dei sistemi e della rete;
ripristino dei sistemi alle condizioni di normale operatività:
verifica dei requisiti e della tempistica per il ritorno alla normale operatività;
ripristino dei dati utente da un backup affidabile;
abilitazione dei sistemi e dei servizi;
connessione dei sistemi ripristinati alla rete;
azioni conclusive. A seguito di una intrusione e del successivo ripristino della normale operatività sarà utile effettuare una analisi complessiva delle implicazioni determinate dall’evento:
valutazione dell’adeguatezza degli strumenti di protezione e individuazione delle violazioni dei sistemi;
revisione dei piani di sicurezza, delle politiche e delle procedure;
revisione delle direttive ad utenti ed amministratori dei sistemi volte a prevenire ulteriori violazioni;
valutazione della necessità di una nuova analisi del rischio in base alla gravità degli effetti dell’intrusione;
aggiornamento dell’inventario dei sistemi e dei loro assetti;
partecipazione ad azioni investigative e legali.
Cap.5 La Verifica dello Stato dell’Arte in Azienda
Ricognizione della situazione
Sono 5 i fattori critici che devono essere tenuti in debita considerazione al fine di realizzare una strategia di cyber risk efficace.
Il 1° elemento: riuscire ad acquisire una visione globale del rischio:
effettuare screening sistematici in ambito information security al fine di prefigurare i possibili scenari di minacce, identificare quali siano i target potenziali e verificare i livelli di protezione in tutte le funzioni ed aree aziendali;
ripartizione completa delle informazioni protette, poiché ritenute critiche e potenziali bersagli;
valutazione del rischio, a cui sono soggette le informazioni protette, dal punto di vista economico, che includa anche le misure di protezione.
Il 2° elemento: l’identificazione dei target potenziali ed il relativo impatto strategico per l’organizzazione, ciò significa ottenere:
una chiara visione del possibile pericolo causato anche da elementi “periferici” dei target potenziali, (es. nuovi processi o servizi connessi … );
un abbinamentoefficiente tra il probabile bersaglio e quelli imminenti ed attesi, nonché la loro valorizzazione economica e prioritizzazione per criterio di rischio e di potenziale impatto.
Il 3° elemento prevede lo sviluppo di un percorso di criticità relativamente agli scenari di rischio, ciò significa:
utilizzare in modo mirato l’esperienza ed i dati storici aziendali per calcolare sulla base delle probabilità l’insorgenza del potenziale rischio;
dare priorità alle minacce più significative, attraverso la rappresentazione di modelli e schemi di attacco creati su tipologie di minaccia analoghe.
Il 4° elemento definisce una strategia di “risk appetite” la quale prevede:
la stesura di un’adeguata strategia di “risk appetite”, la quale deve risultare condivisa non solo con i vertici delle aree funzionali ma anche con la Corporate Strategy;
la definizione di un’appropriata estensione di misure per la protezione delle informazioni incentratasui potenziali effetti, catalogati secondo criterio di probabilità ed impatto.
Il 5° evidenzia l’esigenza di aggregare le misure di sicurezza adottate per la protezione dei dati, prevedendo:
creazione di un processo integrato di misure per la sicurezza delle informazioni che va ad abbracciare le differenti funzioni aziendali;
aggregazione di un insieme di strategie di mitigazione del rischio a livello organizzativo, procedurale e di sistemi;
attuazione di interventi mirati e processi di controllo relativi al governo delle terze parti (es. fornitori, personale esterno…).
Il Framework Nazionale
Il Framework Nazionale definito in questo capitolo si fonda sul “Framework for Improving Critical Infrastructure Cybersecurity”, sviluppato dal National Institute for Standards and Technology (NIST) statunitense.
Il cuore del Framework NIST è costituito da un insieme di 21 Category e 98 Subcategory, organizzate in 5 Function. Ogni Subcategory rappresenta un’area di raccomandazioni che l’organizzazione può decidere di implementare, se necessario riferendosi a standard o norme specifiche di settore. Il Framework NIST fornisce, per ogni Subcategory, i riferimenti agli standard e Framework esistenti: si tratta di una mappatura parziale, ma che comunque copre la quasi totalità dei riferimenti già adottati dalle organizzazioni internazionali, quali Standard NIST, Standard ISO/IEC e COBIT.
Il Framework Nazionale amplia questa struttura inserendo due nuovi concetti: i livelli di priorità e i livelli di maturità. Questi due concetti permettono di tenere conto della struttura economica del nostro Paese fatta di alcune decine di grandi aziende e infrastrutture critiche e di una galassia di piccole imprese, rendendo dunque, di fatto, il Framework adatto alle PMI, ma conservando tuttavia la sua iniziale vocazione per Grandi Imprese e infrastrutture critiche.
Framework Core, Profile e Implementation Tier
Il Framework Nazionale eredita le tre nozioni fondamentali del Framework NIST: Framework Core, Profile e Implementation Tier[25]:
Framework Core. Il core rappresenta la struttura del ciclo di vita del processo di gestione della cyber security, sia dal punto di vista tecnico sia organizzativo. Il core è strutturato gerarchicamente in Function, Category e Subcategory. Le Function, concorrenti e continue, sono: Identify, Protect, Detect, Respond, Recover e costituiscono le principali tematiche da affrontare per operare una adeguata gestione del rischio cyber in modo strategico. Il Framework quindi definisce, per ogni Function, Category e Subcategory, le quali forniscono indicazioni in termini di specifiche risorse, processi e tecnologie da mettere in campo per gestire la singola Function.
Identify, è legata alla comprensione del contesto aziendale, degli asset che supportano i processi critici di business e dei relativi rischi associati;
Protect, è associata all’implementazione di quelle misure volte alla protezione dei processi di business e degli asset aziendali;
Detect, è associata alla definizione e attuazione di attività appropriate per identificare tempestivamente incidenti di sicurezza informatica;
Respond, è legata alla definizione e attuazione delle opportune attività per intervenire quando un incidente di sicurezza informatica sia stato rilevato;
Recover, è associata alla definizione e attuazione delle attività per la gestione dei piani e delle attività per il ripristino dei processi e dei servizi impattati da un incidente.
Profile rappresentano il risultato della selezione, da parte di un’organizzazione, di specifiche Subcategory del Framework;
Implementation Tier forniscono contesto su come l’azienda, nel suo complesso, veda il rischio cyber e i processi posti in essere per gestirlo. Sono previsti quattro livelli di valutazione, dal più debole al più forte: (1) Parziale, (2) Informato, (3) Ripetibile, (4) Adattivo.
I livelli di priorità
I livelli di priorità permettono di supportare le organizzazioni e le aziende nell’identificazione preliminare delle Subcategory da implementare per ridurre maggiormente i livelli di rischio a cui sono sottoposte, bilanciandone l’impegno da profondere per la loro attuazione. Il Framework suggerisce l’utilizzo di una scala di priorità a tre livelli tra le Subcategory.
I livelli di maturità
I livelli di maturità permettono di fornire una misura della maturità di un processo di sicurezza, della maturità di attuazione di una tecnologia specifica o una misura della quantità di risorse adeguate impiegate per l’implementazione di una data Subcategory. I livelli di maturità forniscono un punto di riferimento in base al quale ogni organizzazione può valutare la propria implementazione delle Subcategory e fissare obiettivi e priorità per il loro miglioramento. I livelli devono essere in progressione, dal minore al maggiore. Ogni livello deve prevedere pratiche e controlli incrementali rispetto al livello di maturità inferiore
Pentration Testing
Nella “sicurezza informatica” è compreso anche il processo di prevenzione, ovvero quell’insieme di misure atte alla protezione di informazioni dall’accesso, dalla modica o dal furto da parte di “attività” non previste.
“Un penetration test, occasionalmente pen test, è un metodo per la valutazione della sicurezza di un sistema informatico o di una rete simulando un attacco da parte di attaccanti esterni (che non hanno di norma accesso ai sistemi informatici) e/o di attaccanti interni (che hanno un qualche livello di accesso autorizzato ai sistemi)”[26]
Auditor è colui che svolge tutte le attività di verifica operando con logiche medesime a quelle di un hacker. L’analisi intrapresa da un auditor comprende più fasi ed ha l’obiettivo di evidenziare in un report le debolezze rilevate nella piattaforma, fornendo il maggior numero di informazioni sulle vulnerabilità sfruttate per ottenere l’accesso non autorizzato.
L’auditor non si fermerà ad analizzare i soli sistemi informatici ma potrà sfruttare tecniche di ingegneria sociale per verificare eventuali carenze formative del personale aziendale di fronte a tentativi di intrusione; questa modalità definita Hidden Mode prevede l’accordo esclusivamente con il consiglio amministrativo dell’azienda che commissiona le verifiche lasciando all’oscuro tutto il personale, compreso il settore IT dell’azienda.
A livello metodologico il NIST descrive inoltre un concetto a cui spesso viene data poca importanza: il penetration test – per sua natura – è un processo iterativo e non ha un andamento lineare. Ogni volta che si hanno maggiori informazioni sul bersaglio queste vengono riutilizzate e si reitera su quanto già fatto. Non a caso Offensive Security[27] definisce il penetration test come “un ciclo continuo di ricerca e di attacco”.
E’ estremamente importante notare come la definizione si focalizzi sul metodo e non sullo strumento. Il penetration test non è un attività in cui lo strumento fa da padrone e non è un caso.
L’attacco ad un sistema si può suddividere in cinque fasi principali:
Information Gathering; raccolta d’informazioni. Ha l’obbiettivo di raccogliere informazioni utili sul bersaglio come una lista di nomi di dominio, l’architettura della piattaforma, delimitazione di indirizzi IP, sistemi e porte attive, servizi offerti ed infine un elenco di nominativi ed e-mail utili in caso di attacco social engineering. I dati raccolti in questa fase permetteranno di scegliere la linea di attacco da seguire nel passo successivo;
Vulnerability Assessment; ricerca di vulnerabilità. Un Vulnerability Assessment (VA) è un processo grazie al quale si identificano e quantificano le vulnerabilità di un sistema. Questa attività permette di avere una panoramica dello stato di sicurezza della infrastruttura tecnologica consentendo ad evidenziarne le potenziali vulnerabilità e ad implementare conseguentemente migliori politiche di sicurezza. Le informazioni elaborate in un vulnerability assessment, riportate in appositi report, consentono di delineare piani di analisi più mirati. Dato l’alto numero di nuove vulnerabilità che vengono scoperte ogni giorno è fondamentale svolgere un vulnerability assessment con la giusta frequenza al fine di assicurarsi che le configurazioni dei sistemi siano corrette e le opportune patch di sicurezza applicate
Exploitation; Exploit delle vulnerabilità. La fase successiva di exploitation permette di ricercare all’interno di un software una vulnerabilità in grado di provocare un imprevisto nel sistema bersaglio dell’attacco. Con il termine exploit (la cui traduzione significa “sfruttare”) si identifica un pezzo di software o una sequenza di comandi che sfrutta un bug o una vulnerabilità per causare inaspettati comportamenti su un computer, sia per quanto riguarda lato software che hardware;
Privilege Escalation; Scalata dei privilegi. Durante questa fase viene sfruttato l’accesso ricavato attraverso l’exploit per innalzare i propri privilegi; questo può avvenire sfruttando ulteriori vulnerabilità di sistema, sniffando pacchetti che transitano nella rete o semplicemente cercando di ottenere in chiaro le password di un utente amministratore. Possiamo distinguere due tipi di scalata:
scalata verticale: quando si ottengono autorizzazioni o privilegi superiori a quelli normalmente avuti;
scalata orizzontale: quando si ottiene l’accesso a risorse con gli stessi privilegi che normalmente concessi ma in un’area di competenza diversa;
Reporting; infine l’attività di Pen Testing si conclude con la stesura di un Report dettagliato includendo tutte le vulnerabilità riscontrate, l’analisi dell’impatto di rischio ed eventualmente una possibile soluzione tecnica al problema.
Cap.6 Dinamiche di Reazione
Il reato informatico nella prassi giudiziaria: le linee guida internazionali per il contrasto ai nuovi fenomeni criminali
La Convenzione di Budapest per il contrasto al Cybercrime[28] ha adottato una tecnica di tipizzazione delle fattispecie incriminatrici che non riproduce pedissequamente i fenomeni criminali, riscontrati nella prassi giudiziaria ed investigativa delle attività di contrasto ma individua, secondo una tecnica di tipizzazione radicata nell’esperienza della codicistica italiana, una serie di fattispecie penalmente illecite caratterizzate dalle modalità della condotta, finalità perseguite ed evento realizzato. Di modo che, nella Convenzione e nelle norme che le hanno dato recepimento nell’ambito degli ordinamenti nazionali, non troveremo riscontro esplicito e diretto alle modalità specifiche attraverso le quali la criminalità concretamente opera: non troveremo cioè riferimenti a prassi criminali molto frequenti nell’esperienza quotidiana quali il phishing, il bombing, i botnet, lo spamming, in quanto si è ritenuto preferibile focalizzare l’attenzione sulle condotte criminali piuttosto che sulla tecnologia da questi utilizzata.
La scelta assunta dai compilatori della Convenzione ha l’innegabile pregio di fornire strumenti sanzionatori che, non essendo finalizzati a fotografare e qualificare giuridicamente le mutevoli fenomenologie dell’illecito cibernetico, non sono condannati a cadere in desuetudine e divenire inutilizzabili quando le tecniche di commissione degli illeciti dovessero mutare ed evolversi.
Offrono, quindi, strumenti di qualificazione giuridica sempre attuali. Al contempo, la tecnica di normazione prescelta, presenta il difetto di non consentire l’immediata riconduzione ad una unica fattispecie incriminatrice delle condotte illecite rilevate nella prassi.
Se da un lato l’operazione interpretativa finalizzata a qualificare giuridicamente le condotte criminali appare complessa e produttiva di risultati non sempre omogenei, l’esigenza sottesa alla Convenzione di Budapest è certamente quella di rendere omogenei i sistemi sanzionatori nazionali, al fine di facilitare la cooperazione giudiziaria, volta al contrasto di fenomeni criminali che presentano una eminente connotazione trans-nazionale. In questo ambito uno dei principi cardine della collaborazione internazionale è quello della reciprocità, ovvero il presupposto della comune qualificazione penale della condotta criminale da perseguire. Diventa quindi di centrale importanza che, non solo tutti i Paesi aderenti si dotino di un omogeneo sistema sanzionatorio ma che siano anche omogenei i canoni interpretativi che consentono di qualificare illecitamente le diverse condotte complesse nelle quali si estrinsecano le prassi criminali più ricorrenti. Propri alla standardizzazione dei canoni interpretativi tendono le linee guida adottate periodicamente dal Cybercrime Convention Committee (T-CY) istituito presso il Consiglio d’Europa in virtù dell’art. 46 della Convenzione e finalizzato a darle attuazione, ad arricchirne e potenziarne i contenuti, a favorire lo scambio di informazioni e di esperienze attuative tra gli Stati aderenti. In particolare le linee guida costituiscono l’espressione del comune intendimenti delle parti del trattato circa le modalità concrete di darvi attuazione, superando, attraverso una condivisa interpretazione delle sue norme (e delle norme di recepimento dei singoli stati) le ricadute negative che potrebbero verificarsi, sul piano della cooperazione giudiziaria, per effetto della differente interpretazione di ciò che sia o meno qualificabile come reato in base alla convenzione.
Sul piano del diritto nazionale le linee guida, pur non assumendo alcun valore normativo e tanto meno vincolante per l’interprete, offrono un valido strumento di ausilio nell’attività di interpretazione delle norme e di qualificazione giuridica dei fatti di reato, che presenta il pregio dell’uniformità ed il prestigio culturale proveniente, oltre che dall’elevata qualificazione tecnico giuridica della sua fonte, anche dall’attenzione e dalla completezza con le quali sono redatte.
Delitti informatici e trattamento illecito dei dati
Il Legislatore Italiano, spesso in adempimento di obblighi di cooperazione europea od internazionale, ha, nell’ultimo ventennio, introdotto nell’ordinamento diverse disposizioni aventi come oggetto la tutela dei “Sistemi Informatici o Telematici”.
Prima della legge n. 547 del 1993, nel nostro ordinamento non esisteva alcuna disposizione normativa specifica sui reati informatici. La legge 547/93 è intervenuta in quattro diverse direzioni, punendo le seguenti forme di aggressione:
le aggressioni alla riservatezza dei dati e delle comunicazioni informatiche;
le aggressioni all’integrità dei dati e dei sistemi informatici;
le condotte in tema di falso, estese ai documenti informatici;
le frodi informatiche.
In data 5 aprile 2008 è entrata in vigore la Legge n. 48, recante la ratifica ed esecuzione della Convenzione del Consiglio d’Europa sulla criminalità informatica.
Con tale norma il Legislatore ha apportato modifiche al codice penale in materia di reati informatici ed ha introdotto diverse disposizioni in relazione ai delitti informatici e al trattamento illecito dei dati.
Cap.7 Responsabilità dell’Azienda
La sicurezza delle informazioni nella legislazione italiana
Il legislatore italiano già da tempo si è preoccupato di dettare delle norme volte ad individuare alcune misure minime di sicurezza per tutti quei casi in cui la qualità delle informazioni contenute nei sistemi informatici di un’azienda renda opportuna e giuridicamente necessaria la loro protezione.
In particolare, la normativa italiana vigente – contenuta per poco tempo ancora nel D.Lgs. 196/2003 e comunemente denominata “Codice della privacy” – si applica esclusivamente al trattamento di dati personali. Essi sono definiti come “qualunque informazione relativa a persona fisica, identificata o identificabile, anche indirettamente, mediante riferimento a qualsiasi altra informazione, ivi compreso un numero di identificazione personale”.
Accanto alla definizione di dato personale e di dato identificativo, però, il legislatore ha espressamente previsto anche i concetti di dato sensibile e di dato giudiziario, protetti dalla normativa vigente in maniera ancora più stringente, dato l’alto valore delle informazioni in essi contenuto.
I dati sensibili, infatti, riguardano i dati personali idonei a rivelare l’origine razziale ed etnica, le convinzioni religiose, filosofiche o di altro genere, le opinioni politiche, l’adesione a partiti, sindacati, associazioni od organizzazioni a carattere religioso, filosofico, politico o sindacale, nonché i dati personali idonei a rivelare lo stato di salute e la vita sessuale di un soggetto.
I dati giudiziari, invece, sono i dati personali idonei a rivelare provvedimenti in materia di casellario giudiziale, di anagrafe delle sanzioni amministrative dipendenti da reato e dei relativi carichi pendenti, o la qualità di imputato o di indagato.
In merito alla loro protezione, l’art. 31 del Codice della privacy pone come regola generale quella secondo cui i dati personali oggetto di trattamento debbano essere “custoditi e controllati, anche in relazione alle conoscenze acquisite in base al progresso tecnico, alla natura dei dati e alle specifiche caratteristiche del trattamento, in modo da ridurre al minimo, mediante l’adozione di idonee e preventive misure di sicurezza, i rischi di distruzione o perdita, anche accidentale, dei dati stessi, di accesso non autorizzato o di trattamento non consentito o non conforme alle finalità della raccolta”.
Occorre evidenziare come il legislatore italiano preveda esplicitamente ed analiticamente solo le misure minime di sicurezza da applicare al trattamento dei dati, ovvero quelle dell’art. 34 e dell’Allegato B al Codice della privacy, lasciando invece indefinite le misure di sicurezza idonee previste dall’art. 31.
La non applicazione delle misure minime ha come conseguenza sanzioni di tipo penale, laddove la mancata predisposizione di misure di sicurezza idonee per lo specifico trattamento dei dati comporta l’applicazione delle sole sanzioni amministrative.
Le norme da prendere in considerazione, però, non si esauriscono con quanto finora accennato.
Il 25 maggio 2016, infatti, è entrato in vigore il “Regolamento europeo generale sulla protezione dei dati personali” n. 2016/679[29], che stabilisce norme relative alla protezione delle persone fisiche con riguardo al trattamento dei dati personali, nonché norme relative alla libera circolazione di tali dati.
Questo Regolamento diventerà definitivamente applicabile in ogni Stato membro dell’Unione Europea a partire dal 25 maggio 2018, abrogando la Direttiva 95/46/CE sinora vigente e andando a sostituire anche quanto attualmente previsto in Italia dal Codice della privacy.
In linea generale, tutto il Regolamento si poggia su due principi fondamentali, che ispirano l’intero costrutto normativo: il principio di privacy by design, che mira a proteggere ogni dato personale sin dal momento di determinare i mezzi o i processi utili al trattamento, oltre che ovviamente all’atto del trattamento stesso (attraverso, ad esempio, i “sotto-principi” di pseudonimizzazione[30] e minimizzazione dei dati trattati); e il principio di privacy by default, che mira a garantire che siano trattati, per impostazione predefinita, solo i dati personali necessari per ogni specifica finalità del trattamento e che va ad incidere, pertanto, sulla quantità dei dati personali raccolti, sulla portata del trattamento, nonché sul periodo di conservazione e sulla loro accessibilità.
Il Decreto Legislativo n. 231/2001
Il Decreto Legislativo n. 231 dal titolo “Disciplina della responsabilità amministrativa delle persone giuridiche, delle società e delle associazioni anche prive di personalità giuridica” [31], ha introdotto nell’ordinamento italiano un regime di responsabilità amministrativa (riferibile sostanzialmente alla responsabilità penale) a carico degli enti (da intendersi come Società, associazioni, consorzi, ecc., di seguito denominati “enti” e, singolarmente, “Ente”) per alcuni reati commessi, nell’interesse o a vantaggio degli stessi:
da persone fisiche che rivestano funzioni di rappresentanza, di amministrazione o di direzione degli enti stessi o di una loro unità organizzativa dotata di autonomia finanziaria e funzionale, nonché da persone fisiche che esercitino, anche di fatto, la gestione e il controllo degli enti medesimi;
da persone fisiche sottoposte alla direzione o alla vigilanza di uno dei soggetti sopra indicati.
Tale responsabilità si aggiunge a quella della persona fisica che ha realizzato materialmente il fatto.
Il D.Lgs. 231/01 prevede, all’art. 6, una forma specifica di esonero dalla responsabilità amministrativa (c.d. esimente) qualora l’Ente sia in grado di dimostrare:
di aver adottato ed efficacemente attuato, prima della commissione di eventuali fatti illeciti, modelli di organizzazione e di gestione idonei a prevenire la commissione di reati della specie di quelli verificatisi;
che il compito di vigilare sul funzionamento e l’osservanza dei Modelli nonché di curare il loro aggiornamento sia stato affidato a un organismo dell’Ente dotato di autonomi poteri di iniziativa e controllo (di seguito, “l’Organismo di Vigilanza” o “OdV”);
che le persone che hanno commesso il reato abbiano agito eludendo fraudolentemente i suddetti modelli di organizzazione e gestione;
che non vi sia stata omessa o insufficiente vigilanza da parte dell’Organismo di cui alla precedente lett. b).
Le circostanze appena elencate devono concorrere congiuntamente affinché la responsabilità dell’Ente possa essere esclusa.
Tipologie di reato previste dal D.Lgs. 231/01
Il Legislatore ha individuato diverse tipologie di reati che possono essere commessi da persone fisiche nell’interesse o a vantaggio della società, fino ad includere fattispecie anche non necessariamente tipiche dell’attività di impresa.
La responsabilità amministrativa dell’Ente, inoltre, sussiste anche se non sia stato identificato l’autore del reato, o se il reato si sia estinto per una causa che sia diversa dall’amnistia.
L’Autorità competente a contestare l’illecito all’Ente è il Pubblico Ministero, mentre è il giudice penale che ha la responsabilità e l’autorità per irrogare la sanzione.
L’Ente può essere chiamato a rispondere per un numero chiuso di reati, ovvero soltanto per i cd. “Reati Presupposto”[32] indicati negli artt. 24 e seguenti del Decreto, che appartengono alle categorie indicate di seguito:
reati commessi nei rapporti con la P.A. (artt. 24 e 25);
delitti informatici e trattamento illecito dei dati (art. 24-bis);
delitti di criminalità organizzata (art. 24-ter);
reati di falsità in monete, in carte di pubblico credito, in valori di bollo e in strumenti o segni di riconoscimento (art. 25-bis);
delitti contro l’industria e il commercio (art. 25-bis.1);
reati societari (art. 25-ter);
delitti con finalità di terrorismo o di eversione dell’ordine democratico (art. 25-quater);
pratiche di mutilazione degli organi genitali femminili (art.25-quater.1);
delitti contro la personalità individuale (art. 25-quinquies);
abusi di mercato (art. 25-sexies);
omicidio colposo e lesioni colpose gravi o gravissime, commessi con violazione delle norme sulla tutela della salute e sicurezza sul lavoro (art. 25-septies);
ricettazione, riciclaggio e impiego di denaro, beni o utilità di provenienza illecita (art. 25-octies);
delitti in materia di violazione del diritto d’autore (art. 25-novies);
induzione a non rendere dichiarazioni o a rendere dichiarazioni mendaci all’Autorità Giudiziaria (art. 25-novies);
reati transnazionali (art. 10, L. 146/2006).
Criteri di imputazione della responsabilità all’Ente
l’Ente è punibile solamente nel caso in cui si verifichino determinate condizioni, definite come criteri di imputazione del reato all’Ente.
La prima condizione è che il reato sia stato commesso da un soggetto legato all’Ente da un rapporto qualificato: soggetti apicali, soggetti subordinati, collaboratori.
La seconda condizione è che il reato sia stato commesso nell’interesse o a vantaggio dell’Ente:
“l’interesse” sussiste quando l’autore del reato ha agito con l’intento di favorire la società, indipendentemente dalla circostanza che poi tale obiettivo sia stato realmente conseguito;
il “vantaggio” sussiste quando la società ha tratto, o avrebbe potuto trarre, dal reato un risultato positivo, economico o di altra natura.
Delitti informatici e trattamento illecito dei dati
La legge 18 marzo 2008, n. 48, “Ratifica ed esecuzione della Convenzione del Consiglio d’Europa sulla criminalità informatica, fatta a Budapest il 23 novembre 2001, e norme di adeguamento dell’ordinamento interno” ha ampliato le fattispecie di reato che possono generare la responsabilità della società. L’art. 7 del provvedimento, infatti, ha introdotto nel D.Lgs. 231/01 l’art. 24-bis per i reati di:
accesso abusivo ad un sistema informatico o telematico (art. 615-ter c.p.);
detenzione e diffusione abusiva di codici di accesso a sistemi informatici o telematici (art. 615-quater c.p.);
diffusione di apparecchiature, dispositivi o programmi informatici diretti a danneggiare o interrompere un sistema informatico o telematico (art. 615-quinquies c.p.)
intercettazione, impedimento o interruzione illecita di comunicazioni informatiche o telematiche (art. 617-quater c.p.);
installazione di apparecchiature atte ad intercettare, impedire o interrompere comunicazioni informatiche o telematiche (art. 617-quinquies c.p.);
danneggiamento di informazioni, dati e programmi informatici (art. 635-bis c.p.);
danneggiamento di informazioni, dati e programmi informatici utilizzati dallo Stato o da altro ente pubblico o comunque di pubblica utilità (art. 635-ter c.p.);
danneggiamento di sistemi informatici o telematici (art. 635-quater c.p.);
danneggiamento di sistemi informatici o telematici di pubblica utilità (art. 635-quinquies c.p.).
falsità in un documento informatico pubblico o avente efficacia probatoria (art. 491-bis c.p.);
frode informatica del certificatore di firma elettronica (art. 640-quinquies c.p.).
Le sanzioni
Le sanzioni che il legislatore ha voluto collegare alla responsabilità penale e amministrativa delle persone giuridiche sono di varia natura a seconda della forma di commisurazione e dell’incidenza che le stesse hanno sullo svolgimento dell’attività di impresa. Esse possono essere suddivise come segue:
sanzioni pecuniarie, è incentrata sul concetto di “quota” e viene applicata in un numero non inferiore a cento né superiore a mille;
sanzioni interdittive, possono comportare conseguenze dirette sull’attività di impresa (nella sospensione o nella revoca delle autorizzazioni, licenze o concessioni funzionali alla commissione dell’illecito, nel divieto di contrattare con la Pubblica Amministrazione, esclusione da agevolazioni, finanziamenti);
confisca del profitto del reato, con la sentenza di condanna, il Giudice dispone sempre la confisca del prezzo o del profitto del reato, ovvero di somme di denaro, beni o altre utilità di valore equivalente, salvo la parte che possa essere restituita al danneggiato;
pubblicazione della sentenza, a seguito dell’applicazione di una sanzione interdittiva, il Giudice può disporre la pubblicazione della sentenza di condanna in uno o più giornali ovvero mediante affissione nel comune ove la società ha la sede principale, misura capace di recare un grave impatto sull’immagine dell’Ente.
Linee guida per la costruzione dei modelli di organizzazione, gestione e controllo
Il Decreto 231 prevede sanzioni per l’Ente che non si sia organizzato per evitare fenomeni criminosi in seno all’impresa, quando soggetti funzionalmente riferibili all’Ente abbiano commesso taluno dei reati indicati dallo stesso decreto.
Individuazione dei rischi e protocolli
L’art. 6, comma 2, del Decreto 231 indica le caratteristiche essenziali per la costruzione di un modello di organizzazione, gestione e controllo. In particolare, le lettere a) e b) della disposizione si riferiscono espressamente ad alcune attività correlate ad un processo di sana e prudente gestione dei rischi.
La procedura di identificazione e valutazione dei rischi deve essere applicata durante le seguenti fasi:
fase iniziale d’implementazione del Modello Organizzativo 231 in conformità con il D.Lgs. 231/2001, in quanto costituisce la base per potere poi intervenire con la definizione di specifici protocolli/procedure atte a prevenire la commissione del reato ritenuto a rischio di realizzazione e comunque prima di ogni riesame del sistema al fine di garantire un aggiornamento sistematico della valutazione dei rischi;
ogni qualvolta si verifichi una variazione di processo, di prodotto o del sito o contesto in cui l’Ente opera, quali ad esempio modifiche nel quadro legislativo di riferimento ovvero vi siano mutamenti nell’organizzazione o nell’oggetto sociale dell’Ente tali da richiedere una valutazione dei rischi connessi;
ogni qualvolta, a fronte di valutazioni o attività di controllo (ad esempio da parte dell’ODV) si presenti la necessità/volontà di verificare l’efficacia del Modello.
Rischio = probabilità che sia raggiunta la soglia di commissione di un reato/illecito presupposto della responsabilità amministrativa ai sensi del D. lgs. 231/01.
L’organismo di vigilanza è la figura prevista dal Legislatore con il preciso compito di valutare l’adeguatezza ed efficacia del Modello, la sua applicazione da parte dell’Ente, nonché curarne l’aggiornamento.
I contenuti minimi di un Codice Etico
L’adozione di principi etici rilevanti ai fini della prevenzione dei reati ex D. Lgs. 231/2001 costituisce un elemento essenziale del sistema di controllo preventivo.
In termini generali, i codici etici (o codice di comportamento), sono documenti ufficiali dell’Ente che contengono l’insieme dei principi, dei diritti, dei doveri e delle responsabilità dell’Ente nei confronti dei “portatori d’interesse” (dipendenti, fornitori, clienti, Pubblica Amministrazione, azionisti, mercato finanziario, ecc.).
Mentre i protocolli di condotta implementati all’interno del modello organizzativo di gestione e controllo perseguono la finalità di prevenire la commissione di reati presupposto nell’interesse e a vantaggio di un ente da parte dei rispettivi destinatari, i codici etici mirano a raccomandare, promuovere o vietare determinati comportamenti, al di là ed indipendentemente da quanto previsto a livello normativo e quindi dalla rilevanza penale delle condotte.
Iter procedurale per l’elaborazione di un modello organizzativo di gestione e controllo ex d.Lgs 231/01
Non esiste una soluzione standard di elaborazione di un modello organizzativo di gestione e controllo ex D. Lgs. n. 231/01.
Il “decalogo 231”
Un riferimento per capire quali debbano essere le caratteristiche di un modello organizzativo 231 è l’ordinanza cautelare del Giudice per le indagini preliminari del Tribunale di Milano (dott.ssa Secchi) depositata il 9 novembre 2004, conosciuta anche come “decalogo 231”, in cui vengono delineate le dieci caratteristiche che un modello organizzativo deve avere per essere effettivamente considerato valido ai fini 231.
Modello Organizzativo per i reati informatici
L’art. 7 della legge 18 marzo 2008 n. 48, mediante l’inserimento nell’ambito del D. Lgs. 231/01 dell’art 24 bis sui delitti informatici e trattamento illecito dei dati, ha introdotto nuove fattispecie di reato che possono generare una responsabilità in capo alle aziende.
L’adozione di un “Modello di Organizzazione, Gestione e Controllo” ai sensi del D.Lgs 231/01 in grado di prevenire adeguatamente le differenti ipotesi di illecito introdotte con tale normativa, trova il proprio presupposto fondamentale nella volontà di gestire la propria rete informatica attraverso l’adozione di regole e procedure alla cui osservanza tutti i propri dipendenti sono chiamati.
A tale proposito, le aziende potrebbero adottare specifiche procedure e misure operative finalizzate a garantire una gestione ed un utilizzo lecito e sicuro del proprio sistema informatico.
A tale scopo le aziende dovrebbero appositamente designare un soggetto qualificato, al quale attribuire la funzione di Responsabile IT, con lo specifico incarico di gestire i sistemi informatici della rete, anche attraverso un costante monitoraggio avente ad oggetto un corretto e sicuro utilizzo dei medesimi.
Per ciò che specificamente attiene i controlli aziendali, l’Ente dovrebbe istituire la funzione Security Operations Center (SOC).
Cap.8 Le Conseguenze di un Attacco Cyber
I danni provocati da un attacco cyber all’interno di un computer privato o una rete aziendale possono risultare di natura ed entità completamente diverse: si va da un lieve aumento del traffico in uscita (nel caso in cui il computer sia stato infettato da un trojan preposto all’invio di messaggi di spam) al crollo completo del network aziendale, o alla perdita di dati sensibili di vitale importanza. In alcuni casi i risultati di un’infezione da malware possono essere impercettibili all’utente, altre volte possono avere conseguenze ben evidenti e di particolare gravità.
Le conseguenze potenziali di un evento cibernetico (accidentale o deliberato) posso essere ad esempio:
interruzione dell’attività,computer e reti di sistemi inutilizzabili, guasti hardware;
danno reputazionale/di immagine;
diffusione di informazioni sensibili (clienti, pazienti, impiegati, fornitori);
violazione informazioni finanziarie;
violazione conti bancari;
violazione proprietà intellettuale;
perdita quote di mercato;
appropriazione identità;
azioni legali da terzi;
frodi e social engineering.
Difronte alla moltitudine di danni causati da un attacco cyber è possibile tutelarsi con un’assicurazione
Cap.9 La Possibilità di Copertura Assicurativa del Rischio
Nel Report Clusit 2016, con un approfondimento dedicato allo strumento assicurativo a supporto della gestione del cosiddetto Cyber Risk, si sono date le indicazioni basilari su terminologia, aspetti chiave ed utilità delle polizze cyber.
È emerso che si può affidare la gestione del Cyber Risk e in particolare l’aspetto del trasferimento del rischio, alle Assicurazioni attraverso un tavolo collaborativo che ha nel CIO[33] e nel CFO[34], gli attori principali.
I cyber-danni
Avvalendoci della terminologia e delle definizioni tratte dalle polizze tradizionali, per calarci nel mondo dei danni cyber, si possono distinguere tre grandi famiglie di danni:
danni materiali diretti, riguardano i danni (distruzione parziale o totale, furto) subiti da beni materiali (un server, la fibra ottica, i PC, un cellulare o altro device elettronico) e direttamente causati dall’evento che sarà normalmente di natura “analogica” o tradizionale (incendio, terremoto, fulmine, furto, atto maldestro o doloso, ecc.); per la loro natura essi rientrano già nella polizza Incendio, nella polizza Trasporti, nella polizza All Risks (che proprio “tutti i rischi” non copre …), e naturalmente nella Polizza storicamente definita “Elettronica”. I danni materiali e diretti possono anche non essere previsti nella Polizza Cyber, se si è provveduto alla corretta strutturazione delle coperture assicurative tradizionali;
danni materiali indiretti (o consequenziali), si tratta ugualmente di danni a beni materiali, ma conseguenza di danni diretti: per esempio, un fenomeno elettrico che abbia danneggiato una scheda, il cui malfunzionamento danneggi a sua volta la macchina di produzione da essa controllata. I danni materiali indiretti possono rientrare sia nelle polizze tradizionali che nella Cyber, ma vanno esplicitamente inclusi;
danni immateriali diretti e indiretti, sono tutti quelli che non riguardano la materialità delle cose assicurate e che sono conseguenzadi un evento garantito in polizza, anche di tipo Cyber. L’evento dannoso distrugge, compromette l’integrità di un software e/o l’insieme logico di informazioni – ovvero rende indisponibili i dati aziendali.
Il mercato degli assicuratori e metodologie di indennizzo
Il mercato assicurativo delle polizze cyber risks oggi è in rapida evoluzione e offre la possibilità di creare tutele ad hoc per il cliente. Tale personalizzazione offre un ottimo livello di aderenza al rischio cyber reale cui è esposta l’azienda, ma presuppone ovviamente un precedente processo di analisi e valutazione, così come descritto precedentemente. Tuttavia va tenuto presente che, ancorché in rapida evoluzione, il mercato assicurativo italiano si trova ancora in una fase embrionale. Ciò perché, come sempre in questo tipo di mercato, la risposta a un rischio si attua nel momento in cui tale rischio diviene conosciuto e valutabile. La situazione di novità riguarda però il solo mercato italiano in quanto, nei paesi dell’America settentrionale e anglosassoni, le problematiche afferenti i rischi cibernetici vengono affrontate da circa una decina d’anni. Delle circa 50 compagnie di assicurazioni operanti in Europa che specificamente si dichiarano pronte a sottoscrivere rischi cibernetici, soltanto un terzo opera direttamente in Italia, la restante parte opera fondamentalmente dal Regno Unito (a copertura di rischi italiani).
Guida all’implementazione di una copertura assicurativa cyber risk
Ai fini dell’implementazione di una copertura assicurativa cyber risk, sarebbe opportuno che l’azienda seguisse i seguenti 4 passaggi:
coinvolgimento di un consulente assicurativo: il settore dei rischi cyber non è ancora maturo né ha standard di riferimento in ambito assicurativo, il coinvolgimento di uno o più consulenti specializzati nel trasferimento dei rischi al mercato assicurativo diventa fondamentale per il trasferimento delle specifiche necessarie agli assicuratori. Interpellare direttamente le compagnie assicurative potrebbe portare le stesse a fornire prodotti non rispondenti alle esigenze dell’assicurando;
risk assessment: ai fini di isolare correttamente il massimo danno probabile e di stimare correttamente l’esposizione al rischio, sarebbe opportuno, prima di stipulare la polizza, effettuare un’analisi e quantificazione del rischio stesso;
compilazione del questionario assicurativo: il questionario in ambito assicurativo ha lo scopo di raccogliere le informazioni base necessarie per una prima valutazione del rischio da parte degli assicuratori. La compilazione del questionario ha come risultato il fatto che possano essere apprezzate le varie ipotesi di limite di indennizzo che stanno alla base del contratto assicurativo e, parallelamente, fa prendere coscienza all’assicurando di quelli che sono i suoi punti di forza e di debolezza;
implementazione della copertura assicurativa: una volta esaurito il processo di valutazione tramite questionario e/o tramite risk assessment strutturato, sarà possibile richiedere una quotazione formale al mercato assicurativo. Anche in questo caso l’apporto negoziale di un consulente specializzato è perlomeno consigliabile, in quanto la conoscenza del settore e la capacità negoziale di chi opera continuativamente nel settore permettono risultati più performanti rispetto a quelli ottenibili dal singolo cliente direttamente con gli assicuratori, oppure da un consulente non specializzato con gli assicuratori.
Cap.10 Protezione Cibernetica e Sicurezza Informativa
I trend di difesa: il contrasto a questo tipo di minacce dovrebbe basarsi su tre elementi chiave:
il contrasto a più livelli della minaccia attraverso la comprensione delle sue modalità operative;
la prevenzione attiva, grazie all’acquisizione di informazioni sui trend di attacco più probabili;
l’adozione di una mentalità – e conseguentemente di un’organizzazione – che consideri sempre presente l’eventualità della violazione.
Di conseguenza, data l’enormità del suo ambito di applicazione, la Cyber Security in primo luogo non può che basarsi su logiche di prevenzione, riduzione e trasferimento del rischio e su processi di Risk Governance, applicati però ad un dominio caotico, dai confini e dalle dinamiche sempre cangianti, il quale pertanto va presidiato costantemente, 24×7, da personale qualificato dotato di metodologie di Risk Management e strumenti adeguati (p.es. tool di analisi comportamentale, big data analytics, intelligenza artificiale, ecc), capaci di operare in tempo reale.
In secondo luogo, per definire puntualmente la componente esogena del rischio, ovvero la probabilità che una minaccia esterna si realizzi, è necessario impiegare metodologie e strumenti di Cyber Intelligence capaci di osservare, tramite un monitoraggio continuo, l’esterno e l’interno con altrettanta attenzione, e di correlare i due domini. Anche in questo caso si tratta di sviluppare competenze sofisticate e di implementare processi nuovi, diversi rispetto alle prassi consolidate, considerando che oggi, nel migliore dei casi, le organizzazioni sono strutturate solo per osservare ciò che avviene nell’ambito di propri confini prestabiliti (i quali peraltro stanno ormai diventando sempre più porosi, a causa delle nuove tecnologie).
In terzo luogo è necessario definire e costantemente aggiornare il proprio modello di minaccia, ovvero individuare quale tra le diverse tipologie di attaccanti vorrà aggredire quale asset, perché, sfruttando quale vulnerabilità, con quali strumenti, atteggiamento, risorse ecc. Anche questa attività di Threat Modeling[35]non può che essere continuativa ed integrarsi opportunamente con i processi di Risk Management e Cyber Intelligence, per fornire al primo delle metriche precise ed aggiornate su cui ragionare, ed alla seconda indicazione in merito a quale ago cercare nel pagliaio del cyberspazio.
[1] Quadro Strategico Nazionale Per La Sicurezza Dello Spazio Cibernetico, Presidenza del Consiglio dei Ministri. Dicembre 2013.
[2] Il problema della Cyber Security e il Framework Nazionale. CIS-Sapienza http://www.cis.uniroma1.it
[3] International Organization for Standardization.
[4] Valutazione della minaccia di criminalità organizzata in Internet. https://www.europol.europa.eu/activities-services/main-reports/internet-organised-crime-threat-assessment-iocta-2016
[5] Una botnet è una rete controllata da un botmaster e composta da dispositivi infettati da malware specializzato, detti bot o zombie.[
[6] Ci si riferisce principalmente agli artt. 2, 3, 4, 5, 6, 7, 8 della convenzione ed alle corrispondenti norme incriminatici del codice penale nazionale.
[7] Il concetto di software on-premises, in contrapposizione al software come servizio (o Saas), si traduce in pratica nell’installazione ed esecuzione del software direttamente su macchina locale, sia essa aziendale che privata, intesa sia come singola postazione di lavoro che come server raggiungibile esclusivamente dall’interno della rete aziendale
[8] Più specificatamente, secondo la Corte di Cassazione (Sez. VI, n. 3067/1999; Sez. V, n. 31135/2007):
“… deve ritenersi “sistema informatico”, … , un complesso di apparecchiature destinate a compiere una qualsiasi funzione utile all’uomo, attraverso l’utilizzazione (anche parziale) di tecnologie informatiche, che sono caratterizzate – per mezzo di un’attività di “codificazione” e “decodificazione”– dalla “registrazione” o “memorizzazione”, per mezzo di impulsi elettronici, su supporti adeguati, di “dati”, cioè di rappresentazioni elementari di un fatto, effettuata attraverso simboli (bit), in combinazione diverse, e dalla elaborazione automatica di tali dati, in modo da generare “informazioni”, costituite da un insieme più o meno vasto di dati organizzati secondo una logica che consenta loro di esprimere un particolare significato per l’utente …”;
“… è “sistema telematico” l’insieme di più sistemi informatici collegati tra loro per lo scambio di informazioni, purché siano connessi in modo permanente, e purché lo scambio di informazioni sia il mezzo necessario per conseguire i fini operativi del sistema. …”.
[9] Cass, sez. VI, 14 ottobre 1999, in Foro it., 2000, II, 133.
[10] Il lettore attento avrà notato che non è stato utilizzato il termine “estero”.
[11] Secondo il NIST (http://nvlpubs.nist.gov/nistpubs/Legacy/SP/nistspecialpublication800-145.pdf) con il termine cloud è da intendersi “a model for enabling ubiquitous, convenient, on-demand network access to a shared pool of configurable computing resources (e.g., networks, servers, storage, applications, and services) that can be rapidly provisioned and released with minimal management effort or service provider interaction”, che, tradotto in italiano, potrebbe essere inteso come “un modello di elaborazione, che abilita un accesso in rete, su richiesta, ubiquo e conveniente ad un insieme di risorse di calcolo (CPU, memorie di massa, reti, sistemi operativi, servizi e/o applicazioni) condivise e configurabili, le quali possono essere acquisite e rilasciate rapidamente ed in modo dinamico con uno sforzo di gestione minimo, o comunque con un’interazione minima con il fornitore del servizio”.
[12] È responsabile della gestione, manutenzione ed esercizio dei sistemi informativi dell’organizzazione all’interno della quale opera. Identifica esigenze organizzative e di gestione delle informazioni, pianifica e controlla progetti di miglioramento dei sistemi ICT, garantisce una buona operatività del sistema informativo nel rispetto dei requisiti di legge e di qualità validi nel contesto in oggetto.
[13] Con il provvedimento n. 1712680 del Garante per la Privacy in materia di videosorveglianza datato 8 aprile 2010, le immagini registrate possono essere conservate per periodo limitato e fino a un massimo di 24 ore, fatte salve speciali esigenze di ulteriore conservazione in relazione a indagini di Polizia e giudiziarie. Per attività particolarmente rischiose (ad esempio, banche, videosorveglianza esercitata dai Comuni per esigenze di sicurezza urbana ecc.) è ammesso un tempo più ampio, che non può superare comunque la settimana.
[14] In informatica e telecomunicazioni una sottorete, o subnet, è una parte della suddivisione di una singola rete IP (Internet Protocol). Tale suddivisione è realmente visibile solo dalla parte logica della rete, ciò vuol dire che la differenza tra una rete e una sottorete sta nel tipo di configurazione di rete che si dà al proprio computer. Il processo di subnetting è la divisione di una singola rete in gruppi di computer che hanno in comune nell’indirizzo IP un determinato prefisso di instradamento (routing).
[15] Un’associazione statica può essere utile al supermercato dei limiti di data retention.
[16] Un firewall è un componente di difesa perimetrale di una rete informatica, originariamente passivo, che può anche svolgere funzioni di collegamento tra due o più tronconi di rete, garantendo dunque una protezione in termini di sicurezza informatica della rete stessa.
[17] Un Intrusion Detection System è un dispositivo software e/o hardware utilizzato per identificare accessi non autorizzati ai computer o alle reti locali.
[18] Una DMZ (demilitarized zone) è un segmento isolato di LAN (una “subnet”) raggiungibile sia da reti interne sia esterne, ma caratterizzata dal fatto che gli host (o nodi) attestati sulla DMZ hanno possibilità limitate di connessione verso host specifici della rete interna.
[19] L’autenticazione a due fattori richiede, oltre alla conoscenza della username e password, anche un terzo codice, che potrebbe essere generato tramite un sistema OTP (one time password) tramite SMS o apposita APP.
[20] Il paradigma è basato su qualcosa che sappiamo (es. PIN), qualcosa che abbiamo (es. smart card), qualcosa che siamo (es. elemento biometrico).
[21] Un computer security incident response team (ISO 27035 pt.3.2) è un’unità organizzativa incaricata di raccogliere le segnalazioni di incidenti informatici e potenziali vulnerabilità nei software che provengono dalla comunità degli utenti.
[22] Con la locuzione inglese “data retention” ci si riferisce al periodo di conservazione di dati o documenti elettronici (generalmente dei file di log). A meno che oggetto di indagine non sia un fornitore di connettività (es. un Internet Service Provider), sia i soggetti fisici che giuridici hanno alcun vincolo di memorizzazione.
[23] Elemento di prova: l’informazione che si ricava dal mezzo di prova come dato grezzo, non ancora valutato dal giudice: v. art. 65 comma 1 c.p.p.
[24] Pubblico (statico e dinamico) e privato. NAT Network Address Translation, tecnica che consiste nel modificare gli indirizzi IP dei pacchetti in transito su un sistema che agisce da router.
[26] Così il CREST, http://www.crest-approved.org/, un organizzazione no-profit di base inglese per il supporto al mercato della sicurezza informatica definisce i penetration test.
[28] La Convenzione sul Cyber Crime, firmata a Budapest il 23 novembre 2001 ed entrata in vigore l’1 luglio 2004, è stata ratificata dall’Italia con la legge 18 marzo 2008 n. 48 (GU n.80 del 4-4-2008 – Suppl. Ordinario n. 79 ) entrata in vigore il 5-4-2008.
[29] “Regolamento (UE) 2016/679 del Parlamento europeo e del Consiglio, del 27 aprile 2016, relativo alla protezione delle persone fisiche con riguardo al trattamento dei dati personali, nonché alla libera circolazione di tali dati e che abroga la direttiva 95/46/CE (regolamento generale sulla protezione dei dati)”, 2016, in http://eur-lex.europa.eu/legal-content/IT/TXT/?uri=CELEX%3A32016R0679.
[30] La pseudonimizzazione, ovvero il principio per cui le informazioni di profilazione debbano essere conservate in una forma che impedisce l’identificazione dell’utente. Le informazioni personali contengono elementi identificativi come nome, data di nascita, sesso e indirizzo. Quando le informazioni personali vengono pseudonimizzate, gli elementi identificativi sono sostituiti da uno pseudonimo, che si ottiene, per esempio, crittografando gli elementi identificativi contenuti nei dati personali. Il dato pseudonimo è diverso dal dato anonimo: i dati sono anonimizzati quando non contengono più alcun mezzo identificativo, mentre sono pseudonimizzati se i mezzi identificativi sono criptati.
[31] Il decreto 231 indica come destinatari “gli enti forniti di personalità giuridica, le società fornite di personalità giuridica e le società e le associazioni anche prive di personalità giuridica” (art. 1, comma 2). La disciplina, invece, non si applica “allo Stato, agli enti pubblici-territoriali, agli altri enti pubblici non economici nonché agli enti che svolgono funzioni di rilievo costituzionale” (art. 1, comma 3).
[32] Il reato presupposto è il delitto non colposo da cui provengono danaro, beni o altre utilità.
[33] Direttore informatico (Chief Information Officer, in sigla CIO) è il manager responsabile della funzione aziendale tecnologie dell’informazione e della comunicazione.
[34] Direttore finanziario (in sigla CFO – Chief Financial Officer) è il manager responsabile della gestione generale delle attività finanziarie di un’azienda. È una delle cariche più importanti all’interno dell’azienda.