Altinity / Altinity/altinity-sql-browser

Prototype-key defect (#551 class) remains in three user-keyed maps outside placement maps

Offen
#559 0 Kommentare 0 Reaktionen 0 zugewiesene Personen Auf GitHub ansehen

Dieses Issue hat noch niemand übernommen.

bug inbox
Vorherrschende Sprache
TypeScript
Sterne
8
Forks
2
Ø Merge
1 Std. 34 Min.
Gemergte PRs (30 T.)
6

Beschreibung

What

Three more plain-object maps are built by assigning a user-authored string key directly (out[key] = …), which is the same defect #551 fixed for Dashboard placement maps. A key of __proto__ invokes the inherited Object.prototype setter and creates no own property, so the entry silently vanishes; a bare read of the same key resolves up the prototype chain to Object.prototype itself, which a merge-then-rewrite can then mutate realm-wide.

Sites

  • src/dashboard/model/dashboard-variable-store.ts:66,76,93,96out[variableId], out[dashboardId]
  • src/workspace/workspace-dashboards.ts:133configs[name] = config
  • src/dashboard/application/dashboard-viewer-session.ts:1495-1496proposedValues[variable.def.parameter]

All three are keyed by strings the user authors: variable IDs, dashboard IDs, and variable parameter names (the {name:Type} placeholder text in panel SQL). Nothing constrains those away from __proto__ or constructor.

Why this is cheap to fix

#551 already landed the two shared primitives in src/core/saved-query.ts and exported them:

  • defineJsonField(target, key, value)Object.defineProperty-based write
  • readJsonField(target, key) — own-property-only read, for any map that gets merged, mutated, or where "no entry" differs from "an empty entry"

So this is a mechanical sweep plus round-trip tests with __proto__/constructor keys that assert the entry survives (Object.hasOwn + exact value), not merely that nothing throws.

Why deferred

Out of scope for #551, which was explicitly about placement maps keyed by tile ID — one sweep across every site it named, rather than quietly widening that PR's diff. Found while doing that sweep (PR #558).

Note on severity

#551's body originally claimed "no prototype pollution escapes". That is not true of the read path: setStylePlacement was reproduced polluting Object.prototype.grid for the whole realm. Whether any of the three sites above is reachable that way has not been checked — each needs the read side examined, not just the write.

Beitragsleitfaden

Beitragsleitfaden öffnen

Erste Schritte

  1. Lies das ganze Issue und danach den Beitragsleitfaden des Projekts.
  2. Schreib ins Issue, dass du es übernimmst — das erspart doppelte Arbeit.
  3. Forke das Repository und arbeite in einem Branch.
  4. Öffne einen Pull Request, der die Issue-Nummer nennt.

Rechercherichtung

Beginnen Sie mit den drei aufgeführten Dateien: src/dashboard/model/dashboard-variable-store.ts, src/workspace/workspace-dashboards.ts und src/dashboard/application/dashboard-viewer-session.ts. Lesen Sie anschließend die Primitiven defineJsonField und readJsonField in src/core/saved-query.ts und fügen Sie Round-Trip-Tests für die Schlüssel proto und constructor hinzu. Als abgeschlossen gilt die Aufgabe, wenn jeder Eintrag mit Object.hasOwn und seinem exakten Wert erhalten bleibt, einschließlich aller relevanten Lesepfade.

Vom Indexierungsmodell aus dem Issue-Text verfasst.

Bewertung

Tech-Stack
typescript
Bereich
frontend, security
Issue-Typ
Bug
Schwierigkeit
3/5
Geschätzter Aufwand
1-2 Tage
Aktivitätsstatus
Ruhig
Klarheit
Klar beschrieben
Anfängerfreundlichkeit
72/100

Neue Issues direkt in Ihr Postfach

Eine kurze Übersicht über anfängerfreundliche GitHub-Issues.