Impostare il firewall sui dispositivi iOS con Jailbreak

firewall

Recentemente ho effettuato il Jailbreak sul mio vecchio iPhone 4S, senza troppe preoccupazioni visto che la garanzia è scaduta da un pezzo. Per farlo ho seguito le istruzioni trovate sul blog iSpazio che, come sempre, si sono rivelate precise ed affidabili. Come da abitudine, subito dopo il Jailbreak, ho installato ed attivato alcuni tweak e servizi tra i quali OpenSSH (per connettermi in modalità terminale ed accedere ai file con Cyberduck o WinSCP) e Samba (per poter montare il disco dell’iPhone come una normale condivisone Windows).

Mi sono poi preoccupato di vedere se OpenSSH e Samba fossero raggiungibili anche dalla connessione dati della rete cellulare e, come temevo, era proprio così: a differenza delle normali connessioni casalinghe, in cui il firewall del router nasconde e protegge la propria rete locale dagli accessi provenienti dall’esterno, la connessione dati degli operatori mobili espone direttamente lo smartphone sulla Internet pubblica e lo rende raggiungibile da chiunque utilizzando semplicemente l’indirizzo IP esterno (ricavabile, ad esempio, dal sito WhatIsMyIP). Poco male con i dispositivi non sottoposti a Jailbreak, che non hanno alcun servizio attivo. Ma in caso di servizi attivi, forse è il caso di impostare un bel firewall, in modo da consentire l’accesso solamente dalla più sicura e protetta interfaccia Wi-Fi (a meno che non vi colleghiate ad un hotspot pubblico 😉 ). Infatti, anche servizi ritenuti molto sicuri possono contenere bug più o meno noti (vedi il recente Heartbleed) che espongono i nostri dispositivi al rischio di accessi non desiderati e non controllati da parte di hacker, malware etc.: sul mio iPhone ho un sacco di foto, email, messaggi SMS e quant’altro che voglio assolutamente proteggere e tenere per me!

Prima della cura

Un buon punto di partenza consiste nel valutare quanto e come il nostro dispositivo sia protetto dagli accessi provenienti dalla Internet pubblica. Questa valutazione conviene farla a tutti, anche a chi non ha effettuato il Jailbreak o a chi accede ad Internet usando un normale PC. Per testare il vostro iCoso è sufficiente spegnere la rete Wi-Fi, in modo da essere sicuri di utilizzare la connessione dati della rete cellulare, e far girare il test ShieldsUP! (Su gli scudi!) che si trova sull’ottimo sito GRC.com.

Nel mio caso, prima di qualsiasi intervento, il risultato è stato questo:

IMG_4971

