AI-coded apps

    Low-Code Apps & Firebase Auth: Wann "Service Roles" öffentlich sind

    Zwei Arten von Firebase-Zugangsdaten: die öffentliche Web-Konfiguration im Client und der geheime Dienstkonto-Schlüssel des Admin SDK auf dem Server.

    Bei Firebase gibt es keine Service Roles wie bei Supabase, aber es gibt ein Gegenstück: den Dienstkonto-Schlüssel des Admin SDK. Der wird gefährlich öffentlich, wenn eine Low-Code- oder KI-generierte App ihn in den Client oder in ein öffentliches Repository legt. Die normale Firebase-Web-Konfiguration mit dem API-Schlüssel ist dagegen absichtlich öffentlich und harmlos, weil sie nur das Projekt benennt und keinen Zugriff gewährt. Kurz gesagt: Der öffentliche Web-Schlüssel ist sicher, der private Dienstkonto-Schlüssel niemals. Wer beides verwechselt, riskiert vollen Admin-Zugriff auf das Backend.

    Kurze Antwort

    Firebase-Zugangsdaten sind in zwei Klassen aufgeteilt. Die Web-Konfiguration mit dem API-Schlüssel ist laut Firebase kein Geheimnis und darf im Client-Code stehen, weil sie nur das Projekt identifiziert. Der Dienstkonto-Schlüssel des Admin SDK dagegen gewährt vollen, privilegierten Zugriff und gehört ausschließlich auf den Server. Öffentlich im schädlichen Sinne wird nur dieser Dienstkonto-Schlüssel, und zwar durch einen Fehler wie das Einbetten in die App oder das Committen in ein Repository. Ist das passiert, muss er sofort rotiert werden.

    Was "Service Roles" bei Firebase bedeuten

    Der Begriff Service Role stammt eigentlich von Supabase, wo der service_role-Schlüssel die Zeilensicherheit umgeht und vollen Zugriff hat. Viele Low-Code-Entwickler übertragen den Begriff auf Firebase, meinen damit aber das Firebase-Pendant: die Anmeldedaten des Admin SDK, also einen Dienstkonto-Schlüssel. Dieser Schlüssel ist eine JSON-Datei mit einem privaten Schlüssel und dient dazu, dass ein Server im Namen des Projekts uneingeschränkt handeln kann.

    Wichtig ist die saubere Trennung von der Web-Konfiguration. Wenn eine Firebase-App im Browser oder auf dem Handy startet, lädt sie eine Konfiguration mit API-Schlüssel, Projekt-ID und ähnlichen Werten. Diese Werte sind Kennungen, keine Passwörter, und Firebase schützt die Daten nicht dadurch, dass diese Werte geheim wären, sondern über Firebase Authentication und Security Rules. Das privilegierte Gegenstück, der Dienstkonto-Schlüssel, arbeitet auf einer ganz anderen Ebene und übergeht diese Schutzmechanismen vollständig.

    Wann Firebase-Zugangsdaten öffentlich sind

    Die Web-Konfiguration ist praktisch immer öffentlich, weil sie mit dem Client ausgeliefert wird, und das ist so vorgesehen und unbedenklich. Sie im Netzwerkverkehr oder im App-Paket zu sehen, ist kein Sicherheitsvorfall. Der Dienstkonto-Schlüssel dagegen soll nie öffentlich sein und wird es nur durch einen Fehler: wenn er versehentlich in ein öffentliches GitHub-Repository gelangt, in das App-Bundle eingebettet oder über einen falsch konfigurierten Endpunkt zugänglich wird.

    Genau das passiert in Low-Code- und Vibe-Code-Projekten überdurchschnittlich oft. Der Grund ist, dass generierte oder zusammengeklickte Backends die Grenze zwischen Client und Server verwischen. Ein KI-Assistent fügt zum Beispiel Servercode mit dem Dienstkonto-Schlüssel in dasselbe Projekt ein, das später als Client veröffentlicht wird, oder eine Anleitung legt die Schlüsseldatei ins Repository. Die Web-Konfiguration darf dort liegen, der Dienstkonto-Schlüssel nicht, und die Verwechslung dieser beiden ist die eigentliche Vibe-Code-Gefahr.

    Was ein Angreifer damit tun kann

    Ein geleakter Dienstkonto-Schlüssel ist ein vollständiger Kompromiss des Backends, nicht ein kleines Leck. Mit ihm kann ein Angreifer als Administrator des Projekts auftreten: alle Daten in der Datenbank lesen, ändern und löschen, beliebige Nutzer anlegen, sperren oder deren Sitzungen fälschen und generell jede Operation ausführen, die sonst nur vertrauenswürdigem Servercode vorbehalten ist. Es gibt dabei keine Einschränkung auf einen einzelnen Nutzer oder einen Teilbereich.

    Der entscheidende Punkt ist, dass dieser Zugriff die üblichen Schutzmechanismen ignoriert. Der Admin-Zugriff prüft keine Security Rules und keinen angemeldeten Nutzer, weil er per Definition über diesen Kontrollen steht. Deshalb ist ein exponierter Dienstkonto-Schlüssel weit schwerwiegender als ein exponierter öffentlicher Web-Schlüssel: Letzterer gibt nur den Weg frei, den die Regeln ohnehin absichern, Ersterer hebelt die Absicherung komplett aus. Ein solcher Fund gehört in die höchste Dringlichkeitsstufe.

    Ändern die Security Rules das Risiko?

    Security Rules sind das zentrale Schutzsystem für den Client-Pfad, also für alles, was über die öffentliche Web-Konfiguration läuft. Gut geschriebene Regeln, die standardmäßig verweigern und Zugriff nur dem passenden angemeldeten Nutzer gewähren, sorgen dafür, dass der öffentliche API-Schlüssel harmlos bleibt. Für diesen Pfad senken die Regeln das Risiko also erheblich und sind der Grund, warum die Web-Konfiguration überhaupt öffentlich sein darf.

    Gegen einen geleakten Dienstkonto-Schlüssel helfen sie jedoch nicht. Da der Admin-Zugriff die Regeln absichtlich umgeht, bleibt die Datenbank auch bei perfekten Security Rules vollständig offen, sobald der private Schlüssel in falsche Hände gerät. Die Regeln und der Dienstkonto-Schlüssel liegen auf verschiedenen Ebenen: Die Regeln schützen den öffentlichen Weg, der Dienstkonto-Schlüssel geht daran vorbei. Man darf sich deshalb nie darauf verlassen, dass gute Regeln einen ausgelaufenen Admin-Schlüssel auffangen, denn das tun sie nicht.

    Sofortmaßnahmen: rotieren und absichern

    Wenn ein Dienstkonto-Schlüssel exponiert wurde, ist die erste und dringendste Maßnahme, ihn zu rotieren. Widerrufen Sie den geleakten Schlüssel in der Google-Cloud- beziehungsweise Firebase-Konsole und erzeugen Sie einen neuen, sodass der alte sofort ungültig wird. Prüfen Sie anschließend die Protokolle auf ungewöhnliche Zugriffe, denn zwischen Leak und Rotation kann Missbrauch stattgefunden haben, und behandeln Sie die Daten entsprechend.

    Danach folgt die Architekturkorrektur, damit es nicht erneut passiert. Der Dienstkonto-Schlüssel gehört ausschließlich auf einen Server oder in eine sichere Umgebung, niemals in das App-Bundle oder in ein Repository. Entfernen Sie ihn aus der Versionskontrolle vollständig, nicht nur aus dem letzten Commit, und nutzen Sie eine Geheimnisverwaltung oder Umgebungsvariablen auf dem Server. Der Client soll nur die öffentliche Web-Konfiguration zusammen mit Firebase Authentication und Security Rules verwenden. So bleibt der privilegierte Zugriff dort, wo er hingehört.

    Öffentlich gegen geheim

    Die beiden Klassen von Zugangsdaten nebeneinander zu sehen, macht die Regel eindeutig. Die Tabelle fasst zusammen.

    MerkmalWeb-Konfiguration (API-Schlüssel)Dienstkonto-Schlüssel (Admin SDK)
    ZweckProjekt identifizierenVoller Admin-Zugriff
    Öffentlich sichtbarVorgesehen und sicherNiemals, nur durch Fehler
    OrtClient-AppNur Server
    Security RulesSchützen diesen PfadWerden umgangen
    Leak-SchwereKein VorfallKritischer Vorfall

    Lesen Sie die letzte Zeile als Kern: Nur der Dienstkonto-Schlüssel macht aus einem Fund einen echten Notfall.

    Prüfliste

    Vor der Veröffentlichung einer Low-Code-App lohnt sich dieser kurze Durchgang. Die Liste deckt das Wichtigste ab.

    PrüfungMaßnahmeErledigt?
    Kein Dienstkonto im ClientApp-Bundle auf JSON-Schlüssel prüfen[ ]
    Repository sauberKeine Schlüsseldatei in der Versionskontrolle[ ]
    Web-Konfiguration verstandenAPI-Schlüssel als öffentlich akzeptieren[ ]
    Security Rules aktivStandardmäßig verweigern, pro Nutzer freigeben[ ]
    Geleakten Schlüssel rotiertAlten widerrufen, neuen serverseitig ablegen[ ]
    Serverseitige AblageGeheimnisverwaltung statt Client nutzen[ ]

    Am häufigsten übersehen wird die erste Prüfung: Ein im App-Bundle vergessener Dienstkonto-Schlüssel ist der Fehler, der ein sicheres System öffnet.

    Wo die Sicherheitsanalyse hilft

    Die Trennung von öffentlichem und geheimem Schlüssel zu verstehen, ist Wissen; zu bestätigen, dass die App diese Trennung einhält, ist eine Prüfung, und dabei hilft eine Analyse.

    Ein Scanner wie PTKD.com analysiert das Paket Ihrer Android- oder iOS-App und meldet, wenn ein Geheimnis, das auf den Server gehört, etwa ein Dienstkonto-Schlüssel oder ein anderer privilegierter Zugangsdaten-Satz, im Client eingebettet wurde, zugeordnet zu OWASP MASVS. Zur Klarheit über die Grenze: Einen öffentlichen Firebase-Web-Schlüssel in der App zu finden, ist kein Problem und wird nicht als solches behandelt. Der Scanner sucht das Gegenteil, nämlich das echte Geheimnis, das auf die öffentliche Seite gelangt ist, und deshalb ist eine Analyse vor der Veröffentlichung der richtige Moment, um zu bestätigen, dass nur der öffentliche Schlüssel mitgereist ist.

    Das Wichtigste

    • Firebase hat keine Service Roles wie Supabase, aber das Gegenstück ist der Dienstkonto-Schlüssel des Admin SDK, der vollen privilegierten Zugriff gewährt.
    • Die Web-Konfiguration mit API-Schlüssel ist absichtlich öffentlich und sicher, weil sie nur das Projekt identifiziert; der Dienstkonto-Schlüssel darf niemals öffentlich sein.
    • In Low-Code- und Vibe-Code-Apps wird der Dienstkonto-Schlüssel durch Fehler exponiert, etwa durch Einbetten in die App oder Committen in ein Repository.
    • Security Rules schützen den Client-Pfad und machen den öffentlichen Schlüssel harmlos, aber ein Dienstkonto-Schlüssel umgeht sie vollständig, weshalb ein Leak sofortige Rotation erfordert.
    • Prüfen Sie vor der Veröffentlichung, dass kein privilegierter Schlüssel im Client liegt, und nutzen Sie ein Werkzeug wie PTKD.com, um genau das zu bestätigen.
    • #firebase
    • #service account
    • #low-code
    • #vibe code
    • #app-sicherheit

    Frequently asked questions

    Hat Firebase eine Service Role wie Supabase?
    Nein, Firebase kennt den Begriff Service Role nicht, aber es gibt ein direktes Gegenstück: den Dienstkonto-Schlüssel des Admin SDK. Bei Supabase umgeht der service_role-Schlüssel die Zeilensicherheit und hat vollen Zugriff; bei Firebase erfüllt der Dienstkonto-Schlüssel dieselbe Rolle, indem er einem Server erlaubt, uneingeschränkt im Namen des Projekts zu handeln. Viele Low-Code-Entwickler übertragen den Supabase-Begriff auf Firebase und meinen genau diesen Schlüssel. Wichtig ist die Trennung von der Web-Konfiguration: Diese ist öffentlich und harmlos, während der Dienstkonto-Schlüssel privilegiert ist und ausschließlich auf den Server gehört, niemals in den Client.
    Ist der Firebase-API-Schlüssel im Client ein Sicherheitsproblem?
    Nein. Der API-Schlüssel in der Firebase-Web-Konfiguration ist kein Geheimnis und darf laut Firebase im Client-Code stehen. Anders als übliche API-Schlüssel steuert er keinen Zugriff auf Backend-Ressourcen, sondern identifiziert lediglich das Firebase-Projekt, mit dem sich die App verbindet. Ihn im App-Paket oder im Netzwerkverkehr zu sehen, ist daher kein Vorfall, und ihn zu verstecken erhöht die Sicherheit nicht. Geschützt werden die Daten über Firebase Authentication und Security Rules, nicht über die Geheimhaltung dieses Schlüssels. Das eigentliche Geheimnis ist der Dienstkonto-Schlüssel des Admin SDK, der niemals in den Client gehört.
    Was kann ein Angreifer mit einem geleakten Dienstkonto-Schlüssel tun?
    Ein geleakter Dienstkonto-Schlüssel bedeutet einen vollständigen Kompromiss des Backends. Ein Angreifer kann als Administrator des Projekts auftreten und alle Daten in der Datenbank lesen, ändern und löschen, beliebige Nutzer anlegen, sperren oder deren Sitzungen fälschen und jede Operation ausführen, die sonst nur vertrauenswürdigem Servercode vorbehalten ist. Es gibt keine Beschränkung auf einen einzelnen Nutzer oder Teilbereich. Entscheidend ist, dass dieser Zugriff die Security Rules und die Nutzeranmeldung vollständig ignoriert, weil er über diesen Kontrollen steht. Deshalb ist ein exponierter Dienstkonto-Schlüssel weit schwerwiegender als ein exponierter öffentlicher Web-Schlüssel und gehört in die höchste Dringlichkeitsstufe.
    Schützen Security Rules gegen einen geleakten Dienstkonto-Schlüssel?
    Nein. Security Rules schützen den Client-Pfad, also alles, was über die öffentliche Web-Konfiguration läuft. Gut geschriebene Regeln, die standardmäßig verweigern und Zugriff nur dem passenden angemeldeten Nutzer gewähren, machen den öffentlichen API-Schlüssel harmlos. Gegen einen geleakten Dienstkonto-Schlüssel helfen sie aber nicht, weil der Admin-Zugriff die Regeln absichtlich umgeht. Selbst bei perfekten Regeln bleibt die Datenbank vollständig offen, sobald der private Schlüssel in falsche Hände gerät. Regeln und Dienstkonto-Schlüssel liegen auf verschiedenen Ebenen: Die Regeln sichern den öffentlichen Weg, der Dienstkonto-Schlüssel geht daran vorbei. Man darf sich nie darauf verlassen, dass Regeln einen ausgelaufenen Admin-Schlüssel auffangen.
    Wie rotiere ich einen exponierten Firebase-Dienstkonto-Schlüssel?
    Die erste und dringendste Maßnahme ist die Rotation. Widerrufen Sie den geleakten Schlüssel in der Google-Cloud- beziehungsweise Firebase-Konsole und erzeugen Sie einen neuen, sodass der alte sofort ungültig wird. Prüfen Sie danach die Protokolle auf ungewöhnliche Zugriffe, denn zwischen Leak und Rotation kann Missbrauch stattgefunden haben. Entfernen Sie den Schlüssel anschließend vollständig aus der Versionskontrolle, nicht nur aus dem letzten Commit, und legen Sie den neuen ausschließlich serverseitig über eine Geheimnisverwaltung oder Umgebungsvariablen ab. Der Client soll künftig nur die öffentliche Web-Konfiguration zusammen mit Firebase Authentication und Security Rules verwenden, damit der privilegierte Zugriff auf dem Server bleibt.
    Warum passiert das gerade in Low-Code- und Vibe-Code-Apps?
    Weil generierte oder zusammengeklickte Backends die Grenze zwischen Client und Server verwischen. Ein KI-Assistent fügt zum Beispiel Servercode mit dem Dienstkonto-Schlüssel in dasselbe Projekt ein, das später als Client veröffentlicht wird, oder eine Anleitung legt die Schlüsseldatei ins Repository. Die öffentliche Web-Konfiguration darf dort liegen, der Dienstkonto-Schlüssel nicht, und die Verwechslung dieser beiden ist die eigentliche Gefahr. Da Low-Code-Werkzeuge Geschwindigkeit über Architektur stellen, fällt die Unterscheidung leicht weg. Deshalb sollte man vor der Veröffentlichung gezielt prüfen, dass kein privilegierter Schlüssel im App-Bundle oder im Repository liegt, und dafür einen Scanner einsetzen, der genau solche eingebetteten Geheimnisse meldet.

    Keep reading

    Scan your app in minutes

    Upload an APK, AAB, or IPA. PTKD returns an OWASP-aligned report with copy-paste fixes.

    Try PTKD free