دنیای مدرن نرمافزار بر پایهای از کدهای نامرئی و بههمپیوسته استوار است. توسعهدهندگان امروزی، بهجای نوشتن تمامی خطوط کد از پایه، برنامههای خود را با استفاده از قطعات آمادهای میسازند که توسط هزاران داوطلب ناشناس در سراسر دنیا نوشته شدهاند. این قطعات که در قالب بستههای نرمافزاری (Packages) در مخازنی مانند مدیریت بستههای نود (Node Package Manager یا به اختصار NPM) نگهداری میشوند، شریانهای حیاتی اینترنت را تشکیل میدهند.
در این میان، کتابخانه event-stream یکی از همین شریانهای پرکاربرد بود. این بسته که برای تسهیل کار با جریانهای داده در پلتفرم Node.js طراحی شده بود، بهتنهایی هفتهای حدود دو میلیون بار دانلود میشد. بااینحال، در پاییز سال ۲۰۱۸، این ساختار مبتنی بر اعتماد کورکورانه بهطرز بیسابقهای فرو ریخت.
این داستان بهمدت بیش از دو ماه در قلب برنامههای کاربردی در سراسر دنیا جا خوش کرد و در این مدت نزدیک به هشت میلیون بار دانلود شد
ماجرای event-stream تنها یک نقص امنیتی ساده یا یک خطای برنامهنویسی نبود، بلکه یک داستان ترسناک واقعی از مهندسی اجتماعی، رمزنگاری پیشرفته، و سرقت هدفمند ارزهای دیجیتال بود. این رویداد، پرده از حقیقتی تلخ برداشت و نشام داد که زیرساختهای چند میلیارد دلاری مدرن وب، چقدر در برابر حملات زنجیره تامین (Supply Chain Attacks) آسیبپذیر هستند. برای درک ابعاد این فاجعه، باید به عقب بازگردیم؛ به نقطهای که یک توسعهدهنده خسته، تصمیم گرفت کنترل یکی از محبوبترین ابزارهای جاوا اسکریپت را رها کند.
یک امپراتوری رهاشده: فرسودگی شغلی در دنیای کدنویسی
دومینیک تار (Dominic Tarr)، برنامهنویس مشهور و پرکار اهل نیوزیلند، خالق اصلی بسته نرمافزاری (کتابخانه) event-stream بود. او پیشتر نیز صدها بسته نرمافزاری متنباز را توسعه داده بود، اما پس از مدتی تمرکز خود را روی پروژههای جدیدتر و جذابتری مانند شبکههای غیرمتمرکز پلتفرم Scuttlebutt گذاشت.
در میان کدهایی که او توسعه داد، کتابخانه event-stream برای او پروژهای متعلق به گذشته حساب میشد. این کتابخانه در واقع ابزاری کلیدی برای تسهیل و مدیریت جریانهای داده (Streams) در پلتفرم Node.js بود. در دنیای جاوا اسکریپت، جریانهای داده به برنامهنویسان اجازه میدهند تا حجم انبوهی از اطلاعات را بدون اشغال حافظه سرور، بهصورت تکهتکه پردازش و منتقل کنند. کار با این سیستم در حالت پیشفرض با پیچیدگیهای فنی زیادی همراه بود، اما event-stream با ارائه توابعی ساده و کاربردی برای نگاشت، فیلتر و ترکیب این جریانها، کارایی و خوانایی کدها را بهشکل چشمگیری افزایش میداد. برای همین مزیت، کتابخانه دومینیک به گزینهای محبوب و حیاتی در توسعه برنامههای تحت وب تبدیل شده بود.
در دنیای نرمافزارهای متنباز، این یک سناریوی رایج است: پروژهای ساخته میشود، به محبوبیت میلیونی میرسد، اما خالق آن هیچ دستمزد یا حمایتی برای نگهداری از آن دریافت نمیکند.
اعتماد، گرانبهاترین ارز در دنیای متنباز است؛ اما وقتی این ارز با فرسودگی شغلی ادغام شود، خطرناکترین آسیبپذیری امنیتی تاریخ را رقم میزند
بههمین دلیل، دومینیک بارها اعلام کرده بود که دیگر تمایلی به برنامهنویسی روی این پروژه ندارد. بررسی تاریخچه مخزن نگهداری کد event-stream نشان میدهد که در جولای ۲۰۱۵، کاربری پیشنهاد افزودن قابلیتی بهنام flatmap را داده بود و دومینیک با روی باز از مشارکت دیگران برای آمادهسازی این ایده استقبال کرده بود.

