澄清:CVE-2019-9193 不是安全漏洞

作者:高巍
杭州乘数科技有限公司DBA

近期在互联网媒体上流传PostgreSQL存在任意代码执行的漏洞:“拥有‘pg_read_server_files’权限的攻击者可利用此漏洞具备超级用户权限,执行任意系统命令”。

针对此言论,PostgreSQL官方在2019年4月4日发表声明如下:

互联网媒体上报到的有关PostgreSQL方面的安全漏洞CVE-2019-9193,PostgreSQL安全团队强调这不是一个安全漏洞, 我们认为创建这个CVE-2019-9193就是个错误,而且已经和CVE-2019-9193的报告者联系,调查为什么会创建这个条目。
COPY .. PROGRAM 功能明确规定,只能被授予超级用户权限、或是默认pg_execute_server_program 角色的数据库用户来执行。根据设计,此功能允许被授予超级用户或pg_execute_server_program的用户作为PostgreSQL服务器运行的操作系统用户(通常是“postgres”)执行操作。CVE中提到的默认角色pg_read_server_files和pg_write_server_files不会授予数据库用户使用COPY .. PROGRAM的权限。
根据设计,数据库超级用户与运行数据库服务所在的操作系统的用户之间不存在不同的安全边界,另外PostgreSQL服务器不允许作为操作系统超级用户(例如“root”)运行。PostgreSQL 9.3中添加的COPY .. PROGRAM的功能并未改变上述设计原则,只是在现有的安全边界内添加了一个功能。
我们鼓励PostgreSQL的所有用户遵循最佳实践方案,即永远不要向远程用户或其他不受信任的用户授予超级用户的访问权限。这是系统管理中应遵循的安全操作标准,对于数据库管理也需要遵循。
如果您对此有更多疑问,我们诚邀您通过社区官网与工作人员取得联系。
社区官网链接:https://www.postgresql.org/about/news/1935/

验证

个人做一个简单的认证如下
在PG11.2上创建用户凭赋予pg_read_server_files权限

  1. [postgres@pg01 pg11data]$ psql
  2. psql (11.2)
  3. Type "help" for help.
  4. postgres=# create user u01 password 'XXXXXXXX';
  5. CREATE ROLE
  6. postgres=# grant pg_read_server_files to u01;
  7. GRANT ROLE

使用赋予权限的用户登录上数据库

  1. [postgres@pg01 pg11data]$ psql -Uu01 -h 127.0.0.1 postgres
  2. psql (11.2)
  3. Type "help" for help.
  4. postgres=> create table cmd_exec(cmd_output text);
  5. CREATE TABLE
  6. postgres=> \du
  7. List of roles
  8. Role name | Attributes | Member of
  9. -----------+------------------------------------------------------------+------------------------
  10. postgres | Superuser, Create role, Create DB, Replication, Bypass RLS | {}
  11. u01 | | {pg_read_server_files}

执行相关命令,发现失败。不存在流言上所述问题

  1. postgres=> copy cmd_exec from program 'id';
  2. ERROR: must be superuser or a member of the pg_execute_server_program role to COPY to or from an external program
  3. HINT: Anyone can COPY to stdout or from stdin. psql's \copy command also works for anyone.
0 评论  
添加一条新评论