Tetsuo Handa
from-****@I-lov*****
2008年 6月 10日 (火) 21:49:20 JST
熊猫です。 > うーん。何かスジに悪さを感じます。将来的にまた問題になりそうな気も。 では、 /etc/ccs/ ディレクトリが存在しなかった場合には disable が指定された ものとして扱うということにしたいと思います。 /etc/ccs/ ディレクトリが存在するものの /etc/ccs/profile.conf が存在しない 場合にはプロンプトが出ます。 /etc/ccs/ ディレクトリは init_policy.sh を実行することで作成されます。 > # /usr/lib/ccsがROなシステムって想定できなくはないような。> Embeded方面で 所詮 /sbin/ccs-init はシェルスクリプトですし、特定の環境向けに特化する場合には 専用のスクリプトなりバイナリファイルなりにしてしまえばいいわけであって、 /usr/lib/ccs/ が RO なシステムが存在していたとしても大丈夫でしょう。 > まだproposed(候補)なだけで、リリースがかかってないだけだと > 思います。たぶん。 あ、そういうことでしたか。なるほど。 > 悪意ある攻撃者が/usr/lib/ccs以下を殲滅して再起動、という攻略シナリオは > 防げませんが、それ言ったら /etc/sysconfig/selinux を編集されると終わる、 > とかあるわけで、人災だけ防げればいいかなと。 そういう操作を行うアクセス許可を与えた時点でゲームオーバーですからね。 まだ書きかけですが、↓のようなページを作成してみました。 http://tomoyo.sourceforge.jp/wiki/?TOMOYO-1.6-TIPS 1.6.1 以降の変更点としては、以下のようになっています。 現在のリビジョンは 1281 です。 カーネルに関して (1) 対話的にポリシー違反を処理するツールである ccs-queryd をもっと 使いやすくするために /proc/ccs/query から取得できる情報を増やす。 変更前 ・ドメイン名+要求されたアクセス許可の内容だけ (学習機能により自動生成された /proc/ccs/domain_policy 相当) 変更後 ・時刻+プロセス情報+ドメイン名+要求されたアクセス許可の内容 (ログ生成機能により出力された /proc/ccs/reject_log 相当) (2) ポリシー違反の発生を通知するツールである ccs-notifyd をもっと活用 できるようにするために ALLOW_ENFORCE_GRACE のチェック位置を移動させる。 変更前 ・ /proc/ccs/query からの読み出し時に /proc/ccs/profile が ALLOW_ENFORCE_GRACE=enabled となっているかどうかのチェックを行う ・ /proc/ccs/query への書き込み時には /proc/ccs/manager に登録されているかどうかのチェックを行う 変更後 ・ /proc/ccs/profile からの読み出し時には /proc/ccs/profile が ALLOW_ENFORCE_GRACE=enabled となっているかどうかのチェックを 行わない ・ /proc/ccs/query への書き込み時に /proc/ccs/manager へ登録されているかどうかのチェックと /proc/ccs/profile で ALLOW_ENFORCE_GRACE=enabled となっているか どうかのチェックを行う この変更により、 ccs-notifyd が /proc/ccs/query からの読み出しだけを 行う場合には ALLOW_ENFORCE_GRACE=disabled のままで動作できるようになる。 (3) ロケールファイルはどのようなプログラムから参照されても困らないので /proc/ccs/exception_policy の allow_read で指定をしやすくするために 以下のように変更する。 変更前 ・パターンを許容しない 変更後 ・パターンを許容する(例: allow_read /usr/share/locale/\*/\*/\* ) これは、 Ubuntu の LiveCD でデモをするときに ls とか cat が大量の ロケールファイルを参照してしまうのを回避するための修正。 (4) 不具合修正:カーネル 2.6.22 以降で /proc/PID/fd/ 経由でパイプを open() した際のパス名が pipe:[\$] ではなく pipe: となってしまっていたのを修正。 (5) 不具合修正: /proc/ccs/ 以下のファイルを open() する際に読み書きモードを チェックしていなかったので、読み込みモードでの open() なのに書き込み用 バッファを割り当ててしまうという無駄なメモリ消費が発生していたのを修正。 (6) 不具合修正:カーネル 2.4.x の call_usermodehelper() は実行された プログラムの終了を待つことができない。そのため、 /proc/ccs/meminfo の close() を以て /sbin/ccs-init によるポリシーのロードが完了したと みなすようにしていた。しかし、 TOMOYO 1.6.1 で Memory Quota をサポート したことにより /sbin/ccs-init から呼ばれる /etc/ccs/ccs-post-init が /proc/ccs/meminfo へのアクセスを行ってしまうようになり、 /sbin/ccs-init の 処理が最後まで行く前に /sbin/init が開始されてしまう危険性が増したので、 根本的な解決策として /sbin/ccs-init の終了を待つように修正。 修正前 ・ /proc/ccs/meminfo が close() されるまで待つ 修正後 ・ /sbin/ccs-init が exit() されるまで待つ (7) 不具合修正: CONFIG_SAKURA=y CONFIG_TOMOYO=n の場合、 CONFIG_TOMOYO_MAX_ACCEPT_ENTRY と CONFIG_TOMOYO_MAX_GRANT_LOG と CONFIG_TOMOYO_MAX_REJECT_LOG が定義されていないことにより fs/ccs_common.c がコンパイルエラーとなってしまっていたのを修正。 ツールに関して (1) ccs-queryd が表示する内容が ccs-auditd と同様になり、対話的に判断する際に 参考にできる情報が増える。また、 /proc/ccs/query にプロセスIDが含まれる ようになったことにより、 ccs-queryd はプロセスIDをキーとしてセパレータ ( ------ という行)を挿入するようになり、対象プロセスが変化したことを 認識しやすくなる。 (2) ccs-notifyd の通知機能と保留機能の内、通知機能だけを使う場合には /proc/ccs/profile の ALLOW_ENFORCE_GRACE が disabled のままで 動作するようになる。これにより、「ポリシー違反は通知してほしいが 対話的な操作は行うつもりはない」という場合に容易に ccs-notifyd を 活用できる。 (3) /sbin/ccs-init が /etc/ccs/ ディレクトリが存在しない場合には 入力待ちをするのではなく無効モードとして動作するようになる。 これは、 TOMOYO が組み込まれているカーネルを使っているユーザが TOMOYO を有効化する意図が無いのに ccs-tools パッケージを 導入してしまうことにより、シャットダウンが入力待ちで停止してしまうのを 避けるための仕様変更。 (4) init_policy.sh が /proc/プロセスID/fdinfo/番号 というパス名の最後の 部分を \$ でパターン化できていなかったのを修正。また、パターンを含まない /proc/self/ 以下のエントリが file_pattern として生成されないように修正。 (5) /sys/ 以下をアクセスするプログラムは限られているとはいえ、全部同一視 してしまうのは乱暴すぎるので、 init_policy.sh が /sys/ 以下のファイルを パターン化しないように修正。 (6) アクセスログから if 節付きの allow_execute 文を生成するツールを追加。 これを使うと、学習モードで生成する場合には考慮されない「プログラム実行時の 引数を考慮したアクセス許可」を生成できる。特定のコマンドを実行するために シェルを実行する必要がある場合に有効。 (7) /etc/ccs/ccs-post-init から Memory Quota を指定した場合、 /sbin/ccs-init によるメモリ消費量表示が現在の消費量ではなく上限値を 表示するようになっていたのを修正。 diff -ur --exclude .svn --exclude specs --exclude patches tags/ccs-patch/1.6.1/ trunk/1.6.x/ccs-patch/ | diffstat README.ccs | 45 +++++++++++++ fs/ccs_common.c | 148 +++++++++++++++++++++++++++++++-------------- fs/realpath.c | 46 +++++++++++++ fs/sakura_chroot.c | 4 - fs/sakura_maymount.c | 5 - fs/sakura_mount.c | 14 ++-- fs/sakura_pivot.c | 5 - fs/sakura_umount.c | 5 - fs/tomoyo_capability.c | 9 +- fs/tomoyo_domain.c | 5 - fs/tomoyo_env.c | 6 - fs/tomoyo_exec.c | 6 - fs/tomoyo_file.c | 27 +++++--- fs/tomoyo_network.c | 7 -- fs/tomoyo_signal.c | 8 -- include/linux/ccs_common.h | 6 - 16 files changed, 250 insertions(+), 96 deletions(-) diff -ur --exclude .svn tags/ccs-tools/1.6.1/ccstools/ trunk/1.6.x/ccs-tools/ccstools/ | diffstat Makefile | 2 ccs-init | 12 +---- ccs-notifyd.c | 22 +++++++--- ccstools.src/ccs-queryd.c | 99 +++++++++++++++++++++++++++++++++++++++++---- ccstools.src/ccstools.c | 4 - ccstools.src/checkpolicy.c | 4 - init_policy.sh | 26 +++++------ 7 files changed, 131 insertions(+), 38 deletions(-)