MASTG-KNOW-0090: Vinculação de Dispositivo

O objetivo do vínculo de dispositivo (device binding) é impedir que um atacante copie um aplicativo e seu estado do dispositivo A para o dispositivo B e continue a execução do app no dispositivo B. Após o dispositivo A ser considerado confiável, ele pode ter mais privilégios que o dispositivo B. Essa situação não deve mudar quando um aplicativo é copiado do dispositivo A para o dispositivo B.

A partir do iOS 7.0, identificadores de hardware (como endereços MAC) estão restritos, mas existem outros métodos para implementar o vínculo de dispositivo no iOS:

  • identifierForVendor: Você pode usar [[UIDevice currentDevice] identifierForVendor] (em Objective-C), UIDevice.current.identifierForVendor?.uuidString (em Swift3) ou UIDevice.currentDevice().identifierForVendor?.UUIDString (em Swift2). O valor do identifierForVendor pode não ser o mesmo se você reinstalar o app após outros aplicativos do mesmo fabricante serem instalados, e pode mudar quando você atualizar o nome do bundle do aplicativo. Portanto, é melhor combiná-lo com algo no Keychain.
  • Usando o Keychain: Você pode armazenar algo no Keychain para identificar a instância do aplicativo. Para garantir que esses dados não sejam copiados em backups, use kSecAttrAccessibleWhenPasscodeSetThisDeviceOnly (se quiser proteger os dados e impor adequadamente a exigência de código de acesso ou Touch ID), kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly ou kSecAttrAccessibleWhenUnlockedThisDeviceOnly.
  • Usando Google Instance ID: consulte a implementação para iOS aqui.

Qualquer esquema baseado nesses métodos será mais seguro no momento em que um código de acesso e/ou Touch ID estiver habilitado, os materiais armazenados no Keychain ou sistema de arquivos estiverem protegidos com classes de proteção (como kSecAttrAccessibleAfterFirstUnlockThisDeviceOnly e kSecAttrAccessibleWhenUnlockedThisDeviceOnly), e o SecAccessControlCreateFlags estiver configurado com kSecAccessControlDevicePasscode (para códigos de acesso), kSecAccessControlUserPresence (código de acesso, Face ID ou Touch ID), kSecAccessControlBiometryAny (Face ID ou Touch ID) ou kSecAccessControlBiometryCurrentSet (Face ID/Touch ID: apenas para biometricas atualmente cadastradas).