snortをちょっと読んでみた
snortは基本idsである。inlineモードにすれば、ipsになるらしい。
main
detect.cにSnortMainがある。<-なかなか見つからなかった。
main https://github.com/threatstream/snort/blob/9bd7ba3c50f18b1d9df326182aed524324ed19f4/src/snort.c#L782
検知部分
検知するコードはdetectで検索すればよい。detect.h/cがもろにヒットした。 以下が、detection moduleらしい。
int CheckBidirectional(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckSrcIP(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckDstIP(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckSrcIPNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckDstIPNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckSrcPortEqual(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckDstPortEqual(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckSrcPortNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int); int CheckDstPortNotEq(Packet *, struct _RuleTreeNode *, RuleFpList *, int);
drop部分
dropを検索すればよく。detect.cにDropActionがある。こいつが、検知した時に、dropをする処理だ。ただし、先述の通りインラインモードである必要がある。
int DropAction(Packet * p, OptTreeNode * otn, Event *event) { RuleTreeNode *rtn = getRuntimeRtnFromOtn(otn); DEBUG_WRAP(DebugMessage(DEBUG_DETECT, " Generating Alert and dropping! \"%s\"\n", otn->sigInfo.message);); if(stream_api && !stream_api->alert_inline_midstream_drops()) { if(stream_api->get_session_flags(p->ssnptr) & SSNFLAG_MIDSTREAM) { DEBUG_WRAP(DebugMessage(DEBUG_DETECT, " Alert Came From Midstream Session Silently Drop! " "\"%s\"\n", otn->sigInfo.message);); Active_DropSession(p); return 1; } } /* ** Set packet flag so output plugins will know we dropped the ** packet we just logged. */ Active_DropSession(p); CallAlertFuncs(p, otn->sigInfo.message, rtn->listhead, event); CallLogFuncs(p, otn->sigInfo.message, rtn->listhead, event); return 1; }
次は、もっと詳細に読んでいきたい。