在开发过程终于到向外接储存卡中拷贝内容无法成功的问题。FAT32这种格式的sdcard拷贝没有问题,但格式化成exFAT或者NTFS的时候出现拷贝不成功,打印log发现是sepolicy的问题。
在日常解sepolicy的过程中,即在sdcardd.te中添加相关的权限过程中,出现无法给unlabeled的目标对象添加create的编译问题,这个是在sepolicy / domain.te有nerverallow限制。
neverallow { domain -init -recovery } unlabeled:dir_file_class_set create;
一般情况是不能修改neverallow的代码的,这样会在CTS的过程中出现CTS的bug,由于项目暂时不过CTS故而先添加例外进行测试。
neverallow { domain -init -recovery -sdcardd } unlabeled:dir_file_class_set create;
关键问题是出现了如下的问题,在顺序解sepolicy的问题的过程中遇到了如下状况。
01-02 19:42:08.106 1848 1848 W sdcard : type=1400 audit(0.0:53): avc: denied { write } for name="1.txt" dev="mmcblk0p4" ino=64 scontext=u:r:sdcardd:s0 tcontext=u:object_r:unlabeled:s0 tclass=file permissive=0
01-02 19:43:49.156 1848 1848 W sdcard : type=1400 audit(0.0:56): avc: denied { remove_name } for name="1.txt" dev="mmcblk0p4" ino=64 scontext=u:r:sdcardd:s0 tcontext=u:object_r:unlabeled:s0 tclass=dir permissive=0
这一类的问题解决都没问题,但是出现了如下的一条unlabeled权限拒绝
01-02 17:48:49.896 1868 1868 W sdcard : type=1400 audit(0.0:47): avc: denied { associate } for name="1.txt" scontext=u:object_r:unlabeled:s0 tcontext=u:object_r:unlabeled:s0 tclass=filesystem permissive=0
这里associate的权限源对象scontent变成了unlabeled,这个直接导致了在sdcardd.te中进行如下配置是不起效果的。
allow sdcardd unlabeled:filesystem { associate };
这里产生了一个误区,在sdcardd.te里面去设置权限,只能去改变sdcard的权限,但是这里的主体变成了unlabeled,在网上也找到格式化会可能会丢失file_contexts的安全上下文指向,但其实这里只需要简单的加上
allow unlabeled unlabeled:filesystem { associate };
即可,在sdcard进程中也是可以对其他的对象进行赋权的,赋权的时候可以一次性给个权限集合,方便快捷。
#####################################
# Common groupings of object classes.
#
define(`capability_class_set', `{ capability capability2 }')
define(`devfile_class_set', `{ chr_file blk_file }')
define(`notdevfile_class_set', `{ file lnk_file sock_file fifo_file }')
define(`file_class_set', `{ devfile_class_set notdevfile_class_set }')
define(`dir_file_class_set', `{ dir file_class_set }')
define(`socket_class_set', `{ socket tcp_socket udp_socket rawip_socket netlink_socket packet_socket key_socket unix_stream_socket unix_dgram_socket appletalk_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 netlink_kobject_uevent_socket tun_socket netlink_iscsi_socket netlink_fib_lookup_socket netlink_connector_socket netlink_netfilter_socket netlink_generic_socket netlink_scsitransport_socket netlink_rdma_socket netlink_crypto_socket }')
define(`dgram_socket_class_set', `{ udp_socket unix_dgram_socket }')
define(`stream_socket_class_set', `{ tcp_socket unix_stream_socket }')
define(`unpriv_socket_class_set', `{ tcp_socket udp_socket unix_stream_socket unix_dgram_socket }')
define(`ipc_class_set', `{ sem msgq shm ipc }')
#####################################
# Common groupings of permissions.
#
define(`x_file_perms', `{ getattr execute execute_no_trans }')
define(`r_file_perms', `{ getattr open read ioctl lock }')
define(`w_file_perms', `{ open append write lock }')
define(`rx_file_perms', `{ r_file_perms x_file_perms }')
define(`ra_file_perms', `{ r_file_perms append }')
define(`rw_file_perms', `{ r_file_perms w_file_perms }')
define(`rwx_file_perms', `{ rw_file_perms x_file_perms }')
define(`create_file_perms', `{ create rename setattr unlink rw_file_perms }')
define(`r_dir_perms', `{ open getattr read search ioctl lock }')
define(`w_dir_perms', `{ open search write add_name remove_name lock }')
define(`ra_dir_perms', `{ r_dir_perms add_name write }')
define(`rw_dir_perms', `{ r_dir_perms w_dir_perms }')
define(`create_dir_perms', `{ create reparent rename rmdir setattr rw_dir_perms }')
define(`r_ipc_perms', `{ getattr read associate unix_read }')
define(`w_ipc_perms', `{ write unix_write }')
define(`rw_ipc_perms', `{ r_ipc_perms w_ipc_perms }')
define(`create_ipc_perms', `{ create setattr destroy rw_ipc_perms }')
#####################################
# Common socket permission sets.
define(`rw_socket_perms', `{ ioctl read getattr write setattr lock append bind connect getopt setopt shutdown }')
define(`create_socket_perms', `{ create rw_socket_perms }')
define(`rw_stream_socket_perms', `{ rw_socket_perms listen accept }')
define(`create_stream_socket_perms', `{ create rw_stream_socket_perms }')
[](http://opengrok.github.com/OpenGrok/ "Served by OpenGrok")