Skip to content

Security: ulan-yisaev/AppInputSourceSwitcher

Security

SECURITY.md

Security policy

AppInputSourceSwitcher is designed for one narrow task without broad macOS permissions. Security claims apply to source built from this repository and can be checked with the included scripts.

Permission and capability boundary

The app requests no TCC permission. In particular, it does not request:

  • Accessibility;
  • Input Monitoring;
  • Screen Recording;
  • Automation;
  • Full Disk Access.

The release app is always assembled with App Sandbox enabled and no additional sandbox capabilities. There is no unsandboxed build target in this repository.

The static audit rejects source references to networking, telemetry, updater, Accessibility, event-tap, clipboard, Keychain, Apple Events, subprocess, LaunchAgent, dynamic-code, browser-inspection, and screen-capture APIs.

Two narrow APIs are permitted:

  • SMAppService.mainApp for opt-in Launch at Login;
  • IsSecureEventInputEnabled() as a read-only boolean used to suppress the single delayed retry while secure input is active.

Data handling

The app reads:

  • the frontmost application's bundle identifier;
  • enabled keyboard input-source metadata.

It stores one JSON configuration file inside its sandbox container. The file contains only input-source identifiers, bundle identifiers, rules, and timing settings.

Unified log records contain bundle identifiers, input-source identifiers, outcomes, and durations. The app has no API access to keystrokes, clipboard contents, window titles, URLs, message bodies, or document contents.

Network and dependencies

The app has no network entitlement or networking code, no telemetry, no updater, and no external Swift package dependencies. Its executable should link only Apple system frameworks and the Swift runtime.

Run:

make audit
make test
make app
make verify

make verify fails if the app is not sandboxed, has unexpected entitlements, links a non-system library, or embeds common network, telemetry, or updater markers.

Limitations

  • Static pattern checks are defense in depth, not a formal proof.
  • Local builds are ad-hoc signed. They are not notarized and provide no publisher identity.
  • Bundle identifiers in logs are metadata about application activation. Do not attach raw logs to a public issue without reviewing them.
  • Launch at Login is controlled by macOS. The app does not bypass a requiresApproval state.

Reporting a vulnerability

Do not include private configuration files, raw unified logs, usernames, hostnames, or absolute home-directory paths in a public issue. Use GitHub's private security-advisory flow when available.

There aren't any published security advisories