Sebulan yang lalu, di
Pesta Droid berikutnya
, pengembang senior Danila Fetisov memeriksa secara rinci prinsip layanan, yang bertanggung jawab atas fungsi aksesibilitas Android. Anda akan belajar bagaimana menggunakannya untuk meningkatkan aksesibilitas proyek Anda, serta kerentanan berbahaya yang disebut clickjacking.
- Nama saya Danila Fetisov, saya dari kantor Yandex Moskow, lebih khusus dari Taksi, lebih khusus dari Taximeter. Hari ini kita akan berbicara tentang apa itu aksesibilitas Android dan mengapa saya memutuskan untuk menyebut hal kecil yang suci bagi orang cacat sebagai serigala berbulu domba.

Jadi, garis besar laporannya. Pertama, kita akan melihat bagaimana benda ini dapat digunakan, dibuat dan disesuaikan. Mungkin aku akan memberitahumu beberapa peretasan kehidupan, toko kelontong. Dan kemudian tentang yang paling menarik - tentang mengapa hal ini berbahaya.

Bagaimana kita bisa menerapkan ini sama sekali? Secara umum, apa itu untuk mereka yang tidak tahu? Setiap peristiwa terjadi dalam sistem, mereka masuk dalam layanan kami, dan kami memprosesnya.
Setelah sesuatu jatuh untuk kita, kita dapat mengambil konten dari sana dan menyuarakannya menggunakan Yandex SpeechKit yang sama, Google Text-to-Speech atau sesuatu yang Anda suka. Namun yang paling menarik, kami tidak hanya dapat menerima, tetapi juga mengadakan acara sistem. Anda masih bisa mengatakan sesuatu. Dia melemparkan acara, menekan tombol, dan benar semuanya baik-baik saja, nikmati hidup.
Jika kita berbicara tentang dua poin ini, mereka sebenarnya adalah default. Google meluncurkan fitur ini sehingga para penyandang cacat dapat menggunakan aplikasi Anda. Tetapi seperti yang diketahui semua orang, kami pengembang tidak ingin bosan: kami duduk, melihat kodenya dan berpikir: bagaimana kami bisa menerapkannya? Dan kita berangkat.
Otomatisasi, pengujian dengan mensimulasikan tindakan pengguna, iklan kontekstual. Anda mengerti: karena kami mendapatkan konten dari layar, kami dapat memahami cara membuat frustrasi pengguna ini.
Apa lagi yang menarik? Memproses permintaan USSD. Sayangnya, API normal hanya muncul dari SDK ke-26, dan pengembang entah bagaimana harus bertahan. Dan Anda bayangkan, mereka benar-benar mem-parsing permintaan USSD, mem-parsing UI menggunakan AccessibilityService.
Poin keenam adalah elipsis. Mengapa Karena setelah laporan ini, Anda akan memiliki pemahaman tentang cara menerapkannya dan untuk apa. Dan kemudian Anda benar-benar membuka aliran imajinasi Anda, mengambil secangkir teh, kopi, dan berkendara untuk mengkodekan fitur keren mereka.
Di mana untuk memulai? Slide berikutnya akan menjadi hal yang lumrah.

Kami mengambil layanan, mewarisi dari AccessibilityService dan menikmati hidup.
Lalu kami melempar layanan ini ke Manifest, dan apa yang menarik di sini? Pada dasarnya catatan layanan reguler. Namun perhatikan bidang label. Sekarang saya tidak akan memberi tahu apa itu. Ingat, ini akan sedikit nanti.


Lebih jauh sepanjang Manifest kita hanya memiliki file konfigurasi, tidak ada yang menarik juga.

Dan file konfigurasi itu sendiri terlihat sedikit lebih mengerikan. Dari yang Anda perlukan, kemungkinan besar, 85β90 persen adalah bidang pengaturan filter untuk acara yang masuk.
Katakanlah layak di sini bahwa kami ingin menerima sepenuhnya semua acara. Anda dapat menempatkan filter hanya pada klik, pada mengubah konten, atau pada sesuatu yang lain.
Berikutnya adalah filter untuk paket aplikasi. Untuk apa ini? Anda sendiri sangat memahami bahwa menerima acara dari semua aplikasi dalam sistem akan terlalu banyak untuk satu aplikasi. Karena itu, Google memutuskan untuk membatasinya. Menambahkan filter.
Penjelasan lebih lanjut. Ada bidang label, dan sekarang gunakan deskripsi. Bahkan, mereka membuat pasangan, yang kemudian memberi tahu pengguna mengapa Anda perlu mengaktifkan layanan Anda.
Dan poin terakhir: konten dibutuhkan atau tidak diperlukan dari jendela terbuka saat ini. Jika Anda hanya ingin memahami bahwa suatu peristiwa telah terjadi, setel ke false dan jangan siksa pengguna lagi.

