Enkripsi terowongan WSS berhenti di terminator TLS, bukan di aplikasi
URL wss:// membuktikan TLS pada satu lompatan. Apakah muatan punya enkripsi sendiri bergantung pada apa yang klien letakkan di dalamnya dan siapa yang mengakhiri TLS itu.
Terowongan yang dibawa di dalam WebSocket aman memiliki persis sebesar enkripsi yang klien masukkan ke dalamnya, tidak lebih. Skema wss:// mengatakan bahwa TLS melindungi satu koneksi pada satu lompatan. Skema itu tidak mengatakan apa pun tentang apakah bita di dalam pesan WebSocket dilindungi secara terpisah, dan perbedaan itulah yang menentukan siapa yang dapat membaca lalu lintas Anda ketika sesuatu di tengah mengakhiri TLS.
Dua lapisan yang tampak seperti satu
WebSocket aman adalah TLS dengan jabat tangan WebSocket yang dilakukan di atasnya, seperti yang dijelaskan RFC 6455 di bagian koneksi dan keamanannya. Lapisan TLS mengautentikasi server dan mengenkripsi aliran, lalu lapisan WebSocket membingkai apa pun yang diputuskan aplikasi untuk dikirim.
Itu dua keputusan yang independen, dan diagram yang menggambar satu gembok di seluruh jalur menyembunyikan yang kedua. Tanyakan siapa yang mengakhiri koneksi TLS. Lalu tanyakan apa yang klien letakkan di dalam setiap pesan. Segala hal lain tentang penerapan mengikuti dari kedua jawaban itu.
Desain A: transport adalah satu-satunya enkripsi
Dalam desain yang lebih sederhana, klien mengambil paket IP mentah dan membungkusnya dalam pesan WebSocket. Tidak ada yang terenkripsi di dalamnya, sehingga komponen yang memegang sesi TLS membaca muatan teks biasa. Ketika komponen itu adalah server terowongan Anda sendiri, inilah titik akhir yang dimaksudkan dan desainnya koheren, karena server memang akan melihat lalu lintas itu.
Keadaannya menjadi susunan berbeda ketika proksi inspeksi berada di jalur dan mengakhiri TLS dengan sertifikat yang dipercaya klien. Proksi itu sekarang memegang teks biasa yang sama dengan yang akan dipegang server, dan tidak ada jumlah pembingkaian WebSocket yang mengubahnya. Penyimpanan kepercayaan klien memutuskan hasil ini jauh sebelum terowongan dibuka, karena ia memilih menerima sertifikat itu untuk nama itu. Proksi juga melihat host yang diminta dan ukuran setiap pesan, yang cukup untuk mengambil sidik jari banyak aktivitas tanpa mendekripsi apa pun lagi.
Desain B: muatan membawa kuncinya sendiri
Dalam desain kedua, klien mengenkripsi dan mengautentikasi paketnya dengan protokol VPN yang memiliki identitas rekan dan pertukaran kunci sendiri, lalu membawa hasilnya di dalam pesan WebSocket. Mengakhiri TLS luar di sini mengekspos teks tersandi, bukan lalu lintas. Proksi dapat melihat ukuran dan waktu pesan, dan tidak ada lagi di dalam muatan. Itu paparan yang jauh lebih kecil, dan tetap merupakan metadata yang layak disebut dalam tinjauan alih-alih disingkirkan.
Titik akhir protokol dalam sendiri masih melihat teks biasa, yang merupakan inti dari susunan ini dan juga batasnya. Jika komponen di titik akhir berwenang membaca data sebelum enkripsi atau setelah dekripsi, lapisan tambahan tidak membatasinya. Kunci, dan perangkat lunak yang menanganinya, tetap menjadi batas yang penting.
Label VPN, ikon klien yang familier, atau halaman pemasaran bukan bukti bahwa desain ini ada. Membaca format muatan adalah buktinya.
Lacak di mana teks biasa benar-benar muncul
Skema URL memberi Anda satu fakta, jadi dapatkan sisanya dari antarmuka. Jalankan pemeriksaan di bawah ini secara berurutan, karena masing-masing mempersempit yang berikutnya:
ss -tnp | grep -E ':(443|8443)\b' ip -br link show type tun openssl s_client -connect vpn.example.net:443 -servername vpn.example.net -brief tcpdump -ni tun0 -c 5 -X
Mulailah dengan koneksi luar. Satu sesi TCP berumur panjang ke porta TLS adalah seperti apa pembawa WebSocket, dan sesi kedua ke host yang tidak terkait layak dijelaskan sebelum Anda melihat lebih dalam. Lalu temukan antarmuka terowongan di klien, karena perangkat tun atau tap memberi tahu Anda bahwa klien menangani paket IP alih-alih memproksikan satu aliran aplikasi.
Tangkapan pada antarmuka terowongan biasanya menyelesaikan pertanyaan muatan. Header yang dapat dibaca di sana berarti paket dalam tidak pernah dienkripsi secara terpisah, sedangkan muatan berentropi tinggi berarti pernah. Ulangi tangkapan pada antarmuka luar dan bandingkan keduanya: jika keduanya tampak acak, lapisan dalam melakukan pekerjaan yang tidak dapat dibatalkan lapisan luar.
Tinjau kepercayaan yang benar-benar Anda berikan
Sertifikat akar korporat yang terpasang adalah fakta tentang penyimpanan kepercayaan klien, bukan pernyataan tentang apa yang dicatat atau diperiksa proksi mana pun. Tetapkan kebijakan yang diterapkan dan jalur koneksi sebenarnya alih-alih menyimpulkan perilaku dari keberadaan CA.
Pada perangkat yang dikelola, tanyakan kepada administrator komponen mana yang mengakhiri TLS, apakah klien memvalidasi sertifikat yang disematkan atau sertifikat publik, dan apa format muatannya. Ketiga jawaban itu menghasilkan temuan yang dapat Anda pertahankan nanti.
Tuliskan hasilnya sebagai batas, bukan sebagai putusan. "TLS berakhir di proksi inspeksi, dan muatan dalam dienkripsi secara terpisah dengan kunci yang hanya dipegang titik akhir" adalah pernyataan yang dapat diperiksa dan bertahan saat vendor berganti. "WebSocket aman" tidak.