suricata中的單模匹配和多模匹配

suricata的主要功能就是將規則和指定的報文進行匹配。有的是二進制協議的字段匹配,主要就是數值的比較。有的是針對傳輸層協議的內容匹配,主要是字符串的匹配查找。其中字符串的匹配分單模匹配以及多模匹配,本篇就簡單的聊聊這兩種匹配在suricata中的體現。

單模匹配即用單個字符串去匹配報文的的內容部分,例如payload。多模匹配即多個字符串同時去匹配報文的payload部分。其中多模匹配主要發生在prefilter階段,而單模匹配發生在單條規則的匹配階段。

多模匹配

爲什麼說prefilter階段是單模匹配呢?在Prefilter函數中,執行的匹配函數代碼爲engine->cb.Prefilter,而該函數是在PrefilterPktPayloadRegister函數中註冊的,詳細的見我前面分析prefilter的文章,這裏。在PrefilterPktPayloadRegister函數中,註冊的匹配函數爲PrefilterPktPayload,其中mpm_table即多模匹配的算法函數,可以是AC的多模匹配算法,也可以選擇HS的多模匹配算法。匹配的內容是p->payload,匹配的多模模式是pectx。那麼多模的模式是怎麼構建的呢?

模式的來源即每一個規則的fast pattern構成,在規則被加載解析之後,會進行規則的build,在規則的build階段就會將這些fast pattern構建成多模的模式。具體構建多模模式的函數爲MpmStorePrepareBuffer,該函數針對不同的分組進行多模模式的建立。首先通過MpmStoreLookup查找模式是否存在,如果不存在通過MpmStoreSetup建立。在MpmStoreSetup中,最重要的是找到符合條件的fast pattern,即 const DetectContentData *cd = (DetectContentData *)s->init_data->mpm_sm->ctx;,然後將其加入到 ms->mpm_ctx中,即:

PopulateMpmHelperAddPattern(ms->mpm_ctx,cd, s, 0, (cd->flags & DETECT_CONTENT_FAST_PATTERN_CHOP));

前面提到,多模模式的個數是由系統的分組決定的,在一個多模的模式創建完成之後,會將該模式加入de_ctx->mpm_hash_table哈希表進行統一的管理,即MpmStoreAdd函數的內容。

單模匹配

單模的匹配主要是將規則的一個個pattern依次去匹配報文的payload部分,即DetectRulePacketRules->DetectEnginePktInspectionRun
DetectEnginePktInspectionRun函數中e->v1.Callback回調函數的註冊位於DetectEnginePktInspectionSetup處。可以看到匹配函數爲DetectEngineInspectRulePayloadMatches->DetectEngineInspectPacketPayload->DetectEngineContentInspection->SpmScan。同樣的在SpmScan函數中,spm_table可以採用AC的單模匹配算法也可以採用HS的單模匹配算法,匹配的內容sbuffer通常是報文的payload部分,匹配的字符串cd->spm_ctx即規則解析階段的每個規則中的一個個字符串pattern。

多模匹配的消耗通常要高於單模的匹配,同時經過prefilter階段的匹配之後,符合條件的規則數量會大大的減少,在單模匹配階段的消耗也會變的更少。這也是在測試性能的時候,規則檢測階段性能消耗最大的往往是prefilter函數。

本文爲CSDN村中少年原創文章,轉載記得加上原創出處,博主鏈接這裏

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章