اما در ذهن دومینیک، کد کتابخانه event-stream کارش را بهدرستی انجام میداد، و بنابراین او انگیزهای برای بهروزرسانی یا بهبود آن نداشت. بااینحال، کدهای این پروژه همچنان در سراسر وب فراخوانی میشدند و هر روز برنامههای بیشتری آن را درون ساختار خود بهعنوان وابستگی (Dependency) استفاده میکردند، بدون اینکه بدانند این کتابخانه رها شده بود.
ورود سایه: فرآیند فریب و تصاحب اعتماد
در آگوست سال ۲۰۱۸، درست در زمانی که وضعیت توسعه این کتابخانه نامشخص بود، کاربری ناشناس با نام مستعار right9ctrl وارد صحنه شد. بهنظر میرسد right9ctrl با مطالعه دقیق تاریخچه و درک نیازهای پروژه رهاشده، سناریوی خود را طراحی کرد. او متوجه شد که دومینیک نهتنها وقت کافی برای بررسی کدهای جدید ندارد، بلکه از هرگونه کمکی که بار نگهداری پروژه را از دوشش بردارد، استقبال میکند.
نفوذ مهاجم یکشبه اتفاق نیفتاد. right9ctrl رفتار یک توسعهدهنده دلسوز و مشتاق را پیش گرفت. او ابتدا در گیتهاب شروع به باز کردن موضوعات مختلف کرد و کدهای معتبری برای حل مشکلات کوچک گزارششده فرستاد. این قطعه کدهای اولیه کاملاً بیخطر، تمیز و کارآمد بودند. او چندین درخواست ادغام ارسال کرد که همگی با هدف بهبود کارایی بستههای مختلف طراحی شده بودند. با این کار، او نظر مثبت جامعه کاربری و بهویژه دومینیک را جلب کرد.

