[{"data":1,"prerenderedAt":269},["ShallowReactive",2],{"research-pt":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_pt\u002Fresearch\u002Fvibe-coded-app-security-2026.md","A segurança dos apps vibe-coded em 2026",[7,8],"Só a visão de fora. Lemos o que o navegador de quem visita já lê: o código que o app entrega, os cabeçalhos que ele devolve, os endereços que ele mesmo cita no próprio código. Sem login, sem adivinhar senha, sem baixar nada.","Nenhum app é citado aqui nem no arquivo de dados. Cada número vem com o método que o produziu, e o arquivo no fim traz todos os agregados numa tabela só, se você quiser conferir a conta.",{"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},"seis-números-que-contam-a-história","Seis números que contam a história",[18,19,20],"p",{},"Estes seis números são o relatório. Tudo o que vem depois deles é a base sobre a\nqual cada um se apoia, e como chegamos até ela.",[22,23],"research-key-findings",{},[18,25,26],{},"Os padrões de fábrica das plataformas falham em quase todo lugar, e a maioria\ndessas falhas é moderada. O que só quem construiu o app pode mudar falha bem\nmenos, e é isso que põe o dado de outra gente na internet aberta.",[13,28,30],{"id":29},"que-nota-esses-apps-tiram-de-a-a-f","Que nota esses apps tiram, de A a F",[18,32,33],{},"O Reeve dá nota a um app como um boletim escolar. Os descontos saem de cem e são\nponderados pela gravidade. Depois, o achado mais grave impõe um teto: com um\nachado crítico o app não passa de D, e com um achado alto não passa de C.",[35,36],"research-grades",{},[18,38,39],{},"A maioria dos apps cai em A ou B. A faixa de D e F é pequena. São os apps em que\num estranho já consegue ler as linhas de outra pessoa.",[13,41,43],{"id":42},"o-que-verificamos-e-quantos-apps-falharam-em-cada","O que verificamos, e quantos apps falharam em cada",[18,45,46],{},"Cada verificação faz uma pergunta sobre o app visto de fora, e cada uma é contada\nsobre os apps em que obteve resposta. Um app que a verificação não conseguiu\nalcançar fica fora da base daquela verificação, em vez de entrar como limpo.\nSobre esses o scan diz que não conseguiu verificar, e esta página faz o mesmo.",[48,49],"research-checks-table",{},[18,51,52],{},"Duas linhas parecem mais assustadoras do que são. Cabeçalhos de segurança são\ninstruções que a plataforma de hospedagem manda para o navegador, e um deles\nfaltando deixa um tipo de ataque com um obstáculo a menos pela frente. Um source\nmap publicado é o código original do app parado ao lado da versão compilada:\nmostra a um invasor onde procurar, e por si só não entrega nada.",[18,54,55],{},"Uma linha também pode parecer grave porque um punhado de apps dentro dela\nentregou algo sério enquanto o resto entregou algo comum. O arquivo de dados\nabre cada linha por tipo de chave, para dar para ver qual é qual.",[13,57,59],{"id":58},"mais-da-metade-dos-apps-com-supabase-que-dá-para-verificar-vazam-dados-de-tabela","Mais da metade dos apps com Supabase que dá para verificar vazam dados de tabela",[18,61,62],{},"É o número ao qual voltamos o tempo todo.",[18,64,65],{},"Um projeto Supabase é aberto para a internet por definição. O app que roda no\nnavegador conversa direto com o banco de dados, usando uma chave que deve mesmo\nser pública, e o que fica entre um estranho e as linhas é o Row Level Security:\numa regra em cada tabela. Desligue essa regra, ou escreva uma política que deixa\ntodo mundo entrar, e qualquer tabela do projeto pode ser lida com uma requisição\ne sem senha.",[67,68],"research-stat",{"id":69},"supabase",[18,71,72],{},"Menos da metade dos apps que citam um projeto Supabase dá para verificar. Alguns\nmandam o tráfego do banco pelo próprio backend, onde uma verificação de fora não\nconsegue ir atrás, então sobre esses não dizemos nada. A proporção acima é sobre\nos apps que responderam.",[67,74],{"id":75},"rlsSplit",[18,77,78],{},"A divisão é a parte útil. Uma tabela legível chamada settings ou content é um\nerro. Uma tabela legível chamada users, profiles ou orders é dado pessoal de\noutra gente na internet aberta, e quem construiu o app quase certamente acha que\naquilo é privado.",[18,80,81],{},"A verificação nunca lê uma linha. Ela pergunta ao banco quantas linhas ficariam\nvisíveis e lê a contagem de volta num cabeçalho da resposta. Isso basta para\ndistinguir uma tabela com regra de RLS de uma tabela sem regra, e a verificação\nnão vai além disso.",[13,83,85],{"id":84},"as-mesmas-nove-verificações-ferramenta-por-ferramenta","As mesmas nove verificações, ferramenta por ferramenta",[18,87,88],{},"Cada app está agrupado pela ferramenta com que foi publicado, e medido contra os\noutros apps daquela ferramenta.",[90,91],"research-builders-table",{},[18,93,94],{},"Quase tudo o que esta tabela compara são padrões de fábrica. Ninguém escolhe\nLovable ou Bolt pelos cabeçalhos de segurança. Quem os define para todo app que\nhospeda é a plataforma, então uma mudança ali mexe numa coluna inteira desta\ntabela.",[18,96,97],{},"Dois limites antes de alguém citar uma linha. Atribuímos os apps pelo domínio de\npublicação, então um app que mudou para domínio próprio fica inteiramente de\nfora desta tabela, e esses costumam ser os mais acabados. E uma ferramenta que\nleva o tráfego do banco pelo próprio backend não pode ser verificada de fora de\njeito nenhum. Um espaço em branco ali quer dizer que não conseguimos medir, e\nnão diz nada sobre o quanto esses apps são seguros.",[13,99,101],{"id":100},"dois-tipos-de-achado-dois-tipos-de-conserto","Dois tipos de achado, dois tipos de conserto",[18,103,104],{},"Os achados desta página caem em dois grupos, e os dois precisam de mãos\ndiferentes.",[106,107],"research-controls",{},[18,109,110],{},"O primeiro grupo é uma decisão de produto dentro de uma empresa. Uma única\nmudança num padrão de fábrica da hospedagem move todos os apps daquela\nplataforma de uma vez, e é por isso que essas linhas saem tão parelhas e são as\nmais baratas de consertar.",[18,112,113,114,119,120,124],{},"O segundo grupo está com quem construiu o app. Nenhuma plataforma de hospedagem\ntem como saber quais das suas tabelas devem ser públicas, nem qual chave\npertence a um servidor. Todo achado crítico deste relatório está nesse grupo. Os\n",[115,116,118],"a",{"href":117},"\u002Fis","guias de segurança por ferramenta"," e o\n",[115,121,123],{"href":122},"\u002Fchecklist","checklist de lançamento"," começam os dois por ali.",[13,126,128],{"id":127},"o-que-os-vibe-coders-acertam","O que os vibe-coders acertam",[18,130,131],{},"Contamos também o que passou, sobre os mesmos apps.",[133,134],"research-clean-rates",{},[18,136,137],{},"O último card é o que os scanners genéricos erram. Uma chave publicável no\nfrontend (uma chave anon do Supabase, uma chave publicável do Stripe) é para\nestar ali: ela foi feita para ser lida, e a proteção está nas regras atrás dela.\nApontar isso como problema manda alguém mudar um ajuste que já estava certo.",[13,139,141],{"id":140},"como-medimos-e-onde-estão-os-limites","Como medimos, e onde estão os limites",[143,144,145,160,175,194],"research-method",{},[146,147,149,154,157],"template",{"v-slot:origin":148},"",[150,151,153],"h3",{"id":152},"de-onde-vieram-os-apps","De onde vieram os apps",[18,155,156],{},"Três listas, unidas e sem repetição: apps que as pessoas postaram no X e no\nReddit, apps lançados no Show HN e apps que enumeramos a partir dos domínios de\npublicação das próprias ferramentas. Os domínios de publicação são o grosso da\namostra e a única lista que escala. As outras duas só encontram um app sobre o\nqual alguém resolveu postar.",[18,158,159],{},"Os hosts mortos saíram primeiro, e julgamos isso lendo a própria página. Um\ndeploy apagado muitas vezes ainda responde com um 200 OK perfeitamente alegre.",[146,161,162,166,169,172],{"v-slot:denominator":148},[150,163,165],{"id":164},"a-regra-do-denominador","A regra do denominador",[18,167,168],{},"Toda proporção desta página é sobre os apps que aquela verificação conseguiu\nresponder, e nunca sobre a amostra inteira. Uma verificação que não conseguiu\nalcançar um app deixa esse app fora da própria base, e nunca o conta como limpo.\nOs dois números ao lado de cada barra são essa base, para qualquer um ver qual\nestá lendo.",[67,170],{"id":171},"inconclusive",[18,173,174],{},"As notas são contadas sobre um número menor pelo mesmo motivo. Um app que\ndevolveu pouco demais para ser classificado sai de todos os números acima, em\nvez de receber nota no chute.",[146,176,177,181],{"v-slot:scope":148},[150,178,180],{"id":179},"o-que-fizemos-e-o-que-não-fizemos","O que fizemos, e o que não fizemos",[182,183,184,188,191],"ul",{},[185,186,187],"li",{},"Só leituras passivas: as requisições que o navegador de um visitante já faz,\nmais os endereços públicos que o próprio app aponta.",[185,189,190],{},"A verificação do banco pega uma contagem de linhas num cabeçalho da resposta.\nNunca lemos uma linha, nunca baixamos um arquivo, nunca fizemos login e nunca\nadivinhamos uma senha.",[185,192,193],{},"Nenhum app é citado, aqui ou no arquivo de dados. Uma lista de apps\nemparelhada com as fraquezas de cada um é uma lista de alvos, e não guardamos\nisso em forma publicável.",[146,195,196,200],{"v-slot:limits":148},[150,197,199],{"id":198},"limites-que-vale-conhecer","Limites que vale conhecer",[182,201,202,205,208,211],{},[185,203,204],{},"A amostra pende para apps mais novos. Um app que mudou para domínio próprio\nnão pode ser ligado a uma ferramenta de fora, e esses costumam ser os mais\nestabelecidos.",[185,206,207],{},"A cor de uma linha marca o pior caso que vimos, que pode ser um app entre\ncentenas. O arquivo de dados abre cada linha por tipo exato de chave.",[185,209,210],{},"Esta é uma janela de três dias de agosto. Um app consertado na semana seguinte\ncontinua contando aqui como estava no dia em que olhamos.",[185,212,213],{},"Uma verificação externa automatizada não é uma auditoria. A ausência de\nachados não é garantia.",[13,215,217],{"id":216},"use-estes-números","Use estes números",[18,219,220],{},"Jornalistas, pesquisadores e quem estiver escrevendo sobre o assunto podem\nreutilizar os dados dando o crédito. O arquivo abaixo traz todos os agregados\ndesta página numa tabela só, e não nomeia nenhum 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},"Um card escuro com a marca Reeve, o título do relatório e a quantidade de apps no ar da varredura, num número grande.","Rodamos as mesmas nove verificações externas em dezenas de milhares de apps no ar feitos com Lovable, Bolt, v0, Replit e Base44. Veja o que voltou.","md",[246,249,252,255,258],{"q":247,"a":248},"Vocês podem dizer quais apps tinham quais problemas?","Não. Só contagens e proporções, nunca nomes, e o arquivo de dados traz exatamente o que a página mostra. Uma lista de apps emparelhada com as fraquezas de cada um é uma lista de alvos, e não vamos produzir isso.",{"q":250,"a":251},"Meu app pode estar nesses dados. O que eu faço?","Escaneie você mesmo. São as mesmas nove verificações, levam uns vinte segundos e devolvem a sua nota junto com o que um estranho já consegue ver. Nada nesta página identifica ninguém, então esse é o único jeito de saber onde você está.",{"q":253,"a":254},"Uma tabela do banco que qualquer um lê é tão grave assim?","Se qualquer pessoa na internet consegue puxar aquelas linhas com uma requisição e sem senha, é. Uma tabela legível chamada settings é desleixo. Uma tabela legível chamada users ou orders é um vazamento de dados que ninguém percebeu ainda.",{"q":256,"a":257},"Por que vocês consideram as chaves publicáveis algo normal?","A chave anon do Supabase foi feita para ser pública. A proteção são as regras do banco de dados atrás dela, não a chave em si. Ferramentas que apontam essas chaves ensinam a pessoa a passar batido pelo próximo aviso, que pode ser o que importa.",{"q":259,"a":260},"Vocês vão rodar isso de novo?","Vamos. As varreduras continuam rodando e a próxima edição vem delas. O arquivo de dados registra a janela de onde vieram estes números, então uma cópia antiga não passa por atual.","Procuramos apps no ar feitos com Lovable, Bolt, v0, Replit ou Base44 e passamos cada um pelas mesmas nove verificações que qualquer pessoa pode rodar de graça pela página inicial do Reeve. Esta página é o que voltou.",{},true,"\u002Fresearch\u002Fvibe-coded-app-security-2026","2026-08-19",{"title":5,"description":243},"research\u002Fvibe-coded-app-security-2026","5Fh10izU9awb4vYw1ZwVkuTWMazCbG09OAXlVoxr0N8",1787826048206]