Dimasukkannya layanan. Sayangnya, untuk mengaktifkan fitur ini, Anda harus menyiksa pengguna dan memaksanya untuk pergi melalui tujuh lingkaran pengaturan neraka, secara relatif.
Pertama, kami membuka peluang khusus untuknya. Cool AccessibilityService - ini persis label yang sama dari manifes, yang saya katakan di slide sebelumnya.

Lebih jauh Pengguna perlu memilih layanan Anda, dan kemudian dia mulai membaca deskripsi, mengapa Anda ingin mengaktifkan layanan ini dan mendapatkan kontrol atas perangkat.

OKE, termasuk. Tapi itu dia. Beberapa jenis dialog menakutkan keluar, yang mengatakan: "Sobat, jika Anda aktifkan sekarang, kami akan mengambil kendali penuh dari aplikasi Anda, secara relatif, semuanya akan menakutkan." Pengguna tidak selalu membaca semua ini, cukup klik "OK" sehingga kami berada di belakang mereka. Jadi kita hidup.
Nah, dari mana sebenarnya proses pengolahan itu kita dapatkan? Slide berikutnya sedikit lebih pintar dari slide pertama tentang layanan ini, namun demikian.

Berikut adalah DummyAccessibilityService kami, dan kami menjatuhkan dua metode di sana, di mana kami akan menulis semuanya. Sebenarnya, interupsi adalah metode di mana Anda harus membersihkan tautan, menghentikan langganan, atau yang lainnya.
Yang paling menarik adalah kelas AccessibilityEvent, yang jatuh ke tangan kita. Apa yang bisa kita dapatkan darinya?

Untuk memulainya, kami dapat memahami apa yang sebenarnya terjadi di sistem Anda. Kami menggunakan EventType, dan apa yang kami dapatkan di sini?
Dan kami mendapatkan bahwa kami memiliki semacam Kegiatan di sana dibuka, atau Dialog, atau Popup, atau secara umum pemberitahuan telah jatuh. Semuanya jatuh di sana di window_state_changed.
Kami semakin memahami bahwa konten beberapa tampilan telah berubah. Mereka memindahkannya, melemparkan beberapa baris dalam tampilan teks atau sesuatu seperti itu.
Dan kemudian kami mencari tahu kapan pengguna mengklik, atau memilih tampilan. Menurut pendapat saya, 85, dan bahkan 98, mungkin, persen dari tugas produk utama yang Anda bahas dengan jenis acara ini.
Tetapi jika Anda tidak memiliki cukup dari mereka, tolong, Anda dapat pergi ke dokumentasi, saya akan menunjukkan kepada Anda sebuah tautan di akhir laporan, dan, tentu saja, Anda akan mengunduh laporan, Anda dapat melanjutkan. Itu hanya bacaan sepanjang malam, ada daftar besar. Serius, Anda tidak akan menguasainya sekaligus.

Sekarang kami memiliki pertanyaan: bagaimana cara menemukan tampilan? Kami menemukan apa yang terjadi. Dan sekarang mari kita pahami dengan pandangan mana, dengan komponen apa ini terjadi.
Ambil AccessibilityEvent kami.
Kami mengambil Sumber darinya, dan, voila, kami sudah melihat meta-informasi.
Tetapi bagaimana jika Anda adalah pengembang hardcore, dan Anda tidak memiliki informasi yang cukup tentang satu tampilan, Anda ingin memahami apa yang pada dasarnya terjadi di layar sekarang? Ada batasan pada SDK, tetapi kecil.

Kami mengambil AccessibilityService kami, dan kami mendapatkan, pada kenyataannya, referensi ke elemen root di seluruh hierarki di layar saat ini. Dan baru saat itulah kami mendapatkan informasi meta kami.

