Fidarsi Del Software
Facciamo un esperimento insieme: all'esperimento
Grazie di aver partecipato. Naturalmente era uno scherzo 🤣🤣
E soprattutto, come lo potete sapere con certezza? Nelle prossime righe capiremo insieme quanto tempo resta al vostro dispositivo.
Perché ti fidi di un software?🔗
Nell'epoca moderna, usiamo un processo molto veloce per ottenere qualsiasi software vogliamo. Per la maggior parte dei sistemi operativi, questo processo funziona grossomodo così:
- Apri il gestore del software
- Cerca il software che ti interessa
- Installalo
"Gestore del software" che a sua volta è un software che ci permette di installare altro software. Dipendentemente dalla vostra piattaforma potrebbe chiamarsi con uno di questi nomi: "App", "Google Play", "Microsoft", "Amazon" seguito dal suffisso "Store". Non ci pensiamo troppo su, perché ce li fornisce il produttore del nostro telefono, dunque ci fidiamo. Ci fidiamo perché sappiamo che qualcuno sta supervisionando ciò che ci viene inserito dentro.
Ma quello che troviamo in questi "Store", non è l'unico modo di interagire con il software, giusto? La pagina con cui avete interagito all'inizio, è anch'essa un software. Okay, certo, vi ci ho portato io, e potreste argomentare con un semplice "mi fidavo di te.." e avere 100% ragione, ma se non fossi stato io a chiedervelo ci avreste pensato su?
Facciamo un altro esempio di software simile con cui interagite ogni giorno. Anche questi sono software:
Vi fidate sempre di tutti loro?
Perché se questo fosse il caso, significherebbe che per voi i virus informatici non esistono: sarebbero tutti software di cui vi fidate e che avete deciso consciamente di installare. Il che ci porta alla seconda alternativa: I virus esistono senz'altro, e qualche volta possono essere installati senza il vostro consenso, oppure abusando della vostra fiducia.
La "fiducia" non è una buona metrica per proteggere la vostra vita digitale. Dunque è interamente possibile che io abbia effettivamente installato un virus nei vostri dispositivi.
È necessario fidarsi?🔗
Questa è una buona domanda. Dovete sempre, necessariamente fidarvi per fare qualcosa di utile con i vostri dispositivi? Probabilmente la maggior parte di voi crede di sì. Sfortunatamente, vi devo dare ragione: Ken Tomphson ci ha dimostrato in un famoso paper che pur controllando tutto il controllabile attorno al software che usiamo, alla fine della fiera, dobbiamo fidarci in qualche misura, di qualche componente, accettando implicitamente il fatto che quest'ultima potrebbe essere malevola, e rendere malevolo tutto ciò che tocca.
Il massimo che possiamo fare, è controllare la misura in cui decidiamo di fidarci di un certo software o meno. Però in che modo possiamo ridurre la fiducia che poniamo su un certo software?
Avete installato un virus?🔗
Ok, basta chiacchiere, scopriamo se avete effettivamente installato un virus o meno. Di seguito ho l'intero codice sorgente per la pagina che potrebbe aver installato un virus sul vostro dispositivo:
<!DOCTYPE HTML>
<html>
<head>
<title>
L'esperimento di Luca
</title>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1">
</head>
<body>
<center>
<h1 id="titolo">Benvenuto</h1>
<button id="bottone">Cliccami</button>
<br/>
<label id="messaggio" for="progressbar"></label>
<br/>
<progress id="progressbar"></progress>
<script type="text/javascript">
function sleep(s) {
return new Promise(resolve => setTimeout(resolve, s * 1000));
}
const titolo = document.getElementById('titolo');
const progresso = document.getElementById('progressbar');
const messaggio = document.getElementById('messaggio');
const bottone = document.getElementById('bottone')
messaggio.hidden = true;
progresso.hidden = true;
bottone.onclick = async function () {
progresso.hidden = false;
messaggio.hidden = false;
messaggio.textContent = "Scaricando il virus...";
await sleep(2).then(async () => {
messaggio.textContent = "Installando il virus...";
progresso.value = 0;
while (progresso.value < 1) {
await sleep(Math.random()).then(progresso.value =
progresso.value + Math.random());
}
messaggio.textContent = "Virus installato";
});
alert("Congratulazioni, ho appena installato un malware sul tuo dispositivo.")
titolo.textContent = '¯\\_(ツ)_/¯';
await sleep(1.1).then(bottone.hidden = true);
await sleep(1.3).then(messaggio.hidden = true);
await sleep(1.5).then(progresso.hidden = true);
await sleep(2).then(document.body.hidden = true);
await sleep(Math.random()).then(window.history.go(-1));
}
</script>
</center>
</body>
</html>Spiegazione dettagliata della pagina malevola
Ok, è un po' un casino, sicuramente se non siete tecnici è molto complessa da interpretare. Vi aiuto io. Interpretiamo '...' come "tutto ciò che è scritto" tra quel che ho scritto prima, e quel che ho scritto dopo. Ovvero, se il codice originale è:
<button><span>ciao</span></button>
E io scrivo:
<button>...</button>
In quel caso '...' starà per: "<span>ciao</span>".
La maggior parte di quanto è scritto nel documento non è veramente importante. Lo vedremo poi, la parte in cui vi chiedo di concentrarvi al momento è quella contenuta in
<script type="text/javascript">
...
</script>
Quella è la parte che effettivamente viene eseguita dal vostro dispositivo. Vediamo come:
function sleep(s) {
return new Promise(resolve => setTimeout(resolve, s * 1000));
}
Questa parte definisce una "regola" per il browser, dicendogli qualcosa come "ogni volta che io dico sleep(...)" tu devi fare qualcosa. E cosa fa? Questa parte:
new Promise(resolve => ...);
non è veramente importante, fa riferimento ad un meccanismo di javascript, il linguaggio che ho usato per creare il software, possiamo ignorarla. Ciò che è contenuto al suo interno invece (sostituito dal '...') dice al browser di aspettare per un certo tempo 's * 1000'. Se osserviamo il codice, s è contenuto tra le parentesi della prima riga:
function sleep(...) {
return new Promise(resolve => setTimeout(resolve, s * 1000));
}
In sostanza, stiamo dicendo al browser: "Ogni volta che ti dico 'sleep(s)' (idealmente dove 's' è un numero) tu devi fermare qualunque cosa tu stia facendo e aspettare 's*1000' millisecondi (ovvero 's' secondi)"
const titolo = document.getElementById('titolo');
const progresso = document.getElementById('progressbar');
const messaggio = document.getElementById('messaggio');
const bottone = document.getElementById('bottone')
Queste sono tre istruzioni simili. Prendiamo la prima (le altre dicono la stessa cosa ma riferendosi ad elementi diversi): Dice al browser "Quando mi riferisco a 'titolo' intendo riferirmi a quella componente nella pagina, che ha l'id titolo".
E dove si trova questo elemento? Se guardiamo poco sopra, lo possiamo trovare, assieme agli altri:
<h1 id="titolo">Benvenuto</h1>
<button id="bottone">Cliccami</button>
...
<label id="messaggio" for="progressbar"></label>
...
<progress id="progressbar"></progress>
messaggi.hidden = true;
progresso.hidden = true;
Qui cominciamo a fare cose interessanti, all'avvio della pagina, questo pezzo di codice dice "non mostrare 'messaggi' né 'progresso'" quindi all'avvio nasconde di fatto la barra del progresso e l'etichetta sopra di essa.
button.onclick = async function () { ... }
Ok, questo pezzo di codice dice al browser cosa fare quando il bottone viene cliccato. Cosa dovrà fare nello specifico?
progresso.hidden = false;
messaggio.hidden = false;
messaggio.textContent = "Scaricando il virus...";
In modo simile a quanto scritto poco sopra, mostra 'progresso' e 'messaggio' e imposta il testo in 'mesaggio' a "Scaricando il virus..."
await sleep(2).then(async () => {
...
});
Vi ricordate come abbiamo detto che si deve comportare il browser quando vede 'sleep(...)'? Ignorando 'await' e 'async', che vengono utilizzati per dire al browser di gestire le cose in maniera sincrona o asincrona.., qui diciamo al browser di aspettare un certo numero di secondi (2, in questo caso) e poi fare '...'.
In particolare:
messaggio.textContent = "Installando il virus...";
progresso.value = 0;
Impostiamo il "messaggio" a "Installando il virus..." e la barra del progresso allo 0%.
while (progresso.value < 1) {
...
}
In questo blocco di codice gli diciamo di continuare a fare '...' finché il valore di "progresso" (la barra del progresso) sarà inferiore a 1.
await sleep(Math.random()).then(progresso.value =
progresso.value + Math.random());
Qui aspettiamo un numero randomico di millisecondi (pochi, comunque, perché ricordiamo che senza qualcos'altro, verranno estratti sempre compresi tra 0 e 1). Dopodiché impostiamo il valore della barra del progresso al valore (precedente) della barra del progresso, e un certo numero randomico (anche qui, compreso tra 0 e 1).
messaggio.textContent = "Virus installato";
Impostiamo il valore di "messaggio" a "Virus installato"
alert("Congratulazioni, ho appena installato un malware sul tuo dispositivo.")
titolo.textContent = '¯\\_(ツ)_/¯';
Qui, mostriamo una finestra di dialogo che dice "Congratulazioni, ho appena installato un malware sul tuo dispositivo" e imposta il titolo allo shruggie (¯\_(ツ)_/¯).
await sleep(1.1).then(bottone.hidden = true);
await sleep(1.3).then(messaggio.hidden = true);
await sleep(1.5).then(progresso.hidden = true);
await sleep(2).then(document.body.hidden = true);
await sleep(Math.random()).then(window.history.go(-1));
Qui, per effetto drammatico, facciamo una serie di cose. Dopo un certo numero di secondi (1.1,1.3,1,5 e 2) facciamo man mano scomparire gli elementi della pagina (il bottone, il messaggio, la barra del progresso per poi l'intera pagina)
Infine, dopo un numero randomico di secondi (sempre tra 0 e 1), torniamo alla pagina da cui siamo venuti.
E questo conclude il "virus".
Riferitevi alla sezione espandibile "Spiegazione dettagliata della pagina malevola" per capire cosa fa quel codice. Per tagliare corto: Quella pagina si limita a mostrare sul vostro schermo varie cose che succedono: gli elementi che scompaiono dalla pagina, la barra del progresso che si riempie, la finestra di dialogo che vi dice che avete installato un malware, e il messaggio di stato. Ma questo non fa di quella pagina un malware, solo un software innocente che tenta di porre la vostra attenzione su uno specifico concetto..
Qual è il Concetto?🔗
Quello che voglio farvi notare, è che in questo momento, siamo in grado di prendere la situazione sul ridere per un solo motivo: Vi ho fornito il codice della pagina "malevola" e vi ho spiegato esattamente quello che succede. Questo succede per qualsiasi software: a meno che non conosciate il codice sorgente del software che usate, non potete sapere cosa sta facendo, e questo vale per tutti i software, indipendentemente da dove provengono.
È anche per questo che è importante scegliere di usare un software libero al posto di un software proprietario se se ne ha l'opportunità. Usando software libero voi possedete a tutti gli effetti il software stesso.
I più attenti tra voi, a questo punto staranno urlando una obiezione:
"Ok, ma chi mi dice che il codice che mi hai fatto vedere in questa pagina corrisponde esattamente a quello che il tuo sito mi fornisce?"🔗
A questa obiezione, vi rispondo che facendo una "piccolissima" assunzione: quella che voi vi potete fidare che il browser che usate vi mostri sempre e solamente quello che il sito che avete chiesto gli manda, allora potete visitare nel vostro browser questo collegamento:
view-source:https://luca.damato.me/posts/fidarsi-del-software/esperimento.html
E il vostro browser vi mostrerà esattamente il codice sorgente della pagina che gli viene mandata. Potete verificare indipendentemente che corrisponda o meno. Naturalmente, il vostro browser faceva questo anche prima, che scrivessi questo articolo, quindi tecnicamente vi sarebbe bastato saper leggere il codice per verificare da voi cosa succede in quella pagina.
"Un momento.. e chi mi dice che il bottone mi porta proprio a quella pagina e non a un'altra?"🔗
Ottimo, vedo che siete attenti... perché non provate ad usare lo stesso trucchetto per vedere il codice di questa pagina allora?
view-source:https://luca.damato.me/posts/fidarsi-del-software/
(il bottone dovrebbe essere verso la riga n.262)
"Ma.. come faccio una cosa del genere con un'applicazione?"🔗
Giusta osservazione, la cosa più simile sarebbe avere una compilazione riproducibile, in breve, è un modo di creare un pacchetto software che vi garantisce che non ci sia alcuna differenza tra quello che il produttore distribuisce e quello che potete compilare voi stessi dal codice sorgente. Questo viene attualmente fatto da Signal, anch'esso software libero.
Conclusioni🔗
Come abbiamo visto, alla fine di qualcosa ci si deve fidare. Che sia il vostro browser, che sia il semplice fatto che l'applicazione che usate corrisponda a quella che il produttore distribuisce, alla base c'è comunque un minimo di fiducia.
Al tempo stesso la fiducia non è uno strumento adeguato per proteggere la vostra vita digitale, e per massimizzare questa protezione (ma soprattutto la vostra libertà come utenti) è necessario minimizzare il quantitativo di fiducia che si ripone in un software, a maggior ragione se tale software non è libero.
Non mi aspetto che qualunque utente impari a leggere il codice, sarebbe impensabile. Quello che mi aspetto da un utente responsabile è che utilizzi delle euristiche migliori --per scegliere il software che usa-- di un semplice "l'ho trovata sullo store".
Vorresti dare le tue opinioni rispetto questo post? Scrivilo online e inserisci il link della risposta qui per mandarmi una Webmention