خلاصه اجرایی

قواعد YARA ابزاری قدرتمند برای شناسایی بدافزار و تهدیدات هستند، اما نوشتن قواعد مؤثر نیازمند مهندسی دقیق است. این مقاله با معرفی مفاهیم پایه مانند ساختار رشته‌ها (رشته‌های متنی، هگزادسیمال و منظم) آغاز می‌شود. سپس به انتخاب Artifactهای مناسب می‌پردازد؛ نمونه‌های آلوده باید نماینده واقعی خانواده بدافزار باشند و از نمونه‌های تمیز برای جلوگیری از false positive استفاده شود. در بخش گردش کار، مراحل ایجاد قاعده شامل تحلیل نمونه، استخراج ویژگی‌های پایدار، نوشتن قاعده اولیه و بهینه‌سازی آن توضیح داده می‌شود. تکنیک‌های طبقه‌بندی و خوشه‌بندی برای تشخیص نمونه‌های مشابه و کاهش false positive با استفاده از قواعد منفی، محدودیت‌های طول رشته و استفاده از شرایط ریاضی ارائه می‌شود. چالش‌های YARA مانند حساسیت به تغییرات جزئی، دور زدن توسط packer یا encryption و محدودیت در پردازش فایل‌های بزرگ مورد بحث قرار می‌گیرد. برای ارزیابی کارایی، شاخص‌هایی مانند دقت، recall و F1-score معرفی می‌شوند. در نهایت، یکپارچه‌سازی YARA در عملیات امنیتی (مانند SIEM، EDR و تحلیل خودکار) و اهمیت Regression Test برای اطمینان از عدم شکستن قواعد قدیمی در اثر به‌روزرسانی‌ها بررسی می‌شود. این راهنما برای تحلیلگران بدافزار و متخصصان امنیت که به دنبال بهبود مهارت‌های خود در نوشتن قواعد YARA هستند، مفید است.

مفاهیم پایه: ساختار و انواع رشته‌ها در YARA

قواعد YARA از دو بخش اصلی تشکیل می‌شوند: بخش تعریف رشته‌ها (strings) و بخش شرط (condition). بخش strings اختیاری است، اما بخش condition الزامی است و باید یک عبارت بولین باشد که تعیین می‌کند آیا فایل یا فرآیند مورد بررسی با قاعده مطابقت دارد یا خیر. ساختار کلی قاعده شباهت زیادی به زبان C دارد و با کلمه کلیدی rule شروع می‌شود. شناسه قاعده باید از قوانین واژگانی C پیروی کند؛ یعنی می‌تواند شامل حروف الفبا، ارقام و زیرخط باشد، اما نباید با رقم شروع شود. همچنین طول شناسه نباید از ۱۲۸ کاراکتر تجاوز کند و برخی کلمات کلیدی مانند all، any، condition، false، true و... برای استفاده به‌عنوان شناسه رزرو شده‌اند.

در بخش strings، هر رشته با یک شناسه تعریف می‌شود که با علامت $ شروع می‌شود و به دنبال آن ترکیبی از حروف، ارقام و زیرخط می‌آید. این شناسه‌ها در بخش condition به‌عنوان متغیر بولین عمل می‌کنند؛ یعنی اگر رشته مربوطه در نمونه مورد بررسی یافت شود، مقدار آن true و در غیر این صورت false خواهد بود. سه نوع رشته در YARA وجود دارد: رشته‌های متنی (text strings) که داخل علامت نقل‌قول قرار می‌گیرند، رشته‌های هگزادسیمال (hex strings) که داخل آکولاد نوشته می‌شوند و برای نمایش توالی خام بایت‌ها به کار می‌روند، و عبارات باقاعده (regular expressions) که برای تطبیق الگوهای پیچیده‌تر متنی استفاده می‌شوند. در رشته‌های هگزادسیمال فقط اعداد هگزادسیمال مجاز هستند و اعداد دهدهی پذیرفته نمی‌شوند.

