YARA-L 2.0-Sprachsyntax

In diesem Abschnitt werden die wichtigsten Elemente der YARA-L-Syntax beschrieben. Siehe auch Übersicht über die Sprache YARA-L 2.0.

Kommentare

Kennzeichne Kommentare mit zwei Schrägstrichen (// comment) oder mehrzeiligen Kommentaren, die mit Schrägstrichen versehen sind (/* comment */), so wie in C.

Konstanten

Konstanten vom Typ "Ganzzahl", "String", "Gleitkommazahl" und "Regex" werden unterstützt. Verwenden Sie für Stringkonstanten doppelte Anführungszeichen. Verwenden Sie /regex/ für Regex-Konstanten.

Anzahl

Das Zeichen # ist ein Sonderzeichen im Bedingungsabschnitt. Wenn sie vor einem Ereignis- oder Platzhaltervariablennamen verwendet wird, stellt sie die Anzahl der verschiedenen Ereignisse oder Werte dar, die alle Bedingungen des Abschnitts events erfüllen.

.

Mit YARA-L können Sie mithilfe der Anweisung net.ip_in_range_cidr() nach UDM-Ereignissen für alle IP-Adressen in einem Subnetzwerk suchen. IPv4 und IPv6 werden unterstützt.

Um einen Bereich von IP-Adressen zu durchsuchen, 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 net.ip_in_range_cidr()-Anweisung finden Sie in der Beispielregel Einzelnes Ereignis innerhalb des IP-Adressbereichs.

Operatoren

In YARA-L können Sie die folgenden Operatoren verwenden:

Operator: Beschreibung
= sind gleich
!= Ungleich
< ist kleiner als
<= kleiner oder gleich
> ist größer als
>= größer als oder gleich

Angebote für Strings

Verwenden Sie eines der folgenden Anführungszeichen, um Strings in YARA-L 2.0 einzuschließen. Text in Anführungszeichen wird jedoch je nach verwendetem Text anders interpretiert.

  1. Doppelte Anführungszeichen (") – wird für normale Strings verwendet. Muss Escape-Zeichen enthalten. Beispiel: hellohello\tworld“ – \t wird als Tab interpretiert.

  2. In umgekehrte Anführungszeichen (`): Mit dieser Option können Sie alle Zeichen wortgetreu interpretieren. Beispiel: `hello\tworld“: \t wird nicht als Tab interpretiert.

Bei regulären Ausdrücken müssen Sie häufig den umgekehrten Schrägstrich (\) in Strings verwenden. Wenn Sie jedoch doppelte Anführungszeichen verwenden, müssen Sie umgekehrte Schrägstriche mit umgekehrten Schrägstrichen maskieren, was umständlich aussehen kann.

Die folgenden regulären Ausdrücke sind beispielsweise gleichwertig:

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

Wir empfehlen die Verwendung von Anführungszeichen für Strings in regulären Ausdrücken, um die Lesbarkeit zu verbessern.

Variablen

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

Sie können die folgenden Variablentypen definieren:

  • Ereignisvariablen: stellen Sie Gruppen von Ereignissen in normalisierter Form dar. Geben Sie Bedingungen für Ereignisvariablen im Abschnitt events an. Sie identifizieren Ereignisvariablen mithilfe der Ereignisfelder nach der Variablen. Ereignisfelder werden als Kette von .<field name> dargestellt, z. B. $e.field1.field2. Ereignisfeldketten beginnen immer in der obersten Ebene des UDM.

  • Übereinstimmungsvariablen: Deklarieren Sie im Übereinstimmungsbereich. Ü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 Werte der Übereinstimmungsvariablen zurückgegeben. Geben Sie im Abschnitt events an, was jede Übereinstimmungsvariable darstellt.

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

Verwenden Sie Übereinstimmungsvariablen und Platzhaltervariablen, um Beziehungen zwischen Ereignisfeldern über transitive Join-Bedingungen zu deklarieren. Weitere Informationen finden Sie unter Syntax des Ereignisbereichs.

Syntax für den Abschnitt "Ereignisse"

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

  • Bedeutung der einzelnen Übereinstimmungs- und Platzhaltervariablen
  • Filterbedingung für eine einzelne Ereignisvariable
  • Join-Bedingung auf zwei Ereignisvariablen

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 gibt an, dass diese Variable das angegebene Feld für die Ereignisvariable darstellt. Wenn das Ereignisfeld ein Arrayfeld ist, kann die Übereinstimmungsvariable einen beliebigen Wert im Array darstellen. Sie können einer einzelnen Übereinstimmungs- oder Platzhaltervariablen auch mehrere Ereignisfelder zuweisen. Das ist eine transitive Join-Bedingung.

Beispiele:

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

Entspricht:

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

Filterbedingungen für Ereignisvariablen

Verwenden Sie die folgende Syntax für eine Filterbedingung für eine einzelne Ereignisvariable:

  • [EVENT_FIELD] [OP] [CONST]
  • [CONST] [OP] [EVENT_FIELD]

Beide Vorgänge sind äquivalent, aber wir empfehlen für bessere Lesbarkeit die Verwendung des ersten ([EVENT_FIELD] [OP] [CONST]).

Beispiel:

  • $e.source.hostname = "host1234"
  • $e.source.port < 1024
  • 1024 < $e.source.port

Dieses Prädikat wird als Filter für die Ereignisvariable verwendet. Dies bedeutet, dass eine von der Ereignisvariable dargestellte Ereignisgruppe die Funktion erfüllen soll.

Join-Bedingungen für Ereignisvariablen

Verwenden Sie die folgende Syntax, um eine Join-Bedingung für zwei Ereignisvariablen darzustellen:

[EVENT_FIELD] [OP] [EVENT_FIELD]

Beispiel:

  • $e1.source.hostname = $e2.target.hostname
  • $e1.metadata.timestamp < $e2.metadata.timestamp

Dieses Prädikat wird verwendet, um die beiden Ereignisvariablen mit der Bedingung zusammenzuführen.

Beispiele für ungültige Prädikate:

  • $e.source.hostname != $hostname //comparison over match/placeholder var
  • $hostname != "host1234" //comparison over match/placeholder var
  • $var1 //variable itself does not mean anything

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 Klammern verwenden, um die Priorität bei Bedarf zu ändern.

Übereinstimmung mit Abschnittssyntax

Listen Sie im Übereinstimmungsbereich die Übereinstimmungsvariablen für Gruppenereignisse auf, bevor Sie nach Übereinstimmungsbedingungen suchen. Diese Felder werden bei jeder Übereinstimmung zurückgegeben.

  • Geben Sie im Abschnitt events an, was jede Übereinstimmungsvariable darstellt.
  • Geben Sie den Zeitraum an, in dem Ereignisse nach dem Keyword over korreliert werden. 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 bzw. Tage.
  • Sie können mindestens eine Minute angeben.
  • Sie können maximal 48 Stunden angeben.

Das folgende Beispiel zeigt eine gültige match:

$var1, $var2 over 5m

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

Hier ein weiteres Beispiel für eine gültige 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 in keinem Zusammenhang. Sie werden nicht als Erkennung eingestuft.

Hier ein weiteres Beispiel für eine gültige match:

$source_ip, $target_ip, $hostname over 2m

Diese Anweisung gibt $source_ip, $target_ip und $hostname zurück, wenn die Regel eine Übereinstimmung findet. Das angegebene Zeitfenster beträgt 2 Minuten. Ereignisse, die mehr als zwei Minuten voneinander entfernt sind, werden nicht in Beziehung zueinander gesetzt. Sie werden nicht als Erkennung eingestuft.

Die folgenden Beispiele veranschaulichen ungültige matchs:

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

Syntax des Abschnitts ConditionBedingung“

Geben Sie im Abschnitt condition die Übereinstimmungsbedingung für die im Abschnitt events definierten Ereignisse und Variablen an. Listen Sie hier Prädikate auf, die mit dem Keyword and oder or verknüpft sind.

Die folgenden Bedingungen sind Begrenzungsrahmen. Sie erzwingen, dass die zugehörige Ereignisvariable vorhanden ist. Dies bedeutet, dass mindestens ein Ereignis in einer Erkennung auftreten muss.

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

Die folgenden Bedingungen sind keine Begrenzungsbedingungen. Sie ermöglichen es, dass die zugehörige Ereignisvariable nicht vorhanden ist. Dies bedeutet, dass das Ereignis möglicherweise nicht in einer Erkennung angezeigt wird. Dies ermöglicht die Erstellung von nicht vorhandenen Regeln, die nach dem Vorhandensein einer Variablen anstelle einer Variablen suchen.

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

Im folgenden Beispiel stellt das Sonderzeichen # für eine Variable (entweder die Ereignisvariable oder die Platzhaltervariable) die Anzahl der einzelnen Ereignisse oder Werte dieser Variablen dar:

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

Das folgende nicht vorhandene Beispiel ist ebenfalls gültig und wird als truetrue“ eingestuft, wenn mehr als zwei unterschiedliche Ereignisse aus $event1 und null unterschiedliche Ereignisse aus $event2 vorhanden sind:

#event1 > 2 and !$event2

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

Reguläre Ausdrücke

Sie können reguläre Ausdrücke in YARA-L 2.0 mit einer der folgenden Syntax definieren:

  • Verwenden der YARA-Syntax – für Ereignisse Diese Syntax ist eine allgemeine Darstellung: $e.field = /regex/
  • Verwenden der YARA-L-Syntax – als Funktion mit den folgenden Parametern:
    • Feld, auf das der reguläre Ausdruck angewendet werden soll.
    • Ein regulärer Ausdruck, der als String angegeben wird. Sie können den Modifikator nocase nach Strings verwenden, um anzugeben, dass bei der Suche Großschreibung ignoriert werden soll. Diese Syntax ist eine allgemeine Darstellung: re.regex($e.field, `regex`)

Wenn Sie mit dem exakten String oder nur mit einem Präfix oder Suffix übereinstimmen möchten, nehmen Sie die Ankerzeichen ^ (Anfang) und $ (abschließend) in den regulären Ausdruck auf.

Beispiel: /^full$/ stimmt genau mit "full" überein, während /full/ mit "fullest", "lawfull" und "joyfully" übereinstimmen kann.

Rohstrings

Mit YARA-L 2.0 können Sie in den Ereignisdaten Ihres Unternehmens nach einem Rohstring suchen.

Wenn Sie nach einem Rohstring suchen möchten, setzen Sie ihn in Backtick (`) statt in doppelte Anführungszeichen ( ().

Der Gravis gibt an, dass der Inhalt des Strings wortgetreu interpretiert werden soll (Escape-Zeichen werden nicht geparst).