Distribusi sistem operasi open source OpenBSD terkenal di kalangan sysadmin, terutama mereka yang mengelola server, karena fokusnya pada keamanan melebihi kecepatan, fitur, dan front-end yang mewah.
Tepatnya, mungkin, logonya adalah ikan buntal – menggelembung, dengan paku-paku siap untuk mengusir setiap peretas cerdik yang mungkin datang.
Tetapi tim OpenBSD mungkin paling dikenal bukan karena seluruh distronya, tetapi karena perangkat akses jarak jauhnya OpenSSH yang ditulis pada akhir 1990-an untuk dimasukkan ke dalam sistem operasi itu sendiri.
SSH, kependekan dari cangkang aman, awalnya dibuat oleh ilmuwan komputer Finlandia Tatu Ylonen pada pertengahan 1990-an dengan harapan menyapih sysadmin dari kebiasaan berisiko menggunakan protokol Telnet.
Masalah dengan Telnet
Telnet sangat sederhana dan efektif: alih-alih menghubungkan kabel fisik (atau menggunakan modem melalui saluran telepon) untuk membuat koneksi teletype ke server jarak jauh, Anda malah menggunakan koneksi TELetype NETwork.
Pada dasarnya, data yang biasanya mengalir bolak-balik melalui koneksi serial khusus atau saluran telepon dial-up dikirim dan diterima melalui internet, menggunakan koneksi jaringan TCP packet-switched alih-alih link point-to-point circuit-switched. .
Sistem login familiar yang sama, koneksi lebih murah, tidak perlu jalur data khusus!
Cacat raksasa di Telnet, tentu saja, adalah kurangnya enkripsi, sehingga mengendus sesi terminal Anda yang tepat adalah sepele, memungkinkan cracker untuk melihat setiap perintah yang Anda ketikkan (bahkan kesalahan yang Anda buat, dan setiap kali Anda menekan [Backspace]
), dan setiap byte keluaran yang dihasilkan…
…dan, tentu saja, nama pengguna dan kata sandi Anda di awal sesi.
Siapa pun di jalur jaringan Anda tidak hanya dapat dengan mudah merekonstruksi sesi sysadmin Anda secara real time di layar mereka sendiri, tetapi mungkin juga mengutak-atik sesi Anda dengan memodifikasi perintah yang Anda kirim ke server jarak jauh dan memalsukan balasan kembali sehingga Anda tidak menyadarinya akal-akalan.
Mereka bahkan dapat membuat server penipu, memikat Anda ke sana, dan membuat Anda sangat sulit menemukan penipuan tersebut.
FTW enkripsi yang kuat
SSH Ylönen bertujuan untuk menambahkan lapisan enkripsi dan autentikasi yang kuat ke setiap akhir sesi seperti Telnet, menciptakan cangkang aman (itulah arti namanya, jika Anda pernah bertanya-tanya, meskipun hampir semua orang menyebutnya begitu saja ess-ess-aitch hari-hari ini).
Itu adalah hit instan, dan protokolnya dengan cepat diadopsi oleh sysadmin di mana-mana.
OpenSSH segera menyusul, seperti yang kami sebutkan di atas, pertama kali muncul pada akhir 1999 sebagai bagian dari OpenBSD 2.6 lepaskan.
Tim OpenBSD ingin membuat implementasi protokol open-source yang gratis, andal, yang mereka dan orang lain bisa menggunakan, tanpa lisensi atau komplikasi komersial apa pun yang membebani implementasi asli Ylönen di tahun-tahun segera setelah dirilis.
Memang, jika Anda menjalankan server Windows SSH dan menyambungkannya dari komputer Linux sekarang, Anda hampir pasti akan mengandalkan implementasi OpenSSH di kedua ujungnya.
Protokol SSH juga digunakan dalam layanan klien-server populer lainnya termasuk SCP dan SFTP, kependekan dari salinan aman dan FTP aman masing-masing. SSH secara longgar berarti, "sambungkan dengan Aman dan jalankan perintah SHell di ujung yang lain", biasanya untuk login interaktif, karena program Unix untuk shell perintah biasanya /bin/sh
. SCP serupa, tetapi untuk Menyalin file, karena perintah penyalinan file Unix umumnya disebut /bin/cp
, dan SFTP dinamai dengan cara yang hampir sama.
OpenSSH bukan satu-satunya toolkit SSH di kota.
Implementasi terkenal lainnya termasuk: libssh2, untuk pengembang yang ingin membangun dukungan SSH langsung ke dalam aplikasi mereka sendiri; dropbear, server SSH yang dipreteli dari pembuat kode Australia Matt johnston yang banyak ditemukan pada apa yang disebut perangkat IoT (Internet of Things) seperti router rumah dan printer; Dan Putty, kumpulan alat terkait SSH yang populer dan gratis untuk Windows dari pengembang sumber terbuka indie Simon Tatham di Inggris.
Tetapi jika Anda adalah pengguna SSH biasa, Anda hampir pasti terhubung ke setidaknya satu server OpenSSH hari ini, paling tidak karena sebagian besar distribusi Linux kontemporer memasukkannya sebagai alat akses jarak jauh standar mereka, dan Microsoft menawarkan klien OpenSSH dan OpenSSH server sebagai komponen Windows resmi hari ini.
Perbaikan bug bebas ganda
OpenSSH versi 9.2 baru saja keluar, dan catatan rilis laporan sebagai berikut:
Rilis ini berisi perbaikan untuk […] masalah keamanan memori. [Bug ini] diyakini tidak dapat dieksploitasi, tetapi kami melaporkan sebagian besar kesalahan memori yang dapat dijangkau jaringan sebagai bug keamanan.
Bug mempengaruhi sshd
, server OpenSSH ( -d
akhiran singkatan dari daemon, nama Unix untuk jenis proses latar belakang yang dipanggil Windows a layanan):
sshd(8): memperbaiki kesalahan memori bebas ganda pra-otentikasi yang diperkenalkan di OpenSSH 9.1. Hal ini diyakini tidak dapat dieksploitasi, dan ini terjadi dalam proses pra-auth yang tidak memiliki hak istimewa yang tunduk pada chroot(2) dan selanjutnya di-sandbox pada sebagian besar platform utama.
Bug bebas ganda berarti blok memori yang telah Anda kembalikan ke sistem operasi untuk digunakan kembali di bagian lain dari program Anda…
… nanti akan diserahkan kembali oleh bagian dari program yang tidak lagi benar-benar “memiliki” memori itu, tetapi tidak mengetahuinya.
(Atau dikembalikan dengan sengaja atas permintaan kode yang mencoba memprovokasi bug dengan sengaja untuk mengubah a kerentanan menjadi sebuah mengeksploitasi.)
Hal ini dapat menyebabkan bug yang halus dan sulit diurai, terutama jika sistem menandai blok yang dibebaskan sebagai tersedia saat pertama kali free()
terjadi, kemudian mengalokasikannya ke bagian lain dari kode Anda ketika meminta memori melalui malloc(
), dan kemudian tandai pemblokiran bebas sekali lagi saat panggilan berlebihan ke free()
muncul.
Itu membuat Anda berada dalam situasi yang Anda alami saat check-in di hotel yang mengatakan, “Oh, kabar baik! Kami pikir kami sudah kenyang, tetapi tamu lain baru saja memutuskan untuk check-out lebih awal, sehingga Anda dapat memiliki kamar mereka.”
Bahkan jika ruangan dibersihkan dengan rapi dan disiapkan untuk penghuni baru saat Anda masuk, dan dengan demikian tampak seolah-olah dialokasikan dengan benar untuk penggunaan eksklusif Anda, Anda tetap harus percaya bahwa kartu kunci tamu sebelumnya memang dibatalkan dengan benar, dan bahwa “ checkout lebih awal” bukanlah tipu muslihat untuk menyelinap kembali di hari yang sama dan mencuri laptop Anda.
Perbaikan bug untuk perbaikan bug
Ironisnya, jika Anda melihat riwayat kode OpenSSH baru-baru ini, Anda akan melihat bahwa OpenSSH memiliki bug sederhana dalam fungsi yang disebut compat_kex_proposal()
, digunakan untuk memeriksa algoritme pertukaran kunci seperti apa yang akan digunakan saat mengatur koneksi.
Tetapi memperbaiki bug sederhana itu justru memperkenalkan kerentanan yang lebih parah.
Omong-omong, keberadaan bug di bagian perangkat lunak yang digunakan selama penyiapan koneksi inilah yang membuatnya disebut pra-autentikasi yang dapat dijangkau jaringan kerentanan (atau bug pra-autentikasi Singkatnya).
Bug bebas ganda terjadi pada kode yang perlu dijalankan setelah klien telah memulai sesi jarak jauh, tapi sebelum perjanjian kunci atau otentikasi apa pun telah terjadi, sehingga kerentanan dapat, secara teori, dipicu sebelum kata sandi atau kunci kriptografi apa pun disajikan untuk validasi.
Di OpenSSH 9.0, compat_kex_proposal
terlihat seperti ini (sangat disederhanakan di sini):
char* compat_kex_proposal(char* suggestion) { if (condition1) { return suggestion; } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { suggestion = allocatenewstring2(); } if (isblank(suggestion)) { error(); } return suggestion; }
Idenya adalah bahwa penelepon melewati blok memori mereka sendiri yang berisi string teks yang menyarankan pengaturan pertukaran kunci, dan mendapatkan kembali persetujuan untuk menggunakan saran yang mereka kirimkan, atau string teks yang baru dialokasikan dengan saran yang diperbarui .
Bugnya adalah jika kondisi 1 salah tetapi kondisi 2 dan 3 keduanya benar, kode akan dialokasikan dua string teks baru, tetapi hanya kembali satu.
Blok memori yang dialokasikan oleh allocatenewstring1()
tidak pernah dibebaskan, dan ketika fungsi kembali, alamat memorinya hilang selamanya, jadi tidak ada cara bagi kode apa pun untuk free()
itu di masa depan.
Blok itu pada dasarnya ditinggalkan, menyebabkan apa yang dikenal sebagai a kebocoran memori.
Seiring waktu, ini dapat menyebabkan masalah, bahkan mungkin memaksa server dimatikan untuk memulihkan dari kelebihan memori.
Di OpenSSH 9.1, kode diperbarui dalam upaya untuk menghindari pengalokasian dua string tetapi mengabaikan salah satunya:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion){ char* previousone = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { suggestion = allocatenewstring1(); } if (condition3) { previousone = suggestion; suggestion = allocatenewstring2(); } free(previousone); } if (isblank(suggestion()) { error(); } return suggestion; }
Ini memiliki bug bebas ganda, karena jika kondisi 1 dan kondisi 2 keduanya salah, tetapi kondisi 3 benar, maka kode mengalokasikan string baru untuk dikirim kembali sebagai jawabannya…
... tetapi salah membebaskan string yang awalnya diteruskan oleh pemanggil, karena fungsinya allocatenewstring1()
tidak pernah dipanggil untuk memperbarui variabel suggestion
.
String saran yang diteruskan adalah memori milik pemanggil, dan bahwa penelepon karena itu akan membebaskan dirinya sendiri di kemudian hari, yang mengarah ke bahaya bebas ganda.
Di OpenSSH 9.2, kode menjadi lebih berhati-hati, melacak ketiga kemungkinan blok memori yang digunakan: yang asli suggestion
(memori dimiliki oleh orang lain), dan dua kemungkinan string baru yang mungkin dialokasikan di jalan:
/* Always returns pointer to allocated memory, caller must free. */ char* compat_kex_proposal(char* suggestion) { char* newone = NULL; char* newtwo = NULL; if (condition1) { return newcopyof(suggestion); } if (condition2) { newone = allocatenewstring1(); } if (condition3) { newtwo = allocatenewstring2(); } free(newone); newone = newtwo; } if (isblank(newone)) { error(); } return newone; }
Jika kondisi 1 benar, salinan baru dari string yang diteruskan digunakan, sehingga penelepon dapat melakukannya nanti free()
memori string yang diteruskan kapan pun mereka mau.
Jika kita melewati kondisi 1, dan kondisi 2 benar tetapi kondisi 3 salah, maka saran alternatif dibuat oleh allocatenewstring1()
dikembalikan, dan diteruskan suggestion
tali dibiarkan begitu saja.
Jika kondisi 2 salah dan kondisi 3 benar, maka string baru dihasilkan dan dikembalikan, dan diteruskan suggestion
tali dibiarkan begitu saja.
Jika kedua kondisi 2 dan kondisi 3 benar, maka dua string baru dialokasikan sepanjang jalan; yang pertama dibebaskan karena tidak diperlukan; yang kedua dikembalikan; dan orang yang lewat suggestion
tali dibiarkan begitu saja.
Anda dapat RTxM untuk mengkonfirmasi bahwa jika Anda menelepon free(newone)
ketika newone
is NULL
, lalu "tidak ada operasi yang dilakukan", karena selalu aman untuk dilakukan free(NULL)
. Namun demikian, banyak pemrogram masih menjaganya dengan kuat dengan kode seperti if (ptr != NULL) { free(ptr); }
.
Apa yang harus dilakukan?
Seperti yang disarankan oleh tim OpenSSH, mengeksploitasi bug ini akan sulit, paling tidak karena terbatasnya hak istimewa yang dimiliki sshd
yang dimiliki program saat menyiapkan koneksi untuk digunakan.
Namun demikian, mereka melaporkannya sebagai lubang keamanan karena memang begitu, jadi pastikan Anda telah memperbaruinya OpenSSH 9.2.
Dan jika Anda menulis kode dalam C, ingatlah bahwa tidak peduli seberapa berpengalaman Anda, manajemen memori mudah salah…
… jadi berhati-hatilah di luar sana.
(Ya, Rust dan teman-teman modernnya akan melakukannya membantu Anda untuk menulis kode yang benar, tetapi terkadang Anda masih perlu menggunakan C, dan bahkan Rust tidak dapat menjaminnya menghentikan Anda menulis kode yang salah jika Anda memprogram dengan ceroboh!)
- Konten Bertenaga SEO & Distribusi PR. Dapatkan Amplifikasi Hari Ini.
- Platoblockchain. Intelijen Metaverse Web3. Pengetahuan Diperkuat. Akses Di Sini.
- Sumber: https://nakedsecurity.sophos.com/2023/02/03/openssh-fixes-double-free-memory-bug-thats-pokable-over-the-network/