Diritto dei dati – Tutela giurisdizionale e amministrativa

Tutela amministrativa e giurisdizionale. Ruolo del Garante privacy e poteri di indagine e correttivi. Sanzioni amministrative pecuniarie, accessorie e risarcimento del danno. Big data e dati non personali.

La tutela giurisdizionale e amministrativa, ovvero come in qualche modo ci si tutela di fronte ad una violazione del trattamento, dei principi del trattamento, comunque in generale delle regole sul trattamento dei dati personali disposte dal GDPR. Andiamo quindi a vedere le regole di cui agli articoli 77 e seguenti del GDPR che prevedono diversi strumenti di tutela. A tutela di cosa? Ovviamente dei diritti dell’interessato che è sempre il soggetto di cui ci dobbiamo accertare che il trattamento sia eseguito in modo corretto. In particolare le forme di tutela, appunto, sono tre. La prima, articolo 77, è la tutela in via amministrativa di fronte a quella che il GDPR chiama l’autorità di controllo. L’autorità di controllo che interviene rispetto ad un trattamento che viola il GDPR è nel nostro ordinamento il Garante Privacy, quindi l’Autorità per la protezione per il trattamento dei dati personali e che chiamiamo in generale o l’autorità o il garante. Quindi tutela amministrativa di fronte all’Autorità garante della privacy. Un secondo profilo di tutela, articolo 78, tutela in via giurisdizionale, quindi di fronte al giudice, rispetto ad una decisione dell’autorità. Quindi quando l’Autorità prende una decisione poi ci si può rivolgere al giudice perché intervenga in seconda battuta rispetto alla decisione presa appunto dall’Autorità. Ultima forma di tutela, di nuovo in via giurisdizionale, quindi di fronte al giudice, per l’esercizio di un diritto riconosciuto dal GDPR. Quindi direttamente mi rivolgo al giudice per far valere un diritto che il GDPR mi riconosce. Innanzitutto partiamo dall’autorità. Qual è l’autorità? Perché ovviamente noi siamo di fronte al GDPR, quindi di fronte a un Regolamento che vale in tutti i Paesi dell’Unione europea. Per individuare l’autorità competente quindi andremo ad applicare il cosiddetto criterio di prossimità con l’interessato, quindi per riconoscere qual è l’autorità competente a intervenire rispetto ad una nostra supposta violazione, quella che noi riteniamo essere una violazione del GDPR andremo a rivolgerci all’autorità o del luogo dove noi come interessati risiediamo, quindi il luogo di residenza abituale dell’interessato, oppure il luogo in cui l’interessato lavora, in alternativa, oppure ancora il luogo in cui è stata effettuata la violazione. Perché la violazione ovviamente inerisce al trattamento e quindi andiamo a rivolgerci all’autorità del luogo in cui il trattamento ha concretamente luogo, quindi se quel certo titolare ha il suo stabilimento in un certo Paese noi ci rivolgeremo all’autorità di quel Paese. Rispetto invece all’autorità giudiziaria, quindi quando adiamo il giudice, quando scegliamo la tutela giurisdizionale, anche qui la regola è quella del rivolgerci al tribunale del luogo in cui il titolare ha lo stabilimento, quindi del luogo in cui si realizza il trattamento di dati oppure il luogo in cui l’interessato ha la sua residenza. Ciò a meno che il titolare non sia una autorità pubblica, quindi se il titolare invece è l’autorità pubblica, allora ci rivolgiamo al giudice del luogo in cui ha sede l’autorità in questione.

Ci soffermiamo sulla tutela dei dati personali all’interno del quadro normativo del Regolamento Generale sulla Protezione dei Dati (GDPR) e la sua implementazione nel diritto italiano, particolarmente attraverso il Codice Privacy aggiornato con il decreto legislativo 101 del 2018. Esploriamo la figura dell’Autorità di controllo, in Italia rappresentata dal Garante per la protezione dei dati personali, e le modalità con cui gli individui possono rivolgersi a questa autorità o al sistema giudiziario per far valere i propri diritti.

Il GDPR prevede strumenti specifici per la tutela dei diritti degli interessati, iniziando con la possibilità di presentare un reclamo amministrativo all’Autorità di controllo qualora si ritenga che sia stata violata la normativa sulla protezione dei dati. Se l’Autorità prende una decisione che non soddisfa l’interessato, quest’ultimo ha il diritto di rivolgersi al sistema giurisdizionale per impugnare tale decisione. Inoltre, esiste la possibilità di avviare azioni giurisdizionali dirette per esercitare i diritti riconosciuti dal GDPR, come il diritto di accesso ai dati, o per ottenere un risarcimento in caso di danni subiti a seguito di violazioni del regolamento.

Un aspetto importante è il principio di alternatività degli strumenti di tutela introdotto dall’articolo 140 bis del Codice Privacy. Questo principio stabilisce che la scelta di una via di tutela (amministrativa o giurisdizionale) preclude automaticamente l’uso dell’altra per lo stesso motivo, a meno che non siano presenti condizioni particolari, come il mancato riscontro da parte del Garante entro i termini massimi stabiliti.

Un accenno, inoltre, alla questione delle sanzioni amministrative pecuniarie, che devono essere effettive, proporzionate e dissuasive, seguendo i criteri stabiliti dall’articolo 83 del GDPR. Viene sottolineato il ruolo del Garante, che può esercitare una varietà di poteri correttivi, da semplici ammonimenti a sanzioni pecuniarie, per garantire la conformità al regolamento.

Diamo un’occhiata ora alle implicazioni più ampie della protezione dei dati nell’era digitale, quando toccano temi come i big data e la distinzione tra dati personali e non personali. In particolare, come il trattamento di grandi volumi di dati spesso unisce informazioni di natura diversa, sollevando sfide significative per quanto riguarda la protezione e l’autodeterminazione degli individui. Questo contesto richiede una regolamentazione che bilanci efficacemente le esigenze economiche e i diritti fondamentali delle persone, una sfida che continua a evolvere con il progresso tecnologico. Le implicazioni dei big data, un concetto che si riferisce all’immensa quantità di dati generati costantemente dall’interazione tra persone e tecnologie digitali. Il trattamento dei big data presenta una serie di sfide particolari per la protezione dei dati personali, poiché spesso combina dati personali e non personali, rendendo il confine tra questi due tipi sempre più sfumato. Il GDPR, che si focalizza sulla protezione dei dati personali, trova applicazione anche nei contesti in cui i dati non personali e personali si intrecciano così strettamente da non poter essere distinti. Questo è particolarmente rilevante in contesti in cui il trattamento di enormi volumi di dati da parte delle tecnologie digitali può influenzare decisioni che hanno impatti diretti sugli individui, come nel caso delle raccomandazioni personalizzate o delle previsioni comportamentali.

L’analisi dei big data può permettere alle organizzazioni di scoprire pattern e tendenze nascoste nei comportamenti umani, offrendo così possibilità predittive che possono essere usate in vari settori, dalla pubblicità al monitoraggio della salute. Queste capacità predittive, tuttavia, sollevano questioni significative riguardo al consenso e alla trasparenza. Per esempio, le persone sono veramente consapevoli e in grado di autorizzare l’uso dei loro dati quando accettano i termini di servizio di app o piattaforme che fanno largo uso di algoritmi di analisi?

Inoltre, l’accento va posto anche su come la normativa europea stia evolvendo per rispondere a questi cambiamenti. Un esempio è il Data Act, un regolamento dell’UE recentemente proposto che mira a regolamentare non solo i dati personali ma anche i dati non personali, riflettendo così la crescente importanza economica e sociale di entrambi i tipi di dati. Questo regolamento si propone di garantire che i dati siano trattati in modo equo e trasparente, cercando di bilanciare le esigenze del mercato digitale con i diritti fondamentali delle persone.

In conclusione, il trattamento dei big data impone una riflessione critica su come le informazioni vengono utilizzate e sulla necessità di garantire che i diritti alla privacy e all’autodeterminazione informativa rimangano centrali nel contesto di una società sempre più guidata dai dati.

Diritto dei dati – I dati personali dei minori

Minori e privacy. Età del consenso digitale e liceità del trattamento, identità personale, intervento dell’esercente la responsabilità genitoriale. Riferimenti a casi giurisprudenziali.

