github Yamato-Security/hayabusa v3.10.0
v3.10.0 - Happy Independence Day Release

8 hours ago

Anti-Virus False Positives

Warning: You will get false positives from certain anti-virus programs like Windows Defender and Web Browsers saying they have detected malicious files. They are detecting on Sigma .yml files that are not executable and just contain certain signatures from malware. They are not malicious. If you are running Hayabusa for live analysis and do not want to cause any anti-virus alerts, be sure to use the live response packages that use encoded Sigma rules.

3.10.0 [2026/07/04] - Independence Day Release

New Features:

  • Added support for the |neq and |fieldref|neq field modifiers from the Sigma 2.1 specification. |neq negates a comparison and can be combined with other modifiers (|contains|neq, |startswith|neq, |endswith|neq, |fieldref|neq, ...). (#1684) (@YamatoSecurity)
  • Added unique and total alert count to MITRE ATT&CK tactics found. (#1753) (@fukusuket)

Bug Fixes:

  • MITRE ATT&CK Tactics were not line-breaking properly in HTML reports (#1751) (@fukusuket)
  • Fixed the scan progress bar not redrawing in place (each update was printed on a new line) during large scans, caused by literal carriage returns (\r\n) in the progress bar template. (#1760) (@YamatoSecurity)
  • Fixed a typo (infomationalinformational) in the pivot keyword list level exclusion that prevented informational-level records from being excluded, so their field values polluted the pivot keyword lists. (#1804) (@YamatoSecurity)
  • Fixed a Markdown-injection issue in the HTML report: user-supplied values (e.g. computer names) were HTML-escaped but not Markdown-escaped, so a value like [x](javascript:alert(1)) could render as a clickable javascript: link. Markdown metacharacters in user values are now escaped as well. (#1806) (@YamatoSecurity)
  • The exemption that keeps the null-UUID test rule out of the excluded/noisy rule counts compared the exclude-list file path instead of the rule ID, so it never applied and test rules inflated the Excluded rules count. (#1821) (@YamatoSecurity)
  • Unique detection percentages in the Results Summary (and the HTML report) were mirrored across levels: the percentage was computed with the reversed loop index, so e.g. the critical row showed informational's percentage and vice versa (only medium was correct). (#1812) (@YamatoSecurity)
  • logon-summary: the Target Domain column was always - for RDS Gateway logons (EID 302 in Microsoft-Windows-TerminalServices-Gateway/Operational) because the dst_domain lookup used the misspelled event key alias RdsGtwUserName instead of RdsGtwUsername, so the domain in DOMAIN\user values was silently dropped. (#1809) (@YamatoSecurity)
  • The GeoIP function treated every public IPv6 address as Private and never performed a lookup for them, because the IPv6 private range list included 2000::/3 (the entire global unicast space). Removed it (along with the redundant FD00::/8, a subset of FC00::/7) so that public IPv6 addresses are now enriched with ASN/Country/City. (#1819) (@YamatoSecurity)
  • Wildcard field patterns that fall back to regex matching (patterns containing ?, a mid-string *, or non-ASCII text together with *) were compiled to an unanchored regex and evaluated with Regex::is_match() (a substring search), so they matched any value that merely contained the pattern instead of the whole field value (e.g. Channel: Sec?rity matched MySec1rityLog, and net*user matched mynetXuserZ). These wildcard regexes are now anchored to the full value, matching Sigma full-value semantics and Hayabusa's own fast-match paths (Exact/StartsWith/EndsWith). Keyword (grep) searches and |re regexes remain intentionally unanchored. (#1826) (@Shirofune-Security)
  • The HTML report's General Overview section was missing the analyzed event file count, total file size, selected detection rule set, and excluded tags. These lines were registered under a misspelled section key (General Overview #{general_overview} with # outside the braces, instead of {#general_overview}), which is not one of the sections the renderer emits, so the data was silently dropped. Fixed the key (now sourced from shared section-name constants so it cannot drift again) along with the mislabeled total-file-size and rule-set lines on it. (#1827) (@YamatoSecurity)
  • -X/--remove-duplicate-detections did not remove the second of two identical detections when the copies were the first records of a timestamp group. get_duplicate_indices() never added the first record of each group to its comparison set (both the initial-record and timestamp-boundary branches skipped insertion), so the second copy was treated as unique and only the third and later copies were removed, leaving duplicate rows in csv-timeline/json-timeline output and inflating detection counts. Fixed so exactly one of N identical detections in a timestamp group survives. (#1828) (@YamatoSecurity)
  • read_encoded_file silently discarded I/O read errors (returning a truncated or empty rule set) and panicked via .expect() on invalid UTF-8 when loading encoded rules (encoded_rules.yml); both are now surfaced as errors through its Result. (#1834) (@YamatoSecurity)

Other:

  • Translated all remaining Japanese code comments to English, cleaned up and added many code comments for readability, and fixed misspelled internal identifiers. Comments and identifiers only; no behavior changes. (#1808) (@YamatoSecurity)
  • Renamed 76 cryptic, misleading, or hayabusa-specific variable, parameter, and struct-field names in src/ (e.g. datasrecords, con_caljoined_value, name_2_nodename_to_node, hlchhorizontal_line_char, rulepathrule_path, ext_fieldoutput_fields, and a misnamed or_nodeall_node that actually held an AND-semantics AllSelectionNode) to clearer, idiomatic Rust names for readability. Internal identifiers only; no behavior or output changes. (#1830) (@YamatoSecurity)
  • Updated the hayabusa-evtx crate to 0.9.9, bumping all of its dependencies (notably thiserror 1→2 and criterion 0.5→0.8) to their latest versions. No behavior change. (#1835) (@YamatoSecurity)
  • Removed two pieces of dead code surfaced during review: an always-empty addition_header branch in the JSON string escaper, and a never-taken branch plus a per-unit Vec allocation in the relative time-offset parser. No behavior change. (#1834) (@YamatoSecurity)

新機能:

  • Sigma 2.1仕様の |neq および |fieldref|neq フィールド修飾子のサポートを追加した。|neq は比較を否定するもので、他の修飾子(|contains|neq|startswith|neq|endswith|neq|fieldref|neq など)と組み合わせて使用できる。 (#1684) (@YamatoSecurity)
  • 検出されたMITRE ATT&CK戦術について、一意の件数と合計件数を追加した。 (#1753) (@fukusuket)

バグ修正:

  • MITRE ATT&CK Tacticsの項目が、HTMLレポートで適切に改行されていなかった。 (#1751) (@fukusuket)
  • 大量のファイルをスキャンする際に、スキャンのプログレスバーがその場で再描画されず、更新ごとに新しい行に表示される問題を修正した。プログレスバーのテンプレートにリテラルの改行コード(\r\n)が含まれていたことが原因。 (#1760) (@YamatoSecurity)
  • ピボットキーワードリスト機能のレベル除外判定にあったタイポ(infomationalinformational)を修正した。この誤字により informational レベルのレコードが除外されず、そのフィールド値がピボットキーワードリストに混入していた。 (#1804) (@YamatoSecurity)
  • HTMLレポートのMarkdownインジェクションの問題を修正した。ユーザー由来の値(コンピュータ名など)はHTMLエスケープされていたがMarkdownエスケープはされておらず、[x](javascript:alert(1)) のような値がクリック可能な javascript: リンクとして描画される可能性があった。ユーザー値内のMarkdownメタ文字もエスケープするようにした。 (#1806) (@YamatoSecurity)
  • null-UUIDのテストルールを除外ルール・ノイジールールの件数から除くための判定が、ルールIDではなく除外リストファイルのパスと比較していたため機能しておらず、テストルールがExcluded rulesの件数を水増ししていた問題を修正した。 (#1821) (@YamatoSecurity)
  • Results Summary(およびHTMLレポート)のユニーク検知のパーセンテージがレベル間で鏡写しに入れ替わっていた問題を修正した。逆順ループのインデックスでパーセンテージを計算していたため、例えばcriticalの行にinformationalのパーセンテージが表示されていた(正しかったのは中央のmediumのみ)。 (#1812) (@YamatoSecurity)
  • logon-summaryコマンドで、RDSゲートウェイのログオン(Microsoft-Windows-TerminalServices-Gateway/OperationalのEID 302)のTarget Domain列が常に-になっていた問題を修正した。dst_domainの抽出がイベントキーエイリアスRdsGtwUsernameをスペルミスのRdsGtwUserNameで参照していたため、DOMAIN\user形式の値からドメインが取得されていなかった。 (#1809) (@YamatoSecurity)
  • GeoIP機能がすべてのパブリックIPv6アドレスをPrivateとして扱い、GeoIP検索を行っていなかった問題を修正した。IPv6のプライベート範囲リストにグローバルユニキャスト空間全体である2000::/3が含まれていたことが原因。あわせて冗長なFD00::/8FC00::/7に包含される)も削除し、パブリックIPv6アドレスにASN・国・都市の情報が付与されるようにした。 (#1819) (@YamatoSecurity)
  • 正規表現マッチにフォールバックするワイルドカードのフィールドパターン(? を含む、途中に * がある、または非ASCII文字と * を含むパターン)が、アンカーなしの正規表現にコンパイルされ Regex::is_match()(部分一致検索)で照合されていた問題を修正した。このためフィールド値全体ではなくパターンを単に「含む」値にも一致し、誤検知が発生していた(例: Channel: Sec?rityMySec1rityLog に、net*usermynetXuserZ に一致)。これらのワイルドカード正規表現を値全体にアンカーするようにし、Sigmaの完全一致セマンティクスおよびHayabusaの高速マッチ経路(Exact/StartsWith/EndsWith)と整合させた。キーワード(grep)検索と |re 正規表現は意図的にアンカーなしのままとした。 (#1826) (@Shirofune-Security)
  • HTMLレポートのGeneral Overviewセクションから、解析したイベントファイル数・合計ファイルサイズ・選択した検知ルールセット・除外タグの各行が抜け落ちていた問題を修正した。これらがスペルミスのセクションキー({#general_overview} ではなく # が波括弧の外にある General Overview #{general_overview})で登録されており、レンダラーが描画しないキーだったため、データが黙って破棄されていた。キー(今後ずれないよう共通のセクション名定数に統一)と、あわせて合計ファイルサイズ行・ルールセット行のラベルの誤りを修正した。 (#1827) (@YamatoSecurity)
  • -X/--remove-duplicate-detections で、重複した検知の2件目が、それらがタイムスタンプグループの先頭レコードだった場合に除去されない問題を修正した。get_duplicate_indices() が各グループの先頭レコードを比較用のセットに追加していなかった(初回レコードの分岐とタイムスタンプ境界の分岐の両方で挿入をスキップしていた)ため、2件目が一意とみなされ、3件目以降しか除去されていなかった。この結果、csv-timeline/json-timeline の出力に重複行が残り、検知件数が水増しされていた。タイムスタンプグループ内の同一なN件の検知のうち、ちょうど1件だけが残るように修正した。 (#1828) (@YamatoSecurity)
  • read_encoded_file が、エンコード済みルール(encoded_rules.yml)の読み込み時にI/O読み込みエラーを黙って無視し(切り詰められた・空のルールセットを返す)、不正なUTF-8に対して .expect() でパニックしていた問題を修正した。どちらも Result を通じてエラーとして返すようにした。 (#1834) (@YamatoSecurity)

その他:

  • 可読性向上のため、src/ 内の分かりにくい・誤解を招く・Hayabusa固有の変数・引数・構造体フィールド名76個を、より明確で慣用的なRustの名前にリネームした(例: datasrecordscon_caljoined_valuename_2_nodename_to_nodehlchhorizontal_line_charrulepathrule_pathext_fieldoutput_fields、および実際にはAND条件のAllSelectionNodeを保持していた誤名のor_nodeall_node)。内部識別子のみの変更で、挙動・出力に変化はない。 (#1830) (@YamatoSecurity)
  • hayabusa-evtx クレートを 0.9.9 に更新し、その依存クレート(特に thiserror 1→2、criterion 0.5→0.8)をすべて最新版に更新した。挙動に変更はない。 (#1835) (@YamatoSecurity)
  • レビューで判明した2箇所のデッドコードを削除した。JSON文字列エスケープ処理の常に空になる addition_header 分岐と、相対時刻オフセット解析における到達しない分岐および単位ごとの Vec 割り当て。挙動に変更はない。 (#1834) (@YamatoSecurity)

Don't miss a new hayabusa release

NewReleases is sending notifications on new releases.