نکته مهم دیگر، امکان افزودن کامنت به سبک C است. هم کامنت تک‌خطی با // و هم کامنت چندخطی با /* */ پشتیبانی می‌شود. این قابلیت برای مستندسازی قواعد و توضیح منطق پشت هر رشته یا شرط بسیار مفید است. به‌عنوان مثال، یک قاعده ساده می‌تواند شامل یک رشته متنی و یک رشته هگزادسیمال باشد و در شرط، وجود هر یک از آن‌ها را بررسی کند. درک صحیح این ساختار پایه، پیش‌نیاز طراحی قواعد کارآمد و دقیق است.

  • بخش strings اختیاری است، اما بخش condition همیشه الزامی است.
  • شناسه رشته‌ها با $ شروع می‌شود و در شرط به‌عنوان متغیر بولین عمل می‌کند.
  • رشته‌های هگزادسیمال فقط شامل اعداد هگزادسیمال هستند و داخل آکولاد نوشته می‌شوند.
  • کامنت‌های تک‌خطی و چندخطی به سبک C در قواعد پشتیبانی می‌شوند.
  1. یک قاعده با کلمه کلیدی rule و یک شناسه معتبر شروع کنید.
  2. در بخش strings، رشته‌های مورد نیاز را با شناسه‌های $ تعریف کنید.
  3. در بخش condition، یک عبارت بولین بنویسید که به شناسه‌های رشته ارجاع دهد.
  4. برای مستندسازی، از کامنت‌های C-style استفاده کنید.
rule ExampleRule {
  strings:
    $my_text_string = "text here"
    $my_hex_string = { E2 34 A1 C8 23 FB }
  condition:
    $my_text_string or $my_hex_string
}

شواهد و تله‌متری: تطبیق رشته‌ها و شرایط در YARA

در بخش شرط، شناسه‌های رشته به‌عنوان متغیر بولین عمل می‌کنند؛ به این معنی که اگر رشته در نمونه یافت شود، مقدار true و در غیر این صورت false می‌گیرد. این ویژگی امکان ترکیب رشته‌ها با عملگرهای منطقی مانند and، or و not را فراهم می‌کند. برای مثال، شرط `$a and $b` تنها زمانی برقرار است که هر دو رشته یافت شوند. همچنین می‌توان از عملگرهای مقایسه‌ای مانند `#a > 2` برای بررسی تعداد دفعات تکرار یک رشته استفاده کرد. این قابلیت‌ها به تحلیلگر اجازه می‌دهد تا شرایط دقیق‌تری بر اساس شواهد موجود در نمونه طراحی کند.

رشته‌های هگزادسیمال در YARA چهار ساختار ویژه دارند که انعطاف‌پذیری بالایی در تطبیق الگو ایجاد می‌کنند. اولین ساختار، wildcard است که با علامت سؤال (?) نمایش داده می‌شود و می‌تواند جایگزین یک نیم‌بایت یا یک بایت کامل شود. به‌عنوان مثال، الگوی `{ E2 34 ?? C8 A? FB }` نشان می‌دهد که بایت سوم می‌تواند هر مقداری باشد و نیم‌بایت اول بایت پنجم نیز نامشخص است. دومین ساختار، عملگر not است که با علامت ~ قبل از مقدار بایت نوشته می‌شود و مشخص می‌کند که بایت در آن موقعیت نباید برابر با مقدار مشخص‌شده باشد. این عملگر از نسخه ۴.۳.۰ به بعد در دسترس است و می‌تواند با wildcardهای نیم‌بایتی نیز ترکیب شود.

سومین ساختار، jump است که برای تعیین فاصله متغیر بین دو بخش از الگو به کار می‌رود. jump با دو عدد درون براکت نوشته می‌شود، مانند `[4-6]` که نشان می‌دهد بین دو بخش، ۴ تا ۶ بایت دلخواه می‌تواند وجود داشته باشد. اگر حد بالا و پایین برابر باشند، می‌توان یک عدد نوشت، مانند `[6]`. همچنین jumpهای نامحدود مانند `[10-]` نیز پشتیبانی می‌شوند. چهارمین ساختار، alternatives است که با علامت | (pipe) درون پرانتز نوشته می‌شود و امکان تطبیق یکی از چند توالی بایت را فراهم می‌کند. این ساختارها برای مقابله با تغییرات جزئی در بدافزارها و نمونه‌های مشابه بسیار مفید هستند.

  • شناسه رشته در شرط به‌عنوان متغیر بولین عمل می‌کند و می‌تواند با عملگرهای منطقی ترکیب شود.
  • wildcardها به صورت نیم‌بایتی عمل می‌کنند و امکان تعیین بخش‌های نامشخص را می‌دهند.
  • عملگر not (~) مشخص می‌کند که یک بایت نباید مقدار خاصی داشته باشد.
  • jumpها برای تعیین فاصله متغیر بین بخش‌های الگو استفاده می‌شوند و می‌توانند محدود یا نامحدود باشند.
  1. برای تطبیق دقیق، از wildcardها برای بایت‌های متغیر با طول ثابت استفاده کنید.
  2. اگر نیاز به تعیین بایت‌هایی دارید که نباید مقدار خاصی داشته باشند، از عملگر not استفاده کنید.
  3. برای فاصله‌های متغیر با طول نامشخص، jumpها را به کار ببرید.
  4. برای انتخاب بین چند توالی بایت، از alternatives استفاده کنید.
