Skip to main content

zip_extensions/audit/handlers/
names.rs

1use super::util;
2use crate::audit::entry_audit_handler::EntryAuditHandler;
3use crate::audit::entry_view::EntryView;
4use crate::audit::report::{SuspiciousEntry, SuspiciousReason, ZipAuditReport};
5
6pub struct NamesHandler;
7
8/// An `NamesHandler` is used to track and report on suspicious (odd or OS-incompatible) names,
9/// which often indicate obfuscation or extraction issues. For instance, the handler flags long
10/// paths and very deep hierarchies, control characters in names, and certain reserved names.
11impl EntryAuditHandler for NamesHandler {
12    fn visit(&mut self, view: &EntryView, report: &mut ZipAuditReport) {
13        Self::detect_long_name(&view, report);
14        Self::detect_control_chars(&view, report);
15        Self::detect_windows_reserved_name(&view, report);
16    }
17}
18
19impl NamesHandler {
20    fn detect_long_name(view: &&EntryView, report: &mut ZipAuditReport) {
21        if util::path_is_extremely_long(&view.name_raw) {
22            report.suspicious_entries.push(SuspiciousEntry {
23                name: view.enclosed_name.clone(),
24                reason: SuspiciousReason::ExtremelyLongPath,
25            });
26        }
27    }
28
29    fn detect_control_chars(view: &&EntryView, report: &mut ZipAuditReport) {
30        if util::contains_control_chars(&view.name_raw) {
31            report.suspicious_entries.push(SuspiciousEntry {
32                name: view.enclosed_name.clone(),
33                reason: SuspiciousReason::ControlCharsInName,
34            });
35        }
36    }
37
38    fn detect_windows_reserved_name(view: &&EntryView, report: &mut ZipAuditReport) {
39        if util::is_windows_reserved_name(&view.enclosed_name) {
40            report.suspicious_entries.push(SuspiciousEntry {
41                name: view.enclosed_name.clone(),
42                reason: SuspiciousReason::WindowsReservedName,
43            });
44        }
45    }
46}