netlinkソケットの解析

netlinkソケットは,ユーザ→カーネルの通信のために使われる。

普通のread, writeアクセスベクタのチェックのほかにさらに詳細なチェックが行われる。特に,オブジェクトクラス「netlink_audit_socket(Linux Auditing System(LauS)と通信するためのnetlinkソケット」を見てみると,
以下のアクセスベクタが定義されている。
nlmsg_relay
nlmsg_write
nlmsg_read
nlmsg_readpriv

これらの意味を解析してみよう。結論は下を見てね。
netlinkソケットで送信する時の

3573 static int selinux_netlink_send(struct sock *sk, struct sk_buff *skb)
3574 {
…
3590         if (policydb_loaded_version >= POLICYDB_VERSION_NLCLASS)
3591                 err = selinux_nlmsg_perm(sk, skb);

selinux_nlmsg_permでこれらはチェックされる。

3401 static int selinux_nlmsg_perm(struct sock *sk, struct sk_buff *skb)
3402 {
…
3415         err = selinux_nlmsg_lookup(isec->sclass, nlh->nlmsg_type, &perm);★1
…
3432         err = socket_has_perm(current, sock, perm);★2

★1:selinux_nlmsg_lookupでセットされた「perm」が★2で実際にチェックされる。

selinux_nlmsg_lookupでpermに何がセットされるか?

● security/selinux/nlmsgtab.c
147         case SECCLASS_NETLINK_AUDIT_SOCKET:
148                 if (nlmsg_type >= AUDIT_FIRST_USER_MSG &&
149                     nlmsg_type <= AUDIT_LAST_USER_MSG) {
150                         *perm = NETLINK_AUDIT_SOCKET__NLMSG_RELAY;
151                 } else {
152                         err = nlmsg_perm(nlmsg_type, perm, nlmsg_audit_perms, ★3
153                                          sizeof(nlmsg_audit_perms));
154                 }
155                 break;

★3のnlmsg_permでセットされる。
nlmsg_typeをpermに変換するものだ。

以下のルールで変換される。

● security/selinux/nlmsgtab.c
 95 static struct nlmsg_perm nlmsg_audit_perms[] =
 96 {
 97         { AUDIT_GET,            NETLINK_AUDIT_SOCKET__NLMSG_READ     },
 98         { AUDIT_SET,            NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
 99         { AUDIT_LIST,           NETLINK_AUDIT_SOCKET__NLMSG_READPRIV },
100         { AUDIT_ADD,            NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
101         { AUDIT_DEL,            NETLINK_AUDIT_SOCKET__NLMSG_WRITE    },
102         { AUDIT_USER,           NETLINK_AUDIT_SOCKET__NLMSG_RELAY    },
103         { AUDIT_SIGNAL_INFO,    NETLINK_AUDIT_SOCKET__NLMSG_READ     },
104 };
105 

例えば,
AUDIT_GETなnetlink_audit_socketを使う時は,NETLINK_AUDIT_SOCKTE__NLMSG_READつまり「nlmsg_read」パーミッションがチェックされることを意味する。
「AUDIT_GET」が何を意味するか。
/include/linux/audit.hに書いてある。「get status」と書いてある。恐らく,LauSの状態を得るためだろう。
ただ、例外があってAUDIT_FIRST_USER_MSG〜AUDIT_LAST_USER_MSGが送られた場合(PAMなどがLauSに送信するログメッセージ)は,
nlmsg_relayがチェックされる(148〜150のif文)。
これはAUDIT_USERが廃止されたことによる。

結論:netlink_audit_socketのアクセスベクタの意味

こんな感じで見ていくと,以下の結論を得る。
nlmsg_read:LauSのステータスを得るためのパケットをLauSに送信
nlmsg_write:LauSの設定変更のためのパケットをLauSに送信
nlmsg_relay:LauSにユーザ空間からログメッセージを送信
nlmsg_readpriv: LauSのログ取り設定情報を得るためのパケットをLauSに送信。

capabilityのaudit_write, audit_controlは不要じゃん。