Ini, tentu saja, itu keren, tetapi sekarang Anda harus memiliki pertanyaan di kepala Anda: kita punya tautan ke elemen root. Apa yang akan kita lakukan selanjutnya?
Jika Anda ingin menempuh jalan yang aman, maka, silakan, opsi pertama. Ambil tampilan ID, dan temukan satu metode saja.
Jika Anda merasa membosankan, berburu adalah sesuatu yang lebih menyenangkan, maka kami mengambil teks dari pandangan, kami menemukannya dari teks.
Jika ini tidak cukup menarik bagi Anda - baiklah, kawan, ambil Child and Recursion, berjalanlah di sana. Maka Anda akan mengerti persis apa yang terjadi.
Bagus Anda dan saya menemukan cara menemukan tampilan. Bagaimana sekarang berinteraksi dengannya?
Sekali lagi, kami mengambil AccessibilityNodeInfo kami, dan sekarang kami sudah memasukkan Action ke dalamnya. Aksi apa yang bisa kita lemparkan ke sana?

Untuk memulainya, kita bisa melempar Klik. Mengapa pada akhirnya saya taruh di sini tidak hanya setelah Klik, tetapi juga Klik dan Pilih? Ya, karena ada banyak sudut, ketika Klik biasa tidak menyelamatkan Anda. Misalkan pengguna memilih teks dan mengklik tampilan akan menghapus pilihan dari teks itu. Atau, pada beberapa perangkat, pada prinsipnya, tampilan tidak dapat diklik hingga Anda memanggil Pilih di atasnya. Secara umum, banyak masalah. Dan jika Anda hanya ingin mandi uap - do Select, do Click. Dua Aksi, dan itu saja, ada kebahagiaan.
Apa selanjutnya dengan kita? Dan kemudian kita memiliki instalasi teks. Di sini juga, semuanya sederhana. Ambil Action_set_text, buat Bundel dengan baris kami, dan langsung.
Dan poin ketiga adalah pergi ke dokumentasi. Sekali lagi, ini adalah malam kedua yang akan Anda miliki. Sekelompok tindakan langsung, menurut pendapat saya, bahkan lebih dari sekadar peristiwa.
Hore! Bagian paling membosankan dari laporan ini sudah berakhir. Sekarang saatnya untuk semua jenis nishtyachkov.
Misalkan Anda membuat layanan, mengkonfigurasinya, dan melemparkan semacam pemrosesan acara. Sekarang Anda perlu memahami cara memaksa pengguna, cara memintanya untuk tetap mengaktifkan layanan ini. Untuk memahami ini, Anda perlu mencari tahu, pada prinsipnya, layanan sekarang dinyalakan atau tidak.

Semuanya sederhana sampai banalitas. Kami mengambil AccessibilityManager dan memintanya untuk semua layanan yang saat ini termasuk dalam sistem, dan di sana kami menemukan milik kami.
Tapi semuanya akan, tentu saja, akan baik-baik saja jika Manajer Aksesibilitas adalah pria normal, dan tidak ada yang Anda tanyakan kepadanya: "Sobat, tolong beri saya, semua layanan yang tersedia," dan dia berkata: "Maaf, saya tidak hari ini dalam suasana hati. Ini daftar kosong untukmu. β Dan Anda sangat duduk dan berpikir: "Sialan, kami sudah bicara normal."

Nah, ada teman lama yang baik - ini adalah Settings.Secure.getInt dan getString. Pertama kami bertanya apakah layanan bahkan termasuk dalam sistem. Jika dimasukkan, maka semuanya dilemparkan ke dalam satu baris, dan di sana kami sudah mencari milik kami melalui beberapa jenis konten.
Dan di sini kita bertemu dengan fakta bahwa kita melakukan segalanya dengan benar. Kami menciptakan konfigurasi, membuat konstruksi acara apa pun, menyalakan layanan. Kami melihat dengan pasti bahwa kami menghidupkan layanan, dan acara tidak datang kepada kami. Jadi, mereka tiba, atau tidak datang. Pada saat itu, saya berpikir bahwa dalam hidup saya semacam garis hitam telah datang. Benar tidak ada pilihan.
Saya berpikir, berpikir, mengulang, mengulang, dan kemudian, bingo, saya menyadari bahwa ini adalah Xiaomi dengan MIUI mereka. Itu hanya rasa sakit teman-teman! Itu serius.
Oke, mengerti apa masalahnya. Bagaimana cara mengatasinya sekarang? Sayangnya, pada beberapa firmware di MIUI semuanya dilakukan sehingga jika aplikasi Anda tidak dalam auto start, maka sistem bahkan tidak akan memulai layanan Anda pada prinsipnya.

