Databases & Storage

PostgreSQL Anonymizer 3.3 fixes 12 critical vulnerabilities enabling privilege escalation and data leaks

Key Takeaway

PostgreSQL Anonymizer 3.3 patches twelve critical CVEs that allowed masked roles to bypass privacy protections, access authentic data, and in some cases gain superuser privileges.

Summary

Dalibo has released PostgreSQL Anonymizer 3.3, a major security update for the open-source PostgreSQL extension that masks personally identifiable information and commercially sensitive data. The release addresses twelve critical vulnerabilities, including flaws that permitted masked roles to read authentic data through SQL-standard function bodies, access pg_stats with unmasked values, bypass dynamic masking via cached plans and subqueries, and in certain circumstances escalate to superuser privileges. The update also resolves denial-of-service conditions in image and range-based dummy functions.

Version 3.3 introduces several hardening measures to prevent exploitation: subqueries in masking rules are now prohibited, function inlining is disabled for transparent dynamic masking, and masked roles are blocked from executing functions with SQL-standard bodies including contrib extensions like citext and earthdistance. Administrators are strongly advised to upgrade immediately and rotate the anon.salt GUC parameter. The extension supports deployment via Debian and RPM packages, Ansible roles, Docker images, and is available on major DBaaS providers and PostgreSQL forks including EDB Advanced Postgres, Greenplum, and Yugabyte.

Security fixes and hardening in Anonymizer 3.3

  • Dynamic masking bypass via cached plans: CVE-2026-105617 allowed cached execution plans to circumvent transparent dynamic masking, potentially exposing authentic data to masked roles; the fix prevents this plan caching escape.
  • SQL-standard function bodies as data exfiltration channel: CVE-2026-110181 and CVE-2026-105617 together revealed that SQL-standard function bodies could be exploited to read unmasked data; version 3.3 now forbids masked roles from executing any SQL-standard body functions, including contrib extensions.
  • Statistics leakage post-static masking: CVE-2026-110183 identified that pg_stats retained authentic column values after static masking completed, leaving a persistent side-channel for data reconstruction.
  • Salt exposure in catalog: CVE-2026-105616 made the secret salt readable in pg_db_role_setting, compromising the pseudonymization scheme; administrators must rotate anon.salt after upgrading.
  • Inherited table and security_invoker gaps: CVE-2026-105618 and CVE-2026-105619 closed coverage holes where dynamic masking failed on inherited tables and masking rules were not enforced through security_invoker views.

Why it matters

For organizations running PostgreSQL in regulated environments or handling sensitive datasets, this release closes multiple high-severity attack paths that directly undermine the core value proposition of data masking. The breadth of affected deployment patterns—from self-managed instances to DBaaS platforms like Google Cloud SQL, Azure Database, and Neon—means virtually all Anonymizer users face exposure until patched. The requirement to rotate salts and the breaking change blocking SQL-standard functions in masked sessions may require application review, but these operational costs are outweighed by the elimination of privilege escalation and re-identification risks.

What to do

  • Upgrade the PostgreSQL Anonymizer extension to version 3.3 immediately.
  • Rotate the anon.salt GUC parameter.

Original reference: www.postgresql.org →