ユーザ定義関数

PostgreSQLに限らず、多くのRDBMSでは CREATE FUNCTION 構文を使って、ユーザ自身で SQL関数を定義することができる。
しかし、素性のよく分からないユーザ定義関数の実行を許すことで、システムに思わぬ穴を開けてしまうことがある。

↓の記事はその一例
「ユーザー定義関数の脆弱性に異例の勧告,任意のコードを実行される恐れ」
http://itpro.nikkeibp.co.jp/article/COLUMN/20070218/261938/?ST=oss

いわば、SUIDプログラムの$PATH上に悪意のあるコードを置いておき、それを高い権限に昇格したコンテキストから呼び出すというものだ。

SE-PostgreSQLの場合、一般ユーザ(user_tやhttpd_t)が定義した関数には sepgsql_user_proc_t というタイプを付与する。この関数は、管理者ユーザ(unconfined_t)などからは実行することができない。
これによって、高い権限で素性の怪しい関数を実行することを抑止できる。管理者はユーザ定義関数が無害であることを確認し、sepgsql_proc_tにラベルを変更することで、この関数を実行できるようになる。
もちろん、一般ユーザは relabelfrom/relabelto の権限を持っていないので、勝手にセキュリティコンテキストを変更することができない。

とまぁ、こんな使い方ができるようにしてみた。