[Programmazione][Java] Proteggere le applicazioni dall’uso non autorizzato

Oggi affrontiamo il problema che sorge dopo aver sviluppato un’applicazione e nel momento in cui questa deve essere distribuita. Il problema è tanto più sentito quando l’applicazione è a pagamento, e magari deve essere venduta a clienti. E’ lecito aspettarsi che il programmatore voglia proteggere il suo lavoro, o almeno cercare di scoraggiare potenziali abusi e malintenzionati. Vediamo in questo articolo quali sono le azioni da intraprendere per proteggere la nostra applicazione, supponendo che questa sia stata sviluppata con il linguaggio Java.

sicurezza_applicazione

Le operazioni da eseguire sono le seguenti:

  1. proteggere il codice in modo tale che non possa essere modificato o letto da persone non autorizzate (software chiuso);
  2. evitare che il software venga distribuito a chiunque;
  3. permettere di usare il software in versione demo/trial, e bloccarne eventualmente il funzionamento dopo n giorni.

In generale oggi esistono svariate tecniche più o meno efficaci per proteggere un’applicazione, e queste possono essere generalizzate in 2 categorie: le protezioni più sicure (siamo sicuri che siano le più sicure?!) che possono essere costose in termini di soldi e di tempo per implementarle, o le protezioni più deboli ma spesso di più semplice utilizzo e a basso costo. Il mio consiglio è di optare per la seconda categoria, perché tanto non esiste una protezione sicura al 100% e qualunque venga adottata presto o tardi finirà probabilmente per essere crackkata. Consiglio di scegliere una tecnica di protezione elevata solamente nel caso in cui l’applicazione sviluppata sia di notevoli dimensioni e laddove la quantità di soldi investiti sia stata ingente.

Analizziamo dettagliatamente i 3 punti precedenti, per studiare le tecniche in grado di proteggere un’applicazione.

1. Bloccare lettura/modifica del codice. Per impedire a qualcuno la lettura e la modifica del codice, e dunque di un file, è possibile agire solamente tramite i permessi all’interno di un sistema operativo. Su Linux ad esempio possiamo agire tramite gli sticky bit, assegnando ai vari utenti/gruppi i permessi che riteniamo più adeguati. Questo però non ci aiuta se l’applicazione è distribuita a persone (ad esempio tramite Internet) delle quali non possiamo gestire i sistemi locali.
A questo punto dobbiamo agire diversamente per rendere difficile la vita a chi vuole leggere il  codice e magari appropriarsi degli algoritmi usati. Dal momento che la nostra applicazione è sviluppata in Java, ciò che dobbiamo proteggere sono le classi prodotte dal processo di compilazione (il codice sorgente può semplicemente essere omesso nel software finale, in quando non è necessario). La soluzione in questo caso è di usare un offuscatore di codice, ossia un particolare software che agisce sulle classi compilate, modificandole in modo tale da renderne ardua la lettura in caso di reverse engineering. Per fare ciò un buon software free e aggiornato è ProGuard 4.8 (ultima versione in questo momento):

http://proguard.sourceforge.net/

e qui c’è una guida ben fatta su come utilizzarlo:

http://dellabate.wordpress.com/2010/11/22/java-bytecode-obfuscator-con-proguard/

Offuscatori di codice alternativi a ProGuard sono reperibili in questa lista:

http://proguard.sourceforge.net/alternatives.html

Nella lista precedente io escluderei i software un po’ datati, mentre consiglio yGuard o JBCO.

2. Bloccare la distribuzione non autorizzata del software. In questo caso la soluzione ideale è di utilizzare un sistema di licenziamento del tipo “per installare o avviare il programma deve essere inserita la chiave corretta”, come avviene per i software commerciali più noti (ad esempio Office o Windows stesso). Una possibilità è quella di usare il software TrueLicense:

http://truelicense.java.net/

Sul sito ufficiale potete trovare ampia documentazione in modo da usare correttamente il software e le licenze.

Qui c’è una lettura interessante su come proteggere un’applicazione Java facendo uso di chiavi/licenze:

http://stackoverflow.com/questions/10896596/protect-java-application-by-licence-or-key

