dir:searchの扱いについて。
以前から気になっていたもの。改めて考え直し、実装。
dir:searchのチェックされる箇所
これ単体で攻撃者は何ができる?
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に変えると動くが、これはよい解決ではない。明日直す