解读2017-08-10发布的几个安全漏洞

标签

PostgreSQL , 安全漏洞 , CVE-2017-7546 , CVE-2017-7547 , CVE-2017-7548


背景

PostgreSQL 社区于08-10发布了新版本,修复了三个安全漏洞。

https://www.postgresql.org/about/news/1772/

CVE-2017-7546:
Empty password accepted in some authentication methods  

CVE-2017-7547:
The "pg_user_mappings" catalog view discloses passwords to users lacking server privileges  

CVE-2017-7548:
lo_put() function ignores ACLs

下面一一进行解读。

CVE-2017-7546 允许空密码登陆漏洞

注意,libpq接口的客户端,都会自动拒绝空密码的用户登陆,这个行为可能误导用户认为空密码就是不允许登陆的。

而实际上并非如此,其他客户端驱动可能允许空密码登陆,这个漏洞修复了这个问题。在服务端拒绝空密码的用户登陆。

所以你如果不使用空密码,就不会有这个问题。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=bf6b9e94445610a3d84cf9521032fab993f96fd6

Don't allow logging in with empty password.  

Some authentication methods allowed it, others did not. In the client-side,
libpq does not even try to authenticate with an empty password, which makes
using empty passwords hazardous: an administrator might think that an
account with an empty password cannot be used to log in, because psql
doesn't allow it, and not realize that a different client would in fact
allow it. To clear that confusion and to be be consistent, disallow empty
passwords in all authentication methods.  

All the authentication methods that used plaintext authentication over the
wire, except for BSD authentication, already checked that the password
received from the user was not empty. To avoid forgetting it in the future
again, move the check to the recv_password_packet function. That only
forbids using an empty password with plaintext authentication, however.
MD5 and SCRAM need a different fix:  

* In stable branches, check that the MD5 hash stored for the user does not
not correspond to an empty string. This adds some overhead to MD5
authentication, because the server needs to compute an extra MD5 hash, but
it is not noticeable in practice.  

* In HEAD, modify CREATE and ALTER ROLE to clear the password if an empty
string, or a password hash that corresponds to an empty string, is
specified. The user-visible behavior is the same as in the stable branches,
the user cannot log in, but it seems better to stop the empty password from
entering the system in the first place. Secondly, it is fairly expensive to
check that a SCRAM hash doesn't correspond to an empty string, because
computing a SCRAM hash is much more expensive than an MD5 hash by design,
so better avoid doing that on every authentication.  

We could clear the password on CREATE/ALTER ROLE also in stable branches,
but we would still need to check at authentication time, because even if we
prevent empty passwords from being stored in pg_authid, there might be
existing ones there already.  

Reported by Jeroen van der Ham, Ben de Graaff and Jelte Fennema.  

Security: CVE-2017-7546

CVE-2017-7547 允许未授予USAGE权限的用户读取foreign server配置

这个漏洞和foreign server有关,通常某个用户u1要使用FOREIGN SERVER需要分为几个步骤。

1、创建foreign server S1,里面包含SERVER的连接信息。

2、赋予foreign server S1的usage权限给某个用户u1。(本漏洞所在。)

3、基于这个foreign server S1创建u1的user mapping,里面包含登陆这个foreign server的信息。

4、现在u1可以基于这个foreign server S1创建外部表。

现在的漏洞是,没有操作第2步,普通用户u1可以查询pg_user_mapping表,得到登陆这个foreign server的信息(例如连接这个外部server的用户和密码)。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=e568e1eee4650227170cf8c64eedb74bafd7d1f0

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=3eefc51053f250837c3115c12f8119d16881a2d7

Again match pg_user_mappings to information_schema.user_mapping_options.  

Commit 3eefc51053f250837c3115c12f8119d16881a2d7 claimed to make
pg_user_mappings enforce the qualifications user_mapping_options had
been enforcing, but its removal of a longstanding restriction left them
distinct when the current user is the subject of a mapping yet has no
server privileges.  user_mapping_options emits no rows for such a
mapping, but pg_user_mappings includes full umoptions.  Change
pg_user_mappings to show null for umoptions.  Back-patch to 9.2, like
the above commit.  

