Meretas dengan Unicode (pada contoh GitHub)

Unicode sangat kompleks. Hanya sedikit orang yang tahu semua trik : dari karakter yang tidak terlihat dan karakter kontrol hingga pasangan pengganti dan emoji gabungan (saat menambahkan dua karakter menghasilkan yang ketiga). Standar ini mencakup 2 16 posisi kode di 17 pesawat . Bahkan, belajar Unicode dapat dibandingkan dengan belajar bahasa pemrograman terpisah.

Tidak mengherankan, pengembang web mengabaikan beberapa nuansa. Di sisi lain, penyerang dapat menggunakan fitur Unicode untuk tujuan mereka sendiri, yang mereka lakukan.

Spesialis Keamanan John Gracie menunjukkan contoh bug verifikasi email GitHub untuk memulihkan kata sandi yang terlupakan. Bug serupa dapat ditemukan di situs lain.

John Gracie menjelaskan apa "tanda tabrakan terjemahan" ketika dua karakter yang berbeda setelah konversi diterjemahkan ke dalam karakter yang sama.

Dalam hal ini, ia menggunakan karakter Turki 'ı' ('i' tanpa titik), yang diterjemahkan ke dalam bahasa Latin 'i', sehingga alamat email John@Gıthub.com setelah diproses berubah menjadi John@Github.com :

 'ß'.toLowerCase() // 'ss' 'ß'.toLowerCase() === 'SS'.toLowerCase() // true // Note the Turkish dotless i 'John@Gıthub.com'.toUpperCase() === 'John@Github.com'.toUpperCase() 

Tabrakan tersebut dapat ditemukan di semua pesawat Unicode: di sini adalah daftar lengkap .

Kami terutama tertarik pada karakter-karakter yang diterjemahkan ke dalam karakter Latin. Hanya ada sebelas opsi. Di tempat ketiga dalam tabel hanyalah tanda Turki 'i' tanpa titik.

Tanda tanganPoin kodeHasil
ß0x00DFSS
ı0x0131I
ſ0x017FS
0xFB00FF
fi0xFB01FI
fl0xFB02FL
0xFB03FFI
0xFB04FFL
0xFB05ST
0xFB06ST
K0x212Ak

GitHub mengizinkan penyerang untuk mendapatkan kata sandi dari akun orang lain, karena prosedur untuk memulihkan kata sandi yang dilupakan tidak berfungsi dengan benar.

Sebagai bagian dari prosedur ini, alamat email yang dimasukkan dibandingkan dengan alamat yang disimpan dalam database. Algoritma Verifikasi:

  1. Alamat yang dimasukkan adalah huruf kecil menggunakan metode toLowerCase.
  2. Alamat yang dimasukkan dibandingkan dengan alamat dalam basis data pengguna terdaftar.
  3. Jika kecocokan ditemukan, kata sandi dari basis data dikirim ke alamat yang dimasukkan .

Jelas, para pengembang tidak menyadari tabrakan terjemahan alamat ketika menggunakan metode toLowerCase .

Dalam hal ini, memperbaiki kesalahan itu sederhana. Cukup dengan mengirim kata sandi bukan ke alamat yang dimasukkan, tetapi ke alamat dari basis data.

Tentu saja, ini bukan perbaikan bug lengkap, tetapi hanya perbaikan cepat. Solusi yang lebih lengkap adalah menyiarkan ke Punycode untuk verifikasi: John@Gıthub.comxn—john@gthub-2ub.com . Punycode dirancang untuk secara unik mengonversi nama domain menjadi urutan karakter ASCII. Alamat email dapat diverifikasi dengan cara yang sama, tetapi sebagian besar aplikasi web tidak.

John Gracie menerima hadiah uang tunai dan 2.500 poin untuk kerentanan, meskipun ia masih jauh dari peretas utama Github, Alexander Dobkin termasuk untuk mengeksekusi kode arbitrer pada server GitHub yang menghasilkan Halaman GitHub.


Messenger lumpuh saat menerima emoji titik hitam (Messenger di iOS, WhatsApp untuk Android)

Bug yang terkait dengan Unicode memiliki properti sehingga dapat ditemukan di aplikasi apa pun yang memproses teks yang dimasukkan oleh pengguna. Kerentanan ada dalam aplikasi web dan program asli untuk Android dan iOS. Salah satu yang paling terkenal adalah bug iOS dari 2015 , ketika beberapa karakter Unicode dalam pesan teks menyebabkan sistem operasi crash. Tahun lalu, bug Unicode yang serupa ditemukan di iOS 11.3, dikenal sebagai "titik hitam" . Kecelakaan serupa terjadi di aplikasi WhatsApp untuk Android ketika Anda menyentuh emoji.






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


All Articles