pub enum IntegrityAnomaly {
Show 20 variants
LogCleared {
channel: String,
timestamp: u64,
user_sid: Option<String>,
},
RecordIdGap {
chunk_offset: u64,
expected: u64,
found: u64,
},
ChecksumMismatch,
ChunkChecksumMismatch {
chunk_offset: u64,
computed: u32,
stored: u32,
},
RecordChecksumMismatch {
chunk_offset: u64,
computed: u32,
stored: u32,
},
NextRecordIdInconsistency {
header_next: u64,
actual_highest: u64,
},
TimestampAnomaly {
chunk_offset: u64,
record_id: u64,
prev_ts: u64,
this_ts: u64,
},
FileHeaderChecksumMismatch {
computed: u32,
stored: u32,
},
FileNotCleanlyShutdown,
FileFull,
ChunkCountMismatch {
header_count: u16,
actual_count: usize,
},
ExportTimestampCorruption {
record_id: u64,
chunk_offset: u64,
},
SurgicalRecordDeletion {
chunk_offset: u64,
absorbing_record_id: u64,
stated_size: u32,
ghost_offset_in_chunk: u64,
},
InvalidChunkDataLength(u32),
LogFileGuidMismatch {
chunk_index: usize,
expected: u128,
actual: u128,
},
TrailingData {
offset: u64,
len: usize,
},
TruncatedFile {
declared_chunks: u16,
found_chunks: usize,
},
OverlappingChunks {
chunk_a_offset: u64,
chunk_b_offset: u64,
},
EmptyLog,
PhantomRecordInjection {
gap_start_id: u64,
gap_end_id: u64,
prev_timestamp_ns: i64,
next_timestamp_ns: i64,
},
}Expand description
Structural integrity anomalies detected in an EVTX file.
These variants represent low-level binary format facts only.
Intent inference (e.g. anti-forensic classification) belongs in the
caller — for example, the RapidTriage correlation engine.
Variants§
LogCleared
RecordIdGap
ChecksumMismatch
Generic checksum mismatch (caller should prefer the specific variants below).
ChunkChecksumMismatch
RecordChecksumMismatch
NextRecordIdInconsistency
TimestampAnomaly
FileHeaderChecksumMismatch
FileNotCleanlyShutdown
FileFull
ChunkCountMismatch
ExportTimestampCorruption
A record has a zeroed header timestamp consistent with the wevtutil /
Event Viewer export bug: when exporting with wevtutil epl or
“Save As…”, each record’s header timestamp is replaced with the
previous record’s BinXml timestamp; the first record in the export
therefore has no predecessor and receives timestamp 0.
Reference: Wassenaar, Fox-IT BV (2019). “Export corrupts Windows Event Log files” https://blog.fox-it.com/2019/06/04/export-corrupts-windows-event-log-files/
Fields
SurgicalRecordDeletion
A record’s stated size spans the magic bytes of a subsequent record,
consistent with surgical deletion by the NSA DanderSpritz
eventlogedit tool. The tool absorbs the deleted record into the
preceding record’s size field without emitting EID 1102.
Reference: Wassenaar & van Dijk, Fox-IT BV (2017). “Detection and recovery of NSA’s covered up tracks” https://blog.fox-it.com/2017/12/08/detection-and-recovery-of-nsas-covered-up-tracks/
Reference implementation (Python): Wassenaar, Fox-IT BV — fox-it/danderspritz-evtx https://github.com/fox-it/danderspritz-evtx (MIT License; algorithm independently re-implemented in Rust)
Fields
InvalidChunkDataLength(u32)
Chunk data length field falls outside the valid EVTX range [512, 65536].
LogFileGuidMismatch
The log_file_guid field in a chunk header differs from the first chunk’s GUID,
indicating the chunk was transplanted from a different log file.
TrailingData
Unexpected bytes follow the last valid chunk in the file.
Fields
TruncatedFile
The file ends before all chunks declared in the file header are present.
Fields
OverlappingChunks
Two chunk byte-ranges overlap, indicating structural corruption.
Fields
EmptyLog
The file header reports zero chunks. The log was cleared and the file was recreated but never written to, or the header is corrupt.
PhantomRecordInjection
A record-ID gap whose timestamp delta is too small to account for the missing records, suggesting phantom records were injected without advancing the clock — a deliberate anti-forensic technique.
Implementations§
Trait Implementations§
Source§impl Clone for IntegrityAnomaly
impl Clone for IntegrityAnomaly
Source§fn clone(&self) -> IntegrityAnomaly
fn clone(&self) -> IntegrityAnomaly
1.0.0 (const: unstable) · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for IntegrityAnomaly
impl Debug for IntegrityAnomaly
Source§impl Observation for IntegrityAnomaly
impl Observation for IntegrityAnomaly
Source§fn severity(&self) -> Option<Severity>
fn severity(&self) -> Option<Severity>
None if the analyzer deliberately does not grade this kind.Source§fn category(&self) -> Category
fn category(&self) -> Category
Category::from_code of Observation::code.
Override when a code’s keyword classification is wrong.