right9ctrl؛ او با چند مشارکت ساده، اعتماد خالق پروژه را جلب کردمهاجم پس از جلب اعتماد اولیه در فضای عمومی گیتهاب، کانال ارتباطی خود را به ایمیلهای خصوصی تغییر داد. او در ایمیلی به دومینیک نوشت که به این پروژه علاقه زیادی دارد. بهعلاوه، از آنجا که متوجه شده بود که پروژه، مدتی طولانی بهروزرسانی نشده بود، تمایل خود را برای پذیرش وظیفه نگهداری و توسعه فعال آن اعلام کرد.
برای دومینیک، این پیشنهاد شبیه به یک نجاتدهنده بود. انتقال مالکیت در پروژههای متنباز برای جلوگیری از مرگ آنها رویهای کاملاً عادی است. دومینیک که هم قصد داشت به کاربران کمک کند و هم خود را از وظیفه بهروزرسانی بیپایان آسوده کند، حقوق انتشار را در مخزن NPM و دسترسی کامل به مخزن گیتهاب را در کمال حسن نیت به این غریبه واگذار کرد. او بعدها در دفاع از خود گفت:
او به من ایمیل زد و گفت میخواهد پکیج را آپدیت کند، من هم دسترسی را به او دادم چون دیگر هیچ انگیزهای برای مدیریت این پروژه نداشتم.
این تصمیم، کلید دروازههای شهر را به دست اسب تروا سپرد.
کالبدشکافی یک نفوذ: گامبهگام تا اعماق تاریکی
پس از تصاحب کامل مخزن کد، عملیات پنهانی right9ctrl وارد فاز فنی و اجرایی شد. او میدانست که اگر کدهای مخرب را بهصورت مستقیم و آشکار در گیتهاب بارگذاری کند، توسط دیگر توسعهدهندگان تیزبین کشف خواهد شد. بنابراین، او یک استراتژی چندمرحلهای و بسیار هوشمندانه را برای مخفیسازی بدافزار طراحی کرد که گام به گام اجرا شد:
- گام اول: ساخت یک پکیج واسط بیخطر
مهاجم در نهم سپتامبر، یک بسته نرمافزاری جدید و مستقل بهنام flatmap-stream (نسخه ۰.۱.۱) را در مخزن NPM ثبت کرد. در ظاهر، این بسته کدی بسیار ساده برای مسطح کردن آرایهها بود. کدهای منبع این بسته در پلتفرم گیتهاب کاملاً تمیز، استاندارد و بدون هیچ ردپایی از بدخواهی بودند تا اگر کسی لینک گیتهاب آن را بررسی کرد، دچار شک نشود.
- گام دوم: تزریق وابستگی به کتابخانه اصلی
در مرحله بعد، right9ctrl بسته flatmap-stream را بهعنوان یک وابستگی پیشنیاز به فایل تنظیمات (package.json) کتابخانه اصلی یعنی event-stream اضافه کرد و نسخه جدیدی از آن (نسخه ۳.۳.۶) را منتشر کرد. تا اینجای کار، در ظاهر فقط یک ویژگی جدید بهنام flatmap به کتابخانه اضافه شده بود که از یک پکیج دیگر کمک میگرفت.
- گام سوم: ایجاد انحراف میان گیتهاب و NPM
این بخش، شاهکار مهندسی معکوس و فریب مهاجم بود. نسخهای از flatmap-stream که روی گیتهاب قرار داشت با نسخهای که عملاً روی سرورهای NPM آپلود شده بود، تفاوتی بنیادین داشت. در دنیای وب، توسعهدهندگان برای کاهش حجم فایلها و سرعت دانلود، از تکنیک فشردهسازی استفاده میکنند. این فرآیند متغیرها را به تکحرف تبدیل و کدهای طولانی را در یک خط فشرده میکند که خواندن آن برای انسان تقریباً غیرممکن است.

flatmap-stream اضافه شد.مهاجم با سوءاستفاده از این عدم خوانایی، کدهای مخرب و رمزنگاریشده خود را در انتهای فایل فشردهشده index.min.js در نسخه منتشر شده در NPM پنهان کرد، درحالیکه سورس کد گیتهاب همچنان کد تمیز را نشان میداد.
- گام چهارم: پاک کردن ردپا برای آینده
برای جلوگیری از جلب توجه ابزارهای اسکن امنیتی خودکار (که ممکن است به پکیجهای تازه اضافه شده مشکوک شوند) مهاجم چند روز بعد اقدام عجیبی انجام داد. او در نسخه بعدی یعنی ۳.۳.۷، وابستگی به بسته flatmap-stream را بهطور کامل از فایل تنظیمات حذف و کدهای مربوط به آن را مستقیماً در کتابخانه اصلی بازنویسی کرد.
این ترفند زیرکانه باعث شد برنامهنویسانی که بعدها سورس کد نسخه جدید را بررسی میکردند، هیچ اثری از آن پکیج مشکوک واسط پیدا نکنند. بااینحال، میلیونها سیستم و سروری که پیش از این نسخه ۳.۳.۶ را دانلود و روی پروژههای خود قفل کرده بودند، همچنان بدون تغییر باقی ماندند و میزبان ابدی این بدافزار شدند.

