آخرین اخبار
همهٔ اخبار
مدیریت آسیب‌پذیری گزارش بحرانیت ۴/۱۰

بررسی آسیب‌پذیری *sshole در OpenSSH و ریشه‌های فنی نقص‌های امنیتی در مدیریت رشته‌ها

آسیب‌پذیری موسوم به *sshole (ترکیبی از SSH و Hole) بر پایه مفاهیمی طراحی شده است که ریشه در نحوه مدیریت فایل‌های رمز عبور در سیستم‌های *nix دارد. در این سیستم‌ها، کاراکتر * در فیلد رمز عبور قرار می‌گرفت تا نشان دهد حساب کاربری مربوطه نباید از طریق برنامه ورود (login program) مورد دسترسی قرار گیرد.

مفهوم سیگنال‌دهی درون‌باند (In-band Signaling)

دلیل استفاده از کاراکتر * این بود که این کاراکتر در فیلد رمز عبور معتبر شناخته نمی‌شد و بنابراین می‌توانست برای In-band signaling یا سیگنال‌دهی درون‌باند مورد استفاده قرار گیرد. این رویکرد در برنامه‌نویسی به این معناست که از داده‌های موجود در جریان اصلی برای انتقال پیام‌های کنترلی یا سیگنال‌ها استفاده شود.

مقایسه C strings و Pascal strings

برای درک بهتر این موضوع، باید به تفاوت‌های بنیادین بین دو روش مدیریت رشته‌ها (Strings) در تاریخچه برنامه‌نویسی نگاه کرد:

  • C strings: از سیگنال‌دهی درون‌باند استفاده می‌کنند. در این روش، طول رشته مشخص نیست و رشته تا زمانی ادامه می‌یابد که به کاراکتر ASCII NUL برسد. این روش انعطاف‌پذیری بیشتری در مدیریت طول رشته‌ها فراهم می‌کند و در حافظه فضای کمتری اشغال می‌کند، اما از نظر امنیتی ریسک‌های بیشتری دارد.
  • Pascal strings: از سیگنال‌دهی برون‌باند (Out-of-band signaling) استفاده می‌کنند. در این ساختار، بایت اول رشته برای ذخیره طول آن به کار می‌رود. این روش باعث می‌شود محاسبات روی رشته‌ها سریع‌تر باشد و تمام کاراکترها معتبر باشند، اما محدودیت طول (معمولاً حداکثر ۲۵۵ کاراکتر) را به همراه دارد.

در سیستم‌های *nix، استاندارد سیگنال‌دهی درون‌باند با استفاده از اعداد صحیح (Integer) برای بازگرداندن کدهای خطا یا وضعیت (Return values) رایج شد. در این مدل، داده‌های واقعی معمولاً در یک آرایه حافظه (Memory array) قرار می‌گرفتند و کد فراخوان، اشاره‌گری (Pointer) به آن تابع ارسال می‌کرد.

اگرچه این روش از نظر کارایی و سرعت بسیار بهینه است، اما از دیدگاه امنیتی، رویکردی مخاطره‌آمیز محسوب می‌شود و می‌تواند منجر به ایجاد آسیب‌پذیری‌هایی شود که مهاجمان از آن‌ها برای دور زدن مکانیزم‌های کنترلی استفاده می‌کنند.