实现android获取检测Selinux

简介: selinux

1.Selinux简介
SELinux(Security-Enhanced Linux) 是美国国家安全局(NSA)对于强制访问控制的实现,是 Linux历史上最杰出的新安全子系统。
SELinux的软件设计架构是参照Flask,Flask是一种灵活的操作系统安全架构,并且在Fluke research operating system中得到了实现。Flask的主要特点是把安全策略执行代码和安全策略决策代码,划分成了两个组件。安全策略决策代码在Flask架构中称作Security Server。除了这两个组件以外,另外一个组件Vector Cache(AVC), 主要提供策略决策结果的缓存,以此提高Security Server的性能。
SELinux 运行有三个运行状态,分别是disabled, permissive 和 enforcing

Disable: 禁用SELinux,不会给任何新资源打Label,如果重新启用的话,将会给资源重新打上Lable,过程会比较缓慢。

Permissive:如果违反安全策略,并不会真正的执行拒绝操作,替代的方式是记录一条log信息。\

Enforcing: 默认模式,SELinux的正常状态,会实际禁用违反策略的操作

2.设置和获取selinux的标志

static char *g_pszSelinuxFileSystemString=NULL;
static char **g_pSelinuxFileSystemStringPointer = &g_pszSelinuxFileSystemString;
//用户设置selinux的标志
int setSelinuxFlag(int value) {

int fd=0, length=0;
char fileContentBuffer[20]={0};
char filePath[1024]={0};


if (*g_pSelinuxFileSystemStringPointer == NULL) {
    errno = 2;
    return -1;
}

snprintf(filePath, 1024, "%s/enforce", *g_pSelinuxFileSystemStringPointer);
fd = open(filePath, 2);
if (fd < 0)
    return -1;

snprintf(fileContentBuffer, 20, "%d", value);
length = strlen(fileContentBuffer);

length = write(fd, fileContentBuffer, len);

close(fd);

return length >> 31;

}

//用于获取selinux的标志
int getSelinuxFlag() {

int fd=0, readLength=0, value=0;
char fileContentBuffer[20]={0};
char filePath[1024]={0};

if (*g_pSelinuxFileSystemStringPointer == NULL) {
    errno = 2;
    return -1;
}

snprintf(filePath, 1024, "%s/enforce", *g_pSelinuxFileSystemStringPointer);
fd = open(filePath, 0);
if (fd < 0)
    return -1;

memset(fileContentBuffer, 0, 20);
readLength = read(fd, fileContentBuffer, 19);
close(fd);

if (readLength < 0)
    return -1;

readLength = sscanf(fileContentBuffer, "%d", &value);
if (readLength != 1)
    return -1;

return value;

}

3.检测selinux实现
//检测selinux
void checkSelinux() {

if (*g_pSelinuxFileSystemStringPointer == NULL) {
    int ret=0;
    FILE *pFilesystems=NULL;
    char fileLineBuffer[1024]={0};
    struct statfs statfsBuffer={0};


    while ((ret = statfs("/sys/fs/selinux", &statfsBuffer)) < 0) {
        if (errno == EINTR)
            continue;
        
        LOGE("statfs error:%s\n", strerror(errno));
        
        return ;
    }

    if (ret == 0 && statfsBuffer.f_type == 0xF97CFF8C ) {
        *g_pSelinuxFileSystemStringPointer = strdup("/sys/fs/selinux");

        return;
    }

    pFilesystems = fopen("/proc/filesystems", "r");
    if (pFilesystems == NULL)
        return ;

    do {
        if (fgets(fileLineBuffer, 1024, pFilesystems) == NULL) {
            fclose(pFilesystems);
            return ;
        }

        if (strstr(fileLineBuffer, "selinuxfs")) {
            break;
        }
    } while (1);

    fclose(pFilesystems);

    pFilesystems = fopen("/proc/mounts", "r");
    if (pFilesystems == NULL)
        return ;

    do {
        char *spacePosition;
        char *fileSystemName;
        
        if (fgets(fileLineBuffer, 1024, pFilesystems) == NULL) {
            fclose(pFilesystems);
            return ;
        }

        spacePosition = strchr(fileLineBuffer, ' ');
        if (spacePosition == NULL) {
            fclose(pFilesystems);
            return ;
        }

        spacePosition++;
        fileSystemName = spacePosition;
        spacePosition = strchr(fileSystemName, ' ');
        if (spacePosition == NULL) {
            fclose(pFilesystems);
            return ;
        }

        spacePosition++;

        if (strncmp(spacePosition, "selinuxfs ", 10) != 0)
            continue;

        *(spacePosition -1) = 0;
        *g_pSelinuxFileSystemStringPointer = strdup(fileSystemName);
        break;
    } while (1);

    fclose(pFilesystems);
}

}

相关文章
|
6月前
|
Android开发
Android 11 添加Service服务SELinux问题
Android 11 添加Service服务SELinux问题
342 1
|
1月前
|
设计模式 Java Android开发
安卓应用开发中的内存泄漏检测与修复
【9月更文挑战第30天】在安卓应用开发过程中,内存泄漏是一个常见而又棘手的问题。它不仅会导致应用运行缓慢,还可能引发应用崩溃,严重影响用户体验。本文将深入探讨如何检测和修复内存泄漏,以提升应用性能和稳定性。我们将通过一个具体的代码示例,展示如何使用Android Studio的Memory Profiler工具来定位内存泄漏,并介绍几种常见的内存泄漏场景及其解决方案。无论你是初学者还是有经验的开发者,这篇文章都将为你提供实用的技巧和方法,帮助你打造更优质的安卓应用。
|
6月前
|
Android开发
如何在Android真机上检测是否有Google Map add-on
如何在Android真机上检测是否有Google Map add-on
73 3
|
6月前
|
Android开发
Android Service Call /dev/xxx SELinux
Android Service Call /dev/xxx SELinux
107 1
|
3月前
|
编解码 安全 Ubuntu
Android Selinux 问题处理笔记
这篇文章是关于处理Android系统中SELinux权限问题的笔记,介绍了如何通过分析SELinux拒绝的日志、修改SELinux策略文件,并重新编译部署来解决权限问题,同时提供了一些SELinux的背景知识和实用工具。
75 0
|
4月前
|
监控 Java Android开发
探究Android应用开发中的内存泄漏检测与修复
在移动应用的开发过程中,优化用户体验和提升性能是至关重要的。对于Android平台而言,内存泄漏是一个常见且棘手的问题,它可能导致应用运行缓慢甚至崩溃。本文将深入探讨如何有效识别和解决内存泄漏问题,通过具体案例分析,揭示内存泄漏的成因,并提出相应的检测工具和方法。我们还将讨论一些最佳实践,帮助开发者预防内存泄漏,确保应用稳定高效地运行。
|
6月前
|
Android开发
android检测网络连接是否存在(一)
android检测网络连接是否存在(一)
49 2
|
6月前
|
Shell Android开发
android Selinux 之 platform
android Selinux 之 platform
53 0
|
6月前
|
编解码 缓存 安全
Android SELinux 参数语法介绍及基础分析
Android SELinux 参数语法介绍及基础分析
158 0
|
6月前
|
编解码 监控 API
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
Android HAL深入探索(6): HIDL 添加SELinux 完整调试过程
971 0