見出し画像

TWLogEye開発24日目:Sigmaルールの読み込みエラーを自動修正する処理ができて嬉しい

今朝は4時に自力で起きました。助手の猫さんは1階の自分のベッドで寝ていました。コーヒーを淹れていると迷惑そうな顔で、こっちを見ていました。6時前ですが、まだ寝ているようです。

昨日、作っていたSigmaルールの読み込みエラーを自動修正処理の続きです。48件中4件だけ何故かエラーが消えない問題を調べました。

selection_img and (all of selection_susp_1_* or selection_susp_2)

のような感じのものがエラーになっています。(がだめなのかと思って、スペースいれてみたり、and or などの順番を変えてみたり試行錯誤して何度か試している時にエラーの数が実行する毎に変わることに気づきました。エラーが0になることもありました。
先代の助手の猫が天から
「プログラマー探偵の出番では?」
と言っているようです。
エラーになる時の自動修正後の文字列を見て驚きました。

selection_img and (all of selection_susp_1_* or selection_susp_c)

selection_susp_1_*の部分が残っています。
selection_susp_2はselection_susp_cに変換されています。
ここで、謎が解けました。

先にselection_img and (all of selection_susp_1_* or selection_susp_2)の部分のselection_susp_2をselection_susp_cに変換してしまうために、
selection_susp_1_*の部分が残ってしまったのです。
Go言語mapの繰り返し処理は順番が固定ではないので、たまたま、selection_susp_2の変換が先の時は、エラー、後の時はエラーなし
になっていたのでした。

変換する処理は文字列の長い順固定で行うように修正しました。

func autoFixSigmaRule(c []byte, r sigma.Rule) (sigma.Rule, error) {
	var rule map[string]interface{}
	if err := yaml.Unmarshal(c, &rule); err != nil {
		return r, err
	}
	numReg := regexp.MustCompile(`\d+`)
	replaceMap := make(map[string]string)
	keys := []string{}
	for k, v := range rule {
		if k == "detection" {
			if m, ok := v.(map[string]interface{}); ok {
				for dk, dv := range m {
					if dk == "condition" {
						if cs, ok := dv.(string); ok {
							a := []string{}
							for _, f := range strings.Fields(cs) {
								if f != "1" && numReg.MatchString(f) {
									f = convertNumberToAlpha(f)
								}
								a = append(a, f)
							}
							replaceMap[cs] = strings.Join(a, " ")
							keys = append(keys, cs)
						}
					} else if numReg.MatchString(dk) {
						replaceMap[dk] = convertNumberToAlpha(dk)
						keys = append(keys, dk)
					}
				}
			}
		}
	}
	// ここで、置き換える元の文字を長い順にソートする
	sort.Slice(keys, func(i, j int) bool {
		return len(keys[i]) > len(keys[j])
	})
	s := string(c)
	for _, k := range keys {
		s = strings.ReplaceAll(s, k, replaceMap[k])
	}
	return sigma.ParseRule([]byte(s))
}

sortの部分です。
これでスッキリ解決しました。何度実行してもエラーは0件です。

とりあえず、目的の機能はできたので、こんどこそ、リリースの準備ができます。

明日に続く


いいなと思ったら応援しよう!

twsnmp
開発のための諸経費(機材、Appleの開発者、サーバー運用)に利用します。 ソフトウェアのマニュアルをnoteの記事で提供しています。 サポートによりnoteの運営にも貢献できるのでよろしくお願います。