"memperbaiki bug ini adalah sederhana: periksa bahwa panjang dari pesan benar-benar sesuai dengan panjang dari permintaan yang masuk."
Mengapa kita bahkan memiliki klien melaporkan suhu udara turun sama sekali?
Jika kita dapat mengetahui panjang dari permintaan yang masuk, dapat't kita hanya menyimpulkan panjang pesan itu?
(Ini adalah pemrograman dan desain protokol pertanyaan.)
Saya tidak mengetahui apapun pasti, "resmi" jawaban tentang hal ini, tapi ini tampaknya menjadi bagian dari upaya genericity dan koherensi. Di SSL/TLS standar, semua pesan-pesan rutin mengikuti aturan pengkodean, menggunakan spesifik presentasi bahasa. Tidak ada bagian dari protokol "menyimpulkan" panjang dari panjang record.
Salah satu yang mencerahkan detail adalah ClientKeyExchange
pesan: di SSL 3.0, dengan RSA key exchange, isi dari pesan jabat tangan adalah "raw" hasil enkripsi (yaitu 256 byte jika server menggunakan 2048-bit RSA key, ditambah 4-byte pesan jabat tangan header); di TLS 1.0 dan versi berikutnya, enkripsi hasilnya adalah "buram vektor" dengan tambahan dua-byte header yang berisi panjang, sehingga's 258 byte, bukan 256, dan masih dengan tambahan 4-byte jabat tangan header pesan. Perubahan ini menggambarkan akan standar desainer untuk mencapai ketat keteraturan dengan sedikit kesimpulan dari packet suhu udara sebanyak mungkin.
Salah satu keuntungan dari tidak menyimpulkan panjang dari struktur luar adalah bahwa hal itu membuatnya jauh lebih mudah untuk memasukkan ekstensi opsional setelah itu. Hal ini dilakukan dengan ClientHello
pesan, misalnya.
Jika kita melihat hal-hal dari sudut pandang, TLS hanya setengah-selesai. TLS, sebagai protokol, kebutuhan untuk pertukaran data terstruktur; pengirim dan penerima harus dapat encode dan decode data tersebut dengan tidak ada ambiguitas, dan sebaiknya tidak ada buffer overflow baik. Salah satu strategi yang harus dilakukan berikut ini:
Perwujudan dari strategi ini adalah ASN.1. ASN.1 digunakan, misalnya, dalam sertifikat X. 509; dengan ASN.1 compiler, anda bisa (secara teoritis) paste ASN.1 sintaks dari X. 509 standar dan mendapatkan lengkap encoder/decoder mesin untuk sertifikat X. 509 (saya telah melakukan itu, termasuk tulisan saya sendiri ASN.1 compiler, dan ada beberapa "kebiasaan", termasuk fakta bahwa ASN.1 jenis untuk string dan tanggal tampaknya telah diciptakan oleh babon pada LSD, tetapi skema keseluruhan masih bekerja).
Perwujudan lain adalah XML, dengan XML Schema sebagai "presentasi bahasa": anda mendorong skema dan input data ke XML parser, dan jika sesuatu yang lain dari sebuah kode kesalahan yang dihasilkan, maka anda know bahwa semua data sesuai dengan skema, dan anda dapat berjalan di decoded, terstruktur pohon. Lagi-lagi,'s teori, yang bagus, sejauh teori-teori saja.
"presentasi bahasa" TLS jatuh sedikit pendek di sini: tidak memiliki compiler. Bahwa bahasa looks seperti "bahasa komputer", tapi hal itu dimaksudkan untuk membaca manusia. Untuk itu, ia bekerja dengan baik; namun, ini berarti bahwa developer akan memiliki untuk menuliskan bahasa itu menjadi sebuah encoder/decoder. Pengembang harus berhati-hati untuk tidak melupakan langkah. Dan yang's apa yang terjadi dengan "heartbleed" bug: langkah dilupakan, yang dapat memiliki konsekuensi yang mengerikan.
Untuk TLS dengan tujuan dari keaktifan (tetap hidup) cek, ada's tidak ada alasan untuk:
rrec.panjang
di OpenSSL kode-anda hanya harus kurangi off tetap HB ukuran header ini), tls1_heartbeat
), perbaikan payload size di 18. Pengolahan HB respon di tls1_process_heartbeat juga hanya tidak bermakna apapun pengolahan jika muatan yang tepat 18. Catatan pengolahan permintaan di TLS adalah rentan part yang dirusak HTTPS.
Latar belakang
Sebelum masuk ke mengklaim pembenaran, saya harus memperkenalkan tiga konsep: DTLS, PMTU, dan PMTU penemuan yang berhubungan dengan keaktifan cek, tapi berurusan dengan lainnya yang diusulkan digunakan untuk Detak jantung ekstensi. Skip to diusulkan pembenaran jika anda akrab.
TLS (enkripsi pada TCP) dan DTLS (enkripsi pada UDP)
Biasa menambahkan enkripsi TLS di atas TCP. TCP adalah protokol transport-layer yang menyediakan transportasi yang handal stream, yang berarti aplikasi menerima kembali data stream dengan semua paket yang disajikan untuk aplikasi dalam urutan asli setelah semuanya ada, bahkan jika beberapa harus menunggu beberapa waktu ekstra untuk paket yang akan membenci. TCP juga menyediakan kontrol kongesti (jika paket-paket yang dijatuhkan karena kemacetan, TCP akan menyesuaikan tingkat paket-paket yang dikirim). Semua HTTP, HTTPS, SFTP lalu lintas dikirim melalui TCP.
Datagram TLS (DTLS) adalah sebuah protokol baru yang menambahkan enkripsi di atas UDP (dan mirip datagram protokol seperti DCCP dimana aplikasi ini memiliki kontrol penuh atas bagaimana untuk mengirim paket-paket). Ini adalah protokol lapisan transport yang tidak memberikan handal sungai, tapi mengirim paket secara langsung antara aplikasi client/server seperti yang dikendalikan oleh sebuah aplikasi. Dengan TCP jika paket hilang maka secara otomatis akan membenci dan keterlambatan pengiriman selanjutnya paket-paket sampai paket yang hilang melalui. UDP memberikan paket tingkat kontrol untuk aplikasi, yang sering diinginkan untuk komunikasi real-time seperti dua-cara video chat. Jika paket A, B, C, D dikirim tapi paket C itu hilang, itu doesn't masuk akal untuk menunggu C akan membenci sebelum menampilkan paket D untuk pengguna -- menyebabkan panjang jeda.
PMTU
Untuk DTLS, hal ini diinginkan untuk mengetahui path unit transmisi maksimum. MTU untuk satu link antara router adalah ukuran paket maksimum yang dapat dikirim. Router yang berbeda dan jenis link yang sering mendukung Mtu yang berbeda. Path MTU (MTU terkecil di jalan anda mengambil paket melalui jaringan) pada umumnya tidak akan dikenal terlebih dahulu sebagai properti dari jalur yang melalui jaringan tersebut. Jika anda mengirim datagram yang lebih besar dari PMTU, mereka akan memiliki untuk fragmen pada MTU terkecil yang tidak diinginkan untuk beberapa alasan (tidak efisien, paket terfragmentasi dapat dijatuhkan oleh firewall/NAT, yang membingungkan untuk lapisan aplikasi, dan ipv6 dengan desain yang tidak akan pernah fragmen paket). Jadi dalam konteks DTLS, RFC pasukan data dari rekam lapisan untuk muat dalam satu DTLS paket (yang lebih kecil dari PMTU). (Dengan TLS ini PMTU masalah yang ditangani pada TCP tingkat; tidak lapisan aplikasi agar anda TLS dapat agnostik untuk PMTU).
PMTU discovery
Ada protokol untuk menemukan PMTU — khusus pembentukan paket layer Path MTU discovery (RFC 4821). Dalam konteks ini, anda menyelidiki jaringan dengan mengirimkan paket-paket dari berbagai ukuran (dikonfigurasi untuk tidak fragment) dan melacak batas atas dan batas bawah dari PMTU tergantung apakah paket-paket yang dibuat melalui jaringan atau tidak. Hal ini dijelaskan dalam RFC4821. Jika probe paket membuatnya melalui, anda menaikkan batas bawah, jika itu akan hilang anda menurunkan batas atas sampai bagian atas/batas bawah dekat dan anda memiliki perkiraan PMTU, yang digunakan untuk mengatur atas ukuran pada DTLS paket. Mengklaim Pembenaran HB Memiliki Payload Header, padding, setelah sampai 2-byte ukuran lapangan Detak jantung RFC RFC6520 mengatakan anda dapat menggunakan Detak jantung untuk path MTU discovery untuk DTLS:
5.1. Path MTU Discovery DTLS melakukan path MTU discovery seperti yang dijelaskan dalam Bagian 4.1.1.1 dari [RFC6347]. Penjelasan rinci tentang bagaimana untuk melakukan jalan MTU penemuan ini diberikan dalam [RFC4821]. Yang diperlukan probe paket ini adalah HeartbeatRequest pesan. DTLS aplikasi yang tidak perlu untuk memperkirakan PMTU. Namun, hal ini tidak dilakukan oleh DTLS, yang dilakukan oleh aplikasi menggunakan DTLS. Melihat dikutip bagian dari DTLS RFC Bagian 4.1.1.1 dari RFC6347 menyatakan "Secara umum, DTLS's filsafat adalah untuk meninggalkan PMTU discovery untuk aplikasi." Ini terus memberikan tiga keberatan mengapa DTLS harus khawatir tentang PMTU (DTLS aplikasi harus kurangi off DTLS header untuk mendapatkan efektif PMTU ukuran untuk data, DTLS mungkin harus berkomunikasi ICMP "Datagram Terlalu Besar" kembali ke lapisan aplikasi, dan DTLS jabat tangan harus lebih kecil dari PMTU. Sebelumnya di DTLS RFC itu menyatakan DTLS catatan HARUS disimpan dalam satu datagram lebih kecil dari PMTU, jadi PMTU discovery/estimasi harus dilakukan oleh aplikasi menggunakan DTLS. Di PMTU penemuan itu masuk akal untuk memiliki sebuah lapangan kecil yang menjelaskan panjang payload, memiliki sejumlah besar sewenang-wenang padding, dan memiliki sesuatu yang echos kembali, yup mendapat permintaan anda dengan ukuran MTU meskipun saya'm hanya mengirim anda kembali urutan nomor (dan efisiensi dapat menjatuhkan padding pada respon). Yang diberikan itu doesn't masuk akal jika anda menggambarkan ukuran muatan untuk memungkinkan payload yang lebih besar dari sekitar ~4-32 byte, sehingga ukuran payload bisa diperbaiki atau dijelaskan oleh satu byte lapangan, bahkan jika sewenang-wenang panjang padding bisa bersambung. Analisis Klaim OpenSSL HB pelaksanaan dan keterangan di HB RFC, doesn't menggambarkan atau melakukan ini PMTU discovery protocol. MTU tidak hadir dalam kode. OpenSSL tidak hanya menyediakan satu mekanisme untuk menghasilkan HB permintaan di TLS dan DTLS, tetapi ukuran tetap (18 byte payload, tidak dikonfigurasi).
Mencari melalui IETF TLS milis Jika anda mencari IETF TLS mailing list, bisa anda temukan menarik nugget. Mengapa muatan/padding panjang uint16, dan mengapa ada padding jika harus dibuang? PMTU discovery. Sama asker (Juho Vähä-Herttua) menyatakan dia akan sangat sukai paket verifikasi: baca muatan suhu udara, bantalan suhu udara, dan pastikan bahwa itu sesuai catatan panjang (minus header). Juga Simon Josefsson:
saya memiliki satu keprihatinan ringan dengan perijinan sewenang-wenang muatan. Apa alasan untuk ini? Terbuka untuk saluran samping di TLS. Itu bisa juga disalahgunakan untuk mengirim non-standar data. Selanjutnya, apakah ada alasan untuk memungkinkan sewenang-wenang berukuran muatan? Dalam pendapat saya, payload_length, muatan dan bidang padding tampaknya tidak perlu untuk saya. Michael Tüxen's respon sebagian besar tidak memadai (mungkin beberapa fitur yang ingin ditambahkan di atas untuk menghitung mengatakan RTT) dan merangkum dengan "intinya di sini adalah bahwa untuk interoperabilitas, itu tidak peduli apa muatan, itu hanya penting bahwa itu adalah tercermin." Juga dari catatan alasan random padding "[kita] mengacak ... data dalam detak jantung pesan untuk mencoba untuk kepala dari setiap masalah yang terjadi dari lemah atau cacat cipher. " diikuti oleh pertanyaan "Apakah ada makalah atau cipher dokumentasi membahas bagaimana menggunakan rancangan acak kelompok data dalam sebuah paket akan memecahkan masa depan mungkin cipher kekurangan?", diikuti oleh kertas di deterministik dikonfirmasi enkripsi. The respon yang lebih besar: Memang, tapi ini bukan generik mode enkripsi seperti CBC atau CTR. Ini ini secara khusus dirancang untuk mengenkripsi kunci acak, dan dengan demikian tergantung pada its keacakan. Khas enkripsi mode yang dirancang khusus untuk mencegah seseorang membedakan yang diberikan plaintext enkripsi dari acak. Sekarang, jika seseorang ingin menggunakan subliminal channel di TLS, detak jantung ekstensi sekarang menyediakan aplikasi yang tak terbatas channel. It's menarik bahwa komentar itu tidak pernah dibahas. (Selain dari orang lain komentar " Baik's seluruh masalah yang berbeda....").
Jika anda melihat ke RFC6520 (detak jantung ekstensi) ada padding setelah muatan. Jadi panjang ini diperlukan untuk mengetahui di mana muatan berakhir dan padding dimulai. Selain itu saya menemukan desain overengineered: kedua alasan untuk ekstensi ini tampaknya akan membuat PMTU mungkin (dengan menggunakan pesan-pesan ukuran yang berbeda) dan dengan memiliki detak jantung untuk mengetahui jika ujung yang lain masih hidup atau untuk mengatur ulang beberapa timeout counter di negara-negara middleboxes. Ada tidak perlu untuk mendapatkan yang ditentukan pengguna muatan tercermin dalam skenario ini.
Dan dari perspektif keamanan semacam ini overengineered protokol, di mana anda hanya menguji hal-hal yang anda benar-benar perlu, hanya mengemis untuk masalah masa depan.