
npm install দিলেই হ্যাক? npm 12 এ বড় পরিবর্তন
npm 12 এ ডিপেন্ডেন্সির ইন্সটল স্ক্রিপ্ট আর নিজে থেকে চলবে না। কেনো এই পরিবর্তন, হ্যাকাররা কিভাবে npm install কে ইউজ করে, আর আপনার কি করতে হবে।
npm install। প্রতিদিন কতবার এই কমান্ড চালান, হিসাব আছে? নতুন প্রজেক্ট, নতুন প্যাকেজ, ক্লায়েন্টের রিপো ক্লোন করে প্রথম কাজই এটা।
কিন্তু কখনো ভেবেছেন, এই কমান্ড চালানোর সাথে সাথে আপনার কম্পিউটারে আর কি কি চলছে?
এই প্রশ্নের উত্তর দিতেই npm 12 একটা বড় পরিবর্তন নিয়ে এসেছে। এখন থেকে ডিপেন্ডেন্সির ইন্সটল স্ক্রিপ্ট আর নিজে থেকে চলবে না। আজকের ব্লগ এটা নিয়েই।
ইন্সটল স্ক্রিপ্ট কি?
অনেক প্যাকেজ ইন্সটল হওয়ার সময় নিজের কিছু কোড চালায়। এগুলো হলো preinstall, install আর postinstall স্ক্রিপ্ট।
ভালো কাজেই এগুলো বানানো। যেমন sharp বা bcrypt এর মতো প্যাকেজ ইন্সটলের সময় আপনার মেশিনের জন্য নেটিভ কোড বিল্ড করে।
কিন্তু সমস্যা হলো, এই স্ক্রিপ্ট আপনার মেশিনে আপনার পারমিশন নিয়েই চলে। মানে আপনার ফাইল, আপনার .env, আপনার SSH কী, সবকিছুতে এক্সেস।
হ্যাকাররা কিভাবে ইউজ করে?
আসল কথা হল, হ্যাকারদের আপনার কম্পিউটারে ঢোকার জন্য আর দরজা ভাঙ্গতে হয় না। আপনি নিজেই দরজা খুলে দেন।
কোন জনপ্রিয় প্যাকেজের মেইনটেইনারের একাউন্ট হ্যাক করে, নতুন একটা ভার্সন পাবলিশ করে, আর তার postinstall এ বসিয়ে দেয় ম্যালওয়্যার। আপনি npm install দিলেন, ম্যালওয়্যার চলে গেলো। আপনি টেরও পেলেন না।
এই বছর এমন অনেক ঘটনা ঘটেছে। সবচেয়ে বড় টা মনে হয় axios এর ঘটনা। কম্প্রোমাইজড axios প্যাকেজ দিয়ে ডেভেলপারদের মেশিনে রিমোট এক্সেস ট্রোজান বসানো হয়েছিলো। axios কতো প্রজেক্টে ইউজ হয়, সেটা আশা করি আর বলে দিতে হবে না।
npm 12 এ কি বদলালো?
- স্ক্রিপ্ট ব্লকডঃ ডিপেন্ডেন্সির preinstall, install, postinstall আর নিজে থেকে চলবে না। npm ওয়ার্নিং দেখাবে, কিন্তু ইন্সটল ঠিকই শেষ করবে।
- নিজের স্ক্রিপ্ট চলবেঃ আপনার package.json এর "scripts" আগের মতোই কাজ করবে।
- গিট আর URL ডিপেন্ডেন্সিঃ গিট রিপো থেকে প্যাকেজ নিতে
--allow-git, আর রিমোট URL থেকে নিতে--allow-remoteলাগবে।
তাহলে sharp, esbuild চলবে কিভাবে?
ভালো প্রশ্ন। কিছু প্যাকেজের স্ক্রিপ্ট সত্যিই দরকার। যেমন sharp, esbuild, bcrypt, better-sqlite3, @tailwindcss/oxide। এদের জন্য আপনাকে নিজে হাতে অনুমতি দিতে হবে।
npm approve-scripts sharp esbuildঅনুমতি গুলো package.json এর allowScripts সেকশনে সেভ হয়ে যাবে, নির্দিষ্ট ভার্সন সহ।
"allowScripts": {
"esbuild@0.24.2": true
}প্যাকেজ আপডেট করলে নতুন ভার্সনের জন্য আবার অনুমতি দিতে হবে। একটু প্যারা, কিন্তু এটাই তো পয়েন্ট। নতুন ভার্সনে কি এসেছে, না দেখে চলতে দিবেন না।
আপনার চেকলিস্টঃ
- npm আপডেট করুনঃ
npm install -g npm@latest - কি কি ব্লক হচ্ছে দেখুনঃ
npm approve-scripts --allow-scripts-pending - শুধু দরকারি প্যাকেজ অনুমতি দিনঃ ঢালাওভাবে
--allদিয়ে সব অ্যাপ্রুভ করবেন না। তাহলে পুরো সিকিউরিটি টাই বৃথা। - allowScripts কমিট করুনঃ টিমের সবাই আর CI যেনো একই লিস্ট ফলো করে।
- CI তে স্ট্রিক্ট মোডঃ
npm ci --strict-allow-scriptsদিলে নতুন কোন স্ক্রিপ্ট আসলে বিল্ড ফেইল করবে। - লকফাইল রাখুনঃ package-lock.json কমিট করুন, যাতে হুট করে নতুন ভার্সন ঢুকে না পরে।
- সিক্রেট আলাদা রাখুনঃ .env আর API কী গুলো যতোটা সম্ভব নিরাপদে রাখুন। এ নিয়ে আগেও লিখেছি, জানতে এই ব্লগটি পড়তে পারেন।
উপসংহারঃ
অনেকে এই পরিবর্তনে বিরক্ত হবেন। আগে এক কমান্ডে সব হয়ে যেতো, এখন আবার অনুমতি দাও।
কিন্তু ভাবুন, আপনার বাসার দরজা এতোদিন খোলা ছিলো, এখন তালা লাগানো হয়েছে। চাবি ঘোরানোর একটু কস্ট তো করতেই হবে।
আর হ্যা, ১১ নভেম্বর Node.js এর হাই সিভিয়ারিটি সিকিউরিটি রিলিজ আসছে। npm এর সাথে Node আপডেট করতেও ভুলবেন না।



এখনও কোনো মন্তব্য নেই। প্রথম মন্তব্যটি আপনার হোক!