Kode klien Telegram
ditambahkan dengan kemampuan untuk menyamar sebagai HTTPS (TLS + HTTP / 2.0).

Untuk menggunakan fitur ini, mereka menambahkan awalan rahasia baru -
"ee" . Selain itu, mereka menambahkan kemampuan untuk menyandikan rahasia di alamat server proxy sebagai base64, selain hex.
Sebelum mempelajari detailnya, mari kita coba mencari tahu bagaimana dukungan server proxy di Telegram dikembangkan.
Latar belakang
- Telegram awalnya mendukung proksi SOCKS. Ini membantu mem-bypass pemblokiran server IP, tetapi protokolnya terlihat dalam lalu lintas, dan kata sandi ditransmisikan dalam bentuk teks.
- Sekitar setahun yang lalu, mereka merilis proxy resmi yang bekerja pada protokol MTProto baru. Tidak seperti SOCKS, kata sandi dalam MTProto tidak dikirimkan dalam teks yang jelas. Dalam protokol, mereka menyingkirkan header layanan yang dapat dipahami orang bahwa itu benar-benar dirinya. Kami juga menambahkan kemampuan untuk menampilkan iklan ke pengguna server proxy
- Ternyata proksi yang menjalankan protokol MTProto dapat dideteksi oleh panjang paket. Ketika koneksi dibuat, klien dan server proxy bertukar paket dengan panjang tertentu, dan selama operasi - paket dengan panjang modulo 4. Fitur ini mulai digunakan oleh penyedia besar untuk memblokir messenger. Pengembang Telegram bereaksi dengan memodifikasi protokol dengan menambahkan sejumlah byte acak ke setiap paket. Karena perubahan merusak kompatibilitas, saya harus melengkapi format rahasia dengan awalan "dd" khusus, yang berarti menggunakan protokol yang dimodifikasi:
tg://proxy?server=178.62.232.110&port=3256&secret=dd00000000000000000000000000000000
- Ketika mempelajari fitur pemblokiran server proxy di Cina dan Iran, ternyata pengawas menggunakan serangan replay untuk deteksi. Dalam implementasi alternatif dari server proxy di Python, Erlang dan Go, perlindungan parsial terhadap jenis serangan ini telah muncul. Untuk ini, server proxy menyimpan data yang dikirim pada tahap awal membangun koneksi dan tidak memungkinkan menghubungkan kembali dengan data yang sama. Pendekatan memiliki masalah dengan proxy besar, seperti memori membutuhkan sejumlah besar RAM
- Di Cina dan Iran, taktik berikut digunakan: jika protokol tidak diketahui, maka untuk berjaga-jaga, kecepatan kerjanya sangat terpotong. Dalam praktiknya, ini berarti kemungkinan menggunakan Telegram hanya untuk mengirim pesan teks, tanpa gambar dan video. Dan di Cina mereka tahu cara melakukan ini untuk waktu yang lama, tetapi di Iran mereka belajar relatif baru. Rusia belum belajar, tetapi hukum sudah disahkan . Upaya pengembang messenger untuk menutupi lalu lintas di bawah beberapa protokol populer dengan latar belakang ini terlihat alami.
Apa yang berubah?
Dalam protokol antara klien Telegram dan server proxy, lapisan enkapsulasi lain melalui TCP ditambahkan. Alih-alih mengirim data melalui TCP, data tersebut dibungkus dengan entri TLS berikut:

Pada awal pekerjaan, fase emulasi jabat tangan TLS telah ditambahkan. Paket dari klien ke server proxy memiliki struktur berikut:

Hampir semua bidang tidak masuk akal untuk klien Telegram dan diperlukan hanya untuk berpura-pura menjadi TLS. Fungsi yang paling penting dijalankan oleh bidang
Random , di mana hasil
HMAC dari rahasia bersama dan data dalam paket ditempatkan, yang memungkinkan klien untuk membuktikan bahwa ia tahu rahasianya. Juga, klien memunculkan 4 byte terakhir dari bidang Random dengan waktu dalam format unixtime, yang memungkinkan server proxy untuk menentukan kapan paket dihasilkan. Ini berguna untuk melindungi dari serangan replay. Jika paket dibuat lama atau di masa depan, maka server proxy dapat segera menjatuhkannya.
Ketika klien terhubung, server proxy memeriksa HMAC yang dikirimkan. Jika cocok dengan yang dihitung, proxy merespons dengan paket dengan struktur berikut:

Bidang
acak di dalamnya juga tidak acak, tetapi merupakan hasil dari HMAC dari rahasia bersama dan data dalam paket, dan ketika menghitung HMAC, nilai acak yang dikirim oleh klien diberikan sebelum data paket itu sendiri. Saat mentransmisikan data itu sendiri, pesan pertama diabaikan oleh klien, yang memungkinkan Anda untuk mengirimnya data dengan panjang acak, untuk semakin mempersulit pendeteksian.
Di mana mencoba?
Untuk demonstrasi,
server proxy dengan Python telah dimodifikasi dan dimunculkan, yang dapat Anda sambungkan ke klien desktop Telegram terbaru dan saksikan lalu lintas yang dikirimkan menggunakan Wireshark:
tg://proxy?server=178.62.232.110&port=3256&secret=7gAAAAAAAAAAAAAAAAAAAABnb29nbGUuY29t
Juga, dukungan masking TLS telah ditambahkan
ke server proksi Erlang . Kemungkinan besar, dalam waktu dekat, fungsi ini akan ditambahkan ke implementasi lain dari server proxy.