2007-05-13

【PostgreSQL观察】第36回 PostgreSQL的安全补丁(二)(简体)

更新:2007-05-13
對映章節:
http://itpro.nikkeibp.co.jp/article/COLUMN/20070507/270174/?ST=oss&P=2

利用临时schema的攻击
PostgreSQL具有“临时表”功能,仅在session期间有效,可以被短时间使用。这些临时表放在一个特殊的数据表“临时schema”中,同样包含在pg_catalog中,比其他schema优先被搜索。
也就是,利用pg_catalog进行同样方式的攻击是可能的,这就是这次新发现的安全脆弱性。
这个安全漏洞的编号是CVE-2007-2138

难于对策的利用临时schema的攻击
可以采取与上次同样的对策,设定适当的schema搜索路径,但是这里有一个问题:临时schema的名字不是固定的。
在psql中利用\dn命令看一下就可以知道这一点:
test=> CREATE TEMP TABLE t1(io int);
CREATE TABLE

test=> \dn
  List of schemas
  Name      | Owner
--------------------+---------
information_schema  | t-ishii
pg_catalog      | t-ishii
pg_temp_1      | t-ishii
pg_toast       | t-ishii
public        | t-ishii
(5 rows)

pg_temp_1就是临时schema,“_1”部分是根据session变化的。

假想schema名「pg_temp」的引进
本次的安全性补丁引进了表示临时schema的假想schema叫做“pg_temp”,将它放在schema搜索路径的最后就可以。
从上边的说明可以看出,这个安全对策仅仅做PostgreSQL的版本升级是不够的,在使用SECURITY DEFINER函数的地方必须修正schema搜索路径明确指定使用pg_temp。
详细情况可以查阅PostgreSQL技术手册中的CREATE FUNCTION命令,慎重起见在这里预先说明一下。另外,这里
的函数是用PL/pgSQL编写。

(1)保存现在的schema搜索路径、设置新的路径:
old_path := pg_catalog.current_setting('search_path');
PERFORM pg_catalog.set_config('search_path', 'admin, pg_temp', true);
在函数的最开始增加这两行代码。
关键点是,schema搜索路径仅仅包含用户不能创建对象的schema(例子中是admin),而pg_temp要放在最后。因为public schema任何用户都可写入,搜索路径中最好不要包含它。函数中使用public对象的地方,显式地使用schema修饰符,例如:public.t1。
set_config()最后的参数为true,意味着当函数中发生错误而将事务中断的时候,将重新设定的schema搜索路径返回原始设置。这个也是很重要的。

(2)执行通常的函数处理
没什么特别的变动。

(3)
将schema搜索路径返回初始设定
PERFORM pg_catalog.set_config('search_path',old_path,true);
这个要写在return语句前边。

新发布的版本
实现以上对策的版本是:8.2.4、8.1.9、8.0.13、7.4.17、7.3.19,如果正在使用SECURITY DEFINER函数的话,尽快作版本升级是非常必要的。再者,单纯做版本升级是没有用的,必须注意还需要修改函数。因为SQL函数难于对应,使用PL/pgSQL将它重写吧。
另外,本次发布的补丁包括VACUUM FULL可能破坏数据等比较重要的bug修正,即使没有使用
SECURITY DEFINER函数,也推荐进行版本升级。

沒有留言:

PostgreSQL & Google-Analytics Running...

::Planet PostgreSQL::

PostgreSQL Information Page

PostgreSQL日記(日本 石井達夫先生Blog)

PostgreSQL News

黑喵的家 - 資料庫相關

Google 網上論壇
PostgreSQL 8 DBA 專業指南中文版
書籍內容討論與更多下載區(造訪此群組)
目錄下載: PostgreSQL_8 _DBA_Index_zh_TW.pdf (更新:2007-05-18)

全球訪客分佈圖(Google)

全球訪客分佈圖(Google)