L’articolo 8 del GDPR riguarda il tema dei dati personali dei minori. Quindi facciamo un focus proprio sui minori di età, i soggetti under 18. È un tema che da alcuni punti di vista può sembrare ovvio, il fatto che si parli di dati personali di minori di età, ma in realtà è una cosa relativamente nuova perché prima del GDPR non era previsto nulla che riguardasse in modo specifico il modo in cui si trattano i dati personali dei minori. È una novità del GDPR, a cui poi ha fatto seguito ovviamente il coordinamento da parte del legislatore italiano con il decreto legislativo 101 del 2018. Però è anche un tema abbastanza nuovo per motivi diversi. Sicuramente quello più immediato è il contesto storico di riferimento di questa normativa, normativa del 2016. Però ovviamente la specifica attenzione ai minori è data dal fatto che negli ultimi anni, nell’ultimo decennio, i minori di età hanno una possibilità di accedere a strumenti, computer, telefoni, tablet e così via, che permettono di trattare direttamente i loro dati personali. Quindi l’esigenza di tutela specifica del minore non più in generale come soggetto da tutelare al pari anche dell’adulto, ma come soggetto da tutelare in modo più specifico e più dettagliato perché proprio per le vulnerabilità che caratterizzano la minore età è necessario apprestare degli strumenti di tutela ad hoc, proprio perché non si può paragonare il minore all’adulto rispetto a quella che è la consapevolezza dell’utilizzo degli strumenti digitali, proprio perché nel nostro ordinamento c’è un’attenzione rispetto al minore in quanto tale, in quanto soggetto che deve godere di una tutela specifica anche dal punto di vista del trattamento dei dati personali. Quindi in qualche modo abbiamo un passaggio dovuto proprio all’utilizzo di quelli che vengono chiamati i nuovi media. Quindi se rispetto al passato, se rispetto al momento storico si tutelava la riservatezza in quanto tale e quindi anche la riservatezza del minore veniva tutelata di fronte all’utilizzo delle figure, riferimenti delle figure dei minori rispetto a quello che poteva essere diffuso sui giornali o in televisione, l’utilizzo dei nuovi media e cioè di tutte quelle tecnologie che utilizzano i dati personali, ha richiesto questa attenzione in più. La logica quando noi parliamo di minori di età è sempre quella di dover prestare attenzione, la massima attenzione al processo di formazione dell’identità personale, mentre per un adulto questa formazione può dirsi conclusa o comunque si può continuare a realizzare in delle modalità che sicuramente sono più consapevoli, il minore è per antonomasia il soggetto la cui identità personale è in divenire, è informazione, è infatti un processo, parliamo di formazione, di costruzione dell’identità personale e il punto di vista che si adotta è che l’utilizzo degli strumenti digitali che i minori utilizzano sia ormai talmente diffuso nella quotidianità del minore che lo può utilizzare per svago, per studio. Pensiamo anche ai tempi pandemici a come il minore più che in altre in altre occasioni era perennemente di fronte ad uno schermo, questo utilizzo sempre più diffuso, pensiamo anche a quanto sempre di più i minori utilizzino gli strumenti tecnologici anche dei genitori o pensiamo a tutti gli strumenti che sono proprio nelle case, tutta una serie di strumenti dell’Internet of Things, tutta una serie di strumenti che i minori hanno a disposizione in modo semplicissimo. Però interagendo con tutti questi strumenti, inevitabilmente, l’utilizzo degli strumenti che sono connessi alla rete e quello che poi è il modo in cui i dati vengono trattati e quindi le risposte che la rete da al minore stesso che la utilizza sono tali da essere in grado di incidere sulla formazione dell’identità personale. Proprio rispetto a questo elemento è necessario prestare delle tutele nuove, un’attenzione nuova. Il tema dell’attenzione alla privacy in senso ampio del minore, comunque, non è completamente nuovo. Perché di privacy del minore si inizia a parlare addirittura nell’89, quindi in tempi abbastanza risalenti, ben prima della diffusione della rete per come la conosciamo oggi, però la Convenzione di New York che è la Convenzione sui diritti del fanciullo del 1989, poi ratificata in Italia nel 91, più o meno in quello stesso periodo, prevede che il minore debba essere tutelato da qualsiasi interferenza arbitraria o illegale nella sua vita privata, nella sua famiglia, nella sua corrispondenza, in generale, nella sua privacy. Ricordiamoci che anni 80, anni 90 siamo ancora in una concezione di privacy come riservatezza, principalmente. Quindi il riconoscimento di questa tutela da qualsiasi interferenza arbitraria o illegale, quindi qualsiasi tipo di intromissione dall’esterno che può incidere appunto sulla sua vita privata, sulla sua famiglia, sul suo domicilio, sulla sua corrispondenza e addirittura va oltre perché dice e neppure di affronti illegali contro il suo onore e la sua reputazione, quindi in tutte le varie sfaccettature della riservatezza che abbiamo già descritto, e questa è la disposizione dell’articolo 16 della Convenzione di New York. In più, l’articolo 17, non parlando della riservatezza, però dice che il minore deve essere garantito, il fanciullo anzi dice la convenzione, deve essere garantito rispetto all’accesso ai media e alle tecnologie. Quindi vediamo come pure in un tempo in cui ancora non si parlava di privacy come trattamento dei dati personali distinto dalla riservatezza, abbiamo un’attenzione particolare nei confronti del minore: da un lato dal punto di vista della tutela della sua sfera più intima, dall’altro si cerca di incentivare l’accesso dei minori, dei fanciulli verso l’utilizzo delle tecnologie, del tipo di tecnologie che si potevano creare anche in prospettiva futura. E quindi questa doppia anima da un lato di tutela particolarmente mirata verso la riservatezza, dall’altro questo riconoscimento del minore come soggetto che deve poter accedere alle tecnologie perché è qualcosa che sicuramente può essere utile ai fini del suo sviluppo ai fini della sua crescita. Quindi in qualche modo viene veicolata dalla Convenzione di New York dell’89 un’immagine abbastanza moderna del minore come soggetto che poteva incidere sul proprio processo educativo, formativo, proprio anche attraverso l’utilizzo delle delle tecnologie.

Da un punto di vista di diritto interno, in realtà di privacy del minore non abbiamo per lungo tempo nessun tipo di riferimento. Un riferimento era però presente già nel codice di procedura penale: in particolare l’articolo 114 del codice di procedura penale, in forza del quale si tutelava il minore attraverso un divieto di pubblicazione delle sue generalità e delle sue immagini. Quelli che oggi chiamiamo dati perché sicuramente le generalità di una persona o l’immagine di una persona rientrano nella nozione di dati. Quindi il divieto di pubblicare informazioni come generalità e immagini che ritraessero dei minori che fossero coinvolti in senso ampio da un procedimento di fronte all’autorità giudiziaria penale e quindi che fossero testimoni, persone offese, danneggiati dal reato, insomma qualsiasi tipo di situazione attorno alla quale potesse posizionarsi la figura di un minore rispetto ad un procedimento penale, quanto meno fino al momento in cui non avessero raggiunto questi minori la maggiore età. Quindi una tutela di fronte a insomma alla circolazione delle notizie riferite a determinati procedimenti penali che coinvolgessero dei minori. In un secondo momento il codice della privacy, quindi siamo nel 2003, estende questa stessa tutela che il codice di procedura penale prevedeva rispetto ai procedimenti penali, a qualsiasi altro procedimento di fronte all’autorità giudiziaria. Quindi a livello proprio di riservatezza del minore si ha questa particolare attenzione. Attenzione che tra l’altro era prevista anche all’interno dei codici deontologici di alcune categorie professionali, in particolare il Codice deontologico dell’attività giornalistica che è molto legato ovviamente ai temi dei procedimenti giudiziari. E nel codice deontologico dell’attività giornalistica che è del 96, già si faceva riferimento in particolare all’articolo 7, al fatto che il giornalista, dal punto di vista deontologico, non dovesse procedere alla pubblicazione dei nomi dei minori coinvolti in fatti di cronaca e comunque non soltanto i nomi, qualsiasi tipo di informazione che potesse permettere poi di ricondurre alla sua identificazione. Perché la logica che viene sancita, il principio che viene sancito in questo codice deontologico dell’attività giornalistica è che la riservatezza del minore deve essere tutelata anche quando ci sono delle ragioni che giustificano il diritto di cronaca. Quindi quando si svolge attività di cronaca, attività di critica, comunque bisogna prestare la massima attenzione al minore. Ovviamente tutte queste cose poi sono sì previste nel codice, però poi sono oggetto delle pronunce giurisprudenziali della Cassazione. La Suprema Corte ad esempio nel 2013 si esprime espressamente nel senso di richiedere che nell’ambito dell’attività giornalistica sia doveroso evitare qualsiasi riferimento che possa ledere la riservatezza dei minori. Quindi proprio questa attenzione che anche ovviamente a livello di giurisprudenza si ha sempre rispetto a queste categorie più vulnerabili di soggetti che appunto anche quando si esercita il diritto di cronaca, il diritto di critica è sempre necessario che siano destinatari di una specifica attenzione. A tutto ciò ovviamente non sta attenta soltanto la giurisprudenza ma anche il Garante privacy, in particolare con tutta una serie di provvedimenti, ne riporto uno del 2001, quindi in un tempo anche precedente al Codice della privacy ma successivo al Codice deontologico dell’attività giornalistica del 96, perché proprio già nel 2001, quindi in tempi non sospetti rispetto all’utilizzo, al riconoscimento del diritto alla protezione dei dati personali, comunque si faceva riferimento al diritto alla riservatezza dei minori anche di fronte alle notizie o a fatti di cronaca riportati che riguardano personaggi noti. Quindi anche prima della Cassazione, già il Garante riconosceva l’assoluta necessità di fare attenzione a tutelare i figli anche rispetto a fatti che riguardano soggetti noti nel caso di specie era figlio di un di un parlamentare, perché in tutti questi casi non si deve per far valere il diritto di critica, il diritto di cronaca, non si deve mai perciò affievolire quello che è il diritto alla privacy dei soggetti che sono coinvolti, a maggior ragione appunto se i soggetti in questione sono dei minori. Insomma, già prima del GDPR, per quanto non si facesse riferimento esplicito alla tutela di minori nel trattamento di dati personali, comunque si faceva particolare attenzione a garantire che il minore non subisse delle interferenze idonee ad incidere negativamente, ad impattare negativamente sulla formazione della sua identità personale.