Reviewed by Tom Lane.  Reported by Jeff Janes.  

Security: CVE-2017-7547

https://git.postgresql.org/gitweb/?p=postgresql.git;a=blobdiff;f=src/test/regress/expected/foreign_data.out;h=927d0189a0c26c5875cbe5af44d71d3819bd34eb;hp=7f2f529393d6682a69702cb32d3975074b97f87d;hb=e568e1eee4650227170cf8c64eedb74bafd7d1f0;hpb=bf6b9e94445610a3d84cf9521032fab993f96fd6

已修复后,例子

-GRANT USAGE ON FOREIGN SERVER s10 TO regress_unprivileged_role;
--- owner of server can see option fields
+CREATE USER MAPPING FOR regress_unprivileged_role SERVER s10 OPTIONS (user 'secret');  

+-- unprivileged user cannot see any option field
 SET ROLE regress_unprivileged_role;
 \deu+
               List of user mappings
  Server |         User name         | FDW options
 --------+---------------------------+-------------
  s10    | public                    |
+ s10    | regress_unprivileged_role | -- 未修复时,这里会显示user 'secret'
  s4     | regress_foreign_data_user |
  s5     | regress_test_role         |
  s6     | regress_test_role         |

老版本要修复这个问题,请参考 https://www.postgresql.org/about/news/1772/ ,需要修改系统表的信息。

所以,如果你继续使用老版本,你要回收某个用户的foreign server权限,请同时删除user mapping。就不会有问题。

CVE-2017-7548 大对象操作函数lo_put()未检测写权限

漏洞描述:

在没有某个大对象的UPDATE权限时,用户依旧可以使用lo_put()函数操作这个大对象。

修复后,需要赋予这个大对象UPDATE权限,才可以调用lo_put()操作这个大对象。

https://git.postgresql.org/gitweb/?p=postgresql.git;a=commit;h=8d9881911f0d30e0783a6bb1363b94a2c817433d

Require update permission for the large object written by lo_put().  

lo_put() surely should require UPDATE permission, the same as lowrite(),
but it failed to check for that, as reported by Chapman Flack.  Oversight
in commit c50b7c09d; backpatch to 9.4 where that was introduced.  

Tom Lane and Michael Paquier  

Security: CVE-2017-7548

修复后的例子如下

src/test/regress/expected/privileges.out

SET SESSION AUTHORIZATION regress_user1;
1186 SELECT lo_create(1001);
1187  lo_create
1188 -----------
1189       1001
1190 (1 row)
1191
1192 SELECT lo_create(1002);
1193  lo_create
1194 -----------
1195       1002
1196 (1 row)
1197   

1216 GRANT ALL ON LARGE OBJECT 1001 TO PUBLIC;
1217 GRANT SELECT ON LARGE OBJECT 1003 TO regress_user2;
1218 GRANT SELECT,UPDATE ON LARGE OBJECT 1004 TO regress_user2;
1219 GRANT ALL ON LARGE OBJECT 1005 TO regress_user2;
1220 GRANT SELECT ON LARGE OBJECT 1005 TO regress_user2 WITH GRANT OPTION;
1221 GRANT SELECT, INSERT ON LARGE OBJECT 1001 TO PUBLIC;    -- to be failed
1222 ERROR:  invalid privilege type INSERT for large object
1223 GRANT SELECT, UPDATE ON LARGE OBJECT 1001 TO nosuchuser;    -- to be failed
1224 ERROR:  role "nosuchuser" does not exist
1225 GRANT SELECT, UPDATE ON LARGE OBJECT  999 TO PUBLIC;    -- to be failed
1226 ERROR:  large object 999 does not exist
1227 \c -  

