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
|neqand|fieldref|neqfield modifiers from the Sigma 2.1 specification.|neqnegates 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 (
infomational→informational) in the pivot keyword list level exclusion that preventedinformational-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 clickablejavascript: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 rulescount. (#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
criticalrow showedinformational's percentage and vice versa (onlymediumwas correct). (#1812) (@YamatoSecurity) logon-summary: the Target Domain column was always-for RDS Gateway logons (EID 302 inMicrosoft-Windows-TerminalServices-Gateway/Operational) because thedst_domainlookup used the misspelled event key aliasRdsGtwUserNameinstead ofRdsGtwUsername, so the domain inDOMAIN\uservalues was silently dropped. (#1809) (@YamatoSecurity)- The GeoIP function treated every public IPv6 address as
Privateand never performed a lookup for them, because the IPv6 private range list included2000::/3(the entire global unicast space). Removed it (along with the redundantFD00::/8, a subset ofFC00::/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 withRegex::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?ritymatchedMySec1rityLog, andnet*usermatchedmynetXuserZ). 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|reregexes 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-detectionsdid 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 incsv-timeline/json-timelineoutput and inflating detection counts. Fixed so exactly one of N identical detections in a timestamp group survives. (#1828) (@YamatoSecurity)read_encoded_filesilently 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 itsResult. (#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.datas→records,con_cal→joined_value,name_2_node→name_to_node,hlch→horizontal_line_char,rulepath→rule_path,ext_field→output_fields, and a misnamedor_node→all_nodethat actually held an AND-semanticsAllSelectionNode) to clearer, idiomatic Rust names for readability. Internal identifiers only; no behavior or output changes. (#1830) (@YamatoSecurity) - Updated the
hayabusa-evtxcrate to0.9.9, bumping all of its dependencies (notablythiserror1→2 andcriterion0.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_headerbranch in the JSON string escaper, and a never-taken branch plus a per-unitVecallocation 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) - ピボットキーワードリスト機能のレベル除外判定にあったタイポ(
infomational→informational)を修正した。この誤字により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::/8(FC00::/7に包含される)も削除し、パブリックIPv6アドレスにASN・国・都市の情報が付与されるようにした。 (#1819) (@YamatoSecurity) - 正規表現マッチにフォールバックするワイルドカードのフィールドパターン(
?を含む、途中に*がある、または非ASCII文字と*を含むパターン)が、アンカーなしの正規表現にコンパイルされRegex::is_match()(部分一致検索)で照合されていた問題を修正した。このためフィールド値全体ではなくパターンを単に「含む」値にも一致し、誤検知が発生していた(例:Channel: Sec?rityがMySec1rityLogに、net*userがmynetXuserZに一致)。これらのワイルドカード正規表現を値全体にアンカーするようにし、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の名前にリネームした(例:datas→records、con_cal→joined_value、name_2_node→name_to_node、hlch→horizontal_line_char、rulepath→rule_path、ext_field→output_fields、および実際にはAND条件のAllSelectionNodeを保持していた誤名のor_node→all_node)。内部識別子のみの変更で、挙動・出力に変化はない。 (#1830) (@YamatoSecurity) hayabusa-evtxクレートを0.9.9に更新し、その依存クレート(特にthiserror1→2、criterion0.5→0.8)をすべて最新版に更新した。挙動に変更はない。 (#1835) (@YamatoSecurity)- レビューで判明した2箇所のデッドコードを削除した。JSON文字列エスケープ処理の常に空になる
addition_header分岐と、相対時刻オフセット解析における到達しない分岐および単位ごとのVec割り当て。挙動に変更はない。 (#1834) (@YamatoSecurity)