Passiamo quindi al GDPR. Già nei considerando del GDPR sono presenti una serie di riferimenti espliciti ai minori. In particolare, la logica che seguono i considerando è che quando si ha di fronte al trattamento dei dati personali dei minori di età, è necessario rendersi conto che si è di fronte ad un soggetto che è meno consapevole del significato della portata che il trattamento dei suoi dati può avere e dei rischi che quindi ciò può comportare, quindi è necessario prestare attenzione alla sua personalità. Il considerando 38, ad esempio, dice espressamente che i minori meritano una specifica protezione perché sono meno consapevoli dei rischi di Internet. Devono essere particolarmente tutelati da misure di salvaguardia che permettano l’esercizio dei loro diritti di fronte a qualsiasi attività di trattamento dei loro dati personali. In particolare si richiede attenzione di fronte a tutte quelle attività di trattamento dei dati personali che hanno finalità di marketing, oppure che svolgono attività di profilazione del minore, perché ovviamente profilare il minore al fine di rivolgergli, per esempio, delle determinate pubblicità mirate e personalizzate rispetto alle sue preferenze può incidere effettivamente sulla sua sfera giuridica soggettiva e quindi è necessaria una specifica attenzione. Ancora, il considerando 65 fa riferimento all’esercizio del diritto all’oblio e dedica un passaggio anche al minore perché addirittura: dice che il diritto all’oblio è particolarmente fondamentale che sia riconosciuto nei confronti del minore nel momento in cui acquista l’età del consenso digitale, perché potrebbe volerlo esercitare rispetto ad un consenso al trattamento dei dati personali prestato quando era al di sotto della soglia dell’età del consenso digitale e quindi era meno consapevole, sotto quell’età, e quindi una volta che compie l’età del consenso digitale deve riconfermare il consenso già prestato e altrimenti esercitare il diritto all’oblio rispetto ai dati che erano stati trattati, aveva consentito che venissero trattati prima del compimento dell’età per il consenso digitale. Ancora un altro considerando è il considerando 58 che fa riferimento in generale al principio di trasparenza e che quando descrive il principio di trasparenza dice rispetto ai minori è necessaria una particolare protezione, una protezione specifica, perché il minore è meno consapevole e quindi deve ricevere delle informazioni che riguardano il trattamento, che devono essere elaborate in un linguaggio particolarmente chiaro, particolarmente semplice, proprio perché devono essere dei termini che anche il minore possa facilmente comprendere. Insomma già nei considerando troviamo delle linee di attenzione alla figura del minore rispetto all’adulto. Poi vi è la norma che è espressamente dedicata al minore, è la norma di cui all’articolo 8. Già nella rubrica dell’articolo 8 del GDPR, la rubrica è il titolo della norma, dice: condizioni applicabili al consenso dei minori in relazione ai servizi della società dell’informazione. E poi ci sono i tre paragrafi dell’articolo 8 che ci descrivono la disciplina. Innanzitutto si fa riferimento appunto nella rubrica ai servizi della società dell’informazione. Diciamo che la definizione di servizi della società dell’informazione è contenuta in una direttiva del 2015, la 1535 del 2015 dice che i servizi della società dell’informazione sono tutti i servizi prestati a distanza, normalmente dietro una retribuzione e per via elettronica nei confronti di un destinatario dei servizi stessi. Diciamo che in generale sono un po’ tutte le attività che vengono svolte in rete che possono consentire l’accesso alle informazioni o ad attività di comunicazione. Quindi sono servizi della società dell’informazione: la posta elettronica, i social network, le banche dati, le newsletter. Vediamo quindi la norma perché si fa riferimento alle condizioni applicabili al loro consenso. Quindi, innanzitutto parliamo del consenso dei minori. Infatti il paragrafo 1 dice qualora si applichi l’articolo 6, paragrafo 1, lettera a, che è la condizione di liceità del trattamento che si fonda sulla prestazione del consenso. Quindi, innanzitutto, rispetto al minore è fondamentale che ci sia il suo consenso alla luce delle precisazioni che vengono fatte in questo articolo. Allora sempre il paragrafo 1 fa riferimento all’offerta diretta dei servizi della società dell’informazione. Questo riferimento all’offerta diretta vuol dire che la disciplina dell’articolo 8 non si applica a tutti i servizi della società dell’informazione, ma si applica soltanto a quelli che sono offerti in modo diretto ai minori. Quindi se sono il titolare di un trattamento ed esplicito che il servizio che offro è rivolto soltanto ai maggiorenni, allora non sono tenuto ad applicare le regole di quell’articolo 8. Ovviamente nella misura in cui, pur se io lo dovessi esplicitare, questa esplicitazione non venga poi smentita da altri elementi. Per esempio, il fatto che sia un tipo di servizio che per il contenuto che ha è evidente che verrà utilizzato anche da dei minori. Il problema è che il GDPR non ci dà delle precisazioni rispetto a come individuare quali siano gli elementi che possono smentire il fatto che il servizio sia offerto soltanto ai maggiorenni. Da questo punto di vista, quindi, possiamo fare riferimento un po’ al dato comparatistico, possiamo guardare all’esperienza statunitense che è un’esperienza in cui invece vengono espressamente delineati alcuni fattori, alcuni esempi, che sono utili a capire quando un certo servizio sia destinato o meno ai minori di età. E in particolare guardiamo alla disciplina in materia statunitense che è facile ricordare con l’acronimo COPPA che sta per Children’s Online Privacy Protection Act, che è la disciplina statunitense sulla privacy dei minori e che descrive una serie di fattori che ci permettono di capire se il servizio è offerto in modo diretto ai minori o meno, a prescindere appunto da quello che poi il titolare possa sostenere. E questi fattori sono per esempio il contenuto del sito, il tipo di attività che viene svolta su quel sito e il tipo di contenuti che sono fruibili su un certo sito, contenuti audio o contenuti visivi o il fatto che ci siano delle pubblicità che sono rivolte ad un target di bambini o comunque di soggetti minori, o il fatto che all’interno del sito, insomma del servizio, ci siano dei riferimenti a personaggi famosi tra i più piccoli o insomma celebrità che sono facilmente riconoscibili per i bambini o il fatto che ci siano dei modelli o dei soggetti a loro volta di minore età. Quindi,tutta una serie di esempi che effettivamente creano un contesto digitale a misura di bambino o comunque a misura di minore. Tutti questi fattori possono contribuire a ritenere che quel certo servizio sia effettivamente destinato, rivolto a dei soggetti minori. Questo è descritto nella disciplina statunitense, però sono dei parametri, delle linee che effettivamente poi facendo riferimento al dato comparatistico, anche il Garante privacy di qualsiasi Stato europeo o il giudice può sicuramente guardare a questi come esempi utili anche nella propria attività svolta a livello nazionale ed europeo. Siamo di fronte a tutta una serie di possibili contesti in cui effettivamente è necessario, è opportuno garantire queste figure che noi presumiamo essere più fragili, bisognose di tutela rispetto agli adulti, proprio perché su tutte queste piattaforme, su tutti questi siti, su tutti questi servizi che il minore si vede offerto, poi lui stesso può generare dei dati attraverso l’attività che poi realizza nella fruizione di questi servizi, pensiamo all’attività che realizza quando fruisce di un social network, durante un utilizzo di questi servizi, la fruizione di questi servizi genera dei dati personali. Questi dati personali possono poi essere utilizzati dal gestore di questo stesso sito per profilare la loro figura del minore e quindi poi presentare delle pubblicità che possono incidere sulla sua attività, sulla sua formazione.

Il paragrafo 1 fa riferimento all’età di 16 anni, quindi 16 anni per il legislatore europeo è l’età soglia in qualche modo dopo la quale il minore può prestare il consenso. In realtà però, l’ultimo inciso del paragrafo 1 dice che gli Stati membri possono stabilire per legge un’età inferiore a tali fini, purché non inferiore a 13 anni. Quindi, con ciò il legislatore europeo permette agli Stati membri di stabilire al loro interno, quale sia l’età del consenso digitale, l’età del consenso digitale, che però è al massimo individuata in 16 anni o al minimo in 13 anni. E questo è un esempio in cui il regolamento, il GDPR, pur essendo un regolamento, non riesce nell’obiettivo di uniformazione, perché quello che è successo è che tutti gli Stati membri dell’Unione europea hanno scelto età diverse, in alcuni paesi hanno scelto 13 anni, in altri 14, in altri 15, in altri 16. Quindi abbiamo una disciplina che da questo punto di vista è leggermente diversa in base ai Paesi, l’Italia con il decreto legislativo 101 del 2018, che è il decreto legislativo non di recepimento del Regolamento, perché il Regolamento non si recepisce, ma il decreto legislativo che è servito a uniformare la normativa interna con il GDPR. L’articolo 2 quinquies del nuovo Codice, del Codice privacy rinnovato appunto dal decreto legislativo 101, prevede che nel nostro Paese l’età del consenso digitale sia 14 anni. Quindi vuol dire che il minore ultraquattordicenne potrà prestare il consenso. Quindi in Italia l’età del consenso digitale è quella di anni 14. Il minore ultraquattordicenne presta il consenso, il minore infraquattordicenne, quindi più piccolo di 14 anni (paragrafo 1), dice che il trattamento è lecito soltanto se e nella misura in cui il consenso è prestato o autorizzato dal titolare della responsabilità genitoriale (noi tutto l’articolo 8, laddove indica l’età di anni 16, lo dobbiamo rileggere come se al posto di 16 ci fosse scritto 14). Quindi il trattamento dei dati personali del minore è lecito ove il minore abbia almeno 14 anni, ove il minore abbia un’età inferiore a 14 anni il trattamento è lecito solo e nella misura in cui tale consenso sia prestato, autorizzato dal titolare della responsabilità genitoriale. Ovviamente le due situazioni richiedono una serie di considerazioni. Partiamo dal minore ultraquattordicenne, quindi il minore che presta il consenso in modo autonomo. Ovviamente questa l’abbiamo chiamata età del consenso digitale perché la regola che conosciamo tutti è che il minore in realtà, proprio perché minore non abbia una capacità d’agire, perché la capacità di agire, l’articolo 2 del Codice civile dice che viene raggiunta al raggiungimento della maggiore età. Quindi questo vuol dire che il consenso digitale si pone come strumento di esercizio della propria capacità in un’ottica di eccezione rispetto alla regola. Quindi la regola è che la capacità di agire si acquisisce, la capacità di agire è la capacità di incidere sulla propria sfera giuridica soggettiva, si acquisice ai 18 anni. Però questa prestazione del consenso si pone appunto come eccezione rispetto alla regola. E in realtà non ci sono grossi problemi nel considerare il fatto che ci siano delle eccezioni alla regola, perché da questo punto di vista il GDPR non ha introdotto una regola completamente nuova o diciamo inaspettata, perché nel codice civile, ma anche in leggi speciali, ci sono tutta una serie di riferimenti che riconoscono la necessità del minore di autodeterminarsi e quindi rispetto a specifiche situazioni conosciamo la possibilità che il minore incida in tutto ciò che riguarda un po’ le estrinsecazione della propria personalità. Quindi, insomma, ci sono già una serie di riferimenti nel nostro ordinamento che anticipano la capacità del minore di autodeterminarsi, quindi ecco da questo punto di vista non è una cosa totalmente nuova però appunto dobbiamo tenere conto del fatto che è una eccezione, un aspetto comunque particolare. Per quanto riguarda invece il minore infraquattordicenne, lì è necessaria una attenzione in più perché è vero che sicuramente non si vuole in nessun modo impedire l’accesso alle tecnologie che utilizzano i dati da parte dei minori infraquattordicenni però è necessario che questo incentivo all’utilizzo delle tecnologie o comunque questa anche inevitabilità dell’utilizzo di tecnologie da parte dei minori sia appunto realizzata in un modo che presti la massima attenzione al fatto che siamo di fronte a dei soggetti più vulnerabili; sempre nella logica per cui per il nostro legislatore fino ai 14 anni è necessario stare più attenti rispetto al processo di formazione dell’identità personale. Ecco quindi che l’articolo 8 dice che il trattamento dell’infraquattordicenne è lecito solo se e nella misura in cui è prestato o autorizzato dal titolare della responsabilità genitoriale. Allora innanzitutto con titolare della responsabilità genitoriale non includiamo soltanto il genitore ma chiunque svolga la responsabilità genitoriale per il minore, quindi anche per esempio il tutore, quindi va inteso in un senso ampio. Ci concentriamo sui verbi prestato e o autorizzato, perché sembrano sinonimi, però vanno interpretati in un modo diverso. Quindi prestato ci dice l’ipotesi in cui il rappresentante legale del genitore manifesta egli stesso una volontà positiva al trattamento dei dati. Quindi è come in questo caso della prestazione il genitore o comunque il tutore, colui che esercita la responsabilità genitoriale, in qualche modo si va a sostituire, in questo caso nell’attività di prestazione il consenso quindi è direttamente l’esercente la responsabilità genitoriale che presta il consenso per il minore. Invece autorizzato lo dobbiamo leggere in un modo diverso, autorizzato è quindi la situazione in cui il minore presta il proprio consenso direttamente, però ai fini del trattamento è necessario che il consenso del minore venga integrato o comunque confermato dall’esercente la responsabilità genitoriale proprio perché è una sorta di autorizzazione rispetto al consenso che il minore ha prestato in un’iniziale diciamo autonomia. Ovviamente qual è il problema, che tutta questa bella regola si scontra un po’ con la realtà, perché nella realtà è facile immaginare che un minore che utilizza autonomamente gli strumenti digitali sia in grado di aggirare il consenso o comunque la partecipazione del genitore, perché il minore conferma magari che il genitore è d’accordo semplicemente al posto del genitore, il genitore nemmeno sa di questa prestazione del consenso e non ha nemmeno modo di controllarlo, quindi diciamo la questione che si pone è come assicurarsi che questa regola rispetto all’infraquattordicenne venga rispettata.

