Changelog¶
Info
This page mirrors the project CHANGELOG.md. See the Releases page for downloads.
4.0.0 [2026/07/29] - Black Hat Arsenal USA Release¶
Enhancements:
- Combined the
csv-timelineandjson-timelinecommands into a singledfir-timelinecommand whose output format is chosen with-t, --output-type: unspecified or-t csvoutputs CSV (default),-t jsonoutputs JSON, and-t jsonloutputs JSONL. The value is case-insensitive (e.g.-t JSONL). The-tshorthand, previously--threads, now belongs to--output-type(--threadskeeps its long form). The CSV-only options-M, --multiline,-S, --tab-separator, and-R, --remove-duplicate-dataare grouped under a new "CSV Output" help category and now error if used with a non-CSV-t. The oldjson-timeline-L, --JSONL-outputflag is removed (use-t jsonl). (#1906) (@YamatoSecurity) - Standardized all command-line option long names to lowercase for consistency:
--GeoIP→--geo-ip,--HTML-report→--html-report,--UTC→--utc,--ISO-8601→--iso-8601,--RFC-2822/--RFC-3339→--rfc-2822/--rfc-3339,--US-time/--US-military-time/--European-time→lowercase,--JSON-input/--JSON-output→--json-input/--json-output, and--EID-filter→--eid-filter(--GeoIPwas the only long name that joined words by capitalization, so it also gains a hyphen). Short flags are unchanged. The help for-T, --visualize-timeline,-X, --remove-duplicate-detections, and-R, --remove-duplicate-datanow notes that they require event sorting (-s, --sort). (#1909) (@YamatoSecurity) - Added a Linux aarch64 (ARM64) musl release binary (
hayabusa-<ver>-lin-aarch64-musl), built with a proper aarch64 musl cross toolchain so it runs correctly. (The previously reported failure was from linking a musl target with the glibcaarch64-linux-gnu-gcc, which produced a binary killed at startup.) (#1332) (@YamatoSecurity) - The
logon-summarycommand now also counts RDP session events: Security4778/4779(session reconnect/disconnect, which carry the RDP client's workstation name and IP) and the Terminal Services operational events RemoteConnectionManager/Operational1149(network-level authentication) and LocalSessionManager/Operational25(session reconnect) — on top of the existing LocalSessionManager21and Gateway302. This keeps RDP logons summarized even when the matching Security4624has been flooded out of the log, and surfaces the source client hostname for reconnect/disconnect. (#1893) (@YamatoSecurity) - Added PowerShell event IDs
4100/4102(Microsoft-Windows-PowerShell/Operational and PowerShellCore/Operational) and classic403/600(Windows PowerShell) to theextract-base64command.4100/4102scan theContextInfo(Host Application = powershell -encodedcommand ...) andPayloadfields;403/600scan theEventData.Datadetail blob like the existing400. (#1889) (@YamatoSecurity) - Added
First Logon/Last Logoncolumns to thelogon-summarysuccessful-logons table andFirst Attempt/Last Attemptcolumns to the failed-logons table, showing the time range over which each account/source combination logged on (or attempted to). (#1883) (@YamatoSecurity)
Bug Fixes:
- Fixed
eid-metrics,logon-summaryandpivot-keywords-listproducing differently ordered output on every run, so two scans of the same logs could not be diffed.eid-metricsandlogon-summarysorted only by count, leaving equal-count rows inHashMapiteration order, which is reseeded per process; ties are now broken by channel and event ID, and by the logon grouping key.pivot-keywords-listwrote each category's keywords inIndexSetinsertion order, which varies because the values are inserted from the per-record parallel tasks; they are now sorted. Only the ordering changes -- the rows and keywords themselves are the same. (#1912) (@YamatoSecurity) - Fixed a panic in the results-summary tables when a top-5 rule title or author name contained multi-byte UTF-8 (e.g. a Japanese rule title). The titles/authors were truncated with a raw byte slice (
&title[..32],&author[0..24]), which panics when the byte index falls inside a multi-byte character — so with piped/redirected output (where the width defaults such that titles over 32 bytes are truncated) the whole run crashed after the scan finished, losing the summary. Truncation is now done at character boundaries, and the width limits use saturating subtraction so very narrow terminals no longer underflow. (#1904) (@YamatoSecurity) - Fixed
ComplexDataevent fields (e.g. theIdleState/PerfStatevalues in Kernel-Processor-Power EID26) not being extracted correctly: the twoNameattributes collapsed into aNamearray and the field values were dropped entirely. They are now keyed by theirNameattribute like normal<Data>fields (fixed in the bundledhayabusa-evtx, bumped to0.9.10). (#1520) (@YamatoSecurity) - Fixed
-c(custom rules config directory) being ignored bypivot-keywords-list, which always loadedpivot_keywords.txtfrom the bundled config next to the executable. It now resolvespivot_keywords.txtthrough the-cdirectory (falling back to the bundled copy), the same way every other config file is loaded. (#1902) (@YamatoSecurity) - Fixed the
read_jsonl_to_value/read_json_to_valuefile-open error printing the literal placeholder{path}instead of the file path (the error string was a plain string literal rather than aformat!). (#1897) (@YamatoSecurity) - Fixed a
u16underflow in theeid-metricstable's "Event" column width on terminals narrower than 55 columns:terminal_width - 55underflowed before the 45-character floor could apply, panicking in overflow-checked builds and wrapping to a huge value in release builds (leaving the column effectively uncapped). It now uses saturating subtraction. (#1897) (@YamatoSecurity) - Fixed Splunk-JSON timestamps carrying an explicit UTC offset (e.g.
+09:00) being parsed as aNaiveDateTime, which discards the offset and stored the local wall-clock time as if it were UTC — skewing thelog-metricsFirst/Last Timestamp columns as well as theeid-metrics/logon-summarytime ranges (EventMetrics::stats_time_cntandparse_evtx_datetime). The timeline aggregators now share one offset-aware parser (utils::parse_evtx_timestamp) that applies the offset. (#1897) (@YamatoSecurity) - Fixed
-G(GeoIP enrichment) with a custom rules config directory (-c) ignoring that directory'sgeoip_field_mapping.yaml: the lookup used the extensionless namegeoip_field_mapping, which never matched the real file, so it always fell back to the default bundled mapping. (#1897) (@YamatoSecurity) - Fixed
count(field)correlation rules producing a false-positive alert spanning longer than the rule'stimeframe. Injudge_timeframe's sliding window, the branch handling a window that did not satisfy the count condition did an uncheckedadd_data(right)before dropping the left edge, pullingrecords[right]— already known to be outside the timeframe from the window's left edge — into the next window; when that record's field value was new it could push the distinct-value count over the threshold across a span longer than the timeframe. The slide now only drops the left edge and lets the inner loop re-extendrightwith the timeframe check, so no record beyond the timeframe is counted. Barecount()was unaffected. (#1896) (@YamatoSecurity) - Fixed narrow-terminal issues in the results summary:
_print_timeline_histdid uncheckedusizesubtraction that could underflow on a very narrow terminal (huge allocation / hang) — it now skips the histogram when there is no room and usessaturating_sub; the rule-authors table computed its row count with a hard-codedis_multiple_of(4)instead of the actual column count (uneven tables at most widths) — nowauthors_num.div_ceil(table_column_num); and the rule-authors table now falls back to a single column on very narrow terminals (≤72 chars) instead of overflowing/wrapping. Timeline output is unaffected. (#1858) (@YamatoSecurity) - Fixed the ungrammatical "Successed submodule update" message printed after
update-rules(now "Submodule update succeeded"). (#1840) (@YamatoSecurity) - Fixed
temporal/temporal_orderedcorrelations not enforcing the rule'sgroup-byvalue when combining referenced-rule matches. Each referenced rule was aggregated per group-by value, but matches from different groups (e.g. different Computers) could still be correlated together as long as their timestamps fit the timeframe, producing false-positive alerts. Referenced-rule matches are now required to share the base match's group-by value. (#1841) (@YamatoSecurity) - Fixed
temporal_orderedcorrelations not enforcing event order beyond the first referenced rule: a no-op assignment (last_base = base) left every subsequent rule checked only against the base event's window, so out-of-order attack-chain events (e.g. A→C→B for a rule requiring A→B→C) were still matched. Each referenced rule is now required to match at or after the previous rule's matched event while staying within the timeframe window anchored at the base event. (#1841) (@YamatoSecurity)
Other:
- Updated all Rust crate dependencies to their latest versions, including the bundled
hayabusa-evtxcrate to0.9.11(hayabusa-evtx#93). That release is a dependency refresh with no.rschanges, so evtx parsing behavior is unchanged:dfir-timelineCSV/JSON/JSONL output (including with-x, --recover-records) andlog-metricsoutput are byte-identical over a 60-file evtx corpus. (#1912) (@YamatoSecurity) - The version number in every command's CLI help banner (
Hayabusa vX.Y.Z - <Release Name>) is now filled in automatically fromCargo.tomlat compile time viaenv!("CARGO_PKG_VERSION"), instead of being hard-coded in eachhelp_template. The release name lives in a singleRELEASE_NAMEconstant insrc/detections/configs.rs. Cutting a release now means bumping the version inCargo.tomland editing that one constant, rather than hand-updating the banner in every subcommand. Help output is byte-identical. (#1909) (@YamatoSecurity) - Bumped the
compact_strdependency from 0.9 to 0.10. (#1909) (@YamatoSecurity) - Renamed 292 one-character local variables —
let/for/if letbindings, closure parameters, and a few function parameters — to descriptive names based on what each value holds (e.g. a value read from["System"]["Computer"]is nowcomputer, aFile::openresult isfile, a record row in a.mapisrow, a Sigma tag closure|x|is|tag|). Idiomatic names were kept (Err(e)error bindings, loop indices, trivial throwaway closures), and no struct fields, serde identifiers, function/type/macro names, or public API were touched. Pure rename with no functional change: the release binary's.text(machine code) section is byte-identical to before, and thecsv-timeline/json-timelineoutput over the 599-file sample-evtx corpus is byte-for-byte unchanged. (#1905) (@YamatoSecurity) - Reorganized
DefaultMatcher's pipe-modifier handling into per-category modules undersrc/detections/rule/matchers/modifiers/(string,regex,numeric,cidr,fieldref,encoding). Each modifier's logic (pattern wrapping/wildcard conversion, regex flags, numeric comparison, cidr, field references, base64/utf16 encoding) previously lived in hand-enumeratedmatcharms spread acrosspipe_element.rsanddefault_matcher.rs; it now lives in one category module per group, with the value-matching modifiers (cidr/numeric/fieldref) behind a smallValueMatchertrait soDefaultMatcher::is_match_inneris a singlevalue_matchcall. ThePipeElementenum and theMatchPlannormalization from #1862 are unchanged, so adding a Sigma modifier now means editing one category module instead of several dispatch sites. Pure reorganization — 157 matcher tests pass and detection output is byte-identical (the sample-evtx CSV/JSON/search outputs and a 2,838-evtxcsv-timelinecorpus). (#1895) (@YamatoSecurity) - Split
src/detections/rule/mod.rs(~1,200 lines that mixed the module declarations with the core rule types and a large test module) into a newrulenode.rsholdingRuleNode,DetectionNode,CorrelationType,create_rule/get_detection_keys, and the tests, and movedAggResulttocount.rs(next to the aggregation logic and theAggRecordTimeInfoit depends on);mod.rsis now just module wiring plus re-exports, so every existing import path is unchanged. Pure code movement with byte-identical detection output. (#1890) (@YamatoSecurity) - Refactored the ~860-line
App::analysis_filesfunction insrc/main.rs, which inlined the entire interactive rule-set wizard, an unreadable five-positional-arg count closure, ad-hoc channel filters, and progress-bar setup. Extracted four named units:run_scan_wizard()(the whole interactive wizard, returning the selected rule-set label),calculate_wizard_rule_count()(the closure promoted to a free function taking aWizardCountFilterstruct instead of a leadingboolplus threeVec<&str>, now unit-tested),apply_channel_filters()(thelogon-summary/config-critical-systems/log-metricsad-hoc channel filters), andbuild_progress_bar().analysis_filesnow reads as: print totals, wizard, load rules, filter, scan loop, emit. No behavior change — output is byte-identical across every affected subcommand, and the interactive wizard path (not covered by--no-wizardscans) was confirmed a faithful line-by-line move by an adversarial review. (#1885) (@YamatoSecurity) - Refactored the ~700-line
StoredStatic::create_static_datafunction insrc/detections/configs.rs. It took anOption<Config>that was neverNoneand.unwrap()ed it 33 times; the signature now takesConfigand binds the action once (let action = config.action.as_ref()), removing the repeated unwraps and the panic-on-Nonefootgun (all call sites updated). Also extracted three helpers to collapse the copy-paste:resolve_config_file()for the 12-line config-file fallback chain that was duplicated for 9 setting files,is_valid_level()for the repeatedLEVEL::iter().any(...)level validation, andcompact_string_set()for the ~120 lines of include/exclude computer and EID.iter().map(CompactString::from).collect()copy-paste. Net −250 lines inconfigs.rswith no behavior change — output is byte-identical across every affected subcommand (csv-timeline,json-timeline,logon-summary,computer-metrics,log-metrics,search;eid-metricsand thelogon-summarysuccessful table match too, modulo an intra-group tie-order nondeterminism present in the unmodified binary). (#1884) (@YamatoSecurity) - De-duplicated the search command's hit-processing logic.
search_keywordandsearch_regexcarried a verbatim-identical ~65-line tail (extract the event info, look up theProvider_EventIDfield-abbreviation table, normalize the AllFieldInfo whitespace, and either collect the hit for sorting or write it out on the fly), so any fix to the hit path had to be applied twice and the two copies could drift. It is now a singleemit_hitmethod that both loops call after their match predicate. Output is byte-identical for both search modes, sorted and on-the-fly. (#1881) (@YamatoSecurity) - Retired the
PIVOT_KEYWORDglobal mutable (alazy_static RwLock<IndexMap<String, PivotKeyword>>, thepivot-keywords-listkeyword accumulator): it became apivot_keyword: Arc<RwLock<PivotKeywordMap>>field onStoredStatic. Because the keyword values are filled in from the per-record parallel tasks (insert_pivot_keywordinexecute_rule, which readsstored_staticfrom theSTORED_STATICglobal clone) and read back inApp::exec(a separate instance), theArcletsStoredStatic::clone()share one map across both (mirroring the existinggeo_ip_searchfield).load_pivot_keywords/insert_pivot_keywordnow take the map explicitly, and themain.rsread sites usestored_static.pivot_keyword. ThePIVOT_KEYWORD_TEST_LOCK(only needed because the tests shared the global) is gone — each pivot test builds its own local map and they pass under full parallelism. Behavior-preserving —pivot-keywords-listproduces the same category files with byte-identical sorted content on the sample-evtx corpus (the intra-category line order is inherently non-deterministic across runs, onmaintoo, because the keywords are inserted from the parallel tasks). (#1873) (@YamatoSecurity) - Retired the
ERROR_LOG_STACKglobal mutable (alazy_static Mutex<Nested<String>>, the run-wide error-log accumulator flushed to./logs/errorlog-<timestamp>.log): it became anerror_log_stack: Arc<Mutex<Nested<String>>>field onStoredStatic. TheArcletsStoredStatic::clone()share one stack with theSTORED_STATICglobal clone, because errors are pushed from the per-record parallel tasks too (acount(field)miss runs insideRuleNode::select, called per rule fromexecute_rule). The ~28 push sites that already hadstored_staticin scope now usestored_static.error_log_stack; the four functions that only took a barequiet_errors_flag(create_error_log,get_file_size,peek_channel_from_evtx_first_record/create_channel_filter, and thecount→create_count_key→get_alias_value_in_recordchain) take an explicit&Mutex<Nested<String>>threaded from their callers — including throughfilter_evtx_files→apply_channel_filtersolog-metricschannel filtering keeps reporting evtx-open errors. Behavior-preserving — same collect-and-flush semantics, verified end to end (a corrupt evtx still writes the errorlog with itsFailed to open evtx fileentry). (#1875) (@YamatoSecurity) - Retired the
STORED_STATICglobal mutable (alazy_static RwLock<Option<StoredStatic>>, the god-struct itself and the last of the process globals):Detection::execute_ruleruns each rule in its own spawned task and read the sharedStoredStaticback out of this global, whichanalysis_filespublished once before the scan. It had exactly one production reader (execute_rule) and one production writer, so it was purely the fallback that handedstored_staticto the'staticspawned tasks. Nowanalysis_filessnapshotsstored_staticonce into anArc<StoredStatic>— the same single clone the global held, and itsArc-wrapped inner fields (error_log_stack,pivot_keyword) stay shared with the livestored_static, so parallel-path accumulation is still visible — and threads it throughanalysis_file/analysis_json_file/process_detection_batchintoDetection::start/execute_rules, which hands each spawned task its own cheapArc::clone(mirroring the existingrecords_arc);execute_rulereads itsstored_staticargument. The one production write, the global definition, and the redundant test-only primings are gone. Behavior-preserving — detection output is byte-identical on the sample-evtx corpus (CSV, super-verbose profile). (#1876) (@YamatoSecurity) - Retired the last shared-mutable process globals —
COMPUTER_MITRE_ATTCK_MAP(aDashMap) andCOMPUTER_MITRE_ATTCK_UNIQUE_KEYS(aDashSet), the per-computer MITRE ATT&CK tactic accumulators for the HTML report. They becamecomputer_mitre_attck_map: Arc<DashMap<..>>/computer_mitre_attck_unique_keys: Arc<DashSet<..>>fields onStoredStatic(mirroringpivot_keyword/error_log_stack): written from the per-record parallel tasks (create_log_recordinexecute_rule, via the sharedArc) and read/cleared when the report is rendered (_output_html_computer_by_mitre_attcknow takesstored_static). WithSTORED_STATICalready gone, no shared-mutable state remains to force serialized tests, soRUST_TEST_THREADS: 1is dropped from therust.ymlandcoverage.ymlworkflows — the lib + bin suites pass under full parallelism. Behavior-preserving —csv-timelineoutput and the HTML report's MITRE ATT&CK Tactics table (per-computer unique|total counts) are byte-identical on the sample-evtx corpus. (#1878) (@YamatoSecurity) - Scoped the MITRE ATT&CK tactics HTML-report accumulators (
COMPUTER_MITRE_ATTCK_MAPandCOMPUTER_MITRE_ATTCK_UNIQUE_KEYS) to a single report by clearing them after the table is emitted, so a report generated later in the same process no longer leaks keys or undercounts the per-tactic unique count; also removed an intermediateVecwhen joining the tactic cells. No behavior change for normal single-report runs. (#1840) (@YamatoSecurity) - Collapsed the three near-identical detection-selection node types (
AndSelectionNode,AllSelectionNode,OrSelectionNode) into a singleNarySelectionNodeparameterised by a logicalAll/Anyoperator, removing ~105 lines of duplicated code. Pure refactor; output verified byte-identical. (#1843) (@YamatoSecurity) - Replaced the hand-rolled JSON string escaping in
afterfact.rs(_convert_valid_json_str's.replace('🛂', "\\").replace('\\', "\\\\").replace('"', "\\\"")chain) with aserde_json-backed helper, so backslash/quote/control-character escaping is handled by the serializer instead of by inspection. Byte-identicalcsv-timelineandjson-timelineoutput (verified on the sample-evtx corpus; locked by a new regression test and the existing exact-string emit tests); first step of #1845. (#1850) (@YamatoSecurity) - Second step of the JSON-serialization refactor tracked in #1845: rebuilt the
json-timelinerecord assembly onserde_json— each record is now an orderedserde_jsonvalue serialized by the library instead of hand-rolled string concatenation, deleting_create_json_output_format,_convert_valid_json_str,json_escape_body, andprocess_target_stock.csv-timelineoutput is byte-identical;json-timelinedata is identical (verified with an order-preserving canonical compare on the sample-evtx corpus) except that repeatedDetailsarrays now print multi-line, JSONL is standard-compact ("k":v), and a data-corruption bug is fixed — the old JSONL path stripped double-spaces inside values (mangling e.g. author lists andEvtxFilepaths), now preserved verbatim. (#1851) (@YamatoSecurity) - Third step of the JSON-serialization refactor (#1845): the
json-timelineoutput no longer goes through acsv::Writerabused as a plain-text sink — JSON/JSONL records are now written directly to the target (via aResultWriterenum), whilecsv-timelinekeeps usingcsv::Writer. Byte-identical output forcsv-timeline,json-timeline(-o) andjson-timeline(-L), verified on the sample-evtx corpus. (#1852) (@YamatoSecurity) - Renamed the obscure
afterfactmodule and its identifiers to self-describing result-output names:src/afterfact.rs→src/results.rs,AfterfactInfo→ResultOutputState,AfterfactWriter→OutputWriter,output_afterfact→output_results,output_additional_afterfact→output_result_summary, and the localafterfact_info/afterfact_writer→result_state/output_writer. Pure rename; no behavior change (full test suite passes). (#1853) (@YamatoSecurity) - Removed the
🛂emoji-sentinel placeholders thatremove_sp_charused to protect\n/\r/\tfrom its control-character stripping (final step of the #1845 refactor). The real characters are now kept and handled per output format — escaped byserde_jsonfor JSON, collapsed to spaces for CSV/search.csv-timelineoutput is byte-identical;json-timelineoutput changes: an interior newline/tab/CR in a value now serializes as a proper\n/\t/\rescape instead of the old visible\\ntext, and leading/trailing newlines inDetailsvalues are now trimmed. Verified on the sample-evtx corpus (JSON differs only by those two things; no interior content lost). (#1849) (@YamatoSecurity) - Split the ~4,092-line
src/results.rsinto asrc/results/module directory (mod.rspluscsv.rs,json.rs,display.rs,summary.rs,html_stock.rs), separating writer construction, CSV/JSON/terminal-display emit, the summary renderers/statistics, and HTML-stock assembly. Pure code movement — output is byte-identical (verified on the sample-evtx corpus) and the full test suite passes. (#1856) (@YamatoSecurity) - Removed the last
🛂emoji-sentinel marker — the🛂🛂separator used to join multi-authorRuleAuthorvalues for--multiline/--tab-separatorCSV (and terminal display). The author string is now kept raw and split/joined per output mode at the output boundary instead of round-tripping through a marker. Output is byte-identical (verified on the sample-evtx corpus for default/multiline/tab CSV, JSON, and terminal display). Completes the emoji-sentinel removal begun in #1849. (#1860) (@YamatoSecurity) - Normalized
DefaultMatcher's pipe-modifier handling: the fast matcher was built from a hand-enumerated, order- and index-sensitive table of pipe-count / pipe-tuple cases (pipes[0] == Base64 && pipes[1] == Contains,utf16|base64offset|contains,|contains|all|windash, …); it now folds the pipe list into a canonicalMatchPlan { wrap, encoding, utf16, cased, windash, all }in one O(n) pass and builds the matcher from that, and the now-subsumedcreate_fast_matchhelper was removed. All 157 matcher tests and the full lib suite pass, and detection output is byte-identical on the sample-evtx corpus (CSV and JSON). The new dispatch is order- and count-independent: canonically-ordered rules (every real Sigma rule) are unchanged, while a non-canonical modifier order that the old table silently dropped to a regex fallback — ignoring the missed modifier (e.g.|cased|containsmatched case-insensitively) — is now normalized like its canonical form. Part 1 of #1861; thematchers.rsmodule split is a follow-up. (#1862) (@YamatoSecurity) - Split the ~4,900-line
src/detections/rule/matchers.rsinto asrc/detections/rule/matchers/module directory (mod.rsplusleaf_matchers.rs,default_matcher.rs,pipe_element.rs,tests.rs), separating theLeafMatchertrait, the file-based matchers,DefaultMatcher/MatchPlan, thePipeElementenum, and the unit tests. Pure code movement — output is byte-identical (verified on the sample-evtx corpus for CSV and JSON) and the full test suite passes. Part 2 of #1861; the per-modifier trait reorganization is a follow-up. (#1863) (@YamatoSecurity) - De-duplicated the detection batch loops in
main.rs: the evtx and JSON scan loops shared a copy-pasted tail (build records → timeline → run rules → stream-or-buffer the results), and the "emit each batch vs buffer for a final sorted output" branch was repeated at three sites. Extracted a singleemit_or_bufferpolicy helper and a sharedprocess_detection_batchfor the tail (parameterized by a namedBatchPolicyfor the two points where the loops differ). Behavior is unchanged — sorted output is byte-identical on the sample-evtx corpus for CSV and JSON, and the full lib + bin test suites pass. (#1865) (@YamatoSecurity) - Split the ~1,030-line
App::execgod function inmain.rsinto per-subcommand methods so it reads as a dispatcher:run_update_rules,run_level_tuning,run_set_default_profile,run_list_profiles,run_expand_list(the five early-returning match arms),run_pivot_keywords_output(the pivot-keywords-list output block),prompt_critical_systems_config(the config-critical-systems interactive prompt, incl. the 37-lineColorfulThemeliteral — extracted but still called in place so the prompt keeps appearing before "Start time:"), andprint_closing_summary(the elapsed-time / report-links / HTML-render / error-log / debug-stats tail). The method bodies are the original code verbatim; to let them borrowstored_staticfreely the dispatch now matches on an ownedstored_static.config.action.clone()instead of a borrow. Behavior-preserving —csv-timeline/json-timeline/pivot-keywords-listoutput is byte-identical on the sample-evtx corpus. (#1877) (@YamatoSecurity) - De-duplicated repeated clap arguments in
src/detections/configs.rs:--clobber(declared in 8 subcommand structs),--timeline-start/--timeline-end(4 each), and--disable-abbreviations(4) were extracted into sharedClobberOption/TimeRangeOption/DisableAbbreviationsOptionstructs and#[clap(flatten)]-ed into each subcommand, so a new subcommand flattens the shared arg instead of re-declaring it. No CLI change — every subcommand's--helpis byte-identical, and detection output is byte-identical on the sample-evtx corpus (CSV and JSON). (#1867) (@YamatoSecurity) - Retired the
STORED_EKEY_ALIASglobal mutable (alazy_static RwLock<Option<EventKeyAliasConfig>>) in favor of passing the alias config explicitly:create_log_record/create_agg_log_recordnow read&stored_static.eventkey_aliasdirectly,count/countup/create_rec_infotake an explicit&EventKeyAliasConfig(grouped with the rule keys into aRecordBuildContextbuilt once per scanned file andArc-shared into the per-record parallel tasks), and the ~33*STORED_EKEY_ALIAS.write() = Some(...)test primings are gone. Behavior-preserving — detection output is byte-identical on the sample-evtx corpus (CSV and JSON). First increment of retiring the process-global mutable state; the remaining globals are follow-ups. (#1869) (@YamatoSecurity) - Retired the four geo-IP global mutables (
GEOIP_DB_PARSER/GEOIP_DB_YAML/GEOIP_FILTERand theIP_MAPlookup cache): the cache became aMutexfield onGeoIPSearch(used byconvert_ip_to_geo), and the three DB/config globals becameStoredStaticfields (geo_ip_search: Option<Arc<GeoIPSearch>>,geo_ip_db_yaml,geo_ip_filter), read viastored_static.geo_ip_*at every site (create_log_record,emit_csv_inner,load_profile). Behavior-preserving — with--GeoIP(exercising the geo path), detection output is byte-identical on the sample-evtx corpus (CSV and JSON). Second increment of retiring the process-global mutable state. (#1870) (@YamatoSecurity) - Retired the
CHECKPOINTglobal mutable (alazy_static Mutex<CheckPointProcessTimer>, the phase-timing stopwatch): it was only ever used fromApp::exec/App::analysis_files(both&mut self) and never from the parallel tasks, so it became a plaincheckpointfield onApp(no global, noMutex), with the 11CHECKPOINT.lock()...sites replaced byself.checkpoint. Behavior-preserving — the timer only records phase laps and prints them under--debug; a--debugrun still shows the Rule Parse / Analysis / Output processing laps and the elapsed total. Third increment of retiring the process-global mutable state. (#1871) (@YamatoSecurity) - Retired the
HTML_REPORTERglobal mutable (alazy_static RwLock<HtmlReporter>, the HTML-report accumulator):add_md_databecame a method onHtmlReporterandcreate_htmlnow takes&self, andApp::execowns a singleHtmlReporterthreaded as&mutdown every path that records report sections (rule-load info, results summary, profile/overview) before rendering it — replacing the global writes and the finalread().to_owned().create_html(). TheHTML_REPORTER_TEST_LOCK(only needed because tests shared the global) is also gone, and the report-section keys now use theGENERAL_OVERVIEW_SECTION/RESULTS_SUMMARY_SECTIONconstants everywhere. Behavior-preserving — with--html-reportthe generated HTML is byte-identical on the sample-evtx corpus (aside from the non-deterministic elapsed time). Fourth increment of retiring the process-global mutable state. (#1872) (@YamatoSecurity)
3.10.0 [2026/07/04] - Independence Day Release¶
Enhancements:
- 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) (@YamatoSecurity) - 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)
3.9.0 [2026/04/29] - Showa Day Release¶
Enchancements:
Support for MITRE ATT&CK v19. (@fukusuket)
Other:
Added unit tests. (#1746) (@Fuzzdkk)
3.8.1 [2026/02/24] - Spring Hayfever Release¶
Bug Fixes:
Fixed multiple progress bars issue. (#1740) (@fukusuket)
3.8.0 [2026/01/31] - Winter Release¶
Bug Fixes:
- Fixed MaxMind compile error. (#1722) (@fukusuket)
- When
-GeoIPis specified, the GeoIP fields were outputed in both theDetailsandExtraFieldInfoin the JSON timelines. (#1724) (@fukusuket) - Fixed a possible panic with corrupted logs. (#1732) (@fukusuket)
Vulnerability Fixes:
- Fixed an XSS vulnerability in the HTML report if a user scans JSON exported logs (not the standard
.evtxfiles) and an attacker has the ability to inject malicious Javascript in theComputerfield of those logs. (@fukusuket) - Many thanks to the Mobasi team for finding and reporting this!
3.7.0 [2025/11/15] - CODE BLUE Release¶
New Features:
- Added a
-V, --validate-checksumsoption to check chunk header checksums in thecsv-timelineandjson-timelinecommands. (#1709) (@fukusuket)
Enhancements:
- Added four new command-line options
--include-channel,--exclude-channel,--include-filename, and--exclude-filenameto thelog-metricscommand. (#1715) (@fukusuket) - Updated the Timesketch install readme to support Timesketch on ARM-based Macs. (#1719) (@fukusuket)
Bug Fixes:
- When
validate_checksumis disabled (default), an infinite loop and memory leak when the data_size of an event is set to zero was fixed. (omerbenamram/evtx#264) -t, --threadswas not working in thecomputer-metricsandsearchcommands. (#1563) (@hach1yon)computer-metricswas giving incorrect results when logs from multiple comuters were scanned. (#1713) (@fukusuket)
3.6.0 [2025/09/25] - Nezamezuki Release¶
Enhancements:
- Event and record IDs with multiple possibilities due to correlation rules are now outputted as empty strings instead of
-for easier parsing. (#1694) (@fukusuket) - We now output first and last detection timestamps instead of just the first and last timestamps found in the
Results Summaryof thecsv-timelineandjson-timelinecommands. (#1688) (@fukusuket) - The guide on how to import Hayabusa JSONL results into SOF-ELK (Elastic Stack) was updated. (#1091) (@yamatosecurity)
- Output an empty string instead of
-in the rule's modified date if it is not defined to make importing into a SIEM easier. (#1702) (@yamatosecurity) - Empty fields in rule metadata like
RuleModifiedDate, etc... are not outputted to JSON if they are empty in order to make parsing easier and decrease file size. (#1702) (@fukusuket)
Bug Fixes:
-T, --visualize-timelinewould output incorrect results if-s, --sortwas not specified so we now require-swhen-Tis used. (#1690) (@yamatosecurity)- Records outside the range specified by the time range options (
--timeline-start/--timeline-end) were being displayed because we were filtering with the timestamps in the record headers instead of the timestamps in the records themselves. (#1689) (@fukusuket) - GeoIP lookup was not working with
json-timeline. (#1693) (@fukusuket) - The
searchcommand would not consistently abbreviate fields. (#1697) (@fukusuket)
3.5.0 [2025/08/16] - Obon Release¶
Enhancements:
- Hayabusa now supports the
base64field modifier. (#1677) (@fukusuket)
3.4.0 [2025/08/01] - Black Hat Arsenal USA 2025 Release¶
Enhancements:
- Field names are now abbreviated in the
searchcommand. You can disable with-b, --disable-abbreviations. (#1627) (@hitenkoku) - 32-bit version of Hayabusa will now also run on 64-bit OSes. (#1665) (@akkuman)
- We now put a return character after the last line in JSON/L files so that filebeat will not miss the last event. (#1666) (@fukusuket)
Bug Fixes:
- Levels would be abbreviated even when
--disable-abbreviationswas enabled. (#1672) (@fukusuket)
3.3.0 [2025/03/22] - AUSCERT/SINCON Release¶
Enhancements:
- Now output file size in base 1024 (Ex:
KiB,MiB,GiB). (#1648) (@fukusuket) - Improved the uptime calculation in the
computer-metricscommand. (#1656) (@fukusuket)
Bug Fixes:
- The
computer-metricscommand was not working with the Windows live response package. (#1654) (@fukusuket) ruletypefield was returned to being an optional field. (#1660) (@fukusuket)
3.2.0 [2025/04/02] - Vegemite Release¶
Enhancements:
- Added uptime and timezone info to the
computer-metricscommand. (#1638) (@fukusuket) - Improved checking and logging of invalid rules. (#1601) (@fukusuket)
- Added first and last timestamp to the default output. (#1616) (@fukusuket)
Bug Fixes:
- Scans would fail if the
.evtxfile was not able to be opened. (#1634) (@fukusuket) - Elapsed time and saved file information was not being outputted in the HTML report. (#1643) (@fukusuket)
3.1.1 [2025/03/12] - Laksa Release¶
Enhancements:
- Updated Rust edition to 2024. (@fukusuket)
- Added OS information to the
computer-metricscommand. (#1629) (@fukusuket)
Bug Fixes:
- The number of
expandrules was not being properly displayed on the terminal. (#1598) (@fukusuket) - Rules without the
statusfield defined would be loaded even if you specifiedstatus: test, stable, etc... in the Scan Wizard. (#1602) (@fukusuket) expandrules were being loaded without configuration. (#1606) (@fukusuket)- Detecting double Base64 encoding was not working properly with the
extract-base64command. (#1607) (@fukusuket) - The terminal text would sometimes turn red after an error message. (#1610) (@fukusuket)
- The progress bar would not display when
-doption was used but-owas not used for some commands. (#1617) (@fukusuket) - The
pivot-keywords-listcommand was broken. (#1619) (@fukusuket) - Field data mapping was not working when
detailswas not defined. (#1614) (@fukusuket) - When the
detailsfield was not set, duplicate data was outputted to both theDetailscolumn andExtraFieldInfocolumn. Now it is just outputted to theDetailscolumn. (#1623) (@fukusuket)
3.1.0 [2025/02/22] - Ninja Day Release¶
New Features:
-X, --remove-duplicate-detectionsoption toeid-metricsandlogon-summarycommands. (#1552) (@fukusuket)- New "Emergency Alerts" and severity level adjustment based on critical systems. Add a list of the computer names of critical systems (Ex: Domain Controllers, File Servers, etc...) to
config/critical_systems.txtand all of the alerts abovelowwill be adjusted one higher. That is,lowwill becomemedium,mediumwill becomehigh, etc...criticalalerts will become newemergencyalerts. (#1551) (@fukusuket) - New
config-critical-systemscommand to automatically find domain controllers and file servers to add to the./config/critical_systems.txtfile. (#1570) (@fukusuket) - Added a
-S, --tab-separatoroption in thecsv-timeline,searchandlog-metricscommands to separate field information by tabs. (#1587) (@fukusuket)
Enhancements:
- Added
--timeline-start/--timeline-endoptions to thesearchcommand. (#1543) (@fukuseket) - Significantly improved the speed of the
logon-summarycommand with channel filtering. (#1544) (@fukusuket) - The
extract-base64command now also works onPowerShell Classic EID 400events. (#1549) (@fukusuket) - The
extract-base64command now also scans PowerShell Core logs as well. (#1558) (@fukusuket) - The
extract-base64command now also scansSystem 7045(Service Creation) events. (#1583) (@fukusuket) searchcommand uses much less memory and is faster as it does not sort results by default now. You can sort results like before with the new-s, --sortoption. (#1475) (@hach1yon)
Bug Fixes:
- An unneeded file was being created with
logon-summaryandpivot-keywords-listcommands. (#1553) (@fukusuket) - MITRE tactics JSON output was not consistent for a few rules. (#1573) (@fukusuket)
- Rule authors would not be outputted to the HTML report in version
v3.0.x. (#1571) (@fukusuket) - The rule file name for correlation rules would not be outputted in the JSON timeline when the live response encoded rules were used. (#1572) (@fukusuket)
- The
level-tuningcommand was not working. (#1584) (@fukusuket)
Other:
- The
-s, --sort-eventsoptions have been renamed to-s, --sort. (@YamatoSecurity) - Added the
RuleIDto all profiles exceptminimal. (@YamatoSecurity) - Code refactoring: use default trait to reduce unnecessary initialization codes in StoredStatic. (#1588) (@fukusuket)
3.0.1 [2024/12/29] - 3rd Year Anniversary Release¶
Bug Fixes:
- Hayabusa would fail in rule parse checking on the backend with
expandrules. (#1537) (@fukusuket)
3.0.0 [2024/12/25] - 3rd Year Anniversary Release¶
New Features:
- New
extract-base64command to extract and decode base64 strings from events. (#1512) (@fukusuket) - New
expand-listcommand to output placeholder names used for rules with theexpandmodifier. (#1513) (@fukuseket) - Support for
expandfield modifiers. (#1434) (@fukusuket) - Support for Temporal Proximity (
temporal) correlation rules. (#1446) (@fukusuket) - Support for Temporal Ordered Proximity (
temporal_ordered) correlation rules. (#1447) (@fukusuket)
Enhancements:
- Log file size added to
log-metricscommand. (#1528) (@fukusuket)
Bug Fixes:
- Sorting with
csv-timelinewas not done perfectly when record IDs were outputted. (#1519) (@fukusuket) -J, --JSON-inputwould only accept.jsonfiles, not.jsonlfiles so now both are supported. (#1530) (@fukusuket)
2.19.0 [2024/11/26] - "Every Day Is A Good Day" Release¶
New Features:
- Support for the
gt,gte,lt,ltefield modifiers. (#1433) (@fukusuket) - New
log-metricscommand to get information about.evtxfiles. (computer names, event count, first timestamp, last timestamp, channels, providers) (#1474) (@fukusuket) - New
-b, --disable-abbreviationsoptions for the following commands to disableChannelandProviderabbreviations for when you want to check the original values. (#1485) (@fukusuket) csv-timelinejson-timelineeid-metricslog-metricssearch- Support for
utf16/utf16be/utf16le/widefield modifiers to be used with thebase64offset|containsfield modifier. (#1432) (@fukusuket) utf16|base64offset|containsutf16be|base64offset|containsutf16le|base64offset|containswide|base64offset|contains
Enhancements:
- Updated the
yaml-rustcrate toyaml-rust2. (#461) (@yamatosecurity) windashcharacters are now being dynamically read fromrules/config/windash_characters.txt. (#1440) (@fukusuket)logon-summarycommand now displays logon information from RDP events. Note: Hayabusa will output more detailed information when saving to a file. (#1468) (@fukusuket)- The colors were updated to make it easier to read. (#1480) (@yamatosecurity)
- Added start and finish messages of the day. (#1492) (@fukusuket)
- New color scheme added to output. (#1491) (@fukusuket)
- File size is now displayed next to the file name under the progress bar. (#1471) (@fukusuket)
Bug Fixes:
logon-summarycommand would sometimes crash with corrupted logs. (#1477) (@fukusuket)- Some results would be displayed after the progress bar when outputting results to the terminal with
csv-timelineandjson-timeline. (#1459) (@fukusuket) - The detailed field value results in aggregation rule alerts were not sorted so
csv-timelineandjson-timelinewould not output completely exact results each time. (#1466) (@fukusuket) - Updated
hayabusa-evtxcrate to0.8.12. (@yamatosecurity) - JSON field output order is now preserved according to the original XML. (omerbenamram/evtx #241)
- Multiple sub-nodes with attributes and the same name would be overwritten and only the last one kept. (omerbenamram/evtx #245)
logon-summaryandeid-metricswould sometimes output multiple progress bars. #1479 (@fukusuket)- The progress bar has been removed when outputting to terminal and not sorting events as is unneeded. #1508 (@fukusuket)
Other:
- The
--timeline-offsetoption has been renamed to--time-offset. (#1490) (@yamatosecurity)
2.18.0 [2024/10/23] - SecTor Release¶
New Features:
- Support for the
fieldrefmodifier (alias to theequalsfieldmodifier). (#1409) (@hitenkoku) - The
fieldref|endswithmodifier was created as an alias toendswithfieldto replace it in the future. (#1437) (@fukusuket) - Support for
fieldref|startswithandfieldref|containsmodifiers. (#1439) (@fukusuket) - Support for XOR encoded rules to minimize files put on the system as well as bypass anti-virus products that give false positives on rules. (#1419) (@fukusuket)
- We will include packages in the Releases page that are already configured to use this. If you wanted to manually configure this though, download encoded_rules.yml and place it in the Hayabusa's root folder. This file is created from the rules in the hayabusa-rules repository and is automatically updated anytime there is a rule update. Delete all of the files inside the
rulesfolder except for theconfigdirectory as those files are not yet contained in a single file. - Note: The report generated by the
-Hoption cannot create a link to the rule (only the rule name is outputted.) rules/configconfig files are now loaded from a single file rules_config_files.txt to reduce the number of files needed to be stored on a target system for live response. (#1420) (@fukusuket)
Bug Fixes:
- Unneeded line breaks when using
-oin thesearchcommand. (#1425) (@fukusuket) - Sigma correlation rules required the
group-byfield but now it is optional. (#1442) (@fukusuket) - Hayabusa will give an error message if the rules referenced by a correlation rule are not found. (#1444) (@fukusuket)
- Field information was not being outputted when the
all-field-infoprofiles were used. (#1450) (@fukusuket)
Other:
- License is changed from GPL-3.0 to AGPL-3.0. (@yamatosecurity)
2.17.0 [2024/08/23] "HITCON Community Release"¶
New Features:
- Support for the Sigma V2
|re:submodifers. (#1399) (@fukusuket) - Reference: https://github.com/SigmaHQ/sigma-specification/blob/main/appendix/sigma-modifiers-appendix.md
|re|i:: (insensitive) disable case-sensitive matching.|re|m:: (multi-line) match across multiple lines.^/$match the start/end of line.|re|s:: (single-line) the dot character (.) matches all characters, including the newline character.
- Support for the Sigma V2
|exists:modifier. (#1400) (@hitenkoku) - Support for the Sigma V2
|cased:modifier. (#1401) (@hitenkoku)
Enhancements:
- Support for the newer version 0.6.x
cidr-utilscrate. (#1366) (@hitenkoku) - Added support for Sigma correlation rule's
namelookup. (#1363) (@fukusuket) - Enabled low memory mode by default.
-s, --low-memory-modeis now-s, --sort-events- Sort events before outputting results. (warning: this uses much more memory!). (#1361) (@hitenkoku) - Note: you need to enable sorting in order to use
-R, --remove-duplicate-dataand-X, --remove-duplicate-detections. - Sigma correlation reference rules now do not output alerts by default. You can enable them by adding
generate: trueto the rule. (#1367) (@fukusuket) Datafields are now displayed as indexed strings instead of as allDatafields or in an array for JSON. (#1371) (@fukusuket)- Before:
"Data": ["17514", "Multiprocessor Free", "Service Pack 1"] - After:
"Data[3]": "17514", "Data[4]": "Multiprocessor Free", "Data[5]": "Service Pack 1" - The configuration files in the
configfolder are now also embedded in the binary to reduce the number of files in the release package. (#1370) (@hitenkoku) - Note: you will not be able to run the
set-default-profilecommand without theconfigdirectory files as it relies onconfig/default_profile.yaml. - Aggregation rule alerts now show
ChannelandEventIDinformation even when there are multiple results. (#1342) (@fukusuket) - In the JSON timeline, when there is no information in the
Detailsfield, we changed the default output of"-"to{}in order to make parsing easier. (#1386) (@hitenkoku) - Added support for the
–(en dash),—(em dash), and―(horizontal bar) characters for thewindashmodifier to prevent signature bypass. (#1392) (@hitenkoku) - Updated the MITRE ATT&CK tags to support Sigma version 2 format. (Ex:
defense_evasion=>defense-evasion) (@fukusuket) - Updated the
evtxcrate to the latest for enhancements and bug fixes.
Bug Fixes:
- Sigma correlation rule count was not showing up in
Events with hits. (#1373) (@fukusuket) - Correlation rule count was not showing up in
Events with hits. (#1374) (@fukusuket) - Aggregation condition rule count was not showing up in
Events with hits. (#1375) (@fukusuket) - In rare cases, the list of rule authors would not be displayed to the terminal. (#1383) (@fukusuket)
2.16.0 [2024/06/11] "FIRSTCON24 Release"¶
New Features:
- By default now, only rules that are applicable to loaded evtx files will be enabled. This is based on the
Channelfield in.evtxfile and.ymlrule. For example, ifSecurity.evtxwas being scanned, then only rules that haveChannel: Securitydefined will be used against this file. In our benchmarks, this usually gives a speed benefit of around 20% when scanning singleevtxfiles but can give up a 10x speed performance depending on the file. If you think there are multiple channels being used in a single.evtxfile or you want to use rules that do not have theChannelfield defined in order to scan all.evtxfiles regardless of the channel, then you can turn off this filtering with the-A, --enable-all-rulesoption incsv-timelineandjson-timeline. (#1317) (@fukusuket) - Currently, the only two detection rules that do not have
Channeldefined and are intended to scan all.evtxfiles are the following: - By default now,
.evtxfiles that have applicable rules will be loaded. So for example, if you are scanning a directory of various event logs but only enable a rule that is looking forChannel: Securitythen Hayabusa will ignore all non-security event logs. In our benchmarks, this gives a speed benefit of around 10% with normal scans and up to 60%+ performance increase when scanning with a single rule. If you want to load all.evtxfiles regardless of channel, then you can turn off this filtering with the-a, --scan-all-evtx-filesoption incsv-timelineandjson-timeline. (#1318) (@fukusuket) - Note: Channel filtering only works with .evtx files and you will receive an error if you try to load event logs from a JSON file with
-J, --json-inputand also specify-Aor-a. (#1345) (@fukusuket) - Support for Sigma Correlation's Event Count. (#1337) (@fukusuket)
- Support for Sigma Correlation's Value Count. (#1338) (@fukusuket)
Enhancements:
- You can now specify multiple directories with the
-d, --directoryoption. (#1335) (@hitenkoku) - You can now analyze Splunk logs exported from the REST API. (#1083) (@hitenkoku)
- You can now specify multiple groups with
count. Ex:count() by IpAddress,SubStatus,LogonType >= 2Also, the output has been updated. Ex:[condition] count(TargetUserName) by IpAddress > 3 in timeframe [result] count: 4 TargetUserName:tanaka/Administrator/adsyncadmin/suzuki IpAddress:- timeframe:5m->Count: 4 ¦ TargetUserName: tanaka/Administrator/adsyncadmin/suzuki ¦ IpAddress: -(#1339) (@fukusuket) - Added support for specifying an optional
Provider_Namefield in field data mapping files (rules/config/data_mapping/*.yaml) as well as support forData[x]notation. (#1350) (@fukusuket) - JSON output in count rules now separates field information. (#1342) (@fukusuket)
- Before:
"Details": "[condition] count() by IpAddress >= 5 in timeframe [result] count:3558 IpAddress:192.168.198.149 timeframe:5m" - After:
"Details": { "Count": 3558, "IpAddress": "192.168.198.149" }
2.15.0 [2024/04/20] "Sonic Release"¶
Enhancements:
- Added support for
windashfield modifier (ex.|contains|windash:,|contains|all|windash:) in sigma rules. (#1319) (@hitenkoku) - https://sigmahq.io/docs/basics/modifiers.html#windash
- Note: currently on the backend we convert the use of
windashin rules so they are compatibile with previous versions of Hayabusa, however, around the end of May we will start to keep the use ofwindashas-is so please update to this version before then or else you will recieve rule parsing errors if you update rules.
Bug Fixes:
-Tdetection frequency timeline was not usable in version 2.14.0. (#1322) (@fukusuket)- Fixed
windashnot working when there is a wildcard. (#1327) (@hitenkoku)
2.14.0 [2024/03/30] "BSides Tokyo Release"¶
New Features:
- Added
--include-statusoption: You can specify rules based on theirstatus. (#1193) (@hitenkoku) - Added a
-s, --low-memory-modeoption that uses up to 95% less memory. However, in order to do this, Hayabusa cannot sort results nor use-R, --remove-duplicate-dataand/or-X, --remove-duplicate-detectionsin combination. (#1254) (@hach1yon @hitenkoku)
Enhancements:
- Removed unused crates. (@YamatoSecurity)
- JSON input now supports the format exported from Splunk. (#1083) (@hitenkoku)
- Performance enchancements. (#1277, #1278) (@fukusuket)
- Reordered
searchresult fields to look similar to thecsv-timelinecommand results. (#1297) (@hitenkoku) - Added master piece character in ascii art eggs. R.I.P. lovely master hidden behind the gas mask. (#1304) (@hitenkoku)
- Unified help option format in
computer-metricscommand with other commands. (#1314) (@hitenkoku)
Bug Fixes:
- JSON output of the
searchcommand was missing theAllFieldInfofield. (#1251) (@hitenkoku) - The time the user took to choose options in the scan wizard was included in elapsed time so we now exclude that. (#1291) (@hitenkoku)
- Fixed
-h, --helpoption is being displayed multiple times. (#1309) (@hitenkoku)
2.13.0 [2024/02/11] "Year Of The Dragon Release"¶
Enhancements:
- Adjusted the
searchcommand's Filter option to be an exact match and support wildcard characters. (#1240) (@hitenkoku) - Any time there is a change in a detection rule, it will be displayed when running the
update-rulescommand. Previously, only rules that updated theirmodifiedfield would be displayed. (#1243) (@hitenkoku) - The
json-timelinecommand now outputs in JSON format when outputting to the terminal. (#1197) (@hitenkoku) - Added support for parsing JSON input when the data is inside an array. (#1248) (@hitenkoku)
- Changed the
‖separator into a·separator to make it easier to read and render properly on older terminals. (#1258) (@YamatoSecurity) - Added a
-h, --helpoption to General Options for all commands. (#1255) (@hitenkoku) - Changed the
Detailsoutput in thejson-timelinecommand from alphabetical order to the original order. - Loading detection rules is now skipped when running commands that do not need them. (#1263) (@hitenkoku)
- Improved the standard output colors in the
csv-timelinecommand. (#1271) (@hitenkoku) - Refactoring and performance enhancements. (#1268, #1260) (@hach1yon)
Bug Fixes:
- Removed newline characters in the
searchcommand output. (#1253) (@hitenkoku) - Fixed the progress bar and wizard colored output when the
--no-coloroption is used. (#1256) (@hitenkoku) - Fixed a panic when the local timezone was not able to be identified. This was fixed in the
chronocrate version 0.4.32. (#1273)
2.12.0 [2023/12/23] "SECCON Christmas Release"¶
Enhancements:
%MitreTactics%,%MitreTags%,%OtherTags%fields are now outputted as an array of strings in JSON output. (#1230) (@hitenkoku)- Added a summary of MITRE ATT&CK tactics that were detected for each computer in the HTML report. In order to use this feature, you need to use a profile that includes the
%MitreTactics%field. (#1226) (@hitenkoku) - Output messages about reporting issues and false positives when using
csv-timelineorjson-timelinecommands. (#1236) (@hitenkoku)
Bug Fixes:
- In JSON output, multiple field names with the same names were not outputted as an array so only one result would be returned when parsing with
jq. We fixed this by outputting multiple field data with the same field name inside an array. (#1202) (@hitenkoku) - Fixed a bug in the
csv-timeline,json-timeline,eid-metrics,logon-summary,pivot-keywords-listandsearchcommands so that Hayabusa will quit whenever no input option (-l,-for-d) is specified. (#1235) (@hitenkoku)
2.11.0 [2023/12/03] "Nasi Lemak Release"¶
New Features:
- Extraction of fields from PowerShell classic logs. (Can disable with
--no-pwsh-field-extraction) (#1220) (@fukusuket)
Enhancements:
- Added rule count in the scan wizard. (#1206) (@hitenkoku)
2.10.1 [2023/11/13] "Kamemushi Release"¶
Enhancements:
- Added questions to the scan wizard. (#1207) (@hitenkoku)
Bug Fixes:
update-rulescommand would outputYou currently have the latest ruleseven if new rules were downloaded in version2.10.0. (#1209) (@fukusuket)- Regular expressions would sometimes be incorrectly handled. (#1212) (@fukusuket)
- In the rare case that there is no
Datafield such as for JSON input, a panic would occur. (#1215) (@fukusuket)
2.10.0 [2023/10/31] "Halloween Release"¶
Enhancements:
- Added a scan wizard to help new users choose which rules they want to enable. Add the
-w, --no-wizardoption to run Hayabusa in the traditional way. (Scan for all events and alerts, and customize options manually.) (#1188) (@hitenkoku) - Added the
--include-tagoption to thepivot-keywords-listcommand to only load rules with the specifiedtagsfield. (#1195) (@hitenkoku) - Added the
--exclude-tagoption to thepivot-keywords-listcommand to exclude rules with specifictagsfrom being loaded. (#1195) (@hitenkoku)
Bug Fixes:
- Fixed that field information defined in
Detailswas also output toExtraFieldInfoin some cases. (#1145) (@hitenkoku) - Fixed output of newline and tab characters in
AllFieldInfoin JSON output. (#1189) (@hitenkoku) - Fixed output of space characters in some fields in standard output. (#1192) (@hitenkoku)
2.9.0 [2023/09/22] "Autumn Rain Release"¶
Enhancements:
- Added an error message to indicate that when you can't load evtx files in Windows due to specifying a directory path with spaces in it, you need to remove the trailing backslash. (#1166) (@hitenkoku, thanks for the suggestion from @joswr1ght)
- Optimized the number of records to load at a time for performance. (#1175) (@yamatosecurity)
- Replaced double backslashes in paths under the progress bar on Windows systems with single forward slashes. (#1172) (@hitenkoku)
- Made the
Detailsfield forcountrules a string in the JSON output for easier parsing. (#1179) (@hitenkoku) - Changed the default number of threads from number of CPUs to the estimate of the default amount of parallelism a program should use (
std::thread::available_parallelism). (#1182) (@hitenkoku)
Bug Fixes:
- Fixed JSON fields would not be correctly parsed in rare cases. (#1145) (@hitenkoku)
Other:
- Removed the unmaintained
hhmmsscrate that uses an oldtimecrate in order to pass the code coverage CI checks. (#1181) (@hitenkoku)
2.8.0 [2023/09/01] "Double X Release"¶
New Features:
- Added support for
HexToDecimalin the field mapping configuration files to convert hex values to decimal. (Useful for converting the original process IDs from hex to decimal.) (#1133) (@fukusuket) - Added
-x, --recover-recordsoption tocsv-timelineandjson-timelineto recover evtx records through file carving in evtx slack space. (#952) (@hitenkoku) (Evtx carving feature is thanks to @forensicmatt) - Added
-X, --remove-duplicate-detectionsoption tocsv-timelineandjson-timelineto not output any duplicate detection entries. (Useful when you use-x, include backup logs or logs extracted from VSS with duplicate data, etc...) - Added a
--timeline-offsetoption tocsv-timeline,json-timeline,logon-summary,eid-metrics,pivot-keywords-listandsearchcommands to scan just recent events based on a offset of years, months, days, hours, etc... (#1159) (@hitenkoku) - Added a
-a, --and-logicoption in thesearchcommand to search keywords with AND logic. (#1162) (@hitenkoku)
Other:
- When using
-x, --recover-records, an additional%RecoveredRecord%field will be added to the output profile and will outputYto indicate if a record was recovered. (#1160) (@hitenkoku)
2.7.0 [2023/08/03] "SANS DFIR Summit Release"¶
New Features:
- Certain code numbers are now mapped to human-readable messages based on the
.yamlconfig files in./rules/config/data_mapping. (Example:%%2307will be converted toACCOUNT LOCKOUT). You can turn off this behavior with the-F, --no-field-data-mappingoption. (#177) (@fukusuket) - Added the
-R, --remove-duplicate-dataoption in thecsv-timelinecommand to replace duplicate field data with the stringDUPin the%Details%,%AllFieldInfo%,%ExtraFieldInfo%columns to reduce file size. (#1056) (@hitenkoku) - Added the
-P, --proven-rulesoption incsv-timelineandjson-timelinecommands. When used, Hayabusa will only load rules that have been proven to work. These are defined by rule ID in the./rules/config/proven_rules.txtconfig file. (#1115) (@hitenkoku) - Added the
--include-tagoption tocsv-timelineandjson-timelinecommands to only load rules with the specifiedtagsfield. (#1108) (@hitenkoku) - Added the
--exclude-tagoption tocsv-timelineandjson-timelinecommands to exclude rules with specifictagsfrom being loaded. (#1118) (@hitenkoku) - Added
--include-categoryand--exclude-categoryoptions tocsv-timelineandjson-timelinecommands. When using--include-category, only rules with the specifiedcategoryfield will be loaded.--exclude-categorywill exclude rules from being loaded based oncategory. (#1119) (@hitenkoku) - Added the
computer-metricscommand to list up how many events there are based on computer name. (#1116) (@hitenkoku) - Added
--include-computerand--exclude-computeroptions tocsv-timeline,json-timeline,metrics,logon-summaryandpivot-keywords-listcommands. The--include-computeroption only scans the specified computer(s).--exclude-computerexcludes them. (#1117) (@hitenkoku) - Added
--include-eidand--exclude-eidoptions tocsv-timeline,json-timeline, andpivot-keywords-listcommands. The--include-eidoption only scans the specified EventID(s).--exclude-eidexcludes them. (#1130) (@hitenkoku) - Added the
-R, --remove-duplicate-dataoption to thejson-timelinecommand to replace duplicate field data with the stringDUPin the%Details%,%AllFieldInfo%,%ExtraFieldInfo%fields to reduce file size. (#1134) (@hitenkoku)
Enhancements:
- Ignore corrupted event records with timestamps before 2007/1/31 when Windows Vista was released with the new
.evtxlog format. (#1102) (@fukusuket) - When
--outputis set in themetricscommand, the results will not be displayed to screen. (#1099) (@hitenkoku) - Added the
-C, --clobberoption to overwrite existing output files in thepivot-keywords-listcommand. (#1125) (@hitenkoku) - Renamed the
metricscommand toeid-metrics. (#1128) (@hitenkoku) - Reduced progress bar width to leave room for adjustment of the terminal. (#1135) (@hitenkoku)
- Added support for outputing timestamps in the following formats in the
searchcommand:--European-time,--ISO-8601,--RFC-2822,--RFC-3339,--US-time,--US-military-time,-U, --UTC. (#1040) (@hitenkoku) - Replaced the ETA time in the progress bar with elapsed time as the ETA time was not accurate. (#1143) (@YamatoSecurity)
- Added
--timeline-startand--timeline-endto thelogon-summarycommand. (#1152) (@hitenkoku)
Bug Fixes:
- The total number of records being displayed in the
metricsandlogon-summarycommands differed from thecsv-timelinecommand. (#1105) (@hitenkoku) - Changed rule count by rule ID instead of path. (#1113) (@hitenkoku)
- Fixed a problem with incorrect field splitting in the
CommandLinefield in JSON output. (#1145) (@hitenkoku) --timeline-startand--timeline-endwere not working correctly with thejson-timelinecommand. (#1148) (@hitenkoku)--timeline-startand--timeline-endwere not working correctly with thepivot-keywords-listcommand. (#1150) (@hitenkoku)
Other:
- The total count of unique detections are now based on rule IDs instead of rule file paths. (#1111) (@hitenkoku)
- Renamed the
--live_analysisoption to--live-analysis. (#1139) (@hitenkoku) - Renamed the
metricscommand toeid-metrics. (#1128) (@hitenkoku)
2.6.0 [2023/06/16] "Ajisai Release"¶
New Features:
- Added support for
'|all':keyword in sigma rules. (#1038) (@kazuminn)
Enhancements:
- Added
%ExtraFieldInfo%alias to output profiles which will output all of the other fields that do not get outputted inDetails. This is now included in the defaultstandardoutput profile. (#900) (@hitenkoku) - Added error messages for incompatible arguments. (#1054) (@YamatoSecurity)
- The output profile name is now outputted to standard output and in the HTML report. (#1055) (@hitenkoku)
- Added rule author names next to rule alerts in the HTML report. (#1065) (@hitenkoku)
- Made the table width shorter to prevent tables breaking in smaller terminal sizes. (#1071) (@hitenkoku)
- Added the
-C, --clobberoption to overwrite existing output files incsv-timeline,json-timeline,metrics,logon-summary, andsearchcommands. (#1063) (@YamatoSecurity, @hitenkoku) - Made the HTML report portable by embedding the images and inlining CSS. (#1078) (@hitenkoku, thanks for the suggestion from @joswr1ght)
- Speed improvements in the output. (#1088) (@hitenkoku, @fukusuket)
- The
metricscommand now performs word wrapping to make sure the table gets rendered correctly. (#1067) (@garigariganzy) searchcommand results can now be outputted to JSON/JSONL. (#1041) (@hitenkoku)
Bug Fixes:
MitreTactics,MitreTags,OtherTagsfields were not being outputted in thejson-timelinecommand. (#1062) (@hitenkoku)- The detection frequency timeline (
-T) would not output when theno-summaryoption was also enabled. (#1072) (@hitenkoku) - Control characters would not be escaped in the
json-timelinecommand causing a JSON parsing error. (#1068) (@hitenkoku) - In the
metricscommand, channels would not be abbreviated if they were lowercase. (#1066) (@garigariganzy) - Fixed an issue where some fields were misaligned in the JSON output. (#1086) (@hitenkoku)
2.5.1 [2023/05/14] "Mothers Day Release"¶
Enhancements:
- Reduced memory usage by half when using newly converted rules. (#1047) (@fukusuket)
Bug Fixes:
- Data in certain fields such as
AccessMaskwould not be separated by spaces when outputted from thedetailsfield. (#1035) (@hitenkoku) - Multiple spaces would be condensed to a single space when outputting to JSON. (#1048) (@hitenkoku)
- Output would be in color even if
--no-colorwas used in thepivot-keywords-listcommand. (#1044) (@kazuminn)
2.5.0 [2023/05/07] "Golden Week Release"¶
Enhancements:
- Added
-M, --multilineoption to search command. (#1017) (@hitenkoku) - Deleted return characters in the output of the
searchcommand. (#1003) (@hitenkoku) regexcrate updated to 1.8 which allows unnecessary escapes in regular expressions reducing parsing errors. (#1018) (@YamatoSecurity)- Deleted return characters in output of the
csv-timelinecommand. (#1019) (@hitenkoku) - Don't show new version information with the
update-rulescommand when building a newer dev build. (#1028) (@hitenkoku) - Sorted
searchtimeline order. (#1033) (@hitenkoku) - Enhanced
pivot-keywords-listterminal output. (#1022) (@kazuminn)
Bug Fixes:
- Unconverted sigma rules that search for a string that end in a backslash would not be detected. Also
|containsconditions would not match if the string was located in the beginning. (#1025) (@fukusuket) - In versions 2.3.3-2.4.0, informational level alerts in the Results Summary would show the top 5 events twice instead of the top 10 events. (#1031) (@hitenkoku)
2.4.0 [2023/04/19] "SANS Secure Korea Release"¶
New Features:
- Added
searchcommand to search for specified keywords in records. (#617) (@itiB, @hitenkoku) - Added
-r, --regexoption in thesearchcommand to search for regular expressions. (#992) (@itiB)
Enhancements:
- Alphabetically sorted commands. (#991) (@hitenkoku)
- Added attribute information of
Event.UserDatato the output ofAllFieldInfoincsv-timeline,json-timelineandsearchcommands. (#1006) (@hitenkoku) - Updated Aho-Corasick crate to 1.0. (#1013) (@hitenkoku)
Bug Fixes:
- Fixed timestamps that did not exist from being displayed in the event frequency timeline (
-T, --visualize-timeline) in version 2.3.3. (#977) (@hitenkoku)
2.3.3 [2023/04/07] "Sakura Release"¶
Enhancements:
- Removed an extra space when outputting the rule
levelto files (CSV, JSON, JSONL). (#979) (@hitenkoku) - Rule authors are now outputted in multiple lines with the
-M, --multilineoption. (#980) (@hitenkoku) - Approximately 3-5% speed increase by replacing String with CoW. (#984) (@hitenkoku)
- Made sure text after the logo does not turn green with recent clap versions. (#989) (@hitenkoku)
Bug Fixes:
- Fixed a crash when the
level-tuningcommand was executed on version 2.3.0. (#977) (@hitenkoku)
2.3.2 [2023/03/22] "TMCIT Release-3"¶
Enhancements:
- Added
-M, --multilineoption in thecsv-timelinecommand. (#972) (@hitenkoku)
2.3.1 [2023/03/18] "TMCIT Release-2"¶
Enhancements:
- Added double quotes in CSV fields of
csv-timelineoutput to support multiple lines in fields. (#965) (@hitenkoku) - Updated
logon-summaryheaders. (#964) (@yamatosecurity) - Added short-hand option
-Dfor--enable-deprecated-rulesand-ufor--enable-unsupported-rules. (@yamatosecurity) - Reordered option in Filtering and changed option help contents. (#969) (@hitenkoku)
Bug Fixes:
- Fixed a crash when the
update-rulescommand was executed on version 2.3.0. (#965) (@hitenkoku) - Fixed long underlines displayed in the help menu in Command Prompt and PowerShell prompt. (#911) (@yamatosecurity)
2.3.0 [2023/03/16] "TMCIT Release"¶
New Features:
- Added support for
|cidr. (#961) (@fukusuket) - Added support for
1 of selection*andall of selection*. (#957) (@fukusuket) - Added support for the
|contains|allpipe keyword. (#945) (@hitenkoku) - Added the
--enable-unsupported-rulesoption to enable rules marked asunsupported. (#949) (@hitenkoku)
Enhancements:
- Approximately 2-3% speed increase and memory usage reduction by improving string contains check. (#947) (@hitenkoku)
Bug Fixes:
- Some event titles would be displayed as
Unknownin themetricscommand even if they were defined. (#943) (@hitenkoku)
2.2.2 [2023/2/22] "Ninja Day Release"¶
New Features:
- Added support for the
|base64offset|containspipe keyword. (#705) (@hitenkoku)
Enhancements:
- Reorganized the grouping of command line options. (#918) (@hitenkoku)
- Reduced memory usage by approximately 75% when reading JSONL formatted logs. (#921) (@fukusuket)
- Channel names are now further abbreviated in the metrics, json-timeline, csv-timeline commands according to
rules/config/generic_abbreviations.txt. (#923) (@hitenkoku) - Reduced parsing errors by updating the evtx crate. (@YamatoSecurity)
- Provider names (
%Provider%field) are now abbreviated like channel names according torules/config/provider_abbreviations.txtandrules/config/generic_abbreviations.txt. (#932) (@hitenkoku) - Print the first and last timestamps in the metrics command when the
-ddirectory option is used. (#935) (@hitenkoku) - Added first and last timestamp to Results Summary. (#938) (@hitenkoku)
- Added Time Format options for
logon-summary,metricscommands. (#938) (@hitenkoku) \r,\n, and\tcharacters are preserved (not converted to spaces) when saving results with thejson-outputcommand. (#940) (@hitenkoku)
Bug Fixes:
- The first and last timestamps in the
logon-summaryandmetricscommands were blank. (#920) (@hitenkoku) - Event titles stopped being shown in the
metricscommand during development of 2.2.2. (#933) (@hitenkoku)
2.2.0 [2023/2/12] "SECCON Release"¶
New Features:
- Added support for input of JSON-formatted event logs (
-J, --JSON-input). (#386) (@hitenkoku) - Log enrichment by outputting the ASN organization, city and country of source and destination IP addresses based on MaxMind GeoIP databases (
-G, --GeoIP). (#879) (@hitenkoku) - Added the
-e, --exact-leveloption to scan for only specific rule levels. (#899) (@hitenkoku)
Enhancements:
- Added the executed command line to the HTML report. (#877) (@hitenkoku)
- Approximately 3% speed increase and memory usage reduction by performing exact string matching on Event IDs. (#882) (@fukusuket)
- Approximately 14% speed increase and memory usage reduction by filtering before regex usage. (#883) (@fukusuket)
- Approximately 8% speed increase and memory usage reduction by case-insensitive comparisons instead of regex usage. (#884) (@fukusuket)
- Approximately 5% speed increase and memory usage reduction by reducing regex usage in wildcard expressions. (#890) (@fukusuket)
- Further speed increase and memory usage reduction by removing unnecessary regex usage. (#894) (@fukusuket)
- Approximately 3% speed increase and 10% memory usage reduction by reducing regex usage. (#898) (@fukuseket)
- Improved
-T, --visualize-timelineby increasing the height of the markers to make it easier to read. (#902) (@hitenkoku) - Reduced memory usage by approximately 50% when reading JSON/L formatted logs. (#906) (@fukusuket)
- Alphabetically sorted options based on their long names. (#904) (@hitenkoku)
- Added JSON input support (
-J, --JSON-inputoption) forlogon-summary,metricsandpivot-keywords-listcommands. (#908) (@hitenkoku)
Bug Fixes:
- Fixed a bug when rules with 4 consecutive backslashes in their conditions would not be detected. (#897) (@fukusuket)
- When parsing PowerShell EID 4103, the
Payloadfield would be separated into multiple fields when outputting to JSON. (#895) (@hitenkoku) - Fixed a crash when looking up event log file size. (#914) (@hitenkoku)
Vulnerability Fixes:
- Updated the git2 and gitlib2 crates to prevent a possible SSH MITM attack (CVE-2023-22742) when updating rules and config files. (#888) (@YamatoSecurity)
2.1.0 [2023/01/10] "Happy Year of the Rabbit Release"¶
Enhancements:
- Speed improvements. (#847) (@hitenkoku)
- Improved speed by up to 20% by improving I/O processesing. (#858) (@fukusuket)
- The timeline order of detections are now sorted to a fixed order even when the timestamp is identical. (#827) (@hitenkoku)
Bug Fixes:
- Successful login CSV results were not correctly being outputted when using the logon timeline function. (#849) (@hitenkoku)
- Removed unnecessary line breaks that would occur when using the
-J, --jsonloption. (#852) (@hitenkoku)
2.0.0 [2022/12/24] "Merry Christmas Release"¶
New Features:
- Command usage and help menu are now done by subcommands. (#656) (@hitenkoku)
1.9.0 [2022/12/24] "Merry Christmas Release"¶
New Features:
- Added a new pipe keyword. (
|endswithfield) (#740) (@hach1yon) - Added
--debugoption to display memory utilization at runtime. (#788) (@fukusuket)
Enhancements:
- Updated clap crate package to version 4 and changed the
--visualize-timelineshort option-Vto-T. (#725) (@hitenkoku) - Added output of logon types, source computer and source IP address in Logon Summary as well as failed logons. (#835) (@garigariganzy @hitenkoku)
- Optimized speed and memory usage. (#787) (@fukusuket)
- Changed output color in eggs ascii art.(#839) (@hitenkoku)
- Made the
--debugoption hidden by default. (#841) (@hitenkoku) - Added color to the ascii art eggs. (#839) (@hitenkoku)
Bug Fixes:
- Fixed a bug where evtx files would not be loaded if run from a command prompt and the directory path was enclosed in double quotes. (#828) (@hitenkoku)
- Fixed unneeded spaces outputted when there were rule parsing errors. (#829) (@hitenkoku)
1.8.1 [2022/11/21]¶
Enhancements:
- Specified the minimum Rust version
rust-versionfield inCargo.tomlto avoid build dependency errors. (#802) (@hitenkoku) - Reduced memory usage. (#806) (@fukusuket)
- Added the support for the
%RenderedMessage%field in output profiles which is the rendered message in logs forwarded by WEC. (#760) (@hitenkoku)
Bug Fixes:
- Fixed a problem where rules using the
Datafield were not being detected. (#775) (@hitenkoku) - Fixed a problem where the
%MitreTags%and%MitreTactics%fields would randomly miss values. (#807) (@fukusuket)
1.8.0 [2022/11/07]¶
New Features:
- Added the
--ISO-8601output time format option. This good to use when importing to Elastic Stack. It is exactly the same as what is in the original log. (#767) (@hitenkoku)
Enhancements:
- Event ID filtering is now turned off by default. Use the
-e, --eid-filteroption to filter by Event ID. (Will usually be 10%+ faster but with a small chance of false negatives.) (#759) (@hitenkoku) - Print an easy to understand error message when a user tries to download new rules with a different user account. (#758) (@fukusuket)
- Added total and unique detecion count information in the HTML Report. (#762) (@hitenkoku)
- Removed unnecessary array structure in the JSON output. (#766)(@hitenkoku)
- Added rule authors (
%RuleAuthor%), rule creation date (%RuleCreationDate%), rule modified date (%RuleModifiedDate%), and rule status (%Status%) fields to output profiles. (#761) (@hitenkoku) - Changed Details field in JSON output to an object. (#773) (@hitenkoku)
- Removed
build.rsand changed the memory allocator to mimalloc for a speed increase of 20-30% on Intel-based OSes. (#657) (@fukusuket) - Replaced
%RecordInformation%alias in output profiles to%AllFieldInfo%, and changed theAllFieldInfofield in JSON output to an object. (#750) (@hitenkoku) - Removed
HBFI-prefix inAllFieldInfofield of json output. (#791) (@hitenkoku) - Don't display result summary, etc... when
--no-summaryoption is used. (This is good to use when using as a Velociraptor agent, etc... It will usually be 10% faster.) (#780) (@hitenkoku) - Reduced memory usage and improved speed performance. (#778 #790) (@hitenkoku)
- Don't display Rule Authors list when authors list is empty. (#795) (@hitenkoku)
- Added rule ID (
%RuleID%) and Provider Name (%Provider%) fields to output profiles. (#794) (@hitenkoku)
Bug Fixes:
- Fixed rule author unique rule count. (It was displaying one extra.) (#783) (@hitenkoku)
1.7.2 [2022/10/17]¶
New Features:
- Added
--list-profilesoption to print a list of output profiles. (#746) (@hitenkoku)
Enhancements:
- Moved the saved file line and shortened the update option output. (#754) (@YamatoSecurity)
- Limited rule author names of detected alerts to 40 characters. (#751) (@hitenkoku)
Bug Fixes:
- Fixed a bug where field information would get moved over in JSON/JSONL output when a drive letter (ex:
c:) was in the field. (#748) (@hitenkoku)
1.7.1 [2022/10/10]¶
Enhancements:
- Hayabusa now checks Channel and EID information based on
rules/config/channel_eid_info.txtto provide more accurate results. (#463) (@garigariganzy) - Do not display a message about loading detection rules when using the
-Mor-Loptions. (#730) (@hitenkoku) - Added a table of rule authors to standard output. (#724) (@hitenkoku)
- Ignore event records when the channel name is
null(ETW events) when scanning and showing EID metrics. (#727) (@hitenkoku)
Bug Fixes:
- Fixed a bug where the same Channel and EID would be counted separately with the
-Moption. (#729) (@hitenkoku)
1.7.0 [2022/09/29]¶
New Features:
- Added a HTML summary report output option (
-H, --html-report). (#689) (@hitenkoku, @nishikawaakira)
Enhancements:
- Changed Event ID Statistics option to Event ID Metrics option. (
-s, --statistics->-M, --metrics) (#706) (@hitenkoku) (Note:statistics_event_info.txtwas changed toevent_id_info.txt.) - Display new version of Hayabusa link when updating rules if there is a newer version. (#710) (@hitenkoku)
- Added logo in HTML summary output. (#714) (@hitenkoku)
- Unified output to one table when using
-Mor-Lwith the-doption. (#707) (@hitenkoku) - Added Channel column to metrics output. (#707) (@hitenkoku)
- Removed First Timestamp and Last Timestamp of
-Mand-Loption with the-doption. (#707) (@hitenkoku) - Added csv output option(
-o --output) when-Mor-Loption is used. (#707) (@hitenkoku) - Separated Count and Percent columns in metric output. (#707) (@hitenkoku)
- Changed output table format of the metric option and logon information crate from prettytable-rs to comfy_table. (#707) (@hitenkoku)
- Added favicon.png in HTML summary output. (#722) (@hitenkoku)
v1.6.0 [2022/09/16]¶
New Features:
- You can now save the timeline to JSON files with the
-j, --jsonoption. (#654) (@hitenkoku) - You can now save the timeline to JSONL files with the
-J, --jsonloption. (#694) (@hitenkoku)
Enhancements:
- Added top alerts to results summary. (#667) (@hitenkoku)
- Added
--no-summaryoption to not display the results summary. (#672) (@hitenkoku) - Made the results summary more compact. (#675 #678) (@hitenkoku)
- Made Channel field in channel_abbreviations.txt case-insensitive. (#685) (@hitenkoku)
- Changed pipe separator character in output from
|to‖. (#687) (@hitenkoku) - Added color to Saved alerts and events / Total events analyzed. (#690) (@hitenkoku)
- Updated evtx crate to 0.8.0. (better handling when headers or date values are invalid.)
- Updated output profiles. (@YamatoSecurity)
Bug Fixes:
- Hayabusa would crash with
-Loption (logon summary option). (#674) (@hitenkoku) - Hayabusa would continue to scan without the correct config files but now will print and error and gracefully terminate. (#681) (@hitenkoku)
- Fixed total events from the number of scanned events to actual events in evtx. (#683) (@hitenkoku)
v1.5.1 [2022/08/20]¶
Enhancements:
- Re-released v1.5.1 with an updated output profile that is compatible with Timesketch. (#668) (@YamatoSecurity)
v1.5.1 [2022/08/19]¶
Bug Fixes:
- Critical, medium and low level alerts were not being displayed in color. (#663) (@fukusuket)
- Hayabusa would crash when an evtx file specified with
-fdid not exist. (#664) (@fukusuket)
v1.5.0 [2022/08/18]¶
New Features:
- Customizable output of fields defined at
config/profiles.yamlandconfig/default_profile.yaml. (#165) (@hitenkoku) - Implemented the
nullkeyword for rule detection. It is used to check if a target field exists or not. (#643) (@hitenkoku) - Added output to JSON option (
-jand--json-timeline) (#654) (@hitenkoku)
Enhancements:
- Trimmed
./from the rule path when updating. (#642) (@hitenkoku) - Added new output aliases for MITRE ATT&CK tags and other tags. (#637) (@hitenkoku)
- Organized the menu output when
-his used. (#651) (@YamatoSecurity and @hitenkoku) - Added commas to summary numbers to make them easier to read. (#649) (@hitenkoku)
- Added output percentage of detections in Result Summary. (#658) (@hitenkoku)
Bug Fixes:
- Fixed miscalculation of Data Reduction due to aggregation condition rule detection. (#640) (@hitenkoku)
- Fixed a race condition bug where a few events (around 0.01%) would not be detected. (#639 #660) (@fukusuket)
v1.4.3 [2022/08/03]¶
Bug Fixes:
- Hayabusa would not run on Windows 11 when the VC redistribute package was not installed but now everything is compiled statically. (#635) (@fukusuket)
v1.4.2 [2022/07/24]¶
Enhancements:
- You can now update rules to a custom directory by combining the
--update-rulesand--rulesoptions. (#615) (@hitenkoku) - Improved speed with parallel processing by up to 20% with large files. (#479) (@kazuminn)
- When saving files with
-o, the.ymldetection rule path column changed fromRulePathtoRuleFileand only the rule file name will be saved in order to decrease file size. (#623) (@hitenkoku)
Bug Fixes:
- Fixed a runtime error when hayabusa is run from a different path than the current directory. (#618) (@hitenkoku)
v1.4.1 [2022/06/30]¶
Enhancements:
- When no
detailsfield is defined in a rule nor in./rules/config/default_details.txt, all fields will be outputted to thedetailscolumn. (#606) (@hitenkoku) - Added the
-D, --deep-scanoption. Now by default, events are filtered by Event IDs that there are detection rules for defined in./rules/config/target_event_IDs.txt. This should improve performance by 25~55% while still detecting almost everything. If you want to do a thorough scan on all events, you can disable the event ID filter with-D, --deep-scan. (#608) (@hitenkoku) channel_abbreviations.txt,statistics_event_info.txtandtarget_event_IDs.txthave been moved from theconfigdirectory to therules/configdirectory in order to provide updates with-U, --update-rules.
v1.4.0 [2022/06/26]¶
New Features:
- Added
--target-file-extoption. You can specify additional file extensions to scan in addtition to the default.evtxfiles. For example,--target-file-ext evtx_dataor multiple extensions with--target-file-ext evtx1 evtx2. (#586) (@hitenkoku) - Added
--exclude-statusoption: You can ignore rules based on theirstatus. (#596) (@hitenkoku)
Enhancements:
- Added default details output based on
rules/config/default_details.txtwhen nodetailsfield in a rule is specified. (i.e. Sigma rules) (#359) (@hitenkoku) - Updated clap crate package to version 3. (#413) (@hitnekoku)
- Updated the default usage and help menu. (#387) (@hitenkoku)
- Hayabusa can be run from any directory, not just from the current directory. (#592) (@hitenkoku)
- Added saved file size output when
outputis specified. (#595) (@hitenkoku)
Bug Fixes:
- Fixed output error and program termination when long output is displayed with color. (#603) (@hitenkoku)
- Ignore loading yml files in
rules/tools/sigmac/testfilesto fixExcluded rulescount. (#602) (@hitenkoku)
v1.3.2 [2022/06/13]¶
Enhancements:
- Changed the evtx Rust crate from 0.7.2 to 0.7.3 with updated packages. (@YamatoSecurity)
v1.3.1 [2022/06/13]¶
New Features:
- You can now specify specific fields when there are multiple fields with the same name (Ex:
Data). In thedetailsline in a rule, specify a placeholder like%Data[1]%to display the firstDatafield. (#487) (@hitenkoku) - Added loaded rules status summary. (#583) (@hitenkoku)
Enhancements:
- Debug symbols are stripped by default for smaller Linux and macOS binaries. (#568) (@YamatoSecurity)
- Updated crate packages (@YamatoSecurity)
- Added new output time format options. (
--US-time,--US-military-time,--European-time) (#574) (@hitenkoku) - Changed the output time format when
--rfc-3339option is enabled. (#574) (@hitenkoku) - Changed the
-R / --display-record-idoption to-R / --hide-record-idand now by default the event record ID is displayed. You can hide the record ID with-R / --hide-record-id. (#579) (@hitenkoku) - Added rule loading message. (#583) (@hitenkoku)
Bug Fixes:
- The RecordID and RecordInformation column headers would be shown even if those options were not enabled. (#577) (@hitenkoku)
v1.3.0 [2022/06/06]¶
New Features:
- Added
-V / --visualize-timelineoption: Event Frequency Timeline feature to visualize the number of events. (Note: There needs to be more than 5 events and you need to use a terminal like Windows Terminal, iTerm2, etc... for it to properly render.) (#533, #566) (@hitenkoku) - Display all the
tagsdefined in a rule to theMitreAttackcolumn when saving to CSV file with the--all-tagsoption. (#525) (@hitenkoku) - Added the
-R / --display-record-idoption: Display the event record ID (<Event><System><EventRecordID>). (#548) (@hitenkoku) - Display dates with most detections. (#550) (@hitenkoku)
- Display the top 5 computers with the most unique detections. (#557) (@hitenkoku)
Enhancements:
- In the
detailsline in a rule, when a placeholder points to a field that does not exist or there is an incorrect alias mapping, it will be outputted asn/a(not available). (#528) (@hitenkoku) - Display total event and data reduction count. (How many and what percent of events were ignored.) (#538) (@hitenkoku)
- New logo. (#536) (@YamatoSecurity)
- Display total evtx file size. (#540) (@hitenkoku)
- Changed logo color. (#537) (@hitenkoku)
- Display the original
Channelname when not specified inchannel_abbrevations.txt. (#553) (@hitenkoku) - Display separately
Ignored rulestoExclude rules,Noisy rules, andDeprecated rules. (#556) (@hitenkoku) - Display results messge when
outputoption is set. (#561) (@hitenkoku)
Bug Fixes:
- Fixed the
--start-timelineand--end-timelineoptions as they were not working. (#546) (@hitenkoku) - Fixed crash bug when level in rule is not valid. (#560) (@hitenkoku)
v1.2.2 [2022/05/20]¶
New Features:
- Added a logon summary feature. (
-L/--logon-summary) (@garigariganzy)
Enhancements:
- Colored output is now on by default and supports Command and Powershell prompts. (@hitenkoku)
Bug Fixes:
- Fixed a bug in the update feature when the rules repository does not exist but the rules folder exists. (#516) (@hitenkoku)
- Fixed a rule parsing error bug when there were .yml files in a .git folder. (#524) (@hitenkoku)
- Fixed wrong version number in the 1.2.1 binary.
v1.2.1 [2022/04/20] Black Hat Asia Arsenal 2022 RC2¶
New Features:
- Added a
Channelcolumn to the output based on the./config/channel_abbreviations.txtconfig file. (@hitenkoku) - Rule and rule config files are now forcefully updated. (@hitenkoku)
Bug Fixes:
- Rules marked as noisy or excluded would not have their
levelchanged with--level-tuningbut now all rules will be checked. (@hitenkoku)
v1.2.0 [2022/04/15] Black Hat Asia Arsenal 2022 RC1¶
New Features:
- Specify config directory (
-C / --config): When specifying a different rules directory, the rules config directory will still be the defaultrules/config, so this option is useful when you want to test rules and their config files in a different directory. (@hitenkoku) |equalsfieldaggregator: In order to write rules that compare if two fields are equal or not. (@hach1yon)- Pivot keyword list generator feature (
-p / --pivot-keywords-list): Will generate a list of keywords to grep for to quickly identify compromised machines, suspicious usernames, files, etc... (@kazuminn) -F / --full-dataoption: Will output all field information in addition to the fields defined in the rule’sdetails. (@hach1yon)--level-tuningoption: You can tune the risklevelin hayabusa and sigma rules to your environment. (@itib and @hitenkoku)
Enhancements:
- Updated detection rules and documentation. (@YamatoSecurity)
- Mac and Linux binaries now statically compile the OpenSSL libraries. (@YamatoSecurity)
- Performance and accuracy improvement for fields with tabs, etc... in them. (@hach1yon and @hitenkoku)
- Fields that are not defined in eventkey_alias.txt will automatically be searched in Event.EventData. (@kazuminn and @hitenkoku)
- When updating rules, the names of new rules as well as the count will be displayed. (@hitenkoku)
- Removed all Clippy warnings from the source code. (@hitenkoku and @hach1yon)
- Updated the event ID and title config file (
timeline_event_info.txt) and changed the name tostatistics_event_info.txt. (@YamatoSecurity and @garigariganzy) - 32-bit Hayabusa Windows binaries are now prevented from running on 64-bit Windows as it would cause unexpected results. (@hitenkoku)
- MITRE ATT&CK tag output can be customized in
output_tag.txt. (@hitenkoku) - Added Channel column output. (@hitenkoku)
Bug Fixes:
.ymlfiles in the.gitfolder would cause parse errors so they are now ignored. (@hitenkoku)- Removed unnecessary newline due to loading test file rules. (@hitenkoku)
- Fixed output stopping in Windows Terminal due a bug in Terminal itself. (@hitenkoku)
v1.1.0 [2022/03/03]¶
New Features:
- Can specify a single rule with the
-r / --rulesoption. (Great for testing rules!) (@kazuminn) - Rule update option (
-u / --update-rules): Update to the latest rules in the hayabusa-rules repository. (@hitenkoku) - Live analysis option (
-l / --live-analysis): Can easily perform live analysis on Windows machines without specifying the Windows event log directory. (@hitenkoku)
Enhancements:
- Updated documentation. (@kazuminn , @hitenkoku , @YamatoSecurity)
- Updated rules. (20+ Hayabusa rules, 200+ Sigma rules) (@YamatoSecurity)
- Windows binaries are now statically compiled so installing Visual C++ Redistributable is not required. (@hitenkoku)
- Color output (
-c / --color) for terminals that support True Color (Windows Terminal, iTerm2, etc...). (@hitenkoku) - MITRE ATT&CK tactics are included in the saved CSV output. (@hitenkoku)
- Performance improvement. (@hitenkoku)
- Comments added to exclusion and noisy config files. (@kazuminn)
- Using faster memory allocators (rpmalloc for Windows, jemalloc for macOS and Linux.) (@kazuminn)
- Updated cargo crates. (@YamatoSecurity)
Bug Fixes:
- Made the clap library version static to make
cargo updatemore stable. (@hitenkoku) - Some rules were not alerting if there were tabs or carriage returns in the fields. (@hitenkoku)
v1.0.0-Release 2 [2022/01/27]¶
- Removed Excel result sample files as they were being flagged by anti-virus. (@YamatoSecurity)
- Updated the Rust evtx library to 0.7.2 (@YamatoSecurity)
v1.0.0 [2021/12/25]¶
- Initial release.