SEEditサイズ最適化機能

KaiGaiさんのアイデア(昨日のコメント)である、
「マクロの代わりに、attributeを使う」
というのをやってみた。
どうするかというと、、、
allow_file_rというマクロがあるとする。
で、以下のように使われているとする。
allow_file_r(foo_t, bin_t)
allow_file_r(bar_t, bin_t)
allow_file_r(hoge_t, bin_t)
これは、実は下のように書きなおせる。
attribute allow_file_r_bin_t_attr;
allow_file_r(allow_file_r_bin_t_attr);
typeattribute foo_t, allow_file_r_bin_t_attr;
typeattribute bar_t, allow_file_r_bin_t_attr;
typeattribute hoge_t, allow_file_r_bin_t_attr;

こうすると、マクロを3つ使っていたのが、1つになる。
マクロで沢山のパーミッションを許可している場合は、
ポリシのダイエット効果がある。

ちょろっと、SEEditのSPDLコンパイラに実装してみた。
結果。。。。
policy.21のサイズが、

  • Before ダイエット: 175k
  • After ダイエット: 108k

40%近く減量できた!

実は、全てのマクロをattributeに置き換えればいいわけではない。
以下の条件を満たさない場合、逆効果になることもある
(type attribute文の分だけ増量しちゃうことも)

  • 条件1: マクロが多くのドメインによって使われていること
    • どうやら3つ以上が閾値
  • 条件2: マクロの中で二つ以上のオブジェクトクラス、タイプに対するallowがあること
    • 実は、マクロの中で一つしかallowがなくとも、typeattributeのほうがallowより微妙に小さく、多少のダイエット効果はある

特に「条件1」が重要。
SPDLコンパイラに「プロファイルモード」を作って、
マクロの利用頻度を解析。利用頻度が高いマクロに対してだけ、マクロ→属性変換
させるようにした。

この考え方、
SEEditだけでなく、refpolicyにも適用できないんだろうか。
バイナリポリシを直解析して、属性にまとめることができないのか?
とKaiGaiさんの案。
なんとなくだが、大変そう。
「type, アクセスベクタパーミッション」の任意の集合のうち、
「多くのドメインに共通して使われる組み合わせ」を発見する必要がある。
これって、なんとなくだが、遺伝的プログラム等で解く問題と似てそう。。。

refpolicyに使われているマクロに対して、
マクロ利用頻度をカウントするプログラムを作ったほうが早いかもしれない。

おっと、某KaiGaiさんのところでもこのネタが。
http://kaigai.sblo.jp/
相互リンクしとこう。
「SEDiet」か。いいネーミングだ。

KaiGaiさんのところが、システム不調か何かでコメントができないので、ここに。
面白いネタありがとうございます。
ATTRIBUTE後の絵ですが、
この絵の状態では、
ドメインごとにtypeattribute文が一ついるので、
ルール数が変わらないことに注意が必要です。
aaa_typeにひもづけられるallowの数が決めてです。
typeattributeのバイナリ表現を短くできれば、
aaa_typeに一つしかallowを紐付けられなくても、ダイエット効果は大きいかも。

さらなるSEDiet

dir searchパーミッションを省略
allow domain file_type:dir search;
としてしまうと、SEEditではさらに、ダイエットできる。
このパーミッションを意味あるものにするために、
dir_hogehoge_tというタイプを余分に定義し、ファイル関連のルール数が2倍近くになっているからだ。
http://d.hatena.ne.jp/himainu/20060217
これも検討してみようかなぁ。