0025_public_bucket_allows_listing silently returns zero findings when splinter.public_buckets is unset — undocumented transaction-local contract
Los mantenedores suelen responder en 1 día
Evaluación
- Dificultad
- 4/5
- Tiempo estimado
- 3-5 días
- Aptitud para principiantes
- 45/100
Línea de trabajo
Comienza con la consulta 0025_public_bucket_allows_listing y su preámbulo en el splinter.sql compilado, y después compara los campos query y setup separados en splinter.json. Revisa el README y la invocación de CI psql --single-transaction para documentar el contrato del GUC local a la transacción. Se considera terminado cuando una configuración ausente no puede producir silenciosamente un resultado limpio, con un comportamiento que cubra tanto la omisión de setup como una lista de buckets legítimamente vacía.
Escrito por el modelo de indexación a partir del texto del issue.
Descripción
Summary
Since #170 ("chore: 0025 query_to_xml workaround", merged 2026-07-02), 0025_public_bucket_allows_listing no longer reads storage.buckets itself. The view now reads a GUC:
coalesce(
nullif(pg_catalog.current_setting('splinter.public_buckets', true), '')::pg_catalog.jsonb,
'[]'::pg_catalog.jsonb
)
and the storage.buckets read moved into a preamble DO block that exists only in the compiled splinter.sql, which populates the GUC transaction-locally:
perform pg_catalog.set_config('splinter.public_buckets', buckets, true);
Consequence: any consumer that executes the lint query without running that preamble in the same transaction gets zero findings — indistinguishable from a genuinely clean result. The lint fails open. #170 itself had to switch this repo's CI runner to psql --single-transaction to keep the GUC visible, which illustrates the hazard: the contract is real, but it lives only in the compiled artifact and CI invocation, and the README documents the pgrst.db_schemas dependency while splinter.public_buckets is undocumented.
Real-world impact (hosted advisor path)
On our hosted project, 0025 reported two findings (user-avatars, workspace-branding) through 2026-06-10. Sometime after #170, the findings disappeared from the hosted security-advisor results while both flagged conditions still hold — we re-verified by executing the lint's own predicate manually with the bucket list supplied: both broad PERMISSIVE SELECT policies still exist and both findings reproduce exactly. We can't inspect the hosted advisor runner, but the observable symptom is precisely what a runner that doesn't execute the preamble in-transaction would produce, and no other 0025-touching change exists in the window.
For an advisor whose job is to flag data exposure, "input not supplied" being indistinguishable from "no exposure found" seems worth closing: consumers (including us) read the absence of findings as a clean bill.
The same hazard is now formalized in the manifest
The versioned splinter.json manifest publishes per-lint query fields with a separate setup field. A consumer that runs a lint's query without executing setup in the same transaction reproduces the same silent zero for 0025.
Prior art
This is the same failure class as the unset-pgrst.db_schemas case (supabase/cli#5868, fixed by #168 coalescing to 'public'). The difference: 0025 has no sane inline default available — an empty bucket list doesn't degrade the lint, it disables it silently.
Suggestions
- Document the
splinter.public_bucketscontract in the README alongsidepgrst.db_schemas, including the transaction-local requirement. - Prefer fail-loud over fail-open: when the setting is absent (as opposed to a legitimately empty
[]), either raise, or emit a sentinel "not evaluated" row, so runners that skip the preamble become visible instead of silently green. - Alternatively, restore a self-contained fallback: read
storage.bucketsdirectly when the GUC is absent and thestorageschema exists (the pre-#170 behavior), using whatever construction avoids the originalquery_to_xmlproblem that motivated #170.
Happy to provide the manual reproduction steps or test against a fix.
- Lenguaje dominante
- PLpgSQL
- Estrellas
- 284
- Forks
- 110
- Métricas de merge de PR
- Sin PR fusionados en 30 d
Preparar el entorno
- Sin Dockerfile ni archivo de Docker Compose
- Sin plantilla de pull request
- Leer la guía de contribución
Primeros pasos
- Lee el issue completo y luego la guía de contribución del proyecto.
- Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
- Haz un fork del repositorio y trabaja en una rama.
- Abre un pull request que haga referencia al número del issue.
Más de supabase/splinter
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 69/100
supabase/splinter#206 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
0002_auth_users_exposed false positive: pg_depend join lacks a refclassid filter (cross-catalog OID collision)Posiblemente ocupada @tushardev-365 la tomó hace 96 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
Los mantenedores suelen responder en 1 día
-
Dificultad 1/5 Menos de una hora Aptitud para principiantes 40/100
supabase/splinter#210 · 1 reacción ·
Los mantenedores suelen responder en 1 día
-
0030_autovacuum_disabled misses tables where autovacuum_enabled is set to off, 0 or noPosiblemente ocupada @RaphaelFakhri la tomó hace 9 días. Abierto
Dificultad 2/5 1-3 horas Aptitud para principiantes 35/100
Los mantenedores suelen responder en 1 día
-
Proposal: lint for RLS policies whose role lacks the table privilege (policy_without_privilege)Posiblemente ocupada @larik15 la tomó hace 28 días. Abierto
Dificultad 1/5 Menos de una hora Aptitud para principiantes 1/100
Los mantenedores suelen responder en 1 día
Todos los issues de supabase/splinter
Issues similares
-
Lint rule GV016 order-by-randomPosiblemente ocupada @YinL-k la tomó hoy. Abiertoenhancement good first issue
Dificultad 2/5 1-3 horas Aptitud para principiantes 78/100
laaielichter/Gulliver#20 ·
Los mantenedores suelen responder en 1 día
-
database documentation from-review-extraction severity:nit
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
LearningCircuit/local-deep-research#8217 ·
Los mantenedores suelen responder en 1 día
-
"Sync columns from source" fails on ClickHouse tables with ALIAS, MATERIALIZED or DEFAULT columnsPosiblemente ocupada @bmuraykhi la tomó hoy. Abierto#bug
Dificultad 2/5 1-3 horas Aptitud para principiantes 70/100
Los mantenedores suelen responder en 1 día
-
bazel bug odb
Dificultad 1/5 Menos de una hora Aptitud para principiantes 80/100
The-OpenROAD-Project/OpenROAD#12095 · 1 comentario ·
Los mantenedores suelen responder en 1 día
-
Dificultad 2/5 1-3 horas Aptitud para principiantes 72/100
ClickHouse/clickhouse-go#2093 ·
Los mantenedores suelen responder en 1 día