プリプロセッサはSnortのバージョン1.5から導入されました。プリプロセッサ 機能を通じて、ユーザやプログラマはモジュール型のプラグインを容易に Snortに組み込み、機能を拡張できます。プリプロセッサのコードは侵入検知 エンジンが呼び出される前に実行されますが、パケットがデコードされた後に 実行されます。この機構により、パケットの修正や分析を帯域外(out of band) 方式で行うことができます。
preprocessorキーワードを通じてプリプロセッサの読み込み・設定を 行います。Snortルール内のpreprocessorディレクティブの形式は 次の通りです。
preprocessor <name>: <options>
preprocessor minfrag: 128
HTTPのURI文字列を処理し、そのデータを確かなASCII文字列に変換するために、 HTTPデコード機能が利用できます。たとえば、HTTP規格は%20の文字列が 単一の空白(例: )として解釈されるよう、文字に対する16進エンコー ディングを定義しています。Webサーバは、様々な規格に準拠するように 書かれているだけでなく、おびただしい種類のクライアントにも対応 できるよう設計されています。MicrosoftのWebサーバは特定のバグだけに 対応するだけでなく、付加的な種類のエンコード方式も処理できます。
| オプション | 目的 | Webサーバ |
| unicode | Multibyte encoding standard | IIS (all versions 3+) |
| iis_alt_unicode | %u### encodings | IIS |
| double_encode | IIS encoding bugs | IIS 3,4,5 versions prior to MS01-44 |
| iis_flip_slash | interpret as / | IIS |
| full_whitespace | interpret tabs as spaces | Apache |
http_decode:<port list> [unicode] [iis_alt_unicode]\
double_encode] [iis_flip_slash] [full_whitespace]
preprocessor http_decode: 80 8080 unicode iis_flip_slash iis_alt_unicode
Snort PortscanプリプロセッサはPatric Mullen氏によって開発されました。
ポートスキャンは、T秒間にPを超えるポート番号へのTCP接続試行、 またはT秒間にPを超えるポート番号に送信されるUDPパケットと 定義されます。ポート番号は複数の宛先IPアドレスに 拡張でき、複数のIPに渡る同一のポート番号も対象となります。 現在のバージョンでは単独->単独、または単独->多数のポート スキャンを検知できます。次のフルリリースでは、分散型ポート スキャン(複数->単独または複数->複数)に対応する予定です。 ポートスキャンはNULL, FIN, SYNFIN, XMASなどの単一のステルス スキャンパケットとも定義されます。これは、Snortの標準配布 ファイルに含まれるscan-libから、ステルススキャンパケットの 部分をコメントアウトすべきであることを意味しています (訳注:バージョン2.0.2の配布物には当該ファイルを確認できな かったため、この記述は古い可能性がある)。 ポートスキャンモジュールを利用する際のメリットとしては、これらの アラートが各パケットごとにではなく、各スキャンごとに出力される 点が挙げられます。外部ログ取得機能を利用すれば、ログファイルを 参照することでスキャンのテクニックやタイプを確認できます。
このモジュールに対する引数は次の通りです。
portscan: <monitor network> <number of ports> <detection period> <file path>
preprocessor portscan: 192.168.1.0/24 5 7 /var/log/portscan.log
もう1つのPatric Mullen氏から提供されたモジュールは、ポートスキャン 検知システムの挙動を変更するものです。運用中のサーバ(NTP, NFS, DNSサーバなど)がポートスキャン検知機構を誤動作させる傾向がある 場合は、ポートスキャン検知プラグインに特定のホストからのTCP SYNや UDPポートスキャンを無視するよう設定できます。このモジュールに 対する引数は、無視する対象のIPアドレス/CIDRブロックのリストです。
portscan-ignorehosts: <host list>
preprocessor portscan-ignorehosts: 192.168.1.5/32 192.168.3.0/24
Snort 1.8で導入されたFrag2は新しいIPフラグメント再構築 プリプロセッサです。Frag2は(訳注:以前利用されていた)defragプリ プロセッサを置き換えるよう設計されています。このフラグメント再構築 機構は、メモリの利用効率を高めるとともに、Snortの他の部分で 利用されているものと同じメモリ管理ルーチンを利用することを 目的としています。
Frag2ではメモリ利用量とフラグメント化タイムアウトオプションを 設定可能です。引数が未設定の場合、frag2は4194304バイト (4MB)のデフォルトメモリと60秒のタイムアウト時間を 利用します。タイムアウト時間は、まだ再構築が行われていない フラグメントを廃棄するまでの待ち時間を設定する際に利用します。
Snort 1.8.7では、fragrouteのような回避テクニックの利用を検知する ために効果的なオプションがいくつか追加されました。
preprocessor frag2: [memcap <xxx>], [timeout <xx>], [min_ttl <xx>], \
[detect_state_problems], [ttl_limit <xx>]
preprocessor frag2: memcap 16777216, timeout 30
stream4モジュールはSnortにTCPストリームの再構築およびステートフル解析 機能を提供します。堅牢なストリーム再構築機能を通じて、Snortはstickや snot攻撃のような“ステートレス”攻撃を無視できるようになります。 stream4は同時に256を超えるTCPストリームを追跡できる大規模なスケーラ ビリティも提供します。stream4はデフォルトの設定で32,768の同時TCP 接続を処理できる拡張性を備えているはずです。
Stream4はstream4プリプロセッサ、stream4に関連する再構築プラグインの 2つの構成可能なモジュールが含まれています。以下にstream_assemble のオプションをリストアップします。
preprocessor stream4: [noinspect], [keepstats], [timeout <seconds>], \
[memcap <bytes>], [detect_scans], [detect_state_problems], \
[disable_evasion_alerts], [ttl_limit <count>]
preprocessor stream4_reassemble: [clientonly], [serveronly],\
[noalerts], [ports <portlist>]
snort.confファイル内で引数を設定せずに、stream4とstream4_reassemble ディレクティブを設定した場合、表6と 表7に示したデフォルトの値が 設定されます。
stream4は新しいコマンドラインスイッチとして``-z''を導入しています。 TCPトラフィックにおいて-zスイッチを指定した場合、Snortはスリーウェイ ハンドシェイクを通じて確立されたストリーム、または協調的な双方向の 活動が観測された場合のストリーム(つまりあるトラフィックが一方向に なってしまい、RSTまたはFIN以外のトラフィックが送信者に戻ってくる ことが確認された場合)に対してのみアラートを発動します。-zが有効な 状態の場合、Snortは完全にTCPベースstick/snot攻撃を無視します。
| Option | Default |
| Session Timeout | 30 seconds |
| Session Memory Cap | 8388608 bytes |
| Stateful Inspection | ACTIVE |
| Stream Stats | INACTIVE |
| State Problem Alerts | INACTIVE |
| Portscan Alerts | INACTIVE |
| Option | Default |
| Reassemble Client | ACTIVE |
| Reassemble Server | INACTIVE |
| Reassemble Ports | 21 23 25 53 80 143 110 111 513 1433 |
| Reassembly Alerts | ACTIVE |
Conversationプリプロセッサを利用すると、SnortはTCPにおいて spp_stream4で行われている方法ではなく、プロトコルに 基づいて対話の状況を得ることができます。将来的には、これに よってバイトカウントやファーストトーカー(first talker)の 状況に対応するルールを記述できるようになるでしょう。
現在、Conversationプリプロセッサはstream4と同じメモリ防御 メカニズムを利用しており、DoS攻撃の際に自衛できます。
Conversationプリプロセッサは、ネットワーク上で許容されない IPプロトコルを含んだパケットを受信するとアラートメッセージを 生成できます。allowed_ip_protocolsで許容するプロトコル 番号のリストを設定すると、許容されないパケットを受け取った 場合にアラートを発動して、そのパケットを記録します。
preprocessor conversation: [allowed_ip_protocols <protonumbers|all>], \
[timeout <sec>], [alert_odd_protocols], \
[max_conversations <number>]
| Option | Default |
| allowed_ip_protocols | all |
| timeout | 60 |
| alert_odd_protocols | disabled |
| max_conversations | 65335 |
このモジュールを利用ポートスキャンを検知できます。このモジュールは 対話(conversation)が新しく行われているものなのかを知るために、 conversationプリプロセッサ(第2.4.6節)を必要とします。
このモジュールは高速nmapスキャンのような高速スキャンの捕捉を 意図したものです。
preprocessor portscan2: [scanners_max <num>], [targets_max <num>], \
[target_limit <num>], [port_limit <num>], \
[timeout <sec>]
| Option | Default |
| scanners_max | 1000 |
| targets_max | 1000 |
| target_limit | 5 |
| port_limit | 20 |
| timeout | 60 |
これら二つのプリプロセッサはPortscan2プリプロセッサの動作を一部変更し、 特定のTCPおよびUDPポートを宛先や送信元とするアラートを無視するよう 設定するものです。
特定のポートを宛先とするアラートを無視するには、portscan2-ignoreports-to を利用します。特定のポートを送信元とするアラートを無視するには、 portscan2-ignoreports-fromを利用します。これら二つのディレクティブは snort.confの portscan2 preprocessor の指定より後の行に設定する必要があります。 また、ポート番号は空白区切りのリストで指定する必要があります。
preprocessor portscan2-ignoreports-from: <port list> preprocessor portscan2-ignoreports-to: <port list>
preprocessor portscan2-ignoreports-from: 53 80 preprocessor portscan2-ignoreports-to: 80 1080
telnet_decodeプリプロセッサを利用すれば、Snortはセッションデータから のtelnetの制御文字列を正規化できます。1.9.0以降のSnortでは引数として (プリプロセッサを)利用するポートのリストを指定します。また1.9.0では、 Snortはパケットそのものから個々のデータバッファに正規化することで、 rawbytes content修飾子(第2.3.38節)を使って生データを 記録。または検査できます。
デフォルトの設定ではポート番号 21, 23, 25, 119で動作します。
preprocessor telnet_decode: <ports>
rpc_decodeプリプロセッサは、パケットをパケットバッファに正規化する ことで、複数のフラグメント化したRPCの記録を、単一のフラグメント化して いない記録に正規化します。stream4が有効になっている場合、クライアント 側のトラフィックのみを処理します。デフォルト設定では、ポート番号111と 32771で動作します。
preprocessor rpc_decode: <ports> [ alert_fragments ] \ [no_alert_multiple_requests] [no_alert_large_fragments] \ [no_alert_incomplete]
このモジュールは、パフォーマンス統計データを元に、Snortの さまざまな状況を調整するために利用します。このモジュールの 出力形式や引数形式は予告なしに変更されることがあります。
このモジュールを利用すれば、SnortはHTTPヘッダの後のHTTPサーバーの 応答を無視できるようになります。
| オプション | 目的 |
| alert_fragments | フラグメント化したRPC記録に対してアラートを出力する |
| no_alert_multiple_requests | 1つのパケット内に複数の記録が存在する場合でもアラートを出力しない |
| no_alert_large_fragments | フラグメント化した記録の合計が1つのパケットを上回った場合でもアラートを 出力しない |
| no_alert_incomplete | 単一のフラグメント記録が1つのパケットのサイズを上回った場合でも アラートを出力しない |