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は不要じゃん。