چند سالیست که واژهی «بلاکچین» تقریبا هرجایی به چشم میخورد، اما این فناوری نوبنیاد و بسیار کاربردی باعث ایجاد چند شبهاتی در ذهن کاربران نیز شده است. همانطور که میدانید بلاکچینهایی همچون بیتکوین عمومی هستند، یعنی هزاران گره(Node) در آنها وجود دارد که وظیفهی انتقال پیامها در سراسر شبکه را به عهده دارند و این موضوع یک موقعیت بسیار ویژه و مناسب را برای هکرها ایجاد کرده است. با این تفاسیر، آیا میتوان از سیستمهای توزیع شده برای انجام انواع عملیاتهای نفوذ و گسترش بدافزارها استفاده کرد؟
چرا آلوده کردن یک بلاکچین بسیار سخت است
برای نمونه ما با بیتکوین و اتریوم شروع میکنیم.
همانند تمام بلاکچینهای دیگر، گرههای شبکهی بیتکوین و اتریوم نیز با دیگر گرهها ارتباط داشته و کدهای خاصی را برای تایید و تولید تراکنش یا بلاکها، اجرا میکنند. حال برای اینکه یک بدافزار بتواند بلاکچین را آلوده کرده و در سراسر آن گسترش یابد، باید مراحل ذیل انجام شود:
- قدم اول: یک بدافزار به همراه تراکنش ارسال شود
- قدم دوم: یک اشکال و نقض در نرمافزار کلاینت بیتکوین مورد سوءاستفاده قرار بگیرد.
این کار بسیار ساده به نظر میرسد، اما هر دو مرحلهی گفته شده با مشکلات عدیدهای روبرو هستند.
مشکلات مربوط به مرحلهی اول: حجم دادههایی که میتوانیم به همراه تراکنش ارسال کنیم بسیار محدود و کم است. مثلا در رابطه با بیتکوین، حداکثر سایت یک بلاک تنها ۱ مگابایت است. بنابراین اندازهی تراکنشها حتی از این مقدار نیز کمتر خواهد بود(چیزی در حدود ۸۰ بایت).
به همین ترتیب، در اتریوم نیز محدودیتهایی در رابطه با میزان بزرگی و پیچیدگی بلاک وجود دارد. پس میتوان گفت که اتریوم هم از نظر اندازهی تراکنش، محدودیتهایی دارد.
موارد گفته شده برای تمام بلاکچینهای فعلی صادق است.
مشکلات مربوط به مرحلهی دوم: زمانی که اطلاعات خواسته شده توسط بدافزار به دست ما برسد، نمیتوان با آن کار زیادی انجام داد، زیرا:
- معمولا تراکنشها در یک فرمت ثابت نوشته میشوند. بسیاری از مشتریان بلاکچین هر پیامی را قبول نمیکنند.
- محیط اجرایی(در اتریوم EVM) واقعا محدود است و تنها اجازه میدهد تا چند مدل دستورالعمل خاص اجرایی شود. علاوه بر این، با اینکه اتریوم از قراردادهای هوشمند پشتیبانی میکند و به سازگار بودن زبان Solidity با Turing میبالد، اما محدودیتهای EVM(محدودیت در کدهای OP و محدودیت gas در بلاکها) یک محیط کلی ایجاد میکند که با تمامیت و سازگاری کامل با Turing در تضاد است.
این مورد نیز برای اکثر محیطهای بلاکچینی وجود دارد.
علاوه بر این، کدهای کلاینت به صورت عمومی در دسترس است، بنابراین توسط یک جامعهی بسیار بزرگ از توسعهدهندگان بررسی شده است. این موضوع باعث میشود که احتمال کشف آسیبپذیری قابل بهرهبرداری در کلاینت به شدت کاهش یابد. البته این بدان معنا نیست که انجام چنین کار کاملا غیرممکن میباشد، اما در مقایسه با هکهای اینترنتی امروزی که آزادی زیادی در اختیار هکرها قرار دارد، به سختی میتوان یک نقض یا راهگریز پیدا کرد.
آیا میتوانیم از سیستمهای توزیع شده برای ذخیرهی بدافزارها استفاده کنیم؟
خب همانطور که تا به اینجا متوجه شدهاید، دستکار و خرابکاری در بلاکچین بسیار سخت است، اما همینجای کار متوقف نمیشویم.
آلوده کردن این سیستمها بسار سخت است، اما هنوز هم یک مکانیسم تحویل مرسولهی خوب هستند. همانطور که گفته شده به دلیل محدودیتهای اندازهی هر تراکنش، ارسال یک بستهی بدافزاری به وسیلهی یک تراکنش بسیار سخت است، اما چه کسی گفته که باید تنها از یک تراکنش استفاده کنیم؟
بدافزارهای K قسمتی
موارد گفته شده در این مقاله چیز جدیدی نیستند، بنابراین اگر با بدافزارها اشنایی داشته باشید، ادامهی مطلب باعث تعجب شما نخواهد شد.
اینگونه بدافزارها از سال ۲۰۰۷ به شکل گستردهای رویت شدهاند و توانستهاند تا به امروز سیستمهای زیادی را آلوده کنند. در ادامه سعی شده تا حد ممکن بخشهای فنی به سادگی توضیح داده شود.
روش کار اینگونه بدافزارهای به این شکل است که به جای نگهداری ظرفیت خود به عنوان یک منبع، اطلاعات ارسالی به K تعداد تقسیم میشود. هر قسمت از این فایل به شکل یک فایل اجرایی بیگناه خود را نشان میدهد و هیچ نشانهی سازش و خرابکاری(IOC) از خود تولید نمیکنند.
در این مرحله دو دستهی کلی از این K ها وجود خواهد داشت:
۱. قسمتهایی K که به طور پیوسته کار میکنند، بنابراین لازم نیست که تمام قسمتهای دیگر نیز در دسترس و فعال باشند.
۲. قسمتهایی K که تنها به صورت موازی کار میکنند. این قسمتها نیاز دارند تا تمام بخشهای دیگر به صورت همزمان در دسترس و فعال باشند تا بتوانند فعالیت خود را آغاز کنند.
بسته به شرایط و سیستم هدف، میتوان از بین گزینههای موجود انتخاب کرد.
برای اینکه حمله مخفی باقی بماند، میتوان هر قسمت را به صورت جداگانه رمزگذاری کرد. به این ترتیب میتوانیم دادههای رمزنگاری شده را عبور داده و کلیدهای مربوطه را(کلیدهایی که برای رمزگشایی لازم هستند) به صورت جداگانه ارسال کنیم.
علاوه بر تمام این موارد، میتوانیم قبل از اجرایی کردن بدافزار، از هش دادههای ارسالی برای تشخیص حضور و در دسترس بودن تمام قطعات در شبکه استفاده کرد.
حال ممکن است که با این پرسش مواجه شوید که قیمتهای K چطور میتوانند از سیستمهای دفاترکل توزیع شده سود ببرند؟
استفاده از DLTها چند مزیت به همراه دارد:
- دادههای روی DLT درجات بالایی از تغییرناپذیری را به همراه دارند. این بدان معناست که اگر ما بدافزار خودمان را به DLT اضافه کنیم، از بین بردن آن بسیار سخت خواهد بود، زیرا این شبکهها توسط یک واحد خاص کنترل نمیشود.
- ذات استفاده از فرایند رمزنگاری باعث میشود که بدافزار به راحتی بتواند یکپارچگی قسمتهای مختلف را بررسی و تایید کند. از آنجایی که دادهها به جای اعلام محل و موقعیت، با استفاده از هش(محتوا-آدرس) مشخص میشوند، به ماه راه مطمئنتری برای بررسی این مورد میدهد که آیا تمام قسمتها در شبکه حاضر هستند یا خیر.
چند نمونهی عملی
به یاد داشته باشید که تکنیکهای ارائه شده در ادامهی مطلب تنها برای مقاصد آموزشی هستند.
برای نشان دادن روند کار سیستم پیشنهادی، ما آن را در IPFS شرح میدهیم.
سیستم فایل بین فضایی یا IPFS در واقع یک پروتکل و شبکه است که برای ساخت یک محتوای قابل آدرسدهی طراحی شده و به عنوان نقطهی به نقطهی ذخیره و اشتراکگذاری در سیستمهای فایل توزیع شده بکار گرفته میشود. IPFS همانند تورنت(Torrent) نه تنها به کاربران اجازه میدهد که محتوای خاصی را دانلود کنند، بلکه باعث میشود آنها قادر به میزبانی محتوا نیز باشند.
در مرحلهی اول ما یک بدافزار Keylogger(بدافزارهایی تمام ورودی سیستم، مانند کیبورد را تحت نظر گرفته و تمام اطلاعات ورودی به واسطهی آنها را ثبت و برای هکر ارسال میکند) در اختیار گرفته و مقاومت آن را در برابر نرمافزارهای آنتیویروس بررسی میکنیم. سپس از IPFS و Swarm برای ذخیرهی این دادهها استفاده کرده و بررسی میکنیم که آقای قسمتهای مجزا توسط نرمافزار آنتیویروس شناسایی میشوند یا خیر.
میتوانید با استفاده از این لینک یک بدافزار Keylogger دانلود کرده و سپس با از استفاده از این لینک آن را در مقابل نرمافزار ضد ویروس امتحان کنیم.
همانطور که مشاهده میکنید Keylogger مذکور توسط نرمافزار آنتیویروس شناسایی شد. حالا این بدافزار را به چند قسمت تقسیم میکنیم.
IPFS
میتوانید با مراجعه به این لینک IPFS را دانلود و راهاندازی کنید. از این کد دستوری برای اضافه کردن بدافزار به IPFS استفاده کنید:
ipfs addدر صورتی که کار را به درستی انجام داده باشید، با خروجی ذیل مواجه خواهید شد.
حالا بدافزار به چندین قسمت تقسیم شده و بر روی IPFS ذخیره شده است. هش کل فایل بدافزار طبق تصویر بالا به این شکل است:
QmNuAxMT9pepjZ26yXEk4T8qXofJrHoe7SxpoHa5WJ3T5xحالا با استفاده از این کد دستوری میتواند قسمتهای مختلف را لیست کنید:
ipfs ls QmNuAxMT9pepjZ26yXEk4T8qXofJrHoe7SxpoHa5WJ3T5x
در صورت موفقیت، اطلاعات خروجی باید چیزی شبیه به تصویر ذیل باشد:
نوشتههای نشان داده شده در تصویر، در واقع هشهای هر فایل هستند. با استفاده از کد زیر میتوانید هر قسمت را به صورت جداگانه دریافت کنید:
ipfs get
همانطورکه با استفاده از هش میتوانی به آدرسدهی قسمتهای مختلف بپردازیم، از سوی دیگر مطمئن خواهیم بود که این قسمتها دچار هیچ آسیب یا تغییری در سیستم نخواهند شد.
حالا که بدافزار به قسمتهای مختلفی تقسیم شده میتوانید هر قسمت را به صورت جداگانه توسط نرمافزار ضدویروس آزمایش و بررسی کنید. همانطور که مشاهده میکنیم هیچ کدام از این قسمتها به صورت بدافزار شناسایی نمیشود و به راحتی آزمایشهای نرمافزار را پشت سر میگذارند.
حالا که تمام بخشهای بدافزار در دسترس قرار دارند میتوانیم Keylogger را اجرا کنیم.
IPFS به صورت پیشفرض مقاوم و پایا نیست. اگر محتوا پین(pin) نشود، توسط بخش garbage collector حذف خواهد شد.
البته Swarm اتریوم(لایهی ذخیرهسازی اتریوم) ذخیرهسازی پایا را فراهم میکند، بنابراین میتواند در حال حاضر گزینهی بهتری باشد. Swarm نیز به شیوهی تقریبا مشابهی عکل میکند. شما میتوانید بدافزار را به قطعات مختلفی تقسیم کرده و با استفاده از هش هر قسمت، آن را آدرسدهی و در نهایت اجرایی کنید.
در صورت وجود هرگونه ابهام، سوالات خود را با ما به اشتراک بگذارید.