Skip to content

Commit

Permalink
Merge pull request #553 from Yamato-Security/add-unsupported-modifier…
Browse files Browse the repository at this point in the history
…s-to-readme

add list of unsupported modifiers
  • Loading branch information
YamatoSecurity authored Dec 19, 2023
2 parents bd1fe11 + 2e86adc commit 439a20b
Show file tree
Hide file tree
Showing 2 changed files with 65 additions and 30 deletions.
49 changes: 34 additions & 15 deletions README-Japanese.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@
- [EventDataの例外的なパターン](#eventdataの例外的なパターン)
- [同じ名前の複数のフィールド名からフィールドデータを出力する](#同じ名前の複数のフィールド名からフィールドデータを出力する)
- [パイプ修飾子 (Pipe Modifiers)](#パイプ修飾子-pipe-modifiers)
- [対応しているSigmaのパイプ修飾子](#対応しているsigmaのパイプ修飾子)
- [追加のパイプ修飾子](#追加のパイプ修飾子)
- [対応していないパイプ修飾子](#対応していないパイプ修飾子)
- [ワイルドカード](#ワイルドカード)
- [イベントキー内のキーワードのネスト](#イベントキー内のキーワードのネスト)
- [regexesとallowlistキーワード](#regexesとallowlistキーワード)
Expand Down Expand Up @@ -460,9 +463,13 @@ detection:

もし、最初の`Data`フィールドのデータだけを出力したい場合は、`details:`に `%Data[1]%` を指定すると `rundll32.exe`のみが出力されます。



## パイプ修飾子 (Pipe Modifiers)

イベントキーにはパイプ修飾子を指定することができます。ここまで説明した書き方では完全一致しか表現できませんでしたが、パイプを使うことでより柔軟な検知ルールを記載できるようになります。以下の例では、ある`Data`フィールドの値に`EngineVersion=2`という文字列が入っている場合、条件にマッチすることになります。
イベントキーにはパイプ修飾子を指定することができます。
ここまで説明した書き方では完全一致しか表現できませんでしたが、パイプを使うことでより柔軟な検知ルールを記載できるようになります。
以下の例では、ある`Data`フィールドの値に`EngineVersion=2`という文字列が入っている場合、条件にマッチすることになります。

```yaml
detection:
Expand All @@ -473,26 +480,18 @@ detection:
condition: selection
```

パイプには以下のキーワードを指定できます。v1の時点で複数のパイプを連結することはできません。
通常は大文字小文字を区別しませんが、`|re`もしくは`|equalsfield`のキーワードを指定した場合は大文字小文字を区別します。

- `|startswith`: 指定された文字列で始まることをチェックします。
- `|endswith`: 指定された文字列で終わることをチェックします。
### 対応しているSigmaのパイプ修飾子

- `|base64offset|contains`: データは、エンコードされた文字列内の位置によって、3つの異なる方法でbase64にエンコードされます。この修飾子は、文字列を3つのバリエーションにエンコードし、その文字列がbase64文字列のどこかにエンコードされているかどうかをチェックします。
- `|cidr`: IPv4またはIPv6のCIDR表記をチェックします。(例:`192.0.2.0/24`)
- `|contains`: 指定された文字列が含まれることをチェックします。
- `|contains|all`: 指定された複数の文字列が含まれることをチェックします。

この例では、`ForEach`と`Xor`という文字列の両方が`CommandLine`フィールドに存在する必要があります:
```
CommandLine|contains|all:
- ForEach
- Xor
```

- `|startswith`: 指定された文字列で始まることをチェックします。
- `|endswith`: 指定された文字列で終わることをチェックします。
- `|re`: 正規表現を使用します。(正規表現の書き方については <https://docs.rs/regex/latest/regex/#syntax> を参照してください)。
> 注意: SigmaルールとHayabusaルールは正規表現の記法に一部差異があります。そのため、HayabusaではSigmaルールを正しく検知できない場合があります。
- `|equalsfield`: 指定されたイベントキーと合致することをチェックします。2つのフィールドの値が一致しないことをチェックしたい場合は`condition`で`not`を使ってください。
- `|endswithfield`: 指定されたイベントキーが指定された文字列で終わることをチェックします。指定されたイベントキーが指定された文字列で終わらないことをチェックしたい場合は`condition`で`not`を使ってください。
- `|base64offset|contains`: データは、エンコードされた文字列内の位置によって、3つの異なる方法でbase64にエンコードされます。この修飾子は、文字列を3つのバリエーションにエンコードし、その文字列がbase64文字列のどこかにエンコードされているかどうかをチェックします。
- `'|all':`: このパイプ修飾子は、特定のフィールドに適用されるのではなく、すべてのフィールドに適用されるため、上記の修飾子とは異なります。

この例では、`Keyword-1`と`Keyword-2`という文字列の両方が存在する必要がありますが、任意のフィールドのどこにでも存在できます:
Expand All @@ -505,6 +504,26 @@ detection:
condition: keywords
```

### 追加のパイプ修飾子

以下の修飾子はsigmaの仕様にはないが、特殊な使用例のために追加されたものであります:

- `|equalsfield`: 指定されたイベントキーと合致することをチェックします。2つのフィールドの値が一致しないことをチェックしたい場合は`condition`で`not`を使ってください。
- `|endswithfield`: 指定されたイベントキーが指定された文字列で終わることをチェックします。指定されたイベントキーが指定された文字列で終わらないことをチェックしたい場合は`condition`で`not`を使ってください。


## 対応していないパイプ修飾子

以下の修飾子は、現在サポートされていないため、Sigmaリポジトリでこれらの修飾子を使用するルールは含まれていません:

- `expand`
- `gt`
- `gte`
- `lt`
- `lte`
- `utf16 / utf16le / utf16be / wide`
- `windash`

## ワイルドカード

Hayabusaルールではワイルドカードを使用することができます。以下の例では、`ProcessCommandLine` が "malware" という文字列で始まる場合、このルールでログが検知されます。この仕様はSigmaルールのワイルドカードと同じく、大文字小文字を区別しません。
Expand Down
46 changes: 31 additions & 15 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,9 @@ This is the repository for [hayabusa](https://github.com/Yamato-Security/hayabus
- [Abnormal patterns in EventData](#abnormal-patterns-in-eventdata)
- [Outputting field data from multiple field names with the same name](#outputting-field-data-from-multiple-field-names-with-the-same-name)
- [Pipe Modifiers](#pipe-modifiers)
- [Supported Sigma Pipe Modifiers](#supported-sigma-pipe-modifiers)
- [Extra Pipe Modifiers](#extra-pipe-modifiers)
- [Unsupported Pipe Modifiers](#unsupported-pipe-modifiers)
- [Wildcards](#wildcards)
- [Nesting keywords inside eventkeys](#nesting-keywords-inside-eventkeys)
- [regexes and allowlist keywords](#regexes-and-allowlist-keywords)
Expand Down Expand Up @@ -462,7 +465,9 @@ If you want to print out just the first `Data` field data, you can specify `%Dat

## Pipe Modifiers

A pipe can be used with eventkeys as shown below for matching strings. All of the conditions we have described so far use exact matches, but by using pipe modifiers, you can describe more flexible detection rules. In the following example, if a value of `Data` contains the string `EngineVersion=2`, it will match the condition.
A pipe can be used with eventkeys as shown below for matching strings.
All of the conditions we have described so far use exact matches, but by using pipe modifiers, you can describe more flexible detection rules.
In the following example, if a value of `Data` contains the string `EngineVersion=2`, it will match the condition.

```yaml
detection:
Expand All @@ -473,26 +478,18 @@ detection:
condition: selection
```

This is a list of what you can specify after the pipe. At the moment, hayabusa does not support chaining multiple pipes together.
String matches are case insensitive. However, they become case sensitive whenever `|re` or `|equalsfield` are used.

- `|startswith`: Checks the string from the beginning
- `|endswith`: Checks the end of the string
### Supported Sigma Pipe Modifiers

- `|base64offset|contains`: Data will be encoded to base64 in three different ways depending on its position in the encoded string. This modifier will encoded a string to all three variations and check if the string is encoded somewhere in the base64 string.
- `|cidr`: Matches on a IPv4 or IPv6 CIDR notation (Ex: `192.0.2.0/24`)
- `|contains`: Checks if a word is contained in the data
- `|contains|all`: Checks if multiple words are contained in the data

In this example, both `ForEach` and `Xor` strings need to be present in the `CommandLine` field:
```
CommandLine|contains|all:
- ForEach
- Xor
```

- `|startswith`: Checks the string from the beginning
- `|endswith`: Checks the end of the string
- `|re`: Use regular expressions. (We are using the regex crate so please out the documentation at <https://docs.rs/regex/latest/regex/#syntax> to learn how to write correct regular expressions.)
> Caution: Regular expression syntax in sigma rules is still not defined so some sigma rules may not match correctly if they differ from the Rust regex syntax.
- `|equalsfield`: Check if two fields have the same value. You can use `not` in the `condition` if you want to check if two fields are different.
- `|endswithfield`: Check if the field on the left ends with the string of the field on the right. You can use `not` in the `condition` if they are different.
- `|base64offset|contains`: Data will be encoded to base64 in three different ways depending on its position in the encoded string. This modifier will encoded a string to all three variations and check if the string is encoded somewhere in the base64 string.
- `'|all':`: This pipe modifier is different from those above because it does not get applied to a certain field but to all fields.

In this example, both strings `Keyword-1` and `Keyword-2` need to exist but can exist anywhere in any field:
Expand All @@ -505,6 +502,25 @@ detection:
condition: keywords
```

### Extra Pipe Modifiers

The following modifiers are not in the sigma specification but have been added for very specific use cases.

- `|equalsfield`: Check if two fields have the same value. You can use `not` in the `condition` if you want to check if two fields are different.
- `|endswithfield`: Check if the field on the left ends with the string of the field on the right. You can use `not` in the `condition` if they are different.

## Unsupported Pipe Modifiers

The following modifiers are currently not supported so we do not include any rules from the sigma repository that use them:

- `expand`
- `gt`
- `gte`
- `lt`
- `lte`
- `utf16 / utf16le / utf16be / wide`
- `windash`

## Wildcards

Wildcards can be used in eventkeys. In the example below, if `ProcessCommandLine` starts with the string "malware", the rule will match.
Expand Down

0 comments on commit 439a20b

Please sign in to comment.