Qui subentra il principio di accountability del titolare. È il titolare ad essere responsabile per fare di tutto affinché effettivamente vengano rispettati i requisiti della norma. Come fa a fare di tutto, ovviamente come al solito alla luce delle tecnologie a disposizione, dovrà realizzare, dovrà predisporre delle misure necessarie idonee a garantire che la regola venga effettivamente applicata. Quindi c’è proprio l’obbligo del titolare seppure non sia scritto espressamente nell’articolo 8 però in virtù del principio dell’accountability, di responsabilizzazione del titolare, riconosciamo, individuiamo questo dovere del titolare di adoperarsi al meglio in ogni modo ragionevole, quindi sempre anche nel rispetto della proporzionalità, affinché sia possibile verificare che il consenso sia stato prestato o autorizzato da un esercente la responsabilità genitoriale, quindi sostanzialmente che il minore non abbia prestato il consenso senza che il genitore ne sia a conoscenza. Anche qui, piccolo problema: ricaviamo questo dovere del titolare, ma al titolare non vengono date delle linee per rispettare o comunque per sapere in modo definitivo come è giusto adoperarsi. E quindi anche qui, proprio perché il GDPR su questo è lacunoso, possiamo ricorrere al dato comparatistico, riguardiamo di nuovo alla disciplina statunitense che anche rispetto a questo è più completa. Abbiamo tutta una serie di esempi che ritroviamo nella disciplina degli Stati Uniti. Per esempio il titolare può adoperarsi fornendo dei moduli da compilare, quindi il genitore deve compilare un modulo, deve riempire delle caselle da cui effettivamente poi fornisce in modo diretto il consenso al trattamento dei dati da inviare magari via mail o da compilare in un form al momento della registrazione su un certo servizio. Un altro esempio può essere che il genitore debba dare conferma attraverso l’indicazione delle generalità di una carta di credito, oppure che debba fare un collegamento web, quindi una videochiamata attraverso la quale presti effettivamente il consenso. O ancora vengono applicati degli strumenti di riconoscimento facciale attraverso la somministrazione, l’upload di una fotografia. Oppure il genitore può caricare un documento, la fotocopia del documento. Oppure ancora rispondere a specifiche domande. Insomma, tutta una serie di possibilità attraverso cui il titolare può far sì che sia il più vero possibile, il più quasi sicuro possibile che il genitore sia effettivamente partecipe alla prestazione di questo consenso. Rimanendo sul GDPR, quello che possiamo dire è che sicuramente qualsiasi richiesta venga fatta al titolare che risponde del principio di responsabilizzazione, però d’altra parte facciamo sempre valere anche il principio di proporzionalità, quindi il titolare sarà chiamato a predisporre le misure più idonee possibili però sempre sempre all’interno di un approccio proporzionato. Quindi in base a quelli che sono i rischi per il minore che il trattamento porta con sé, dovrà predisporre delle misure più o meno elastiche. Quindi se si tratta di una situazione a basso rischio, magari una conferma via e-mail o di compilazione del form della registrazione è più che sufficiente. Invece se si tratta di attività di trattamento ad alto rischio, allora magari può essere richiesta quella misura più stringente, più complicata, che dia maggiori certezze del fatto che il genitore abbia partecipato. Quindi sempre un approccio al rischio, che in base alla valutazione del rischio che il minore in questo caso corre rispetto al trattamento dei suoi dati, ricordiamoci sempre che la misura della gravità del rischio la stabilisce il titolare stesso, poi però sarà responsabile della sua valutazione nel caso in cui non sia corretta, e poi predisporre le misure che alla luce di queste considerazioni vengono considerate più idonee. Ovviamente i problemi permangono perché resta il fatto che se il metodo di verifica del consenso genitore è troppo blando, allora il minore magari riesce ad aggirarlo, così come se è troppo stringente pensiamo a quelle riguardanti il caricamento della carta di credito, che è un metodo particolarmente difficile per il minore, magari da aggirare, allora lì il problema che si pone è che possano essere magari limitate le possibilità del minore di accedere al servizio perché un genitore sicuramente è più restio dal lasciare i dati della sua carta di credito su un certo sito che poi magari utilizza il minore stesso. Quindi da un lato il rischio di aggiramento del minore, dall’altro il rischio che il consenso non venga prestato, però un bilanciamento poi di volta in volta da fare in relazione al caso concreto perché la logica per quanto poi ci sia questo rischio è comunque che bisogna sempre bilanciare da un lato il diritto del minore ad accedere ai servizi digitali, dall’altro però l’esigenza della sua sicurezza e in questo ovviamente il ruolo del titolare della responsabilità genitoriale è fondamentale. Peraltro teniamo comunque conto del fatto che questa regola riguarda gli infraquattordicenni, quindi comunque dal compimento del 14º anno poi il minore può intervenire direttamente.

Peraltro anche rispetto al modo in cui intervengono i genitori si pongono delle questioni, in particolare i genitori devono essere per forza d’accordo? O basta la volontà di uno dei due? Per esempio questo è un altro tema che si pone in realtà ben prima del discorso specifico sul trattamento dei dati personali perché è un tema che si è posto in generale rispetto alla pubblicazione delle immagini dei minori. E su questo la giurisprudenza più risalente era effettivamente più incline a riconoscere il fatto che bastasse la volontà di uno. Un esempio antecedente ovviamente le dinamiche social è quello trattato da una Cassazione del 2006, in particolare la 21172 che era riferito a una domanda di risarcimento dei danni che la madre di un minore avanzava nei confronti dell’altro genitore perché questo genitore, personaggio noto, aveva portato i figli con sé in spiaggia, con la nuova compagna e le fotografie della giornata in spiaggia erano state pubblicate da dei giornali. La nuova compagna in particolare era un personaggio televisivo e in queste fotografie risultava in topless. La madre agisse per risarcimento dei danni provocati nei confronti della propria dignità e della dignità del minore che risultava essere state lese da questa pubblicazione. La Cassazione invece diceva che la partecipazione, la volontà del genitore che aveva permesso che queste foto venissero scattate era sufficiente ad integrare la volontà necessaria alla pubblicazione anche delle immagini dei minori in queste fotografie e che quindi la domanda di risarcimento del danno che la madre aveva avanzato andava rigettata. Un secondo esempio un po’ più recente e che si va più diffondendo è quello per cui si richiede la volontà congiunta dei due genitori. Da questo punro di vista citiamo una ordinanza del Tribunale di Mantova del 2017, che è stata particolarmente studiata e commentata perché è stata una ordinanza abbastanza rilevante, perché qui, per la prima volta, c’è questo cambio di passo un po’ più netto della giurisprudenza, che poi è stato seguito anche da sentenze successive di altri tribunali. In questo caso invece entrando in gioco lo specifico aspetto dei social network (che invece nel caso di prima non c’era perché abbiamo detto che era del 2006), e con riferimento specifico ai social network, invece, la Corte, il giudice mantovano si è pronunciato nel senso di ritenere fondamentale la partecipazione di entrambi i genitori. Il caso qui era quello di genitori tra loro separati, ma con un affido condiviso dei figli minori e nell’accordo di separazione addirittura i genitori avevano scritto di non ammettere la pubblicazione delle foto dei figli su Facebook o comunque i social network. La madre in particolare, si impegnava a non farlo, tuttavia non rispettava questo impegno che era stato preso nell’accordo di separazione e quindi non solo continuava a pubblicare foto dei figli su Facebook, ma nemmeno aveva rimosso quelle che aveva già postato come con il marito si erano detti. Quindi il marito, il padre dei bambini d,ei figli minori, si rivolgeva al giudice chiedendo di inibire questa attività che la moglie continuava a porre in essere e a obbligare alla rimozione delle immagini già pubblicate. Il tribunale dà pienamente ragione al padre. Conferma questa richiesta del padre e il tribunale mantovano in questa ordinanza appunto del 2017 afferma proprio l’imprescindibilità del consenso di entrambi per la pubblicazione delle foto, perché la logica è che la circolazione delle foto dei minori su internet, in particolare i network, è una pubblicazione che non è fine a se stessa, perché nel momento in cui ho posto la foto di mio figlio minore non la sto pubblicando su internet e poi ho la certezza che la posso vedere solo io. Ma il giudice afferma che nel funzionamento dei social network, nel funzionamento della rete è implicita la pericolosità, è implicito il rischio per il minore dato dal fatto che la circolazione dell’immagine poi è incontrollabile. Un’immagine, una volta che viene postata effettivamente, poi può circolare, può giungere anche a dei soggetti sconosciuti che la possono utilizzare in qualsiasi modo. Quindi la pubblicazione dell’immagine del minore è in sé potenzialmente lesiva, potenzialmente rischiosa, potenzialmente pregiudizievole e quindi la soglia di accettabilità della pubblicazione richiede il consenso di entrambi, quindi senza il consenso di entrambi non è possibile, perché il rischio è talmente elevato che è più opportuno evitare questa combinazione.

