use the netmsg initial SID for NetLabel connections
RFC 1/1 use the netmsg initial SID for NetLabel connections
This is a simple RFC patch for the Reference Policy to go along with the proposed NetLabel kernel changes to use the netmsg initial SID, the kernel change thread can be found here:
* http://marc.info/?t=117394234100037&r=1&w=2
The basic idea is that NetLabel would use the netmsg initial SID as the base/TE context for MLS-only connections and the unlabeled SID for connections that did not have have security attributes at all, true unlabeled connections. The reason for doing this would be to enable us to allow/disallow unlabeled NetLabel traffic on a per-domain basis; something that is not easily possible with the current approach of using the unlabeled SID as the base/TE context for MLS-only connections.
I don't consider the changes below to be complete, there would still need to be changes to all of the user and application domains, but I want to start a conversation on the "right" way to do this. Chris, Dan, I'm especially interested in what the two of you have to say.
FYI: This _really_ is a RFC patch, I haven't even compile tested it, I'm just using it as a starting point for the conversation.
--- policy/mls | 5 policy/modules/kernel/corenetwork.if.in | 88 ++++++++++++++ policy/modules/kernel/kernel.if | 194 +++++++++++++++++++++++++++++--- policy/modules/kernel/kernel.te | 8 + 4 files changed, 276 insertions(+), 19 deletions(-)
policy/mls +3 -2
@@ -182,11 +182,12 @@ mlsconstrain { socket tcp_socket udp_soc (( t1 == mlsnetwritetoclr ) and ( h1 dom l2 ) and ( l1 domby l2 )) or ( t1 == mlsnetwrite )); -# used by netlabel to restrict normal domains to same level connections +# used by netlabel to restrict normal domains to same level connections unless the connection is unlabeled mlsconstrain { tcp_socket udp_socket rawip_socket } recvfrom (( l1 eq l2 ) or (( t1 == mlsnetreadtoclr ) and ( h1 dom l2 )) or - ( t1 == mlsnetread )); + ( t1 == mlsnetread ) or + ( t2 == unlabeled_t )); # these access vectors have no MLS restrictions # { socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket netlink_route_socket netlink_firewall_socket netlink_tcpdiag_socket netlink_nflog_socket netlink_xfrm_socket netlink_selinux_socket netlink_audit_socket netlink_ip6fw_socket netlink_dnrt_socket } { ioctl create lock append bind sendto send_msg name_bind }
policy/modules/kernel/corenetwork.if.in +88 -0
127 lines not on this page · raw message
policy/modules/kernel/kernel.if +178 -16
236 lines not on this page · raw message
policy/modules/kernel/kernel.te +7 -1
@@ -139,6 +139,13 @@ type sysctl_dev_t, sysctl_type; genfscon proc /sys/dev gen_context(system_u:object_r:sysctl_dev_t,s0) # +# The netmsg inital SID is used by the kernel's NetLabel subsystem for network +# connections which do not carry full SELinux contexts. +# +type netlabel_peer_t; +sid netmsg gen_context(system_u:object_r:netlabel_peer_t,mls_systemhigh) + +# # unlabeled_t is the type of unlabeled objects. # Objects that have no known labeling information or that # have labels that are no longer valid are treated as having this type.
@@ -153,7 +160,6 @@ sid icmp_socket gen_context(system_u:ob sid igmp_packet gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid init gen_context(system_u:object_r:unlabeled_t,s0) sid kmod gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) -sid netmsg gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid policy gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid scmp_packet gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid sysctl_modprobe gen_context(system_u:object_r:unlabeled_t,s0)
Signature · 8 lines
paul moore linux security @ hp -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
Quoted 18 lines · Paul Moore
This is a simple RFC patch for the Reference Policy to go along with the proposed NetLabel kernel changes to use the netmsg initial SID, the kernel change thread can be found here:
* http://marc.info/?t=117394234100037&r=1&w=2
The basic idea is that NetLabel would use the netmsg initial SID as the base/TE context for MLS-only connections and the unlabeled SID for connections that did not have have security attributes at all, true unlabeled connections. The reason for doing this would be to enable us to allow/disallow unlabeled NetLabel traffic on a per-domain basis; something that is not easily possible with the current approach of using the unlabeled SID as the base/TE context for MLS-only connections.
I don't consider the changes below to be complete, there would still need to be changes to all of the user and application domains, but I want to start a conversation on the "right" way to do this. Chris, Dan, I'm especially interested in what the two of you have to say.
[...]
Quoted 17 lines
policy/modules/kernel/kernel.te +7
-0@@ -139,6 +139,13 @@ type sysctl_dev_t, sysctl_type; genfscon proc /sys/dev gen_context(system_u:object_r:sysctl_dev_t,s0) # +# The netmsg inital SID is used by the kernel's NetLabel subsystem for network +# connections which do not carry full SELinux contexts. +# +type netlabel_peer_t; +sid netmsg gen_context(system_u:object_r:netlabel_peer_t,mls_systemhigh) + +# # unlabeled_t is the type of unlabeled objects. # Objects that have no known labeling information or that # have labels that are no longer valid are treated as having this type.
policy/modules/kernel/kernel.te sid icmp_socket gen_context(system_u:ob · line 165
Quoted 7 lines
policy/modules/kernel/kernel.te +0
-1@@ -153,7 +160,6 @@ sid icmp_socket gen_context(system_u:ob sid igmp_packet gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid init gen_context(system_u:object_r:unlabeled_t,s0) sid kmod gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) -sid netmsg gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid policy gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid scmp_packet gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid sysctl_modprobe gen_context(system_u:object_r:unlabeled_t,s0)
The type declaration and initial sid line should move over to corenetwork (with corresponding interface changes). The only reason there were netlabel interfaces in the kernel module were because they were using unlabeled_t.
Signature · 9 lines
Chris PeBenito Tresys Technology, LLC (410) 290-1411 x150 -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
Quoted 24 lines · Christopher J. PeBenito
Quoted 23 lines · Paul Moore
policy/modules/kernel/kernel.te +1
-0@@ -139,6 +139,13 @@ type sysctl_dev_t, sysctl_type; genfscon proc /sys/dev gen_context(system_u:object_r:sysctl_dev_t,s0) # +# The netmsg inital SID is used by the kernel's NetLabel subsystem fornetwork +# connections which do not carry full SELinux contexts.
policy/modules/kernel/kernel.te +3
-0+# +type netlabel_peer_t; +sidnetmsg
gen_context(system_u:object_r:netlabel_peer_t,mls_systemhigh)+policy/modules/kernel/kernel.te +1
-1+# # unlabeled_t is the type of unlabeled objects. # Objects that have no known labeling information or that # have labels that are no longer valid are treated as having this type.@@ -153,7 +160,6 @@ sid icmp_socket gen_context(system_u:ob sid igmp_packet gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid init gen_context(system_u:object_r:unlabeled_t,s0) sid kmod gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) -sid netmsg gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid policy gen_context(system_u:object_r:unlabeled_t,mls_systemhigh)
Quoted 8 lines
Quoted 3 lines
policy/modules/kernel/kernel.te +0
-0sid
scmp_packetgen_context(system_u:object_r:unlabeled_t,mls_systemhigh)
sidsysctl_modprobegen_context(system_u:object_r:unlabeled_t,s0)The type declaration and initial sid line should move over to corenetwork (with corresponding interface changes). The only reason there were netlabel interfaces in the kernel module were because they were using
unlabeled_t.
Okay, that makes sense.
I still have a question about the best way to provide both labeled and unlabeled NetLabel support to all of the user/application domains in the policy. I don't have a problem going through all the individual domains and adding calls like these:
corenet_{tcp,udp,raw}_recv_unlabeled(<domain>)
corenet_{tcp,udp,raw}_recv_netlabel(<domain>)
... but I was wondering if there was another way I should go about making the change?
Signature · 7 lines
paul moore linux security @ hp -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
Quoted 41 lines · Paul Moore
Quoted 24 lines · Christopher J. PeBenito
Quoted 23 lines · Paul Moore
policy/modules/kernel/kernel.te +1
-0@@ -139,6 +139,13 @@ type sysctl_dev_t, sysctl_type; genfscon proc /sys/dev gen_context(system_u:object_r:sysctl_dev_t,s0) # +# The netmsg inital SID is used by the kernel's NetLabel subsystem fornetwork +# connections which do not carry full SELinux contexts.
policy/modules/kernel/kernel.te +3
-0+# +type netlabel_peer_t; +sidnetmsg
gen_context(system_u:object_r:netlabel_peer_t,mls_systemhigh)+policy/modules/kernel/kernel.te +1
-1+# # unlabeled_t is the type of unlabeled objects. # Objects that have no known labeling information or that # have labels that are no longer valid are treated as having this type.@@ -153,7 +160,6 @@ sid icmp_socket gen_context(system_u:ob sid igmp_packet gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid init gen_context(system_u:object_r:unlabeled_t,s0) sid kmod gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) -sid netmsg gen_context(system_u:object_r:unlabeled_t,mls_systemhigh) sid policy gen_context(system_u:object_r:unlabeled_t,mls_systemhigh)Quoted 8 lines
Quoted 3 lines
policy/modules/kernel/kernel.te +0
-0sid
scmp_packetgen_context(system_u:object_r:unlabeled_t,mls_systemhigh)
sidsysctl_modprobegen_context(system_u:object_r:unlabeled_t,s0)The type declaration and initial sid line should move over to corenetwork (with corresponding interface changes). The only reason there were netlabel interfaces in the kernel module were because they were using
unlabeled_t.Okay, that makes sense.
I still have a question about the best way to provide both labeled and unlabeled NetLabel support to all of the user/application domains in the policy. I don't have a problem going through all the individual domains and adding calls like these:
Quoted 5 lines
corenet_{tcp,udp,raw}_recv_unlabeled(<domain>)
corenet_{tcp,udp,raw}_recv_netlabel(<domain>)... but I was wondering if there was another way I should go about making the change?
No, that's the right method. I've been thinking about if this is the right vocabulary for the interfaces; I'd like to make it workable for labeled ipsec too. The problem is that ipsec is a little different, where you might have interfaces like apache_tcp_recvfrom_user_script().
Signature · 9 lines
Chris PeBenito Tresys Technology, LLC (410) 290-1411 x150 -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.
Quoted 9 lines · Christopher J. PeBenito
Quoted 8 lines · Paul Moore
I still have a question about the best way to provide both labeled and unlabeled NetLabel support to all of the user/application domains in the policy. I don't have a problem going through all the individual domains and adding calls like these:
corenet_{tcp,udp,raw}_recv_unlabeled(<domain>)
corenet_{tcp,udp,raw}_recv_netlabel(<domain>)
Quoted 6 lines
Quoted 2 lines
... but I was wondering if there was another way I should go about making the change?
No, that's the right method. I've been thinking about if this is the right vocabulary for the interfaces; I'd like to make it workable for labeled ipsec too.
Yes, especially for the unlabeled case. I would think having a single interface to allow a domain to receive unlabeled traffic would be much better than two.
Quoted 2 lines
The problem is that ipsec is a little different,
where you might have interfaces likeapache_tcp_recvfrom_user_script().
Yes, you also have all the SPD matching issues to deal with. Hopefully later this year I'll have NetLabel supporting full SELinux contexts which should make NetLabel and IPsec very similar in regards to packet subject/object labels; the class/permissions will still be different but that is more of an interface implementation issue than an actual interface/API issue.
Thanks for you help, I'll hope to have a patch for you to review within a week or two that adds the corenet/NetLabel interfaces to the policy in SVN. I'd like to get this accepted and merged before I push the final kernel patch up to James/Stephen as the kernel changes require a new/updated policy to work correctly.
Signature · 7 lines
paul moore linux security @ hp -- This message was distributed to subscribers of the selinux mailing list. If you no longer wish to subscribe, send mail to [email protected] with the words "unsubscribe selinux" without quotes as the message.