WSS টানেলের এনক্রিপশন অ্যাপে নয়, TLS টার্মিনেটরেই থেমে যায়
একটি wss:// URL এক হপে TLS থাকার প্রমাণ দেয়। পেলোডের নিজস্ব এনক্রিপশন আছে কি না তা নির্ভর করে ক্লায়েন্ট ভেতরে কী রাখে এবং ওই TLS কে শেষ করে তার উপর।
নিরাপদ WebSocket-এর ভেতরে বহন করা একটি টানেলে ঠিক ততটুকুই এনক্রিপশন থাকে যতটুকু ক্লায়েন্ট তার ভেতরে রেখেছে, এর বেশি নয়। wss:// স্কিমটি বলে যে TLS এক হপে একটি সংযোগ রক্ষা করে। WebSocket বার্তাগুলোর ভেতরের বাইটগুলো আলাদাভাবে সুরক্ষিত কি না সে সম্পর্কে এটি কিছুই বলে না, আর মাঝখানে কিছু TLS শেষ করলে কে আপনার ট্রাফিক পড়তে পারবে তা এই পার্থক্যই নির্ধারণ করে।
দুটি স্তর যা একটির মতো দেখায়
নিরাপদ WebSocket হলো TLS, যার উপরে WebSocket হ্যান্ডশেক করা হয়, যেমনটি RFC 6455 তার সংযোগ ও নিরাপত্তা অংশে বর্ণনা করে। TLS স্তর সার্ভারকে প্রমাণীকরণ করে এবং স্ট্রিম এনক্রিপ্ট করে, তারপর WebSocket স্তর অ্যাপ্লিকেশন যা পাঠানোর সিদ্ধান্ত নেয় তা ফ্রেম করে।
এগুলো দুইটি স্বতন্ত্র সিদ্ধান্ত, আর পুরো পথের উপরে একটি তালা আঁকা চিত্রটি দ্বিতীয়টিকে লুকিয়ে রাখে। জিজ্ঞাসা করুন কে TLS সংযোগটি শেষ করে। তারপর জিজ্ঞাসা করুন ক্লায়েন্ট প্রতিটি বার্তার ভেতরে কী রাখে। স্থাপনাটি সম্পর্কে বাকি সবকিছু এই দুই উত্তরের ফল।
ডিজাইন A: পরিবহনই একমাত্র এনক্রিপশন
সরলতম ডিজাইনে ক্লায়েন্ট কাঁচা IP প্যাকেট নিয়ে সেগুলোকে WebSocket বার্তায় মুড়ে দেয়। ভেতরে কিছুই এনক্রিপ্ট করা হয় না, তাই TLS সেশন ধরে রাখা উপাদানটি প্লেইনটেক্সট পেলোড পড়ে। যখন সেই উপাদানটি আপনার নিজের টানেল সার্ভার, তখন এটাই ইচ্ছাকৃত প্রান্তবিন্দু এবং ডিজাইনটি সুসংগত, কারণ সার্ভার তো ট্রাফিক দেখবেই।
এটি ভিন্ন এক ব্যবস্থায় পরিণত হয় যখন পরিদর্শন প্রক্সি পথে বসে ক্লায়েন্ট যে সার্টিফিকেটে বিশ্বাস করে তা দিয়ে TLS শেষ করে। সেই প্রক্সি এখন সার্ভার যা ধরে রাখত সেই একই প্লেইনটেক্সট ধরে রাখে, আর কোনো পরিমাণ WebSocket ফ্রেমিং তা বদলায় না। ক্লায়েন্টের ট্রাস্ট স্টোর টানেল খোলার অনেক আগেই এই ফলাফল নির্ধারণ করেছে, কারণ সে ওই নামের জন্য ওই সার্টিফিকেট গ্রহণ করতে বেছে নিয়েছে। প্রক্সি অনুরোধকৃত হোস্ট এবং প্রতিটি বার্তার আকারও দেখে, যা আর কিছু ডিক্রিপ্ট না করেই অনেক কার্যকলাপের ফিঙ্গারপ্রিন্ট নিতে যথেষ্ট।
ডিজাইন B: পেলোড নিজের চাবি বহন করে
দ্বিতীয় ডিজাইনে ক্লায়েন্ট তার প্যাকেটগুলো এমন একটি VPN প্রোটোকল দিয়ে এনক্রিপ্ট ও প্রমাণীকরণ করে যার নিজস্ব পিয়ার পরিচয় ও কী বিনিময় আছে, তারপর ফলাফলটি WebSocket বার্তার ভেতরে বহন করে। এখানে বাইরের TLS শেষ করলে সাইফারটেক্সট প্রকাশ পায়, ট্রাফিক নয়। প্রক্সি বার্তার আকার ও সময় দেখতে পারে, পেলোডে আর কিছুই নয়। এটি অনেক ছোট এক্সপোজার, আর তবুও এটি মেটাডেটা যা পর্যালোচনায় নাম উল্লেখ করার যোগ্য, উড়িয়ে দেওয়ার নয়।
ভেতরের প্রোটোকলের নিজস্ব প্রান্তবিন্দুগুলো এখনও প্লেইনটেক্সট দেখে, এটাই ব্যবস্থার উদ্দেশ্য এবং একইসাথে তার সীমা। প্রান্তবিন্দুর কোনো উপাদান এনক্রিপশনের আগে বা ডিক্রিপশনের পরে ডেটা পড়ার অনুমতি পেলে অতিরিক্ত স্তর তাকে নিয়ন্ত্রণ করে না। কী এবং সেগুলো পরিচালনা করা সফটওয়্যারই গুরুত্বপূর্ণ সীমা হিসেবে থাকে।
একটি VPN লেবেল, পরিচিত ক্লায়েন্ট আইকন বা মার্কেটিং পেজ এই ডিজাইন বিদ্যমান থাকার প্রমাণ নয়। পেলোড ফরম্যাট পড়া প্রমাণ।
প্লেইনটেক্সট আসলে কোথায় দেখা যায় তা অনুসরণ করুন
URL স্কিম আপনাকে একটি তথ্য দেয়, বাকিটা ইন্টারফেস থেকে নিন। নিচের পরীক্ষাগুলো ক্রমে চালান, কারণ প্রতিটি পরেরটিকে সংকুচিত করে:
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
বাইরের সংযোগ দিয়ে শুরু করুন। TLS পোর্টে একটি দীর্ঘস্থায়ী TCP সেশনই WebSocket বাহকের চেহারা, আর সম্পর্কহীন কোনো হোস্টে দ্বিতীয় সেশন গভীরে তাকানোর আগে ব্যাখ্যা দাবি করে। তারপর ক্লায়েন্টে টানেল ইন্টারফেস খুঁজুন, কারণ tun বা tap ডিভাইস বলে দেয় ক্লায়েন্ট একটি অ্যাপ্লিকেশন স্ট্রিম প্রক্সি করার বদলে IP প্যাকেট নিয়ে কাজ করছে।
টানেল ইন্টারফেসে ক্যাপচার সাধারণত পেলোডের প্রশ্নটি মিটিয়ে দেয়। সেখানে পাঠযোগ্য হেডার মানে ভেতরের প্যাকেটগুলো কখনো আলাদাভাবে এনক্রিপ্ট হয়নি, আর উচ্চ এনট্রপির পেলোড মানে সেগুলো এনক্রিপ্ট হয়েছিল। বাইরের ইন্টারফেসে ক্যাপচার পুনরাবৃত্তি করুন এবং দুটো তুলনা করুন: দুটোই যদি এলোমেলো দেখায়, ভেতরের স্তর এমন কাজ করছে যা বাইরের স্তর ফেরাতে পারে না।
আপনি আসলে যে বিশ্বাস দিয়েছেন তা পর্যালোচনা করুন
ইনস্টল করা কর্পোরেট রুট সার্টিফিকেট ক্লায়েন্টের ট্রাস্ট স্টোর সম্পর্কে একটি তথ্য, কোনো প্রক্সি কী লগ করে বা পরিদর্শন করে সে সম্পর্কে বিবৃতি নয়। CA-এর উপস্থিতি থেকে আচরণ অনুমান না করে স্থাপিত নীতি ও প্রকৃত সংযোগ পথ নির্ধারণ করুন।
ব্যবস্থাপিত যন্ত্রে প্রশাসককে জিজ্ঞাসা করুন কোন উপাদান TLS শেষ করে, ক্লায়েন্ট পিন করা সার্টিফিকেট যাচাই করে না পাবলিক সার্টিফিকেট, এবং পেলোড ফরম্যাট কী। এই তিন উত্তর এমন একটি ফল দেয় যা পরে আপনি সমর্থন করতে পারবেন।
ফলাফলটি রায় নয়, সীমা হিসেবে লিখুন। "TLS পরিদর্শন প্রক্সিতে শেষ হয়, আর ভেতরের পেলোড কেবল প্রান্তবিন্দুর কাছে থাকা কী দিয়ে আলাদাভাবে এনক্রিপ্ট করা" একটি যাচাইযোগ্য বক্তব্য যা বিক্রেতা বদলালেও টিকে থাকে। "WebSockets নিরাপদ" টিকে থাকে না।