一般ユーザで起動すると、root認証を求められるアプリの作り方

OSC会場だけど、まだ人の入りが悪くて退屈なので、
暇つぶしに。。。

よく、一般ユーザーで実行すると、ポップアップが出てきて、
root認証が促されることがある。
system-config-networkとか。
隣のintrajpさんに聞かれたので、書いてみる。

例として、
/usr/sbin/testapp
中身は下

#!/bin/sh
echo hoge
id

1)
# chmod +x /usr/sbin/testapp
# ln -s /usr/bin/consolehelper /usr/bin/testapp

2)/etc/pam.d/testappを以下のように作成。

auth            include         config-util
account         include         config-util
session         include         config-util


3) /etc/security/console.apps/testappseedit-gui を以下。

USER=root
PROGRAM=/usr/sbin/testapp
SESSION=true

さあ起動しよう。

$ testapp
root認証を求められるポップアップが出てくる。
認証成功すると。。。

hoge
uid=0(root) gid=0(root) context=system_u:system_r:unconfined_t

testappがrootで動いている!

仕組みは、
/usr/bin/testappからリンクされてるconsolehelperが、
ポップアップ出して、/usr/sbin/testappを起動してくれてる。

read/write再チェックの意義

OSCで、PANDAさんに色々教えてもらった。
SELinuxは、
ファイルopen -> read/write
というときに、open, read,write両方の時にパーミッションチェックを行う。
TOMOYO Linuxとかはopen時にしかチェックを行わない。

SELinuxのようにread/write時にもチェックを行うのは意味がある。
open後に、ポリシが変更になって、アクセス拒否になった場合など。
http://d.hatena.ne.jp/himainu/20070830#1188480411
↑で扱ったネタ。

ただ、これでも、まだ抜けがあるとのこと。

  • 1)mmapした場合

read/write使わずに、ファイルアクセスできてしまうので、ポリシが変更になってもそれが反映されない

  • 2)メモリ上に読み込んだデータについて

たとえば、
hoge_tドメインのプロセスが、/etc/shadowをopenして、
buf[100000]に読み込んだとする。
この後、ポリシが変わって、hoge_tが/etc/shadowにアクセスできなくなった場合、
なおもhoge_tは、buf[10000]を読むことで /etc/shadowの内容を知れてしまう。