Sebuah cerita pendek tentang bagaimana kenyamanan kadang-kadang menembak di lutut

Artem Azariev, Kepala Pusat Kompetensi Saluran Layanan Jarak Jauh dari Direktorat Teknologi Informasi ICD

Halo, Habr!

Nama saya Artyom Azariev, saya adalah pemimpin tim tim Android dari Moscow Credit Bank, dan hari ini saya ingin berbicara tentang keamanan aplikasi dari sudut pandang perpustakaan debug. Beberapa tahun saya terlibat dalam freelance, kemudian selama 4 tahun saya telah terlibat dalam pengembangan penuh untuk OS mobile. Kebetulan di tahun-tahun lepas saya demi meningkatkan kualifikasi saya sendiri, saya menyentuh topik rekayasa balik aplikasi Android, dan secara bertahap itu berubah menjadi hobi saya.

Pendahuluan


Bukan rahasia lagi bahwa untuk waktu yang lama Android Studio tidak menyajikan mekanisme apa pun untuk menerima data aplikasi dari perangkat: konten basis data, SharedPrefrences, permintaan jaringan. Semua orang menderita, termasuk raksasa seperti Facebook.

Merekalah yang memberi komunitas perpustakaan yang sangat berguna untuk debugging Shetho (https://github.com/facebook/stetho) dengan integrasi yang sangat sederhana ke dalam proyek hanya dalam beberapa baris. Saya tidak akan berbicara tentang perpustakaan itu sendiri, kemungkinan besar, banyak orang sudah mengetahuinya, tetapi siapa peduli, mereka membacanya sendiri.

Integrasi perpustakaan ini adalah sebagai berikut:





Menggunakan browser Chrome, kami memiliki akses ke konten basis data dan ke pengaturan yang tersimpan di perangkat, dan jika kami menyambungkan plug-in untuk okhttp3, maka juga ke konten permintaan jaringan.



"Tapi, hei, itu akan dalam rilis juga?" - pengembang yang penuh perhatian akan bertanya pada dirinya sendiri. Mari kita beralih ke deskripsi perpustakaan - apa yang kami sarankan tentang ini?

Proyek sampel menunjukkan bahwa perpustakaan ini perlu diinisialisasi hanya di cabang debug dengan membebani manifes di salah satu opsi build.



Kami merakit unit rilis dengan minifikasi diaktifkan (bendera minifyEnabled). Kami memeriksa browser, kami tidak melihat aplikasi apa pun yang tersedia untuk debugging dan tidur dengan tenang.

Minifikasi adalah proses yang bertujuan mengurangi ukuran kode sumber dengan menghapus karakter yang tidak perlu tanpa mengubah fungsinya. Alat Proguard yang digunakan dalam Android juga terlibat dalam membersihkan proyek dari kode yang tidak digunakan.

Peretas


Segala rekayasa balik aplikasi dimulai dengan studi tentang bookmark potensial dan pintu belakang, yang dengan ramah ditinggalkan oleh pengembang untuk diri mereka sendiri.

Pertama, kita mendekompilasi aplikasi di Jawa sebanyak mungkin dan mempelajari tree paket.



Hal termanis yang dapat ditemukan dalam aplikasi yang diserang adalah Stetho tua yang baik. Minifikasi yang dikonfigurasikan secara default tidak menghapusnya, dan secara umum seluruh basis kode perpustakaan ini hanya diseret ke dalam pembuatan produksi.

Saya melihat banyak aplikasi dari perusahaan yang cukup keren dan besar yang telah meninggalkan perpustakaan seperti ini dalam produksi selama bertahun-tahun.

Seseorang akan bertanya: "Dan apa itu? Tidak aktif. Plus, bahkan jika Anda menyalakannya, cobalah membangun aplikasi ini nanti. "

Benar, mendekompilasi di Jawa hampir tidak pernah memberikan kode kerja 100%. Tapi ada smali / backsmali.
Smali / backsmali adalah assembler / disassembler untuk format dex yang digunakan oleh dalvik, sebuah implementasi Java VM di Android.

Dengan membongkar aplikasi kita, kita akan melihat bahwa tidak ada yang benar-benar disertakan.



Tapi, setelah menambahkan beberapa baris dan dalam proyek semua kode perpustakaan, kami, tanpa terlalu tegang, dapat mengaktifkannya kembali.



Untuk plugin okhttp3, dukungan juga diaktifkan dengan cara yang sama - dengan menambahkan Interceptor ke OkhttpClient.

Setelah mengumpulkan kembali aplikasi (dan mudah melakukannya dari smali), kami melihat bahwa debugging melalui stetho tersedia lagi, dan semua data Anda di repositori pengaturan lokal, semua api Anda sepenuhnya berada di depan mata peretas yang licik.

Apa yang harus dilakukan


Ada banyak opsi untuk mengecualikan paket dari versi final. Secara pribadi, saya lebih suka menulis pembungkus kecil untuk menginisialisasi perpustakaan Stetho dan menguraikan berbagai implementasi sesuai dengan opsi perakitan.
lepaskan



debug



Dan juga menunjukkan bahwa basis kode ini diperlukan hanya dalam membangun debug.



bisa bernapas


Saya ingin menyimpulkan dengan menyuarakan prinsip-prinsip dasar yang saya gunakan ketika bekerja dalam konteks keamanan aplikasi Android:

  • Minimalkan dan, jika mungkin, mengaburkan semua yang Anda dapatkan.

    Bagaimanapun, ini mempersulit analisis kode yang didekompilasi. Argumen tambahan untuk membuat rambut beruban di kepala peretas adalah bendera repackageclasses, yang akan memindahkan kelas yang diperkecil ke dalam satu paket. Akan ada banyak dari mereka.
  • Jelajahi aplikasi Anda sendiri.

    Setidaknya pemeriksaan sekilas pohon paket Anda dapat memberi tahu banyak tentang struktur yang digunakan dalam proyek, kerangka kerja, perpustakaan. Apa yang jelas bukan miliknya harus disingkirkan tanpa ampun.
  • Alat apa pun bisa cepat atau lambat menembak Anda di lutut.

Saat menambahkan sesuatu ke proyek Anda, bahkan untuk alasan yang baik, pikirkan bagaimana melakukannya dengan benar dan seberapa banyak Anda membutuhkannya sama sekali.

Semoga pengalaman saya bermanfaat bagi Anda.

Source: https://habr.com/ru/post/id471738/


All Articles