LoginSignup
0
0

More than 3 years have passed since last update.

Snort 3.0.3はルールセットv3.0と互換性がない

Posted at

Snort 3.0.2を使いましょう。

問題

OSSのNIDSであるSnortを公式のドキュメント通りにUbuntu 18.04で動かそうとしたが失敗。

具体的にはRegisteredのルールセットを使ったところsnort -c /usr/local/etc/snort/snort.luaundefined variable name: RULE_PATHなどとエラーが出る。おそらくこの記事の症状と同じだろう。

原因

Snortのコード(masterの最新)を見ると、src/parser/vars.ccVarSearch()で変数の名前解決が行われているようだ。

変数のテーブルとしては、get_ips_policy()で得られたIpsPolicyから以下の3つが参照されている。

  • var_table
  • portVarTable
  • ip_vartable

最も一般的らしきvar_tableについて探ると、同じファイルのParsePathVar()で値を設定している。これはIpsModule::setだけが呼んでいいて、設定ファイルのipsブロック下のvariables.paths内で定義されたものが渡されているようだ。

実際、snort.luaipsへ以下のようにvariablesを追加するとRULE_PATHのエラーは解消された。

ips =
{
    variables = {
        paths = {
            RULE_PATH = '../',
        }
    },
    rules = [[
        -- ...
    ]]
}

luaディレクトリ下のファイルを見てもRULE_PATHなどをグローバル変数ではなくこのように設定していて、3.0.3で変更が加えられている。

一方でSnort 3.0.2-6のコードを見ると、src/managers/module_manager.ccset_string()などがLuaでの変数定義を処理している(finalize.luaでLua側から各グローバル変数についてこうした関数を呼んでいるようだ)。

ここからset_value() -> set_var() -> SetVar()と流れて、RULE_PATHの場合はPATHのサフィックスによりAddVarToTable() -> VarDefine()となってvar_tableへ追加されるのが確認できる。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0