- Ditemukan kasus ratusan paket terkirim untuk satu penekanan tombol dalam sesi SSH, lalu akar penyebabnya ditelusuri
- Hasil analisis
tcpdump menunjukkan sebagian besar paket berupa pesan berulang berukuran 36 byte, muncul tiap sekitar 20ms
- Penyebabnya adalah fitur "keystroke timing obfuscation" yang ditambahkan ke SSH pada 2023; untuk menyembunyikan timing input pengguna, fitur ini mengirim banyak paket "chaff" (SSH2_MSG_PING)
- Dengan menonaktifkan fitur ini atau mengubah server agar tidak mengiklankan ekstensi
[email protected], penggunaan CPU dan bandwidth turun hingga kurang dari setengah
- Ini menunjukkan bahwa fitur keamanan SSH dapat menjadi beban besar pada aplikasi yang membutuhkan performa real-time, seperti game
Penemuan masalah
- Saat menguji TUI game berperforma tinggi yang berjalan melalui SSH, ditemukan bahwa satu penekanan tombol saja dapat memicu 270 paket
- Hasil
tcpdump: 66% berupa pesan 36 byte, 33% TCP ACK, sisanya sejumlah kecil data lain
- Rata-rata 90 paket/detik, dengan pengiriman data tiap sekitar 11ms
- Saat pengujian, server sempat salah dikonfigurasi sehingga hanya mengirim pesan "your screen is too small"; pada kondisi ini penggunaan CPU dan bandwidth turun setengah
- Karena data game seharusnya tidak dikirim, penggunaan CPU idealnya mendekati 0%, tetapi ternyata masih bertahan di sekitar 50%
- Dari sini muncul dugaan adanya overhead komunikasi dari SSH itu sendiri
Proses investigasi
- Menggunakan
tcpdump untuk membandingkan trafik SSH antara kondisi normal dan kondisi error
- Bahkan pada kondisi error, paket 36 byte tetap terus muncul tiap 20ms
- Pola yang sama juga ditemukan pada klien SSH bawaan MacOS
- Hasil analisis file pcap dengan Claude Code menunjukkan
- Dari total 413.703 paket, 66% berukuran 36 byte dan 34% berupa ACK 0 byte
- Klien SSH-lah yang secara aktif membuat paket-paket tersebut
Akar penyebab
Solusi
- Di sisi klien, fitur dapat dinonaktifkan dengan opsi
ObscureKeystrokeTiming=no
- Setelah diterapkan, penggunaan CPU dan bandwidth turun signifikan, sementara transmisi data tetap normal
- Sebagai penanganan di sisi server, ekstensi
[email protected] dihapus dari iklan kemampuan pada library SSH Go
- Setelah commit terkait dibatalkan dan diuji ulang, hasilnya:
- Penggunaan CPU 29.9% → 11.6%,
system call 3.10s → 0.66s,
operasi kriptografi 1.6s → 0.11s,
bandwidth 6.5Mbit/s → 3Mbit/s
- Performa meningkat lebih dari 50%
Pengalaman debugging dengan bantuan LLM
- Dengan Claude Code, analisis
tcpdump dan tshark dapat diotomatisasi sehingga akar masalah lebih cepat dipersempit
- Karena proses eksekusi perintah bisa diamati secara real time, mental model tetap terjaga
- ChatGPT sempat salah menilai perilaku SSH sebagai sesuatu yang "normal", sehingga terlihat juga perbedaan antar model
- LLM memang tidak menggantikan seluruh proses pemecahan masalah, tetapi terbukti sangat efisien sebagai alat bantu analisis
- Ini menjadi contoh penyelesaian masalah performa jaringan yang kompleks melalui kombinasi penalaran manusia dan analisis LLM
1 komentar
Komentar Hacker News
Mem-fork library crypto milik Go terasa agak menakutkan
Saya sedang memikirkan cara agar patch kecil saya tetap aman
Sebenarnya saya rasa fitur seperti ini seharusnya di-upstream sebagai opsi di library ssh
Di lingkungan yang tidak tepercaya, mengirim paket chaff (noise) sebagai default itu bagus, tetapi sering juga ada kebutuhan untuk menghemat bandwidth
Solusi yang benar adalah menambahkan opsi agar server bisa memberi sinyal ke klien bahwa ini “tidak diperlukan”, lalu klien bisa menerimanya atau memberi peringatan
Ini hanya berlaku untuk sesi TTY, dan klien bisa menonaktifkannya
Hanya saja, kasus ini merupakan situasi yang tidak biasa karena server sudah tahu sebelumnya bahwa koneksi ini tidak penting
Dalam kebanyakan kasus, klien mengharapkan pengaturan ObscureKeystrokeTiming tetap dipatuhi
library crypto adalah codebase yang sangat berpandangan kuat, sampai urutan TLS cipher suite pun dibuat tidak bisa diubah
Ini tampak seperti kasus penggunaan SSH yang sangat khusus
Jika diekspos terlalu luas, bisa muncul situasi “setel lalu lupakan” yang justru melemahkan keamanan
Ada juga masa berkomunikasi lewat modem 1200bps, dan modem 56K pada dasarnya agak dilebih-lebihkan
Sekitar tahun 1994 saya bekerja di akademi militer Inggris dan pertama kali melihat WWW, saat itu saya berpikir “kok kurang menarik ya”
Kalau dipikir sekarang, perubahan zaman memang luar biasa
Ini pertama kalinya saya mendengar fitur obfuscation ini, menarik juga
Saat men-debug perilaku ssh, mem-patch cipher “None” untuk melihat isi paket secara langsung juga bisa jadi cara yang bagus
Kalau ini game terminal yang mengutamakan performa dan keamanan tidak penting, mungkin layak mempertimbangkan memakai telnet saja
Saya tidak tahu SSH melakukan hal seperti ini
Saya paham kenapa ini aktif secara default, tetapi di lingkungan saya sepertinya lebih tepat dimatikan
Jadi saya ingin mengatur
ObscureKeystrokeTiming=no. Apakah ada alasan kenapa saya sebaiknya tidak melakukan itu?(1) Sulit selalu membedakan kapan seseorang sedang memasukkan rahasia, dan seluruh aktivitas bisa dianalisis polanya
(2) Ini serangan yang bahkan bisa dilakukan di level laboratorium universitas — lihat makalah USENIX dan contoh riset
(3) Di internet yang didominasi trafik video, tidak ada artinya mengorbankan keamanan demi menghemat beberapa byte input keyboard
Jika penyerang menganalisis timing input keyboard, mereka mungkin bisa memperkirakan perintah dan pola kata sandi yang terenkripsi
Tentu saja dekripsi akan sulit karena kunci sesi selalu berubah, tetapi tetap ada kemungkinan
Saya sendiri menyalin-tempel sebagian besar kata sandi dari password manager
Kebanyakan orang merasa tidak ada masalah meskipun mematikan fitur keamanan SSH, tetapi itu hanya karena mereka beruntung
Jika benar-benar butuh performa, pakai Telnet; jika benar-benar butuh keamanan, kombinasi ContainerSSH + OAuth2 lebih baik
Pada 2004 saya pernah meneliti analisis jeda antar penekanan tombol pada sesi SSH untuk menebak perintah
Lihat materi analisis saat itu
Patch tahun 2023 pada akhirnya menyelesaikan masalah itu
Materi presentasi
Waktu benar-benar berlalu cepat
Saya kurang yakin Claude benar-benar membantu untuk debugging
Penulis tampaknya sudah tahu arahnya, dan Claude terasa cuma mengiyakan saja
Claude mengatakan hal seperti “Holy Cow!” itu agak mengganggu
Saat saya men-debug perilaku sistem dengan Claude, meskipun tidak memberi jawaban langsung, itu membantu merapikan pemahaman dan menjaga motivasi
Wiki Rubber Duck Debugging
Melihat penulis suka dengan reaksi “holy cow” dan memasukkannya ke blog, tampaknya Claude cukup pandai membaca suasana
Dengan TCP_CORK, Anda bisa mengurangi jumlah paket tanpa menambah latensi
Mematikan TCP_NODELAY juga bisa, tetapi ada harga berupa peningkatan latensi
Jika socket di-cork, kernel akan men-buffer data lalu mengirimkannya saat di-uncork atau ketika mencapai MSS
Jadi ini cara untuk menggabungkan paket saat transmisi
Referensi
Ping masih akan diterima seperti biasa, tetapi jumlah pengiriman pong mungkin bisa dikurangi
Saya sudah pernah memakai TCP_NODELAY, tetapi latensinya jadi terlalu besar untuk game saya
Posting HN sebelumnya
Untuk tujuan obfuscation, coalescing latensi tampaknya tidak memungkinkan
Ungkapan “The smoking gun!” itu lucu
Saya bukan penutur asli bahasa Inggris, tetapi saya pertama kali mempelajarinya karena Claude sering memakainya
Sekarang ini benar-benar menyebar seperti kata populer
Ketergantungan pada LLM agak disayangkan
Ini sepertinya bisa diselesaikan lebih cepat hanya dengan melihat packet capture di Wireshark
SSH dissector-nya sudah cukup matang
Bahkan jika menangkap satu penekanan tombol dengan tcpdump, hasilnya bisa ratusan paket terenkripsi
Pada akhirnya, berkat LLM penulis mempelajari sesuatu yang menarik dan membagikannya, jadi tetap bermakna
Setelah pesan NEWKEYS, parsing tidak berjalan, dan bahkan jika dipatch dengan enkripsi
none, alurnya tetap tidak sepenuhnya bisa diinterpretasikanMasih ada ruang untuk perbaikan
Belajar dengan memanfaatkan alat juga sudah cukup bernilai
Sulit mendapatkan informasi yang bermakna hanya dari packet capture sederhana
Saya tidak paham kenapa itu harus dianggap sesuatu yang disayangkan
Pada 2023 SSH menambahkan fitur obfuscation timing penekanan tombol
Karena karakter bisa ditebak dari kecepatan pengetikan, SSH mencampurkan paket chaff agar penyerang tidak bisa membedakannya
Tetapi ini tampak seperti pendekatan yang keliru
Kalau memang mau, semua penekanan tombol bisa dikirim dengan interval 50ms
Implementasi saat ini mengelompokkan dalam unit 20ms, lalu menghentikan pengiriman chaff jika tidak ada input selama waktu tertentu
Inti SSH adalah keamanan, tetapi jika keamanan tidak dibutuhkan, saya jadi bertanya kenapa masih memakai SSH
Misalnya netcat(nc) sudah terpasang secara default di sebagian besar platform
Di SSH juga ada pertimbangan lain seperti performa dan kenyamanan
Penulis hanya mengatakan fitur obfuscation penekanan tombol (privasi) itu tidak perlu
Mungkin dia tetap ingin enkripsi atau jaminan integritas tetap ada
Artinya, sebagian besar fitur keamanan SSH tetap dipertahankan dan hanya sebagian kecil yang dimatikan