YARA-L 2.0 總覽

YARA-L 2.0 是一種電腦語言,用於在企業記錄檔資料中擷取您的企業記錄檔資料,供使用者搜尋。YARA-L 語法衍生自 VirusTotal 開發的 YARA 語言。該語言與 Chronicle Detection Engine 搭配使用,可讓你在大量資料中搜尋威脅和其他事件。另請參閱 YARA-L 2.0 語言語法

規則結構

對於 YARA-L 2,您必須指定下列順序的變數宣告、定義和用法:

  1. 中繼
  2. 事件
  3. 比對 (選用)
  4. 條件

下列說明規則的一般結構:

rule <rule Name>
{
  meta:
    // Stores arbitrary key-value pairs of rule details, such as who wrote
    // it, what it detects on, version control, etc.
    // Identical to the meta section in YARA-L.
    //
    // For example:
    // author = "Analyst #2112"
    // date = "08/09/2020"
    // description = "suspicious domain detected"

  events:
    // Conditions to filter events and the relationship between events.

  match:
    // Values to return when matches are found.

  condition:
    // Condition to check events and the variables used to find matches.
}

YARA-L 2.0 範例規則

以下範例顯示以 YARA-L 2.0 編寫的規則。每個規則都會示範如何在規則語言中建立事件的關聯。

來自不同城市的登入資訊

下列規則會搜尋在 5 分鐘內,從兩個以上的城市登入您的企業的使用者:

rule DifferentCityLogin {
  meta:

  events:
    $udm.metadata.event_type = "USER_LOGIN"
    $udm.principal.user.userid = $user
    $udm.principal.location.city = $city

  match:
    $user over 5m

  condition:
    #city > 1
}

比對變數$user

事件變數$udm

預留位置變數$city $user

以下說明這項規則的運作方式:

  • 找出具有使用者名稱 ($user) 的群組,並在找到相符項目時傳回活動 ($user)。
  • 時間範圍為 5 分鐘,也就是說,只有不到 5 分鐘的事件才會建立關聯。
  • 搜尋事件類型為「USER_LOGIN」的事件群組 ($udm)。
  • 而對於這個事件群組,規則會將使用者 ID 顯示為 $user,並將登入城市 ID 顯示為 $city.
  • 如果事件群組 ($udm) 中的 $city 值數量超過 5 分鐘,則傳回相符項目。

快速建立和刪除

以下規則會搜尋已建立 4 小時,之後又在 4 小時內刪除的使用者:

  rule UserCreationThenDeletion {
  meta:

  events:
    $create.target.user.userid = $user
    $create.metadata.event_type = "USER_CREATION"

    $delete.target.user.userid = $user
    $delete.metadata.event_type = "USER_DELETION"

    $create.metadata.event_timestamp.seconds <=
       $delete.metadata.event_timestamp.seconds

  match:
    $user over 4h

  condition:
    $create and $delete
}

事件變數$create$delete

比對變數$user

預留位置變數:不適用