Avendo un po’ di tempo a disposizione, potrebbe valere la pena implementare un proprio algoritmo per la generazione di una chiave. Ad esempio, una chiave univoca potrebbe essere generata a partire dall’indirizzo MAC della scheda di rete, essendo l’indirizzo stessa per sua natura univoco (a meno di manomissioni hardware). Di semplice utilizzo sono anche le funzioni hash, come SHA1, sufficientemente robuste, e possono essere sufficienti per le applicazioni più piccole.

3. Versione trial del software. Un’altra tecnica, che può essere usata per proteggere un’applicazione, è quella di crearne una versione demo/trial, o alternativamente di permetterne l’utilizzo solo per un periodo di prova limitato (10 giorni, 30, …).

Il software TrueLicense visto al punto precedente permette di creare anche licenze temporanee, che sono dunque valide per un periodo limitato di tempo, oltre il quale il software non può più essere adoperato. Per questa funzionalità potete vedere la documentazione ufficiale:

http://truelicense.java.net/tutorial.html#Using_the_Free_Trial_Period_FTP_Package

Al seguente link viene suggerita una soluzione “manuale” che permette di creare un’applicazione in versione trial:

http://stackoverflow.com/questions/2021088/implementing-a-30-day-time-trial/2022237#2022237

Buon codice a tutti ;-)…

Matteo

[Hacking/sicurezza] Nella tua rete Tor è bloccato? Bypassiamo il blocco!

Vediamo oggi come usare Tor in presenza di sistemi/reti/ISP che ne bloccano il suo funzionamento. Innanzitutto Tor è un software appartenente alla categoria PET (Privacy Enhaced Technology), che permette di navigare in modo anonimo sul web e di “anonimizzare” una grande quantità di servizi distribuiti (chat, torrent, …).
Il suo utilizzo principale è quello di permettere la consultazione di pagine web e la fruizione di Internet senza vincoli in quei luoghi in cui sono in vigore restrizioni politiche o censure di vario genere. Tuttavia, Tor viene usato piuttosto comunemente anche per bypassare le restrizioni aziendali e poter così navigare su siti “proibiti” perché bloccati dal proxy e/o firewall aziendale. Non è raro, purtroppo, che venga usato esclusivamente per navigare su Facebook o su altri social network durante l’orario di lavoro. Per carità, Tor può essere usato anche per navigare su Facebook, ma i suoi intenti sono ben più nobili!

In ogni caso molte aziende, enti, e organizzazioni, stanno cercando da tempo meccanismi per intercettare e bloccare l’utilizzo di Tor, configurando ACL sui firewall e filtri sui proxy. Inoltre, in alcuni casi ad essere bloccato è anche l’accesso al sito di Tor, in modo da impedire il download del software e la ricerca di documentazione. Bloccare la connessione alla rete Tor non è impossibile, perché viene resa pubblica una lista dei nodi della rete Tor, aggiornata costantemente. La lista è reperibile a questi link:

Tale lista potrebbe essere usata per configurare un proxy (squid ad esempio) in modo da bloccare tutte le connessioni uscenti dirette ad uno degli IP delle lista. Il risultato di un tale blocco (vedere lo screenshot sotto) è che l’utente con il client Tor sarà impossibilitato a collegarsi alla rete Tor, e pertanto al resto della Rete.

tor_blocked

Tor bloccato dalla rete/ISP

Veniamo adesso al reale argomento del post :-): come possiamo fare se la nostra rete/ISP blocca la connessione a Tor? Quello che possiamo fare è ricorrere ad alcune contromisure in grado di bypassare il blocco imposto, garantendo anonimato e privacy, e accesso a tutte le funzionalità di Tor. Può capitare anche che venga bloccata la visualizzazione del sito del progetto Tor, ma in questo caso è possibile facilmente usare un proxy web gratuito per poter visitare il sito (esempi di proxy gratuiti sono www.hidemyass.com e zendproxy.com).

Dunque, se non ci è possibile usare Tor poiché la connessione si blocca dopo aver avviato il software, è possibile agire in 2 modi:

  1. usare obfsproxy;
  2. agire sulla configurazione di Tor.