Altro esempio, Tribunale di Rieti che è di poco successivo perché del 2019 però questa è una sentenza e non ordinanza e qui siamo di fronte ad una situazione invece di genitori separati in cui il padre aveva una relazione con un’altra donna. Questa donna stessa postava le foto dei figli del compagno, figli minori su Facebook e su determinati social e la madre di questi bambini interveniva per richiedere la cancellazione. E anche il giudice di Rieti ha fatto riferimento allo stesso identico principio sancito dal giudice mantovano due anni prima, perché proprio si sancisce la necessità di questa attività condivisa da parte dei genitori perché la diffusione e la circolazione delle immagini sui social network va considerata potenzialmente lesiva. Questa tendenza rientra perfettamente in quello che è in generale la disciplina del rapporto tra genitori e figli, perché il principio che regola l’attività dei genitori nei confronti dei figli, guardiamo gli articoli 315, 315 bis del codice civile, ci dicono proprio che i genitori devono sempre realizzare nei confronti dei figli attività che siano volte a rispondere a quelle che sono le inclinazioni dei figli, le volontà dei figli. La volontà del figlio deve essere presa in considerazione. Quindi anche la volontà del figlio capace di discernimento può essere considerato dal giudice anche nel caso di disaccordo dell’altro genitore. Però sono tutte situazioni che vanno viste nel caso concreto, ciò che occorre è che di fronte allo scontro tra l’esercente la responsabilità genitoriale interviene il giudice e il giudice quando deve decidere rispetto a delle vicende dei fatti che riguardano un minore deve sempre valutare il principio che è riconosciuto a livello ONU del “best interest of the child“. La logica è sempre quella di prendere una decisione che nel caso concreto sia in grado di soddisfare i migliori interessi del minore i best interest of the child. Un esempio in tal senso,sempre di merito, è una decisione del giudice romano in questo caso, in cui c’era uno scontro tra madre e figlio, quindi non tra i genitori ma tra madre e figlio, perché il figlio si scontrava con la madre in quanto questa pubblicava continuamente immagini su Facebook del figlio minore, non solo pubblicava le immagini, ma pubblicava anche post quindi per iscritto in cui descriveva che il figlio aveva determinati problemi e aveva determinate questioni per cui non stava bene e pubblicava tutto ciò su Facebook. Il figlio si rivolgeva quindi al giudice e il giudice riteneva effettivamente di dover intervenire rispetto a questo comportamento della madre perché andava a considerare il comportamento della madre come tale da incidere in modo potenzialmente irrimediabile sul rapporto tra madre e figlio. In particolare, il figlio chiedeva anche che gli venisse consentito di andare a studiare all’estero per allontanarsi dalla madre per tutto il malessere che gli aveva provocato questo suo attivismo sui social e il giudice effettivamente accoglieva la richiesta del figlio sostenendo che il rapporto madre figlio era talmente compromesso dall’utilizzo dei social da parte della madre che solo attraverso l’allontanamento magari si sarebbe potuto ristabilire. Insomma il ruolo del giudice da questo punto di vista è molto importante e sempre deve andare a verificare le situazioni del caso concreto.

Chiudendo sul tema del consenso, il considerando sul diritto all’oblio torna a questo punto del discorso perché rispetto al minore infraquattordicenne il cui consenso viene prestato o autorizzato dal genitore, dobbiamo tenere conto che al compimento dell’età del consenso digitale il minore deve avere la possibilità di confermare quel consenso o altrimenti esercitare il diritto all’oblio rispetto al consenso precedentemente prestato. Proprio perché la logica è che una volta compiuta l’età del consenso digitale, deve essere lui personalmente a prendere una decisione rispetto alla liceità del trattamento dei dati personali. Infatti tornando all’articolo 8, al testo dell’articolo 8, il riferimento è che il trattamento è lecito, le condizioni sono proprio quelle di liceità che richiedono la partecipazione diretta dell’interessato una volta che giunge all’età del consenso digitale.

Ultimo aspetto, il paragrafo 3 dell’articolo 8 che ci dice che il paragrafo 1 (quindi quello riferito alla prestazione, alla liceità del trattamento) non pregiudica le disposizioni generali di diritto dei contratti e questo è un aspetto importante perché il porre un’età del consenso digitale sotto la maggiore età è qualcosa che si pone come eccezione rispetto alla regola e la conferma che sia un’eccezione in realtà, la da lo stesso paragrafo 3 proprio perché dice che questa previsione dell’articolo 8 non incide, non intacca sulle regole, sulle norme degli Stati membri. Quindi tutte le regole che gli Stati membri abbiano rispetto alla validità, all’efficacia di un contratto, non sono minimamente intaccate da questa previsione. Quindi qui cosa succede, succede che poi di volta in volta bisognerà far interagire le norme di diritto dei contratti con le norme sulla protezione dei dati personali, laddove le due debbano essere applicate in un medesimo contesto, perché potremmo essere di fronte ad una situazione in cui il minore ha l’età del consenso digitale, perché magari a 15 anni, però, non avendo raggiunto la maggiore età, non può stipulare un contratto valido. Quindi potremmo essere di fronte ad una situazione in cui il trattamento dei dati personali è lecito, però il contratto a cui il trattamento afferisce è un contratto annullabile perché il rimedio previsto per il contratto stipulato da minori di età è l’annullabilità. Quindi, di fronte all’eventuale annullamento, perché l’annullamento non è automatico, l’annullamento deve essere chiesto dall’interessato entro cinque anni da quando è stipulato il contratto, siamo di fronte a quelle situazioni in cui effettivamente potremmo avere un contratto annullabile, ma un consenso validamente prestato, quindi un trattamento di dati personali è lecito. Ecco, in questi casi l’interazione fra le due discipline ovviamente sarà tale che, in caso di annullamento del contratto, appunto perché stipulato dal minore di età, nell’eventualità di annullamento del contratto allora automaticamente dovrà cessare anche il trattamento di dati personali che da quel contratto dipende, proprio perché non toccandosi le regole sulla esecuzione, l’efficacia e la validità dei contratti stipulati dai minori, sarà necessario poi di volta in volta far interagire le due discipline.

Diritto dei dati – I diritti dell’interessato

I diritti dell’interessato: accesso ai dati, rettifica dei dati, cancellazione dei dati, oblio, limitazione del trattamento, portabilità dei dati, opposizione al trattamento.

Passiamo a vedere quali sono i diritti dell’interessato che fanno un po’ da contraltare rispetto a quelli che sono gli obblighi dei titolari del trattamento proprio perché tutti i vari obblighi poi vanno a specificarsi nei diversi diritti che vengono riconosciuti, guardiamo agli articoli da 15 in poi del GDPR e in particolare il diritto di accesso ai dati personali, il diritto di rettifica, di integrazione, di cancellazione e che sono diritti un po’ più noti anche nella disciplina della privacy precedente e poi in particolare il diritto all’oblio e il diritto alla portabilità dei dati sono invece dei diritti di introduzione recente perché sono del GDPR stesso. Nel complesso quello che ci interessa è avere chiaro che tutti questi diritti in modo appunto complessivo vanno a rendere esercitabile in concreto il più ampio diritto all’autodeterminazione per quanto riguarda il controllo, il trattamento, la protezione dei dati personali, quindi in generale parliamo di autodeterminazione rispetto alle proprie informazioni. Iniziamo con l’accesso, l’accesso di cui all’articolo 15 del GDPR. L’accesso come già dal nome possiamo facilmente intuire è volto ad accedere, a reperire, a ottenere delle informazioni. Informazioni rispetto alle finalità del trattamento, alle categorie di dati che vengono trattati (sono dati comuni o se sono i dati particolari dell’articolo nove), informazioni rispetto al soggetto titolare del trattamento, al periodo per cui è previsto il trattamento dei dati o informazioni rispetto ai propri diritti. Banalmente un interessato che non conosce quali sono i propri diritti perché non conosce la normativa ha diritto di accedere a queste informazioni, di chiederle al titolare, o ancora importante il diritto a conoscere se delle proprie informazioni saranno utilizzate per attività interamente automatizzate, ovvero i processi decisionali automatizzati. La logica è sempre quella di garantire che il soggetto interessato al trattamento dei propri dati possa nel tempo mantenere un controllo, anche dopo che il trattamento è iniziato e quindi, per esempio, verificare se effettivamente le condizioni di liceità del trattamento perdurano, se il soggetto titolare sta rispettando le finalità che aveva dichiarato e così via.

