GitHub Advisoryadvisory · npm
GHSA-p849-8hwh-84j9 NocoBase: SQL injection in /api/myInAppChannels:list filter to PG-superuser RCE
CRITICAL
Official page ↗
- Aliases
- CVE-2026-52887
- Ecosystem
- npm
- Packages
- @nocobase/plugin-notification-in-app-message
- Severity
- Critical
- CVSS vector
- CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:H/A:H
- Weaknesses
- CWE-89
- Reviewed
- 2026-07-31
Affected packages
• npm @nocobase/plugin-notification-in-app-message: < 2.0.61 → fixed in 2.0.61
Description
Summary
`GET /api/myInAppChannels:list` accepts a structured `filter` query parameter. The handler for the `latestMsgReceiveTimestamp` field splices the `$lt` value directly into a `Sequelize.literal()` template string with no escape, type cast, or parameter binding. The action ACL is `loggedIn`, so any authenticated account reaches it. The default `auth-basic` authenticator ships `allowSignUp: true`, so the account is obtainable anonymously.
The injection is reachable with the URL parameter `filter[latestMsgReceiveTimestamp][$lt]=`. The `pg` driver in front of Sequelize accepts stacked statements, so the chain extends from boolean and timing oracles to multi-statement payloads.
The shipped `docker-compose.yml` creates the DB role `nocobase` on a stock `postgres:16` image, which assigns the `rolsuper` attribute by default. `COPY ... TO PROGRAM '...'` therefore runs shell commands as `uid=999(postgres)` inside the database container.
Result: any anonymous visitor signs up, signs in, and exfiltrates arbitrary rows or executes shell commands inside the database container with one HTTP GET after the sign-in.
Affected
NocoBase server, `@nocobase/plugin-notification-in-app-message` ` /tmp/PWN_VERIFY.txt'; --"
docker exec launch-postgres-1 cat /tmp/PWN_VERIFY.txt
uid=999(postgres) gid=999(postgres) groups=999(postgres),101(ssl-cert)
```
Live-verified: sqlmap 1.10.3 against this endpoint reports `Type: boolean-based blind` (payload `0) AND 1511=(SELECT (CASE WHEN (1511=1511) THEN 1511 ELSE (SELECT 4568 UNION SELECT 9477) END))-- KVYH`), `Type: time-based blind`, `current user: nocobase`, `current user is DBA: True`. Admin password hash `ef6ea7f6...8ea12` exfiltrated via `COPY (SELECT email,password FROM users WHERE id=1) TO PROGRAM 'cat > /tmp/PWN_HASH.txt'`. Reproduced 2026-05-26 against HEAD `e35a2737`.
Impact
• Authenticated SQL injection with time-based, boolean-based, and stacked-statement primitives (`pg` driver simple-query).
• Arbitrary row read of any collection, including `users.password` PBKDF2 hashes for the super-admin account.
• Shell command execution as `uid=999(postgres)` inside the PostgreSQL container via `COPY ... TO PROGRAM`.
• Anonymous reach in default deployments because `auth-basic` ships `allowSignUp: true`.
Credit
Jan Kahmen, turingpoint ([email protected])
Related
Alias · CVE (1)
- CVE-2026-52887 NocoBase is an AI-powered no-code/low-code platform for building business applications and enterprise solutions. vulnerability
Weakness · CWE (1)
- CWE-89 Improper Neutralization of Special Elements used in an SQL Command weakness
References
- https://github.com/nocobase/nocobase/security/advisories/GHSA-p849-8hwh-84j9 web
- https://nvd.nist.gov/vuln/detail/CVE-2026-52887 advisory
- https://github.com/nocobase/nocobase/pull/9630 web
- https://github.com/nocobase/nocobase/commit/68d64e3fcfb8be2ae4f3bfc9e1ee3f85b87c89ce web
- https://github.com/nocobase/nocobase package
- https://github.com/nocobase/nocobase/releases/tag/v2.0.61 web