Tapi di sini ada satu solusi - kami meminta pengguna untuk menambahkan aplikasi Anda ke awal otomatis, dan kami terus hidup, menikmati hidup.

Dan kemudian datang ceri di atas kue. Mengapa layanan ini, begitu baik untuk para penyandang cacat, serigala berbulu domba?
Menurut saya, banyak di antara Anda yang sudah menduga bahwa jika pengguna mengaktifkan layanan ini, maka kita dapat dengan mudah mencuri banyak informasi rahasia dari perangkatnya. Kita tidak hanya dapat mencurinya, kita dapat menjatuhkannya di suatu tempat, misalnya, membuka kunci layar jika dikunci menggunakan kode pin. Baiklah, ok, buka kunci layar. Apa selanjutnya Kami beriklan sendiri, kami akan mendapatkan banyak uang, kami akan langsung hidup. Dan, pada akhirnya, kita pada dasarnya dapat meniru sepenuhnya tindakan apa pun dari pengguna, dan, katakanlah, letakkan beberapa jenis aplikasi, berikan hak adminnya, dan katakan kepada pengguna: βSelamat tinggal. Ucapkan selamat tinggal pada perangkat Anda. "

Oke, kita bisa melakukan semua ini, tetapi sekarang Anda akan berkata: βKamu, tentu saja, bagus sekali. Dia memberi tahu kami bagaimana kami bisa mencuri data seperti apa. Tetapi bagaimana Anda membuat pengguna mengaktifkan AccessibilityService Anda, dan jika aplikasi itu kidal? " Oke, pengguna, menurut saya, hanya membuka pengaturan, memahami bahwa ada semacam omong kosong yang ditulis di sana, menutup, mencopot pemasangan aplikasi dan lupa. Dan Anda tahu, Anda akan benar bahwa cara pertama untuk menghidupkan melalui pengaturan sistem pergi ke "tidak", karena, Anda tahu, ini semacam omong kosong. Dan di sini kerentanan datang ke bantuan kami, yang, pada dasarnya, disebut clickjacking. Berapa banyak dari kalian yang akrab dengan clickjacking? Hebat, itu akan menarik.
Jadi, berdasarkan kerentanan ini, beberapa orang - saya menaruh referensi kecil, karena semua tangkapan layar berikut akan berasal dari sumber daya orang-orang ini - muncul dengan serangan yang disebut Cloak and Dagger. Bahkan, dengan hanya dua izin dan interaksi pengguna minimal, Anda mendapatkan akses ke seluruh aplikasi langsung dari kata "sepenuhnya".
Tapi ok, apa yang perlu kita lakukan untuk meretas pengguna?
Kami melempar aplikasi kami di Google Play. Kami berharap bahwa pengguna versi Android kurang dari 8.
Anda mengerti, sedikit - 95% saat ini. Dan itu saja, pengguna mengunduh aplikasi kami.

Singkatnya, malware ini memberi tahu pengguna cara menjadi orang baik, menunjukkan video di bagian paling akhir. Sekarang Anda akan melihat segalanya untuk diri Anda sendiri.

Ok, mari kita mulai. Sedikit teks. Kami diberitahu: "Jika Anda memulai tutorial sekarang, Anda akan menjadi orang baik." Oke, tentu saja, kita mulai.

Beberapa teks lainnya. Selanjutnya, orang akan disajikan dalam bentuk pria hijau. Baiklah, mari klik Berikutnya.

Teks lain. Baiklah Sekarang saya akan selesai membacanya dan saya pasti akan melihat video di mana mereka akan memberi tahu saya bagaimana menjadi pria yang baik.


Saya klik "OK", dan di sana video dimulai. Ini tidak begitu penting bagi kami. Penting apa yang sebenarnya terjadi pada perangkat pada saat itu. Pengguna meluncurkan aplikasi, dan karena kami menginstalnya dari Google Play, kami secara otomatis diberikan izin untuk melakukan overlay. Voila, kami membuka jendela aksesibilitas, dan di atas hanya overlay. Pengguna mengklik pada Start Tutorial, tetapi sebenarnya memilih AccessibilityService kami. Nah, Anda mengerti apa yang terjadi selanjutnya.