Proprio perché riguarda il mantenimento del controllo rispetto alle proprie informazioni, il diritto all’accesso è un diritto che possiamo esercitare sempre. Quindi non è possibile un rapporto tra titolare e interessato in cui il diritto d’accesso sia subordinato, ad esempio, ad un certo tempo. Posso chiedere l’accesso in qualsiasi momento per cui perduri il trattamento. Questa logica è fondamentale proprio perché in ogni momento si ha diritto di conoscere come si sta svolgendo questo rapporto che riguarda il trattamento dei nostri dati e poi perché l’accesso tra tutti i diritti è un po’ il diritto che viene esercitato in apertura, l’accesso in qualche modo è strumentale all’esercizio dei diritti successivi, perché se voglio esercitare il diritto alla cancellazione magari prima esercito un accesso per conoscere meglio le dinamiche e poi valuto che effettivamente voglio procedere alla cancellazione di dati. Quindi nessun vincolo temporale. E poi l’altra cosa importante è che nel momento in cui lo esercito, il titolare mi deve rispondere innanzitutto entro un tempo ragionevole quindi così come io interessato non ho limiti di tempo per fare la richiesta, dall’altra parte invece il titolare ha dei limiti di tempo per rispondere alla mia richiesta. Si dice entro un termine ragionevole, ovviamente in considerazione delle tecnologie a disposizione del titolare e delle sue esigenze organizzative, però deve farlo entro un tempo appunto ragionevole, al più tardi entro un mese dalla richiesta. Questo periodo di un mese può essere anche prorogato fino a un massimo di due mesi, purché il titolare, quindi questo è fondamentale, purché il titolare comunichi all’interessato il ritardo, quindi la necessità di questa proroga che deve essere effettivamente necessaria al titolare e quali sono le ragioni che la rendono necessaria, quindi deve essere trasparente al massimo rispetto al motivo per cui questa risposta esiterà ad essere fornita all’interessato proprio perché la regola sarebbe che deve farlo entro un tempo ragionevole e senza ingiustificato ritardo. Per quanto riguarda poi la forma di questa risposta, la forma di questa risposta è libera, le informazioni che il titolare fornirà all’interessato possono essere fornite in qualunque forma, quindi sia cartacea, telematica o che sia in formato audio o che sia in formato video, purché la forma in questione sia intellegibile. Inoltre, oltre al limite diciamo della intellegibilità, l’altra caratteristica fondamentale delle informazioni che vengono fornite a seguito di accesso è che devono essere fornite in modo completo e chiaro.

Di regola, l’esercizio dell’accesso non prevede un pagamento. Per evitare però che un interessato possa abusare del diritto che ha di accedere alle informazioni, allora di fronte ad una richiesta reiterata delle informazioni, il titolare può richiedere, può addebitare un contributo di spese all’interessato, e sarà un contributo che ovviamente dovrà essere parametrato in base ai costi amministrativi necessari all’adempimento della richiesta e quindi per giudicare che questi costi richiesti siano corrispondenti a quanto effettivamente ammonta l’onere amministrativo in questione, bisogna anche documentare queste spese. Quindi di regola non si paga nulla però, purché siano documentati e di fronte a richieste reiterate è possibile addebitare il costo dell’accesso. Ultimo aspetto legato all’accesso è che l’esercizio dell’accesso è subordinato dall’articolo 15 alla identificazione dell’interessato, quindi il titolare deve poter identificare il soggetto interessato. Oltre a dare le proprie generalità per il resto l’interessato non deve addurre nessun tipo di motivazione, quindi qualunque sia il motivo per cui sto esercitando l’accesso non devo giustificarmi con il titolare, lo esercito senza dover motivare il perché della mia richiesta. Se ponesse degli ostacoli, se ponesse limitazioni rispetto all’esercizio dei suoi diritti allora andrebbe contro a quel principio di correttezza già trattato. Quindi qui ritroviamo un’altra concretizzazione del principio della correttezza che è proprio quella da parte del titolare di permettere all’interessato di esercitare nel modo più semplice possibile i suoi diritti. Le stesse regole legate ai tempi di esercizio del diritto e di risposta da parte del titolare, valgono per l’accesso e valgono anche per i diritti di integrazione, di rettifica (articolo 16 del GDPR). Questi diritti sono dei diritti che in qualche modo vanno a tutelare in modo più specifico, più mirato, il diritto all’identità personale dell’interessato perché la rettifica e l’integrazione sono dei diritti che permettono attraverso il loro esercizio di contestualizzare, di completare, di aggiornare le informazioni che compongono la rappresentazione verso l’esterno della persona e quindi in questo modo rendere questa rappresentazione pienamente aderente alla realtà attuale di quel soggetto e quindi a tutelarne l’identità personale. Perché la logica è che se rispetto alla mia identità personale, la rappresentazione che si fa della stessa è una rappresentazione che si basa su informazioni incomplete o informazioni non aggiornate, allora la rappresentazione che esce fuori della mia persona è una rappresentazione falsata, non corretta e quindi lesiva della mia identità personale. Attraverso l’esercizio del diritto alla rettifica e all’integrazione si interviene proprio da questo punto di vista e quindi si ricostituisce con il maggior grado possibile di accuratezza la mia rappresentazione perché andiamo a completare tutte le informazioni che non dovessero essere aderenti. Quello che dobbiamo sempre pensare è che tutto ciò che è incompleto in questo tipo di contesto, inesatto, poco chiaro, rende l’informazione in qualche modo falsata e in generale la logica è sempre quella per cui l’informazione falsata può divenire in determinati modi lesiva della nostra identità personale.

In modo complementare a questi diritti di accesso, rettifica, integrazione è la cancellazione e l’oblio, siamo nell’articolo 17. Se io interessato mi rendo conto che sono di fronte a determinati motivi che l’articolo 17 mi elenca, posso chiedere la cancellazione dei dati che mi riguardano. Alcuni esempi sono per esempio il fatto che quei dati non siano necessari alle finalità che il titolare sta perseguendo e qui stiamo concretizzando per esempio il principio di minimizzazione, oppure i dati che ho fornito non sono necessari davvero alle finalità che il titolare persegue, quindi li cancello perché non li servono. Ancora, il trattamento ha come condizione di liceità il mio consenso, io revoco il mio consenso, quindi viene meno la condizione di liceità, chiedo la cancellazione. Oppure scopro che il trattamento dei dati si sta realizzando in modo illecito e quindi chiedo la cancellazione; tutta una serie di motivi per cui posso chiedere la cancellazione. Però proprio perché ci sono delle situazioni in cui mi devo trovare, riguardo alla cancellazione non siamo di fronte ad un diritto esercitabile senza motivarlo, proprio perché è necessario ritrovarsi in determinate situazioni che appunto l’articolo 17 ci elenca. Peraltro anche quando la nostra richiesta è fondata, la cancellazione, nel senso di distruzione di dati, non è l’unico modo in cui si può soddisfare la richiesta dell’interessato perché sicuramente la distruzione dei dati che sono nella disponibilità del titolare è un primo modo, però sono idonei a soddisfare il diritto di cancellazione anche altre attività, in particolare la anonimizzazione dei dati, qualsiasi attività che renda impossibile reidentificare il soggetto. Quindi cancellare questi dati non è l’unica cosa che il titolare può fare, ma lo stesso scopo si può raggiungere anche rendendo anonimi questi dati con le tecnologie a disposizione, purché appunto sia fatto in un modo tale da rendere impossibile che i dati anonimi che restano, permettano di reidentificare il soggetto a cui si riferivano. Tant’è che mentre la anonimizzazione è possibile perché caratteristica della anonimizzazione è proprio questa scissione in qualche modo definitiva tra informazione e persone a cui si riferiscono, d’altra parte lo stesso scopo non si potrebbe raggiungere con la pseudonimizzazione, quindi con l’attribuzione ai dati di uno pseudonimo, pseudonimizzazione dei dati. Proprio perché nella pseudonimizzazione, rispetto alla anonimizzazione dei dati, non c’è questo elemento di definitività, perché se attribuisco uno pseudonimo rispetto ad un dato, in un secondo momento potrei di nuovo identificare il soggetto, invece se lo rendo anonimo automaticamente non posso reidentificare la persona a cui si riferivano. Quindi la cancellazione si può realizzare in tutti i modi con cui rendo irreversibile il collegamento tra un dato, un’informazione e una persona. Ovviamente anche qui teniamo sempre conto che a tutela del titolare vige sempre il principio di proporzionalità, per cui tutte queste attività si possono pretendere nella misura in cui il titolare abbia poi la possibilità a livello di costi, di tecnologie e di organizzazione propria, per soddisfare la richiesta. Ovviamente nel caso in cui il titolare aveva anche trasmesso a dei terzi i nostri dati di cui chiediamo la cancellazione, quindi rispetto ai quali esercitiamo il diritto alla cancellazione, il titolare dovrà rivolgere anche a questi terzi l’indicazione rispetto alle attività che ha svolto per la cancellazione e quindi questi terzi che avevano ricevuto i nostri dati saranno tenuti a fare altrettanto.

Nella pratica quello che succede è che il soggetto interessato spesso e volentieri esercita il diritto alla cancellazione principalmente in casi in cui si rende conto che il trattamento viene realizzato in assenza di un fondamento, in assenza di una condizione di liceità. In tutti questi casi il titolare può effettivamente rispondere anche in modo diverso rispetto all’accoglimento della richiesta, ad esempio il titolare potrebbe non accogliere la mia richiesta e dimostrare che il fondamento giustificativo del trattamento sussiste perché siamo nelle condizioni di liceità dell’articolo sei, e allora potrebbe respingere la nostra richiesta e quindi continuare il trattamento, verificando che effettivamente la richiesta non sia fondata.

L’articolo 17 fa anche riferimento al diritto all’oblio. Il diritto all’oblio è un diritto di nuova introduzione nel GDPR. È un diritto che conosciamo già da prima però se ne parla per la prima volta a livello normativo nel contesto del trattamento dei dati. Quindi noi conoscevamo già il diritto all’oblio con riferimento alla tutela di quella che oggi chiamiamo riservatezza, la privacy intesa come riservatezza. Con il GDPR a livello normativo entra in gioco l’oblio anche rispetto al trattamento dei dati. Sottolineo a livello normativo perché, come vi dico tra poco, la giurisprudenza aveva iniziato già a toccare questo aspetto. Allora in generale mi pare che lo avessimo già accennato nella prima lezione, il diritto all’oblio è il diritto ad essere dimenticati. Quindi il diritto di una persona a chiedere che determinate notizie sul suo conto, trascorso un certo periodo di tempo, vengano cancellate. Perché? Perché ormai risultano dimenticate o comunque sconosciute, ignote alla generalità dei consociati e quindi non c’è più interesse a venirne a conoscenza. Quindi anche delle notizie che tempo addietro erano state legittimamente divulgate, erano state pubblicate in un certo momento storico in modo del tutto legittimo, tempo dopo si può richiedere che vengano cancellate proprio perché non rivestono più un interesse, non hanno più interesse ad essere conosciute. Ed essere conosciute vuol dire ad essere divulgate attraverso i circuiti dell’informazione che un tempo erano soltanto i giornali o al massimo la televisione, ormai anche e quasi principalmente su internet. Quindi il criterio principale, sicuramente per verificare la fondatezza della richiesta di esercitare il diritto all’oblio è il trascorrere del tempo. Quindi è necessario che sia trascorso un tempo tale che abbia fatto perdere rilevanza alla notizia. A meno che poi non siano nel frattempo emersi dei fatti nuovi o comunque determinate dinamiche che in qualche modo riescono ad integrare il quadro che si era delimitato anni addietro, tempo addietro. Però a meno che non ci siano questi fatti nuovi o comunque questi aspetti che un tempo non erano noti allora diciamo effettivamente passato un certo periodo di tempo si può dire che la notizia non sia più di interesse per la collettività. 

