RamenHire জব বোর্ডে একটি স্টোর্ড (stored) HTML ইনজেকশন বাগের কারণে যে কেউ একটি পাবলিক ফর্ম পূরণ করে টিমের নোটিফিকেশন ইমেলগুলোকে একটি ফিশিং প্ল্যাটফর্মে পরিণত করতে পারত।
কীভাবে এই বাগটি অনুপ্রবেশ করল
RamenHire Next.js এবং Supabase-এর ওপর ভিত্তি করে চলে এবং স্টার্টআপগুলোকে লগ-ইন না করেই চাকরির বিজ্ঞাপন পোস্ট করার সুযোগ দেয়। প্রতিটি সাবমিশন ইন্টারনাল হায়ারিং টিমের কাছে একটি ইমেল পাঠায়। ইমেলের বডি তৈরি করা হয় সরাসরি ফর্মের র (raw) ফিল্ডগুলো—যেমন কোম্পানির নাম, জবের বিবরণ, কন্টাক্ট নাম—একটি HTML স্ট্রিংয়ের সাথে যুক্ত করে। স্ট্রিংটি মেইল সার্ভিসে পৌঁছানোর আগে কোনো এসকেপিং (escaping) বা স্যানিটাইজেশন (sanitisation) করা হয় না।
যেহেতু টেমপ্লেটটি ইউজারের ইনপুটকে নিরাপদ HTML হিসেবে গণ্য করে, তাই একজন ক্ষতিকারক আবেদনকারী একটি ভুয়া “click here to verify” লিঙ্ক ইনজেক্ট করতে পারে। এই পেলোডটি (payload) জব লিস্টিংয়ের অংশ হিসেবে সার্ভারে জমা থাকে, ফলে পরবর্তী প্রতিটি নোটিফিকেশন ইমেলে সেই ক্ষতিকারক কোডটি চলে আসে। একজন আক্রমণকারী আসল “View Dashboard” বাটনের পাশে সেই লিঙ্কটি লুকিয়ে রাখতে পারে, যা টিমের সদস্যদের বিভ্রান্ত করে তাদের ক্রেডেনশিয়াল (credentials) প্রকাশ করতে বা কোনো ফিশিং সাইটে ভিজিট করতে প্ররোচিত করতে পারে।
কেন এটি গুরুত্বপূর্ণ ছিল
এই ইমেলগুলো সরাসরি মূল হায়ারিং টিমের কাছে যায়, যারা প্রার্থীদের প্রসেসিং করার জন্য প্রতিনিয়ত বিভিন্ন লিঙ্কে ক্লিক করেন।
প্রযুক্তিগত ঘাটতি
HTML এসকেপিং কোনো একক ধাপ নয়। দুটি প্রেক্ষাপটে সুরক্ষা প্রয়োজন:
- Text nodes – ট্যাগের মধ্যবর্তী কন্টেন্ট।
<কে<এবং>কে>-তে রূপান্তর করলে ট্যাগগুলো আটকানো যায়, কিন্তু এটি একজন আক্রমণকারীকে একটি অ্যাট্রিবিউট ভ্যালু (attribute value) থেকে বেরিয়ে আসতে বাধা দিতে পারে না। - Attribute values – ট্যাগের ভেতরের স্ট্রিং, যেমন
href="…"। একটি কোটেশন ("বা') ইনজেক্ট করার মাধ্যমে একজন আক্রমণকারী অ্যাট্রিবিউটটি দ্রুত বন্ধ করে দিতে পারে এবং তার নিজস্ব মার্কআপ যুক্ত করতে পারে।
মূল কোডটি শুধুমাত্র প্লেইন টেক্সট হ্যান্ডেল করত, যার ফলে অ্যাট্রিবিউট ইনজেকশন করার সুযোগ পুরোপুরি খোলা ছিল।
সমস্যাটি সমাধান করা
ডেভেলপার একটি ছোট escapeHtml হেল্পার যুক্ত করেছেন এবং ইন্টারপোলেশনের (interpolation) আগে প্রতিটি ইউজার-সাপ্লাইড ভ্যালুর ওপর এটি প্রয়োগ করেছেন, তা সেই ভ্যালু একটি টেক্সট নোডে থাকুক বা অ্যাট্রিবিউটে।
যাচাইকরণ ধাপসমূহ
- Local testing – টেমপ্লেট ফাংশনগুলোতে ইনজেকশন স্ট্রিংয়ের একটি সেট ইনপুট হিসেবে দেওয়া হয়েছিল। প্রতিটি টেস্টে শুধুমাত্র এসকেপ করা ক্যারেক্টার দেখা গেছে, কোনো এক্সিকিউটেবল (executable) ট্যাগ নয়।
- Production testing – প্যাচটি ডেপ্লয় করার পর, লাইভ সাইটের মাধ্যমে একটি পেলোড সাবমিট করা হয়েছিল, যা Cloudflare Turnstile বট চেক সফলভাবে পার করে। এর ফলে প্রাপ্ত ইমেলটি ডেভেলপারের ইনবক্সে পৌঁছেছিল; সেখানে ক্ষতিকারক লিঙ্ক এবং স্ক্রিপ্ট ট্যাগগুলো অস্পষ্ট টেক্সট হিসেবে দেখা গেছে, কোনো ক্লিকযোগ্য এলিমেন্ট হিসেবে নয়।
Gmail সম্পর্কে একটি নোট: সার্ভিসটি হয়তো এখনও একটি URL-কে নীল রঙ করতে পারে এবং এটিকে ক্লিকযোগ্য করতে পারে, তবে এটি ক্লায়েন্ট-সাইড সুবিধা মাত্র এবং এর মানে এই নয় যে HTML ইনজেকশন সফল হয়েছে। এই সমাধানটি ইনজেকশনের মাধ্যমে আসল বাটন তৈরি করা বা স্ক্রিপ্ট চালানো রোধ করে।
ডেভেলপারদের যা খেয়াল রাখা উচিত
- পাবলিক ফর্ম থেকে আসা ডেটাকে কখনোই বিশ্বাস করবেন না – এমনকি নিরীহ দেখতে ফর্মগুলোও এমন স্টোর্ড আউটপুট তৈরি করতে পারে যা অন্য কোথাও ব্যবহৃত হয়।
- ব্যবহারের সময় এসকেপ করুন – রেন্ডারিং করার ঠিক আগে কনটেক্সট-অ্যাওয়ার এসকেপিং (টেক্সট বনাম অ্যাট্রিবিউট) প্রয়োগ করুন, পাইপলাইনের শুরুতে নয়।
- ক্লায়েন্ট-সাইড এবং সার্ভার-সাইড উভয়ই পরীক্ষা করুন – ইউনিট টেস্টগুলো স্পষ্ট ব্যর্থতা শনাক্ত করে; লাইভ UI-এর মাধ্যমে একটি ম্যানুয়াল এন্ড-টু-এন্ড টেস্ট নিশ্চিত করে যে আসল ট্রাফিকের মধ্যেও সুরক্ষা ব্যবস্থা কার্যকর আছে।
- ইমেল ক্লায়েন্টের অদ্ভুত আচরণ সম্পর্কে সচেতন থাকুন – কিছু ক্লায়েন্ট স্বয়ংক্রিয়ভাবে URL-কে লিঙ্ক করে দেয়, যা নিরাপত্তার একটি মিথ্যা ধারণা তৈরি করতে পারে। নিশ্চিত করুন যে মূল HTML-এ কোনো অ্যাক্টিভ এলিমেন্ট নেই।
মূল কথা
ইউজার ইনপুট হ্যান্ডেল করার ক্ষেত্রে একটি সামান্য অবহেলা রুটিন নোটিফিকেশন ইমেলগুলোকে একটি ফিশিং ভেক্টরে পরিণত করেছিল। একটি ব্যাপক HTML-এসকেপিং রুটিন প্রবর্তন এবং লোকালি ও প্রোডাকশনে সমাধানটি যাচাই করার মাধ্যমে ইনবক্সের নিরাপত্তা পুনরুদ্ধার করা হয়েছে। এই ঘটনাটি এমন যেকোনো ওয়েব অ্যাপের জন্য একটি চিরন্তন শিক্ষা প্রদান করে যা অনির্ভরযোগ্য ডেটা থেকে HTML তৈরি করে: সঠিক স্যানিটাইজেশন অপরিহার্য, এবং এটি অবহেলা করা আপনার ব্যবহারকারীদের ইনবক্সে সরাসরি আক্রমণের পথ খুলে দিতে পারে।
