カスタム IPS シグネチャ

カスタムシグネチャでは、サーバー、プロトコルやアプリケーションなどのネットワークオブジェクトに関連する脆弱性からネットワークを保護することができます。カスタムシグネチャを作成し、後で IPS ポリシールールに追加することができます。

IPS カスタムパターンの構文

キーワード

使用方法

srcaddr/dstaddr

<ipaddress>;

送信元/宛先 IP アドレス。

srcport/dstport

<Number>;

送信元/宛先ポート。

content

<content string>;

ニ重引用符内の文字列。

1つのルールで複数のコンテンツを指定できます。値にはテキストとバイナリデータの組み合わせを含めることができます。通常、バイナリデータはパイプ文字 (|) 内に配置されます。

nocase

content キーワードとのみ使用できます。

NULL

コンテンツ値の大文字と小文字の区別を無視します。

rawbytes

content キーワードとのみ使用できます。

NULL

デコードを無視します。生パケットデータを確認します。

depth

content キーワードとのみ使用できます。

<number>;

例: depth:5;

指定されたペイロードバイト数内にあるコンテンツを検索します。depth 値が content キーワードの長さよりも小さい場合、このシグネチャが一致することはありません。

offset

content キーワードとのみ使用できます。

<number>;

例: content:cgi-bin/phf;offset:4;depth:20;

指定されたペイロードバイト数の後からコンテンツの検索を開始します。このタグはペイロード内の絶対値です。offset タグの後に depth タグを指定すると、depth タグで指定した値以降のマッチ検索が停止されます。depth が指定されていない場合は、ペイロード末尾までマッチ検索を継続します。

distance

content キーワードとのみ使用できます。

<number>;

例: content:"ABC"; content:"DEF"; distance:1;

直前に一致した content の末尾から、指定したバイト数だけ離れた位置から検索を行います。distance タグの後に within タグを使用できます。within タグの値が指定されていない場合は、ペイロード末尾までマッチ検索を継続します。

within

content キーワードとのみ使用できます。

<number>;

例: content: "ABC"; content: "DEF"; within:10;

指定されたペイロードバイト数内にあるコンテンツを検索します。distance タグとともに使用します。

uricontent

uricontent:<content string>;

例: uricontent:"%3F";

正規化された要求の URI フィールドを検索します。バイナリデータは URI 値として定義できます。

isdataat

<value> [,relative];

例: content: "PASS"; isdataat: 50, relative;

ペイロードのデータが指定された場所にあることを確認します。前回のコンテンツマッチの末尾を基準としてデータを検索するように指定することもできます。

pcre

pcre:[!]

(/<regex>/|m/<regex>/)[ismxAEGRUB];

例: pcre:"/BLAH/i";

Perl と互換性のある正規表現を使用してルールを書くことができます。

i: 大文字と小文字を区別しません。

s: メタ文字 (ドット) に改行を含めます。

m: 文字列はデフォルトで単一の長い行として扱われ、^ と $ の照合はこの単一行の冒頭と末尾で行われます。m が設定されると、バッファの冒頭と末尾に加えて、バッファ内の改行の前後でも ^ と $ の照合が行われます。

x: パターン内の空白文字は無視されます (エスケープされた場合や文字クラス内にある場合を除く)。

A: パターン照合がバッファの冒頭でのみ行われます (^ と同じ)。

E: $ の照合が文字列の末尾でのみ行われます。E を指定しない場合、文字列の最後が改行だった場合、その直前の文字に対しても $ の照合が行われます (その他の改行の直前では照合しません)。

G: 量指定子の「貪欲さ」を反転します。つまり、デフォルトでは貪欲ではなく、「?」を後ろに付けたときにはじめて貪欲になります。

R: 最後のパターンマッチの末尾から照合を行います (distance:0; と似ています)。

U: デコードされた URI バッファと照合します(uri キーワードと似ています)。

B: デコードされたバッファを使用しません (raw キーワードと似ています)。

byte_test

<bytes to convert>, [!]<operator>, <value>, <offset> [,relative] [,<endian>] [,<number type>, string]; oct,dec,hex は string とのみ使用されます。

例: msg:"AMD procedure 7 plog overflow"; content:"|00 04 93 F3|"; content:"|00 00 00 07|"; distance: 4.within:4; byte_test:4,>,1000,20,relative;

バイトフィールドを、指定値と演算子でテストします。バイナリ値をテストすることが可能です (バイト文字列の表現をバイナリ値に変換してテストできます)。bytes_to_convert: パケット演算子から取得するバイト数。operator: 値をテストする演算子 (<,>,=,!,&)。

value: 変換された値をテストするための値。

offset: 処理を開始するペイロード内のバイト数。

relative: オフセットの開始位置を、最後のパターンマッチに設定する。

big: データをビッグエンディアンとして処理する。

endian (default) little: データをリトルエンディアンとして処理する。

string: パケット内にデータが文字列形式で格納されている。

hex: 変換後の文字列データを 16進数で表す。

dec: 変換後の文字列データを 10進数で表す。

oct: 変換後の文字列データを 8進数で表す。

byte_jump

