یک آسیبپذیری که اکنون برطرف شده در اسکنر آسیبپذیری متنباز Nuclei میتوانست به مهاجمان اجازه دهد تا با دور زدن فرآیند تأیید امضا، کد مخربی را در قالبهایی که روی سیستمهای محلی اجرا میشوند، مخفیانه تزریق کنند.
Nuclei یک اسکنر آسیبپذیری متنباز محبوب است که توسط ProjectDiscovery ایجاد شده و برای اسکن وبسایتها بهمنظور شناسایی آسیبپذیریها و سایر ضعفهای امنیتی استفاده میشود.
این پروژه از یک سیستم اسکن مبتنی بر قالب (template-based) استفاده میکند که شامل بیش از ۱۰,۰۰۰ قالب YAML است و وبسایتها را برای آسیبپذیریهای شناختهشده، پیکربندیهای نادرست (misconfigurations)، فایلهای پیکربندی افشاشده (exposed configuration files)، وبشلها (webshells) و درهای پشتی (backdoors) اسکن میکند.
قالبهای YAML همچنین شامل یک پروتکل کدنویسی (code protocol) هستند که میتوان از آن برای اجرای دستورات (commands) یا اسکریپتها (scripts) بهصورت محلی (locally) روی یک دستگاه استفاده کرد و این کار قابلیتهای یک قالب (template) را گسترش میدهد.
هر قالب (template) با یک هش خلاصه (digest hash) امضا میشود که Nuclei از آن برای تأیید اینکه قالب دچار تغییر نشده و کد مخربی به آن اضافه نشده است، استفاده میکند.
این digest hash به انتهای templates به شکل زیر اضافه میشود:
# digest: <hash>
یک آسیبپذیری در ابزار Nuclei به مهاجم اجازه میدهد تا مکانیزم تأیید امضای دیجیتال قالبها را دور بزند و از آن سوءاستفاده کند.
یک آسیبپذیری جدید در Nuclei که با شناسهی CVE-2024-43405 ردیابی میشود، توسط محققان شرکت Wiz کشف شده است. این آسیبپذیری به مهاجمان اجازه میدهد تا فرآیند تأیید امضای Nuclei را دور بزنند، حتی اگر یک قالب (template) برای درج کد مخرب تغییر یافته باشد.
این نقص به دلیل فرآیند تأیید امضا مبتنی بر عبارات منظم (regex) در زبان Go و همچنین نحوهی پردازش شکست خطوط (line breaks) توسط تجزیهکننده YAML (YAML parser) در زمان تأیید امضا ایجاد میشود.
هنگام تأیید امضا، منطق تأیید Go به \r بهعنوان قسمتی از همان خط نگاه میکند. با این حال، تجزیهکننده YAML آن را بهعنوان شکست خط (line break) تفسیر میکند. این ناهماهنگی به مهاجمان این امکان را میدهد که محتوای مخرب را تزریق کنند که از فرآیند تأیید امضا عبور میکند، اما همچنان هنگام پردازش توسط تجزیهکننده YAML اجرا میشود.
مسئله دیگری این است که Nuclei چگونه با وجود چندین خط # digest: signature برخورد میکند، زیرا این فرآیند فقط اولین مورد از # digest: را در یک قالب بررسی میکند و هر مورد اضافی که بعداً در قالب پیدا شود، نادیده میگیرد.
این آسیبپذیری میتواند با اضافه کردن payloadهای مخرب اضافی به صورت # digest: پس از مقدار هش (digest) معتبر اولیه بهرهبرداری شود. این payloadهای مخرب شامل بخشی به نام “کد” (code) هستند که هنگام استفاده از قالب، تزریق و اجرا میشود.
Guy Goldenberg، پژوهشگر شرکت Wiz توضیح میدهد که : با داشتن اطلاعات درباره تفاوت در تفسیر کاراکترهای خط جدید، ما قالبی طراحی کردیم که از اختلاف میان پیادهسازی عبارات منظم (regex) در زبان Go و مفسر YAML سوءاستفاده میکند.
«با استفاده از \r بهعنوان یک کاراکتر شکست خط (line break)، میتوانیم یک خط دوم به صورت # digest: در قالب اضافه کنیم که از فرآیند تأیید امضا فرار میکند، اما توسط مفسر YAML تجزیه و اجرا میشود.»
شرکت Wiz این نقص را بهطور مسئولانه در تاریخ ۱۴ اوت ۲۰۲۴ به تیم ProjectDiscovery اطلاع داد و این مشکل در نسخه v3.3.2 از Nuclei در تاریخ ۴ سپتامبر برطرف شد.
اگر از نسخههای قدیمیتر Nuclei استفاده میکنید، بهشدت توصیه میشود که اکنون به آخرین نسخه بهروزرسانی کنید، زیرا جزئیات فنی این نقص بهصورت عمومی منتشر شده است.
Goldenberg همچنین توصیه میکند که از Nuclei در یک ماشین مجازی یا محیط ایزوله استفاده شود تا از سوءاستفاده احتمالی قالبهای مخرب جلوگیری شود.