Selanjutnya kita klik Berikutnya, pilih sakelar sakelar.

Pada akhirnya, kami mengaktifkan AccessibilityService, dan pengguna bahkan tidak menyadari bahwa ini terjadi.
Apakah Anda tahu apa masalahnya? Overlay diatur sedemikian rupa sehingga mereka dapat sepenuhnya menyerap semua acara, semua sentuhan sudah jauh, atau mereka benar-benar ketinggalan. Dan inti dari serangan khusus ini adalah kita mengisi overlay, seluruh layar kecuali satu spasi. Dalam hal ini, ini adalah tombol OK. Tombol ini benar-benar dari dialog. Ketika kami mengkliknya, kami mendapatkan acara yang mengatakan bahwa sentuhan di luar telah terjadi, dan semuanya baik-baik saja.
Bagaimana Google menanggapi semua masalah ini? Anda mengerti, ini adalah kerentanan yang agak brutal.

Semuanya dimulai dengan cukup menarik - semuanya dengan delapan tahun keheningan. Google meluncurkan hal kecil ini, berkata: "Guys, gunakan itu. Itu aman. Saya katakan pasti. " Baiklah Google melempar. Orang yang sama yang ditemukan oleh Cloak dan Dagger, memberikan dukungan, pelacak masalah, dan pelacak bug.
Lalu Google berkata, βOke, oke teman, tenang. Saya akan menutup clickjacking di Oreo. " Yah, matikan. Mereka masih duduk di sana, mereka berpikir: βYah, sial, semuanya, sama saja, jika penyerang memaksa pengguna untuk memungkinkan aksesibilitas, itu akan buruk. Mari kita sedikit mengejek pengembang.
Dan mereka mengirim surat: "Lakukan, saya tidak tahu apa, kalau tidak aplikasi Anda akan dihapus dari Google Play." Singkatnya, surat itu adalah sebagai berikut: "Guys, beri tahu kami dan pengguna mengapa Anda membutuhkan AccessibiiltyService." Bagaimana cara mengatakannya? Dalam format apa? Dimana? Umumnya tidak ada pengertian. Dan dalam surat itu, tentu saja, ini tidak ditunjukkan.
Baiklah Utas besar di reddit, banyak surat untuk mendukung. Dan kemudian beberapa pengembang menaruh surat di reddit, dan berbunyi: βYa ada teman, tidak ada yang rumit. Masukkan ke dalam deskripsi yang saya tunjukkan, dalam manifes, masukkan ke dalam deskripsi di Google Play, dan semuanya akan baik-baik saja, saya akan meninggalkan Anda sendirian. "
Pada saat itu saya berpikir: baiklah, oke, saya menemukan surat ini di sela-sela Reddit. Tetapi bagaimana jika saya seorang pengembang muda, saya baru saja berkenalan dengan AccessibilityService dan ingin merilis aplikasi dengan ini? Bagaimana saya mengetahui bahwa saya perlu melakukan tindakan seperti itu, apakah saya harus mencantumkannya dalam deskripsi di Google Play, dll? Saya berpikir, berpikir, mencari, mencari, dan, Anda tahu, teman-teman, saya tidak menemukan apa pun, dari kata sama sekali.
Yah, serius, tidak ada apa-apa. Hanya ada deskripsi di dokumentasi utama: "Guys, ini murni untuk orang-orang cacat, itu intinya. Anda tidak bisa menggunakannya lagi. " Namun ternyata, itu mungkin.

Nah, Anda dan saya telah berakhir. Apa yang bisa kami bicarakan dengan Anda? Kami berbicara tentang cara menggunakannya, memahami cara membuat semuanya, mengonfigurasinya, dan memahami cara menangani acara UI. Dan, tentu saja, kami mengerti bagaimana itu mungkin, tetapi Anda tidak perlu berinteraksi dengan AccessibilityService. Tentu saja, saya tidak menyarankan Anda untuk melakukan ini, itu hanya untuk informasi. Berikut adalah sumber yang dijanjikan:
-
developer.android.com/guide/topics/ui/accessibility/services-
developer.android.com/reference/android/view/accessibility/AccessibilityEvent-
developer.android.com/reference/android/view/accessibility/AccessibilityNodeInfo-
cloak-and-dagger.orgKawan, terima kasih banyak atas perhatiannya!