配套系列教學視訊連結:
安卓系列教程之ROM系統開發-百問100ask
說明
系統:Android10.0
裝置: FireFly RK3399 (ROC-RK3399-PC-PLUS)
前言
之前章節将基本知識都已經講解完了, 需要通過實戰例子來驗證理論, 本章節重點介紹如何定義政策。
一,目标
需要完成一個程序去操作一個檔案(如裝置檔案),編寫政策檔案,并進行測試。
1, myse_test: 定義一個可執行程式, 可以讀寫檔案,此時會設定該程序的檔案上下文,以及domain,還有權限政策。
2, 建立一個被程序讀寫檔案(如裝置檔案/dev/myse_dev),定義該檔案的安全上下文。
實作的框圖如下:
myse_test程序屬于vendor分區, 政策檔案也會在vendor分區。
二, 檔案目錄結構
device/rockchip/qh100_rk3399/test_se/
├── cmd
│ ├── Android.mk
│ └── myse_test.c //程序對應代碼
└── sepolicy //政策目錄
├── device.te
├── file_contexts
└── myse_test.te
三,代碼和政策檔案辨寫
myse_test.c的代碼:
test_se/cmd/myse_test.c
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>
#define LOG_TAG "MySeTest"
#include <log/log.h>
int main(int argc, char *argv[])
{
int fd = -1;
int ret = -1;
char *content = "hello test for selinux";
/dev/myse_dev";
fd = open(dev_name, O_RDWR);
if(fd < 0)
{
ALOGE("open %s error: %s", dev_name, strerror(errno));
return -1;
}
ret = write(fd, content, strlen(content));
if(ret < 0)
{
ALOGE("write testfile error: %s", strerror(errno));
return -1;
}else
{
ALOGD("write testfile ok: %d", ret);
}
while(1);
close(fd);
return 0;
}
test_se/cmd/Android.mk編譯規則
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES:= \
myse_test.c
LOCAL_SHARED_LIBRARIES := \
libcutils \
liblog \
LOCAL_CFLAGS += -Wno-unused-parameter
LOCAL_PROPRIETARY_MODULE := true
LOCAL_MODULE:= myse_test
include $(BUILD_EXECUTABLE)
相關的selinux政策檔案
sepolicy
├── device.te
├── file_contexts
└── myse_test.te
定義/dev/myse_dev(不是真的裝置檔案,是我們touch一個檔案,作為模拟) 的類型, 編輯device.te:
type myse_testdev_t, dev_type;
定義myse_test檔案和程序對應的type和domain,編輯myse_test.te
# subject context in proccess status
type myse_test_dt, domain;
# object context as a file
type myse_test_dt_exec, exec_type, vendor_file_type, file_type;
#grant perm as domain
init_daemon_domain(myse_test_dt)
定義myse_test檔案和程序對應的檔案上下文,編輯file_contexts:
/vendor/bin/myse_test u:object_r:myse_test_dt_exec:s0
/dev/myse_dev u:object_r:myse_testdev_t:s0
将以上政策加入到BOARD_SEPOLICY_DIRS,
編輯: vim device/rockchip/qh100_rk3399/qh100_rk3399.mk 檔案最後面添加:
BOARD_SEPOLICY_DIRS +=device/rockchip/qh100_rk3399/test_se/sepolicy
四, 編譯
編譯可執行程式: mmm device/rockchip/qh100_rk3399/test_se/cmd/, 最終生成:
out/target/product/qh100_rk3399/vendor/bin/myse_test
編譯政策檔案:make selinux_policy -j6 最終生成檔案
ls out/target/product/qh100_rk3399/vendor/etc/selinux/
plat_pub_versioned.cil vendor_file_contexts
plat_sepolicy_vers.txt vendor_hwservice_contexts vendor_seapp_contexts
selinux_denial_metadata vendor_mac_permissions.xml vendor_sepolicy.cil