Add 61 macOS forensic plugins (195 functions)#1717
Add 61 macOS forensic plugins (195 functions)#1717MrJayTechie wants to merge 1 commit intofox-it:mainfrom
Conversation
Comprehensive macOS artifact parsing covering: Browsers: Safari, Chrome/Edge/Brave (Chromium), Firefox - history, downloads, searches, bookmarks, cookies, logins User Activity: KnowledgeC (12 functions), Biome (35 functions), ScreenTime, Interactions, Spotlight, Launchpad Communications: iMessage, FaceTime, CallHistory, Contacts, Notifications, Apple Notes Persistence: LaunchAgents/Daemons, kernel/system extensions, cron jobs, periodic scripts, startup files Security: TCC access grants, firewall (PF + ALF), keychain, Gatekeeper/ExecPolicy, MDM profiles File System: FSEvents, DS_Store, Document Revisions, Trash, QuickLook thumbnails Logs: system/install logs, ASL binary databases, power management, crash reports, audit configuration Network: WiFi intelligence, DHCP leases, SSH, Screen Sharing, Apple Remote Desktop, Microsoft Remote Desktop System: preferences, OS info, local users, timezone, hosts, sudoers, share points, DHCP, accounts Other: Apple Wallet/Pay, Office MRU, shell history, print jobs, install history, software updates, iCloud, iOS backups, saved application state All plugins: - Tested on macOS 13 (Ventura), 14 (Sonoma), 15 (Sequoia) - 0 errors across multiple test machines - Handle SQLite WAL/SHM sidecars for data completeness - Handle Velociraptor %2E filename encoding - Support both live systems and forensic images
|
Thanks for the incredible contribution! It’s too large to review as one PR though, would you mind splitting it up in logical chunks, keeping in mind the following:
Thanks! |
Add a dedicated osinfo plugin that exposes two exports:
- osinfo.version: parsed SystemVersion.plist (product_name,
product_version, build_version, source).
- osinfo.install_date: the mtime of .AppleSetupDone as a UTC
datetime, used as a proxy for the initial OS install/setup
date.
Includes unit tests using the existing target_macos and fs_macos
fixtures, plus hand-crafted test data (SystemVersion.plist and an
empty AppleSetupDone) under tests/_data/.
First plugin split out of PR fox-it#1717 as a proof-of-pattern for the
requested per-plugin test + fixture contribution style.
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
|
Hi @Schamper, thanks for the review! Fully agree the single-PR scope is too large. Here's the proposed split: To validate the test/fixture/lint pattern before I multiply it 60×, I've prepared a proof-of-pattern branch with just one plugin — https://github.com/MrJayTechie/dissect.target/tree/macos-osinfo Proposed split into 10 PRs (ordered simplest → most complex):
Before I start on the rest, could you glance at the Happy to convert this PR to draft or close it entirely once the first split-PR is in review — whichever you prefer. |
Add a dedicated osinfo plugin that exposes two exports:
- osinfo.version: parsed SystemVersion.plist (product_name,
product_version, build_version, source).
- osinfo.install_date: the mtime of .AppleSetupDone as a UTC
datetime, used as a proxy for the initial OS install/setup
date.
Includes unit tests using the existing target_macos and fs_macos
fixtures, plus hand-crafted test data (SystemVersion.plist and an
empty AppleSetupDone) under tests/_data/.
First plugin split out of PR fox-it#1717 as a proof-of-pattern for the
requested per-plugin test + fixture contribution style.
|
Unfortunately the changes in the If you could, please start with making small, targeted changes that you have initially reviewed the generated code of yourself and compare it with existing Dissect functionality and conventions. Especially when it comes to unit tests, in a framework like Dissect, LLM generated test data is not welcome. It's likely to generate test data that will work with it's own (sometimes hallucinated) implementation. |
|
Hi @Schamper — understood on all three points. I've opened #1719 as the pilot split: a single macOS plugin ( Converting this PR to draft while I rebuild the rest of the macOS plugins the same way. Once the pattern is approved I'll open small targeted PRs one at a time. |
|
@MrJayTechie thank you for your contribution! As this is your first code contribution, please read the following Contributor License Agreement (CLA). If you agree with the CLA, please reply with the following information:
Contributor License Agreement
Contribution License AgreementThis Contribution License Agreement ("Agreement") governs your Contribution(s) (as defined below) and conveys certain license rights to Fox-IT B.V. ("Fox-IT") for your Contribution(s) to Fox-IT"s open source Dissect project. This Agreement covers any and all Contributions that you ("You" or "Your"), now or in the future, Submit (as defined below) to this project. This Agreement is between Fox-IT B.V. and You and takes effect when you click an “I Accept” button, check box presented with these terms, otherwise accept these terms or, if earlier, when You Submit a Contribution.
|
Summary
I've been working on macOS forensic plugins for dissect and built 61 plugins covering 195 functions across all major macOS artifacts. Right now dissect.target only has 3 macOS plugins (user, network, _os) — this would bring macOS coverage much closer to what's available for Windows and Linux.
What's included
Key points
%2Efilename encodingTesting
Tested against real macOS collections — 135/195 functions return data on a typical Mac. Remaining are legitimate empties (app not installed, feature disabled). Happy to add pytest tests based on your framework.