配置Android selinux以挂载tmpfs文件系统

时间:2017-07-11 13:13:52

标签: android-source selinux

我试图在Android AOSP上安装一个大小有限的tmpfs,以便在RAM中缓存一些HLS视频。视频会不断重写,因此无法写入可能会耗尽的闪光灯。我无法弄清楚如何获得权限,任何建议?

我还应该使用哪个域名?我想限制此目录,以便只有我的应用程序可以使用它,但这不是绝对的要求。我的应用程序是普通应用程序,没有特权。

hls.te

type hlsfs, fs_type;

# Allow file access in /hls
allow domain hlsfs:file create_file_perms;
allow domain hlsfs:dir rw_dir_perms;
allow init hlsfs:dir { create_dir_perms relabelto };

file_contexts

#HLS cache
/data/hls(/.*)?              u:object_r:hlsfs:s0

init.rc

on init
    mkdir /data/hls 0777 system system
on early-fs
    mount tmpfs tmpfs /data/hls mode=777,size=60M,context=u:object_r:hlsfs:s0

错误消息,第一个错误是mkdir,第二个是mount。

root@bpi-m64-hdmi:/ # dmesg | grep hls
[    2.218541] type=1400 audit(1499777970.690:4): avc:  denied  { associate } for  pid=1 comm="init" name="hls" scontext=u:object_r:hlsfs:s0 tcontext=u:object_r:rootfs:s0 tclass=filesystem permissive=1
[   11.285712] type=1400 audit(1499777979.750:6): avc: denied { relabelto } for pid=1 comm="init" name="hls" dev="dm-1" ino=170689 scontext=u:r:init:s0 tcontext=u:object_r:hlsfs:s0 tclass=dir permissive=0

Android默认selinux政策在https://android.googlesource.com/platform/system/sepolicy/+/android-n-preview-2/

更新

我在这方面取得了很大进展。首先,将它放入/ data是一个坏主意,因为有许多现有规则阻止了这一点。所以我把它移到了/ cache。

hls.te

type hlsfs, contextmount_type, fs_type;

# Allow file access in /hls
permissive hlsfs;
#allow domain hlsfs:file create_file_perms;
#allow domain hlsfs:dir rw_dir_perms;

file_contexts

#HLS cache
/cache/hls(/.*)?              u:object_r:hlsfs:s0

init.rc

on fs
    mkdir /cache/hls 0777 system system
    mount tmpfs tmpfs /cache/hls mode=777,size=60M,context=u:object_r:hlsfs:s0

init.te

# allow hls tmpfs to be mounted in cache dir
allow init cache_file:dir mounton;

通过这些更改,我可以挂载tmpfs目录。接下来我需要确保我的应用可以使用它。我还需要确保应用程序无法在tmp目录中创建任何可执行文件。

UPDATE2:

应用无法访问缓存目录。所以让我们尝试另一种方案......

这个计划几乎是正确的。我可以挂载tmpfs目录,我的应用程序可以访问它。但除非我更改所有者" chown media_rw media_rw / data / media / 0 / hls"否则该应用无法访问它。更改所有者会触发核心Android规则的拒绝错误。我将init设置为允许绕过错误。那么如何解决chown目录的需要呢?我尝试将权限设置为777并使用gid = 1023 / uid = 1023进行安装。都没有帮助。

hls.te

# Allow file access in /hls
permissive hlsfs;

file_contexts

#HLS cache
/data/media/0/hls(/.*)?              u:object_r:hlsfs:s0

init.rc

on property:sys.boot_completed=1
    mkdir /data/media/0/hls 0777 media_rw media_rw
    mount tmpfs tmpfs /data/media/0/hls mode=777,size=60M,context=u:object_r:hlsfs:s0
    chown media_rw media_rw /data/media/0/hls

init.te

# allow hls tmpfs to be mounted in /data/media dir
allow init media_rw_data_file:dir {setattr mounton};
allow init hlsfs:dir {create setattr relabelto mounton};
allow init labeledfs:filesystem associate;

permissive init;

错误消息

07-14 23:02:33.010 1-1/? I/init: type=1400 audit(0.0:5): avc: denied { relabelto } for scontext=u:r:init:s0 tcontext=u:object_r:hlsfs:s0 tclass=filesystem permissive=1

1 个答案:

答案 0 :(得分:1)

我相信我现在有这个工作。我的最后一个错误是尝试为tmp目录制定自定义策略。自定义策略导致了重新标记错误。

现在我在getExternalStorageDirectory()下有一个工作目录,它是基于tmpfs的60MB限制。

init.te

# allow hls tmpfs to be mounted in /data/media dir
allow init media_rw_data_file:dir {setattr mounton};
allow init labeledfs:filesystem associate;

init.rc

on property:sys.boot_completed=1
    mkdir /data/media/0/hls 0777 media_rw media_rw
    mount tmpfs tmpfs /data/media/0/hls size=60M

sdcardd.te

allow sdcardd tmpfs:dir create_dir_perms;
allow sdcardd tmpfs:file create_file_perms;