<bytes_to_convert>, <offset> [,relative] [,multiplier <multiplier value>] [,big] [,little][,string] [,hex] [,dec] [,oct] [,align] [,from_beginning]; oct,dec,hex は string とのみ使用されます。

例: content:"|00 00 00 01|"; distance: 4; within: 4; byte_jump: 4,12,relative,align

bytes_to_convert: パケットから取得するバイト数。multiplier value: 計算されたバイト数にこの値を掛けて、そのバイト数の分だけ前方向にスキップする。

operator: 値をテストする演算子 (<,>,=,!,&)。

value: 変換された値をテストするための値。

offset: 処理を開始するペイロード内のバイト数。

relative: オフセットの開始位置を、最後のパターンマッチに設定する。

big: データをビッグエンディアンとして処理する。

endian (default) little: データをリトルエンディアンとして処理する。

string: パケット内にデータが文字列形式で格納されている。

hex: 変換後の文字列データを 16進数で表す。

dec: 変換後の文字列データを 10進数で表す。

oct: 変換後の文字列データを 8進数で表す。

align: 変換されたバイト数を次の 32 ビット境界に切り上げる。

from_beginning: パケットの現在の場所からではなく、パケットの冒頭から前方向へスキップする。

ttl

<number>;><number>;<<number>;

IP time-to-live の値を指定値と比較します。

tos

<number>;

IP TOS フィールドを指定値と比較します。

id

<number>;

IP ID フィールドを指定値を比較します。

ipopts

{rr | eol | nop | ts | sec | lsrr |ssrr | satid | any}

rr: IP RR (record route) オプションがあるかどうかを確認する。

eol: IP EOL (end of list) オプションがあるかどうかを確認する。

nop: IP NOP (no op) オプションがあるかどうかを確認する。

ts: IP TS (time stamp) オプションがあるかどうかを確認する。

sec: IP SEC (IP security) オプションがあるかどうかを確認する。

lsrr :IP LSRR (loose source routing) オプションがあるかどうかを確認する。

ssrr :IP SSRR (strict source routing) オプションがあるかどうかを確認する。

satid: IP SATID (stream identifier) オプションがあるかどうかを確認する。

any: IP のなんらかのオプションがあるかどうかを確認する。

fragoffset

<number>;

IP フラグメントオフセットフィールドと 10進数値を比較します。

fragbits

[+*!]<[MDR]>;

IP ヘッダーで IP フラグメントビットや予約済みビットが設定されているかどうかを確認します。

M: More Fragments (フラグメントが続く) ビット。

D: Don’t Fragment (フラグメント化禁止)ビット。

R: Reserved (予約済み) ビット。

+: 指定したビット (およびその他のビット) がある。

*: 指定したビットのいずれかが設定されている。

!: 指定したビットが設定されていない。

dsize

[<|>] <number>[ <> number];

例: dsize:300<>400;

パケットのペイロードサイズをテストします。data_size が指定されている場合、パケット再構成は自動的にオフになります。したがって、data_size および only_stream 値が設定されているシグニチャは不正です。

dsize は、ペイロードのサイズに関係なく、ストリームを再構築したパケットではエラーとなります。

flags

[!|*|+]<FSRPAU120>[,<FSRPAU120>];

例: flags:SF,12

パケット内で照合する TCP フラグを指定します。

S: SYN フラグを照合する。

A: ACK フラグを照合する。

F: FIN フラグを照合する。

R: RST フラグを照合する。

U: URG フラグを照合する。

P:PSH フラグを照合する。

1: 予約済みビットを照合する。

1 2: 予約済みビットを照合する。

2 0: TCP フラグがいっさい設定されていない。

+: 指定したビット (およびその他のビット) がある。

*: 指定したビットのいずれかが設定されている。

!: 指定したビットが設定されていない。

flow

to_client|to_server|from_client| from_server ];established;bi_direction;[no_stream|only_stream];

TCP のみ。to_server の値は from_client の値と同じです。to_client の値は from_server の値と同じです。bi_direction タグは、シグネチャを双方向のトラフィックと一致させます。

たとえば、--dst_port 80 と bi_direction セットを含むシグネチャがある場合、そのシグネチャはポート 80 への/からのトラフィックを確認します。

seq

<number>;

指定された TCP シーケンス番号を確認します。

ack

<number>;

指定された TCP ACK (確認応答) 番号を確認します。

window

<number>;

指定された TCP ウィンドウサイズを確認します。

itype

[<|>]<number>[<>number];

照合する ICMP の種類を指定します。

icode

[<|>]<number>[<>number];

照合する ICMP コードを指定します。

icmp_id

<number>;

指定された ICMP ID 値を確認します。

icmp_seq

<number>;

指定された ICMP シーケンス値を確認します。

rpc

<application number>,[<version number>|*],[<procedure number>|*>;

SUNRPCCALL 要求内の RPC アプリケーション番号、バージョン番号、プロシージャ番号を確認します。バージョン番号とプロシージャ番号には、ワイルドカード (*) を使用できます。

ip_proto

<number>;[!]<number>;><number>;<<number>;

IP プロトコルヘッダーを確認します。

samip

NULL

送信元と宛先が同じ IP アドレスを所有しています。