OPZIONE 1 

Per la prima opzione, è necessario scaricare il software obfsproxy al seguente link:

obfsproxy è un software basato su Tor (è praticamente Tor a tutti gli effetti), ma in via sperimentale e con i bundle al momento non più aggiornati. Il software permette di mascherare i pacchetti inviati alla rete Tor, facendoli sembrare pacchetti “innocenti” (ad esempio semplice pacchetti HTTP) come è visibile in figura.

obfsproxy_diagram

Diagramma di funzionamento di obfsproxy

L’interfaccia e l’utilizzo di obfsproxy sono gli stessi di Tor, mentre a cambiare è la configurazione del software, come si vede in figura.

tor_obfsproxy

obfsproxy

OPZIONE 2 

In questo caso non sono necessari software aggiuntivi ma dobbiamo agire su alcuni parametri di Tor per poter aggirare i blocchi imposti da rete/ISP. I parametri da configurare sono modificabili direttamente dall’interfaccia Vidalia, e si trovano in Settings->Network come visibile in figura.

tor_settings_network

Parametri configurabili di Tor per aggirare i blocchi

Fra questi, il metodo più efficace e affidabile è quello di usare un bridge Tor, ossia la terza possibilità “My ISP blocks connections to the Tor network”. Vediamo comunque in dettaglio le 3 possibilità.

Opzione – “My ISP blocks connections to the Tor network”

Con questa opzione possono essere configurati i bridge Tor. Un bridge Tor è fondamentalmente un nodo della rete Tor che agisce da ponte (similmente a un proxy) per il collegamento tra client/utente e rete Tor. I bridge hanno la particolarità di non essere elencati nelle liste pubbliche di nodi Tor (come visto precedentemente), e pertanto difficilmente saranno rilevati e bloccati dagli amministratori di rete. Per conoscere i bridge disponibili in ogni momento, dobbiamo visitare il seguente link:

Dopo aver trovato i bridge Tor disponibili, è necessario configurarli in Setting->Network, come visibile nella figura seguente.

Add_bridge_to_Tor

Aggiunta di un bridge Tor.

In alternativa, è possibile creare un proprio bridge privato, se abbiamo a disposizione un server o un pc con connessione flat (ad esempio nella propria abitazione), e collegarsi ad esso quando siamo fuori e in una rete in cui Tor è bloccato. Per creare un bridge privato è sufficiente avviare Tor sulla macchina che fungerà da bridge, e selezionare in Settings->Sharing la voce “Help censored users reach the Tor network“, come visibile in figura.

Tor_setting_bridge

Configurazione di un bridge Tor privato.

Opzione – “I use a proxy to access the Internet”

Nel caso in cui la propria rete o il proprio ISP blocchi anche i bridge Tor, è possibile ricorrere all’uso di un proxy. Tramite un proxy i pacchetti uscenti dal proprio sistema, e quindi dal client Tor, sono indirizzati al proxy stesso e non alla rete Tor, e in questo modo viene oltrepassato il blocco imposto dalla rete/ISP. Nella figura sottostante è mostrato il collegamento attraverso un proxy.

tor.e.proxy.visio

Connessione a Tor attraverso un proxy.

Per questa soluzione il punto cruciale è la scelta di un proxy adeguato, che dovrà essere sicuro e affidabile, e supportare inoltre sia il protocollo HTTP che il quello HTTPS. Per ricercare un proxy possiamo usare questa lista (oppure cercare altre liste di proxy semplicemente con google), controllando che il proxy supporti HTTPS, sia di tipo anonymous, e abbia una buona affidabilità. Dopo aver scelto un proxy, dobbiamo controllare che sia attivo e supporti realmente sia HTTP che HTTPS. Quindi configuriamo Tor con le impostazioni del proxy, come visibile nella figura sotto.

Tor_setting_proxy

Configurazione di un proxy in Tor.

Per configurare il proxy sono necessari:

  1. indirizzo IP o hostname del proxy;
  2. porta utilizzata dal proxy;
  3. eventuali username/password se il proxy richiede l’autenticazione.