1228 SET SESSION AUTHORIZATION regress_user2;  

1299 -- confirm ACL setting
1300 SELECT oid, pg_get_userbyid(lomowner) ownername, lomacl FROM pg_largeobject_metadata WHERE oid >= 1000 AND oid < 3000 ORDER BY oid;
1301  oid  |   ownername   |                                             lomacl
1302 ------+---------------+------------------------------------------------------------------------------------------------
1303  1001 | regress_user1 | {regress_user1=rw/regress_user1,=rw/regress_user1}
1304  1002 | regress_user1 |
1305  1003 | regress_user1 | {regress_user1=rw/regress_user1,regress_user2=r/regress_user1}
1306  1004 | regress_user1 | {regress_user1=rw/regress_user1,regress_user2=rw/regress_user1}
1307  1005 | regress_user1 | {regress_user1=rw/regress_user1,regress_user2=r*w/regress_user1,regress_user3=r/regress_user2}
1308  2001 | regress_user2 | {regress_user2=rw/regress_user2,regress_user3=rw/regress_user2}
1309 (6 rows)  

+SELECT loread(lo_open(1001, x'20000'::int), 32);   -- allowed, for now
+ loread
+--------
+ \x
+(1 row)
+
+SELECT lowrite(lo_open(1001, x'40000'::int), 'abcd');  -- fail, wrong mode
+ERROR:  large object descriptor 0 was not opened for writing  

+SELECT lo_put(1002, 1, 'abcd');                -- to be denied
+ERROR:  permission denied for large object 1002  
时间: 2025-01-20 19:30:37

解读2017-08-10发布的几个安全漏洞的相关文章

元旦技术大礼包 - 2017金秋将要发布的PostgreSQL 10.0已装备了哪些核武器?

