forked from hashcat/hashcat
-
Notifications
You must be signed in to change notification settings - Fork 14
Expand file tree
/
Copy pathchanges.txt
More file actions
3709 lines (3267 loc) · 222 KB
/
Copy pathchanges.txt
File metadata and controls
3709 lines (3267 loc) · 222 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
* changes v7.1.2 -> v7.1.x
##
## Release Highlights
##
This release expands candidate generation, improves large-scale operations and removes several
longstanding bottlenecks in hash management, device setup and distributed work.
1. Plugin-based candidate generation with attack-mode 8: "feeds"
Attack-mode 8 brings external candidate generators into hashcat as feed plugins. Unlike a generator
connected through stdin, a feed runs one instance per device and participates in keyspace
calculation, distribution, restore, status and debug output. Feeds can be written in C or Rust and
selected by name.
The included feeds are "wordlist", "stdin", "random", "rust_random", "association", "pcfg",
"table", "hybrid" and "mask". Wordlist and stdin processing now use the feed interface. The
wordlist feed supplies the dictionaries used by attack-modes 0, 1, 6, 7 and 12, and the one word
per hash form of attack-mode 9. With rules, the hybrid and mask feeds generate candidates for
attack-modes 1, 3, 6, 7 and 12 on the host.
The wordlist feed lays every source it receives end to end in one keyspace, including multiple
wordlists and directories. Mask files and increment lengths likewise form one queue. A position
addresses the whole feed or mask queue rather than one source, so "--skip", "--limit" and
"--keyspace" divide that set and a device can start at its own share instead of reading and
discarding every earlier line. The seek databases described below make that start cheap. Dynamic
dictionary queues and association phases remain separate rounds, as described under migration.
The feed interface also introduces backend-controlled GPU execution for candidate generators. A
feed can compile and launch a kernel of its own without directly managing the compute backend. The
PCFG and table feeds use this to expand base words into candidates in device memory, avoiding a
transfer across the host-to-device bus. They use device amplification for most fast hash modes and
fall back to the host engine where needed. The device engine derives its own loop bounds, so it
rejects "-u". Rules with "-r" or "-g" also select host generation.
See "docs/hashcat-generic-attack-mode.md" and
"docs/hashcat-generic-attack-mode-development-guide.md".
2. Probability-ordered PCFG and targeted hint attacks with attack-mode 4
This new attack-mode generates candidates from a trained probabilistic context-free grammar.
Hashcat quantizes component probabilities into cost groups whose sizes are known in advance. A
component costs "-log2(p) * scale" rounded to a whole number, so a larger probability is a smaller
cost and the number of candidates at each cost can be counted without producing them. This makes a
PCFG attack compatible with the options "--keyspace", "--skip", "--limit", "--restore",
multi-device distribution and the brain.
The command "-a 4 hashes.txt" selects the included "default-passwords" ruleset. Rulesets can be
selected by name or path, combined with weights, and stored as directories or ".tar.xz" archives.
The second included ruleset "hints" is a targeted PCFG attack, and it is the part of this release
worth looking at first. It removes the words learned during training but retains the surrounding
password patterns. The operator supplies facts about one target through "hintwords" or "hintfile",
such as names, dates, teams, passwords the target used before, or other known facts. Attack-mode 4
then works like a normal attack, allowing the available compute devices to focus on one target with
all resources.
This needed a new token in the ruleset format. Where a trained grammar names a letter run and the
file of words it draws from, a hint ruleset names "H1", a slot filled at run time from what the
operator supplied. The included ruleset is not trained separately: "tools/pcfg_hints.py" derives it
from "default-passwords", and the same script turns any ruleset you trained yourself into one.
Attack-mode 9 reuses the "hints" ruleset for a different workflow. It obtains a separate set of
hints from each account name, hash line or module, then pairs those candidates with individually
salted hashes. It is intended to process many accounts at once rather than concentrate the attack
on one hash.
Fast hashes use device amplification. Slow hashes and modes without a suitable kernel use the host
engine.
See "docs/hashcat-pcfg.md".
3. A device-accelerated table attack in attack-mode 5
The table attack returns under its original attack-mode number. It applies token replacements to a
wordlist and amplifies the resulting combinations on the device.
Table entries can replace one or more bytes with any number of bytes, including an empty
replacement. Sources use longest-first matching. Multiple tables can be combined on the command
line, and the included tables cover leetspeak, case changes, emoji, sports templates and keyboard
layouts. With "identity=0" a layout table transliterates a word instead of varying it, which turns
a wordlist in one layout into what those keys produce on another, for every hash mode and every
attack the feed serves.
The "single=1" setting emits the original word once and then one matching substitution per
candidate instead of combining substitutions across every position. It does not use longest-first
matching because one substitution cannot overlap another. The "maxperm" and "cap=N" settings limit
substitution cost and the replacements retained for each source.
See "docs/hashcat-table.md".
4. Mask-controlled word placement with attack-mode 12
Attack-mode 12 places wordlists inside masks. The required "?w" marker inserts the first wordlist,
and the optional "?q" marker inserts a second wordlist after it. For example, "?w?d?d" is equivalent
to attack-mode 6 "wordlist.txt ?d?d" and "?w?q" is equivalent to attack-mode 1. The new part is that
both literal characters and masks can appear on either side of a word.
The mask is followed by the wordlist for "?w" and, when present, the wordlist for "?q". Mask files
are supported, but every mask must contain "?w". Increment mode is not supported because shortening
a mask can remove the word marker.
Attack-modes 1, 6 and 7 remain available and are translated internally to attack-mode 12 layouts.
Their candidate order and keyspace are unchanged. Restore files and status output retain the mode
entered by the user.
See the "Attack-Mode 12 Markers" table in "--help".
5. An account-aware association pipeline in attack-mode 9
Attack-mode 9 can now derive candidates directly from usernames and other per-hash information. It
splits account names at separators, case changes and letter-to-digit boundaries. Passwd input also
contributes the real name and the final component of the home directory.
Modules can provide other hints through a new module hook in which a plugin developer can implement
hash-mode specific extraction code. For example, mode 22000 supplies the network name and both
MAC addresses from a WPA capture.
This pipeline runs three phases by default: account words, the first 1000 rules from
"rules/rockyou-30000.rule", and the "hints" PCFG ruleset. The grammar phase is unbounded, so use the
"phases" setting when the run must finish. The existing one-word-per-hash input form keeps its
previous behavior.
Association attacks require one salt per hash. Unsalted modes and inputs that reuse a salt are
rejected. The wordlist form now stops on unusable lines instead of shifting all later
candidate-to-hash pairs.
See "docs/hashcat-association.md".
6. Seekable wordlists and a unified cache
Seek databases replace the dictionary cache. Periodic file offsets let a device start near its
assigned range instead of reading and discarding every earlier line.
Hashcat can seek directly in multi-block xz files produced by "xz -T0", multi-frame zstd files
produced by "pzstd", and concatenated xz streams. Single-stream files still require decoding from
the beginning, and gzip has no boundaries that support direct seeking.
Seek databases are stored in "cache/feeds/wordlist". The new "--cache-path" option relocates all
rebuildable data, including compiled kernels and feed caches, so a cluster can share it.
7. Brain server redesigned for large sessions
The brain server now divides each candidate database into 1024 shards selected from the high bits
of the candidate hash. Each shard has its own lock, sorted array and small overflow area for
commits. Commits and lookups therefore scale with the active batch instead of the full database.
The on-disk format remains readable, although the new session identities described below prevent
old files from being selected automatically.
Shard storage occupies one address range reserved for the session instead of many allocations that
grow and copy independently. Large sessions therefore use less processing time and resident
memory. The server reserves virtual address space rather than physical memory and must not run
under a virtual-memory limit.
The new "--brain-feed" option adds candidates from stdin to a running session without stopping the
server. See "docs/hashcat-brain.md".
8. Rules in every attack-mode
Rules were previously limited to attack-modes 0 and 9. Attack-modes 1, 3, 6, 7 and 12 now also
accept "-r" and "-g". Hashcat generates their candidates on the host and sends them to the device
as base words for rule amplification, matching the pipeline used by feed-based attack-modes 4, 5
and 8.
The existing mask processor still handles parsing, custom charsets and Markov tables. Mask files,
"--increment", "--markov-threshold" and custom charset options therefore behave as they do in
attack-mode 3. The "-j" and "-k" options still apply to the base and amplifier words rather than
the mask, and "--debug-mode" reports the rule that produced each candidate.
Host-side candidate generation costs fast hash modes most of their performance but has little
effect on slow modes, so hashcat reports the switch at startup. Larger rulesets amortize that cost
by doing more work per base candidate. Attacks without rules are unchanged and still generate
candidates on the device.
##
## Migration and Compatibility
##
These changes can alter scripts, distributed scheduling, file locations, monitoring output or
third-party plugins. If you maintain a module, bridge or feed outside the tree, or anything that
drives hashcat from a script, read this section before upgrading. Everything here is a change you
have to act on rather than one you will simply notice.
## Distributed work and progress
- Attack-modes 0, 6 and 7 treat multiple wordlists, directories, masks and increment lengths as one
virtual keyspace; the left input to attack-mode 1 may now be a directory. The "--skip", "--limit"
and "--keyspace" options address the complete run, so a distribution overlay can divide it
- Keyspace units still count base words before amplification. Rules and remaining mask positions
multiply them afterward
- Separate dictionary rounds cannot be divided, so "--skip", "--limit" and "--keyspace" are rejected
when several are queued, including multi-phase association. The "--limit" option is rejected with
"--loopback", and both range options when "--restore" spans several masks
- Progress reporting is relative to the requested range in human-readable, JSON and
machine-readable output. The "CURKU" and "Restore.Point" fields remain absolute positions in the
complete keyspace, so monitoring integrations must no longer add "--skip" to "PROGRESS"
## Restore files
- The "--restore" option no longer executes the command line stored in a restore file, which a
modified file could use to execute code. This is tracked as CVE-2026-68766. Hashcat prints a
shell-quoted command to run instead, which uses "--restore-position" to keep the saved position
- Commands that cannot be represented safely for the current shell are shown as an escaped argument
list. This includes non-printable bytes and Windows arguments containing "%", "!" or unsuitable
quotes
## Runtime libraries and compressed input
- Compression support loads zlib, liblzma and libzstd on demand. Hashcat starts without them and
reports a missing library only when it is required. See "docs/hashcat-compression-libraries.md"
- Attack-modes 1, 3, 6, 7 and 12, and therefore "--benchmark", require liblzma for the compressed
"hashcat.hcstat2" table. Mode 11600 requires liblzma for LZMA or LZMA2 archives and zlib for
DEFLATE, and without the library the attack runs but verifies nothing
- Wordlists, hash lists and rule files can no longer be read from ".zip". Gzip, xz and zstd remain
supported
- Encoding conversion loads iconv only when requested. GNU libc and musl provide it directly, macOS
and the BSDs provide system implementations, and Windows now uses native conversion APIs. Windows
no longer supports EBCDIC, ISO-2022, "//TRANSLIT" or "//IGNORE", and rejects unsupported names
## Commands, devices, paths and tuning
- The "-c" and "--segment-size" options were removed with the old segmented wordlist reader. They
now produce an unknown-option error, and "-c" will not be reassigned
- The "--dynamic-x" option takes the hash mode from the first line's "$dynamic_N$" tag. A missing or
unknown tag is rejected, and later lines with another number are skipped with a warning. An
explicit "-m" still wins and warns when it disagrees with the tag
- Included keyboard layouts moved from "layouts/*.hckmap" to "tables/layouts/*.table", so
"--keyboard-layout-mapping layouts/de.hckmap" becomes "tables/layouts/de.table". The old files
were removed, and a custom file in the previous format still works
- Installed builds no longer use "$HOME/.hashcat". Potfiles and sessions use the XDG profile
directory, and rebuilt data uses the XDG cache directory. Existing files are not migrated
automatically, but hashcat reports the old directory and both new locations
- All rebuilt data now sits below one "cache" directory: kernels under "cache/kernels" and feed data
under "cache/feeds/<feed>". Scripts that clear compiled kernels must update their path
- The "--backend-devices-keepfree" option was removed. Hashcat uses free memory reported by CUDA,
HIP, AMD OpenCL or hardware monitoring, and probes allocations if needed. The setting
"HASHCAT_NO_AMD_FREE_MEM=1" ignores the AMD query; the desktop reserve is the last fallback
- Integrated GPUs are disabled by default when a discrete GPU is present. The "-d" option can
select them explicitly, and systems with no discrete GPU are unaffected
- A device explicitly selected with "-d" now stops the run if it cannot start; "--force" continues
with the remaining devices. Without "-d", failures are named and compatible devices continue
- Minimum backend and operating-system requirements changed; see "docs/hashcat-requirements.md".
OpenCL 1.0 and 1.1 devices and the accelerator device type are no longer supported, and "-D 3"
reports their removal instead of selecting accelerators
- The "-w" and "--workload-profile" options remain accepted but are ignored and omitted from
"--help". Every run uses the former profile 3 launch budget, so a run that used "-w 1" or "-w 2"
may gain throughput and lose desktop responsiveness
- The second ".hctune" column now identifies attack kernel 0, 1, 3 or 4 instead of attack mode. One
row covers attack-modes 1, 6, 7 and 12. Custom mode 9 rows must use kernel 0, because value 9 is
rejected. Included files label the column "Kern"
## Brain protocol and stored sessions
- The "--brain-client-features" defaults changed from 2 to 3, enabling both range and candidate
deduplication. Hashcat automatically disables candidate storage for in-kernel modes with fewer
than 1024 salts, while retaining range reservation. An explicit value overrides the decision
- The brain protocol changed from version 1 to 2. Candidate identities use a new hash and
authentication uses stretched SHA-256. Clients and servers must be upgraded together, and a
mismatch reports both versions during the handshake
- Existing brain databases are not converted. Their filenames no longer match the new session IDs,
so they remain on disk without being loaded. An explicitly reused "--brain-session" starts with
empty deduplication data
## Builds and third-party plugins
- The "SHARED=1" build setting is now the default on Linux and macOS. Android, the BSDs, CYGWIN and
MSYS2 retain "SHARED=0". The Windows release is shared, but a native Windows build must request
"SHARED=1" explicitly. The "SHARED=0" setting restores self-contained plugins
- Modules, bridges and feeds now link to one core library located above their plugin directory:
"libhashcat.so.7", "libhashcat.7.dylib" or "hashcat.dll". Packages must ship it beside the
frontend, and every third-party plugin must be rebuilt for interface 720
- The core now exports an explicit plugin API instead of every symbol used by an in-tree plugin.
Host hash and cipher entry points are available even when no bundled plugin calls them
- Module porting removes "module_dictstat_disable", adds default assignments for
"module_hash_hints", "module_length_sort", "module_usage_notice" and "module_advice_notice", and
adds "hashcat_ctx" to the extra-parameter initialization and termination hooks
- The "hc_device_param_t" structure now stores kernels, programs and backend buffers in arrays
indexed by "hc_dev_kern_t", "hc_dev_program_t" and "hc_dev_buf_t". Code using the old numbered
members must be updated
- Bridge entry points now take "hashcat_ctx". Bridges must provide work-item granularity and the 7
hardware-monitor hooks, or assign "BRIDGE_DEFAULT" when sensor data is unavailable, and the
removed matching and forced-work-item flags have no replacement
- Bridges must use "bridge_salt_pos()" and "salt_per_pw" to select the per-candidate salt in
association attacks
- Modules may declare a fifth auxiliary kernel with "OPTS_TYPE_AUX5". It reuses the bit formerly
assigned to the removed "OPTS_TYPE_PT_ADD02" flag
- Native builds now target the build processor. Set "MAINTAINER_MODE=1" for distributable builds or
"MCPU=<core>" to choose one explicitly. Raspberry Pi targets may be read from "/proc/cpuinfo",
and mixed native and cross-compilation targets are rejected
- Rust plugins now require Cargo 1.85. Plugin 72000 requires Python 3.13 headers, and the bundled
Python runtime was updated to 3.14.6
- Source builds now default to "PRODUCTION=0". Release packaging must set "PRODUCTION=1" to pin the
release version; "SOURCE_DATE_EPOCH" makes repeated builds of that commit reproducible
- Build scripts must drop "USE_SYSTEM_ZLIB", "USE_SYSTEM_LZMA", "ENABLE_UNRAR",
"USE_SYSTEM_UNRAR" and "USE_SYSTEM_XXHASH"; these settings are no longer recognized
- The plugin development guide at "docs/hashcat-plugin-development-guide.md" contains the complete
core-library contract and the source changes required to port a plugin from v7.1.2
##
## New Hash Modes
##
- Added mode 36100: yescrypt
- Added mode 36200: gost-yescrypt
- Added mode 36300: scryptcrypt, scrypt (Unix)
- Added mode 35600: gost12512crypt [$gost12512hash$] (Unix)
- Added mode 34301: KeePass AESKDF (KDBX v4)
- Added mode 17050: GPG (AES-OCB-128 (SHA-1($pass)))
- Added mode 26150: Mozilla "key4.db" SHA384
- Added mode 35300: Kerberos 5, etype 23, TGS-REP (NT)
- Added mode 35400: Kerberos 5, etype 23, AS-REP (NT)
- Added mode 36800: OpenSSH Private Keys (bcrypt-pbkdf)
- Added mode 36400: KDE KWallet 4.13+ (PBKDF2-HMAC-SHA512, Blowfish)
- Added mode 36410: KDE KWallet < 4.13 (SHA-1, Blowfish)
- Added mode 36500: NTLM(NTLM_bin($pass))
- Added mode 35500: WordPress bcrypt(hmac-sha384($pass))
- Added mode 35700: phpass(md5($pass))
- Added mode 35800: Symfony Legacy SHA256
- Added mode 38000: Mikrotik RouterOS EC-SRP5 (Curve25519)
##
## New Features and Options
##
## Hash formats and recovered data
- Mode 23800 now uses hashcat's own RAR3 decoder. It supports both coding paths and all 6 standard
RAR3 filters, and reports how many candidates reached an unsupported construct
- Mode 11000 accepts PrestaShop salts from 56 to 64 bytes. Its optimized kernels were removed
because they cannot represent the longer salts
- Iteration counts allow 8 digits, up from 6, in modes 10000, 10900, 12000, 12100, 20200, 20300
and 20400
- GPG (CAST5 (SHA-1($pass))) now supports nonzero IVs and "s2ktype" 3
- Added the dynamic hash plugin for mode 74000. A description in "--bridge-parameter2" can compose
12 digests from MD2 through SHA-3, HMAC and PBKDF2-HMAC families, bcrypt, slicing, UTF-16LE, case
conversion, and hex or base64 conversion
- Wordlists, hash lists and rule files now support zstd compression alongside gzip and xz.
Multi-frame files produced by "pzstd" can be sought directly
- John's dynamic format now supports 56 built-in formats. The "--show", "--left" and "--remove"
options preserve John's spelling
- Added "--hash-copy" to preserve each cracked hash exactly as supplied in the input when writing
the outfile, potfile and status display
- Added "--encrypt-with-pubkey" to protect recovered plaintexts with an RSA public key of at least
3344 bits. It loads OpenSSL 3 only when used, hides plaintext-bearing status fields, and refuses
options that would write plaintext or restore state. See "docs/hashcat-encrypted-plains.md"
- The Windows build now opts into long paths and carries native version information
## Candidate generation and inspection
- Rule operands for "$", "^", "i", "v" and "o" can now contain non-ASCII characters directly
instead of requiring one "\xHH" sequence per byte
- Added "--rules-concat" to concatenate several rule files instead of stacking them. The rule count
is their sum rather than their product
- Added "--lookup" to report the position at which an attack reaches a candidate. It accepts
"$HEX[...]" input and reports progress and an ETA for longer wordlist scans
- Rules now work in every attack-mode. Attack-modes 1, 3, 6, 7 and 12 generate candidates on the
host and amplify them with rules on the device
- The "--debug-mode" option now reports the rule that produced a candidate in attack-modes 1, 3,
6, 7 and 12, as it already does in attack-mode 0
- Stdin supports "--skip", "--limit" and "--restore" when the same stream is supplied again
- Attack-modes 1, 6 and 7 now support "--slow-candidates"
- Feed attacks support "--debug-mode" without "-r" or "-g" and describe their contribution in
"Finding-Rule". The new "--debug-mode 6" writes the attack-mode 4 layout
- Added rule operations "h" and "H" for lowercase and uppercase hexadecimal conversion, "vNX" to
insert "X" after every N characters, "S" to shift character case, and "BNX" to add byte X at
position N
## Runtime control and reporting
- Added interactive rewind and advance controls on "r", "a", the arrow keys, "<" and ">". Holding a
key increases the movement speed
- The "e" key can now extend or shorten a "--runtime" limit while the attack is running
- Added "--benchmark-pure" ("-B") for pure kernels. The existing "-b" benchmark continues to use
optimized kernels, and every result names the kernel measured
- Added "--task-time-breakdown" for elapsed time by stage and peak memory usage. See
"docs/hashcat-task-time-breakdown.md"
- Added "--pipeline-stats" for per-device feeding, copy, initialization, transfer, loop and
comparison timings, including effective hash rate and machine-readable JSON output
- The "--cache-path" option relocates the complete cache and can point several hosts at shared data.
Feed caches tolerate read-only storage and fall back to memory, but kernel-cache writes must
succeed
## Extraction tools
- Added "tools/rar32hashcat.py" for mode 23800 RAR3 archives
- Added "tools/gpg-ocb-aes2hashcat.py" for mode 17050 GnuPG keys in "private-keys-v1.d"
- Updated "tools/mozilla2hashcat.py" for mode 26150 Firefox 146 "key4.db" files
- Added "tools/routeros2hashcat.py" for mode 38000 RouterOS backups, unpacked backup directories
and monolithic config stores
##
## Performance
##
This section collects changes with a material effect on throughput, memory use or startup time.
Measurements depend on the device, runtime and workload.
- Brain sharding cuts commit, lookup and insertion time by 92 to 99 percent and resident-memory
overhead by 95 percent
- PKZIP mode 17200 delivers 12.8 times the throughput on an RTX 4090 and gains 87 percent on an
RX 7900 XTX
- DPAPI mode 15910 gains 19 percent on NVIDIA and 97 percent on AMD
- Kernels using at least 8192 bytes of private memory per item now run one warp or wavefront, making
PKZIP 2.5 times faster on an RTX 4090 and 3.2 times on an RX 7900 XTX
- Fitting launch size from a few measurements, and reusing the lead device's result across
equivalent devices and association rounds, cuts measured autotune time by 32 percent
- Rate-based launch selection prevents fast device-amplified attacks from choosing a starved
one-unit launch inside the autotune tie margin, restoring 4.5 to 5.6 times the PCFG throughput
on tested NVIDIA and AMD GPUs
- Candidate preparation now overlaps device execution in a separate thread. Brain clients retain
their serialized reserve, lookup and commit path, and "HASHCAT_PIPE_SYNC" can select that path for
every attack
- Candidate staging now clears only the first unwritten index rather than whole buffers, avoiding
hundreds of megabytes of redundant memory clearing in large batches
- An unused event backlog was removed, saving 160 MiB of resident memory per attack
- The "--show" and "--left" options with "-o" no longer build, sort and copy per-hash records that
their output handlers discard
- Devices that need the same kernel now coordinate through its cache filename and compile it only
once
- Excluded CUDA devices no longer create a context merely to query memory, reducing backend setup
time in heavily virtualized configurations
- Omitting an integrated GPU cuts cold mode 0 startup 26 percent at a 1 percent throughput cost
- Omitting a helper an OpenCL kernel never calls cuts cold builds 42 percent and backend-info
startup 70 percent under ROCm 7.0.1
- Register-spill reserves sized from resident work items rather than the whole launch cut the
reserve by 99 percent on a GeForce RTX 4090 running mode 0
- A unified-memory device now reserves the host buffers the run needs rather than half its pool,
avoiding a fixed reserve that could leave nearly half the device unused
- Argon2 buffers are sized from the attack rather than the smaller self-test launch, allowing larger
acceleration values without reserving unused memory
- Bitmap filters sized from the hash count and the device memory hierarchy, with probes mixing all 4
digest words, make very large NTLM lists much faster and also help smaller ones
- Counting, parsing, sorting, deduplicating and indexing a hash list across all host cores makes
large salted and unsalted lists much faster to load
- Duplicate hashes sharing one stored plaintext keep a duplicate-heavy list from costing excessive
time and memory
- A hash list already completed by another run skips bitmap construction, kernel builds, device
buffers and autotune. The "--outfile-check-dir" option is scanned before attack initialization
- Outfiles and potfiles are opened, locked and flushed once per launch rather than once per crack,
and unsalted potfile lookups use digest-prefix buckets instead of scanning the complete list
- Sorting LM split halves and using binary search makes pairing scale near-linearly rather than
quadratically
- Rule-file buffers that grow geometrically, a single "-r" file going straight to the amplifier, and
reuse of the parsed rule make large rule files much faster to load and smaller in memory
- AVX2 or NEON line scanning and line-oriented stream locking accelerate initial wordlist and hash
list scans
- Piped input supplied in blocks rather than one candidate at a time removes a major bottleneck in
multi-device attacks
- Wide bridge units receive the complete iteration range per call and choose their launch size from
2 measurements, avoiding repeated fill and drain work and a full autotune search
- Uncompressed wordlist seek-index scanning is more than 20 times faster, cutting measured database
build time by 72 percent
- The "paw64" identity hash is 1.6 times faster than the xxHash it replaces in the brain and seek
databases
- Parallel parsing, compact storage and cached unit tables cut large PCFG startup time by up to 95
percent and memory use by more than 75 percent
- Hash-indexed table loading and linear-time longest-match indexing make construction of large
generated tables scale linearly rather than quadratically
- The "--stdout" option applies rules across host cores with byte-for-byte identical output, avoids
a device readback and uses a larger output buffer, making large rule workloads much faster
- Ordering candidates by length improves the 19 modes that request it by 50 to 200 percent.
Modules opt in with "module_length_sort()", and "--length-sort-disable" turns it off
- Vector width 2 on Apple M-series GPUs improves 7 fast modes by 3.0 to 35.6 percent under Metal and
OpenCL
- Reading "u32" words in the UTF-8 to UTF-16 decoder, rather than casting to bytes, improves 41
modes by 2.3 to 9.0 percent
- One table lookup per AES round-key byte instead of 2 improves modes 16600, 22500, 22931, 22941,
22951 and 23001 through 23003 by 15 to 41 percent on an RTX 4090
- Native AMD OpenCL byte operations improve Argon2 modes by 2 to 79 percent and mode 1700 by 27.6
percent on an RX 7900 XTX
- Keeping yescrypt state in registers improves modes 36100 and 36200 by 13 to 45 percent, while
local S-box placement can add another 39 percent
- Big-endian alignment using the same native operations improves mode 100 by 4.1 percent on an RX
9070 XT with Mesa rusticl
- Compiler-generated byte-swap and bit-field code, in place of handwritten assembly, improves HIP
modes 0, 1700 and 10800 by 0.4 to 0.7 percent
- A SHA-1-order shared hex table improves mode 18500 by 0.7 percent on an RX 7900 XTX
- Width conversion without the union type punning that Mesa rusticl lowered to scratch memory
improves mode 6100
- Removing unnecessary 128-register limits lets modes 01800, 08300, 10700 and 16600 use the
compiler's normal register allocation
- The native RAR3 decoder lowers per-device memory use compared with the former UnRAR path
- Straight wordlist attacks no longer reserve device memory for mask buffers they do not create
- Ending the outfile check thread without waiting for its polling interval reduces short-run
shutdown latency
- Adaptive scrypt TMTO values beyond 2 improve underfilled, high-memory GPU configurations by 5 to
46 percent without changing configurations that already fill the device
- Precomputing message templates for the md5crypt loop improves the optimized mode 500 kernel by 5
to 33 percent across AMD, NVIDIA and Intel GPUs
- Removing always-zero message words from the optimized mode 0 kernels improves combinator
attacks by 10 to 92 percent across AMD, NVIDIA and Intel GPUs
- Reporting the true RACF KDFAES iteration count instead of fixing "kernel_loops" at 8 lets
autotune select the launch size, improving throughput by 27 percent on an RX 7900 XTX and 14
percent on an RTX 4070 Ti Super
- Specializing the shared RC4 cipher for each caller improves 5 modes on an RTX 4090, including
mode 9700 by 34.7 percent, mode 9800 by 30.4 percent and mode 10500 by 16.4 percent
##
## Improvements
##
## Backends: OpenCL, tuning and memory
- OpenCL clones share contexts and programs by default, divide the physical device's memory budget,
and clean up together after a failed clone. Set "HASHCAT_CLSHARE=0" to restore separate contexts
- Runtime discovery now selects the newest versioned NVRTC, HIPRTC and HIP library, so Linux needs
only runtime packages. It no longer probes nonexistent NVRTC names or derives HIP DLL names from
the ROCm release in "HIP_PATH"
- HIP chooses its ABI from the loaded runtime, allowing one binary to support both ROCm and Hygon
DTK
- Hardware monitoring now supports AMD GPUs under Mesa rusticl by obtaining their PCI address
through "cl_khr_pci_bus_info". Temperature, fan and clock readings are now available
- Bridged modes accept "-n" and "--kernel-accel" values through 16384 candidates per launch. Other
modes retain the 1024 limit
- Hardware and tuning diagnostics were expanded: NVIDIA throttling uses documented NVML reasons
instead of NVAPI, out-of-range "-u" values name the accepted range, "HASHCAT_MEMORY" explains
every device memory budget, and "-I" reports device cache size and bridge units
- Hashcat no longer sets "AMD_DIRECT_DISPATCH=0" for HIP, previously used to reduce host CPU load.
On ROCm 7 it affects neither waiting thread CPU usage nor cracking speed, measured across several
hash modes on a Radeon RX 7900 XTX
- The obsolete AMD setting "OCL_CODE_CACHE_ENABLE" and the old Intel CPU workaround
"CL_CONFIG_USE_VECTORIZER" were removed. The "CUDA_CACHE_DISABLE" and "POCL_KERNEL_CACHE"
settings remain for debug builds
## Autotune and tuning database
- The tuning database gained measured "kernel_accel" rows and NVIDIA GB10 tunings, and now matches
vendor rows by backend vendor ID instead of individual device names
- Explicit module thread counts are preserved and reported. Mode 23800 now selects its count from
the device, and Metal uses the compiled pipeline limit instead of capping every kernel at its
32-thread SIMD width
- The "HASHCAT_AUTOTUNE2_VERBOSE" environment variable prints probe timings, the fitted cost model
and the selected launch. See "docs/hashcat-tuningdb.md" for row selection and custom tunings
## Kernels
- The "HASHCAT_FORCE_NO_INLINE" environment variable builds kernels with "FORCE_NO_INLINE" for
runtimes that compile inlined helpers slowly
## Attack modes and candidate input
- Wordlist keyspace counts physical lines. Progress includes unusable lines and reports them as
rejected instead of shifting every later position
- The "HASHCAT_A0_LEGACY_READER=1" environment setting restores the previous attack-mode 0
wordlist reader. Loopback and induction select it automatically because their inputs change by
round
- Pure-kernel attack-mode 7 retains its mask-first path for one wordlist, while directories
and multiple wordlists use the general path
- The "HASHCAT_SALT_INNER=1" environment setting tests each amplifier item against every active
salt before moving to the next item, prioritizing the leading candidates when a run is
interrupted
- Feeds can locate data in the shared directory and return "GENERIC_RC_SKIP" for a keyspace position
that produces no candidate. The included "rust_random" feed is built when Rust is available
## Hash lists and potfile
- The "--show" and "--left" options support "--username" together with "--dynamic-x"
- A hash list read as anything other than the default hashcat format now names the format it was
read as, because that choice reinterprets every line in the file
## Extraction tools
- Extraction scripts and modules now identify the corresponding hash mode or extraction tool more
consistently
## Wordlists and compression
- Invalid "--encoding-from" or "--encoding-to" values now produce an explicit diagnostic instead of
ending the run without explanation
## Brain
- Status, machine-readable and JSON output now split "Brain.Rejects" into position ranges reserved
by another client and individual candidates already seen by the server
## Startup and diagnostics
- Kernel cache keys now use all 64 bits of "paw64". Existing entries that used the shorter key
rebuild once
- Hashes supplied on the command line are now named in parse errors. Separator and token-length
errors quote the failing text and state the expected separator or length
- Initial wordlist scans now report throughput in MiB/s
## Interface and status
- Pause loops poll more frequently, so quit and resume commands respond promptly
- Tab completion covers attack-modes 4, 5, 8 and 12, "--lookup", "--cache-path" and paths beginning
with "$HOME"
- Status output now identifies wordlists as feeds, shows their position within a unified queue, and
reports "Host Generator + PCIe" whenever candidates are not amplified on the device
- The "Restore.Sub" status field combines amplifier and iteration positions for 3 devices per
update. Salt, amplifier and iteration counts moved into "Restore.Point" and appear only when
greater than one
- Candidate windows, bridge speed lines and grouped temperatures now summarize large device sets
instead of printing one row per device or unit on every update
## Benchmark
- Default "-b" modes now include yescrypt, gost-yescrypt, scryptcrypt, KeePass KDBX4 and Kerberos 5
etype 23 AS-REP, and MyBB replaces vBulletin
- Removed redundant "md5($pass.$salt)" benchmark modes. The "md5($salt.$pass)" forms remain because
their performance differs from the plain hash
## Plugins and bridges
- Bridge hardware sensors, unit names and "--hwmon-temp-abort" now refer to the hardware performing
the work
- Mode 70100 allocates one "128 * r * N" scratch area per candidate, sizes batches from free host
memory, reports "2 * N * p" iterations, and launches scrypt-jane in "-u" chunks so large N values
show progress
- Mode 73000 names the required Python build and installation method. Python bridges use hashcat's
log, and Rust unit information names the loaded plugin, for example "Rust [dynamic_hash.so]"
- Plugins can now receive bridge parameters, describe units made of several components, and call the
core's device allocation, compilation and launch functions
- OpenCL hash and HMAC helpers read only the words covered by their input length, so plugins no
longer need block-sized zero padding. Existing padded callers remain compatible
- The file layer adds "hc_fopen_mem()" for code that needs to read an existing memory buffer through
the normal file interface
- Rust bridges share "hashcat-sys" and build every crate under "Rust/bridges" into "bridges/subs".
Python bridge examples can save and reload the hashcat context for standalone debugging. CI now
checks and tests both plugin families
## Modules
- Modes 8500, 14200, 16000, 22001, 27000 and 27100 now declare support for ASCII passwords only,
which "--hash-info" identifies, other plaintext being shown as "$HEX[...]"
- Mode "-m 34300" is now named "KeePass Argon2 (KDBX v4)", which tells it apart from "-m 34301",
the KDBX v4 AESKDF mode
- Usage notices now guide users of 45 modes, and mode 1000 can show an additional advice notice
## Package maintainers
- The "ENABLE_LTO=1" build setting enables link-time optimization and is used for releases. Linking
the frontend and all plugins to one shared core reduces the unpacked release size by about 78
percent
- Development installs contain the public plugin headers and an unversioned "libhashcat.so" for
"-lhashcat". The "make install" target also installs feeds, rule files and PCFG rulesets in the
shared data directory
- Added Android and Termux support, little-endian LoongArch, PowerPC and MIPS targets, and ARM
support for the scrypt-jane bridge through sse2neon. OpenBSD now builds with its base compiler
- Apple Silicon builds are native by default. The "MACOS_UNIVERSAL_BINARY=1" build setting produces
arm64 and x86_64 output on an Apple Silicon host and disables LTO
- Added the "hashcat_binaries" cross-compilation container and Ubuntu 26.04 CUDA and AMD runtime
images. Image patches are isolated under "docker/patches", fail the build when they do not apply,
and packaging images honor "HASHCAT_REF"
- CI builds FreeBSD and Pi 4 Linux ARM64 on every push, and OpenBSD, NetBSD and DragonFlyBSD weekly.
Every artifact runs through "tools/test_package.sh" before upload
- Dependency tracking now rebuilds consumers of shared module bodies, feed headers and bundled
libraries
- Bundled zlib and LZMA sources were removed in favor of system libraries
- Hashcat's RAR3 decoder replaces "deps/unrar" and removes the C++ compiler and runtime requirement
- The "paw64" hash replaces the bundled xxHash library
## Testing framework
- Added test oracles for 29 modes, including 4 GPG, 5 PKZIP and 6 collider modes. The "test.sh -S"
command also cracks each mode's self-test vector when no independent oracle exists
- The "test.sh -g" command creates and cracks real containers for 105 LUKS, TrueCrypt, VeraCrypt,
GPG, PKZIP, RAR, 7-Zip, PDF and OpenSSH modes while still running their normal oracles
- The "tools/test.sh" and "tools/test_edge.sh" scripts now cover attack-modes 4, 8, 9 and 12. The
"-M" option selects 24 modes spanning every distinct path with vector width 1, and
"tools/test_coverage.sh" requires every untestable mode to carry an explicit exemption
- Test modules may be Python or Perl, and generated passwords now include multibyte characters
- "tools/requirements.txt" installs from PyPI only. "gostcrypto" replaces the pygost checkout, and
the XTS the DiskCryptor oracles need is built in "tools/test_modules" over pycryptodome, which
retires the pycryptoplus checkout as well
- "tools/test.pl" is now "tools/test_module_runner.pl", beside the Python engine it shares its
name with
- Added "tools/README.md", "tools/install_dependencies.sh" and "tools/requirements.txt" for test
suite prerequisites. Perl module installation now reports each package that failed instead of
only a count
## Documentation and licensing
- Added "docs/hashcat-rust-plugin-quickstart.md" for building a Rust bridge or feed
- Added "docs/packages.md" with what a package has to ship, the runtime libraries it depends on and
the build settings a maintainer needs
- Rewrote the Camellia kernel from RFC 3713 under the project license with identical results in its
16 modes. Added license texts for bundled Argon2, scrypt-jane, yescrypt, PPMd and the Windows
liblzma and libzstd libraries
- Added "SECURITY.md", "CONTRIBUTING.md" and "AGENTS.md", and rewrote "README.md"
- Corrected the "--keep-guessing" section of "docs/limits.txt", which said valid passwords are
always reported. Two candidates that match one hash inside one kernel invocation lose one of
them, and the section now says so and separates the fast and slow hash cases
##
## Bug Fixes
##
## Memory safety: hash parsing and encoding
- Fixed hash-mode parsers reading beyond input bounds on a short or malformed hash line, in modules
07100, 07900, 08500, 08501, 11600, 19600, 19700, 28800, 28900, 29100, 32100 and 32200
- Fixed salt iteration count underflow in many modules when the hash specifies zero, which could
make the device hang
- Fixed 16 modules calculating salt iteration counts with a shift of 32 or more, beyond the type's
width, which gave the wrong count
- Fixed "salt_repeats" underflow in modules 08900, 15700, 27700, 28200 and 29800
- Fixed scrypt kernels hanging at launch when parallelism is zero
- Fixed a one byte stack buffer overflow in 39 modules, where a salt buffer sized for the longest
"generic_salt_encode()" output left no room for the terminator, which was then written just past
it
- Fixed base64 salts overflowing "salt_buf" in "generic_salt_decode()" with non optimized kernels
- Fixed modules reporting encoded hash lengths larger than their output buffers, so callers wrote a
terminator past the end. The "hash_encode()" function now limits the length it returns, and the
potfile and status display paths that bypass it enforce bounds themselves
- Fixed a "0x80" padding byte being written beyond a full buffer, in modules 00111, 01411, 01711,
05300, 05400, 11400, 13100, 13600 and 18200. The pure kernels of modes 00111, 01411 and 01711
now also accept their advertised 256-byte salts
- Fixed encoding buffer overflows seen with "--show" and "--left" at the maximum data length, in
modules 13100, 16900, 18200, 19600, 19700, 32100 and 32200
- Fixed a heap buffer overflow when constructing outfile lines, where a long username, hash or
plaintext was copied in with no bounds check
- Fixed "--username" allocating only up to a NUL byte while recording the whole field length, so
"--show" and "--left" read past the allocation and put unrelated heap data in the output
- Fixed 32 bit overflow in digest buffer offsets addressing the wrong hash beyond 4 GB
- Fixed a decode error on a damaged gzip, xz or zip file being taken as a byte count, overrunning
hash list line counting and the brain attack hash and custom charset reader buffers
- Fixed a one byte overflow in "fgetl()" when a line exactly filled the caller's buffer
- Fixed hccapx handling in modules 02500, 02501, 22000 and 22001: compressed files no longer size
decompressed arrays, ESSID and EAPOL lengths are validated, and short potfile lines are not read
as 64 characters
- Fixed modules 16800 and 16801 reading short potfile lines past their end before checking the
64-character PMKID
- Fixed KeePass parsers accepting invalid content lengths and writing oversized encodings in
modules 13400, 29700 and 34300
- Fixed module 34300 indexing backward from the end of KeePass 4 hash lines shorter than 70 bytes
before parsing them
- Fixed unbounded Kerberos account and realm copies in etype 23 modules 13100 and 18200 and etype 17
or 18 modules 19600, 19700, 19800, 19900, 28800, 28900, 32100 and 32200
- Fixed module 25400 reading beyond a line's stated length with "%s", copying 32 bytes of user
password past the end of it, using a stack variable after its scope ended, and appending a stray
byte to a full 32 character PDF user password, which reached the hash line and the potfile
- Fixed heap buffer overflows in the PKZIP modules 17200, 17210, 17220, 17225 and 17230, where hex
data tokens were decoded with no bounds check
- Fixed a decoded token exceeding the field it decodes into, in modules 11600 and 70000, and a
decoded plaintext token doing the same in the RC4 modules 33500, 33501 and 33502
- Fixed writes beyond the hash list when an LM hash file grew during reading, where one line adds 2
entries after space was checked for only one
- Fixed a stack buffer overflow with "--show" in split hash modes, where both plaintext halves were
copied from the potfile into a 20 byte buffer unchecked
- Fixed buffer overflows in modules 08900, 10200, 21500, 21501, 28200, 70100 and 70200, where a
base64 token without padding decodes to more bytes than its destination field holds
- Fixed a long password and salt overflowing the 128 byte packing buffer in the SAP CODVN F/G
modes 7800 and 7801
- Fixed module 10000 accepting salts larger than its buffer, and its salt encoder leaving no space
for a terminator
- Fixed a stack buffer overflow in the module 28600 encoder, which sizes its salt and base64 buffers
for 32 bytes while the parser accepts 64
- Fixed module 26900 reading beyond the esalt on an SNMPv3 engine ID of nothing but zero bytes,
and again while encoding for "--show" and the potfile
- Fixed mode 32300 accepting salts longer than its optimized kernel can hold, writing beyond its
256-byte fields when joining fixed strings to salts near the maximum length, and overflowing the
heap in its hash parser
- Fixed a base64 target hash overflowing the heap digest buffer in module 34000, and a base64 salt
overflowing the stack decode buffer in module 23400
- Fixed the GPG modes 17010, 17020 and 17030 printing uninitialized bytes with "--show" and "--left"
and writing them to the outfile, from a missing terminator in the hex encoded data field
- Fixed bridge scratch handling: modes 70100 and 70200 validate "N", "r" and "p", yescrypt sizes
its buffers without 32-bit overflow, and scrypt-jane, yescrypt and Argon2 check allocation failure
- Fixed reads beyond buffer bounds in secp256k1 "point_mul_xy()" when the scalar is zero
- Fixed TrueCrypt and VeraCrypt modes leaking their container header on both error returns from
"module_hash_binary_parse()", losing 512 bytes per rejected container across 36 modes
## Memory safety: candidates, rules and masks
- Fixed "-g" reading one past the end of its operator and character tables
- Fixed a stack buffer overflow for long words, where rule "/Xyp" asks "mangle_dupeblock_prepend()"
for more bytes than its local buffer holds
- Fixed the rule engine's contain rejection reading beyond the candidate, and the 4 operators that
reject on the first or last character reading past the end of an empty one
- Fixed missing bounds checks for class selector lookahead in the rule compiler
- Fixed stacked rule files corrupting memory or miscalculating device memory when a combined rule
exceeds 31 functions or the rule count exceeds 32 bits
- Fixed a one-byte debug plaintext overflow when a rule produces a maximum-length password
- Fixed 33 combinator kernels reading beyond their 256 byte candidate buffers, where 2 words of up
to 256 bytes each were combined with no check on the total length. Such a pair is now skipped
- Fixed a mask or custom charset over 1023 characters overwriting the length used to index it
- Fixed masks over 255 characters, and masks grown by a long custom charset, overflowing the 256
byte buffers "--increment" uses to reverse and truncate them, and a heap buffer overflow with
"--increment" and mask files
- Fixed "-g" drawing an index past the end of its selected group in 17 selection paths, and an empty
"--generate-rules-func-sel" value causing division by zero instead of being rejected
## Memory safety: services and interface
- Fixed brain client and server overflows from negative peer lengths, more than 64 saved dumps, and
more than 64 entries in "--brain-session-whitelist"
- Fixed keyboard mappings expanding TrueCrypt or VeraCrypt passwords beyond fixed buffers and
mapping files with more than 256 entries overflowing their table
- Fixed unbounded reads from device memory for status candidates that could cause a crash
- Fixed the status display's rule file list overflowing its 4 KB buffer. The list is now truncated,
because "snprintf()" returns the length it would have written
- Fixed "--outfile-check" reading and writing one byte beyond its line buffer
- Fixed reads beyond an unterminated restore directory field containing all 256 bytes
- Fixed a ".hctune" line with more than 7 fields overflowing the token array, which a user tuning
file could reach
- Fixed an "snprintf()" length calculation error in the 7-Zip hash encoder for "-m 11600". No hash
the parser accepts is long enough to trigger it
- Fixed substantial allocations retained by early returns from "outer_loop()" and the "--identify"
probe, including rejected option combinations
- Fixed "profile_dir", "session_dir" and "shared_dir" leaking when hashcat runs from its install
directory
- Fixed the argument vector loaded from a restore file leaking once per libhashcat session
## Hash modes and kernels
- Fixed modes 22000 and 22001 refusing the old PMKID format when it was written with ":" separators
rather than "*". The line was rewritten into the current format by copying it whole, which left all
4 fields as one token
- Fixed mode 3000 silently truncating wordlist entries longer than 7 characters instead of rejecting
them
- Fixed "-m 19800" and "-m 19900" ignoring the salt field, so a principal whose salt is not the
realm followed by the user never cracked, and a hash line carrying that field would not load
- Fixed the 41 modes that convert UTF-8 to UTF-16 in the kernel rejecting a correct password holding
the euro sign, Japanese kana or most other 3 byte characters, where only 4 of 16 valid 3 byte lead
bytes and 3 of 5 valid 4 byte lead bytes were recognized
- Fixed "-a 3" failing to crack a password with characters outside ASCII, where each UTF-8 byte was
widened into a separate character rather than decoded, in modules 00130, 00140, 00170, 01430,
01440, 01470, 01730, 01740, 01770, 10830, 10840, 10870, 13500, 13800, 29000 and 29200
- The "-a 3" fix for characters outside ASCII needs "--backend-vector-width 1" on CPU devices
- Fixed a missing barrier in the module 22100 loop kernel, which gave wrong results once workgroup
threads left lockstep, because a thread starting the next round could overwrite shared
precomputed salt data while the others were still reading it
- Fixed "--keyboard-layout-mapping" having no effect in the 15 TrueCrypt and VeraCrypt container
modes 6241-6243, 13721-13723, 13741-13743, 13761-13763 and 13781-13783. Binary container parsing
now runs "module_hash_decode_postprocess()" like text hash parsing
- Fixed the VeraCrypt modes 13723, 13733, 13751, 13753, 13761 and 13763 failing their self test,
and hanging under "--self-test-disable" on the password they had just found, by keeping the 15
XTS header helpers out of line. TrueCrypt, DiskCryptor and LUKS were never affected
- Fixed module 01500 cracking nothing in "-a 3" with multiple hashes sharing one salt, where the
path that compiles the salt into the kernel had an empty stub for multiple hashes
- Fixed stored DEFLATE blocks in PKZIP modes 17200, 17220 and 17225 on AMD HIP and OpenCL, and in
the attack-mode 1, 3, 6, 7 and 12 kernels for mode 17230
- Fixed module 10500 rejecting PDF hashes with an empty ID field
- Fixed "-m 24420" rejecting the self-describing "$PEM$2" line that "pem2john.py" emits for any
PRF other than SHA-1, so a key from the current script could not be loaded at all. A line
naming another KDF or PRF is now refused rather than read as SHA-256
- Fixed GPG modes 17010, 17020, 17030, 17040 and 17050 failing at particular iteration counts and
password lengths because stale salt bytes entered key derivation. Mode 17030 also reads AES-128
keys from the SHA-256 state with the correct word width
- Fixed modes 7800 and 7801 truncating a SHA-1 message past byte 119, so a matching candidate did
not crack
- Fixed the SNMPv3 modules 25000, 25100, 25200, 26700, 26800, 26900 and 27300 rejecting an engine
ID shorter than 13 bytes, and 26900 and 27300 padding every ID to 17 bytes with zeros, so a
shorter one did not crack during password localization
- Fixed the 8 scrypt modules reporting an incompatible self test, or a mixed configuration, for a
file holding a single hash, where large "r" and "p" values made derived buffer sizes overlap error
flag bits. Such hashes are now rejected for their memory requirements
- Fixed modules 03710, 04010 and 04110 advertising a salt limit past what the optimized kernel
holds, so a 24 to 51 byte salt was accepted under "-O" and never cracked
- Fixed "-m 35100" rejecting a password longer than 15 characters, having no pure kernel and
therefore always using the optimized one
- Fixed association workgroups reusing one hash's salt, keyboard mapping or page table, and host
hooks receiving only the launch salt. The fixes cover modules 01100, 05300, 05400, 05600, 07300,
08000, 11600, 13800, 17200-17230, 23800, 06211-06233, 13711-13773 and 22100
- Fixed the PKZIP modes 17220 and 17225 overrunning the private-memory aperture on AMD GPUs, which
could prevent HIP launches or severely reduce throughput
- Fixed mode 31100 hanging at vector width 16 in the optimized "-a 3" kernel on AMD GPUs, where the
SM3 message schedule grew large enough for the compiler to relax a branch through the register
pair holding the return address. The function returned into itself, and is now inlined
- Fixed secp256k1 "inv_mod()" looping forever on zero input and hanging "clFinish()" on CPU devices
- Fixed the pure kernels of modes 01500, 03000, 08500, 14000, 14100 and 16000 using shared memory on
a CPU device, which has none of its own
- Fixed modules 8500, 8501, 12400 and 14100 failing to compile on OpenCL runtimes that report local
memory as global memory
- Fixed "-m 17220 -a 3" build failures from including "inc_checksum_crc32.cl", renamed during CRC
restructuring
- Fixed "-m 73000" crashing after a run under Python 3.14, where its bridge released 4 Python
references it did not own and leaked 2 tuples
- Fixed 11 hash modes writing "--separator" between internal hash fields, which hid where the
plaintext starts when an outfile line is split on that character, and module 30700 writing fields
with "--separator" when its parser expects a colon
- Fixed the hash category for Mega.nz links protected by passwords
- Fixed a module file that exists but cannot be loaded crashing autodetection, "--identify",
"--help" and "--hash-info", and memory leaks in "module_load()" when the file cannot be opened or
carries no "module_init()"
## Backends: OpenCL, tuning and memory
- Fixed the Windows HIP runtime version check accepting every version because it compared
incompatible version scales
- Fixed OpenCL 1.2 devices requiring extension strings for atomics and byte-addressable stores, and
Beignet or Mesa version strings triggering the obsolete unstable-driver rejection
- Fixed "-cl-std=" being chosen from the platform's OpenCL version rather than the device's, which
also made the too-old diagnostic name the wrong version
- Fixed an optimized kernel built with rules never starting on Apple Silicon under OpenCL at
"--backend-vector-width 2", where Apple's compiler inlined 64 of the 66 rule functions into one
body it never finished. They are kept out of line there, as they already are on the Metal backend
- Fixed OpenCL work sizes exceeding what a device allows for the first work item dimension,
which hashcat never asked about before
- Fixed devices of the same class sharing one acceleration, thread count and batch size, which could
exceed what one device's buffers hold. Classification ignores memory, and a card driving a display
allocates less, so shared values are now capped by each device's own maximums
- Fixed OpenCL 1.2 platforms compiling as OpenCL C 1.1 and rejecting static data at file scope
- Fixed a compiled kernel being readable before its writes completed, where the writer truncated the
file before locking it and readers took no lock. Another hashcat process could load a truncated
kernel, so kernels are now written to a temporary file and renamed into place
- Fixed a device being skipped when hashcat could not parse its OpenCL driver version, which was
treated as too old. The version is now reported once and the device stays available
- Fixed a device being dropped when a tuning row pinned an acceleration value too large for its
memory. The pinned value is now lowered, but only after every other fit has been tried
- Fixed autotune deriving an invalid acceleration for one-thread kernels and using misaligned
thread-count steps across wavefront boundaries
- Fixed underflow in the scrypt and argon2 available memory calculations, where a device reporting
less memory than the reserve asked for an enormous allocation
- Fixed OpenCL kernel lookup returning "aux1" for all 4 auxiliary kernels, so register spill
reserves were calculated from "aux1" alone
- Fixed OpenCL launching "vector_width" times too many work items in the "loop2" kernel, in modes
14800, 15310, 15910, 27500 and 27600
- Fixed per-work-item buffers being sized from the unrounded launch count, which let vectorized
kernels read and write past their ends
- Fixed disabling a mode's JIT kernel cache also disabling the shared, Markov and amplifier caches
- Fixed hashcat continuing after a required thread failed to start, and joining an uninitialized
thread handle afterwards. A worker that cannot start now runs its work on the calling thread, and
a cracking, monitor or outfile check thread that fails to start is reported
- Fixed the "Vector_Width" column of a tuning row a module generates being ignored, because only the
"kernel_accel" lookup searched the name those rows are registered under and the "vector_width" one
did not
## Backends: Metal and resource lifecycle
- Fixed a CUDA benchmark retaining register-spill allocations between modes
- Fixed 6 backend leaks: the NVRTC and HIPRTC option arrays, a string returned by
"module_jit_build_options()", an autotune event and 2 Metal strings
- Fixed larger kernels, mostly the SHA-512 modes, failing to compile on Metal, which now builds
its libraries optimized for size
- Fixed Metal leaking one placeholder buffer per launch and 25 pipeline objects per device. The
"run_kernel()" function now releases the placeholder it creates for an unused argument, as
"run_kernel_amp()" already did
- Fixed a failure to read the Metal runtime version ending the whole macOS run, and disabling the
OpenCL devices with it. It now disables only Metal and falls back to OpenCL
- Fixed crashes on macOS Tahoe when maximizing concurrent Metal pipeline compilation
- Fixed the AMD "V_PERM_B32" probe indexing with the device total instead of the loop counter when
it reuses a neighboring device's result, so it compared with the last enumerated device rather
than the preceding one and could take a result from an unprobed slot, disabling support
- Fixed the HIP blocking sync flag reaching only the first of several AMD GPUs, because
"hipSetDeviceFlags()" affects the currently selected device and the flag was set before selecting
one. Hashcat now selects each device first
- Fixed backend sessions remaining open after startup failures outside benchmarks
- Fixed CUDA contexts remaining on the main thread after creation, session cleanup freeing buffers
under the wrong device context, and context pops writing into device-thread handles
## Backends: bridges and hardware monitoring
- Fixed bridged modes autotuning an empty loop placeholder instead of measuring bridge work
- Fixed the first bridge unit's tuning result overwriting every other unit even when their widths
and performance differed
- Fixed wide bridge units sizing launch buffers as though "kernel_accel" counted candidates instead
of waves, which could underallocate them and cause an illegal memory access. The "-n" option now
counts waves, and bridge speed lines report "Accel" instead of "Batch"
- Fixed the Python bridges dropping a borrowed reference and then returning a pointer into it, and
early returns leaving the thread state attached, which ended the process on the next attach
- Fixed a bridged hash mode ignoring "-d" and running every bridge unit, and accepting a device
number that does not exist without saying so
- Fixed a Metal device being disabled when "-d" also picked an OpenCL device, with no message
saying how to select Metal instead
- Fixed runs exiting successfully after losing every device, most visibly during benchmarks
- Fixed "-u" values above 1024 being rejected even though 1024 is only the default limit
- Fixed a bridged hash mode accepting "-n" and then ignoring it, where the launch size was
overwritten with the candidate count the bridge advertises, the check having overlooked the modes
whose limit is well above 1024
- Fixed a backend initialization error on every run where CUDA is installed with no NVIDIA GPU, or
HIP with no AMD GPU
- Fixed "-b --benchmark-all" crashing at the first hash mode requiring a bridge, where bridge hooks
were called without a loaded bridge
- Fixed the "-Y 4" setting printing the same hardware-monitor data 4 times for one physical card
- Fixed hardware monitoring probing unsupported sensors on integrated Intel GPUs or devices without
PCI addresses, testing the wrong vendor handle, and showing only the first bridge unit
- Fixed a HIP device property failure being reported as a "hipDeviceGetAttribute()" error, without
naming the device it happened on
- Fixed outdated driver messages naming Intel regardless of device vendor, where the checks cover
Intel CPU devices and AMD, NVIDIA and Apple GPU devices. The message now names the device's vendor
- Fixed "-I" listing one backend device per bridge unit rather than per physical device
- Fixed a modified kernel not being recompiled, because the cache key omitted the kernel source
- Fixed Apple IOKit initialization running twice and leaking an SMC connection and an IOReport
subscription on every run
## Attack modes and candidates
- Fixed "--stdout" writing a candidate that contains a line ending as two lines. Candidates now use
the same "$HEX[...]" form as the outfile, so one candidate is always one line
- Fixed "--generate-rules-seed" having no effect outside Windows, where the seed went to "srand()"
while "-g" drew from "random()", so every run produced the same rules
- Fixed 3 attack-mode 9 paths launching more work items than salts, which could read beyond the salt
buffer and abort on small hash lists
- Fixed bridged association attacks reusing one launch salt. Modes 70000, 72000, 73000 and 74000
previously recovered only one hash, while 70100 and 70200 failed when per-hash costs differed
- Fixed 2 large rule files incorrectly reporting completion after a keyspace of 65536
- Fixed checkpoint cancellation after a device had already stopped, which could discard undispatched
keyspace and delete the restore file. Restore positions beyond the keyspace no longer wrap to an
enormous remaining count
- Fixed rejected words under "--slow-candidates" shifting later positions. Attack-mode 1 now applies
case and encoding conversion before rejecting oversized amplifier words, and attack-modes 1 and 7
no longer reuse stale candidates after a rejection
- Fixed a mask file line using all 8 custom charsets keeping the previous line's mask, where only
the first 8 of the 9 fields had their lengths reset
- Fixed the Danish keyboard layout, which contained no valid mappings, and reject empty mapping
files or files with multiple replacements for one source before the attack starts