روابط عمومی شرکت ایدکو (توزیع کننده محصولات کسپرسکی در ایران)؛ تقریباً هر توسعه دهندهای از کتابخانههای طرفسوم استفاده میکند- میلیونها توسعهدهنده طرحهای خود را با جهان به اشتراک میگذارند. اینکه آنها برای کمک به شما جهت انجام امورتان از ماژولهای موجود نهایت بهره را میبرند یعنی دارند زمان خود را بسیار هوشمندانه صرف میکنند. اما استفاده از کد شخص دیگر به معنای اعتماد به توسعهدهندگان آن کد است. BitPay، توسعهدهندگان کیفپول رمزی Copay، اخیراً با کاستیهای استفاده از ارزشهای منبع باز طرفسوم دست و پنجه نرم میکنند.
Copay اساساً کیفپول ارز رمزِ چندسکوییِ بیتکوین/بیتکوین کَش[1] است که به کاربران اجازه میدهد کیفپولهای مشترک بسازند. Copay با استفاده از جاوا اسکریپت توسعه داده شده و به کتابخانههای منبع باز بسیاری وابسته است.
یکی از این کتابخانههای منبع باز، ماژول Node.js[2] به نام event-stream است. مخزن[3] آن روی سرویس کنترل نسخه[4] GitHub توسط توسعهدهندهای نگهداری میشد که مدتها پیش علاقه و انگیزهاش را از دست داد و چندین سال بود که در بخش مخزن فعالیت خاصی انجام نداده بود. بدینترتیب وقتی توسعهدهندهی دیگری -که کمترین مشارکت را در GitHub داشت آمد- از او تقاضای داشتن حق ادمین (برای نگهداری مخزن) کرد، توسعهدهندهی اصلی آن را در اختیار او قرار داد.
اکنون این توسعهدهندهی جدید حق کار کردن روی آن را پیدا کرده بود. ابتدا کتابخانه event stream (جریان رویداد) شروع به استفاده از ماژولی به نام flatmap-stream (از مخزن GitHub همان توسعهدهنده) کرد. سپس، مجرم ماژول را دستکاری کرده و بدان یک سری کد مخرب اضافه کرد. سه روز بعد از آپدیت، توسعهدهندهی مذکور همچنان نسخهی دیگری از flatmap-stream را آپلود کرد. این یکی دیگر کد مخرب نداشت- شاید هم فعالیتهای مخربش را در خفا انجام میداد.
و اینگونه شد که کتابخانه event-stream دستکاری شد. این کتابخانه نه تنها توسط BitPay که همچنین توسط بسیاری از شرکتهای دیگر مورد استفاده قرار میگیرد. ظاهراً این دستکاری تنها سه روز دوام داشت اما همین مدتزمان برای توسعهدهندگان Copay -که نمیدانستند این کتابخانه برای حمل پیلودی آلوده دستکاری شده – کافی بود تا نسخهی بروزشدهی این کتابخانه را در پروژهی خود بگنجانند. نرمافزار آپدیتشدهی این کیفپولی رمزی در فروشگاههای اپ عرضه و توسط بسیاری از کاربران دانلود شد.
شاید توسعهدهندگان Copay نمیخواستند وقت زیادی را به بررسی تغییرات اِعمالشده در کتابخانههایی که استفاده کردند صرف کنند. این روزها آپدیت کتابخانههای استفادهشده در یک پروژه به لطف سرویسهای مدیریت بسته همچون npm براحتی اتوماسیون شده است. توسعهدهنده با npm میتواند برای آپدیت تمامی ماژولهای طرفسوم -که در پروژهاش مورد استفاده قرار گرفتهاند- یک فرمان واحد را اجرا کند.
حتی اگر توسعهدهندگان کتابخانههای بروز شده را بررسی میکردند، این کد مخرب را باز هم نمیشد به آسانی پیدا کرد. کتابخانههای بکارگرفتهشده در یک پروژه میتوانند به دیگر کتابخانهها (همانطور که event-stream به flatmap-stream وابسته بود) بستگی داشته باشند و بررسی تمامی این وابستگیها میتواند بسیار زمانبَر باشد. در این مورد خاص -با توجه به این نکته که ماژول flatmap-stream رمزگذاری شده بود- پیچیدگی این پروسه بیشتر بود.
به نقل از CCN، کتابخانه flatmap-stream طوری دستکاری شده بود تا کلیدهای مخفی (اساساً رمزعبورهای کیفپول رمزی) را در اپهایی که به دو کتابخانه event-stream و copay-dash وابسته است لو بدهد. Copaydash نشان میدهد این یک حمله علیه BitPay ، سازندگان Copay و نویسندگان copay-dash بوده است. در این صورت این کلیدها تنها اگر از طریق این دو کتابخانه استفاده میشد درز میکردند (همچنین این تنها برای محصولات مبتنی بر کد Copay صدق میکند).
به گفتهی آرستکنیکا، این پیلود مخرب به مجرم سایبری اجازه داد تا به کیفپولهای کاربران دسترسی پیدا کرده و از آنجا اقدام به جابجایی پول کند. این نقص توسط یک کاربر GitHub کشف و گزارش شد. اما پیش از آن، نسخههای مختلفی از کیفپولهای Copay -حاوی کد مخرب- توزیع شده بود. نهایتاً BitPay به این دستکاری اعتراف نموده و به کاربرانی که از نسخههای 5.0.2 تا 5.1.0 Copay استفاده میکردند توصیه کرد آنها را به آخرین نسخه -یعنی 5.2.0- آپگرید کنند. در حال حاضر هیچ اطلاعاتی در خصوص تعداد کاربران مبتلا و میزان وجه از دسترفته در دست نیست.
این یک حملهی زنجیرهی تأمین کلاسیک است که طی آن، مجرم کتابخانه طرفسومی که توسط توسعهدهندگان یک اپ مورد استفاده قرار میگرفت را دستکاری میکند. مشکل، ریشه در استفاده از نرمافزاری منبع باز دارد؛ که فردی ناشناس آن را نگهداری میکند. هیچ تضمینی وجود ندارد که این نرمافزار همانطور که در نسخههای چندین سال پیشِ خود کار میکرده عمل کند. نمیتوان توسعهدهندگان نرمافزار منبعباز را مقصر دانست- آنها محصولات خود را همانطور که هست ارائه میدهند و قرار نیست چیزی را تضمین دهند.
چیزی که به نظر فریبنده میرسد این است که Copay نیز منبع باز است و به طور گستردهای توسط سایر توسعهدهندگان کیفپولهای رمزی مورد استفاده قرار میگیرد. پس شاید مشکل کمی بزرگتر هم شود:
شرکتهایی که راه درآمدشان از ارائهی نرمافزار (خصوصاً نرمافزاری که کارش انتقال وجوه، آن هم درمقادیر بالا- باشد) است باید مطمئن شوند که پیش از عرضهی نرمافزار، مراحل امنیتی مختلفی را روی آن پیاده کنند. یکی از این مراحل امنیتی میتواند تحلیل موشکافانهی هر یک از نسخههای جدید کتابخانههای طرفسوم -که آنها در پروژههای خود استفاده میکنند- باشد.
بهترین راه انجام دادن اقدامات زیر است:
بررسی شرایط مخزن، در نظر داشتن رتبهبندیها از سوی دیگر توسعهدهندگان، بررسی اینکه پروژه هر چند وقت یکبار آپدیت میشود و نیز آخرین بروزرسانیاش چه زمان بوده است، جستوجو از طریق باگ لاگ. مشاهدهی هر چیز عجیبی نیازمند بررسی عمیقتر و ریزبینانهتری است (و یا شاید تغییر ماژول را موجب شود).
اگر در بخش کتابخانه مشکلی بوجود بیاید، مشتریان شرکت را مقصر میدانند، زیرا شرکت بوده که نرمافزار را طوری ساخته که به این کتابخانه وابسته باشد. حال شاید اصلاً توسعه دهندگان تقصیرکار باشند اما مشتریان این را از چشم شرکت میبینند. البته قصدمان دلسرد کردن کاربران برای استفاده از محصولات منبعباز نیست اما توصیه میکنیم در استفاده از آنها نهایت دقت و احتیاط را به خرج دهید.
[1] Bitcoin Cash
[2]یک محیط اجراییِ سمت سرورِ متنباز و چندسکویی برای زبان جاوااسکریپت است.
[3] repository
[4] version control service