[{"data":1,"prerenderedAt":269},["ShallowReactive",2],{"research-de":3},{"id":4,"title":5,"aside":6,"body":9,"coverAlt":242,"description":243,"extension":244,"faq":245,"lede":261,"meta":262,"navigation":263,"path":264,"published":265,"seo":266,"stem":267,"updated":265,"__hash__":268},"research_de\u002Fresearch\u002Fvibe-coded-app-security-2026.md","Die Sicherheitslage von Vibe-Coding-Apps 2026",[7,8],"Nur der Blick von außen. Wir lesen, was der Browser eines Besuchers ohnehin liest: den Code, den die App ausliefert, die Header, die sie zurückschickt, die Endpunkte, die in ihrem eigenen Code stehen. Keine Logins, kein Passwortraten, nichts heruntergeladen.","Hier wird keine App genannt, in der Datendatei auch nicht. Zu jeder Zahl steht die Methode, die sie ergeben hat, und die Datei unten hält jede Aggregation in einer Tabelle, falls du nachrechnen willst.",{"type":10,"value":11,"toc":224},"minimark",[12,17,21,24,27,31,34,37,40,44,47,50,53,56,60,63,66,70,73,76,79,82,86,89,92,95,98,102,105,108,111,125,129,132,135,138,142,214,218,221],[13,14,16],"h2",{"id":15},"sechs-zahlen-um-die-es-geht","Sechs Zahlen, um die es geht",[18,19,20],"p",{},"Diese sechs Zahlen sind der Bericht. Alles danach ist die Basis, auf der jede\neinzelne steht, und wie wir sie bekommen haben.",[22,23],"research-key-findings",{},[18,25,26],{},"Die Voreinstellungen der Plattform gehen fast überall schief, und die meisten\ndieser Fehler sind moderat. Was nur die Person ändern kann, die die App gebaut\nhat, geht viel seltener schief, und genau das legt die Daten anderer Leute ins\noffene Internet.",[13,28,30],{"id":29},"wie-diese-apps-abschneiden-a-bis-f","Wie diese Apps abschneiden, A bis F",[18,32,33],{},"Reeve benotet eine App wie ein Zeugnis. Abzüge nach Schwere gehen von hundert\nPunkten ab. Dann setzt der schwerste einzelne Befund eine Obergrenze: Mit einem\nkritischen Befund kommt die App über D nicht hinaus, mit einem hohen Befund\nnicht über C.",[35,36],"research-grades",{},[18,38,39],{},"Die meisten Apps landen bei A oder B. Das Feld aus D und F ist klein. Das sind\ndie Apps, in denen ein Fremder schon jetzt die Zeilen anderer Leute lesen kann.",[13,41,43],{"id":42},"was-wir-geprüft-haben-und-wie-viele-apps-daran-gescheitert-sind","Was wir geprüft haben und wie viele Apps daran gescheitert sind",[18,45,46],{},"Jede Prüfung stellt eine Frage über die App von außen, und jede zählt über die\nApps, bei denen sie eine Antwort bekam. Eine App, die eine Prüfung nicht\nerreichen konnte, fällt aus der Basis dieser Prüfung heraus, statt als sauber zu\ngelten. Der Scan sagt für diese Apps, dass er es nicht prüfen konnte, und diese\nSeite macht es genauso.",[48,49],"research-checks-table",{},[18,51,52],{},"Zwei Zeilen klingen schlimmer, als sie sind. Sicherheits-Header sind\nAnweisungen, die die Hosting-Plattform an den Browser schickt, und fehlt einer,\nhat eine Angriffsart ein Hindernis weniger vor sich. Eine veröffentlichte Source\nMap ist der Originalcode der App neben der kompilierten Fassung: Sie zeigt einem\nAngreifer, wo er suchen müsste, und gibt von sich aus nichts preis.",[18,54,55],{},"Eine Zeile kann auch schwer wirken, weil eine Handvoll Apps darin etwas Ernstes\nausgeliefert hat und der Rest etwas Gewöhnliches. Die Datendatei schlüsselt jede\nZeile nach Schlüsseltyp auf, damit man sieht, was was ist.",[13,57,59],{"id":58},"mehr-als-die-hälfte-der-prüfbaren-supabase-apps-gibt-tabellendaten-preis","Mehr als die Hälfte der prüfbaren Supabase-Apps gibt Tabellendaten preis",[18,61,62],{},"Auf diese Zahl sind wir immer wieder zurückgekommen.",[18,64,65],{},"Ein Supabase-Projekt ist von Haus aus zum Internet hin offen. Die App im Browser\nspricht direkt mit der Datenbank, mit einem Schlüssel, der öffentlich sein soll,\nund was zwischen einem Fremden und den Zeilen steht, ist Row Level Security:\neine Regel auf jeder Tabelle. Schalte diese Regel ab oder schreibe eine Policy,\ndie alle hereinlässt, und jede Tabelle des Projekts ist mit einer Anfrage und\nohne Passwort lesbar.",[67,68],"research-stat",{"id":69},"supabase",[18,71,72],{},"Weniger als die Hälfte der Apps, die ein Supabase-Projekt nennen, lassen sich\nüberhaupt prüfen. Manche leiten ihren Datenbankverkehr über ein eigenes Backend,\nwohin eine Prüfung von außen nicht folgen kann, und über die sagen wir deshalb\ngar nichts. Der Anteil oben gilt für die Apps, die geantwortet haben.",[67,74],{"id":75},"rlsSplit",[18,77,78],{},"Die Aufteilung ist der nützliche Teil. Eine lesbare Tabelle namens settings oder\ncontent ist ein Fehler. Eine lesbare Tabelle namens users, profiles oder orders\nsind die personenbezogenen Daten anderer Leute im offenen Internet, und wer die\nApp gebaut hat, hält sie mit ziemlicher Sicherheit für privat.",[18,80,81],{},"Die Prüfung liest nie eine Zeile. Sie fragt die Datenbank, wie viele Zeilen\nsichtbar wären, und liest die Anzahl aus einem Antwort-Header zurück. Das\nreicht, um eine Tabelle mit RLS-Regel von einer ohne zu unterscheiden, und\nweiter geht die Prüfung nicht.",[13,83,85],{"id":84},"dieselben-neun-prüfungen-nach-builder-aufgeteilt","Dieselben neun Prüfungen, nach Builder aufgeteilt",[18,87,88],{},"Jede App ist nach dem Builder gruppiert, mit dem sie veröffentlicht wurde, und\nan den übrigen Apps dieses Builders gemessen.",[90,91],"research-builders-table",{},[18,93,94],{},"Das meiste, was diese Tabelle vergleicht, sind Voreinstellungen. Niemand wählt\nLovable oder Bolt wegen der Security-Header. Die setzt die Plattform für jede\nApp, die sie hostet, also verschiebt eine Änderung dort eine ganze Spalte dieser\nTabelle.",[18,96,97],{},"Zwei Grenzen, bevor jemand eine Zeile zitiert. Wir ordnen Apps über die\nVeröffentlichungsdomain zu, also steht eine App, die auf eine eigene Domain\numgezogen ist, ganz außerhalb dieser Tabelle, und das sind oft die fertigeren.\nUnd ein Builder, der den Datenbankverkehr über sein eigenes Backend leitet,\nlässt sich von außen überhaupt nicht prüfen. Eine Lücke dort heißt, dass wir\nnicht messen konnten, und sagt nichts darüber, wie sicher diese Apps sind.",[13,99,101],{"id":100},"zwei-arten-von-befunden-zwei-arten-von-reparatur","Zwei Arten von Befunden, zwei Arten von Reparatur",[18,103,104],{},"Die Befunde auf dieser Seite fallen in zwei Gruppen, und die beiden müssen von\nunterschiedlichen Leuten repariert werden.",[106,107],"research-controls",{},[18,109,110],{},"Die erste Gruppe ist eine Produktentscheidung in einer Firma. Eine einzige\nÄnderung an einer Hosting-Voreinstellung verschiebt jede App auf dieser\nPlattform auf einmal, und deshalb fallen diese Zeilen so gleichförmig aus und\nlassen sich hier am günstigsten beheben.",[18,112,113,114,119,120,124],{},"Die zweite Gruppe liegt bei der Person, die die App gebaut hat. Keine\nHosting-Plattform kann wissen, welche deiner Tabellen öffentlich sein sollen\noder welcher Schlüssel auf einen Server gehört. Jeder kritische Befund in diesem\nBericht liegt in dieser Gruppe. Die\n",[115,116,118],"a",{"href":117},"\u002Fis","Sicherheitsleitfäden für die einzelnen Builder"," und die\n",[115,121,123],{"href":122},"\u002Fchecklist","Sicherheitscheckliste zum Start"," fangen beide dort an.",[13,126,128],{"id":127},"was-vibe-coding-apps-richtig-machen","Was Vibe-Coding-Apps richtig machen",[18,130,131],{},"Wir haben auch gezählt, was bestanden hat, über dieselben Apps.",[133,134],"research-clean-rates",{},[18,136,137],{},"Bei der letzten Karte liegen allgemeine Scanner meistens daneben. Ein\nveröffentlichbarer Schlüssel im Frontend (ein anon key von Supabase, ein\npublishable key von Stripe) gehört genau dorthin: Er soll gelesen werden, und\nder Schutz steckt in den Regeln dahinter. Ihn zu melden schickt jemanden los, um\neine Einstellung zu ändern, die schon richtig war.",[13,139,141],{"id":140},"wie-wir-gemessen-haben-und-wo-die-grenzen-liegen","Wie wir gemessen haben und wo die Grenzen liegen",[143,144,145,160,175,194],"research-method",{},[146,147,149,154,157],"template",{"v-slot:origin":148},"",[150,151,153],"h3",{"id":152},"woher-die-apps-kamen","Woher die Apps kamen",[18,155,156],{},"Drei Listen, zusammengeführt und von Dubletten befreit: Apps, die Leute auf X\nund Reddit gepostet haben, Apps, die auf Show HN vorgestellt wurden, und Apps,\ndie wir über die Veröffentlichungsdomains der Builder selbst aufgezählt haben.\nDie Veröffentlichungsdomains machen den Großteil der Stichprobe aus und sind die\neinzige Liste, die skaliert. Die anderen beiden finden nur Apps, über die jemand\netwas geschrieben hat.",[18,158,159],{},"Tote Hosts sind zuerst herausgeflogen, und beurteilt haben wir das, indem wir\ndie Seite selbst gelesen haben. Eine gelöschte Veröffentlichung antwortet oft\nimmer noch mit einem bestens gelaunten 200 OK.",[146,161,162,166,169,172],{"v-slot:denominator":148},[150,163,165],{"id":164},"die-regel-für-den-nenner","Die Regel für den Nenner",[18,167,168],{},"Jeder Anteil hier bezieht sich auf die Apps, bei denen diese Prüfung antworten\nkonnte, nie auf die Stichprobe insgesamt. Eine Prüfung, die eine App nicht\nerreichen konnte, lässt diese App aus ihrer eigenen Basis heraus, und sie gilt\nnie als sauber. Die zwei Zahlen neben jedem Balken sind diese Basis, damit jeder\nsieht, welche er gerade liest.",[67,170],{"id":171},"inconclusive",[18,173,174],{},"Die Noten zählen aus demselben Grund über eine kleinere Zahl. Eine App, die zu\nwenig zurückgab, um sie einzuordnen, fällt aus jeder Zahl weiter oben heraus,\nstatt auf Verdacht benotet zu werden.",[146,176,177,181],{"v-slot:scope":148},[150,178,180],{"id":179},"was-wir-getan-haben-und-was-nicht","Was wir getan haben und was nicht",[182,183,184,188,191],"ul",{},[185,186,187],"li",{},"Nur passives Lesen: die Anfragen, die der Browser eines Besuchers ohnehin\nstellt, dazu die öffentlichen Endpunkte, auf die die App selbst zeigt.",[185,189,190],{},"Die Datenbankprüfung nimmt eine Zeilenzahl aus einem Antwort-Header. Wir haben\nnie eine Zeile gelesen, nie eine Datei heruntergeladen, uns nie angemeldet und\nnie ein Passwort geraten.",[185,192,193],{},"Keine App wird genannt, weder hier noch in der Datendatei. Eine Liste von Apps\nmit ihren Schwachstellen daneben ist eine Zielliste, und die halten wir in\nveröffentlichbarer Form nicht vor.",[146,195,196,200],{"v-slot:limits":148},[150,197,199],{"id":198},"grenzen-die-man-kennen-sollte","Grenzen, die man kennen sollte",[182,201,202,205,208,211],{},[185,203,204],{},"Die Stichprobe neigt zu jüngeren Apps. Eine App, die auf eine eigene Domain\numgezogen ist, lässt sich von außen keinem Builder zuordnen, und das sind oft\ndie etablierteren.",[185,206,207],{},"Die Farbe in einer Zeile markiert den schwersten Fall, den wir gesehen haben,\nund das kann eine App unter Hunderten sein. Die Datendatei schlüsselt jede\nZeile nach genauem Schlüsseltyp auf.",[185,209,210],{},"Das ist ein Fenster von drei Tagen im August. Eine App, die in der Woche\ndarauf repariert wurde, zählt hier so, wie sie an dem Tag stand, an dem wir\nhingesehen haben.",[185,212,213],{},"Eine automatisierte externe Prüfung ist kein Audit. Dass nichts gefunden\nwurde, ist keine Garantie.",[13,215,217],{"id":216},"diese-zahlen-weiterverwenden","Diese Zahlen weiterverwenden",[18,219,220],{},"Presse, Forschung und alle, die darüber schreiben, dürfen die Daten mit\nQuellenangabe weiterverwenden. Die Datei unten enthält jede Aggregation dieser\nSeite in einer flachen Tabelle und nennt keine einzige App.",[222,223],"research-cite",{},{"title":148,"searchDepth":225,"depth":225,"links":226},3,[227,229,230,231,232,233,234,235,241],{"id":15,"depth":228,"text":16},2,{"id":29,"depth":228,"text":30},{"id":42,"depth":228,"text":43},{"id":58,"depth":228,"text":59},{"id":84,"depth":228,"text":85},{"id":100,"depth":228,"text":101},{"id":127,"depth":228,"text":128},{"id":140,"depth":228,"text":141,"children":236},[237,238,239,240],{"id":152,"depth":225,"text":153},{"id":164,"depth":225,"text":165},{"id":179,"depth":225,"text":180},{"id":198,"depth":225,"text":199},{"id":216,"depth":228,"text":217},"Eine dunkle Karte zum Teilen: das Reeve-Zeichen, der Titel des Berichts und die Zahl der Live-Apps im Scan als eine große Ziffer.","Wir haben Zehntausende Live-Apps aus Lovable, Bolt, v0, Replit und Base44 durch dieselben neun externen Prüfungen geschickt. Das kam heraus.","md",[246,249,252,255,258],{"q":247,"a":248},"Könnt ihr mir sagen, welche Apps welche Probleme hatten?","Nein. Nur Zahlen und Anteile, niemals Namen, und die Datendatei enthält genau das, was die Seite zeigt. Eine Liste von Apps mit ihren Schwachstellen daneben ist eine Zielliste, und die stellen wir nicht her.",{"q":250,"a":251},"Meine App steckt vielleicht in diesen Daten. Was soll ich tun?","Scanne sie selbst. Es sind dieselben neun Prüfungen, es dauert etwa zwanzig Sekunden, und du bekommst deine Note und das, was ein Fremder ohnehin schon sieht. Auf dieser Seite wird niemand identifiziert, also ist das der einzige Weg herauszufinden, wo du stehst.",{"q":253,"a":254},"Ist eine lesbare Datenbanktabelle wirklich so ernst?","Wenn jeder im Internet diese Zeilen mit einer einzigen Anfrage und ohne Passwort abrufen kann, ja. Eine lesbare Tabelle namens settings ist schlampig. Eine lesbare Tabelle namens users oder orders ist ein Datenleck, das nur noch niemand bemerkt hat.",{"q":256,"a":257},"Warum zählt ihr veröffentlichbare Schlüssel als in Ordnung?","Der anon key von Supabase soll öffentlich sein. Der Schutz steckt in den Regeln der Datenbank dahinter, nicht im Schlüssel selbst. Werkzeuge, die solche Schlüssel melden, bringen Leuten bei, die nächste Warnung zu überlesen, und die ist vielleicht die, auf die es ankommt.",{"q":259,"a":260},"Wiederholt ihr diese Erhebung?","Ja. Die Scans laufen weiter, und die nächste Ausgabe folgt ihnen. Die Datendatei hält fest, aus welchem Fenster diese Zahlen stammen, damit eine alte Kopie nicht als aktuelle durchgeht.","Wir haben nach Live-Apps gesucht, die mit Lovable, Bolt, v0, Replit oder Base44 gebaut wurden, und jede durch dieselben neun Prüfungen geschickt, die jeder kostenlos auf der Reeve-Startseite laufen lassen kann. Diese Seite ist das Ergebnis.",{},true,"\u002Fresearch\u002Fvibe-coded-app-security-2026","2026-08-19",{"title":5,"description":243},"research\u002Fvibe-coded-app-security-2026","shSpvYSTFJ07zLuxnohx0bInxnyqTj2H6Dl95X4iz6g",1787826048205]