rule HexStringFeatures {
  strings:
    $wildcard = { E2 34 ?? C8 A? FB }
    $not_byte = { F4 23 ~00 62 B4 }
    $jump = { F4 23 [4-6] 62 B4 }
    $alt = { F4 23 ( 01 02 | 03 04 ) 62 B4 }
  condition:
    any of them
}

گردش‌کار: انتخاب Artifact تا نوشتن قاعده

برای نوشتن یک قانون YARA مؤثر، نخستین گام تعیین نوع داده‌ای است که قرار است بررسی شود؛ این داده‌ها می‌توانند یک فایل، حافظه یک فرآیند یا بسته‌های در حال گردش باشند. بر اساس هدف دفاعی، انتخاب مناسب‌ترین آرتیفکت اهمیت بالایی دارد؛ زیرا همان رشته‌های الگو در بستر فایل و حافظه، رفتار متفاوتی دارند. به همین دلیل، قبل از تعریف رشته‌ها باید مشخص کنید که می‌خواهید روی بایت‌های خام فایل تمرکز کنید یا روی ساختار حافظه. بستگی به این انتخاب، نوع رشته و پیش‌فرض‌های آن تغییر می‌کند.

پس از انتخاب آرتیفکت، باید شواهد موجود را از نمونه‌های مخرب یا پاکلینیک استخراج کنید. این شواهد می‌تواند یک توالی بایتی معتبر، یک متن خاص، یا حتی الگوی متغیر با بخش‌های ناشناخته باشد. در YARA، برای تعریف این شواهد سه نوع رشته اصلی وجود دارد: رشته‌های متنی، رشته‌های هگزادسیمال و عبارات منظم. در رشته‌های هگزادسیمال، قابلیت‌هایی مانند وحشی‌کارتر (Wildcard) برای ناشناخته‌دار، عملگرِ‌not برای تعیین یک بایت مشخص، و پرش برای بازه متغیر به کار می‌روند. این ابزارها به شما امکان می‌دهند تا تحت کنترلِ تغییر در طولِ داده، اما بدون تعیین مقدار دقیق، الگوهای منعطف بسازید.

در نهایت، بخش شرط یا Condition است. در این بخش، هر شناسهٔ رشته‌ای که در بخش Strings تعریف کرده‌اید، به عنوان متغیر بولین عمل می‌کند؛ یعنی اگر رشته پیدا شود مقدار true و در غیر این‌صورت false دارد. با ترکیب این متغیرها و سایر شرایطی مانند `filesize` یا شمارش تعداد occurrence، می‌توانید منطق دقیقی برای تشخیص بنویسید. اما انتخاب شرط‌های ساده و پرهیز از بیش از یک یا دو رشته‌های مشترک، خطر ایجاد مثبت کاذب بسیار افزایش می‌دهد؛ بنابراین طراحی باید به شکلی باشد که هم پوشش دقیق برای نمونه‌های مخرب داشته باشد و هم برای فایل‌های عادی کمترین خطا را ایجاد کند. به همین دلیل، بازبینی و آزمون بر روی جمعیتی متنوع از فایل‌ها، قبل از بهره‌برداری در دفاع، امری ضروری است.

  • انتخاب آرتیفکت: شناسایی‌درستِ محیط بررسی (فایل یا حافظه) بر اساس تهدید مفروض.
  • استفاده از رشته‌های هگزى و متنى با قابلیت تغییرپذیری: برای ساختارهای داده‌ای پویا.
  • ترکیب شرط‌های بولین: به کارگیری و، یا و نفی برای ساخت منطق دقیق‌تر یاداوری حقیقت از آنها.
  1. انتخاب آرتیفکت — بازبینی کنید که برای فایل، فرایند یا حافظه جستجو می‌کنید؛ این تصمیم شروع‌کنندهٔ فرایند است.
  2. مستندسازی شواهد — از نمونه‌های مخرب گروه‌بندی‌شده، الگوهای بایتی و متنی تکراری و کمخطر را استخراج کنید.
  3. تعریف رشته‌ها — با استفاده از پرش، وحشی‌کارتر و غیره، رشته‌های متغیر را به‌گونه‌ای بنویسید که نه خیلی عمومی باشد و نه بیش از حد خاص.
  4. نوشتن شرط بولین — با توجه به هدف طبقه‌بندی، شرطی بنویسید که حداقل یک رشته definite و یا ترکیبی از رشته‌ها را با منطق صریح پیاده کند.
  5. آزمون و بازبینی — با دادن نمونه‌های مثبت و منفی به قانون، نسبت‌بینی و خطای یافت را بسنجید و قواعد را تنظیم کنید.
