The /aggregate/:typename endpoint accepted column and group query parameters that were passed verbatim to goqu.L() — a raw SQL literal expression builder — without any validation. This bypassed all parameterization and allowed authenticated users with any valid session to inject arbitrary SQL expressions.
An authenticated low-privilege user could:
(SELECT group_concat(email) FROM user_account) as leaksqlite_version(), (SELECT sql FROM sqlite_master)The vulnerability was confirmed locally; user_account.email values were extracted via a crafted column parameter by a non-admin user.
goqu.L(userInput) in server/resource/resource_aggregate.go inserted user-supplied query parameters directly into the SQL string with no validation.
All goqu.L() calls on user-controlled input were eliminated and replaced with:
TableInfo().GetColumnByName())count, sum, avg, min, max, first, last) and scalar functions (date, strftime, upper, lower, etc.)goqu.I(), goqu.SUM(), goqu.Func()) for all generated expressionsallowedTables scope enforcement: qualified column refs (table.col) validated against root entity + explicitly joined tables onlyTwo additional DoS bugs were fixed in the same commit: uuid.MustParse panic on malformed UUID input and an index-out-of-range panic in ToOrderedExpressionArray on empty sort expressions.
Reported by @VashuVats.
{
"cwe_ids": [
"CWE-89"
],
"github_reviewed": true,
"github_reviewed_at": "2026-04-22T17:38:02Z",
"nvd_published_at": "2026-05-07T15:16:06Z",
"severity": "HIGH"
}