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) ouUIDevice.currentDevice().identifierForVendor?.UUIDString(em Swift2). O valor doidentifierForVendorpode 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),kSecAttrAccessibleAfterFirstUnlockThisDeviceOnlyoukSecAttrAccessibleWhenUnlockedThisDeviceOnly. - 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).