Questa soluzione è più tediosa rispetto all’utilizzo di un bridge, poiché i proxy open non offrono solitamente grandi garanzie e spesso le performance non sono eccelse. Difatti un proxy potrebbe non essere più attivo nel giro di poche ore o giorni, costringendoci a cercarne e configurarne un altro.

Opzione – “My firewall only lets me connect to certain ports”

L’ultima opzione configurabile deve essere utilizzata solo quando abbiamo la certezza che il firewall della nostra rete blocchi verso l’esterno alcune porte (in genere ad essere bloccate solo le porte esterno per connessioni verso l’interno). In questo caso è possibile selezionare la voce e specificare le porte che sono aperte sul firewall. La connessione alla rete Tor passerà dunque per le porte specificate.

Riepilogando, in questa piccola guida abbiamo visto come sia possibile usare Tor praticamente in ogni situazione, anche quando sono stati creati filtri ad hoc dagli amministratori/provider nel vano tentativo di limitare la libertà e la privacy personale.

“Per ogni blocco esiste sempre una contromisura, basta trovarla o idearla!”

Matteo

[GNU/Linux] Script per modificare MAC address

Ho scritto uno script bash che permette in Linux di manipolare l’indirizzo MAC di una scheda di rete, la cui operazione in gergo viene detta spoofing. Lo script può essere usato su tutte le principali distribuzioni e permette di cambiare l’indirizzo MAC con uno generato casualmente oppure con uno indicato dall’utente. Le istruzioni per eseguire lo script sono le seguenti:

Usage: macs.sh [OPTIONS]
Spoof your wired or wireless network adapter with a new MAC address.
Options:
-r <interface>: spoof an interface with a random MAC address
-s <interface> <address>: spoof an interface with a new MAC address
-o <interface>: restore an interface with the original MAC address
-v <interface>: show the MAC address and the vendor of an interface
-p <vendor>: show the MAC prefix of a vendor
-a: show the MAC address of every network interface
-h: show this help

—————————————————————-
Examples:
sh macs.sh -r eth0
sh macs.sh -s wlan1 001122334455
sh macs.sh -s eth3 00:1C:39:FB:6C:88
sh macs.sh -o eth0
sh macs.sh -p IBM
sh macs.sh -p Microsoft

Tra le funzionalità vi è anche quella di visualizzare il vendor della scheda di rete, e tutti i prefissi MAC proprietari di uno specifico vendor.

Si tratta di uno script bash, dunque deve essere lanciato con l’interprete sh e con i privilegi di root. Vediamo alcuni esempi:

# sh macs.sh -r eth1 modifica l’indirizzo dell’interfaccia eth1 con uno random
# sh macs.sh -s eth1 00:0C:29:FB:6C:4B modifica l’indirizzo di eth1 con 00:0C:29:FB:6C:4B
# sh macs.sh -o eth3 ripristina l’indirizzo MAC reale di eth3
# sh macs.sh -v eth2 visualizza l’indirizzo MAC e vendor di eth2
# sh macs.sh -a visualizza gli indirizzi MAC e vendor di tutte
# sh macs.sh -p Microsoft visualizza i prefissi MAC proprietari Microsoft

Lo script è rilasciato con licenza GNU GPL v3, ed è scaricabile a questi link:

Matteo

[Hacking/sicurezza] Modalità promiscua sotto i riflettori

In questo articolo spiegherò cos’è la modalità promiscua, come funziona, in quali situazioni ha senso utilizzarla, e quando invece è del tutto inutile.

Vediamo innanzitutto cos’è un indirizzo MAC e come funziona la modalità promiscua. Ogni scheda di rete (o NIC) di un pc/server ha associato direttamente nell’hardware un codice alfanumerico chiamato indirizzo MAC (Media Access Control), che è costituito da 48 bit univoci definiti dal produttore della scheda di rete. Di default, ogni scheda è configurata in modo tale da accettare solamente i pacchetti che sono destinati alla scheda stessa, rifiutando tutti quelli destinati ad indirizzi MAC differenti. E’ adesso che entra in gioco la modalità promiscua :-). Questa è una tecnica che permette di abilitare una scheda di rete alla ricezione di TUTTI i pacchetti in transito sulla rete a cui è collegata, non solo quelli destinati alla scheda di rete in oggetto. Mettere la propria scheda in modalità promiscua, e più in generale osservare il traffico in transito all’interno di una rete, prende il nome nel gergo informatico di sniffing (sniffare in italiano), tradotto letteralmente con “annusare, fiutare”. Da notare però che questa modalità è sempre disattivata al momento che una scheda di rete esce di fabbrica (per ovvie ragioni ;-)).

