[pgsql-jp: 38061] Re: Advisory on possibly insecure security definer functions

Tatsuo Ishii ishii @ sraoss.co.jp
2007年 2月 21日 (水) 12:42:47 JST


石井です.

> 片岡です。
> 
> ISHIDA Akio wrote:
> > こんにちは。石田@苫小牧市です。
> 
> > アドバイザリの内容は、SECURITY DEFINERを指定した
> > pl/pgsql等の関数では、必ず set search_pathを明示的に
> > 指定しましょうというものです。
> > 
> > 但し、石井さんの記事にもあるようにSQL関数に関しては
> > set search_pathによる対応はできません。
> > SECURITY DEFINERが必要なSQL関数があれば、
> > pl/pgsqlで書き直してしまうのが良いと思います。
> 
>  スキーマが重要な場合には、単に“スキーマ名.オブジェクト名”で指定すれば
> いいと思います。

日経IT Proの記事にも書きましたが,それはほとんど無理です.

記事中には,

INSERT INTO t1(i) VALUES (mod($1, $2)+10);

-->

INSERT INTO t1(i) VALUES (pg_catalog.mod($1, $2) operator(pg_catalog.+) 10);

のような例をあげました.これだけでも十分面倒ですが,実際にはオペレータ
とか関数とかデータ型そのほかすべてスキーマ名.オブジェクト名に書き換え
なければなりません.ですから,単純なWHERE句付きのSELECT:

SELECT * FROM t1 WHERE i  = 'abc'::TEXT AND j < 10;

でさえも,少なくともこんな感じになります.

SELECT * FROM public.t1 WHERE i operator(pg_catalog.=) 'abc'::TEXT AND
j operator(pg_catalog.<) 10;

本当は,型も危ないので,TEXT とかスキーマ修飾してあげないといけないの
かもしれませんが,面倒なので省いています.

# というか,暗黙の型変換とかもあり,その場合は外からスキーマ修飾できな
# いので,手のうちようがないのでは?あ,でも内部処理は動的にスキーマサー
# チパスで制御できるからOK?うーん,調査の必要あり.

実用的でない,と言う点に関してはコアメンバーも同様の意見のようです.

やはり石田さんの言うように,PL/pgSQLに書き直すのがもっとも早いと思いま
す.

> Subject: Re: [HACKERS] Fixing insecure security definer functions
> From: Josh Berkus <josh @ agliodbs.com>
> To: pgsql-hackers @ postgresql.org
> Cc: "Zeugswetter Andreas ADI SD" <ZeugswetterA @ spardat.at>,
>         "Peter Eisentraut" <peter_e @ gmx.net>
> Date: Wed, 14 Feb 2007 15:07:24 -0800
> Reply-To: josh @ agliodbs.com
> Organization: Aglio Database Solutions
> User-Agent: KMail/1.8
> 
> Andreas,
> 
> > Have you considered hardcoding the schema for each object where it was
> > found at creation time ? This seems more intuitive to me.
> 
> This isn't practical.  Consider the schema qualification syntax for 
> operators.
> 
> -- 
> --Josh
> 
> Josh Berkus
> PostgreSQL @ Sun
> San Francisco




pgsql-jp メーリングリストの案内