right9ctrl در آمادهسازی نقشهاششکار بزرگ: بیتپِی چگونه در دام افتاد؟
چرا یک مهاجم باید این همه زمان و انرژی را صرف نفوذ به یک کتابخانه ساده جاوا اسکریپت کند؟ پاسخ در یک کلمه خلاصه میشد: پول. بدافزار طراحیشده توسط right9ctrl یک اسکنر کورکورانه نبود که به هر سیستمی آسیب بزند. این بدافزار، یک سلاح تکتیرانداز با هدفی بسیار دقیق و مشخص بود. هدف اصلی این حمله، شرکت بزرگ بیتپِی (BitPay)، یکی از بزرگترین ارائهدهندگان خدمات پرداخت ارزهای دیجیتال در دنیا بود.
بیتپِی یک کیف پول متنباز بسیار محبوب کوپِی (Copay) داشت که کاربران برای ذخیره و انتقال بیتکوین و بیتکوینکش از آن استفاده میکردند. مهندسان بیتپِی برای توسعه این کیف پول، از بستهای بهنام bitcore-wallet-client استفاده میکردند.
این بسته بهنوبه خود به چندین بسته دیگر وابسته بود و در اعماق این درخت وابستگی، کتابخانه event-stream قرار داشت. این یعنی پکیج آلوده، مانند یک ژن معیوب، از دهها لایه عبور میکرد و بدون اینکه سیستمهای امنیتی بیتپِی متوجه شوند، به نسخه نهایی کیف پول Copay وارد میشد.
بدافزار در اعماق درخت وابستگی پنهان شده بود؛ جایی که اسکنرهای امنیتی سنتی معمولاً به دلیل حجم بالای کدها، چشمان خود را روی آن میبندند
وقتی بدافزار درون اپلیکیشن بارگذاری میشد، ابتدا محیط پیرامون خود را بررسی میکرد. کد مخرب بهدنبال نام بسته و متادیتای خاصی میگشت. اگر بدافزار متوجه میشد که در یک اپلیکیشن معمولی جاوا اسکریپت در حال اجرا است، کاملاً غیرفعال باقی میماند تا هیچ ترافیک مشکوکی ایجاد نکند و شناسایی نشود. اما اگر شرایط مهیا بود و بدافزار میفهمید که درون فرآیند ساخت کیف پول رسمی Copay قرار دارد، کلیدهای رمزنگاری خود را فعال میکرد.
بدافزار تزریقشده در زمان اجرای کیف پول، کلیدهای خصوصی و عبارتهای بازیابی ۱۲ واژهای کاربران را به سرقت میبرد. این اطلاعات حیاتی که دسترسی کامل به داراییهای دیجیتال کاربران را فراهم میکردند، بهصورت مخفیانه و در قالب درخواستهای HTTP عادی به یک سرور کنترل و فرمان در یک آیپی مشخص ارسال میشدند. مهاجمها با این روش توانستند بهمدت چندین هفته، بدون اینکه صدایی بلند شود، صندوقچه طلا را مستقیماً از درون دستگاههای کاربران خالی کنند.

سقوط دومینو و کشف تصادفی بحران
سرقت بزرگ right9ctrl برای همیشه دوام نیافت. آغاز رسوایی به تاریخ ۵ اکتبر ۲۰۱۸ بازمیگردد؛ زمانی که یک توسعهدهنده تیزبین بهنام جیدن سریک (Jayden Seric) با نام کاربری jaydenseric در حال بررسی پروژههای خود متوجه شد که کتابخانه event-stream شروع به استفاده از بسته flatmap-stream کرده است که تابهحال نامی از آن نشنیده بود. او یک موضوع با عنوان «اضافه شدن وابستگی flatmap-stream» در مخزن گیتهاب پروژه باز کرد تا دلیل این تغییر را جویا شود.

این گزارش برای چند هفته توجه زیادی جلب نکرد، تا اینکه در حدود ۱۹ الی ۲۰ نوامبر ۲۰۱۸، کاربران و برنامهنویسهای دیگری از جمله کاربر معروف NewEraCracker و همچنین آیرتون اسپارلینگ (Ayrton Sparling) با نام کاربری mathiscode، شروع به کالبدشکافی عمیق بسته فشردهشده در NPM کردند. آنها متوجه شدند که کد موجود در NPM با گیتهاب متفاوت است، رمزنگاری بدافزار را شکستند و رسماً ماهیت مخرب و هدفمند آن (سرقت ارز دیجیتال) را فاش کردند.
این کالبدشکافی، مانند سنگی بود که به یک لانه زنبور پرتاب شد.

