发现Lovable建站工具因RLS缺失导致数据泄露
初始发现与范围评估
该漏洞于2025年3月20日首次发现,当时正在检查Linkable——一个由Lovable构建、可从LinkedIn个人资料生成网站的站点。
检查网络请求发现,修改一个查询即可访问项目“users”表中的所有数据。我们在Lovable的Twitter账户上回复指出此问题后,Lovable否认了问题,随后删除了推文和网站。Linkable后来恢复,但收取了2美元费用。
核心问题并非我们最初认为的公开API密钥泄露(Supabase默认提供公开的`anon`密钥),而是缺少RLS配置。这允许从暴露的表中无限制地检索数据(附录A1中的示例)。
为了确定这是否是孤立事件,我们调查了其他由Lovable创建的网站,首先从Lovable Launched开始——这是一个展示精心设计项目的平台。
通过操控Launched网站自身的一个端点(该端点同样缺少RLS),我们获得了这些网站的列表。
随后,我们开发了一个脚本,用于访问每个Launched网站的主页,捕获所有外部网络请求,并过滤出发往外部源的请求。
对于每个识别出的请求,脚本尝试修改请求,从相关端点选择所有数据——这相当于`SELECT *`操作,而RLS通常可以阻止此类操作。
该漏洞于2025年3月20日首次发现,当时正在检查Linkable——一个由Lovable构建、可从LinkedIn个人资料生成网站的站点。
检查网络请求发现,修改一个查询即可访问项目“users”表中的所有数据。我们在Lovable的Twitter账户上回复指出此问题后,Lovable否认了问题,随后删除了推文和网站。Linkable后来恢复,但收取了2美元费用。
核心问题并非我们最初认为的公开API密钥泄露(Supabase默认提供公开的`anon`密钥),而是缺少RLS配置。这允许从暴露的表中无限制地检索数据(附录A1中的示例)。
为了确定这是否是孤立事件,我们调查了其他由Lovable创建的网站,首先从Lovable Launched开始——这是一个展示精心设计项目的平台。
通过操控Launched网站自身的一个端点(该端点同样缺少RLS),我们获得了这些网站的列表。
随后,我们开发了一个脚本,用于访问每个Launched网站的主页,捕获所有外部网络请求,并过滤出发往外部源的请求。
对于每个识别出的请求,脚本尝试修改请求,从相关端点选择所有数据——这相当于`SELECT *`操作,而RLS通常可以阻止此类操作。