OSSIM开源安全信息管理系统(十五)

2021SC@SDUSC




五、OSSIM关联分析的部分源代码分析

OSSIM系统中,关联分析部分源码目录:\ossim\alienvault-ossim\src\alienvault-ossim\os-sim\src


1、sim-directive.c

打开 sim-directive.c 源码文件,同样先是包含一些库

#include <glib.h>
#include <glib-object.h>
#include <uuid/uuid.h>

这里引入了 glib.h,而且阅读到后面的代码部分发现有很多的数据类型是 g 开头的,例如 gintgboolean 等。

之前接触 C 语言的次数也比较少,仅仅简单了解一点 C 语言的知识,在这里特地查找了网上的相关资料,学习了解一下 C 语言的 glib。


1.1、初识 glib

这里先简单介绍一下 glib

glib 库是 Linux 平台下最常用的 C 语言函数库,它具有很好的可移植性和实用性。c 语言复杂点也就数组,glib 能提供更复杂的数据结构,队列,简单链表,树,线程同步,信号,对象等复杂类型

glib 是 Gtk + 库和 Gnome 的基础。glib 可以在多个平台下使用,比如 Linux、Unix、Windows 等。glib 为许多标准的、常用的 C 语言结构提供了相应的替代物。

glib 的各种实用程序具有一致的接口。它的编码风格是半面向对象,标识符加了一个前缀 “g”,这也是一种通行的命名约定。

使用glib库的程序都应该包含glib的头文件glib.h。


1.2、glib 基本类型定义

glib 的类型定义不是使用 C 的标准类型,它自己有一套类型系统。它们比常用的 C 语言的类型更丰富,也更安全可靠。引进这套系统是为了多种原因。例如, gint32 能保证是 32 位的整数,一些不是标准 C 的类型也能保证。有一些仅仅是为了输入方便,比如 guint 比 unsigned 更容易输入。还有一些仅仅是为了保持一致的命名规则,比如,gchar 和 char 是完全一样的。

  • 整数类型:

    gint8、guint8、gint16、guint16、gint32、guint32、gint64、guint64。

    不是所有的平台都提供64位整型,如果一个平台有这些, glib会定义G_HAVE_GINT64。

    类型gshort、glong、gint和short、long、int完全等价。

  • 布尔类型:

    gboolean:它可使代码更易读,因为普通 C 没有布尔类型。

    gboolean可以取两个值:TRUE 和 FALSE。实际上 FALSE 定义为 0,而 TRUE 定义为非零值。

  • 字符型:

    gchar和char完全一样,只是为了保持一致的命名。

  • 浮点类型:

    gfloat、gdouble 和 float、double 完全等价。

  • 指针类型:

    gpointer 对应于标准 C 的 void *,但是比 void * 更方便。

    指针 gconstpointer 对应于标准 C 的 const void *(注意,将const void *定义为const gpointer是行不通的)


1.3、glib 函数

glib还提供了一系列实用函数,可以用于获取程序名称、当前目录、临时目录等。

这些函数都是在glib.h中定义的。

/*返回应用程序的名称*/
gchar* g_get_prgname (void);

/*设置应用程序的名称*/
void g_set_prgname (const gchar *prgname);

/*返回当前用户的名称*/
gchar* g_get_user_name (void);

/*返回用户的真实名称。该名称来自“passwd”文件。返回当前用户的主目录*/
gchar* g_get_real_name (void);

/*返回当前使用的临时目录,它按环境变量TMPDIR、TMPandTEMP 的顺序查找。如果上面的环境变量都没有定义,返回“/tmp”*/
gchar* g_get_home_dir (void);
gchar* g_get_tmp_dir (void);

/*返回当前目录。返回的字符串不再需要时应该用g_free() 释放*/
gchar* g_get_current_dir (void);

/*获得文件名的不带任何前导目录部分的名称。它返回一个指向给定文件名字符串的指针*/
gchar* g_basename (const gchar *file_name);

/*返回文件名的目录部分。如果文件名不包含目录部分,返回“.”。返回的字符串不再使用时应该用g_free() 函数释放*/
gchar* g_dirname (const gchar *file_name);

/*如果给定的file_name是绝对文件名(包含从根目录开始的完整路径,比如/usr/local),返回TRUE */
gboolean g_path_is_absolute (const gchar *file_name);

/*返回一个指向文件名的根部标志(“/”)之后部分的指针。如果文件名file_name不是一个绝对路径,返回NULL */
gchar* g_path_skip_root (gchar *file_name);

/*指定一个在正常程序终止时要执行的函数*/
void g_atexit (GVoidFunc func);

上面介绍的只是glib库中的一小部分, glib的特性远远不止这些。这里进行简单介绍,只是为了能够在后面的部分更好的分析 OSSIM 关联分析这一部分的源代码。

如果想了解其他内容,参考glib.h文件。这里面的绝大多数函数都是简明易懂的。

另外,http://www.gtk.org上的glib文档也是极好的资源。


1.4、源码分析

