اجرای کد مخرّب از طریق paste!
محققان گروه امنیتی NCC برخی توابع را در چارچوب .NET پیدا کردهاند که از deserialization استفاده میکردند و میتوانستند به طور بالقوه مشکل امنیتی ایجاد کنند. پس از گزارش این مشکل، هشدار امنیتی به مستندات این توابع اضافه شد.
محققان گروه امنیتی NCC برخی توابع را در چارچوب .NET پیدا کردهاند که از deserialization استفاده میکردند و میتوانستند به طور بالقوه مشکل امنیتی ایجاد کنند. پس از گزارش این مشکل، هشدار امنیتی به مستندات این توابع اضافه شد. |
در برنامهنویسی، برای آنکه اشیاء (objects) بتوانند در حافظه ذخیره و از آن بازیابی شوند یا از طریق شبکه منتقل شوند، باید به جریانی از بایتها تبدیل شوند. عمل تبدیل شیء به جریان بایت را serialization و عمل عکس آن را deserialization مینامند. |
Deserialization از لحاظ امنیتی مهم است. فرض کنید یک برنامه دادهای حاوی کد مخرب را serialize کرده باشد و برنامه دیگری بخواهد آن را deserialize کند. اگر برنامه مقصد داده را بررسی نکند، کد را استخراج میکند و ممکن است آن را اجرا کند. |
برنامه مبدأ نیز لزوما یک برنامه بدخواه نیست، بلکه ممکن است برنامه آسیبپذیری باشد که از آن سوء استفاده شده باشد. اگر برنامه مبدأ دادهای را از ورودی بگیرد و بدون اعتبارسنجی آن را serialize کند، ممکن است داده serialize شده حاوی کد مخربی باشد. حال، برنامهای که آن را deserilize میکند ممکن است کد مخرب را اجرا کند. |
چارچوب .NET شامل توابعی است که از serialization/deserialization استفاده میکنند. معمولاً مایکروسافت در مستندات این توابع یک هشدار امنیتی قرار میدهد با این مضمون که این تابع نباید با داده نامطمئن فراخوانی شود. اما گروه امنیتی NCC طی تحقیقات اخیر خود توابعی را در چارچوب .NET پیدا کرده است که از deserialization استفاده میکنند، اما در مستندات آنها چنین هشداری وجود ندارد. پس از آن که این تحقیقات به مایکروسافت اطلاع داده شد، مایکروسافت این هشدار را به مستندات مربوطه اضافه کرد. |
کلاس DataObject یکی از کلاسهایی است که امکان serialize/deserialize کردن اشیاء و ذخیره آنها در clipboard را میدهد. برخی برنامهها از این کلاس برای بازنمایی داده استفاده میکنند. مثلا فرض کنید برنامهای دارای یک کادر متن است که میتواند rich text را نمایش دهد و کاربر میتواند داده را در آن پیست کند. همچنین فرض کنید برای بازنمایی این داده از کلاس DataObject استفاده شده است. وقتی کاربر دادهای را از clipboard در این کادر پیست کند، کلاس DataObject شیئی که در کلیپبورد قرار دارد را deserialize میکند و داده به دست آمده در کادر متنی قرار میگیرد. مهاجم میتواند با جاسازی کردن کد مخرب در موقع serialization باعث شود که هنگام عمل پیست، کد مخرب اجرا شود. |
برخی برنامهها که امکان پیست در کادر متنی را میدهند دچار این آسیبپذیری بودند: |
– PowerShell ISE – Visual Studio – Paint.net – LINQPad که دو برنامه آخر وصله شدهاند. |
برای مثال در تصویر زیر میبینید که در کادر quick launch در Visual Studio امکان اجرای کد وجود دارد. البته در این مثال، کد اجرا شده برنامه ماشین حساب را باز میکند ولی این کد میتواند یک کد مخرب باشد.
|
برای اینکه برنامه مقصد از چنین مشکلی در امان باشد میتواند نوع دادههایی که از کلیپبورد میخواند را محدود کند. برنامه مبدا نیز باید متد DataObject.SetData را تنها با داده مورد اعتماد فراخوانی کند. بهرهبرداری از این آسیبپذیری چندان ساده نیست، زیرا مهاجم باید بتواند دادهای را در کلیپبورد قرار دهد و امیدوار باشد که قربانی آن را در محل مناسب پیست میکند. |
|