Firebase Security & App Attest

Proteggere le API iOS e Cloud Firestore con Firebase App Check e DeviceCheck / App Attest

Anche con Security Rules ben strutturate ed autenticazione utente attiva, un attaccante potrebbe estrarre le tue chiavi API dall'IPA compilato e lanciare richieste da script automatizzati o emulatori modifcati. Firebase App Check risolve questo problema assicurandosi che soltanto le richieste provenienti dalla tua vera app iOS (autenticata dall'hardware del dispositivo via Apple App Attest o DeviceCheck) possano accedere alle tue risorse Firebase.

1. Come Funziona Firebase App Check su iOS

App Check richiede un token d'attestazione temporaneo generato dal firmware iOS tramite il framework DeviceCheck o AppAttest. Il token viene verificato dai server di Firebase prima di concedere l'accesso a Cloud Firestore, Cloud Storage o Cloud Functions.

2. Configurazione del Provider Factory in Swift

Per attivare App Check nella tua applicazione SwiftUI, occorre configurare una classe personalizzata che estende AppCheckProviderFactory prima dell'inizializzazione di FirebaseApp.configure():

import SwiftUI
import FirebaseCore
import FirebaseAppCheck

class CustomAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
    func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
        if #available(iOS 14.0, *) {
            // Utilizzo di App Attest su iOS 14+
            return AppAttestProvider(app: app)
        } else {
            // Fallback su DeviceCheck per versioni precedenti
            return DeviceCheckProvider(app: app)
        }
    }
}

@main
struct AppCheckDemoApp: App {
    init() {
        // Configurazione App Check PRIMA di FirebaseApp.configure()
        let providerFactory = CustomAppCheckProviderFactory()
        AppCheck.setAppCheckProviderFactory(providerFactory)
        
        FirebaseApp.configure()
    }

    var body: some Scene {
        WindowGroup {
            ContentView()
        }
    }
}

3. Supporto per lo Sviluppo in Xcode Simulator

Durante il testing sul simulatore di Xcode, l'attestazione hardware non è disponibile. È necessario utilizzare il provider di debug AppCheckDebugProviderFactory ed impostare la variabile di ambiente -FIRAAppCheckDebugEnabled YES negli schema di Xcode:

#if DEBUG
class DebugAppCheckProviderFactory: NSObject, AppCheckProviderFactory {
    func createProvider(with app: FirebaseApp) -> AppCheckProvider? {
        return AppCheckDebugProvider(app: app)
    }
}
#endif

// Nel blocco init() prima del deploy di produzione:
#if DEBUG
AppCheck.setAppCheckProviderFactory(DebugAppCheckProviderFactory())
#else
AppCheck.setAppCheckProviderFactory(CustomAppCheckProviderFactory())
#endif

4. Attivazione di Enforcement nella Console Firebase

Una volta integrato l'SDK lato client, accedi alla console Firebase nella sezione App Check. Monitora la percentuale di richieste verificate per qualche giorno, poi attiva il pulsante **Enforce** su Firestore, Storage e Functions. Da quel momento tutte le chiamate privi di token di attestazione valido verranno rifiutate con errore 403 HTTP / Permission Denied.

Conclusione

L'integrazione di Firebase App Check con App Attest protegge il tuo budget ed il tuo database da attacchi bot e scraper automatici. Per audit di sicurezza sulle tue app iOS, scrivi a diallooyunus@gmail.com.

Yunus Diallo (DialloDev)

Fondatore di Dywtal Digital a Parma (Italia), sviluppatore iOS senior specializzato nella sicurezza mobile e nelle integrazioni Cloud Native.