gboolean sim_directive_match_by_event(SimDirective *directive,SimEvent *event)

该函数的主要功能是判断传入指令是否与根节点指令匹配,这里只检查根节点,并不检查指令的子节点

gboolean
sim_directive_match_by_event (SimDirective  *directive,SimEvent *event)
{
  gboolean match;

  g_return_val_if_fail (SIM_IS_DIRECTIVE (directive), FALSE);
  g_return_val_if_fail (!directive->_priv->matched, FALSE);
  g_return_val_if_fail (directive->_priv->rule_root, FALSE);
  g_return_val_if_fail (SIM_IS_RULE (directive->_priv->rule_root->data), FALSE);
  g_return_val_if_fail (SIM_IS_EVENT (event), FALSE);

  SimRule *rule = (SimRule *)directive->_priv->rule_root->data;

  match = sim_rule_match_by_event (rule, event);

  return match;
}

gboolean sim_directive_backlog_match_by_event (SimDirective *directive,SimEvent *event)

这将检查事件是否可以与 backlog 中的某些数据匹配。

backlog 实际上是一个包含事件数据的指令。每个 backlog 条目都是一个树,其中包含来自一个指令的所有规则(它相当于是一个指令克隆)。其中每个规则(simrule)还包含与规则匹配的事件的数据。

gboolean
sim_directive_backlog_match_by_event (SimDirective  *directive,SimEvent *event)
{
  GNode *node = NULL;
 
  g_return_val_if_fail (directive, FALSE);
  g_return_val_if_fail (SIM_IS_DIRECTIVE (directive), FALSE);
  g_return_val_if_fail (!directive->_priv->matched, FALSE);
  g_return_val_if_fail (directive->_priv->rule_curr, FALSE);
  g_return_val_if_fail (directive->_priv->rule_curr->data, FALSE);
  g_return_val_if_fail (SIM_IS_RULE (directive->_priv->rule_curr->data), FALSE);
  g_return_val_if_fail (event, FALSE);
  g_return_val_if_fail (SIM_IS_EVENT (event), FALSE);

我们必须对照backlog中的所有规则节点检查事件,除了根节点,因为它签入了sim_directive_match_by_event是从sim_organizer_correlation调用的

  node = directive->_priv->rule_curr->children;  while (node)      
  {
    SimRule *rule = (SimRule *) node->data;    if (sim_rule_match_by_event (rule, event))
        {
            g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event; sim_rule_match_by_event: True");
          time_t time_last = time (NULL);
            directive->_priv->rule_curr = node;     // 每次事件匹配时,该指令都下一级到匹配的节点。下次将根据此级别检查事件。

FIXME: 父节点中可能存在内存泄漏.

directive->_priv->time_last = time_last;
directive->_priv->time_out = sim_directive_get_rule_curr_time_out_max (directive);

//这里我们将事件中的各个字段分配到规则中,所以每次我们进入规则时,我们可以看到匹配的事件.
sim_rule_set_event_data (rule, event);      
 
          sim_rule_set_time_last (rule, time_last);          if (!G_NODE_IS_LEAF (node))
        {
          GNode *children = node->children;          while (children)
                {
                  SimRule *rule_child = (SimRule *) children->data;
 
                  sim_rule_set_time_last (rule_child, time_last);
 
                  sim_directive_set_rule_vars (directive, children);
                  children = children->next;
                    g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event: There are childrens in %d directive", directive->_priv->id);
                }
            }          else
          {
              directive->_priv->matched = TRUE;
                g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event: The directive %d has matched", directive->_priv->id);
          }          return TRUE;
        }        else
        {
            g_log (G_LOG_DOMAIN, G_LOG_LEVEL_DEBUG, "sim_directive_backlog_match_by_event: sim_rule_match_by_event: False");
        }
 
      node = node->next;
    }  return FALSE;
}

本篇文章部分内容参考或转载自下列文章及书籍。侵权即删。

参考书籍:

  • 《开源安全运维平台OSSIM疑难解析(入门篇)》——李晨光著
  • 《开源安全运维平台OSSIM疑难解析(提高篇)》——李晨光著
  • 《开源安全运维平台:OSSIM最佳实践》——李晨光著

参考文章:

  • https://blog.51cto.com/chenguang/2426473
  • https://blog.csdn.net/lcgweb/article/details/101284949
  • https://blog.51cto.com/chenguang/1665012
  • https://www.cnblogs.com/lsdb/p/10000061.html
  • https://blog.51cto.com/chenguang/1691090
  • https://blog.51cto.com/chenguang/category10.html
  • https://blog.51cto.com/topic/ossim.html
  • https://blog.csdn.net/isinstance/article/details/53694361
  • https://blog.51cto.com/chenguang/1332329
  • https://www.cnblogs.com/airoot/p/8072727.html
  • https://blog.51cto.com/chenguang/1738731
  • https://blog.csdn.net/security_yj/article/details/120153992



上一篇:OSSIM开源安全信息管理系统(十四)
下一篇:

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

陌兮_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值