-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.tex
1192 lines (977 loc) · 61.4 KB
/
main.tex
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
\documentclass[12pt,a4paper]{article}
\usepackage{textcomp, gensymb}
\usepackage[italian]{babel}
\usepackage{newlfont}
\usepackage{gensymb}
\usepackage{hyperref}
\usepackage{graphicx}
\usepackage{mathtools}
\usepackage{amssymb}
\textwidth=450pt\oddsidemargin=0pt
\begin{document}
\begin{titlepage}
\begin{center}
\rule[0.5cm]{15.8cm}{0.6mm}
{\small{\bf Relazione di Crittografia }}
\end{center}
\vspace{15mm}
\begin{center}
{\LARGE{\bf Cryptojacking:} \\
\vspace{3mm}
{\bf quando il tuo personal computer lavora per qaualcun altro.}}
\end{center}
\vspace{35mm}
\par
\noindent
\begin{center}
{\large{\bf Elvis Perlika}}
\end{center}
\begin{center}
{\large{\bf 0000970373}}
\end{center}
\hfill
\vspace{70mm}
\begin{center}
{\large{\bf Corso di Crittografia \\
A.A. 2023-2024 \\
Prof. Luciano Margara}}
\end{center}
\end{titlepage}
\newpage
\tableofcontents
\newpage
\section{Introduzione}
\subsection{Definizione}
Il Cryptojacking, in Italiano "Dirottamento di risorse", è una forma di attacco
informatico che sfrutta la potenza di calcolo di un utente, senza che esso ne
sia consapevole, per minare criptovalute. \cite{CSO}
L'obbiettivo degli hacker è quello di prendere il controllo del maggior
numero possibile di sistemi al fine di minare quante più criptovalute. Questo sistema di hacking non punta unicamente la classica utenza
di Personal Computer ma cerca di sfruttare anche le risorse di Server,
infrastrutture Cloud e in generale ogni tipologia di macchina computazionale con un accesso alla rete Internet.
La caratteristica fondamentale di questo malware è far sì che la vittima sia
ignara dei processi in background, i quali effettuano il mining, e
permettergli di usare la propria macchina normalmente. Ovviamente, il tutto, a
discapito di un sovraccarico della macchina e conseguente surriscaldamento,
presenza di lag, maggior consumo elettrico (che nel caso di servizi Server o
Cloud porta ad avere fatture particolarmente elevate) e riduzione delle
performance generali. È nelle skills del cyber-criminale riuscire a mantenere
questi effetti collaterali il più nascosti possibile se vuole mantenere il controllo della macchina per il maggior tempo possibile.
Questo paper si propone di analizzare il fenomeno del cryptojacking, i metodi di
attacco, le tecnologie coinvolte e i relativi aspetti tecnici per poi esporre le
contromisure per prevenire e individuare questi malware al intero delle proprie
macchine. In particolare, nella sezione \hyperref[sec:aspetti_tecnici]{"Aspetti
Tecnici"} si andarà ad analizzare nel dettaglio il mining di Monero, una delle
criptovalute più utilizzate per il cryptojacking e l'algoritmo RandomX (che ha
sostituito CryptoNight), utilizzato per minare Monero.
\subsection{Storia}
Una delle prime forme di cryptojacking è stata scoperta nel Giugno 2011, quando
l'azienda Symantec Corporation iniziò a sospettare che le botnet \footnote{Una
botnet è un gruppo di dispositivi connessi a Internet, ognuno dei quali esegue
uno o più bot . Le botnet possono essere utilizzate per eseguire attacchi DDoS (
distributed denial-of-service ), rubare dati, [1] inviare spam e consentire
all'aggressore di accedere al dispositivo e alla sua connessione. Il
proprietario può controllare la botnet utilizzando un software di comando e
controllo (C\&C). [2] La parola "botnet" è una parola risultata dalla unione
delle parole " robot " e " network ". Il termine è solitamente utilizzato con
una connotazione negativa o
malevola.\footnote{\href{https://arc.net/l/quote/ftyxgxms}{Botnet, Wikipedia}}}
potessero minare Bitcoin segretamente, sebbene la GPU di una sola macchina
impiegherebbe molto tempo per minare una transizione in criptovalute,
utilizzando una grande quantità di macchine si riesce a suddividere il lavoro e
di conseguenza ridurre il tempo.
Una serie di attacchi rilevanti di cryptojacking sono stati scoperti dal 2011
(come quello sopra citato) al 2021. L'ultimo è relativo al "2021 Microsoft
Exchange Server data breach"
\footnote{\href{https://arc.net/l/quote/golshtco}{2021 Microsoft Exchange Server
data breach, Wikipedia}}, tale breccia, creata nel Gennaio 2021 ha permesso
numerosi attacchi tra i quali, diversi di tipo cryptojacking.
Il cryptojacking è emerso come una minaccia significativa nel campo della
cybersecurity intorno al 2017, con l'introduzione di Coinhive, dismesso poi a
Marzo 2019. Si trattava di un servizio di mining di criptovalute attraverso i browser web
che andava a utilizzare parte o tutta la potenza di calcolo per minare
criptovalute Monero (approfondimento nella sezione
\hyperref[sec:aspetti_tecnici]{"Aspetti Tecnici"}).
\subsection{Struttura del documento}
La seguente relazione è strutturata in modo da fornire una panoramica generale
del cryptojacking nei capitoli iniziali per poi approfondire maggiormente la
parte tecnica che viene eseguita computazionalmente dalle macchine, in questa
parte saranno definiti i concetti principali delle Curve Ellittiche che poi
saranno usati per comprendere la tecnologia del mioning e gli aspetti che
rendono Monero una criptovaluta di particolare rilevanza. Una volta compresa la
parte tecnica si tornerà ad approfondire il perché Monero ed il cryptojacking
siano così popolari, come individuare questo tipo di malware e come prevenire
l'infiltrazione degli stessi nei nostri sistemi. In coda verranno presentati dei
casi reali, nei quali vengo spiegati i passi che i cybercriminali hanno seguito
per colpire alcune grandi realtà tecnologiche.
\subsection{Problema e Motivazione}
Questo documento punta a fornire ai lettori una maggiore comprensione del mondo
delle criptovalute e di come queste possono portare alcuni soggetti a compiere
atti criminali allo scopo di arricchirsi con esse. Si vuole formire ai lettori
le armi per comprendere se la propria macchina o quella, ad esempio aziendale,
su cui si sta lavorando sia infetta e come prevenire una possibile iniezzione di
malware di cryptojacking.
In questo periodo storico la computazione rapida ed efficiente sono
deterministici nel ambito della ricerca e in quello del \textit{consumer
service} e, di conseguenza, trovarsi con macchine che impiegano parte della loro
capacità di computazione per scopi di cui il proprietario della macchina non è a
conoscenza causa gravi danni economici oltre a danni ambientali dovuti ad un non
calcolato consumo energetico.
\newpage
\section{Come funziona}
Il mining è il processo che Bitcoin e altre criptovalute utilizzano per coniare
virtualmente nuove monete digitali e certificare le transazioni effettuate dagli
utenti usando le stesse monete. Il mining è un processo lecito ed incentivato dal sistema stesso delle crypto-valute ma lo rimane fintanto che il processo è effettuato su macchine di proprietà dell'utente o su macchine sulle quali l'utente ha il permesso di eseguire questo tipo di operazioni.
Nel dettaglio troviamo vaste reti decentralizzate di computer in tutto il mondo
che verificano e proteggono le blockchain, ovvero i registri virtuali che
documentano le transazioni di criptovalute. In cambio del contributo della loro
potenza di elaborazione l'utente del computer della rete, che per primo risolve
i calcoli complessi dovuti alla certificazione della transizione, viene premiato
con nuove monete. Si tratta di un circolo virtuoso: i minatori mantengono e
tutelano la blockchain, la blockchain assegna le monete, le monete fungono da
incentivo ai minatori per continuare a mantenere la blockchain. Il mining non è
l'unico modo per rilasciare nuove cripto monete nella rete, anche il creatore
della criptovaluta può decidere di rilasciare nuove monete da dividire con i
suoi utenti. Il mining è un processo che richiede molta potenza di calcolo con
un effort inversamente proporzionale al mining effettuato portando così ad un
aumento della difficoltà di mining e ad una conseguente crescita dei costi.
Il cryptojacking sfrutta questo processo. Gli hacker inseriscono il codice malevolo
nei siti web o nei messaggi di posta elettronica che infettano i computer delle
vittime e li trasformano in macchine per il mining riducendo i costi e di conseguenza aumentando i profitti. Questo processo, banalmente, è molto più redditizio rispetto al mining legale poiché non si devono sostenere i costi di hardware elettronico e di energia elettrica.
\newpage
\section{Metodi di attacco}
I metodi per attaccare un sistema con il cryptojacking sono molteplici e variano
a seconda del tipo di sistema che si vuole attaccare. I metodi più comuni sono:
\subsection{Attaccare direttamente i Personal Computer}
Attaccare uno o più PC è il classico metodo per creare un sistema di
cryptojacking. Tipicamente l'hacker riesce ad iniettare il suo software di
mining all'interno della macchina usando tecniche come:
\begin{itemize}
\item \textbf{Fileless malware}: che a loro volta possono essere di 2 tipologie:
\begin{itemize}
\item \textit{Fully Fileless Malware}: non viene eseguito nessun file
sul disco rigido ma tutte le attività possono essere osservate mentre
sono in esecuzione in memoria. Gli hacker possono anche, attraverso la
rete, inivare pacchetti malevoli che installano backdoor che risiedono
nella memoria kernel.
\item \textit{Fileless Malware with Indirect File Activity}: non scrive
direttamente i file sul disco, ma gli autori della iniezzione possono
installare un comando PowerShell all'interno del repository WMI
configurando un filtro WMI per la persistenza. Anche se in teoria
l'oggetto WMI dannoso esiste su un disco, non tocca il file system sul
disco. Si tratta quindi di un attacco senza file poiché, secondo
Microsoft [34], "l'oggetto WMI è un contenitore di dati multiuso che non
può essere rilevato e rimosso".\cite{FMW}
\end{itemize}
\item \textbf{Schemi di phishing}: il modo più semplice con cui gli
aggressori di cryptojacking possono rubare risorse è inviare agli utenti
un'e-mail dall'aspetto legittimo o innoquo che li incoraggi ad acccedere
ad un collegamento dannoso. Questo collegamento esegue il codice per
inserire uno script di cryptomining sul computer della vittima. Funziona
in background e invia i risultati tramite un'infrastruttura di comando e
controllo (C2\footnote{Command and Control Infrastructure: anche
conosciuto come C\&C o C2 è il set di strumenti e tecniche che un hacker utilizza per mantenere la commuicazione con il computer
precedentemente compresso.}).
\item \textbf{Embedded di script malevoli all'interno di siti o web app}: gli
hacker possono sfruttare script all'interno dei siti, che eseguiti
automaticamente dai browser, minano le cripto valute. Questo metodo è
molto più diffuso e meno invasivo rispetto ai precedenti, poiché non
scarica alcun codice nel dispositivo.
\end{itemize}
\subsection{Cercare server e dispositivi di rete vulnerabili}
I server sono un obiettivo molto ambito per gli hacker, in quanto sono
dispositivi estremamente potenti e spesso connessi a Internet 24/7. Gli hacker
possono sfruttare vulnerabilità come Log4J\footnote{"La vulnerabilità Log4j,
conosciuta anche come Log4Shell, è una vulnerabilità critica scoperta nella
libreria di registrazione Apache Log4j nel novembre del 2021. Sostanzialmente,
Log4Shell concede agli hacker il controllo totale dei dispositivi eseguendo
versioni di Log4j senza patch." - \href{https://arc.net/l/quote/zjujxamu}{IBM}}
per iniettare i propri sistemi di cryptojacking in queste potenti macchine.
Spesso i server compromessi vengono anche utilizzi come ponti per accedere con
maggior semplicità ad altri dispositivi per eseguire attacchi più complessi ed
orizzontali.
\subsection{Attaccare il sistema di produzione di software}
Un altro metodo molto comune è quello di attaccare le macchine e seminare
repository open-souce nelle quali è stato iniettato codice malevolo. Grazie ai
programmatori che utilizzano questi codici è possibile per gli hacker
raggiungere un numero elevato di macchine e scalare velocemente il loro sistema
di mining. Una volta entrati nella macchina del programmatore, possono cercare
di accedere anche ai server (ai quali spesso un programmatore è connesso per
lavoro), ai dispositivi di rete oppure ai servizi cloud ai quali esso è
connesso. In alternativa possono puntare a sub-iniettare questi script
all'interno dei progetti che i programmatori stanno sviluppando.
\subsection{Fare leva sulle infrastrutture cloud}
Come per i server, anche le infrastrutture cloud sono un obbiettivo molto ambito
poiché permettono di effettuare computazioni ancora più veloci. Uno dei metodi
più comuni per farlo è scansionare le API dei container esposti ed utilizzare
tale accesso per caricare il software di mining sulle istanze dei
container o sui server cloud interessati. L'attacco è in genere automatizzato
con un software di scansione che cerca server accessibili alla rete Internet
pubblica con API esposte o che permettono l'accesso senza autenticazione. Come
per i server, gli aggressori sfruttano il cloud service violato ed attraverso lo
stesso puntano a raggiungere altre infrastrutture simili. Questi sono gli
attacchi più redditizi. \\
L'aspetto rilevante, in tutti gli approcci sopra citati, è che gli hacker
vogliono ed hanno il potere di accedere a quante più macchine computazionali.
\newpage
\section{Aspetti tecnici di Monero}\label{sec:aspetti_tecnici} Non è obbiettivo
di questo paper approfondire il tema delle criptovalute in senso generale ma si
vuole trattare il tema del mining in modo più specifico. Nella seguente sezione
si andrà ad analizzare il mining di Monero, una delle criptovalute più
utilizzate per il cryptojacking.
La criptovaluta Monero, inizialmente nota come BitMonero, è stata creata
nell'aprile 2014 come deriva della valuta proof-of-concept CryptoNote. Monero
significa "denaro" nella lingua Esperanto. Monero è, grazie alle sue features, una delle criptovalute più popolari per il mining.
Una delle filosofie di Monero è quella di mantenere un mining egualitario, in
modo che tutti possano avere la possibilità di fare mining. Per raggiungere
questo obiettivo, utilizza un algoritmo particolare ideato e sviluppato dai
membri della community della criptovaluta: RandomX. Questo algoritmo PoW
\footnote{Proof of Work} è resistente agli ASIC, il che rende impossibile
costruire hardware specializzato per fare mining di Monero. I miner sono
obbligati ad utilizzare hardware di livello consumer (cioè i semplici personal computer o dispositivi simili di carattere personale) e competere lealmente.
\subsection{Fondamentali}
Le curve ellittiche sono la funzione matematica che sta alla base della
crittografia delle criptovalute. Queste curve sono utilizzate per creare le
chiavi pubbliche e private che permettono di firmare e verificare le
transizioni. Procediamo con criterio per capire come funzionano le curve
ellittiche, questo sarà fondamentale per comprendere il funzionamento di Monero
e delle sue caratteristiche di privacy.
\subsubsection*{Aritmetica Modulare}
L'aritmetica modulare, detta anche \textit{Aritmetica dell'orologio}, è un
sistema di aritmetica degli interi, in cui i numeri "si avvolgono su loro
stessi" ogni volta che raggiungono i multipli di un determinato numero $ n $,
detto \textbf{modulo}.
Inconsciamente utilizziamo l'aritmetica modulare ogni volta che guardiamo un
orologio. Ad esempio, se sono le 10:00 e aggiungo 3 ore, il risultato sarà 1:00
e non 13:00. Questo perché l'orologio è un sistema di 12 ore, quindi il modulo è
12; questo è il motivo per cui viene chiamata \textit{aritmetica dell'orologio}.
Diciamo che per calcoalre $ c = a \mod{b} $ possiamo immaginare un asse di
numeri interi e posizionarci nel punto $ a $ e 'saltare' con passi di lunghezza $ b $
fino a raggiungere un valore intero che sia $ \ge 0 $ e $ < b $, questo sarà il
nostro $ c $. Ad esempio:
$$ -5 \mod{3} = 1 \qquad \text{oppure} \qquad 4 \mod 3 = 1 $$
Formalmente possiamo definire l'equazione $ c = a \mod{b} $ come $ a = bx + c $
dove $ x $ è il quoziente e $ c $ è il resto di $ a \mod b $.
Ne seguono alcune proprietà che verranno definite in seguito ma è fondamentale capire che questo tipo di calcoli, su numeri a decine di migliaia di cifre, per un calcolatore sono di una difficoltà computazionale molto alta.
\subsubsection*{Curve Ellittiche}
Definiamo una curva ellittica $ E $ su un campo finito $ F_p $ dove $ p $ è un
numero primo a 256 bit e la presentiamo in forma di Weierstrass come:
$$ E: y^2 = x^3 + ax + b \enspace | \enspace x, y \in F_p $$
in cui $ a $ e $ b $ sono i parametri della curva che ne defiscono la forma e la
posizione. Le coordinate $ (x,y) $ sulla curva ellittica che possono prendere
qualsiasi valore all'interno di $F_p$ formano un Gruppo Abeliano \footnote{Un
gruppo abeliano è un gruppo in cui l'operazione beneficia della proprietà
commutativa è anche detto: Gruppo Commutativo}. Questo particolare gruppo ci
permette, scegliamo 2 punti $ P $ e $ Q $ sulla curva che useremo per risolvere
$ R $ andando a eseguire l'operazione di somma $ P + Q = R $ con $ R $ che sarà
un altro punto sulla curva.
Prendiamo gli scalari $p, q$ valori interi random di grandezza $n$ tali che $ p,
q \in {o,1}^n $.
Il Standards for Efficient Cryptography (SEC) è un set di curve ellittiche
proposte per l'uso nel campo della crittografia. Una delle più note e utilizzate
è la \textbf{Secp256k1} definita dalla equazione
$$ y^2 = x^3 + 7 \mod{p} $$ dove
$$ p = 2^{256} - 2^{32} \underbrace{- 2^9 - 2^8 - 2^7 - 2^6 - 2^4 - 1}_{-977}
$$.
Questa curva è la base per la crittografia di Bitcoin e altre criptovalute.
Questa funzione possiede diverse qualità che le hanno permesso di essere
applicata, non solo nel abito delle criptovalute, ma anche in altri campi per
rendere le commuicazione sicure; come quello del IoT. Monero, invece, utilizza
la curva Ed25519, di cui parleremo più avanti.
\subsection{Scambio di chiavi Diffie-Hellman con curve ellittiche}
Il protocollo di scambio di chiavi Diffie-Hellman (DH), inventato nel 1976, nato
dalla collaborazione dei ricercatori Whitfield Diffie e Martin Hellman, è il
primo protocollo a permettere a 2 parti di communicare attraverso un canale
insicuro senza necessità di condividersi una chiave segreta previa
commuicazione. Questo tipo di scambia è quello che comunemente viene definito dai "cifrari a chiave pubblica".
Matematicamente, il protocollo D.H. si basa sul problema della fattorizzazione e
sul problema del logaritmo discreto nell'algebra modulare di cui abbiamo parlato nel paragrafo precedente.
Definiamo $ p $ un numero reale random tale che $0 < k < l$ che chiameremo
\textit{private key} e calcoliamo la relativa \textit{public key} $ P = k \cdot
G $ dove $ G $ è il generatore del gruppo abeliano in questione.
Un classico scambio di segreti tra Bob e Alice, utilizzando le curve ellittiche,
avviene nel seguente modo:
\begin{enumerate}
\item Alice e Bob generano le proprie chiavi pubbliche e private $ (p_A,
S_A) $ e $ (p_B, S_B) $ rispettivamente. Entrambi condividono le proprie
chiavi pubbliche ma non quelle private.
\item Assumendo
$$ X = p_A \cdot S_B = p_A \cdot p_B \cdot G = p_B \cdot p_A \cdot G =
p_A \cdot S_A $$
Alice e Bob dovranno calcolarsi, privatamente: $ X = p_A \cdot S_B $ e $
X = p_B \cdot S_A $. Queste saranno le chiavi condivise.
Un osservatore esterno non riuscirà a calcolare $ S $, cioè il segreto,
in modo semplice proprio a causa del problema di Diffie-Hellman. Infatti
trovare $ S $ a partire da $ S_A $ e $ S_B $ è un problema
computazionalmente estremamente difficile.
\end{enumerate}
\subsection{Shnorr Signature}
In crittografia, per Shnorr Signature si intende l'algoritmo di firma digitale
ideato da Clauss Schnorr nel 1989. È uno dei primi protocolli basati sulla
\textbf{impraticibiltà} nel risolvere il problema del logaritmo discreto, la sua
funzione permette di dimostrare ad una delle 2 parti in comunicazione di
conoscere la chiave privata relativa a quella pubblica senza rivelare, appunto,
quella privata. Questo algoritmo ci sarà utile per quando tratteremo le Ring Confidential Transactions relative alle Ring Signatures di Monero.
\subsubsection*{Algoritmo}
È fondamentale che tutti gli utenti della commuicazione concordino sul gruppo
abeliano $ G $, di ordine $ q $, generato da $ g $ e per assunzione in questo
gruppo il problema del logaritmo discreto sia molto difficile. Oltre al gruppo
devono conconrdare anche su una funzione di hash sicura $ H:\{0,1\}^*
\rightarrow \mathbb{Z} / q\mathbb{Z} $.
\paragraph{Generazione delle chiavi}
Si sceglie una chiave privata $ p \in \mathbb{Z}_q $ e si calcola la chiave
pubblica $ S = g^{-p} $.
\paragraph{Firma}
Per firmare un messaggio $ m $ si procede nel seguente modo:
\begin{enumerate}
\item si genera un numero reale random $ k \in \mathbb{Z}_q $
\item si calcola $ x = g^k $ con $ x \in G $
\item si calcola $ r = H(x || m) $ dove $ || $ rappresenta la concatenazione
in stinghe di bit
\item si calcola $ c = k + p \cdot r $ con $ e \in \mathbb{Z}_q $
\end{enumerate}
Abbiamo, così, creato la firma $ (c, r) $ per il messaggio $ m $. Chiameremo $ c
$ la 'challenge' e $ r $ la 'response'.
\paragraph{Verifica}
Per verificare la firma $ (c, r) $ si procede nel seguente modo:
\begin{enumerate}
\item si calcola $ x_v = g^c\cdot y^r $
\item si calcola $ r_v = H(x_v || m) $
\end{enumerate}
Se $ r_v = r $ allora la firma è valida.
\paragraph{Dimostrazione}
$$ x_v = g^c\cdot y^r = g^{k + p\cdot r}\cdot g^{-p\cdot r} = g^k = x $$ ed in
seguito:
$$ r_v = H(x_v || m) = H(x || m) = r $$ quindi il messaggio firmato corrisponde
a quello verificato.
Anche se un intruso, senza conoscere la chiave privata, avesse creato la firma
(c, r) sarebbe stato trascurabile, quindi un verificatore può essere sicuro che
il messaggio non sia stato manomesso.
\subsection{Curva Ellittica Ed25519}
Ed25519 è una particolare \textit{Twisted Edwards elliptic curve} che utilizza
Monero per le operazioni crittografiche. La curva è definita dal campo $
F_{2^{255} - 19} $ e dalla curva ellittica:
$$ -x^2 + y^2 = 1 - \frac{121665}{121666}x^2y^2 $$
La communità scientifica (il NIST) pensa che questa curva non sia così sicura e
affidabile.
Le curve Twisted Edwards sono di ordine $ N = 2^c l $ con $ l $ numero primo e $
c $ un intero positivo. Nel caso di Ed25519 il suo ordine è di 76 cifre e quindi
$ l $ è a 253 bits.
$$ l = 2^3 \cdot
7237005577332262213973186563042994240857116359379907606001950938285454250989 $$
Il campo $ F_{2^{255} - 19} $ è codificato in 32 byte, ovvero 256 bit. Di
conseguenza, qualsiasi punto in Ed25519 potrebbe essere espresso utilizzando 64
byte poichè includono sia una rappresentazione del punto $ R $ che un valore
scalare $ S $ derivato da una computazione su una funzione di hash $ H $:
$$ S = (H + \textit{private key} \times H) \mod l $$ Applicando le tecniche di
Point Compression, descritte di seguito, tuttavia, è possibile ridurre questa
quantità della metà, a 32 byte utilizzando tecniche di "Point Compression"
\footnote{Le tecniche di point compression (compressione dei punti) sono metodi
utilizzati in crittografia ellittica per ridurre la quantità di dati necessari
per rappresentare un punto su una curva ellittica. Questo è particolarmente
utile per ridurre l'uso di memoria e banda, specialmente in applicazioni che
richiedono l'invio o la memorizzazione di grandi quantità di punti su curve
ellittiche, come nelle firme digitali o nei protocolli di scambio di chiavi.}.
\subsection{Shnorr Signature Avanzato}
In Shnorr base utilizziamo una sola chiave ma possiamo rendere Shnorr più
sofisticato utilizzando più chiavi. Questo è il caso dello schema Multi Layer
Linkable Spontaneous Anonymous (MLSAG), uno schema di firma che permette a più
utenti di firmare un messaggio in modo anonimo.
Può essere vantaggioso dimostrare che la stessa chiave privata è stata
utilizzata per generare chiavi pubbliche su basi diverse. Per esempio,
consideriamo una chiave pubblica standard $kG$ e un segreto condiviso di
Diffie-Hellman $kR$ con la chiave pubblica di un'altra persona, dove le basi
sono rispettivamente $G$ e $R$. In questo contesto, possiamo dimostrare la
conoscenza del logaritmo discreto $k$ relativo a $kG$, provare la conoscenza di
$k$ in $kR$, e confermare che $k$ è identico in entrambe le situazioni, senza
tuttavia rivelare il valore di $k$.
È possibile trovare una \textit{Non-interactive proof\footnote{}} a pagina 25
del white paper di Monero \cite{Zero To Monero}.
Chiamiamo Non-Interactive Proof un metodo crittografico in cui una parte (il
provatore) può dimostrare a un'altra parte (il verificatore) che una certa
affermazione è vera senza interagire direttamente con il verificatore durante il
processo di prova, diversamente da \textit{Zero-Knowledge proofs} che necessità
di una interazione tra le parti simultanea.
\subsection{Privacy in Monero}
Monero può essere estratto sia da CPU che da GPU, ma la prima è molto più
efficiente. E' evidente che sia la criptovaluta più pratica per il
cryptojacking, poiché può essere minata solo su macchine a livello consumer, le
quali sono faccilemente accessibili da cyber-criminali attraverso i metodi
precedentemente citati. Inoltre, utilizza una blockchain\footnote{Libro
contabile digitale condiviso in rete, è il sistema fondamentale di una
criptovaluta in quanto tiene memoria di tutte le transizioni eseguite nella
storia della realtiva criptovaluta. Viene detta blockchain poiché è una catena
di blocchi, ognuno rappresenta una transizione che viene agganciata alla catena
attraverso la risoluzione di calcoli complessi (mining).} supportata da un
\textbf{Privacy-enhancing technologies} sofisticato al fine di fornire privacy e
anonimato, le feature più rilevanti sono: One Time Address, Amount Hiding e RingCT
\subsubsection*{Address}
In tutte le blockchain, per ogni utente viene generato un indirizzo, questo è
tutto ciò che serve per ricevere pagamenti. Poichè il libro mastro è pubblico,
tutti possono vedere gli indirizzi e le transizioni e si può facilmente
comprendere per ogni indirizzo l'ammontare di criptovaluta che possiede.
Un indirizzo Monero è una stringa di 95 caratteri alfanumerici che inizia con
\textit{4} per gli indirizzi standard e \textit{8} per gli indirizzi
integrati\footnote{Indirizzi Integrati combinano al indirizzo un ID codifificato
a 64-bit per identificare un pagamento. È possibile trovare un approfondimento a
pagina 41 de \cite{Zero To Monero}}. Un esempio di indirizzo Monero è:
\begin{verbatim}
888tNkZrPN6JsEgekjMnABU4TBzc2Dt29EPAvkRxbANsAnjy
Pbb3iQ1YBRk1UXcdRsiKc9dhwMVgN5S9cQUiyoogDavup3H.
\end{verbatim}
Essendo difficile da ricordare e/o scrivere, Monero permette di generare un
indirizzo alias generato con una tecnologia Monero chiamata \textbf{OpenAlias}.
In genere i classici generatori di alias sono semplici database di coppie
chiave-valore, invece OpenAlias si comporta come un DNS, ovvero un sistema di
risoluzione degli indirizzi. Questa tecnlogia associa ad ogni indirizzo Monero
un nome di dominio, (ad esempio: donate.getmonero.org).
Monero, diveresamente da altre cripto valute come BitCoin, utilizza nella
transazione due coppie di chiavi private/pubbliche: $(k^v, K^v)$ e $(k^s, K^s)$.
La seconda coppia è l'indirizzo dell' utente, mentre la prima è la corrispondente
chiave privata. Indichiamo con $k^v$ le \textit{view key} e con $k^s$ la
\textit{spend key}.
La chiave di visualizzazione viene utilizzata per verificare se un'uscita è
associata al proprio indirizzo, mentre la chiave di spesa consente di "spendere"
quell'uscita in una transazione per poi confermare che è stata spesa.
Di seguito spiegherò in sintesi alcune scelte di design di Monero per garantire
la massima riservatezza e anonimato nelle transizioni. Se si vuole approfondire
si può consultare il white paper di Monero \cite{Zero To Monero} nelle pagine
37-42.
\paragraph{One-time address}
Se, generalmente, un utente deve condividere il proprio indirizzo per ricevere
pagamenti, Monero utilizza un sistema di indirizzi monouso. Come facciamo a
condividere un indirizzo monouso? Utilizzando uno scambio di tipo
Diffie-Hellman, così anche un osservatore che conosce tutti gli address non può
comprendere chi stia eseguendo la transizione e verso chi.
Facciamo un esempio: Alice vuole inviare 10 Monero a Bob. Bob ha le proprie
coppie di chiavi $(k^v_B, K^v_B)$ e $(k^s_B, K^s_B)$ e Alice conosce le chiavi
pubbliche di Bob quindi il suo inidirizzo.
Parafrasando Butrin\footnote{Vitalik Buterin, co-fondatore di Etherium}:
\begin{quote}
Sia il destinatario (chiamiamolo "Bob") che il mittente ("Alice") possono
generare un indirizzo invisibile per la transazione. Tuttavia, solo il
destinatario, Bob, può controllare la transazione. Un altro modo di pensare
a un indirizzo invisibile è come un indirizzo di portafoglio legato
crittograficamente all’indirizzo pubblico di Bob, ma che viene rivelato solo
alle parti che effettuano la transazione. - Buterin \cite{Buterin Quote}
\end{quote}
Questi One-time address sono anche detti \textbf{Stealth Address}. Il team di
Buterin ha progettato un sistema di indirizzi nascosti (anche detto SAP
\footnote{Stealth Address Protocol}) chiamato BaseSAP. Il protocollo mira a
fornire un meccanismo leggero che consenta agli utenti di generare indirizzi
temporanei, mantenendo la completa compatibilità con le versioni precedenti e
non richiedendo modifiche alla blockchain principale. BaseSAP è basato sul
cifrario assimetrico su curve ellittiche Secp256k1, migliorato attraverso
l'integrazione di "tags di visualizzazione" utili a rendere più efficiente
l'analisi rispetto ai comuni DKSAPs \footnote{Dual-Key Stealth Address
Protocols}.
Questi protocolli sono la base per le implementazioni DKSAP usate in Monero. Da
quando DKSAP è nato, ha portato molti ricercatori a studiare e trovare nuovi
modi per migliorarlo:
\begin{figure}[ht]
\centering
\includegraphics[width=0.79\textwidth]{./images/sommario.png}
\caption{Sommario dei lavori di ricerca sulle Stealth Address e compatibilità BaseSAP}
\label{fig:summary}
\end{figure}
\paragraph{Esempio pratico di One-time address}
\begin{enumerate}
\item Alice genera una reale random $r \in \mathbf{Z}l $ e calcola il
One-time address $$ K^{o} = \mathcal{H}_n(rK^v_B)G+K^s_B $$ e definisce
$K^{o}$ come l'indirizzo di Bob, al quale specifica l'importo di 10 Monero
ed il valore $rG$ e pubblica il tutto sulla blockchain.
\item Bob, una volta ricevuti i dati, calcola $k^v_BrG = rK^v_B$ e calcola
${K'}^s = K^o - \mathcal{H}_n(rK^v_B)G$. Una volta vdeerificato che
$K'^s = K^s$ comprendo che l'output è per lui.
\item una volta che Bob avrà confermato che l'output è per lui utilizzando
la sua \textit{view key}, potrà firmare un messaggio con la sua
\textit{spend key} e inviarlo alla rete per dimostrare di essere Bob e
ricevere i Monero accordati.
\end{enumerate}
\paragraph{Subaddress}
Un'altra tecnica per garantire la privacy è quella di utilizzare gli
\textit{subaddress}. Ogni utente può generare dei subaddress partendo dal
proprio address. Questi subaddress possono essere utilizzati per ricevere
pagamenti senza dover condividire sempre lo stesso address, possiamo immaginare
l'address come una 'Banca' e i subaddress come i relativi 'Bancomat'. Oltre ad
essere utili per aumentare la privacy, l'utente che crea i propri subaddress può
utilizzarli per distinziare una transazione da un'altra.
Andiamo a vedere come funziona la creazione di un subaddress:
Un utente, Bob, crea un numero $ i $ di subaddress a partire dal proprio
address, i subaddress sono della stessa forma di un address standard, quindi una
coppia di chiavi pubbliche$ K^{v,i} $ e $ K^{s,i} $; una \text{view} ed una
\text{spend}.
$$ K^{s,i} = K^s + \mathcal{H}_n(k^v, i)G $$
$$ K^{v,i} = k^vK^{s,i} $$
L'altro utente, Alice, della transazione invierà una certa somma di Monero al
sotto indirizzo $ (K^{v,i}, K^{s,i}) $ nel modo spiegato nel capitolo
\textit{One-time address}.
Bob potrà, così, controllare i subaddress per vedere se ci sono transazioni per
lui: Se
$$ K^{is}_B = K^o - \mathcal{H}_n(rK^{v,i}_B, \textit{valore della
transazione})G $$ e $$ K^{'s}_B = K^{s,i} $$ allora Bob sa di essere il
destinatario.
\subsubsection*{Amount Hiding}
Per quanto rigurda l'amount hiding, ci riferiamo a quest ultimo come il sistema
che ci permette di nascondere il saldo del nostro Wallet. In Monero, per nascondere i valori delle transizioni, si utilizzano i \textbf{Commitements}.
In termini semplici, con \textbf{Commitements Scheme} si intende l'impegnarsi
ad eseguire una transazione di un certo valore senza rivelare il valore stesso.
\paragraph{Esempio pratico di Commitements}
In un gioco del lancio della moneta, Alice può chiamare una faccia
("impegnadosi" così a voler ottenere quella una volta effettuato il lancio da Bob) ma va ad applicare una maschera (un hashing) sull' "impegno preso" che annuncerà in pubblico senza che nessuno lo possa comprendere. A questo punto Bob lancia la moneta e mentre la moneta è in volo, Alice rivela l'impegno mascherato (annuncia quale moneta si aspetta di ricevere) e Bob rivela il risultato del lancio. Se Alice ha indovinato, Bob le darà la moneta.
\paragraph{Amount Commitements} Nel caso di Monero, più nel dettaglio, si utilizzano i \textbf{Pedersen Commitements}. Questi hanno la peculiarità di essere definiti da una funzione che rispetta le caratteristiche delle Applicazioni Lineari; quindi una Applicazione Lineare.
Definiamo un commitements di un valore $ b $ come:
$$ C(y, b) = yG + bH $$
Poichè il ricevente deve essere ingrado di conoscere quanto riceve nelle varie transazioni, banalmente per poi essere lui ad essere il mittente di altre nuove transazioni è necessario che i parametri $ y $ e $ b $ siano noti a Bob.
\begin{figure}[ht]
\centering
\includegraphics[width=0.99\textwidth]{./images/addKeys2.png}
\caption{Codice derivante dal sorgente OS Monero che si occupa di costruire la funzione matematica riportata sopra}
\label{fig:summary}
\end{figure}
Per effettuare questo tipo di comunicazione, Monero utilizza un sistema Diffie-Hellman per condividersi i segreti $ y $ e $ b $.
È chiaro che chiunque venga a conoscenza della chaive di visualizzazione $ k^v $ di Bob potrà vedere i valori delle transizioni e anche controllare che siano concordi con gli impegni (commitment) associati.
\subsubsection*{RingCT}
Una transazione Monero è composta anche da riferiemti ad altre transizioni.
\paragraph{Ring Signature}
Le Ring Signature (in italiano: Firma ad Anello) sono un tipo di firma digitale la quale permette ad un utente di firmare un messaggio a nome di un gruppo di utenti senza che sia rivelata l'identità dell' utente che ha eseguito la firma.
La base di una firma ad anello è un gruppo di potenziali firmatari, ciascuno con la propria coppia di chiavi univoche (chiavi pubbliche e private). Il firmatario stesso forma un “anello” con le chiavi pubbliche degli altri membri del gruppo. È uno strumento che protegge la privacy del mittente di una transazione rendendo le stesse indistinguibili da altre transazioni.
\paragraph{Ring Confidential Transactions}
Abbiamo già definito le chiavi di spesa che possono essere utilizzate soltanto per una transazione.
Prima della implementazione delle RingCT Monero necessitava che le sue transazioni venissero suddivise in sotto transazioni di specifiche misure.
Ad esempio: una transazione di $ 12.5 $ Monero veniva divisa in 3 anelli di taglio: $ 10 $, $ 2 $ e $ 0.5 $ Monero. Questo sistema garantiva la presenza di numero elevato di membri nella transazione principale (triplicandone il numero) ma non garantiva la privacy dell'utente poichè un osservatore poteva facilmente leggere i valori delle transazioni. Per risolvere questo problema, Monero ha implementato le Ring Confidential Transactions (RingCT) ad inizio 2017. Questa tecnologia ha ricevuto in poco tempo un grande apprezzamento da parte della comunità di Monero tanto che nel Settembre 2017 è stata implementata in modo predefinito.
Con RingCT, le nuove monete minate dalla community prima di entrare nel sistema venogno mascherate per poi essere inserite in una transazione RingCT.
Una delle caratteristiche chiave di RingCT è che avendo gli ammontari delle transazioni nascosti, è possibile scegliersi gli utenti che parteciperanno all' anello della transazione rendendola, così, ancora più sicura.
\paragraph{Esempio pratico di RingCT}
Alice deve $ 2.50 $ Monero a Bob ed ha un portafoglio di $ 12.56 $ Monero. Poichè gli output del proprio portafoglio non possono essere spesi più volte, Alice dovrà creare una transazione che includa un output di $ 2.50 $ Monero per Bob e un output di $ 10.06 $ Monero per se stessa. Avremo quindi una situazione nella quale per Alice esite un input che descrive il valore del suo portafoglio ed un output che corrisponde al valore della transazione. Per dimostrare che la transazione non sia frutto di un operazione malevola e che Alice abbia effettivamente i $ 12.56 $ Monero si andaranno a confrontare i valori dell'input e dell'output.
$$ \sum \text{input} = \sum \text{output} $$
A causa delle proprietà crittografiche delle RingCT:
$$ \text{RingCT} = xG + aH(G) $$
Alice dovrà andare a creare un Commitement per l'importo della transazione che in seguito i minatori andranno a verificare anche avendo a disposizione pochissime informazioni andando a verificare che l'ammontare dell' importo corrisponda al portafoglio di Alice.
\paragraph{Range Proof}
Questa tecnologia dimostra che il valore di un impegno è positivo e che non supera un certo limite. Questo è necessario per evitare che un utente possa creare un impegno negativo e creare monete dal nulla.
Lo scopo di una Range Proof è dimostrare che si tratta di una transizione sicura e che si può proseguire con l' accettazione della stessa.
\begin{figure}[ht]
\centering
\includegraphics[width=0.79\textwidth]{./images/before.png}
\caption{Senza i sistemi di privacy di Monero}
\label{fig:summary}
\end{figure}
$$ \downarrow $$
\begin{figure}[ht]
\centering
\includegraphics[width=0.79\textwidth]{./images/after.png}
\caption{Con i sistemi di privacy di Monero}
\label{fig:summary}
\end{figure}
È l'insieme di tutte queste tecnolgie a rendere Monero una delle criptovalute che tutelano maggiormente la privacy degli utenti e di conseguenza vengono preferite dai cybercriminali per il cryptojacking.
\subsection{La blockchain di Monero}
\subsubsection*{RandomX}
RandomX è un algoritmo Proof-of-Work (PoW), questo algoritmo permette di
estrarre dalle CPU un calcolo computazionale che permetta di eguagliare la
velocità degli hardware specializzati. Abbiamo già anticipato nei capitoli
precedenti che Monero è una criptovaluta particolarmente pratica per essere
minata con CPU, questo è merito dell'algoritmo RandomX. Il core di questo
algoritmo è la simulazione di una CPU virtuale.
RandomX, compialto in \textit{C++11}, è eseguito su una Macchina Virtuale e può
funzionare in 2 modalità di esecuzione intercammbiabili:
\begin{itemize}
\item \textbf{Fast mode}: è la modalità di esecuzione più veloce, ma
richiede 2020MiB di memoria condivisa
\item \textbf{Light mode}: è la modalità di esecuzione più leggera e lenta,
ma richiede 256MiB di memoria condivisa
\end{itemize}
Per utilizzare RandomX è necessario andare a configuraralo, di seguito la
tabella dei parametri configurabili presa dal repository del algoritmo:
\begin{figure}[h]
\centering
\includegraphics[width=0.61\textwidth]{./images/randomx_parameters.png}
\caption{Parametri configurabili}
\label{fig:parameters}
\end{figure}
L'algoritmo necessita di due valori in input:
\begin{itemize}
\item una chiave $k$ (una stringa lunga 0-60 bytes)
\item un valore $H$ di lunghezza scelta che farà da parametro della funzione
di hash
\end{itemize}
Il funzionamento di RandomX è definito dai seguenti passaggi:
\begin{enumerate}
\item Inizializzare il dataset.\\
La chiave $k$ permette di inizializzare il Dataset, cioè la struttura di
memorizzazione di sola lettura che viene utilizzata durante la
computazione. La grandezza di questa struttura è data dalla somma dei
seguenti valori:
\begin{verbatim}
RANDOMX_DATASET_BASE_SIZE + RANDOMX_DATASET_EXTRA_SIZE
\end{verbatim}
e frazionata in frammenti di 64 byte che chiameremo \textit{items}.
L'intero dataset è costruito partendo dalla chiave $k$ seguendo lo
schema di seguito:
\begin{figure}[ht]
\centering
\includegraphics[width=0.99\textwidth]{./images/dataset_construction.png}
\caption{Costruzione del dataset}
\label{fig:data_construction}
\end{figure}
\textit{Argon2d} è una funzione derivata da Argon2\footnote{Argon2 è una
funzione di hash per le password che occupa molta memoria}
"tradeoff-resisistent".
La chaive $k$ è utilizzata per inizializzare un
BlakeGenerator\footnote{Pseudo random generator basato su Blake2b} che a
sua volta permette di creare 8 \textit{SuperscalarHash}.
\textit{SuperscalarHash} è una funzione di diffusione progettata per
consumare quanta più energia possibile utilizzando soltanto le
ALU\footnote{Arithemtic Logic Unit} della CPU. Questa funzione va a
prendere in input 8 registri di dimensione 64 byte e restituisce il
DataSet.
\item calcolare il \textit{seed}, $S$=Hash512($H$)\footnote{Funzione di
hashing derivata da Blake2b con output di grandezza 512 bit} di
dimensione 64 byte.
\item calcolare $gen1$= AesGenerator1R($S$), AesGenerator1R è una funzione
generatrice di stringhe pseudo random.
Il generatore produce 4 chiavi:
\begin{verbatim}
key0, key1, key2, key3 = Hash512("RandomX AesGenerator1R keys")
\end{verbatim}
che utilizza per creare i nuovi stati del generatore:
\begin{verbatim}
state0 (16 B) state1 (16 B) state2 (16 B) state3 (16 B)
| | | |
AES decrypt AES encrypt AES decrypt AES encrypt
(key0) (key1) (key2) (key3)
| | | |
v v v v
state0' state1' state2' state3'
\end{verbatim}
\item nello \textit{Scrathpad}\footnote{Area di memoria usata dalla Virtual
Machine. È strutturata in 3 livelli: L3$\rightarrow$L2$\rightarrow$L1}
vengono scritti \textbf{RANDOMX\_SCRATCHPAD\_L3} byte casuali sfruttando
$gen1$ creato precedentemente.
\item generiamo $gen4$ utilizzando lo stato finale di $gen1$:
$gen4$=AesGenerator2R($gen1$.state)
\item si assegna il valore 0 al registro \textit{fprc}\footnote{Determina la
modaliotà di arrotondamento dei numeri in virgola mobile}
\item si programma la Virtual Machine utilizzando \textbf{128 + 8 *
RANDOMX\_PROGRAM\_SIZE} bytes provenienti da $gen4$ e la si esegue
\item si calcola un nuovo seme $S$=Hash512($S$) e lo si assegna allo stato
del generatore $gen4$: $gen4$.state=($S$)
\item si ripetono i punti 7 ed 8 per \textbf{RANDOMX\_PROGRAM\_COUNT} volte
\item si crea una impronta digitale dello Scrathpad:
$A$=AesHash1R(Scrathpad)\footnote{Funzione di hash derivata da AES capace di
produrre più di 10 bytes per clock}
\item si va ad assegnare ai byte 192-255 del \textit{Register File} il
valore A
\item si calcola il risulato $ R $= Hash256(\textit{Register
File})\footnote{Come Hash512 ma con output di 256 bit}
\end{enumerate}
\paragraph{Virtuale Machine}
La Virtual Machine di RandomX è strutturata nel seguente modo:
\begin{figure}[ht]
\centering
\includegraphics[width=0.99\textwidth]{./images/vm_randomX.png}
\caption{RandomX Virtual Machine}
\label{fig:vm_randomX}
\end{figure}
L'architettura della Virtual Machine è di tipo CISC\footnote{Complex Instruction
Set Computer} e tutti i dati sono caricati in little-endian.
\newpage
\section{Popolarità}
\subsection{Vantaggi Economici}
La popolarità è dovuta al potenziale guadagno, guadagno molto facile da crearsi
poiché per definizione il cryptojacking punta a sfruttare risorse in possesso
di altri in modo gratuito. Così, anche considerando la volatilità delle cripto
valute, esempio principe BitCoin, i margini di guadagno sono abbastanza alti da
rendere il crimine un vero e proprio business.
\subsection{Difficoltà di Rilevamento}
Il cryptojacking è concepito per operare in modo furtivo, rendendone ardua
l'individuazione. Gli script malevoli agiscono silenziosamente in background,
determinando un incremento nell'utilizzo della CPU e un degrado delle
prestazioni del dispositivo, spesso senza che l'utente se ne accorga. Tale
caratteristica conferisce al cryptojacking un carattere persistente e insidioso.
\subsection{Crescita del fenomeno}
Poichè i dispositivi connessi alla rete sono in continua diffusione e spesso le
case produttrici non adottano sistemi di sicurezza adeguati, gli hacker hanno
maggiore spazio di manovra per colpire un grande numero di dispositivi
simultaneamente. Sono molto popolari anche le app malevole per dispositivi
mobile che in apparenza sembrano innoque ma che nella realtà vanno a estrarre
criptovalute usando il processore del dispositivo. Un fenomeno facilmente
identificabile poichè porta ad un surriscaldamento anomalo del device.
\newpage
\section{Prevenire e individuare}
\subsection{Prevenire}
Per prevenire attacchi di cryptojacking, è fondamentale adottare una serie di
misure di sicurezza e buone pratiche. Ecco alcune strategie efficaci:
\subsubsection*{Protezioni anti-malware}
Sarebbe una buona pratica proteggere i propri dispositivi con anti-malware
capaci di rilevare processi di cryptomining in esecuzione in background, gestite
le estensioni browser scaricate dagli utenti e minimizzare il rischio dato dalla
esecuzione di script malevoli eseguiti sui browser. Nel caso si dovesse
proteggere un organizzione, sarebbe buona pratica andare ad equipaggiare software
del tipo sopracitato sia nei device endpoint che nei server.
\subsubsection*{Applicare patch di sicurezza e proteggere i server}
Spesso gli hacker che puntano a creare un infrastruttura cryptojacking puntano a
server esposti pubblicamennte con bassi livelli di protezione su cui caricare
malware e da sfruttare per arrivare ad altri server. In questo caso, sarebbe
utile andare ad applicare patch di sicurezza e disattivare servizi inutilizzati.
\subsubsection*{Utilizzare software SCA}
I software SCA\footnote{Software Composition Analysis} permettono di andare ad
analizzare il software open-source e le sue dipendenze delle sue componenti.
Questi sistemi sono molto utili in fase di sviluppo per andare a rilevare
vulnerabilità e backdoor presenti nel codice integrato proveniente da fonti non
certificate. Questi software sono capaci di genereare degli \textit{SBOM}, cioè
dei dettagliati resoconti su tutte le dipendenze e sui componenti che compongono
l'applicazione che si sta analizzando.Così, si riesce a produrre software con la
sicurezza che non contenga script di mining.
\subsection{Individuare}
Per quanto riguarda la rilevazione, siccome gli attacchi di cryptojacking sono
sempre più sofisticati, è necessario adottare strategie di monitoraggio avanzate
per individuare e contrastare tali minacce. Ecco alcune tecniche utili:
\subsubsection*{Addetrare il personale help-desk a riconoscere i sintomi del cryptojacking}
Nel ambito della grande distribuzione di device e/o software il personale
help-desk è spesso il primo a ricevere segnalazioni di problemi relativi a
prestazioni lente o surriscaldamento dei dispositivi. In questi casi, è
importante che il personale sia in grado di riconoscere i sintomi del
cryptojacking e di agire di conseguenza, andando a segnalare il problema al
reparto IT. Il reparto IT, a sua volta, dovrà eseguire un'analisi approfondita
per individuare possibili brecce nei propri servizi o device endpoint e
rilascaire aggiornamenti di sicurezza.
\subsubsection*{Monitoraggio del traffico di rete}
Il monitoraggio del traffico di rete è un'ottima strategia per individuare
attività sospette. Gli attacchi di cryptojacking, infatti, comportano un aumento
del traffico di rete oltre che dell'utilizzo della CPU. Esistono vari strumenti
per monitorare il traffico di rete, come Wireshark, che consentono di
identificare rapidamente eventuali attività malevole. Sarebbe utile avere filti
nelle interfacce di rete per bloccare eventuali pacchetti non certificati.
\subsubsection*{Sistemi di monitoraggio Cloud e sicurezza runtime dei container}
I fornitori di servizi cloud offrono strumenti di monitoraggio avanzati che
consentono di individuare attività sospette, un esempio è quello di Google Cloud
che ha modernizzato il \textit{Security Command Center: piattaforma di
monitoraggio della sicurezza progettata per aiutare le organizzazioni a gestire
e migliorare la loro postura di sicurezza nel cloud.}, andando ad integrare
Virtual Machine Threat Detection (VMTD). Questo sistema è in grado di proteggere
il cloud da attacchi informatici di vario genere e di individuare attività di
cryptojacking.
\subsubsection*{Attuare il Threat hunting}
Il threat hunting è eseguito da specialisti conosciuti come threat hunters, i
quali sono incaricati di individuare, isolare e neutralizzare minacce
informatiche avanzate. Questi professionisti si dedicano all'analisi di
comportamenti anomali e indicatori di compromissione (IoC) al fine di scoprire
attività dannose che non sono state rilevate dai tradizionali strumenti di
sicurezza.
A differenza di altre pratiche di sicurezza, come la risposta agli incidenti o i
penetration test, il threat hunting parte dal presupposto che una minaccia sia
già penetrata nel sistema. Gli esperti di threat hunting esaminano i dati per
individuare indirizzi di compromissione e tentativi di attacco, impiegando
tecniche di analisi comportamentale e informazioni derivate dall'intelligence
sulle minacce.
\subsubsection*{Monitora i tuoi siti web}
I siti web sono spesso bersagli di attacchi di cryptojacking, poiché gli hacker
possono inserire script malevoli nei siti web, non per colpire i server, ma per
colpire i visitatori. Per monitorare i siti web, è possibile utilizzare
strumenti come Web Inspector, che consentono di individuare e rimuovere script
malevoli.
\newpage
\section{Casi reali}
\subsection{Il gruppo WatchDog attacca Docker Engine API endpoints and Redis servers}
Un gruppo di hacker, chiamato WatchDog, ha attaccato i server
Docker\footnote{Docker è una piattaforma software che permette di creare,
testare e distribuire applicazioni con la massima rapidità. Docker raccoglie il
software in unità standardizzate chiamate container che offrono tutto il
necessario per la loro corretta esecuzione, incluse librerie, strumenti di
sistema, codice e runtime. - AWS} e Redis\footnote{Redis, un sistema di gestione
di database NoSQL lanciato nel 2009, utilizza un modello di archiviazione basato
su coppie chiave/valore. Ogni dato è memorizzato in un dizionario, in cui una
chiave univoca è associata a un valore specifico, rendendo semplice il recupero
delle informazioni.}. Il gruppo riusciva ad infiltrarsi nei Docker Engine API
attraverso la porta 2375 aperta, una volta dentro, gli intrusi, potevano
accedere alla Shell di comando.
\paragraph{Payload} Viene caricato nel container uno script \textbf{cronb.sh}
che va a controllare lo stato del container ed eventualmente eseguire un secondo
script \textbf{ar.sh}, il quale va sabotare completamente il container e
caricare un miner XMRRig\footnote{Un software di mining di Monero}. Un ultimo
Payload è una serie di script che gli intrusi usano per puntare ad altri sistemi
collegati alla rete del container.\cite{WatchDog}
\subsection{Malware di cryptojacking all intero di istanzer Alibaba ECS}
Come nel caso di Docker, anche in questo caso gli hacker hanno puntato alle
strutture cloud, ma di Alibaba. I gruppi in question e sembrerebbero essere
TeamTNT, Kinsing ed altri.
I server Alibaba ECS\footnote{Elastic Compute Service} sono forniti con un
preinstallato agente di sicurezza.
Di seguito un codice specifico del malware che crea regole firewall per
eliminare i pacchetti in entrata da intervalli IP appartenenti a zone e regioni
interne di Alibaba.
\begin{figure}[ht]
\centering
\includegraphics[width=0.95\textwidth]{./images/alibaba_firewall.png}
\caption{Codice dannoso che modifica le regole del firewall}
\label{fig:alibaba_firewall}
\end{figure}
\begin{figure}[ht]
\centering
\includegraphics[width=0.95\textwidth]{./images/alibaba_agent_disable.png}
\caption{Script che disabilità l'agente di sicurezza di Alibaba}
\label{fig:alibaba_agent}
\end{figure}
Quando un malware di cryptojacking è attivo su un'istanza Alibaba ECS, l'agente
di sicurezza installato, se lo rileva, notifica la presenza di uno script
dannoso. A quel punto, è compito dell'utente, gestore della piattaforma,
intervenire per arrestare l'infezione e le attività malevole. Alibaba Cloud
Security fornisce indicazioni su come procedere, ma la responsabilità principale
dell'utente rimane quella di prevenire l'infezione fin dall'inizio.
\subsection{Orde di bot attaccano gli WMware Horizon server per minare}