OSV 1.4.0 · github-reviewed · 修改于 2026-07-21 05:17
发布时间
2026-06-05 23:59
GitHub 审查时间
2026-06-05 23:59
NVD 发布时间
2026-06-24 05:16
源文件
advisories/github-reviewed/2026/06/GHSA-cxv7-gmmp-228p/GHSA-cxv7-gmmp-228p.json
An authenticated user with columnAdd permission on a Postgres-backed base can inject arbitrary SQL into the formula engine via the optional direction argument of ARRAYSORT(...). The value is unrestricted by formula validation and embedded into a knex.raw ORDER BY clause, executing during column creation and on every subsequent record read of the formula column.
The vulnerability is specific to the Postgres mapping for ARRAYSORT in packages/nocodb/src/db/functionMappings/pg.ts. Two factors combine:
ARRAYSORT declares only argument count, not validation.args.type, so validate-extract-tree.ts does not enforce an allowlist on the second argument.sanitize(knex.raw(...)) into a raw SQL fragment:const direction = pt.arguments[1]
? sanitize(
knex.raw(pt.arguments[1]?.value ?? (await fn(pt.arguments[1])).builder),
)
: knex.raw('asc');
return {
builder: knex.raw(`ARRAY(SELECT UNNEST(??) ORDER BY 1 ??)`, [source, direction]),
};
sanitize() in sqlSanitize.ts only escapes ? placeholder characters; it does not validate SQL syntax. A payload such as "desc, (SELECT COUNT(*) FROM generate_series(1,30000000))" is accepted, persisted, and re-executed on every read of the formula column.
columnAdd permission (creator/owner-level).This issue was reported by @leduckhuong.