标签 PostgreSQL , 10.0 , 金秋 , 元旦 , 大礼包 , commitfest 背景 早上送给大家的新年大礼包,一年一个大版本是PostgreSQL社区的传统,虽然发布时间通常为秋天,还有一段时间,但是已经迫不及待地想看看2017金秋将要发布的10.0版本已经装备了哪些核武器. 放心,还会有一波又一波的feature和增强搭上开往2017金秋的列车,本文提到的可能只是其中的某一节车厢沃,PGer是不是开始有一点振奋人心的感觉啦. 1. 并行计算专属动态共享内存区,(加速索引扫

Sitecore 9 Initial版本于2017年10月成功发布

Sitecore于2017年10月刚刚发布了最新Sitecore 9 Initial版本,请下载附件PDF文件详细了解Sitecore 9带来的最新的特性! 可以从下面官方地址下载任何版本的Sitecore:https://dev.sitecore.net/. 唯一需要注意的是:Sitecore 9版本需要SQL Server 2014 SP2,尤其是其xDB功能需要SQL Server 2016 SP1.MongoDB和Oracle数据库版本的xDB还需要等待一段时间. 欢迎咨询任何Sitec

解读2017企业网防火墙魔力象限,这四家变化最吸引眼球!

本文讲的是 :  解读2017企业网防火墙魔力象限,这四家变化最吸引眼球!  , [IT168 评论]在业界提起Gartner,多少厂商梦寐以求进入魔力象限中,但是很多厂商成立10几年或更长时间都不曾进入,近日,Gartner发布了2017年企业防火墙魔力象限(Magic Quadrant)报告,Gartner报告从愿景的前瞻性和对战略的执行力两个维度对厂商进行衡量和评估,通俗点讲就是技术领先性和市场份额,而这四家变化最吸引眼球! ▲2017年企业防火墙魔力象限 横轴:前瞻性(Completen

软件测试产业迅猛发展 解读2017年六大趋势

2016年,近40%的公司在实施软件测试技术,并且扩大了采用力度.另有30%的公司计划在未来12个月内采用软件测试技术. 迅猛发展的互联网将我们带入了软件测试时代,软件测试已经成为发展中不可或缺的力量支撑,那些专注于数据挖掘和数据服务的公司同样成为不可低估的新兴力.在已经走完的2016年里,我们见证了软件测试的应用与变革,2017年,软件测试的世界又将发生怎样的变化? 软件测试产业迅猛发展 解读2017年六大趋势 软件测试的发展 在预测未来之前,先来看看软件测试近四年的发展.2013年被称为软件

英特尔澄清:第一款10nm产品2017年定发布

几天之前我们曾报道称,英特尔的 10 纳米工艺可能将再一次跳票至 2018 年.因为英特尔官网一份有关上月 21 日"资本分析(Capital Analyst)"会议的内容显示,位于以色列迦特镇的 Fab 28 晶圆厂将在"大约两年内投产 10纳米",并且该预案经常将作为量产最新 10 纳米工艺的龙头工厂.因此不免让人认为,英特尔 10 纳米工艺还可以等至 2018 年 1月份才开始量产. 有意思的是,在有关"英特尔 10 纳米量产推迟的至 2018年&q

数学分析高等代数考研试题荟萃[更新至2017年10月1日]

数学分析高等代数考研试题荟萃[更新至2017年10月1日], 需要的话见: http://www.followmath.com/forum.php?mod=viewthread&tid=469   10001北京大学2016-2017-1高等代数I期末考试试题   10001北京大学87,96-14,17年数学分析考研试题   10001北京大学96-02,07,08,10-14 年高等代数考研试题   10002中国人民大学99,00,03,04,07 年数学分析考研试题   10002中国人

RSA 2017 花甲科技发布端安全“全能战士”S-TEE

本文讲的是RSA 2017 花甲科技发布端安全"全能战士"S-TEE,2017年2月14日,北京花甲科技在RSA2017首次海外发布了下一代端安全产品S-TEE,该产品颠覆了传统移动安全技术,重新定义了包括移动端和物联网的安全,可以称之为端安全的全能战士. 这是花甲科技继去年在美国RSA上发布公司第一代安全产品Securitystack之后,又一次在全球瞩目的安全盛会上发布自己的新产品.这表明了这家企业对技术的不断追求和对自家产品的充分自信. S-TEE是为应用端的核心逻辑和数据提供灵

WildFly Swarm 2017.6.0 发布,Java 应用服务器

WildFly Swarm 2017.6.0 发布了. 新特性 More YAML less main() Update to WF Camel 4.7.0 发布页详情 下载地址 WildFly是红帽公司新一代应用服务器.支持动态模块化.集中化管理.Java EE 7,而WildFly swarm是WildFly的微服务化支持,和spring boot类似.但是WildFly swarm完整的支持JAVA EE的准标. WildFly Swarm采取的可执行文件"uberjars"打包

Spring Integration 4.3.10 发布,Spring 消息通信

Spring Integration 4.3.10 发布了.Spring Integration 能在基于 Spring 的应用中进行简单的消息通信,并通过简单的适配器与外部系统集成.这些适配器提供了一个更高级别的抽象,超越了 Spring 对远程调用.消息和调度的支持.其主要目标是在保持关注点分离的同时,为构建企业集成解决方案提供一个简单的模型,该模型对产出可维护.可测试的代码来说是必不可少的. 更新内容: Bug [INT-4248] - RedisLockRegistry does not

TeamCity 2017.1.2 发布,持续集成工具

TeamCity 2017.1.2 发布了. TeamCity 是一款功能强大的持续集成(Continue Integration)工具,包括服务器端和客户端,目前支持 Java,.Net 项目开发. TeamCity 提供一系列特性可以让团队快速实现持续集成:IDE 工具集成.各种消息通知.各种报表.项目的管理.分布式的编译等等,所有的这些都是让你的团队快速享有持续继承带来的效率提升.高质量的软件保障. 部分更新内容: Feature TW-46594 - 检测并向管理员报告不正确的代理服务器