এই সপ্তাহে একজন ভুয়া ক্লায়েন্ট আমার ইনবক্সে একটি ক্ষতিকারক GitHub রিপোজিটরি পাঠিয়ে দেয়, আর শুধুমাত্র স্টার্টার স্ক্রিপ্টটি চালানোর ফলে আমার দুই দিনের কাজ মুছে যায় এবং ব্রাউজারে রাখা আমার প্রতিটি পাসওয়ার্ড ফাঁস হয়ে যায়।

সেই "ক্লায়েন্ট" একটি উচ্চ বেতনের সিনিয়র-ইঞ্জিনিয়ার পদের বিজ্ঞাপন দিয়েছিল, দ্রুত মেসেজ পাঠিয়েছিল এবং একটি দেখতে বেশ পরিপাটি রিপোজিটরি পাঠিয়েছিল। অনুরোধটি ছিল খুব সহজ: ক্লোন করো, npm run dev রান করো এবং ডেমোটি কাজ করছে তা প্রমাণ করতে একটি স্ক্রিনশট পাঠাও—কোনো চুক্তি নেই, কোনো ব্যাকগ্রাউন্ড চেক নেই। ডেভ সার্ভারটি চালু হওয়ার মুহূর্তেই, একটি কনফিগারেশন ফাইলের ভেতরে লুকিয়ে থাকা কোড একটি command-and-control (C2) সার্ভারের সাথে যোগাযোগ করে, একটি second-stage payload সংগ্রহ করে এবং লোকাল মেশিন থেকে ক্রেডেনশিয়াল (credentials) চুরি করতে শুরু করে।

আক্রমণটি যেভাবে ঘটল

ক্ষতিকারক পেলোডটি ছিল postcss.config.js ফাইলে, যে ফাইলটি বেশিরভাগ ডেভেলপার অবহেলা করে যান কারণ এতে সাধারণত কিছু সাধারণ CSS প্রসেসিং রুলস থাকে। এই ক্ষেত্রে আক্রমণকারী একটি বৈধ স্টেটমেন্টের অনেক ডানে স্পেস দিয়ে সাজানো একটি অস্পষ্ট (obfuscated) JavaScript লাইন যুক্ত করে দিয়েছিল যাতে এটি সহজে চোখে না পড়ে। যখন npm run dev কমান্ডটি PostCSS পাইপলাইনটি কার্যকর করল, তখন সেই লুকানো লাইনটি অজান্তেই রান হয়ে গেল।

ম্যালওয়্যারটি দ্রুত পরপর তিনটি ধাপ সম্পন্ন করেছিল:

  • C2 contact – এটি আক্রমণকারীর নিয়ন্ত্রণে থাকা একটি সার্ভারের সাথে নেটওয়ার্ক কানেকশন তৈরি করে এবং আক্রান্ত হোস্টের তথ্য জানিয়ে দেয়।
  • Second-stage download – এটি অতিরিক্ত কোড ডাউনলোড করে যা মূলত ডেটা চুরির (data-exfiltration) লজিক ধারণ করে।
  • Browser credential theft – macOS-এ এটি সিস্টেম কিচেইনে (keychain) সংরক্ষিত Chrome Safe Storage কী-টি অনুসন্ধান করে। ব্যবহারকারী যদি কিচেইন প্রম্পটটি অনুমোদন করে দেন, তবে আক্রমণকারী Chrome-এ সেভ করা প্রতিটি পাসওয়ার্ড সংগ্রহ করে নেয়।

তাৎক্ষণিক চুরির বাইরেও, পেলোডটি বেশ কিছু সাধারণ ডেভেলপার টুল—VS Code, npm, Discord-এর মধ্যে নিজেকে লিখে ফেলেছিল, যাতে ভবিষ্যতে ওই অ্যাপ্লিকেশনগুলো চালু করলেই ক্ষতিকারক কোডটি পুনরায় সক্রিয় হয়ে ওঠে। শুধুমাত্র রিবুট করলেই এই সংক্রমণ দূর হয় না; পরবর্তী npm install বা এডিটরটি ওপেন করলেই ব্যাকডোরটি আবার সচল হয়ে ওঠে।

