前言概述
yara为本文介绍的目标,由VirusTotal开发维护。目前业内有不少功能完善的付费杀软和免费杀软,本文描述的引擎目的不是替换他们或与他们对比竞争,而是与上述杀软结合,借助yara的灵活定制性,精准快速发现威胁和改善安全事件应急响应效率。
使用介绍
下载安装
在VirusTotal的github仓可以根据需求下载对应版本,windows的有编译好的二进制版本,Linux下或由定制功能需求的则自己编译。本文直接使用官方编译的 yara-4.3.2-2150-win64 展开介绍,下载后直接解压,出现两exe,yara64.exe 为检测引擎,yarac64.exe 为规则编译引擎(检测引擎支持明文规则和编译后规则输入检测,编译后规则人眼不可读,但可以加快检测速度)。
杀毒检测
cmd下运行 yara64.exe -h 可以看到使用帮助,下面重点介绍几个常用命令选项。
-C, --compiled-rules load compiled rules // 加载编译后的规则
-m, --print-meta print metadata // 匹配到规则后打印规则元数据
-s, --print-strings print matching strings // 匹配到规则后打印规则匹配元素
-r, --recursive recursively search directories // 扫描目录时递归目录层级
-t, --tag=TAG print only rules tagged as TAG // 指定扫描某种类型规则
-l, --max-rules=NUMBER abort scanning after matching a NUMBER of rules // 设置检测规则匹配几个后终止扫描,默认是轮询完全部规则
-p, --threads=NUMBER use the specified NUMBER of threads to scan a directory // 扫描目录时设置并发线程数
-a, --timeout=SECONDS abort scanning after the given number of SECONDS // 设置扫描超时终止时间(秒)
从开源网站(具体网站由于被自动检测无法审核过,不列举)下载检测规则放入文件夹rule中后即xx可以对指定文件或文件夹开始检测,如下示例:
C:\xx\yara-4.3.2-2150-win64>yara64.exe -l 1 -t MAL -g -m rules\valhalla-rules.yar rules\Win32.Trojan.Dridex.yara rules\valhalla-rules.yar
MAL_WAR_Ivanti_EPMM_MobileIron_LogClear_JAVA_Aug23_RID38A5 [CVE_2023_35078,DEMO,MAL] [description="Detects LogClear.class found in the Ivanti EPMM / MobileIron Core compromises exploiting CVE-2023-35078",author="Florian Roth",date="2023-08-01 18:30:01",score =80,customer="demo",hash1="deb381c25d7a511b9eb936129eeba2c0341cff7f4bd2168b05e40ab2ee89225e",tags="CVE_2023_35078, DEMO, MAL",minimum_yara="1.7"] rules\valhalla-rules.yar
以上为对某文件进行多规则文件检测,只检出MAL类型(标签)事件,并在检出后输出规则标签和规则元信息,扫描终止条件为检测一个事件即停止。
规则编写
一个完整yara规则分为三部分:meta(元数据),strings(规则数据),condition(规则匹配条件),一个简单规则如下:
rule Rule_20230918_test : DEMO TEST1 {
meta:
description = "Just test rule."
author = "T1"
reference = "xxxxx"
date = "2023-09-18 23:52:31"
score = 90
tags = "DEMO TEST1 T1" // 注意这是元数据,真正tag在上面定义
strings:
$sr1 = /GWTEST FORMS SSO: Parse=0; URLLEN=([2-9][0-9]{2}|[0-9]{4,20}); Event: start=0x/
$s1 = ", type=1; Target: start=0x"
condition:
all of them
}
接着对meta,strings,condition分别展开再具体介绍。
meta(元数据)
描述作用,定义需要的结果字段,比如规则日期,规则作用,规则分数。注意这里出现的tags字段,无法用作#使用章节#里的提到的-t 类型指定,规则真实tags在rule Rule_20230918_test后指定,如上规则的为"DEMO TEST1"。
strings(规则数据)
yara支持三种类型strings:十六进制,文本、正则。
十六进制规则使用"{ }"包含,如 $hex_str1 = { E2 34 ?? C8 A? FB },$hex_str2 = { E2 34 [0-9] FB },$hex_str3 = { E2 34 (62 B3 | 52) FB },其中?代表任意通配,[0-9]表示范围,(61 B3 | 52)表示该段可选61B3或52。
文本规则组成为 文本数据(+修饰),比如 $str1 = "T1" nocase,T1为文本数据,nocase为修饰(表示大小写不敏感)。更多修饰符见#参考文献#,比如fullword(全词匹配),base64(匹配base64编码)等。
正则规则组成为 正则(+修饰),正则部分使用 "/ /"包含,比如 $re1 = /md5: [0-9a-fA-F]{32}/,表示"md5: "开头,后面为32字节长度的内容,字符范围为"0-9a-fA-F"。修饰符与文本规则修饰符一致,更多正则元字符见#参考文献#。
condition(规则匹配条件)
条件表达式标识本规则匹配条件,条件表达式中可出现布尔运算符(and ,or, not),关系运算符(>=,<=, <, >, == , !=),算数运算符(+, -, *, \, %) ,位运算符(&, |, <<, >>, ~, ^)。比如定义了两规则变量 $str1, $str2,如果满足其中一个即可则匹配条件为 "$str1 or $str2" 或者 "any of them",如果需要满足全部才行则匹配条件为 "$str1 and $str2" 或者 "all of them"。
需要计数的,比如$str1满足6次和$str2满足一次即可,为 "#str1 == 6 and $str2"。
需要指定偏移的,比如$str1出现在开头200字节处,$str2可任意位置,为 "$str1 at 200 and $str2"。
需要指定文件大小的,比如限制200KB以下文件,使用"filesize < 200KB"。
更多条件运算符介绍见#参考文献#。
附加
(1)注释,规则可以使用注释符备注说明对应字段,单行注释为 "//",多行注释为 "/* xx */"。
(2)私有规则,不会被引擎报告匹配结果的规则,可被其他规则引用。
(3)全局规则,作用规则文件全局,最先匹配,通过后才进行剩下规则匹配。
(4)规则文件引用,include关键字实现其他规则文件的引用,比如同级目录下, include "xx.yara"
(5)模块引入,类python语法,通过import关键字引入,如 import "pe",每个规则里则可以通过pe.*使用pe模块成员。
(6)外部变量,通过运行时-d选项指定传入。
使用场景
根据上面简单介绍可了解yara只一个单一的匹配检测引擎,缺少 前置白名单过滤,资源开销控制,实时监测,行为检测,响应防护等功能,无法替代成熟杀软产品。但是由于他的简单使用和定制特征,可在安全分析上帮助改善效率。比如发生安全事件,在杀软还未发布更新能力时,可快速定制yara规则,根据特征指定目录或类型文件扫描,第一时间完成威胁发现。另外,根据yara的hash,md5模块,轻松实现轻量级篡改检测,借助定时任务,快速构建免费版防篡改引擎。
参考文献
[1] freebuf里的《Yara规则下的威胁检测》
[2] readthedocs站点里的yara使用手册