Keamanan Serius: GnuTLS mengikuti OpenSSL, memperbaiki bug serangan waktu

Keamanan Serius: GnuTLS mengikuti OpenSSL, memperbaiki bug serangan waktu

Node Sumber: 1956368

Minggu lalu, kami menulis tentang banyak hal bug manajemen memori yang diperbaiki dalam pembaruan keamanan terbaru dari perpustakaan enkripsi OpenSSL yang populer.

Bersamaan dengan bug memori tersebut, kami juga melaporkan bug yang di-dubbing CVE-2022-4304: Pengaturan waktu Oracle dalam Dekripsi RSA.

Dalam bug ini, mengirimkan pesan terenkripsi yang sama berulang kali di server, namun memodifikasi padding di akhir data untuk membuat data menjadi tidak valid, dan dengan demikian memicu semacam perilaku yang tidak dapat diprediksi…

…tidak akan memakan waktu yang lama, dengan asumsi Anda dekat dengan target di jaringan sehingga Anda dapat menebak dengan pasti berapa lama waktu yang dibutuhkan untuk bagian transfer data dari proses tersebut.

Tidak semua data diproses secara sama

Jika Anda menjalankan permintaan, menghitung berapa lama waktu yang dibutuhkan untuk menjawab, dan mengurangi waktu yang digunakan dalam pengiriman dan penerimaan data jaringan tingkat rendah, Anda akan mengetahui berapa lama waktu yang dibutuhkan server untuk melakukan komputasi internal untuk memproses permintaan tersebut. .

Bahkan jika Anda tidak yakin berapa banyak waktu yang digunakan dalam jaringan, Anda dapat mencari variasi waktu pulang pergi dengan menjalankan banyak permintaan dan mengumpulkan banyak sampel.

Jika jaringan cukup andal untuk mengasumsikan bahwa overhead jaringan sebagian besar konstan, Anda mungkin dapat menggunakan metode statistik untuk menyimpulkan jenis modifikasi data yang menyebabkan penundaan pemrosesan tambahan.

Dari sini, Anda dapat menyimpulkan sesuatu tentang struktur, atau bahkan konten, data asli tidak terenkripsi yang seharusnya dirahasiakan dalam setiap permintaan berulang.

Bahkan jika Anda hanya dapat mengekstrak satu byte teks biasa, hal itu tidak seharusnya terjadi.

Disebut demikian serangan waktu hal semacam ini selalu merepotkan, bahkan jika Anda mungkin perlu mengirim jutaan paket palsu dan mengatur waktu semuanya agar memiliki peluang untuk memulihkan hanya satu byte data teks biasa…

…karena jaringan menjadi lebih cepat, lebih dapat diprediksi, dan mampu menangani lebih banyak beban dibandingkan beberapa tahun yang lalu.

Anda mungkin berpikir bahwa jutaan paket berbahaya yang dikirim ke Anda dalam, katakanlah, satu jam berikutnya akan terlihat seperti jempol.

Namun “satu juta paket per jam lebih atau kurang dari biasanya” bukanlah variasi yang besar lagi.

Bug “Oracle” serupa di GnuTLS

Nah, orang yang sama yang melaporkan bug timing bug yang diperbaiki pada akhirnya di OpenSSL juga melaporkan a bug serupa di GnuTLS pada waktu yang hampir bersamaan.

Yang ini memiliki pengidentifikasi bug CVE-2023-0361.

Meskipun GnuTLS tidak begitu populer atau digunakan secara luas seperti OpenSSL, Anda mungkin memiliki sejumlah program di lingkungan TI Anda, atau bahkan di komputer Anda sendiri, yang menggunakan atau menyertakannya, mungkin termasuk FFmpeg, GnuPG, Mplayer, QEMU , Rdesktop, Samba, Wget dan Wireshark.

Ironisnya, kelemahan waktu di GnuTLS muncul dalam kode yang seharusnya mencatat kesalahan waktu serangan.

Seperti yang Anda lihat dari perbedaan kode (diff) di bawah, pemrogram menyadari bahwa segala kondisi (if ... then) operasi yang digunakan dalam memeriksa dan menangani kesalahan dekripsi mungkin menghasilkan variasi waktu, karena CPU biasanya memerlukan jumlah waktu yang berbeda tergantung pada arah mana kode Anda berjalan setelah instruksi "cabang".

(Hal ini terutama berlaku untuk cabang yang sering berjalan ke satu arah dan jarang ke arah yang lain, karena CPU cenderung mengingat, atau menyimpan cache, kode yang berjalan berulang kali untuk meningkatkan kinerja, sehingga membuat kode yang jarang diambil berjalan lebih lambat.)

Perbedaan kode gnutls-3.7.8/lib/auth/rsa.c dengan 3.7.9

Namun programmer masih ingin mencatat bahwa serangan mungkin terjadi, yang terjadi jika if (ok) tes di atas gagal dan bercabang ke else { ... } bagian.

Pada titik ini, kode tersebut memanggil _gnutls_debug_log() fungsi, yang mungkin memerlukan waktu cukup lama untuk menyelesaikan tugasnya.

Oleh karena itu pembuat kode sengaja memasukkan panggilan ke _gnutls_no_log() dalam then { ... } bagian dari kode, yang berpura-pura mencatat “serangan” padahal sebenarnya tidak ada, untuk mencoba menyamakan waktu yang dihabiskan kode di kedua arah yang if (ok) instruksi cabang dapat mengambil.

Tampaknya, bagaimanapun, kedua jalur kode tersebut tidak cukup mirip dalam waktu penggunaannya (atau mungkin _gnutls_debug_log() fungsinya sendiri tidak cukup konsisten dalam menangani berbagai jenis kesalahan), dan penyerang dapat mulai membedakan tanda-tanda dekripsi setelah satu juta atau lebih percobaan.

Apa yang harus dilakukan?

Jika Anda seorang pemrogram: perbaikan bug di sini sederhana, dan mengikuti prinsip “less is more”.

Kode berwarna merah muda di atas, yang dianggap tidak memberikan data deteksi serangan yang sangat berguna, dihapus begitu saja, dengan alasan bahwa kode yang tidak ada tidak dapat dikompilasi secara tidak sengaja, apa pun pengaturan build Anda…

…dan kode yang tidak dikompilasi tidak akan pernah bisa dijalankan, baik secara tidak sengaja atau disengaja.

Jika Anda pengguna GnuTLS: versi yang baru dirilis 3.7.9 dan “rasa produk baru” 3.8.0 dapatkan perbaikan ini, bersama dengan berbagai perbaikan lainnya, yang disertakan.

Jika Anda menjalankan distro Linux, periksa pembaruan pada versi perpustakaan bersama GnuTLS yang dikelola secara terpusat yang Anda miliki, serta aplikasi yang membawa versinya sendiri.

Di Linux, cari file dengan nama libgnutls*.so untuk menemukan perpustakaan bersama yang ada, dan mencari gnutls-cli untuk menemukan salinan utilitas baris perintah yang sering disertakan dengan perpustakaan.

Anda bisa lari gnutls-cli -vv untuk mengetahui versi yang mana libgnutls itu terkait secara dinamis dengan:

 $ gnutls-cli -vv gnutls-cli 3.7.9 <-- distro Linux saya mendapat pembaruan Jumat lalu (2023-02-10)

Stempel Waktu:

Lebih dari Keamanan Telanjang