dir:searchの扱いについて。

以前から気になっていたもの。改めて考え直し、実装。

dir:searchのチェックされる箇所

    • 1) may_linkの中で dir:remove_name,dir:add_nameと一緒にチェックされる。
      • may_renameの中で、dir:remove_nameなどと一緒に。
    • 2) ディレクトリに対するMAY_EXECの中でチェックされる。
      • chdir、ファイル名→inode解決の時
    • ファイル名→inode解決するとき, 途中のディレクトリ全部に対してMAY_EXECがチェックされる

これ単体で攻撃者は何ができる?

cd |ディレクトリ| しかできない。
cdの戻り値をみて、ディレクトリの有無を推測できる。
cd /home/ユーザ名 を繰り返すことで、ユーザ名が存在するかどうかの推測に使える。

どのパーミッションに統合しよう?

基本的に「s」パーミッションに統合しておく。
ただ、これだけだと問題がある。
例:
/hoge/foo/bar.txt
というファイルに読み込みアクセス権限を与えたい場合
allowonly /hoge s;
allowonly /hoge/foo s;
allowonly /hoge/foo/ r;
のように書く必要。
「s」の中には、ディレクトリ一覧取得権限が統合されているので
/ /hogeディレクトリ一覧が取得される。

解決方法:
allow /hoge/foo/bar.txtとした場合、
/に対するdir:search
/hogeに対するdir:search
を自動的に許可。

実装(自分専用メモ)

  • allowルール登録時に,ダミーのルールを登録

foo_tドメインで allow /hoge/foo/bar.txtという文があった場合
dummy_tドメイン(ダミーのドメイン、これに対する設定は出力されない)に
allowonly / r, allowoly /hoge r allowonly /hoge/foo r;
という文を登録。
これで、 /, /hoge, /hoge/fooにラベルが付く。
label_dir_list(dir_list)でこれをする。
DOMAIN構造体にdir_listハッシュテーブル追加。
この中に、キー:ディレクトリ名、値:1
のように、使ったディレクトリ名全部登録。

  • 出力時:

ドメイン内部で,全てのallowルールの出力後…
dir_listハッシュに登録されているディレクトリのタイプに対して
allow |domain| |type|:dir search;
を出力。

これだけ実装するのにちょっと時間がかかった。
pythonばっかやってるとC言語が面倒でたまらなくなる…
配列の処理がやっとれません。glib使えばいいのかな。
converterも、きれいに書き直したいなぁ。
ツギハギだらけで、保守が大変になってきた。そろそろ捨て時??

その他 整理

allowkernel/allowpriv/allowseop と分けているのが無駄なので
「特権」はallowprivに一本化。

バグ

上の修正をすると、/etc/selinux/seedit/.../contextにdefault_tというラベルがついてしまう…
add_fileacl_to_domain(DUMMY_DOMAIN_NAME, dir_list[i], READ_PRM, 1);
の1を0に変えると動くが、これはよい解決ではない。明日直す

GUI

XMLを開く、保存、名前をつけて保存を実装。
ロジック部分、データ部分は、seedit/UILogic.pyに分離。