NewEraCracker نخستین کسی بود که کد فشردهشده در NPM را با گیتهاب مقایسه و وجود بدافزار را فاش کرددر عرض چند ساعت، کارشناسان امنیتی و برنامهنویسان سراسر دنیا به این موضوع هجوم آوردند. با کالبدشکافی کد فشردهشده در NPM، رمزنگاری بدافزار شکسته شد و جامعه جاوا اسکریپت در بهت و حیرت فرو رفت: یک پکیج با دو میلیون دانلود هفتگی، بهمدت دو ماه بهعنوان ابزار سرقت رمزارزها عمل میکرد.
واکنشها تند و هولناک بود. دومینیک تار، خالق اولیه، هدف سیل عظیمی از انتقادات و اتهامات قرار گرفت. کاربران او را به بیمسئولیتی متهم کردند. دومینیک در یک بیانیه صادقانه و تکاندهنده که به یکی از مهمترین اسناد در بررسی مالی نرمافزارهای متنباز تبدیل شد، نوشت:
من هیچ سودی از این بسته نمیبردم. وقتی کسی به من پیشنهاد داد که میخواهد نگهداری آن را بهعهده بگیرد، من خوشحال شدم که بار آن از دوشم برداشته میشود. من این کار را برای کمک به جامعه انجام دادم، نه برای صدمه زدن به آنها. اگر از این بسته در شرکتهای چند میلیارد دلاری خود استفاده میکنید، چرا خودتان برای امنیت آن هزینه نمیکنید؟
نگهداری از پروژههای متنباز بدون حمایت مالی، مانند کار اجباری در یک معدن بیپایان است؛ جایی که همه مصرفکنندهاند و هیچکس کمکی نمیکند
این دفاعیه، تحلیلگران را به این نتیجه رساند که مدل فعلی توسعه متنباز یک نقص ساختاری عمیق دارد. صنعتی عظیم، ثروتمند و چند تریلیون دلاری بر شانههای توسعهدهندگان داوطلبی بنا شده است که هیچ حمایت مالی یا سازمانیافتهای دریافت نمیکنند و در برابر فشارهای روانی و مهندسی اجتماعی کاملاً بیدفاع هستند.
با تایید ابعاد این فاجعه، تیم امنیت NPM بلافاصله وارد عمل شد تا این غده سرطانی را از پیکره اکوسیستم جاوا اسکریپت خارج کند. آنها در اولین اقدام اضطراری، دسترسیهای right9ctrl را بهطور کامل قطع ، بستهی مخرب flatmap-stream را از مخزن حذف و نسخههای آلوده event-stream (بهویژه نسخه ۳.۳.۶) را از دسترس خارج کردند تا فرآیند دانلود خودکار بدافزار متوقف شود.
پس از مهار این بحران فنی، عملیات شکار هکر آغاز شد. تیمهای امنیتی گیتهاب و کارشناسان مستقل سایبری تحقیقات گستردهای را برای فاش کردن هویت واقعی پشت نام مستعار right9ctrl هدایت کردند. بااینحال، مهاجم با زیرکی تمام از آدرسهای ایمیل یکبارمصرف و سرورهای واسط برای پنهان کردن ردپای خود استفاده کرده بود. برای همین، هویت واقعی او هرگز بهطور رسمی فاش نشود و در لایههای تاریک اینترنت پنهان بماند.