Un altro diritto è quello alla limitazione del trattamento. Il diritto alla limitazione del trattamento è previsto dall’articolo 18 del GDPR. Ed è un diritto che può essere esercitato soltanto nei casi indicati dall’articolo 18 che sono quattro. Sono quindi delle ipotesi tassative. Vuol dire che non sono degli esempi di situazioni in cui può essere esercitato, ma sono proprio le uniche ipotesi in cui si può esercitare la limitazione. La prima ipotesi è quella in cui l’interessato contesta l’esattezza dei dati, quindi sostiene che i dati non siano esatti, i dati sul suo conto, e quindi per il periodo necessario a verificare l’esattezza o meno di questi dati, il titolare per rispondere al diritto di limitazione, sospende – limitazione nel senso di sospensione in questo caso – sospende il trattamento. Una seconda ipotesi, quella alla lettera b dell’articolo 18, è quella situazione in cui il trattamento risulti essere illecito, però l’interessato chiede al titolare di limitare l’utilizzo dei dati ma comunque di non interrompere definitivamente il trattamento. Quindi evidentemente sono situazioni in cui il trattamento si rivela essere illecito però l’interessato ha comunque dei motivi per preferire che il trattamento continui seppur in modo limitato e quindi chiede la limitazione ma anche la prosecuzione del trattamento stesso. Una terza ipotesi, lettera c dell’articolo 18, è quella in cui i dati non sono più necessari al titolare, però di nuovo l’interessato chiede che ci sia una limitazione del trattamento alla sola conservazione dei dati perché evidentemente questa conservazione gli serve per l’accertamento o l’esercizio dei suoi diritti in sede giudiziaria. Quindi se magari quei dati li devo utilizzare perché mi servono in sede giudiziaria allora chiedo che seppure il titolare non abbia più motivo per trattare i dati, comunque limiti il trattamento alla sola conservazione e li conservi così che io li possa utilizzare in sede giudiziaria. Poi ultima ipotesi, quella della lettera d, in cui l’interessato si oppone al trattamento che è necessario per un legittimo interesse del titolare e quindi, in questo caso (come nel primo, quello della lettera a), il titolare limiterà il trattamento nel periodo che è necessario a verificare che il suo legittimo interesse prevale sull’interesse del soggetto i cui dati personali vengono trattati. Ora da questa descrizione si capisce che le ipotesi più simili tra loro sono la prima e l’ultima e le due in mezzo. Perché la prima e l’ultima si coglie la loro natura cautelare. La logica è impedire la prosecuzione del trattamento per il periodo necessario all’accertamento di una situazione che è invece incerta: prima ipotesi quella dell’esattezza dei dati o meno, secondo ipotesi quella della necessarietà o meno del trattamento per legittimo interesse. E quindi per il periodo di tempo, per questo si parla di natura cautelare, per il periodo di tempo necessario all’accertamento di queste situazioni si limita il trattamento alla sola conservazione. Poi nel caso in cui si rileva che i dati sono esatti o il legittimo interesse del titolare prevale su quello dell’interessato, allora il titolare ne darà comunicazione all’interessato e riprenderà il trattamento così come lo svolgeva prima. Invece, nel caso in cui la verifica rispetto all’esattezza, rispetto alla prevalenza dell’interesse, dia ragione all’interessato allora poi l’interessato potrà chiedere la cancellazione dei dati o potrà insomma decidere come procedere. Nei casi invece delle lettere b e c, e quindi quelle riguardanti le richieste dirette di limitazione da parte del dell’interessato (nel primo caso abbiamo detto anche se il trattamento è lecito e nel secondo caso abbiamo detto quando i dati serve che siano conservati perché il soggetto interessato li utilizzi in sede giudiziaria), allora in questi casi finché perdura la limitazione, i dati saranno comunque trattati dal titolare, quando poi finisce questo periodo, allora si procederà alla cancellazione di questi dati. Nel primo caso, perché il trattamento è illecito, quindi comunque l’illiceità del trattamento comporta la cancellazione, nel secondo caso perché il trattamento non è più necessario e quindi si procede alla cancellazione. Ciò che rileva però è che comunque ci si debba trovare in una di queste quattro ipotesi, non è possibile chiedere la limitazione del trattamento per ipotesi diverse da queste quattro. Quindi l’interessato potrà richiederlo in queste quattro ipotesi che però non deve descrivere. Quindi la richiesta deve partire dall’interessato che però non deve dire “mi sto ritrovando nell’ipotesi della lettera a, b, c o d”, deve semplicemente avanzare la richiesta. Poi, se il titolare non vuole soddisfare queste richieste, sarà lui a dover dimostrare che non si è all’interno del perimetro delineato dall’articolo 18 e quindi risponderà che non intende procedere alla limitazione del trattamento, dando dimostrazione dell’infondatezza della richiesta perché non aderente all’elenco dell’articolo 18. Quando invece deve soddisfare la richiesta come lo fa? Da un punto di vista tecnico quello che deve fare, quello che deve svolgere, è un’attività di contrassegno dei dati, deve in qualche modo imprimere sui dati interessati dalla richiesta un vincolo di inutilizzabilità, cioè questi dati devono dal punto di vista tecnico non essere più utilizzati, né essere considerati utilizzabili e si dovrà limitare alla loro conservazione. Diciamo che questa marcatura, questo contrassegno dei dati interessati dalla richiesta può avvenire poi in qualsiasi modo, sta al titolare individuare il modo in cui limiterà il trattamento. Quindi ad esempio, li può trasferire in un sistema di trattamento diverso da quello dove sono, oppure li può rendere inaccessibili, oppure li può rimuovere. Insomma, il modo in cui lo fa è nella sua discrezionalità, purché appunto soddisfi la richiesta, ovviamente sempre con il solito principio di proporzionalità, nei limiti di quanto gli è possibile in base ai costi che questa operazione comporta, in base alle sue tecnologie a disposizione.

Altro articolo che come l’oblio è stato introdotto nel GDPR per la prima volta è il diritto alla portabilità dei dati. Il diritto alla portabilità è un diritto che forse più di tutti esprime quella doppia anima del GDPR e cioè di tutela contestuale della persona nella rappresentazione della identità personale attraverso i dati e contestualmente tutela del mercato attraverso la circolazione dei dati. Perché il diritto alla portabilità è proprio funzionale non solo appunto a tutela della persona ma anche proprio al funzionamento del mercato digitale. Proprio perché la trasmissione dei dati in cui la portabilità tipicamente si realizza, permette una circolazione dei dati che possono essere utilizzati anche a livello di mercato, anche a livello di attività svolta dai professionisti del mercato in qualunque tipo di settore, e quindi poi è in questo modo la loro circolazione in qualche modo permette di generare ricchezza appunto anche per gli operatori economici e quindi aumentare e favorire la concorrenza nelle dinamiche di mercato. Innanzitutto il primo strumento, la prima estrinsecazione della portabilità è proprio quella della trasmissione, quindi si richiede la trasmissione di dati che sono in capo a un certo titolare, ad un altro titolare. E questo deve avvenire, prevede l’articolo 20 del GDPR, in un modo che sia accessibile, che sia chiaro, che sia strutturato, si dice interoperabile, nel senso che il titolare che trasmette i dati di cui dispone all’altro titolare deve farlo in modo tale che questo titolare possa utilizzare questi dati. Però poi la portabilità in generale è qualcosa che permette effettivamente anche il loro accesso e il loro riutilizzo. Cioè quando trasmetto devo poi permettere al secondo titolare di utilizzarli perché se li trasmetto in un formato per cui poi il titolare che li riceve non li può utilizzare allora non se ne fa niente. Quindi il diritto alla portabilità include in sé non solo la trasmissione ma anche la possibilità di accedervi, di riutilizzarli, di riceverli, di mantenerli, di conservarli. Deve essere reso possibile tutto questo e la ratio appunto è quella di rendere il più semplice possibile la circolazione di questi dati facendo, sempre attenzione alla tutela della persona, perché la loro circolazione permette di favorire la concorrenza sul mercato. L’articolo 20, però, delimita quali sono i dati che possono essere oggetto di portabilità. Innanzitutto non tutti i dati possono essere oggetto di portabilità. In particolare, l’articolo 20 prevede che siano portabili i dati trattati con mezzi automatizzati e la cui condizione di liceità si fondi su un consenso, oppure sulla conclusione di un contratto. Quindi le uniche ipotesi sono queste: la condizione di liceità, quella del consenso e quella del contratto (le lettere a e b dell’articolo 6). Non tutti i dati, quindi, possono essere oggetto della portabilità, innanzitutto per i parametri sopra accennati e poi perché non possono essere oggetto di portabilità i dati che sono stati oggetto di esercizio dell’oblio, proprio perché una volta che sono stati cancellati non sono più nella disponibilità del titolare, né tantomeno possono essere portati, trasmessi, i dati anonimi proprio perché rispetto ai dati anonimi manca quel collegamento tra informazione e persona e quindi non posso pretendere che vengono trasferiti dei dati anonimi. Per il resto, di regola, le rappresentazioni digitali dell’interessato con tutte le informazioni personali che lo riguardano tendenzialmente possono essere trasmesse, addirittura posso trasmettere quei dati che ho generato mediante le mie attività. Quindi se utilizzando un certo sito, ho generato una serie di dati riferiti alle mie ricerche, alla mia navigazione, o i cookie che ho generato, oppure la mia cronologia delle ricerche, oppure ho utilizzato dei dati riferiti alla mia localizzazione, tutti questi dati che ho generato attraverso la mia diretta attività li posso trasferire perché sono stati generati dalla mia attività concreta e diretta. Però, se questi dati sono stati poi utilizzati dal titolare del trattamento in modo da analizzarli e da queste analisi, principalmente l’analisi basata sul calcolo delle probabilità, sono stati generati dei nuovi dati, questi nuovi dati non possono essere oggetto della trasmissione, oggetto della portabilità, proprio perché sono dati analizzati dal titolare, quindi su cui il titolare ha svolto un’attività di analisi, sono i cosiddetti dati inferenziali e i dati derivati, di questi dati non può essere chiesta la trasmissione perché non sono soltanto generati dall’interessato, ma sono rielaborati dal primo titolare in un modo tale che impedisce la trasmissione. Proprio perché sono oggetto di tutta un’attività di lavoro che è stata svolta dal titolare e che in qualche modo, sempre nelle logiche di favore per il mercato, della concorrenza, rappresentano una conoscenza, un vantaggio conoscitivo, un know how che per quel titolare diventa un vantaggio economico sugli altri concorrenti e quindi per il funzionamento del mercato è considerato in qualche modo lesivo poi della sua attività la richiesta della loro trasmissione. Quindi ci fermiamo appunto soltanto ai dati che sono stati generati direttamente dall’interessato.

