Security & privacy

IBM Data Shift protects data during a device migration with an encrypted, authenticated, direct connection between the two Macs and with strict validation of everything the destination Mac receives. This page is for administrators and security teams running reviews or compliance assessments.

Changes are tagged with the version that introduced them (e.g. From v2.0.0 ).

Security layers

┌─────────────────────────────────────────────────────────┐
│  Application Layer                                      │
│  Pairing (accept/decline, PAKE), message validation,    │
│  path and attribute validation on the destination       │
├─────────────────────────────────────────────────────────┤
│  TLS Encryption Layer                                   │
│  next: TLS 1.3, ephemeral certificate, forward secrecy  │
│  v1.4.1: TLS 1.2+, TLS_PSK_WITH_AES_256_GCM_SHA384      │
├─────────────────────────────────────────────────────────┤
│  TCP Transport Layer                                    │
│  Keepalive, No Delay, connection monitoring             │
├─────────────────────────────────────────────────────────┤
│  Network Discovery Layer                                │
│  Bonjour/mDNS with peer-to-peer                         │
└─────────────────────────────────────────────────────────┘

Transport security and pairing From v2.0.0

Network.framework dropped external pre-shared-key support in TLS 1.3, so the pairing code can no longer gate the TLS handshake. The new version therefore splits the job in two:

  1. Confidential transport (TLS 1.3 only). The destination Mac serves an ephemeral, self-signed certificate that exists only in memory and is never written to the keychain. It is used purely to obtain an encrypted, forward-secret channel. The source Mac accepts any certificate at this layer, because peers are authenticated in the next step.
  2. Peer authentication (application layer). Immediately after the handshake, both Macs run a CPace-style password-authenticated key exchange (PAKE) that uses the 6-digit pairing code and is bound to the TLS session’s exporter secret.

How the pairing handshake works

  1. The source sends a pairingRequest containing its hostname. Neither side has touched the passcode yet.
  2. The destination user explicitly accepts or declines the request (pairingDecision). The verification code is only usable after acceptance, so a device that merely discovers the service on the network doesn’t get to try codes.
  3. Both sides derive a P-256 base point from the passcode, the TLS exporter secret and a build-unique context string (hash-to-curve by try-and-increment). The base point is never sent on the network.
  4. They exchange ephemeral shares (authHello, authResponse) and derive a session key with HKDF-SHA256.
  5. Both sides exchange confirmation MACs (HMAC-SHA256 over a transcript of both shares, with a different label per role) and verify them (authConfirm, authResult). A wrong code or a channel-binding mismatch fails verification.

Properties:

Until v1.4.1: TLS-PSK transport

Versions up to v1.4.1 enforce TLS 1.2 or higher with the single cipher suite TLS_PSK_WITH_AES_256_GCM_SHA384:

Limitations of that design, which v2.0.0 removes:

Network discovery and isolation

Custom protocol framing

An application protocol runs on top of TLS. Every message starts with a fixed-size header made of three UInt32 fields: message type, payload length and info length.

Destination-side validation From v2.0.0

Everything coming from the source is treated as untrusted by the destination Mac:

Connection management

TCP configuration

Monitoring and recovery

Threat model

Threat Mitigation
Eavesdropping TLS encryption (TLS 1.3 in the next release; TLS 1.2 PSK with AES-256-GCM until v1.4.1)
Man-in-the-middle / relay Next: PAKE bound to the TLS exporter secret. Until v1.4.1: PSK authentication
Passcode guessing Next: no offline attack on a captured handshake, lockout after 5 wrong codes. Until v1.4.1: PSK derived from the code
Unauthorized pairing Next: explicit accept/decline on the destination. Until v1.4.1: passcode only
Replay attacks Fresh ephemeral values on every handshake, TLS session keys
Data tampering Authenticated encryption (AEAD)
Network scanning The service can be discovered, but pairing needs the passcode
Malicious source (path traversal, symlink escape) Next: destination validates every path and symlink and ignores peer ownership and flags
Command injection through settings Next: no shell is used to launch Self Service, storePath is validated
Stalled connections TCP keepalive, retries, and next: connection-health watchdog
Malformed messages Fixed-size header parsing and message type validation

Known limitations

Privacy

Required permissions

Grant these through a PPPC profile:

NB: Local Network access, used for device discovery, must still be granted by the user, as it cannot be forced through MDM. IBM Data Shift can detect if this permission is missing and notify the user.

Security audit log

Security-relevant events go through the app’s logging system and can be read in Console.app. From v2.0.0 Logs are now categorized (Migration, Network, Pairing, Discovery, Report, Device) so they are easier to filter. Use the loggingLevel setting (noLog, standard, debug) to control the verbosity.

Events logged include connection establishment and termination, TLS negotiation details, pairing attempts and failures, protocol errors, file transfer operations and retry events.

Best practices

For users

  1. Perform migrations on trusted, private networks.
  2. Keep the devices physically close.
  3. Confirm the hostname of the requesting device before accepting a pairing request From v2.0.0 .
  4. Don’t share the passcode shown on the new device.
  5. Watch for unexpected connection failures or errors.

For administrators

  1. Allow Bonjour/mDNS traffic on the local networks used for migrations.
  2. Deploy PPPC and custom-settings profiles through MDM.
  3. Enable detailed logging only when you need it for audits or troubleshooting.
  4. Keep IBM Data Shift updated to receive security fixes.
  5. Consider network segmentation for sensitive migrations.

Standards

Reporting a security issue

If you find a vulnerability:

  1. Do not disclose it publicly.
  2. Contact the project maintainers, see MAINTAINERS.md.
  3. Provide as much detail as possible.
  4. Allow reasonable time for a fix.

More resources: SECURITY.md in the repository.