Version 2.0.0 (30-Sep-2026)
Version
2.0.0of Microsoft 365 Reset is strictly security-focused (with no new core functionality)
- Addressed critical findings from a second Monocle security review
- ⚠️ Breaking Change: ⚠️
self-servicemode now exits10during preflight when no--operations/$5allowlist is supplied; pass--allow-all-operationsor set Parameter$6totruefor deliberately broad, admin-only policies (testanddebugkeep the loggedWARNING) remove_officeno longer deletes/Library/Application Support/Microsoftor forgets the Defender (com.microsoft.wdav) package receipt, matching current MOFA Office Removal; Office-ownedMAU2.0,MERP2.0, andOffice365are still removed, and Defender and Edge data under/Library/Application Support/Microsoftare preserved (like MOFA, the shared/Library/Logs/Microsoftfolder is still removed)remove_defendernow fails (exit20) when the Defender uninstaller exits non-zero or the app bundle remains- Auto-repair removes a damaged app (Word, Excel, PowerPoint, Outlook, OneNote, OneDrive, Teams, and MAU), a version-mismatched Office app, or an outdated Teams app only after the replacement package downloads and passes verification; outdated Office apps, OneDrive, and MAU are still updated in place
reset_teams/reset_teams_forceretry a failed Teams package download up to five times (MOFA-aligned) instead of stopping after the first failure- Removals under the console user's home folder refuse any path whose parent directories resolve through a symlink, so a user-planted link cannot redirect a root deletion; Office template and add-in glob cleanup now routes through
safeRemove, and Teams background archive, staging, and restore are skipped with aWARNINGon the same condition - Removals under the console user's home folder now run as the console user (with no
rootfallback), so a symlink swapped in after the parent check cannot redirect the deletion outside what the user can already delete; root-owned folders left in the home folder are not removed and log aWARNING - The parent-directory symlink check now requires the resolved path to stay under the resolved home folder (case-sensitive), comparing only the portion below the home folder case-insensitively
reset_teams/reset_teams_forcenow fail (exit20) before removing Teams data when classic backgrounds cannot be archived or current backgrounds cannot be staged, instead of continuing and deleting them; backgrounds under a symlinked parent directory are skipped with aWARNINGand cleanup continues- Teams background archive and restore moves no longer follow a destination symlink, and restore keeps backgrounds in staging with a
WARNINGwhen the destination already exists - Custom MAU channels now require an
https://ManifestServer; non-HTTPS values are ignored with aWARNING - An unreadable app version no longer triggers the legacy Office 2016 installer or version-based reinstalls (Office apps, OneDrive, Teams, and MAU); the code-signature check decides
- User-context commands (restart prompt,
open,tccutil, keychain,defaults) run once in the console user's session instead of re-running under plainsudo -uafter a non-zero exit - Keychain deletions no longer copy
securityoutput (including the deleted item's account and identity attributes) into the client log; each deletion logs a sanitizedINFOline naming only the item label, service, or creator, and unexpected failures log aWARNING reset_exceldeletes theMicrosoft.Office.Excel.ProtectedDataServicescertificate in the console user's session instead of searching root's keychains- Every run that reaches preflight now ends with a
NOTICEsummary line in all modes (includingsilent, which has no completion dialog): succeeded and failed operation counts, failed operation IDs, elapsed time, and exit code (for example,Exiting: 9 succeeded, 1 failed (reset_teams); Elapsed Time: 0h:1m:12s; exit code 20) - Teams background restore creates container folders as the console user (MOFA-aligned) instead of leaving root-owned parents
- swiftDialog trust check now verifies the code signature against a Team ID requirement, checks ownership of
Contents/andContents/MacOS/, and exits10if the version is still unreadable after reinstall - swiftDialog install stages
Dialog.pkgin the root-private run directory, requires a passing Gatekeeper assessment, and verifies regular-file type and root ownership beforeinstallerruns - Preflight exits
10when the console user's home resolves to/,/var/root, a relative path, or a missing folder; home paths containing spaces are no longer truncated - Microsoft package staging is removed on every failure path, so Teams download retries no longer retain failed downloads until exit
- Treat
_mbsetupuser(Setup Assistant) as no console user - Intro dialog now tells users to save their work before continuing
README.mdnow leads with a destructive-script caution, adds an impact column to the operations table, and clarifies thattestis not a dry-run andsilentskips confirmation
- ⚠️ Breaking Change: ⚠️
- Reviewed MOFA repo
- Hardened root path trust based on a Monocle security review
- Microsoft repair packages now download into a root-private per-run staging directory instead of
/Users/Shared/OnDemandInstaller, and are checked for regular-file and root ownership beforeinstallerruns - swiftDialog command file stays root-owned and world-readable; it is no longer
chowned to the console user - swiftDialog must resolve inside
/Library/Application Support/Dialog/Dialog.app, be root-owned and not group/other-writable, and be signed by Team IDPWA5E9TQ59; one reinstall is attempted before exiting10 - Removed
/usr/local/binfromPATH; all swiftDialog invocations use the validated absolute path reset_teams/reset_teams_forcestage Teams backgrounds in a privatemktemp -ddirectory instead of a fixed/tmppath, and retain them with a warning if restore fails
- Microsoft repair packages now download into a root-private per-run staging directory instead of
- Added
remove_defenderto the interactive destructive-action confirmation, and log anINFOline when the user acknowledges it debugmode uses a timestampedPS4and suspends xtrace inside keychain-deletion, Microsoft package-install, and swiftDialog-install helpers- Internal
Resources/createSelfExtracting.zshnow generates wrappers that pinPATH, extract into a privatemktemp -ddirectory, run the extracted script with/bin/zsh --no-rcs, forward"$@", preserve the exit code, and clean up, and restricts--targetto inert filename characters (rejecting.and..)- Untracked the stale generated self-extracting wrapper and ignored
Resources/*_self-extracting-*.sh AGENTS.mdand.githubagent instructions now codify root path trust guardrails, theself-serviceallowlist gate, exit codes, and expanded release version markers- Removed the superseded standalone
Resources/Adobe Acrobat Add-in Removal for Microsoft 365 (1.0.2).zsh; use theremove_acrobat_addinoperation instead scripts/mofa-consult.zshremoved/usr/local/binfromPATHand syncedremove_officeandreset_teamsreport notes with2.0.0behavior- Corrected
.githubrelease-preparation and maintainer-parity instructions to matchAGENTS.mdexit-code expectations and currentscripts/mofa-consult.zshbehavior;VERSION.txtis documented as a local, gitignored marker - Refreshed pinned GitHub Actions SHAs in
.github/workflows/security-scan.yml:actions/checkoutv7.0.1,github/codeql-action/upload-sarifv4.38.2, andgitleaks/gitleaks-actionv3.0.0(Node 24 runtime; Node 20 is removed from GitHub-hosted runners)