以下說明這項規則的運作方式:

  • 找出具有使用者名稱 ($user) 的群組,並在找到相符項目時傳回活動 ($user)。
  • 時間範圍為 4 小時,表示系統只會將小於 4 小時的事件建立關聯。
  • 搜尋兩個事件群組 ($create$delete,其中 $create 等於 #create >= 1)。
  • $create 對應至 USER_CREATION 事件,並呼叫使用者 ID 為 $user
  • $user 可用來同時使用兩個群組。
  • $delete 對應至 USER_DELETION 事件,並呼叫使用者 ID 為 $user。這項規則會找出兩個事件群組中的使用者 ID 是否相同。
  • 這項規則會找出「$delete」的活動發生時間晚於「$create」的活動,並於發現時傳回相符項目。

單一事件或多重事件

以下規則範例說明如何建立規則來搜尋單一事件,並依規則修改適用於多個活動。

規則的單一事件版本如下:

rule SingleEventRule {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"

  condition:
    $e
}

這項規則只是搜尋使用者登入事件,將會傳回儲存在 Chronicle 帳戶中的企業資料中的第一個事件。

以下是規則的多重事件版本:

rule MultiEventRule {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.metadata.event_type = "USER_LOGIN"
    $e.principal.user.userid = $user

  match:
    $user over 10m

  condition:
    #e >= 10
}

規則會搜尋至少 10 分鐘內登入至少 10 次的使用者。

IP 位址範圍內的單一事件

以下範例顯示的單一事件規則會在兩個特定使用者與特定 IP 位址範圍之間進行比對:

rule OrsAndNetworkRange {
  meta:
    author = "noone@altostrat.com"

  events:
    // Checks CIDR ranges.
    net.ip_in_range_cidr($e.principal.ip, "203.0.113.0/24")

    // Detection when the hostname field matches either value using or.
    $e.principal.hostname = /pbateman/ or $e.principal.hostname = /sspade/

  condition:
    $e
}

重複欄位

以下範例說明重複欄位的概念。udm.principal.ip 欄位通常以陣列表示。

舉例來說,主機可以有多個 IP 位址:

principal.ip [192.0.2.5, 198.51.100.10, 192.0.2.16]

如果您在規則中加入以下聲明:

$e.principal.ip = "192.0.2.16"

Chronicle 在陣列中搜尋這個 IP 位址 (這個範例中會顯示此位址)。這個陳述式不表示主機只有一個 IP 位址。

以下規則會搜尋來源 IP 位址已連線至目標 IP 位址的事件,同時會在不到一分鐘內對超過 50 個不同目標通訊埠提出要求。這通常是惡意網路搜尋服務中的惡意實體。

rule RepeatedFieldsRuleExample {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.principal.ip = $source_ip
    $e.target.ip = $target_ip
    $e.target.port = $target_port

  match:
    $source_ip, $target_ip over 1m

  condition:
    #target_port > 50
}

規則中的規則運算式

以下 YARA-L 2.0 規則運算式範例會搜尋從 altostrat.com 網域收到的電子郵件。由於 nocase 已新增至 $host 變數 regex 比較和 regex 函式,因此兩者比較不會區分大小寫。

rule RegexRuleExample {
  meta:
    author = "noone@altostrat.com"

  events:
    $e.principal.hostname = $host
    $host = /.*HoSt.*/ nocase
    re.regex($e.network.email.from, `.*altostrat\.com`) nocase

  match:
    $host over 10m

  condition:
    #e > 10
}

YARA-L 滑動視窗

根據預設,YLAA-L 2.0 規則會使用躍點視窗來進行評估。企業事件資料範圍會分成一組重疊的重疊時間區間,每個時間區間都位於「match」區段中指定的持續時間。接著,各個躍躍期期間的相關事件就會建立關聯。使用躍躍期視窗,則無法搜尋依特定順序發生的事件 (例如,e1e2 分鐘後發生 2 分鐘)。事件 e1 和發生次數為 e2 的事件,前提是兩者的時間長度都間隔在一起。

此外,您也可以利用滑動視窗評估規則。透過滑動窗口,在開始或結束指定的資料透視表事件變數時,就會產生 match 區段中指定的時間區間。然後,每個滑動窗體內的事件相互關聯。讓使用者搜尋依照特定順序發生的事件 (例如e1都是在e2)。事件發生次數e1事件發生次數e2 與事件相關e1發生在活動結束後e2,才能使用 Android 手機或平板電腦尋找另一部裝置。

滑動時間區間規則語法

在規則的「符合」部分中指定滑動時間區間,如下所示:

<match-variable-name-1><match-variable-name-2>、... over <sliding-window- duration> before|after <pivot-event-variable-name>

資料透視表事件變數是滑動時間區間依據的事件變數。如果您使用 before 關鍵字,系統會產生滑動時間區間,並在發生資料透視表事件每次發生時結束。如果使用 after 關鍵字,系統會在每次資料透視表事件發生時產生滑動視窗。

滑動時間區間規則範例

以下 YARA-L 2.0 滑動視窗範例會搜尋 firewall_1 事件之後沒有 firewall_2 事件。after 關鍵字會搭配資料透視表事件變數 $e1 使用,藉此指定在對應事件時,每 firewall_1 個事件都至少要經過 10 分鐘。

rule SlidingWindowRuleExample {
  meta:
    author = "noone@google.com"

  events:
    $e1.metadata.product_name = "firewall_1"
    $e1.principal.hostname = $host

    $e2.metadata.product_name = "firewall_2"
    $e2.principal.hostname = $host

  match:
    $host over 10m after $e1

  condition:
    $e1 and !$e2
}