rule WorkflowExample {
  strings:
    $hex_nibble = { F4 ?? ~01 62 B4 }  // nibble-wise wildcard + not
-    $note = "malicious" ascii
  condition:
    $hex_nibble and $note
}

طبقه‌بندی و تریاژ: تشخیص نمونه‌های مخرب با YARA

هدف اصلی YARA و ایجاد یک موتور شناسایی الگو متنوع است؛ اما از آن برای تریاژ، یعنی طبقه‌بندی فایل‌ها و فرایندها به‌عنوان مخرب، غیرمخرب یا نامطمئن استفاده می‌شود. در این فرایند، شرط‌های بولین که در بخش Conditionبه‌کار می‌روند تعیین می‌کنند که قانون در چه مجموعه‌ای فعال شود. به عبارت دقیق، هر رشتهٔ (String) در قانون به عنوان یک متغیر بولین ظاهر می‌شود: اگر رشته در کد باینری یا حافظه پیدا شد، مقدار true؛ در غیر این صورت false است. بنابراین می‌توان با ترکیب چند رشته در قالب یک عبارت منطقی، эффектی طبقه‌بندی‌کننده ایجاد کرد.

برای مثال، یک قانون آزمایشی برای تشخیص یک بدافزار ممکن است نشانهای جمعی، مانند وجود یک رشتهٔ قاتل بیزینش و همزمان یک آدرس IP شبکه‌ای را طلب کند. در این حالت، از اپراتور and استفاده می‌شود. به همین‌ترتیب، در صورت نیاز به تشخیص که آیا هر یک از چند رشته پیدا شده است، می‌توان اپراتور را با حوادث استفاده کرد؛ این نکته مهم است وظیفهٔ تriage را انجام دهد و فقط نمونه‌ای را که ترکیب دقیقی از چند امضا دارد ناشناس کند؛ بنابراین مثبت‌کاذه (False Positive) کمتری را به‌وجود می‌آورد.

پیشنهاد می‌شود که در تریاژ علاوه بر رشته‌های متنی، از شرایط دیگری مانند `filesize`, آفست‌های مشخص با شرط‌های مانند `at` و یا توزیع فضادار استفاده شود. این روش‌ها برای متمایز کردن نمونه‌هایی هستند که فقط یک رشته را به‌طور تصادفی دارند ولی ما مجبوریم امضاهایی که عیناً مطابق آناند را برچسب بزنند. این رویکرد منتهی به یک طبقه‌بندی اولیه‌بندی می‌شود، و برای آن که دقت تريازه‌سازی بالا بماند، باید قاعده را به‌طور مکرر با داده‌های جدید بازبینی کرد.

  • هر رشته در قانون، متغير بولي است؛ 'to it' آن، بُولی و true/false است.
  • شرط‌های منطقی قوی (اند، اور، نات) از برآورده شدن همیشگی جلوگیری می‌کنند و تریاژ مبتنی بر ترکیب دقیق را فراهم می‌کنند.
  • استفاده از متغیرهای اضافی مانند filesize یا توابع ولایت، قواعد را را برای محدودهٔ توزیع، تقویت می‌کند.
  1. استخراج ویژگیهای از مجموعة بنچمارک — برای ساخت قاعدهٔ طبقه‌بندی، از نمونه‌های مختلف مخدر و خälleداده‌های پاکبازند، یک مجموعه مرجع بسازید.
  2. تعیین معیار بولین — راه‌حل منطقی را تعریف کنید: چه ترکیبی از رشته‌ها باید نتیجه true/ مخرب به معنای فارسی منتج کند.
  3. اجرا و آزمایش — قاعده را بر روی مجموعه اسکن نموده و output ها را برای دسته مخرب و پاک جدا کنید.
  4. بازخورد و تنظیم مجدد — با توجه به نوی برگشتی، شرایط را سخت/سو اضافه کنید؛ ترياژ تنها واقعی است اگر با دیتای زنده بسنجید.
