阎锋
一、 邮件安全所面临的挑战
邮件安全可以划分成两个层次:邮件服务器自身的安全性(防止服务器本身被入侵、破坏或DDOS攻击)和邮件的安全性(阻止垃圾邮件、过滤敏感信息、过滤病毒等)。由于电子邮件己成为当今世界上使用最频繁的通信工具,因此邮件系统和服务日益成为黑客关注的目标,他们不断寻找新的攻击方法,以期入侵、破坏和利用邮件系统和服务,达到各种非法目的,如窃取机密、发送垃圾邮件、散播反动言论等等。
在不断公布的漏洞通报中,邮件系统的漏洞是最普遍的一项。黑客常常利用电子邮件系统的漏洞,结合简单的工具就能达到攻击目的。那么东软NetEye IPS是如何防御针对邮件服务和系统的攻击的?又有哪些独特的技术优势呢?下面为您做一个简要介绍。
二、 NetEye IPS邮件安全防护引擎功能介绍
NetEye IPS的邮件安全防护引擎既可以在保证邮件服务器自身的安全性方面发挥作用,也可以对邮件进行过滤和检查,过滤敏感信息。
- 保护系统漏洞。针对很多邮件服务器自身存在的安全漏洞,NetEye IPS提供了针对漏洞的NEL防护攻击规则,可以防止黑客利用邮件服务器的安全漏洞入侵并控制邮件系统,有效保护邮件服务器安全。
- 实时监视电子邮件流量,防止恶意邮件攻击。NetEye IPS邮件安全防护引擎能够实时不间断的监视电子邮件流量,这对于防止黑客利用电子邮件访问内部系统是至关重要的。通过邮件安全防护引擎与NEL规则库的协同工作,可以智能识别用户名单探测攻击、口令探测攻击、空邮件攻击、大邮件攻击、字典攻击、多线程攻击、DoS攻击等各种恶意攻击行为,包括一些不符合协议规范标准的未知攻击,并可以自动阻断攻击源IP。
- 敏感内容过滤。NetEye IPS邮件安全防护引擎允许用户设置内容过滤规则,对进出网关的邮件信息以及附件进行智能过滤和监控,包括正文内容、标题、附件类型和大小、附件内容、收信人和发信人等,可以确保公司机密信息不被泄漏,并有效防止对邮件系统的滥用行为。此外,NetEye IPS邮件安全防护引擎支持功能强大的“正则表达式”,除了NetEye提供的用于敏感内容过滤的NEL规则库外,用户还可以自定义NEL规则库,真正满足不同用户的定制化需求。
三、 基于NEL的NetEye IPS邮件安全防护引擎
NEL(NetEye Event Language)是东软自主研发成功的一种通用攻击描述语言,包括NEL语言规范及相应的开发环境。NEL为不同类型的入侵检测防御产品(如网络IDS/IPS、主机IDS/IPS、应用防火墙、应用安全增强模块等)的开发提供了一个具有强大描述能力、高度的可扩展性和很高代码执行效率的语言平台。基于NEL可以定义针对SMTP协议及SMTP服务器防护的NEL规则,我们将简单介绍一下相关规则的函数声明,事件定义和规则内容示例,以便您对NetEye IPS检测和阻断攻击的过程有一个比较详细深入地了解。
1、 函数声明
邮件安全防护引擎工作时需要用到的C语言库函数、NEL库函数和一些用户自定义规则时需要的函数,这些函数将在规则中被调用。
…
int printf (char *format, ...);
int frag_match(char *data, int len, char *pattern);
int smtp_rule_act (struct smtp_info *psmtp, int ruleid, char *data);
…
2、 事件定义
事件是邮件安全防护引擎的基础,具体包括原子事件、抽象事件和特殊事件。引擎通过接收一系列存在因果关系的事件,然后再根据规则的定义将这些事件分析为更为抽象的事件,并基于这些事件进行攻击检测。
…
atom struct smtp_cmd_ehlo *ehlo_req;
event struct smtp_cmd_ehlo *BAD_EHLO_REQ;
…
atom struct smtp_mime_version *mime_version;
event struct smtp_mime_version *MIME_VERSION;
…
event struct smtp_field *FLD;
event clist *FLDS;
event struct smtp_fields *Header;
…
event struct smtp_atk SMTP_ATK, SMTP_ATKS;
event void target;
…
3、 SMTP规则
规则实际上就是事件间的关系,我们可以通过定义恰当的规则来描述各种攻击,最简单的规则形如:
BAD_AUTH_REQ: auth_req($0->client_state == STATE_START)
{
audit_printf(audit_data, 255, “%s”, “”);
smtp_rule_act($0, ridof(), audit_data);
return 0;
}
;
SMTP_ATK: BAD_ AUTH_REQ
{
printf(“SMTP_ATK: BAD_ AUTH_REQ”);
return 0;
}
…
_target : ANY SMTP_ATK
{
printf("target : ANY SMTP_ATKS");
return 0;
}
;
说明:根据RFC 2821,在一个合法的SMTP连接过程中,只有在客户端至少发送过一个“HELO/EHLO”请求命令之后,客户端发送“AUTH”请求命令才是合法的,$0->client_state == STATE_START即代表着在SMTP连接过程中,客户端尚未发送过“HELO/EHLO”请求命令,因此通过这条规则可以阻挡住所有不符合SMTP协议标准交互过程的“AUTH”请求命令,同时也将根据这条规则事先定义好的策略采取相应的动作——拦截所有利用直接发送“AUTH”请求命令进行的攻击。BAD_AUTH_REQ事件规约为SMTP_ATK事件,最终规约为_target目标事件,完成检测。
为了真实的再现SMTP通信过程,我们还设计了一个双自动机模型,分别表示客户端与服务器端在通信过程中所处的状态,为精确检测SMTP攻击提供了坚实的基础。
下面仅介绍SMTP安全防护引擎中的部分规则,
(1)保护系统漏洞
邮件服务器本身存在着很多漏洞,如CAN-1999-0284和CVE-2002-0698就是针对Microsoft Exchange邮件服务器的自身缺陷,我们可以通过在规则中加入一个检测函数来完成对EHLO命令中是否含有机器指令的检测,
static char audit_data[255];
BAD_EHLO_REQ: ehlo_req(has_x86_shellcode($1->host_name, $1->host_name_len))
{
snprintf(audit_data, 255, "EHLO命令中包含机器指令:%s", $1->host_name);
smtp_rule_act($0, ridof(), audit_data);
return 0;
}
;
其中,has_x86_shellcode()函数就是针对机器指令的检测函数。
另外,对于sendmail 8.10.0之前的版本,如果客户端发送大量的ETRN命令(sendmail服务器默认配置支持ETRN命令),然后断开连接,这会引起服务器拒绝服务攻击(CVE-1999-1109)。我们可以通过加载一些限制客户端发送的ETRN命令个数或禁止发送ETRN命令来阻止这种攻击。
//限制单次连接中ETRN命令的最大数为2
init{
etrn_max_cnt = 2;
etrn_max_cnt_rid = ridof();
}
fini{
etrn_max_cnt = 0;
}
//禁止发送ETRN命令
init{
var_disable_etrn_cmd = 1;
var_disable_etrn_cmd_rid = ridof();
}
fini{
var_disable_etrn_cmd = 0;
}
(2)敏感信息过滤
在上面的规则中,“ehlo_req”是一个原子事件,“ehlo_req”事件变量的填充是由底层的协议分析引擎来实现的。
与此不同,邮件正文部分的分析工作是由“协议分析引擎中的协议解析代码”和“NEL 协议规则”共同完成的,协议分析引擎将邮件正文中的信体作为“text”事件提交上来,“text”事件的类型为smtp_mime_data,“text”事件中的事件变量没有经过解码,而且由于它是一个基于字符缓冲区的数据结构,不能在“text”事件的基础上进行字符流的过滤,基于“text”只能定义简单的攻击检测规则。
为了解决这个问题,我们又定义了TEXT事件,TEXT事件的类型是struct stream:
TEXT : text
{
char *result; int result_len;
int off ;
struct stream *s;
off = 0;
smtp_mime_body_parse($1->dt_data.dt_text.dt_data, I
$1->dt_data.dt_text.dt_length,
&off,
$1->dt_encoding,
&result, &result_len );
s = nel_stream_alloc();
nel_stream_put(s, result, result_len);
return s;
}
| TEXT text
{
char *result; int result_len;
int off;
struct stream *s;
off = 0;
smtp_mime_body_parse($2->dt_data.dt_text.dt_data,
$2->dt_data.dt_text.dt_length,
&off,
$2->dt_encoding,
&result, &result_len );
nel_stream_put($1, result, result_len);
return $1;
}
;
由于“TEXT”事件变量中包含的是解码后的数据流,这样我们就可以对“TEXT”使用字符串匹配函数进行字符流过滤,下面是一条过滤敏感字的规则模板:
BAD_TEXT: TEXT($1->buf[0, $1->buf_len] ~ /敏感字/i)
{
audit_printf(audit_data, 255, “%s”, “审计数据”);
smtp_rule_act($0, ridof(), audit_data):
return 0;
}
;
其中“敏感字”字段支持强大的正则表达式,如想过滤“暴力团”及其各种变形“暴,力,团”、“暴------力-------团”等,我们就可以使用如下的“敏感字”表达式:“暴.*力.*团”。
(3)黑白名单过滤
NEL还为用户提供了黑白名单过滤规则模板,通过应用最小完美HASH技术,NEL可以快速的查找到待匹配的关键字,
static char *blacklist[] = {"abc@163.com", "def@163.com", "123456@163.com"};
static int length = sizeof(blacklist)/sizeof(blacklist[0]);
static char audit_data[255];
static cmph_t *hash;
init{
hash = create_hl(blacklist, length);
}
BAD_MAIL_REQ: mail_req(find_key(blacklist, $1->addr, hash))
{
snprintf(audit_data, 255, "MAIL邮件地址黑名单列表包含:%s", $1->addr);
smtp_rule_act($0, ridof(), audit_data);
return 0;
}
;
fini{
destroy_hl(hash);
}
说明:其中init部分将在邮件安全防护引擎启动时运行,将用户的黑名单列表通过最小完美HASH函数映射成HASH列表,在引擎运行过程中,引擎仅需将邮件地址HASH后的值在HASH列表查找,最后在fini部分释放掉HASH列表。用户仅需修改blacklist字符数组中的元素就可以自行定制MAIL邮件地址黑名单列表。
以上简单介绍了NetEye IPS中的邮件安全防护技术,如您希望了解更多NEL技术及NetEye IPS相关信息,可以访问东软NetEye网站,https://neteye.neusoft.com,点击“NEL开发联盟”栏目,获取您感兴趣的信息。或者发邮件到xusq@neusoft.com,邮件主题请包括“NEL开发联盟”字样。
四、 结束语
随着互联网的飞速发展,保证邮件系统的安全也就成了一个永恒的话题,NetEye IPS邮件安全防护引擎为企业邮件系统构建了一道坚实屏障,无论是混合威胁,还是黑客攻击,都将无法撼动企业的邮件系统,真正为用户构建了一个安全无忧的通信环境。