2007年6月15日

[selinux-users:01912] cap_overrideオブジェクトクラス

海外です

本家のSELinux-MLでは、Stephen Smalley の投稿した
"enable: authoritative granting of capabilities" のパッチの話題で
非常に盛り上がっているようです。

私も、これはある種エポックメイキングなパッチだと思います。

実際にコードを見てみると早いのですが、下の selinux_capable() というのは、
カーネルの中で root 特権をチェックする capable() 関数の延長でコールされる
SELinuxのLSMフックです。

------------------------------------------------------------------
static int selinux_capable(struct task_struct *tsk, int cap)
{
+ struct task_security_struct *tsec = tsk->security;
+ u32 sid = tsec->sid;
int rc;

- rc = secondary_ops->capable(tsk, cap);
- if (rc)
- return rc;
+ rc = avc_has_perm_noaudit(sid, sid, SECCLASS_CAP_OVERRIDE,
+ CAP_TO_MASK(cap), 0, NULL);
+ if (rc) {
+ rc = secondary_ops->capable(tsk, cap);
+ if (rc)
+ return rc;
+ }

return task_has_capability(tsk,cap);
}
------------------------------------------------------------------
今までは、以下の手順でチェックが行なわれていました。

1. プロセスが root ケーパビリティ cap を持っている
2. セキュリティポリシーで allow 俺 self:capability { ... } されている
→ この2つの条件を満たせばroot特権を使える。

Stephen のパッチを適用すると、この動作が以下のように変わります。
1. セキュリティポリシーで allow 俺 self:cap_override { ... } されている
ことを確認
2. もし、(1)が_禁止_されていたら、プロセスが root ケーパビリティ cap を
持っていることを確認。NGだったら即座にdenyを返す。
3. セキュリティポリシーで allow 俺 self:capability { ... } されている
ことを確認

つまり、今までは SELinux を適用した環境であっても、root特権を必要とする
操作には SetUID プログラムが必要だったのを、ドメイン遷移によって記述で
きてしまうということになります。

例えば、passwdコマンド(passwd_exec_t)の実行によって passwd_t ドメインに
遷移して、passwd_t ドメインに cap_override:{ dac_override } パーミッション
を付けておけば、もはや passwd コマンドが SetUID である必要がないという
仕掛けです。

# passwd は /etc/shadow を参照/編集するために root 特権が必要

言われてみるとナルホドー、ですが、これを思いつくのは凄いですね。
--
KaiGai Kohei <kaigai@xxxxx>

投稿者 xml-rpc : 2007年6月15日 19:00
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/60233
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。