·
25 commits
to main
since this release
Immutable
release. Only release title and notes can be modified.
Highlights
- Security: signing-key ACL was permissive (GHSA-w254-hxm5-3hgh). The System Keychain ECDSA private key used to sign the on-disk policy database shipped without an opfilter-only ACL — any local-root process could use it to sign forged policy. Root cause:
kSecAttrAccessonSecItemAdd(kSecValueRef:)is silently ignored forkSecClassKeyitems in the legacy System Keychain. Fixed by creating and persisting the key in a singleSecKeyCreateRandomKeycall withkSecAttrIsPermanent,kSecAttrAccess, andkSecUseKeychaintogether. Existing installs auto-migrate via a capture-rotate-resign flow insideDatabase.init; no policy data is lost. - Security: replay protection via epoch ratchet (GHSA-9hx3-5wp9-2qqg). Each signed table now carries a monotonically increasing epoch in its signed payload, mirrored in a System Keychain generic-password entry with an opfilter-only ACL. An older legitimately-signed snapshot substituted during the opfilter-update window or via offline tampering is now detected as
.suspecton next load.
Features
- App Tamper Protection toggle in the App Protections panel. Touch ID-gated kill switch for the built-in bundle-write protection, persisted in the signed
feature_flagstable. - Advanced mode toggle at the top of the sidebar. When off (the default), only Events, App Protections, and Setup are visible. Flipping it on reveals Tamper Events, Processes, Process Tree, Metrics, Policy, Jail, Allowlist, Bundle Updaters, MCP Agents, and the Export panels. Persisted in the signed feature-flag store.
- Event list now shows process UID next to PID; timestamps include a short date for events not recorded today (useful after
Load History). com.apple.installdallowed as a built-in bundle-write trustee (uid 0 only). Hard-coded bundle allows are now defined declaratively inBuiltInBundleAllows.swift.- Drifted preset signatures backported for Mail, Contacts, Messages, Discord, and Chrome based on observed real-world configurations.
- MCP menu-bar indicator: pulsing red dot on the shield while the MCP server is running. Enabling MCP now requires Touch ID.
- MCP reliability: server stays alive on broken socket and completes the handshake correctly.
Bug fixes
- Signature-issue dialog reachability:
NSData.selfwas missing from the NSXPC allowed-classes list forsignatureIssueDetected, so NSSecureCoding silently rejected the inner data fields and the entire IPC call was dropped. The suspect-signature dialog had never actually fired in production. Now correctly registered, so the dialog surfaces on every relevant connection event. - Signature-issue dialog timing: previously pushed only once inside
addGUIClientduringregisterClient, which raced with NSXPC connection setup on reconnect. Replaced with an explicitfetchPendingSignatureIssuepull immediately after every successfulregisterClient— the dialog now appears reliably on first launch, on every reconnect, and after every opfilter restart. - ACL migration data preservation: the new capture-rotate-resign flow inside
Database.initkeeps user rules, allowlist, ancestor allowlist, jail rules, bundle updater signatures, and feature flags across the upgrade.
Upgrade notes
- On first launch of this build, opfilter runs a one-time signing-key re-key migration. Policy data is preserved automatically.
- If you previously installed v5.0.10 beta 5780b84 or b4b91e5 and saw your policy configuration disappear, the affected tables were silently discarded by those earlier builds — jail rules, ancestor allowlist, bundle updater signatures, and feature flags will need to be re-added manually. User rules and the global allowlist may also have been lost depending on whether a save was triggered after the broken upgrade.
Dependency updates
github/codeql-actionupdates from Dependabot.