```yara
rule TriageClassifier {
  strings:
    $sC2 = "malicious-c2.example.com"
    $sMarker = "%s"
  condition:
    $sC2 and $sMarker and filesize > 200KB
} ”

کاهش خطاهای مثبت کاذب: راهبردهای دقیق‌سازی

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

یکی از ابزارهای مؤثر در این زمینه، عملگر not است که با پیشوند ~ در رشته‌های هگزادسیمال اعمال می‌شود. این عملگر به تحلیلگر اجازه می‌دهد تا مشخص کند یک بایت خاص نباید مقدار مشخصی داشته باشد. برای نمونه، الگوی { F4 23 ~00 62 B4 } تنها زمانی تطبیق می‌یابد که بایت سوم صفر نباشد. این قابلیت به‌ویژه در شناسایی خانواده‌های بدافزاری که در بخشی از ساختار خود از مقادیر ثابت استفاده نمی‌کنند، اما از یک مقدار ممنوعه پیروی می‌کنند، کاربرد دارد. همچنین می‌توان از این عملگر در سطح نیم‌بایت (nibble) استفاده کرد، مانند ~?0 که یعنی نیم‌بایت دوم نباید صفر باشد. این دقت‌سازی، احتمال تطبیق با داده‌های نامرتبط را به‌طور قابل توجهی کاهش می‌دهد.

راهبرد دیگر، استفادهٔ هوشمندانه از jumpها برای کنترل طول بخش‌های متغیر است. در مواردی که طول یک تکه‌دادهٔ متغیر مشخص نیست، به‌کارگیری jumpهای نامحدود مانند [10-] می‌تواند باعث ایجاد تطبیق‌های گسترده و در نتیجه مثبت کاذب شود. توصیه می‌شود که همواره بازهٔ jump را بر اساس دانش فنی از ساختار فایل یا بدافزار محدود کنید. برای مثال، اگر می‌دانید که طول یک فیلد خاص بین ۴ تا ۶ بایت است، از [4-6] استفاده کنید نه [0-100]. این کار نه‌تنها دقت قاعده را افزایش می‌دهد، بلکه بار محاسباتی موتور YARA را نیز کاهش می‌دهد. همچنین تعریف دقیق رشته‌ها با استفاده از wildcardهای نیم‌بایتی (مثل A?) به‌جای wildcard کامل (??) می‌تواند در مواردی که تنها بخشی از بایت متغیر است، به محدودسازی الگو کمک کند.

  • برای کاهش مثبت کاذب، از عملگر not برای تعیین مقادیر غیرمجاز در بایت‌ها استفاده کنید.
  • بازهٔ jumpها را بر اساس دانش ساختاری محدود کنید؛ از jumpهای نامحدود فقط در موارد ضروری بهره ببرید.
  • در رشته‌های هگزادسیمال، به‌جای wildcard کامل، از wildcard نیم‌بایتی برای دقت بیشتر استفاده کنید.
  • ترکیب چند رشتهٔ دقیق با عملگرهای منطقی (مانند and) می‌تواند احتمال تطبیق اشتباه را کاهش دهد.
  1. ابتدا ساختار دادهٔ هدف را تحلیل کرده و بخش‌های ثابت و متغیر را شناسایی کنید.
  2. برای هر بخش متغیر، بازهٔ طول مجاز را تعیین کرده و jump متناسب با آن تعریف کنید.
  3. برای بایت‌هایی که مقدار مشخصی نباید داشته باشند، از عملگر not استفاده کنید.
  4. قاعده را با مجموعه‌ای از نمونه‌های سالم و آلوده آزمایش کرده و نرخ مثبت کاذب را اندازه‌گیری کنید.
  5. در صورت مشاهدهٔ تطبیق‌های ناخواسته، محدودیت‌های رشته‌ها را افزایش دهید (مثلاً بازهٔ jump را کوچک‌تر کنید).
rule Example_Not_Jump {
  strings:
    $a = { F4 23 ~00 [4-6] 62 B4 }
    $b = "malicious" nocase
  condition:
    $a and $b
}

محدودیت‌های YARA: چالش‌ها و نقاط ضعف

با وجود انعطاف‌پذیری YARA در شناسایی الگوها، این زبان دارای محدودیت‌های ذاتی است که تحلیلگران باید در طراحی قواعد به آن‌ها توجه کنند. نخستین محدودیت، عدم پشتیبانی از منطق پیچیده و شرط‌های چندلایه است. هرچند می‌توان از عملگرهای منطقی مانند and، or و not استفاده کرد، اما امکان تعریف حلقه‌ها یا توابع سفارشی وجود ندارد. این موضوع باعث می‌شود که برخی الگوهای رفتاری که نیاز به پردازش توالی یا وابستگی‌های شرطی دارند، به‌سختی قابل پیاده‌سازی باشند. در چنین مواردی، بهتر است از ابزارهای تکمیلی مانند اسکریپت‌های خارجی یا موتورهای تحلیل رفتاری استفاده شود.

محدودیت دیگر، حساسیت به حروف بزرگ و کوچک در رشته‌های متنی است. به‌طور پیش‌فرض، تطبیق رشته‌ها به حروف حساس است، مگر اینکه از modifierهایی مانند nocase یا wide استفاده شود. این ویژگی می‌تواند باعث از دست رفتن نمونه‌هایی شود که در آن‌ها حروف با حالت متفاوت ظاهر شده‌اند. همچنین، پشتیبانی از عبارات باقاعده (regex) در YARA نسبت به زبان‌های کامل‌تر مانند PCRE محدودتر است و برخی از قابلیت‌های پیشرفته مانند lookahead یا backreference در دسترس نیستند. بنابراین، برای الگوهای پیچیدهٔ متنی، باید از ترکیب چند رشتهٔ ساده یا استفاده از ابزارهای دیگر بهره برد.

عملکرد (Performance) نیز یکی از چالش‌های مهم در YARA است. استفادهٔ بیش از حد از wildcardها، jumpهای نامحدود، یا رشته‌های بسیار کوتاه می‌تواند باعث افزایش زمان اسکن و مصرف حافظه شود. به‌ویژه در محیط‌های عملیاتی که حجم دادهٔ ورودی بالاست، این مسئله می‌تواند به کاهش کارایی کلی سیستم منجر شود. همچنین، YARA به‌طور پیش‌فرض از منطق فازی یا تحلیل آماری پشتیبانی نمی‌کند؛ بنابراین تشخیص بدافزارهای چندریختی (Polymorphic) که ساختار خود را تغییر می‌دهند، نیازمند طراحی دقیق قواعد با استفاده از تکنیک‌هایی مانند wildcard و jump است، اما این روش‌ها نیز محدودیت‌های خاص خود را دارند.

  • YARA فاقد ساختارهای کنترلی مانند حلقه و شرط‌های پیچیده است.
  • تطبیق رشته‌ها به‌طور پیش‌فرض به حروف حساس است و نیاز به modifierهای خاص دارد.
  • عبارات باقاعده در YARA از تمام قابلیت‌های PCRE پشتیبانی نمی‌کنند.
  • استفادهٔ نادرست از wildcard و jump می‌تواند به کاهش شدید کارایی منجر شود.
  1. پیش از نوشتن قاعده، نیازمندی‌های منطقی را بررسی کرده و در صورت نیاز به منطق پیچیده، از ابزارهای مکمل استفاده کنید.
  2. برای رشته‌های متنی، از modifierهای nocase یا wide در صورت نیاز استفاده کنید.
  3. از به‌کارگیری jumpهای نامحدود و wildcardهای زیاد خودداری کنید و همیشه بازه‌ها را محدود نمایید.
  4. قواعد را با داده‌های واقعی و حجم بالا آزمایش کنید تا از کارایی مناسب اطمینان حاصل شود.
  5. در صورت نیاز به تشخیص الگوهای پیچیده، ترکیب YARA با سایر روش‌های تحلیلی را در نظر بگیرید.
rule Performance_Note {
  strings:
    $bad = { ?? ?? ?? ?? } // avoid this
    $good = { 6A ?? 58 [0-4] 90 }
  condition:
    $good and not $bad
}

شاخص‌های ارزیابی: سنجش کارایی قواعد

ارزیابی کارایی قواعد YARA نیازمند در نظر گرفتن چند معیار کلیدی است که مستقیماً بر اثربخشی عملیات امنیتی تأثیر می‌گذارند. نخستین معیار، سرعت تطبیق است؛ یعنی مدت زمانی که موتور YARA برای بررسی یک فایل یا حافظه صرف می‌کند. این معیار در محیط‌های عملیاتی که حجم داده‌ها بالاست، حیاتی است. دومین معیار، دقت است که به توانایی قاعده در شناسایی صحیح نمونه‌های هدف اشاره دارد. دقت پایین منجر به نرخ مثبت کاذب بالا می‌شود که خود باعث ایجاد هشدارهای غیرضروری و تحلیل‌های اشتباه می‌گردد. سومین معیار، نرخ مثبت کاذب است که باید در طراحی قاعده به حداقل برسد. این معیارها با یکدیگر در تعامل هستند؛ بهبود سرعت ممکن است به کاهش دقت منجر شود، بنابراین باید تعادل مناسبی برقرار کرد.

راهنمای عملکرد در مستندات YARA بر اهمیت استفاده بهینه از رشته‌ها و شرایط تأکید دارد. موتور YARA برای جستجوی رشته‌ها از الگوریتم Aho-Corasick استفاده می‌کند که کارایی آن به تعداد و طول رشته‌ها وابسته است. بنابراین، استفاده از رشته‌های کوتاه و مشخص، به‌ویژه در ابتدای قاعده، می‌تواند سرعت تطبیق را افزایش دهد. همچنین، اجتناب از کاراکترهای عام (wildcard) در موقعیت‌های حساس و استفاده از عملگرهای مقایسه‌ای مانند `filesize` یا `entrypoint` در شرایط، می‌تواند تعداد فایل‌های نامزد را کاهش دهد. به عنوان یک توصیه کلی، بهتر است شرایطی که هزینه محاسباتی بالایی دارند (مانند استفاده از عبارات باقاعده) به انتهای قاعده منتقل شوند تا ابتدا شرایط ساده‌تر بررسی شوند.

برای ارزیابی عملی قواعد، باید مجموعه‌ای از نمونه‌های مثبت (نمونه‌های آلوده یا هدف) و منفی (فایل‌های سالم) جمع‌آوری شود. سپس قاعده بر روی این مجموعه اجرا شده و زمان اجرا، تعداد مثبت‌های واقعی و کاذب ثبت می‌شود. این فرآیند باید به صورت دوره‌ای تکرار شود تا از پایداری کارایی در طول زمان اطمینان حاصل گردد. همچنین، می‌توان از ابزارهای جانبی مانند `yara` با گزینه‌های زمان‌بندی استفاده کرد. در نهایت، هر قاعده باید مستندسازی شود تا دلایل طراحی و معیارهای ارزیابی آن برای سایر تحلیلگران شفاف باشد. این مستندسازی می‌تواند در بخش `meta` قاعده قرار گیرد.

  • سرعت تطبیق: زمان لازم برای بررسی هر فایل یا بخش حافظه.
  • دقت: نسبت نمونه‌های مثبت شناسایی‌شده به کل نمونه‌های مثبت واقعی.
  • نرخ مثبت کاذب: تعداد فایل‌های سالمی که به اشتباه به عنوان آلوده علامت‌گذاری می‌شوند.
  • استفاده از رشته‌های کوتاه و مشخص برای بهره‌گیری بهتر از الگوریتم Aho-Corasick.
  • انتقال شرایط پرهزینه به انتهای قاعده برای کاهش بار محاسباتی.
  1. نمونه‌های مثبت و منفی را از منابع معتبر جمع‌آوری کنید.
  2. قاعده را بر روی مجموعه نمونه‌ها اجرا کرده و زمان و نتایج را ثبت کنید.
  3. نرخ مثبت کاذب و دقت را محاسبه و با معیارهای مورد نظر مقایسه کنید.
  4. در صورت نیاز، رشته‌ها و شرایط را بهینه‌سازی کرده و دوباره ارزیابی کنید.
  5. نتایج ارزیابی را در بخش `meta` قاعده ثبت کنید.
rule ExampleRule {
    strings:
        $a = "malware" ascii
        $b = { 6A 40 68 00 30 00 00 }
    condition:
        $a and $b and filesize < 500KB
}

قابلیت عملیاتی: یکپارچه‌سازی YARA در عملیات امنیتی

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

بخش `meta` در YARA برای ذخیره فراداده‌ها مانند نام نویسنده، توضیحات، تاریخ ایجاد، و ارجاعات به منابع استفاده می‌شود. این بخش به مدیریت و مستندسازی قواعد کمک شایانی می‌کند. برای مثال، می‌توان در `meta` مشخص کرد که قاعده برای شناسایی کدام خانواده بدافزار طراحی شده است یا چه نسخه‌ای از YARA برای اجرا لازم است. این اطلاعات در زمان اشتراک‌گذاری قواعد با سایر تیم‌ها یا سازمان‌ها بسیار ارزشمند است. همچنین، استفاده از `meta` در فرآیندهای خودکار مانند گزارش‌گیری و تحلیل هشدارها مفید است، زیرا می‌توان فیلدهای خاصی را برای جستجو و فیلتر کردن قواعد تعریف کرد.

برای یکپارچه‌سازی مؤثر، قواعد باید به صورت ماژولار طراحی شوند. به این معنی که هر قاعده یک هدف مشخص داشته باشد و از قواعد عمومی و خصوصی به صورت ترکیبی استفاده شود. به عنوان مثال، یک قاعده `global` می‌تواند بررسی کند که فایل دارای پسوند اجرایی باشد، و سپس قواعد خصوصی برای شناسایی الگوهای خاص بدافزار اعمال شوند. این رویکرد باعث کاهش پیچیدگی و افزایش قابلیت نگهداری می‌شود. همچنین، باید از قابلیت `import` برای استفاده از ماژول‌های اضافی مانند `pe` یا `elf` بهره برد تا اطلاعات ساختاری فایل‌ها در شرایط لحاظ شود. در نهایت، تست منظم قواعد بر روی داده‌های واقعی و به‌روزرسانی آنها بر اساس تهدیدات جدید، بخشی از چرخه حیات یکپارچه‌سازی است.

  • استفاده از `global` برای اعمال شرایط عمومی بر همه قواعد.
  • استفاده از `private` برای پنهان‌سازی قواعد داخلی از خروجی.
  • بخش `meta` برای ذخیره فراداده‌ها مانند نویسنده، توضیحات و ارجاعات.
  • طراحی ماژولار قواعد برای سهولت نگهداری و اشتراک‌گذاری.
  • بهره‌گیری از ماژول‌های اضافی مانند `pe` و `elf` برای تحلیل ساختار فایل.
  1. قواعد را بر اساس هدف و نوع تهدید دسته‌بندی کنید.
  2. برای هر قاعده، بخش `meta` را با اطلاعات لازم تکمیل کنید.
  3. قواعد عمومی را با `global` و قواعد داخلی را با `private` تعریف کنید.
  4. از ماژول‌های مناسب برای تحلیل ساختار فایل‌ها استفاده کنید.
  5. قواعد را در محیط آزمایشی با داده‌های واقعی تست و سپس در عملیات مستقر کنید.
global rule CheckPE {
    condition:
        uint16(0) == 0x5A4D
}

private rule InternalRule {
    meta:
        author = "Security Team"
        description = "Detects specific malware family"
    strings:
        $a = "malicious_string" ascii
    condition:
        $a
}
ویدئوی تکمیلی از کانال رسمی MITRE درباره تبدیل ATT&CK به یک فرایند عملی شکار تهدید.

منابع و مطالعه بیشتر

  1. YARA Writing Rulesyara.readthedocs.io
  2. YARA Performanceyara.readthedocs.io