作者:瀚高PG实验室 (Highgo PG Lab)- Kalath
CVE-2018-1058描述了一个用户在不同模式下创建的一些名字很像的对象,是怎么改变其他用户的查询行为而且导致意料之外或者有害的行为的。它主要描述了这个问题以及在PostgreSQL中减轻这些问题的影响的办法。
什么是CVE-2018-1058?
PostgreSQL7.3版本之后,默认情况下,当一个用户创建一个数据库时,PostgreSQL会创建一个叫做public的模式。默认情况下,所有的对象都会被创建到这个模式下。所以SELECT * FROM a;
就等价于 SELECT * FROM public.a;
如果不更改配置信息,任何用户都可以在public模式下创建对象。名字相同的对象可以在相同数据库的不同模式下存在。如果出现这种情况,而且没有指定特定的模式和对象(例如schema.object),那么PostgreSQL会基于search_path的设置来决定那个对象会被使用。
问题是什么?
CVE-2018-1058中描述的问题主要是围绕默认的public模式和PostgreSQL是怎样使用search_path的设定来提出的。
在不同的模式下创建同名对象的能力,加上PostgreSQL在模式内搜寻对象的方法,出现了一种可能,那就是一个用户可以修改其他用户的查询行为。
例如,一个恶意用户可能会植入一个函数,它的功能是当被超级用户执行时,将更大的权限赋给这个恶意用户。
这个问题可能会导致非常严重的影响。
用什么方式减轻这种危害的影响?
1、不允许用户在public模式下创建新的对象。
可以用超级用户,在所有的数据库中运行下面这条命令:
REVOKE CREATE ON SCHEMA public FROM PUBLIC;
这会阻止所有的非超级用户在public模式下创建对象。
2、为数据库用户设置默认的search_path。
一个超级用户可以向系统中的每个用户发出这条命令,来将public模式从用户默认的search_path中移除:
ALTER ROLE username SET search_path = "$user";
3、在PostgreSQL的配置文件中设置默认的search_path。
也可以在postgresql.conf这个配置文件中将public模式从用户默认的search_path中移除。