সতর্ক সংকেত যা প্রায়ই নজর এড়িয়ে যায়

  • কোনো চুক্তি স্বাক্ষরের আগেই কোড রান করার অনুরোধ। বৈধ নিয়োগ প্রক্রিয়ায় সাধারণত কোনো প্রোপাইটরি (proprietary) কাজ শেয়ার করার আগে একটি আনুষ্ঠানিক চুক্তি সম্পন্ন করা হয়।
  • "প্রজেক্ট ব্রিফ" হিসেবে ছদ্মবেশধারী কম্প্রেসড ফাইল। Zip বা RAR আর্কাইভের ভেতরে এক্সিকিউটেবল স্ক্রিপ্ট বা ক্ষতিকারক বাইনারি লুকিয়ে রাখা হতে পারে।
  • "প্ল্যাটফর্ম ফিল্টার বাইপাস করার জন্য" ব্যক্তিগত ইমেল ঠিকানার অনুরোধ। এই কৌশলটি কথোপকথনকে সুরক্ষিত প্ল্যাটফর্ম থেকে সরিয়ে নিয়ে যায়, যেখানে অপব্যবহারের রিপোর্ট করা সম্ভব।
  • চাকরির বর্ণনায় প্রার্থীকে ক্রিপ্টো ওয়ালেটে ফান্ড দিতে বা টেস্ট টোকেন কিনতে বলা। প্রকৃত ডেভেলপমেন্ট কাজের ক্ষেত্রে এ ধরনের দাবি অস্বাভাবিক।

নিরাপদ থাকার ব্যবহারিক পদক্ষেপসমূহ

  1. পরিদর্শন ছাড়া কখনোই অপরিচিত কারো কোড রান করবেন না। রিপোজিটরিটিকে একটি রিড-অনলি ভিউতে (যেমন GitHub-এ raw file view-এর মাধ্যমে) ওপেন করুন এবং প্রতিটি স্ক্রিপ্ট, বিশেষ করে কনফিগারেশন ফাইল এবং package.json-এর scripts এন্ট্রিগুলো পরীক্ষা করুন।
  2. সব অ্যাটাচমেন্টকে সাধারণ টেক্সট হিসেবে বিবেচনা করুন। যদি কোনো zip ফাইল পাঠানো হয়, তবে সেটি একটি স্যান্ডবক্সড এনভায়রনমেন্টে (sandboxed environment) এক্সট্র্যাক্ট করুন এবং কিছু খোলার আগে তার বিষয়বস্তু পরীক্ষা করে দেখুন।
  3. ব্রাউজার স্টোরেজের পরিবর্তে একটি ডেডিকেটেড পাসওয়ার্ড ম্যানেজার ব্যবহার করুন। এমনকি যদি ব্রাউজারের কিচেইনটি আক্রান্তও হয়, ম্যানেজারের ভল্ট (vault) বিচ্ছিন্ন বা সুরক্ষিত থাকে।
  4. নেটওয়ার্ক অ্যাক্সেসহীন একটি আইসোলেটেড ভার্চুয়াল মেশিন বা কন্টেইনারে অনির্ভরযোগ্য কোড রান করুন। এটি আক্রমণকারীর C2 সার্ভারে পৌঁছানোর ক্ষমতাকে বাধাগ্রস্ত করে।
  5. সব অ্যাকাউন্টে টু-ফ্যাক্টর অথেন্টিকেশন (2FA) চালু করুন। যদি পাসওয়ার্ড চুরিও হয়, তবে দ্বিতীয় ধাপটি অননুমোদিত লগইন রোধ করে।
  6. ডেভেলপার টুলস আপডেট রাখুন এবং যেখানে সম্ভব অটোমেটিক ইন্টিগ্রিটি চেক চালু রাখুন। কিছু এডিটর এখন কোর ফাইলগুলো অপ্রত্যাশিতভাবে পরিবর্তিত হলে সতর্কবার্তা দেয়।

যদি আপনার সন্দেহ হয় যে আপনি কোনো ক্ষতিকারক কোড রান করেছেন, তবে ধরে নিন আপনার সিস্টেমটি আক্রান্ত হয়েছে। প্রয়োজনীয় ডেটা ব্যাকআপ নিন, ড্রাইভটি মুছে ফেলুন (wipe) এবং অপারেটিং সিস্টেম পুনরায় ইনস্টল করুন। শুধুমাত্র রিবুট করলে এমন কোনো পারসিস্টেন্স মেকানিজম (persistence mechanism) দূর হবে না যা সাধারণ অ্যাপগুলোর ফাইল পুনরায় লিখে ফেলে।

সারকথা: একটি লুকানো JavaScript লাইন একটি সাধারণ ডেমোকে পূর্ণাঙ্গ ক্রেডেনশিয়াল চুরির অপারেশনে পরিণত করতে পারে। যাচাই না করা পর্যন্ত প্রতিটি রিপোজিটরিকে অনির্ভরযোগ্য হিসেবে বিবেচনা করুন এবং আইসোলেশনকে (isolation) আপনার কাজের একটি ডিফল্ট অংশ হিসেবে গড়ে তুলুন। মুহূর্তের অসাবধানতার মূল্য একটি ফাইল পুনরায় পরীক্ষা করার প্রচেষ্টার চেয়ে অনেক বেশি।