گیتهاب نیز در واکنشی قاطع، حساب کاربری این نفوذگر را بهدلیل نقض شدید قوانین امنیت سایبری برای همیشه مسدود کرد. پس از این طوفان هولناک، سرنوشت کتابخانه event-stream نیز برای همیشه دگرگون شد؛ اعتماد جامعه مهندسی به این بسته بهطور کامل فرو ریخت و توسعهدهندگان با بازنویسی کدهای خود، وابستگی به این ابزار را حذف کردند. این پکیج محبوب سابق، بهسرعت منسوخ و متروکه شد تا نام آن برای همیشه بهعنوان یک درس عبرت تاریخی و نمادی از شکنندگی زنجیره تامین در تاریخ مهندسی نرمافزار ثبت شود.
ساختار شکننده متنباز: غولهای چندمیلیاردی بر شانههای لرزان داوطلبان
حادثه event-stream یک زنگ خطر جدی برای کل صنعت فناوری اطلاعات بود. این بحران نشان داد که بزرگترین ضعف امنیتی نرمافزارهای مدرن، در کدهای پیچیده یا فایروالهای گرانقیمت نیست، بلکه در زنجیره اعتمادی است که بهراحتی با یک ایمیل جعلی و چند مشارکت تمیز در برنامهنویسی گسسته میشود.
غولهای فناوری نظیر مایکروسافت، گوگل و آمازون ابزارهای خود را با هزاران بسته کوچکِ افراد ناشناس پر میکنند، بدون اینکه سازوکار دقیقی برای احراز هویتِ نگهدارندگان جدید این ابزارها داشته باشند. این حادثه باعث شد مفهوم «بهداشت زنجیره تامین نرمافزار» به یکی از اولویتهای اصلی سازمانهای امنیتی تبدیل شود.
بزرگترین آسیبپذیری وب مدرن، یک خط کد اشتباه نیست؛ بلکه نابرابری اقتصادی میان شرکتهای مصرفکننده و توسعهدهندگان متنباز است
پس از این اتفاق، بنیادهای بزرگی برای نظارت بر بستههای حیاتی شکل گرفتند، اما ریشه مشکل، یعنی فرسودگی شغلی برنامهنویسان متنباز و عدم تزریق مالی به آنها، همچنان بهعنوان یک چالش بزرگ پابرجا باقی ماند.
چشمانداز آینده: بقا در عصر تهدیدهای هوشمند زنجیره تامین
امروزه هکرهای زنجیره تامین، فراتر از تکنیکهای سنتی قدم برمیدارند. مهاجمان معاصر با تغییر تاکتیکهای خود به سمت روشهایی مانند ساختن نامهای مشابه برای گمراهی برنامهنویسها (Typosquatting)، آلودهسازی کدهای پیشنهادی هوش مصنوعی (AI-generated code poisoning) یا تصاحب مخازن از طریق بحرانهای مالی توسعهدهندگان حرکت کردهاند.
بااینحال، فاجعه event-stream بهعنوان یک نقطه عطف تاریخی، لزوم استفاده از ابزارهایی مانند npm audit برای بررسی مداوم آسیبپذیریها، بهرهگیری از احراز هویت چندمرحلهای برای ناشران بستهها، و ادغام اسکنرهای تحلیل ایستا و پویا در فرآیند ساخت نرمافزار را برای همیشه در استانداردهای مهندسی نرمافزار تثبیت کرد.
اما فراتر از ابزارهای فنی، این حادثه یک چارچوب فکری جدید را به دیکته میکند: در دنیای متصل امروز، حاکمیت مطلق بر امنیت یک توهم است. ما دیگر بستهها را فقط به پروژههایمان اضافه نمیکنیم، بلکه غریبهها را به درون اتاق سرور و هسته مرکزی داراییهایمان راه میدهیم.
ماجرای event-stream این حقیقت را یادآوری میکند که یک کد کوچک، فراموششده و چندخطی در گوشهای دوری از اینترنت، میتواند به کلید صندوقچه طلای یک بانک دیجیتال در سوی دیگر دنیا تبدیل شود. امنیت، یک محصول خریدنی نیست، بلکه یک فرآیند مداوم، زنده و مبتنی بر بدبینیِ ساختاریافته است. در عصر سایه، هر کدی که بررسی نمیشود، اسب تروایی است که منتظر فرمان حرکت میماند.