Tutte le mie well known ports sono risultate chiuse (quadratini blu), ad eccezione delle porte TCP 22 (ssh) e TCP 139 (netbios-ssn) che sono risultate pericolosamente aperte! Esito: il test ShieldsUP! è fallito. Come ulteriore verifica, ho provato a connettermi con ssh dal mio PC sull’indirizzo IP pubblico del mio iPhone e… sono tranquillamente entrato :-(.

Da notare che l’impostazione ottimale sarebbe non di avere le porte “chiuse”, ma “nascoste” (stealth). La differenza è sottile ma fondamentale: nel caso di porta chiusa, a chi bussa viene risposto “qui non c’è nessuno”; nel caso di porta stealth, a chi bussa non viene risposto affatto. Nel primo caso si ha la conferma che, comunque, a quell’indirizzo IP un dispositivo c’è, e magari si può insistere con altri mezzi per tentare di farlo crollare. Nel secondo caso questa conferma non c’è e, quindi, nessuna scansione casuale (interrogare gli indirizzi IP a caso, o a tappeto, un po’ come si può fare componendo numeri telefonici a caso) può rilevare la presenza del nostro dispositivo su Internet.

La cura

Su iOS, come su tanti sistemi operativi basati su Unix *BSD, è presente un buon firewall IP: Packet Filter. Packet Filter (PF) è uno strumento veramente completo e complesso, e non sarebbe possibile trattarlo qui in modo esauriente, quindi mi limiterò a discutere un semplice esempio applicativo. Per chi fosse interessato ad approfondire, oltre al già citato link sul sito di OpenBSD, segnalo le pagine del manuale online di Mac OS X per pfctl (https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man8/pfctl.8.html) e comandi correlati.

In sostanza si deve:

  1. preparare un file di regole che istruisca come trattare i pacchetti che transitano attraverso l’interfaccia di rete relativa alla connessione dati mobile. Quello che ho scritto io, che sul mio iPhone ho chiamato /etc/pf.conf, è il seguente:
    # A set of rules to stop incoming connections from the cellular data interface
    # on Apple iOS devices.
    # Created: A. Morgantini https://gpz500.wordpress.com/, 2014-11-26
    # Modified:
    
    # Define the cellular data interfaces
    cell_if = "{ pdp_ip0, pdp_ip1, pdp_ip2, pdp_ip3 }"
    
    # All outgoing traffic to cellular data interfaces is permitted; state is kept
    # (to permit related incoming traffic)
    pass out on $cell_if
    
    # All incoming traffic from cellular data interfaces is blocked (except the
    # traffic matching active connections)
    block in on $cell_if
    
    
  2. caricare queste regole sul modulo runtime di PF. Per fare questo, da terminale su iPhone via ssh e da utente root, si deve dare il comando:
    # pfctl -ef /etc/pf.conf
  3. rendere queste regole permanenti.
    Per evitare che iOS faccia il boot senza caricare il nostro file di regole PF, occorre creare un job launchd che, ad ogni avvio, lo ricarichi di nuovo. Launchd è il daemon fondamentale di Mac OS X e iOS: oltre ad essere il primo processo (pid 1) del sistema e ad occuparsi di gestire e lanciare i vari daemon del sistema operativo (analogo ad init di Linux), fa anche la parte del superserver Internet (inetd/xinetd), e gestisce i task temporizzati (come crond e atd). Ogni job è definito da un file XML con estensione .plist che deve essere collocato in una specifica cartella di sistema. Il file .plist che ho creato per ricaricare le regole di PF ad ogni avvio è questo:

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
    <plist version="1.0">
        <dict>
            <key>Label</key>
            <string>org.morgantini.pfload</string>
            <key>ProgramArguments</key>
            <array>
                <string>/sbin/pfctl</string>
                <string>-ef</string>
                <string>/etc/pf.conf</string>
            </array>
            <key>RunAtLoad</key>
            <true/>
        </dict>
    </plist>

    Va spostato nella cartella /Library/LaunchDaemons e rinominato con il valore della chiave Label, seguito dall’estensione .plist (in questo caso /Library/LaunchDaemons/org.morgantini.pfload.plist). Inoltre si deve essere sicuri che proprietà del file e permessi siano quelli giusti, quindi, da terminale e come utente root, si devono dare i comandi seguenti:

    # chown root:wheel /Library/LaunchDaemons/org.morgantini.pfload.plist
    # chmod 644 /Library/LaunchDaemons/org.morgantini.pfload.plist
  4. riavviare il dispositivo.

Dopo la cura

Ripetendo il test ShieldsUP! dopo la cura, sul mio iPhone ho ottenuto questo risultato:

IMG_4972

Test passato e porte tutte quante stealth! Adesso sono più contento :-).

Riferimenti

I temi della sicurezza informatica e, in particolare, dell’uso e della configurazione dei firewall per Internet sono estremamente complessi: a riguardo c’è tutta una nutrita e costosa letteratura, spesso non alla portata del neofita o del semplice appassionato di Internet e reti di calcolatori. Lungi da me, quindi, voler essere esaustivo sull’argomento o voler infondere nel lettore una falsa, quanto dannosa, sensazione di sicurezza: in questo articolo si tratta una semplice applicazione di esempio che ha risolto un mio personalissimo problema. Ciononostante, seguendo la procedura illustrata si pone rimedio ad una falla di sicurezza alla quale, spesso inconsapevolmente, sono soggette le persone che effettuano il Jailbreak al proprio dispositivo iOS. In altre parole, quella che espongo in questo articolo è una procedura che consiglio a tutti quelli che hanno un dispositivo iOS con Jailbreak.

Per chi vuole comunque approfondire, riassumo qui alcuni riferimenti utili:

Advertisements

Rispondi

Inserisci i tuoi dati qui sotto o clicca su un'icona per effettuare l'accesso:

Logo WordPress.com

Stai commentando usando il tuo account WordPress.com. Chiudi sessione / Modifica )

Foto Twitter

Stai commentando usando il tuo account Twitter. Chiudi sessione / Modifica )

Foto di Facebook

Stai commentando usando il tuo account Facebook. Chiudi sessione / Modifica )

Google+ photo

Stai commentando usando il tuo account Google+. Chiudi sessione / Modifica )

Connessione a %s...