Altro diritto è previsto all’articolo 21 ed è il diritto di opposizione al trattamento. Il diritto di opposizione si realizza attraverso una dichiarazione di volontà con cui l’interessato esprime appunto la volontà di interrompere il trattamento in via definitiva. Ovviamente al titolare resta la possibilità di dimostrare la mancanza di motivi che giustificano questa interruzione e quindi se riesce a dimostrarlo può procedere nel trattamento. L’articolo 21 prevede in particolare che il titolare si debba astenere dal trattamento dei dati, quindi che debba interrompere il trattamento. A questo punto, è il momento in cui deve astenersi dal trattamento, implicitamente la norma richiede anche che li cancelli, perché, come già detto più volte, la semplice conservazione del dato è di per sé un trattamento (tant’è che abbiamo detto che quando limitiamo il trattamento svolgiamo solo l’attività di conservazione), quindi se si deve astenere dal trattamento, anche la conservazione è un trattamento e quindi è ritenuta in contrapposizione con l’esercizio della opposizione. Quindi l’opposizione dovrebbe includere automaticamente la cancellazione, a meno che il titolare non riesca a dimostrare che non sussistono i motivi per cui il  soggetto interessato può avanzare questo tipo di richiesta. L’opposizione, infatti, si può richiedere solo in due casi e cioè nei casi in cui il trattamento abbia come condizione di liceità le previsioni delle lettere e ed f dell’articolo 6. Le previsioni dell’articolo 6 sono quando il trattamento è necessario per l’esecuzione di un compito di pubblico interesse di cui viene rivestito il titolare e poi la lettera f invece quando il trattamento è necessario per il perseguimento di un legittimo interesse del titolare. Solo quando la condizione di liceità è una di queste due si può esercitare l’opposizione. Ovviamente quando si è in questa ipotesi, poi l’opposizione può essere esercitata in qualsiasi momento e poi starà al titolare dimostrare che la richiesta non può essere soddisfatta perché effettivamente il pubblico interesse nella lettera e e il legittimo interesse del titolare della lettera f, prevalgono sull’interesse dell’interessato e quindi il trattamento può effettivamente continuare, in quanto non ci sono dei motivi validi per ritenere prevalente l’esercizio di questo potere inibitorio, di questo potere di interrompere il trattamento. Quindi per l’interessato, nel caso in cui ci si trovi di fronte alle situazioni previste dalla lettera e ed f, è semplice fare questa richiesta, perché deve semplicemente dire perché vuole avvalersi di questo diritto però poi non deve dimostrare nulla, starà al titolare dover dimostrare che l’interesse dell’interessato è meno rilevante nel bilanciamento che bisogna sempre fare rispetto agli interessi indicati alle lettere e ed f dell’articolo 6, che appunto sono condizioni di liceità del trattamento.

Diritto dei dati – I principi del GDPR

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.

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 dei dati – Il diritto alla privacy

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é è 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.

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.

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.

Volatility

Acquisizione della memoria volatile

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.

Dai un’occhiata a questo Cheatsheet 😉

Alcuni esempi:

vol.py --profile=[WinXPSP3x86] [comando] -f win-mem-image.bin
  • 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 plugin pslist 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 plugin plk -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 Windows 64-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 Time exited mostrerà 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 maliciously escalated privileges e quali processi appartengono a utenti specifici.

cmdscan

Il plugin cmdscan 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 plugin consoles 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 plugin memdump.

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.

$ python vol.py -f ~/Downloads/unknown.img procmemdump -p 1440 -D ~/Downloads/memf/ 

procexedump

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.

I file sono denominati in questo modo:

ProcessName.PhysicalOffset.StartingVPN.EndingVPN.dmp

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 plugin dumpfiles:

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 script parsesummary.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 plugin modscan.

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, printkey accetta 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’output hivelist 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, rainbow tables, 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 plugin printkey 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 Protection application programming interface (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 plugin userassist. 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 plugin UserAssist 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”.
  • Per ulteriori informazioni, consultare Shellbags in Memory, SetRegTime e TrueCrypt Volumes.

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 plugin dumpregistry 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 plugin dumpfiles) è 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 dump di 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 crash dump 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 (vmware saved state) o del vmsn (vmware snapshot).

I metadati contengono i registri della CPU, l’intero file di configurazione VMX, le informazioni sull’esecuzione della memoria e gli screenshots PNG 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=

$ vol.py -f [sample] -o 0x600 mbrparser

Note:

  • Per ulteriori informazioni, consultare Recovering Master Boot Records from Memory.
  • 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 bootcode fino 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 windows stations 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 plugin psxview 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;
  • Atom Table;
  • 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 tag DESKTOP (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 rogue desktop 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 tag WND 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 tag SHAREDINFO 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 plugin gditimers 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 tag VAD 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 tag VadS … 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 trampoline stubs.
  • 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 Address Table) 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 malware Coreflood 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, tag VAD, 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 plugin apihooks. 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.

Note:

  • Requires Install distorm3
  • Inline hooks sono 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 hook API.

Ecco un esempio di rilevamento degli hook IAT 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 Descriptor Table), 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 Descriptor Table), 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 Descriptor Table) 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 chiamati gate  regolano 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’ID thread. 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 (debug callbacks 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 hook IRP sulla basate dei moduli contenuti non è un buon metodo, quindi verrà visualizzato tutto e lasciato giudicare all’analista. Il comando controlla anche gli Inline hook 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 driver vmscsi.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 plugin devicetree 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 plugin devicetree 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:

  • PsActiveProcessHead linked list;
  • EPROCESS pool scanning;
  • ETHREAD pool scanning (quindi fa riferimento al proprio EPROCESS);
  • PspCidTable
  • Csrss.exe handle table;Csrss.exe internal linked list.

Nella figura viene rilevata la presenza del malware Prolaco. “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 plugin timer 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’utility Strings 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.

Sysinternals Strings può essere utilizzato su Linux/Mac usando Wine. L’output dovrebbe essere reindirizzato a un file da utilizzare con il plugin strings di Volatility. Alcuni esempi di utilizzo:

Windows:

Il completamento di Sysinternals Strings 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 plugin strings (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”:

$ python vol.py --profile=Win7SP0x86 strings –f win7.dd –s win7_strings.txt --output-file=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:

$ python vol.py --profile=Win7SP0x86 strings –f win7.dd –s win7_strings.txt --output-file=win7_vol_strings.txt -S  

Può essere visualizzato anche l’offset EPROCESS:

$ python vol.py --profile=Win7SP0x86 strings –f win7.dd –s win7_strings.txt --output-file=win7_vol_strings.txt -o 0x04a291a8 

Il plugin strings 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 plugin patcher 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 plugin patcher, 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 plugin pagecheck 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 plugin timeliner 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.

Nota: TSK 3.x bodyfile

VOLATILITY: un esempio pratico

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:

vol.py -f win-mem-image.mem --profile=[profile] [plugin]

filescan: scansiona il dump alla ricerca di tutti i file aperti e li elenca:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 filescan

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 pslist

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 pslist –n wordpad

psxview: poiché pslist non mostrerà i processi nascosti o non collegati, è possibile utilizzare il plugin psxview per rilevare processi nascosti confrontando ciò che contiene PsActiveProcessHead con quanto riportato da varie altre fonti di elenchi di processi:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 psxview

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 vadtree

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 vadtree --output=dot --output-file=[directory]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.

Copiamo ed incolliamo il contenuto del file graph.dot nel visualizzatore web: http://www.webgraphviz.com/:

ed ecco il risultato:

memdump

Utilizzando il plugin pslist 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 plugin memdump che consente di estrarre tutte le pagine residenti in memoria di un processo in un singolo file:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 memdump –p 2988 –D [directory di output]

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”.

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 iehistory

netscan: questo plugin mostra tutte le connessioni di rete, il nome del processo, gli indirizzi IP di origine e di destinazione, comprese le porte:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 netscan

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 userassist

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 shimcache

sessions: questo comando elenca i processi in esecuzione, suddivisi per sessione in cui sono stati avviati:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 sessions

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 deskscan

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 hivelist

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.

hashdump:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 hashdump –y 0xfffff8a000024010 –s 0xfffff8a00304d010

hashdump:

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:

vol.py -f  RAMWin7Ultimate.mem --profile=Win7SP1x64 lsadump

VOLATILITY: un esempio pratico – parte 2

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):

vol.py -f  ‘Windows 7 x64 Ultimate-0581c0c9.vmem’ imageinfo

vmwareinfo: con questo plugin possiamo analizzare le informazioni dell’intestazione del vmss (vmware saved state) o del vmsn (vmware snapshot). Ciò consentirà di visualizzare i registri della CPU, l’intero file di configurazione VMX, le informazioni sull’esecuzione della memoria:

vol.py -f  ‘Windows 7 x64 Ultimate-0581c0c9.vmem’ vmwareinfo

vmwareinfo: … e gli screenshots PNG della VM ospite:

vol.py -f  ‘Windows 7 x64 Ultimate-0581c0c9.vmem’ vmwareinfo --verbose 
--dump-dir=[directory di destinazione]

vmwareinfo: … e gli screenshots PNG della VM ospite: