YARA-L 2.0-Sprachsyntax

In diesem Abschnitt werden die wichtigsten Elemente der YARA-L-Syntax beschrieben. Weitere Informationen finden Sie unter YARA-L 2.0.

Regelstruktur

Bei YARA-L 2.0 müssen Variablenvariablen, Definitionen und Nutzungen in folgender Reihenfolge angegeben werden:

  1. Meta
  2. Veranstaltungen
  3. Übereinstimmung (optional)
  4. Ergebnis (optional)
  5. Bedingung
  6. Optionen (optional)

Nachfolgend sehen Sie die allgemeine Struktur einer Regel:

rule <rule Name>
{
  meta:
    // Stores arbitrary key-value pairs of rule details, such as who wrote
    // it, what it detects on, version control, etc.

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

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

  outcome:
    // Additional information extracted from each detection.

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

  options:
    // Options to turn on or off while executing this rule.
}

Kommentare

Bestimme Kommentare mit zwei Schrägstrichen (// comment) oder mehrzeiligen Kommentaren, die bei Verwendung von Schrägstrichen (/* comment */) gleich sind, wie bei C.

Konstanten

Es werden Konstanten, Strings, boolesche und Konstanten unterstützt.

String- und Regex-Konstanten

Sie können Strings in YARA-L 2.0 mit einem der folgenden Anführungszeichen umschließen. Zitierter Text wird jedoch je nachdem, welchen Sie verwenden, unterschiedlich interpretiert.

  1. Doppelte Anführungszeichen ("): Für normale Strings verwenden. Muss Escape-Zeichen enthalten.
    Beispiel: &hellot;hello\tworld"—\t wird als Tab interpretiert.

  2. Zurückgestellte Anführungszeichen (`): Wenn Sie diese Option auswählen, werden alle Zeichen wortgetreu ausgewertet.
    Beispiel: „hello\tworld“ –\t wird nicht als Tab interpretiert

Für reguläre Ausdrücke haben Sie zwei Möglichkeiten.

Wenn Sie reguläre Ausdrücke direkt ohne die Funktion re.regex() nutzen möchten, verwenden Sie /regex/ für die Konstanten für reguläre Ausdrücke.

Sie können String-Konstanten auch als Regex-Konstanten verwenden, wenn Sie die Funktion re.regex() verwenden. Bei String-Konstanten mit doppelten Anführungszeichen müssen Sie umgekehrte Schrägstriche mit umgekehrten Schrägstrichen maskieren.

Die folgenden regulären Ausdrücke können beispielsweise verwendet werden:

  • re.regex($e.network.email.from, `.*altostrat\.com`)
  • re.regex($e.network.email.from, ".*altostrat\\.com")
  • $e.network.email.from = /.*altostrat\\.com/

Zur besseren Lesbarkeit empfiehlt Google die Verwendung von hinten Anführungszeichen in Strings in regulären Ausdrücken.

Operatoren

Du kannst folgende Operatoren in YARA-L verwenden:

Operator: Beschreibung
= Gleich/deklaration
!= nicht gleich
< ist kleiner als
<= ist kleiner oder gleich
> ist größer als
>= ist größer oder gleich

Variablen

In YARA-L 2.0 werden alle Variablen als $<variable name> dargestellt.

Sie können die folgenden Variablentypen definieren:

  • Ereignisvariablen: stellen Gruppen von Ereignissen in normalisierter Form (UDM) oder Entitätsereignisse dar. Geben Sie im Abschnitt events Bedingungen für Ereignisvariablen an. Ereignisvariablen werden mithilfe eines Namens, einer Ereignisquelle und von Ereignisfeldern identifiziert. Zulässige Quellen sind udm (für normalisierte Ereignisse) und graph (Entitätsereignisse). Falls die Quelle weggelassen wird, wird udm als Standardquelle festgelegt. Ereignisfelder werden als Kette des Namens .<field name> dargestellt (z. B. $e.field1.field2). Ereignisfeldketten bilden immer eine Quelle der obersten Ebene (UDM oder Entität).

  • Übereinstimmungsvariablen: Deklarieren Sie im Abschnitt match. Übereinstimmungsvariablen werden zu Gruppierungsfeldern für die Abfrage, da für jeden eindeutigen Satz von Übereinstimmungsvariablen (und für jedes Zeitfenster) eine Zeile zurückgegeben wird. Wenn die Regel eine Übereinstimmung findet, werden die Übereinstimmungsvariablen zurückgegeben. Geben Sie an, wofür die einzelnen Übereinstimmungsvariablen im Abschnitt events stehen.

  • Platzhaltervariablen: Deklarieren und definieren Sie im Abschnitt events. Platzhaltervariablen ähneln Variablen. Sie können jedoch im Abschnitt condition Platzhaltervariablen verwenden, um Übereinstimmungsbedingungen anzugeben.

Verwenden Sie Übereinstimmungs- und Platzhaltervariablen, um Beziehungen zwischen Ereignisfeldern über vorübergehende Bedingungen zum Zusammenführen zu ermitteln. Weitere Informationen zur Syntax von Ereignisabschnitten

Funktionen

In diesem Abschnitt werden die YARA-L 2.0-Funktionen beschrieben, die von Chronicle in Detect Engine unterstützt werden.

Diese Funktionen können in den folgenden Bereichen einer Regel verwendet werden:

  • Abschnitt „events“.
  • BOOL_CLAUSE einer Bedingung im Bereich Ergebnis.

Stringfunktionen

Chronicle unterstützt die folgenden Stringbearbeitungsfunktionen:

  • Strings.concat(a, b)
  • Strings.to_lower(stringText)
  • Strings.to_upper(StringText)
  • Strings.base64_decode(encodedString)

In den folgenden Abschnitten wird die Verwendung dieser beiden Funktionen beschrieben.

Verkettete Strings oder Ganzzahlen

Gibt die Verkettung von zwei Strings, zwei Ganzzahlen oder einer Kombination aus beiden zurück.

strings.concat(a, b)

Diese Funktion verwendet zwei Argumente, die entweder Strings oder Ganzzahlen sein können, und gibt die beiden Werte zurück, die als String verkettet sind. Ganzzahlen werden vor der Verkettung in einen String umgewandelt. Die Argumente können Literale oder Ereignisfelder sein. Wenn beide Argumente Felder sind, müssen die beiden Attribute aus demselben Ereignis stammen.

Das folgende Beispiel enthält eine Stringvariable und ein String-Literal als Argumente.

"google-test" = strings.concat($e.principal.hostname, "-test")

Das folgende Beispiel enthält eine Stringvariable und eine Ganzzahlvariable als Argumente. Sowohl Principal.hostname als auch Principal.port stammen aus demselben Ereignis ($e) und werden verkettet, um einen String zurückzugeben.

"google80" = strings.concat($e.principal.hostname, $e.principal.port)

Im folgenden Beispiel wird die Verknüpfung von Principal.port aus Ereignis $e1 mit Principal.hostname aus Ereignis $e2 versucht. Er gibt einen Compiler-Fehler zurück, da die Argumente unterschiedliche Ereignisvariablen sind.

// returns a compiler error
"test" = strings.concat($e1.principal.port, $e2.principal.hostname)

String in Groß- oder Kleinschreibung konvertieren

Diese Funktionen geben Stringtext zurück, nachdem alle Zeichen in Groß- oder Kleinschreibung geändert wurden.

  • Strings.to_lower(stringText)
  • Strings.to_upper(StringText)
"test@google.com" = strings.to_lower($e.network.email.from)
"TEST@GOOGLE.COM" = strings.to_upper($e.network.email.to)

Base64-Decodierung eines Strings

Gibt einen String zurück, der die base64-decodierte Version des codierten Strings enthält.

strings.base64_decode(encodedString)

Diese Funktion verwendet einen base64-codierten String als Argument. Wenn encodedString kein gültiger base64-codierter String ist, gibt die Funktion den codierten String unverändert zurück.

Dieses Beispiel gibt „True“ zurück, wenn „Principal.domain.name“ "dGVzdA==" ist, bei dem es sich um eine Base64-Codierung für den String „&"“ handelt.

"test" = strings.base64_decode($e.principal.domain.name)

Regex-Funktionen

Chronicle unterstützt die folgenden Funktionen für reguläre Ausdrücke:

  • re.Regex(stringText, Regex)
  • re.discovery(stringText, Regex)
  • re.replace(stringText, replaceRegex, replaceText)

Regex-Übereinstimmung

Sie können den Abgleich mit regulären Ausdrücken in YARA-L 2.0 mit einer der folgenden Syntax definieren:

  • YARA-Syntax verwenden: Dies bezieht sich auf Ereignisse. Im Folgenden finden Sie eine allgemeine Darstellung dieser Syntax: $e.field = /regex/
  • YARA-L-Syntax verwenden: Dabei werden folgende Parameter verwendet:
    • Feld, auf das der reguläre Ausdruck angewendet wird.
    • Regulärer Ausdruck als String. Wenn nocase verwendet wird, lässt sich die Groß- und Kleinschreibung ignorieren. Im Folgenden finden Sie eine allgemeine Darstellung dieser Syntax: re.regex($e.field, `regex`)

Beachten Sie beim Definieren regulärer Ausdrücke in YARA-L 2.0 Folgendes:

  • In beiden Fällen lautet das Prädikat „wahr“, wenn der String einen Teilstring enthält, der dem angegebenen regulären Ausdruck entspricht. Es ist nicht erforderlich, .* am Anfang oder Ende des regulären Ausdrucks einzufügen.
  • Falls Sie nach dem genauen String oder nur einem Präfix oder Suffix suchen möchten, fügen Sie die Ankerzeichen ^ (Anfang) und $ (Ende) in den regulären Ausdruck ein. Beispielsweise stimmt /^full$/ genau mit "full" überein, während /full/ mit "fullest", "lawfull" und "joyfully" übereinstimmen könnte.
  • Wenn das UDM-Feld Zeilenumbruchzeichen enthält, stimmt regexp nur mit der ersten Zeile des UDM-Felds überein. Fügen Sie dem regulären Ausdruck ein (?s) hinzu, um den vollständigen UDM-Feldabgleich zu erzwingen. Ersetzen Sie beispielsweise /.*allUDM.*/ durch /(?s).allUDM.*/.

Regex-Erfassung

Erfasst (extrahiert) Daten aus einem String mit dem im Ausdruck angegebenen Muster für reguläre Ausdrücke.

re.capture(stringText, regex)

Diese Funktion verwendet zwei Argumente:

  • stringText: der ursprüngliche String, der gesucht werden soll.
  • Regex: der reguläre Ausdruck, der das Muster angibt, nach dem gesucht werden soll.

Der reguläre Ausdruck kann 0 oder 1 Erfassungsgruppe in Klammern enthalten. Wenn der reguläre Ausdruck 0 Erfassungsgruppen enthält, gibt die Funktion den ersten vollständigen übereinstimmenden Teilstring zurück. Wenn der reguläre Ausdruck 1 Erfassungsgruppe enthält, wird der erste Teilstring für die Erfassungsgruppe zurückgegeben. Wenn Sie zwei oder mehr Erfassungsgruppen definieren, wird ein Compiler-Fehler zurückgegeben.

Wenn in diesem Beispiel $e.Principal.hostname "aaa1bbaa2" enthält, ist Folgendes „True“, da die Funktion die erste Instanz zurückgibt. In diesem Beispiel sind keine Erfassungsgruppen vorhanden.

"aaa1" = re.capture($e.principal.hostname, "a+[1-9]")

In diesem Beispiel wird alles nach dem @-Symbol in einer E-Mail erfasst. Wenn das Feld $e.network.email.from test@google.com ist, gibt das Beispiel google.com zurück. Dieses Beispiel enthält eine Erfassungsgruppe.

"google.com" = re.capture($e.network.email.from , "@(.*)")

Regex-Ersatz

Führt einen Ersatz für reguläre Ausdrücke durch.

re.replace(stringText, replaceRegex, replacementText)

Diese Funktion verwendet drei Argumente:

  • stringText: der ursprüngliche String.
  • Ersetzen: Der reguläre Ausdruck, der das Muster angibt, nach dem gesucht werden soll.
  • Ersatztext: Der Text, der in jede Übereinstimmung eingefügt werden soll.

Gibt einen neuen String zurück, der vom ursprünglichen StringText abgeleitet wurde. Dabei werden alle Teilstrings, die mit dem Muster in replaceRegex übereinstimmen, durch den Wert in replacementText ersetzt. Sie können in replacementText Ziffern mit einem umgekehrten Schrägstrich (\1 bis \9) verwenden, um Text einzufügen, der der entsprechenden übergeordneten Gruppe im Muster „replaceRegex“ entspricht. Verwenden Sie \0, um auf den gesamten übereinstimmenden Text zu verweisen.

Die Funktion ersetzt nicht überlappende Übereinstimmungen und priorisiert das Ersetzen. Beispiel: Mit „re.replace("banana", "ana","111")“ wird beispielsweise der String „b111na"“ zurückgegeben.

In diesem Beispiel wird alles nach dem @-Symbol in einer E-Mail erfasst, com durch org ersetzt und dann das Ergebnis zurückgegeben. Beachten Sie die Verwendung von verschachtelten Funktionen.

"email@google.org" = re.replace($e.network.email.from, "com", "org")

In diesem Beispiel werden mit Schrägstrichen maskierte Ziffern im Ersatztext-Argument verwendet, um auf Übereinstimmungen mit dem ersetzten Regex-Muster zu verweisen.

"test1.com.google" = re.replace(
                       $e.principal.hostname, // holds "test1.test2.google.com"
                       "test2.([a-z]*).([a-z]*).*",
                       "\\2.\\1"  // \\1 holds "google", \\2 holds "com"
                     )

Datumsfunktionen

Chronicle unterstützt die folgenden datumsbezogenen Funktionen:

  • timestamp.get_minute(unix_seconds [, time_zone])
  • timestamp.get_hour(unix_seconds [, time_zone])
  • timestamp.get_day_of_week(unix_seconds [, time_zone])
  • timestamp.get_week(unix_seconds [, time_zone])
  • timestamp.current_seconds()

Chronicle unterstützt negative Ganzzahlen als Argument von unix_seconds. Negative Ganzzahlen stellen Zeiten vor der Unix-Epoche dar. Wenn Sie eine ungültige Ganzzahl angeben, zum Beispiel einen Wert, der zu einem Überlauf führt, gibt die Funktion „-1“ zurück. Das kommt selten vor.

Da YARA-L 2 negative Literale nicht unterstützt, solltest du auf diese Bedingung achten, indem du einen kleineren oder höheren Operator verwendest. Beispiel:

0 > timestamp.get_hour(123)

Zeitextraktion

Gibt eine Ganzzahl im Bereich [0, 59] zurück.

timestamp.get_minute(unix_seconds [, time_zone])

Die folgende Funktion gibt eine Ganzzahl im Bereich [0, 23] zurück, die die Stunde darstellt.

timestamp.get_hour(unix_seconds [, time_zone])

Die folgende Funktion gibt eine Ganzzahl im Bereich [1, 7] zurück, die den Wochentag beginnt, der mit Sonntag beginnt. Beispiel: 1 = Sonntag; 2 = Montag usw.

timestamp.get_day_of_week(unix_seconds [, time_zone])

Die folgende Funktion gibt eine Ganzzahl im Bereich [0, 53] zurück, die die Woche des Jahres darstellt. Wochen beginnen mit Sonntag. Datumsangaben vor dem ersten Sonntag des Jahres liegen in Woche 0.

timestamp.get_week(unix_seconds [, time_zone])

Diese Funktionen zur Zeitextraktion haben dieselben Argumente.

  • unix_seconds ist eine Ganzzahl, die die Anzahl der Sekunden nach der Unix-Epoche darstellt, z. B. $e.metadata.event_timestamp.seconds oder ein Platzhalter mit diesem Wert.
  • „time_zone“ ist optional. Es ist ein String, der für eine „time_zone“ steht. Wenn keine Angaben gemacht werden, lautet der Standardwert „quot;GMT"“. Sie können Zeitzonen mit String-Literalen angeben. Folgende Optionen sind verfügbar:
    • Der Name der TZ-Datenbank, z. B. &America/Los_Angeles" Weitere Informationen finden Sie in der Spalte &Z-Datenbankname auf dieser Seite.
    • Die Zeitzonendifferenz von UTC im Format (+|-)H[H][:M[M]], z. B. "-08:00"

In diesem Beispiel wird das Argument „time_zone“ weggelassen. Standardmäßig wird „"GMT"“ verwendet.

$ts = $e.metadata.collected_timestamp.seconds

timestamp.get_hour($ts) = 15

In diesem Beispiel wird ein String-Literal verwendet, um die Zeitzone zu definieren.

$ts = $e.metadata.collected_timestamp.seconds

2 = timestamp.get_day_of_week($ts, "America/Los_Angeles")

Im Folgenden finden Sie Beispiele für andere gültige Time_Zone-Spezifizierer, die Sie als zweites Argument an die Zeitextraktion übergeben können:

  • "America/Los_Angeles" oder "-08:00" ("PST" wird nicht unterstützt)
  • "America/New_York" oder "-05:00" ("EST" wird nicht unterstützt)
  • "Europe/London"
  • "UTC"
  • "GMT"

Aktueller Zeitstempel

Gibt eine Ganzzahl für die aktuelle Uhrzeit in Unix-Sekunden zurück. Dies entspricht etwa dem Erkennungsstempel und basiert auf dem Zeitpunkt, an dem die Regel ausgeführt wird.

timestamp.current_seconds()

Im folgenden Beispiel wird „True“ zurückgegeben, wenn das Zertifikat länger als 24 Stunden abgelaufen ist. Der Zeitunterschied wird berechnet, indem die aktuellen Unix-Sekunden subtrahiert und dann ein Vergleich mit dem Operator „Größer als“ durchgeführt wird.

86400 < timestamp.current_seconds() - $e.network.tls.certificate.not_after

Mathematische Funktionen:

Absoluter Wert

Gibt den Absolutwert eines ganzzahligen Ausdrucks zurück.

math.abs(intExpression)

Dieses Beispiel gibt "True" zurück, wenn Ereignisse mehr als 5 Minuten auseinanderliegen, unabhängig davon, welches Ereignis zuerst eintritt. Im Beispiel werden verschachtelte Funktionen verwendet.

5 < timestamp.get_minute(
      math.abs($e1.metadata.event_timestamp.seconds
               - $e2.metadata.event_timestamp.seconds
      )
    )

NET-Funktionen

Gibt „true“ zurück, wenn sich die angegebene IP-Adresse innerhalb des angegebenen Subnetzwerks befindet.

net.ip_in_range_cidr(ipAddress, subnetworkRange)

Mit YARA-L können Sie mit der net.ip_in_range_cidr()-Anweisung in allen IP-Adressen in einem Subnetzwerk nach UDM-Ereignissen suchen. Sowohl IPv4 als auch IPv6 werden unterstützt.

Wenn Sie in einem Bereich von IP-Adressen suchen möchten, geben Sie ein IP-UDM-Feld und einen CIDR-Bereich (Classless Inter-Domain Routing) an. YARA-L kann sowohl einzelne als auch wiederkehrende IP-Adressfelder verarbeiten.

IPv4-Beispiel:

net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")

IPv6-Beispiel:

net.ip_in_range_cidr($e.network.dhcp.yiaddr, "2001:db8::/32")

Eine Beispielregel mit der Anweisung net.ip_in_range_cidr() finden Sie in der Beispielregel. Einzelnes Ereignis innerhalb des IP-Adressbereichs

Syntax des Metaabschnitts

Ein Meta-Abschnitt besteht aus mehreren Zeilen, wobei jede Zeile ein Schlüssel/Wert-Paar definiert. Ein Schlüsselteil muss ein String in Anführungszeichen sein und ein Wert muss ein String in Anführungszeichen sein:

<key> = "<value>"

Hier ein Beispiel für eine gültige Zeile in einem meta-Abschnitt: none meta: author = "Chronicle" severity = "HIGH"

Syntax des Ereignisbereichs

Listen Sie im Abschnitt events die Prädikate auf, um Folgendes anzugeben:

  • Bedeutung der einzelnen Übereinstimmungen oder Platzhaltervariablen
  • Einfache binäre Ausdrücke als Bedingungen
  • Funktionsausdrücke als Bedingungen
  • Referenzausdrucke als Bedingungen
  • Logische Operatoren

Variablendeklarationen

Verwenden Sie für Variablendeklarationen die folgende Syntax:

  • <EVENT_FIELD> = <VAR>
  • <VAR> = <EVENT_FIELD>

Beide sind äquivalent, wie in den folgenden Beispielen gezeigt:

  • $e.source.hostname = $hostname
  • $userid = $e.principal.user.userid

Diese Deklaration zeigt an, dass diese Variable das angegebene Feld für die Ereignisvariable ist. Wenn das Ereignisfeld ein wiederkehrendes Feld ist, kann die Übereinstimmungsvariable ein beliebiger Wert im Array darstellen. Es ist auch möglich, einer einzelnen Übereinstimmung oder Platzhaltervariablen mehrere Ereignisfelder zuzuweisen. Dies ist eine vorübergehende Join-Bedingung.

Beispiel:

  • $e1.source.ip = $ip
  • $e2.target.ip = $ip

Sie entsprechen:

  • $e1.source.ip = $ip
  • $e1.source.ip = $e2.target.ip

Wenn eine Variable verwendet wird, muss sie durch eine Variablendeklaration deklariert werden. Wenn eine Variable ohne Deklaration verwendet wird, wird dies als Kompilierungsfehler angesehen.

Einfache binäre Ausdrücke als Bedingungen

Verwenden Sie die folgende Syntax für einen einfachen Binärausdruck:

  • <EXPR> <OP> <EXPR>

Der Ausdruck kann entweder ein Ereignisfeld, eine Variable, eine Konstante oder ein Funktionsausdruck sein.

Beispiel:

  • $e.source.hostname = "host1234"
  • $e.source.port < 1024
  • 1024 < $e.source.port
  • $e1.source.hostname != $e2.target.hostname
  • $e1.metadata.timestamp > $e2.metadata.timestamp
  • $port >= 25
  • $host = $e2.target.hostname
  • "google-test" = strings.concat($e.principal.hostname, "-test")
  • "email@google.org" = re.replace($e.network.email.from, "com", "org")

Wenn beide Seiten Konstanten sind, wird sie als Kompilierungsfehler betrachtet.

Funktionsausdrücke als Bedingungen

Einige Funktionsausdrücke geben einen booleschen Wert zurück, der als einzelnes Prädikat im Abschnitt events verwendet werden kann. zum Beispiel:

  • re.regex()
  • net.ip_in_range_cidr()

Beispiel:

  • re.regex($e.principal.hostname, `.*\.google\.com`)
  • net.ip_in_range_cidr($e.principal.ip, "192.0.2.0/24")

Referenzausdrucke als Bedingungen

Mit dem Operator in kannst du in einer Referenzliste anhand von Gleichheit prüfen, ob UDM-Werte vorhanden sind. Der Operator in kann mit not kombiniert werden, um die Werte einer Referenzliste auszuschließen. Dem Namen der Referenzliste muss das Zeichen % vorangestellt werden.

Derzeit werden nur String-Werte unterstützt:

  • $e.principal.hostname in %hostname_list
  • $e.about.ip in %phishing_site_list
  • $hostname in %whitelisted_hosts

Logische Operatoren

Sie können die logischen and- und logischen or-Operatoren im Abschnitt events verwenden, wie in den folgenden Beispielen gezeigt:

  • $e.metadata.event_type = "NETWORK_DNS" or $e.metadata.event_type = "NETWORK_DHCP"
  • ($e.metadata.event_type = "NETWORK_DNS" and $e.principal.ip = "192.0.2.12") or ($e.metadata.event_type = "NETWORK_DHCP" and $e.principal.mac = "AB:CD:01:10:EF:22")
  • not $e.metadata.event_type = "NETWORK_DNS"

Standardmäßig ist die Reihenfolge von der höchsten zur niedrigsten Priorität not, and, or.

Beispiel: "a or b and c" wird als "a or (b and c)" ausgewertet. Sie können die Priorität bei Bedarf mit Klammern ändern.

Im Abschnitt events werden alle Prädikate standardmäßig als AND verknüpft angesehen.

Modifikatoren

Nocase

Wenn Sie einen Vergleichsausdruck zwischen Stringwerten oder einem Regex-Ausdruck verwenden, können Sie am Ende des Ausdrucks die Groß- und Kleinschreibung anhängen, um Groß- und Kleinschreibung zu ignorieren.

  • $e.principal.hostname != "http-server" nocase
  • $e1.principal.hostname = $e2.target.hostname nocase
  • $e.principal.hostname = /dns-server-[0-9]+/ nocase
  • re.regex($e.target.hostname, `client-[0-9]+`) nocase

Dies kann nicht verwendet werden, wenn ein Feldtyp ein Aufzählungswert ist. Die folgenden Beispiele sind ungültig und führen zu Kompilierungsfehlern:

  • $e.metadata.event_type = "NETWORK_DNS" nocase
  • $e.network.ip_protocol = "TCP" nocase

Wiederkehrende Felder

Alle, alle

In UDM und Entity sind einige Felder als wiederholt gekennzeichnet. Das bedeutet, dass es sich um eine Liste von Werten oder andere Arten von Nachrichten handelt. In YARA-L wird jedes Element im wiederkehrenden Feld einzeln behandelt. Das bedeutet, dass die Regel für jedes Element im Feld ausgewertet wird, wenn das wiederkehrende Feld in der Regel verwendet wird. Das kann zu unerwartetem Verhalten führen. Wenn eine Regel beispielsweise im Abschnitt events sowohl $e.principal.ip = "1.2.3.4" als auch $e.principal.ip = "5.6.7.8" hat, generiert die Regel nie, eine Übereinstimmung, auch wenn sich sowohl "1.2.3.4" als auch "5.6.7.8" in principal.ip befinden.

Für die Auswertung des wiederkehrenden Felds als Ganzes können Sie die Operatoren any und all verwenden. Bei Verwendung von any wird das Prädikat als „true“ ausgewertet, wenn ein Wert im wiederkehrenden Feld die Bedingung erfüllt. Bei Verwendung von all wird das Prädikat als „true“ ausgewertet, wenn alle Werte im wiederkehrenden Feld die Bedingung erfüllen.

  • any $e.target.ip = "127.0.0.1"
  • all $e.target.ip != "127.0.0.1"
  • re.regex(any $e.about.hostname, `server-[0-9]+`)
  • net.ip_in_range_cidr(all $e.principal.ip, "10.0.0.0/8")

Die Operatoren any und all können nur mit wiederkehrenden Feldern verwendet werden. Darüber hinaus können sie nicht verwendet werden, wenn Sie einer Platzhaltervariable ein wiederkehrendes Feld zuweisen oder mit einem Feld eines anderen Ereignisses zusammenführen.

Beispielsweise sind any $e.principal.ip = $ip und any $e1.principal.ip = $e2.principal.ip keine gültige Syntax. Mit $e.principal.ip = $ip können Sie mehrere Felder zuordnen oder ihr beitreten. Für jedes Element des wiederkehrenden Felds gibt es einen Übereinstimmungsvariablenwert oder einen Join.

Wenn Sie eine Bedingung mit any oder all schreiben, beachten Sie, dass die Negation der Bedingung mit not möglicherweise nicht dieselbe Bedeutung wie die Verwendung des negierten Operators hat.

Beispiel:

  • not all $e.principal.ip = "192.168.12.16" prüft, ob nicht alle IP-Adressen mit "192.168.12.16" übereinstimmen. Das bedeutet, dass die Regel prüft, ob eine IP-Adresse mit "192.168.12.16" nicht übereinstimmt.
  • all $e.principal.ip != "192.168.12.16" prüft, ob alle IP-Adressen mit "192.168.12.16" übereinstimmen. Das bedeutet, dass in der Regel überprüft wird, ob keine IP-Adressen mit "192.168.12.16" übereinstimmen.

Syntax des Abschnitts

Listen Sie im Abschnitt match die Abgleichsvariablen für Gruppenereignisse auf, bevor Sie auf die Übereinstimmungsbedingungen prüfen. Diese Felder werden bei jeder Übereinstimmung zurückgegeben.

  • Geben Sie an, wofür die einzelnen Übereinstimmungsvariablen im Abschnitt events stehen.
  • Geben Sie den Zeitraum an, der nach dem Keyword over auf Ereignisse angewendet werden soll. Ereignisse außerhalb des Zeitraums werden ignoriert.
  • Verwenden Sie die folgende Syntax, um den Zeitraum anzugeben: <number><s/m/h/d> Dabei steht s/m/h/d für Sekunden, Minuten, Stunden und Tage.
  • Die Zeit, die Sie angeben können, beträgt 1 Minute.
  • Sie können maximal 48 Stunden festlegen.

Das folgende Beispiel zeigt eine gültige match:

$var1, $var2 over 5m

Diese Anweisung gibt $var1 und $var2 zurück (definiert im Abschnitt events), wenn die Regel eine Übereinstimmung findet. Die angegebene Zeit beträgt 5 Minuten. Ereignisse, die mehr als 5 Minuten voneinander entfernt sind, werden nicht korreliert und daher von der Regel ignoriert.

Hier ein weiteres Beispiel für einen gültigen match:

$user over 1h

Diese Anweisung gibt $user zurück, wenn die Regel eine Übereinstimmung findet. Das angegebene Zeitfenster beträgt 1 Stunde. Ereignisse, die mehr als eine Stunde auseinanderliegen, stehen nicht in Beziehung. Diese Regel gilt nicht als Erkennung.

Hier ein weiteres Beispiel für einen gültigen match:

$source_ip, $target_ip, $hostname over 2m

Diese Anweisung gibt $source_ip, $target_ip und $hostname zurück, wenn die Regel gefunden wird. Das angegebene Zeitfenster beträgt 2 Minuten. Ereignisse, die mehr als zwei Minuten voneinander entfernt sind, stehen nicht in Beziehung. Diese Regel gilt nicht als Erkennung.

Die folgenden Beispiele veranschaulichen ungültige match-Abschnitte:

  • var1, var2 over 5m // invalid variable name
  • $user 1h // missing keyword

Schiebefenster

Standardmäßig werden YARA-L 2.0-Regeln mithilfe von Hop-Fenstern ausgewertet. Ein Zeitraum von Unternehmensereignisdaten wird in eine Reihe von sich überschneidenden Hop-Fenstern aufgeteilt, die jeweils den im Abschnitt match angegebenen Zeitraum enthalten. Ereignisse werden dann in jedem Hop-Fenster korreliert. Mit Hop-Fenstern ist es nicht möglich, Ereignisse in einer bestimmten Reihenfolge zu suchen (z. B. erfolgt e1 bis zu 2 Minuten nach e2). Ein Ereignis e1 und ein Ereignis e2 korrelieren, solange sie sich innerhalb der Hop-Fenster-Zeit befinden.

Regeln können auch mithilfe von Schiebefenstern ausgewertet werden. Mit Schiebefenstern werden Schiebefenster mit der im Abschnitt match angegebenen Dauer generiert, wenn sie mit einer angegebenen Pivot-Ereignisvariable beginnen oder enden. Anschließend beziehen sich die Ereignisse in jedem gleitenden Fenster. Das ermöglicht die Suche nach Ereignissen, die in einer bestimmten Reihenfolge auftreten (z. B. geschieht e1 innerhalb von zwei Minuten nach e2). Das Ereignis e1 und das Ereignis e2 treten in Korrelation und treten auf, wenn das Ereignis e1 innerhalb des gleitenden Zeitfensters nach dem Ereignis e2 auftritt.

Geben Sie die folgenden Schiebefenster im Abschnitt match einer Regel an:

<match-var-1>, <match-var-2>, ... over <duration> before|after <pivot-event-var>

Die Pivot-Ereignisvariable ist die Ereignisvariable, auf der die Schiebefenster basieren. Wenn Sie das Keyword before verwenden, werden Schiebefenster generiert, die mit jedem Vorkommen des Pivot-Ereignisses enden. Wenn das Keyword after verwendet wird, werden Schiebefenster generiert, sobald ein Pivot-Ereignis auftritt.

Hier einige Beispiele für gültige Verwendungen von Schiebefenstern:

  • $var1, $var2 over 5m after $e1
  • $user over 1h before $e2

Syntax des Ergebnisbereichs

Im Abschnitt outcome müssen Sie den Namen einer einzelnen Variablen namens „$risk_score“ definieren. Der Wert für $risk_score muss eine Ganzzahl sein, damit die Priorisierung priorisiert wird.

Sie verwenden die bedingte Logik und Aggregatfunktionen, um den Wert von $risk_score zu berechnen.

Der Beispielausdruck oben enthält das folgende Syntaxmuster zum Angeben von Bedingungen:

if(BOOL_CLAUSE, THEN_CLAUSE)
if(BOOL_CLAUSE, THEN_CLAUSE, ELSE_CLAUSE)

BOOL_CLAUSE muss als boolescher Wert ausgewertet werden. Ein BOOL_CLAUSE-Ausdruck hat eine ähnliche Form wie Ausdrücke im Abschnitt events. Zum Beispiel:

  • Namen von UDM-Feldern mit Vergleichsoperator, z. B. $context.graph.entity.user.title = "Vendor"
  • Variablenname, der im Abschnitt events definiert ist, z. B. $severity = "HIGH"
  • Funktionen, die einen booleschen Wert zurückgeben, wie re.regex($e.network.email.from, .*altostrat\.com)

THEN_CLAUSE und ELSE_CLAUSE müssen Literale sein.

Wenn kein ELSE_CLAUSE enthalten ist, wird der Standardwert ausgewertet. Beispiel: if($e.field = "a", 5) entspricht if($e.field = "a", 5, 0)

Sie können einen bedingten Ausdruck als "lesen, wenn BOOL_CLAUSE wahr ist und dann THEN_CLAUSE zurückgeben. Andernfalls wird ELSE_CLAUSE zurückgegeben.

Der Ausdruck zum Berechnen des Werts $risk_score muss von einer Aggregatfunktion umschlossen werden. Chronicle unterstützt die Funktionen max, min und sum.

Die Aggregatfunktion ist wichtig, wenn eine Regel einen condition-Abschnitt enthält, in dem mehrere Ereignisse angegeben werden müssen. Angenommen, der Abschnitt condition lautet:

condition:
   #u > 2

und die Berechnung des Risikowerts hat folgende Zeile:

+ if($u.principal.hostname = "my-hostname")

Da es mehrere u-Ereignisse gibt, wird eine zusammengefasste Funktion für die verschiedenen Ereignisse verwendet.

Beachten Sie Folgendes:

  • Der Variablenname im Abschnitt outcome muss $risk_score lauten.
  • Die Variable $risk_score muss eine Ganzzahl speichern.
  • Der Ausdruck zum Berechnen von $risk_score ist eine mathematische Gleichung, die die Operatoren für Addition und Subtraktion unterstützt.
  • Der Ausdruck kann Folgendes enthalten:
    • Ganzzahl-Literale
    • Bedingte Anweisungen
  • Du kannst den Abschnitt outcome nur in Multi-Ereignisregeln verwenden, die Regeln mit dem Abschnitt match sind.
  • Die Regel kann einen outcome-Bereich mit einer Regel für mehrere Ereignisse enthalten, die nur UDM-Ereignisdaten ausgewertet. Sie müssen keine Entitätskontextdaten einbeziehen.
  • Der Abschnitt outcome kann keine Ereignisse enthalten, die nicht im Abschnitt events definiert wurden. Du kannst nur Ereignisse korrelieren, die bereits im Abschnitt events zusammenhängen. Außerdem kannst du keine neue Platzhaltervariable definieren, die bereits im Abschnitt events definiert war.

Ein Beispiel zur Verwendung finden Sie hier. Weitere Informationen zur Deduplizierung von Ergebnisergebnissen

Syntax des Bedingungsabschnitts

Anzahl

Das Zeichen # ist ein Sonderzeichen im Abschnitt condition. Wenn er vor einem Namen von einem Ereignis oder einer Platzhaltervariablen verwendet wird, stellt er die Anzahl unterschiedlicher Ereignisse oder Werte dar, die alle Bedingungen für den Bereich events erfüllen.

Syntax

Geben Sie im Abschnitt condition die Übereinstimmungsbedingung für Ereignisse und Variablen an, die im Abschnitt events definiert sind. Hier können Sie Prädikatsübereinstimmungen auflisten, die mit dem Keyword and oder or verknüpft sind.

Die folgenden Bedingungen sind Begrenzungsrahmen. Sie sorgen dafür, dass die zugehörige Ereignisvariable existiert. Das bedeutet, dass mindestens ein Ereignis in einem Ereignis erkannt werden muss.

  • $var // equivalent to #var > 0
  • #var > n // where n >= 0
  • #var >= m // where m > 0

Die folgenden Bedingungen sind nicht bindend. Dadurch kann die zugehörige Ereignisvariable nicht vorhanden sein. Das bedeutet, dass ein Ereignis nicht in einer Erkennung enthalten ist. So lassen sich nicht vorhandene Regeln erstellen, die nach dem Fehlen einer Variablen suchen und nicht nach einer Variablen suchen.

  • !$var // equivalent to #var = 0
  • #var >= 0
  • #var < n // where n > 0
  • #var <= m // where m >= 0

Im folgenden Beispiel entspricht das Sonderzeichen # einer Variable (entweder der Ereignisvariablen oder der Platzhaltervariablen) der Anzahl der verschiedenen Ereignisse oder Werte der Variablen:

$e and #port > 50 or #event1 > 2 or #event2 > 1 or #event3 > 0

Das folgende Beispiel für Nicht-Existenz ist ebenfalls gültig und wird als „true“ ausgewertet, wenn mehr als zwei unterschiedliche Ereignisse aus $event1 und null verschiedene Ereignisse aus $event2 vorhanden sind:

#event1 > 2 and !$event2

Hier sind Beispiele für ungültige Prädikate:

  • $e, #port > 50 // incorrect keyword usage
  • $e or #port < 50 // or keyword not supported with non-bounding conditions

Syntax des Abschnitts „Optionen“

Im Abschnitt options können Sie die Optionen für die Regel festlegen. Die Syntax für den Abschnitt options ähnelt der des Abschnitts meta. Ein Schlüssel muss jedoch einer der vordefinierten Optionsnamen sein und der Wert ist nicht auf einen Stringtyp beschränkt.

Derzeit ist allow_zero_values die einzige verfügbare Option.

  • allow_zero_value: Wenn dieser Wert auf „true“ gesetzt ist, können von der Regel generierte Übereinstimmungen null Werte als Übereinstimmungsvariablen haben. Ereignisfelder werden null ausgefüllt, wenn sie nicht gefüllt werden. Diese Option ist standardmäßig auf „false“ gesetzt.

Nachfolgend ist die gültige Zeile für den Abschnitt options aufgeführt:

  • allow_zero_values = true

Typprüfung

Chronicle führt eine Typprüfung mit Ihrer YARA-L-Syntax durch, während Sie auf der Benutzeroberfläche Regeln erstellen. Anhand der angezeigten Fehler in der Typprüfung können Sie die Regel so überarbeiten, dass sie wie erwartet funktioniert.

Hier sind Beispiele für ungültige Prädikate:

// $e.target.port is of type integer which cannot be compared to a string.
$e.target.port = "80"

// "LOGIN" is not a valid event_type enum value.
$e.metadata.event_type = "LOGIN"