[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 メーリングリストの案内