sniffing

Spesso si pensa che sniffare il traffico possa rientrare nei crimini informatici, anzi in molti contesti viene proprio etichettato come “attacco hacker”. Tuttavia, l’azione di osservare il traffico può al massimo rientrare nella categoria di attacchi passivi, se proprio vogliamo essere pignoli, ed è del tutto legale. E’ un po’ come se una persona si mettesse davanti alla casa di qualcuno ad aspettare: ogni volta che arriva il postino osserva la posta prima che venga imbucata. E’ chiaro che se la posta ricevuta è chiusa in una busta, il curioso non potrà leggere niente, ma se ci sono delle cartoline ad esempio tutto quello che vi è scritto potrà essere tranquillamente letto. Ciò che invece è illegale è quando si penetra in un sistema, spesso dopo aver prima sniffato i dati e aver ottenuto le credenziali di accesso. In definitiva può star tranquillo chiunque abbia usato almeno una volta nella sua vita qualche software per sniffare il traffico come Wireshark.

Adesso che sapete cosa permette di fare la modalità promiscua, vediamo in quali contesti ha senso utilizzarla, e in quali invece è del tutto inutile.

Come detto, la modalità promiscua permette di catturare tutti i pacchetti in transito in una rete, e poiché il protocollo MAC opera a livello 2, ha senso utilizzarla solamente nella stessa sottorete in cui ci troviamo (in linguaggio tecnico, nello stesso dominio di broadcast). Ciò significa che se vogliamo sniffare il traffico ci dobbiamo trovare necessariamente all’interno di una LAN, in cui saranno presenti dispositivi switch/hub ad esempio, mentre non è possibile sniffare traffico su una rete di dimensioni maggiori come Internet. In parole povere, per sniffare il traffico dobbiamo essere fisicamente “vicini” alla vittima o alle vittime, cosa tipicamente verificata in una rete locale.

In realtà già con uno switch la sola modalità promiscua è praticamente inutile (a meno di aggiungere tecniche di attacco come l’ARP poisoning). Lo switch, rispetto ad un hub che invia ogni pacchetto ad ogni porta, memorizza dinamicamente al suo interno le porte su cui sono presenti determinati indirizzi MAC, o meglio associa ogni porta ad uno o più indirizzi MAC “permessi”. Il traffico diretto ad un particolare host viene quindi indirizzato sulla specifica porta in modo che il dominio di collisione non corrisponda più all’intera rete. In questo caso ogni host collegato allo switch riceve solo il proprio traffico al quale può sommarsi qualche raro pacchetto inviato in broadcast per determinare la corrispondenza tra indirizzo MAC e porta dello switch. Dunque una scheda di rete in modalità promiscua in uno scenario come questo serve a ben poco, senza l’aggiunta, come già detto, di altre tecniche. Da tener conto che anche attacchi di ARP poisoning possono avere esiti diversi a seconda della grado di sofisticazione e della configurazione dello switch (un conto è uno switch Cisco, un altro uno switch acquistato all’Ipercoop :-().

In linea generale si può dire che una cosa analoga valga anche per le VLAN. Sono possibili attacchi di ARP poisoning all’interno di una stessa VLAN, mentre è decisamente più improbabile un attacco che permetta di compromette un host appartenente ad una VLAN diversa. In definitiva, la messa in ascolto di una scheda di rete con il solo uso della modalità promiscua è utile solo con dei semplici ed obsoleti hub, ed è invece del tutto inutile con gli switch.

Per approfondimenti, consiglio di visitare i link seguenti:

Matteo