精华内容
下载资源
问答
  • Android 5.0以后完全引入了 SEAndroid/SELinux 安全机制,这样即使拥有 root 权限或 chmod 777 ,仍然无法再JNI以上访问内核节点。 其实在 Android 4.4 就有限制的启用此安全机制了。后面内容都按照 5.0 以后介绍,...
  • android selinux

    2021-04-04 11:46:45
    android selinux 内容安排 android selinux 一、架构 二、内容理解 总结 参考 一、架构 1.总架构: 图片来源 https://blog.csdn.net/luoshengyang/article/details/37613135 2.内核中安全访问控制流程 图片来源 ...

    android selinux


    一、架构

    1.总架构:
    在这里插入图片描述

    图片来源 https://blog.csdn.net/luoshengyang/article/details/37613135

    2.内核中安全访问控制流程
    在这里插入图片描述

    图片来源 https://blog.csdn.net/luoshengyang/article/details/37613135

    二、内容理解

    在这里插入图片描述

    总结

    迟到已久的selinux篇终于可以暂时告一段落了。
    虽然感觉自己已经整理了很多内容看了很多问题了,但是最近还是有被再一再二地难倒…一而再的感概自己是个废物…还是继续努力吧。啧,路漫漫其修远兮…

    参考

    - [1] https://blog.csdn.net/Luoshengyang/article/details/35392905?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522161838519716780262597423%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=161838519716780262597423&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_v2~rank_v29-5-35392905.pc_v2_rank_blog_default&utm_term=selinux
    - [2] https://www.jianshu.com/p/66062e509d13?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation
    展开全文
  • 本文将带你了解Android应用开发Android SElinux相关,希望本文对大家学Android有所帮助。"SEAndroid app分类SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):untrusted_app 第三...

    本文将带你了解Android应用开发Android SElinux相关,希望本文对大家学Android有所帮助。

    "

    SEAndroid app分类

    SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):

    untrusted_app 第三方app,没有Android平台签名,没有system权限

    platform_app 有android平台签名,没有system权限

    system_app 有android平台签名和system权限

    从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app

    权限规则增加:

    adb logcat | grep avc

    查看对应的缺少的log

    或者adb shell进入提示后

    dmesg | grep avc

    1.标志性log 格式

    avc: denied { 操作权限 } for pid=7201 comm=“进程名” scontext=u:r:源类型:s0

    tcontext=u:r:目标类型:s0 tclass=访问类型 permissive=0

    在相应源类型.te文件,添加如下格式的一行语句:(结尾别忘了分号)

    格式:allow 源类型 目标类型:访问类型 {操作权限};

    搜索到权限阻止的log.比如:

    avc: denied { set } for property=battery.level

    scontext=u:r:system_server:s0 tcontext=u:object_r:default_prop:s0

    tclass=property_service

    则将这行添加在后面的3个目录中,

    allow system_server default_prop:property_service { set };

    有时候avc denied的log不是一次性显示所有问题,要等你解决一个权限问题之后,才会提示另外一个权限问题。

    加在任何一个文件中都有效,但是要尽量保持的source和已存在的文件名一致。

    external/sepolicy

    device/intel/sepolicy /

    添加后的尝试编译语法是否有错:

    mmm -B external/sepolicy

    如果不报错则make bootimage可编译生效。

    现在我们需要在有系统签名的应用(platform_app)通过JNI中访问自定义的设备节点: /dev/graphics/fb3。

    log类似于: avc: denied { read write } for name=“/dev/graphics/fb3” dev=“tmpfs”

    ino=8245 scontext=u:r:platform_app:s0:c512,c768

    tcontext=u:object_r:graphics_device:s0 tclass=chr_file permissive=0

    首先更改设备节点 /dev/graphics/fb3 的权限为666(在 system/core/rootdir/ueventd.rc

    添加)

    /dev/graphics/fb3 0666 root graphics

    编辑 device/intel/sepolicy/file_contexts

    仿照这个文件里的写法,定义节点fb3。(这样做的好处是不改变系统原有的权限)

    /dev/graphics/fb3 u:object_r:display_graphics_device:s0

    修改 device/intel/sepolicy/device.te

    type display_graphics_device, dev_type, mlstrustedobject;

    修改 device/intel/sepolicy/platform_app.te

    allow platform_app display_graphics_device:chr_file rw_file_perms;

    "

    本文由职坐标整理并发布,希望对同学们有所帮助。了解更多详情请关注职坐标移动开发之Android频道!

    展开全文
  • Android Selinux

    2020-07-10 09:38:50
    临时disable adb shell setenforce 0 # 设置SELinux 成为permissive模式(SELinux开启,但对违反selinux规则的行为只记录,不会阻止) adb shell setenforce 1 #设置SELinux 成为enforcing模式 (SELinux开启) 可以...

    Sepolicy在调试阶段真心很烦,有时因为一个sepolicy就导致结果与预期不一样。

    1. Sepolicy规则

    Sepolicy 规则

    allow sourcecontext targetcontext:class {}
    
    • sourcecontext: scontext
    • targetcontext: tcontext
    • class: tclass

    Sepolicy 文件存放的位置

    • AOSP 7.1 system/sepolicy/

    • OEM产商一般会有overlay, 如Nvidia

      device/nvidia/common/sepolicy_n/

    2. 临时disable

    adb shell setenforce 0
    # 设置SELinux 成为permissive模式(SELinux开启,但对违反selinux规则的行为只记录,不会阻止)
    
    adb shell setenforce 1
    #设置SELinux 成为enforcing模式 (SELinux开启)
    

    可以通过 getenforce 来获得当前系统 selinux 的状态

    如果是

    • Enforcing enabled
    • Permissive disabled

    缺点: adb reboot后系统恢复成原来的状态

    3. 在代码中永久关闭 selinux

    代码文件 system/core/init/init.cpp

    找到函数 selinux_initialize

    static void selinux_initialize(bool in_kernel_domain) {                                                                                                               
        bool is_enforcing = selinux_is_enforcing();
    }
    

    bool is_enforcing = selinux_is_enforcing(); 改为

    bool is_enforcing = false; //selinux_is_enforcing(); 即可,

    这样即使系统重启也会被永久disabled掉了

    注意: 编译出来的 init可执行文件是在设备的根目录下,而不是/system/bin/下,且init 会被打包进 boot.img, 而非 system.img.

    4. Selinux规则

    4.1 binder_call

    05-16 12:41:23.390 W/BootAnimation(  114): type=1400 audit(0.0:6): avc: denied { call } for
    scontext=u:r:bootanim:s0 tcontext=u:r:mediaserver:s0 tclass=binder permissive=0
    

    需要在bootanim.te里加入binder_call(bootanim, mediaserver)

    4.2 allow

    avc:  denied  { find } for service=media.audio_flinger pid=665 uid=1003
    scontext=u:r:bootanim:s0 tcontext=u:object_r:audioserver_service:s0 tclass=service_manager permissive=0
    

    需要在bootanim.te中加入

    allow bootanim audioserver_service:service_manager find
    

    5.证修改成功

    通过编译后可以在 out/debug/target/product/xxx/root目录下找到file_contexts.bin

    最后通过工具 sefcontext将file_contexts.bin 转换成 file_context

    sefcontext file_contexts.bin -o file_contexts
    

    也可通过 sefcontext_compile来打包

    sefcontext_compile file_contexts
    
    展开全文
  •    Android SELinux开发入门指南之SELinux基础知识 前言    SEAndroid是在Android系统中基于SELinux推出的强制访问控制模型,来完善自主访问模型中只要取得root权限就可以为所欲为的情况。 SELinux是一种...

       Android SELinux开发入门指南之SELinux基础知识


    Android SELinux开发多场景实战指南目录:

    Android SELinux开发入门指南之SELinux基础知识
    Android SEAndroid权限问题指南
    Android SELinux开发入门指南之如何增加Java Binder Service权限
    Android SELinux开发入门指南之权限解决万能规则
    Android SELinux开发入门指南之如何增加Native Binder Service权限
    Android SELinux开发入门指南之正确姿势解决访问data目录权限问题
    正确姿势临时和永久关闭Android的SELinux



    引言

       SEAndroid是在Android系统中基于SELinux推出的强制访问控制模型,其被设计的主要意图就是用来来完善自主访问模型中只要取得root权限就可以为所欲为的情况。那么SELinux究竟是何方神圣呢,老规矩认识一个事物我们通常会从它是什么,怎么使用它,最后深入它的三个步骤来进行,我们这里对SELinux也是如此,秉承三部曲的节奏来进行!

    我们先对SELinux来一个整体的概述那就是SELinux是一种基于域-类型(domain-type)模型的强制访问控制(MAC)安全系统,其原则是任何进程想在SELinux系统中干任何事,都必须先在安全策略的配置文件中赋予权限。凡是没有在安全策略中配置的权限,进程就没有该项操作的权限。在SELinux出现之前,Linux的安全模型是DAC(DiscretionaryAccess Control),译为自主访问控制。其核心思想是进程理论上所拥有的权限与运行它的用户权限相同。比如,以root用户启动shell,那么shell就有root用户的权限,在Linux系统上能干任何事。这种管理显然比较松散。在SELinux中,如果需要访问资源,系统会先进行DAC检查,不通过则访问失败,然后再进行MAC权限检查。




    一. SELinux基础知识

    SELinux涉及的基本知识比较多,下面让我们来一一细说。

    1.1 SELinux的三种模式

    SELinux分为三种模式,下面我们看看究竟是那三种模式:

    • Disable模式
      此种模式关闭SELinux检测,不进行任何SELinux权限检查,畅通无阻。

    • Permissive模式
      宽容模式,当权限检查不通过时,不决绝资源访问,只打印avc log日志。

    • Enforceing模式
      强制模式,此种模式下权限检查不通过时,拒绝资源访问,并打出avc log,这个是最恨模式。


    1.2 查看SELiux状态和关闭SELinux

    查看SElinux的状态:
    查看SELinux状态比较简单,可以通过命令行查看SELinux状态:

    adb  shell getenforce
    

    还有一种就是通过avc log来确认SELinux的状态:
    如果是avc log结尾有permissive=1/0的标识,如果permissive=1说明是Permissive模式模式,如果permissive=0则说明是Enforce模式。

    关闭SELinux:
    关于怎么关闭SELinux可以参考如下的博文正确姿势临时和永久关闭Android的SELinux里面有比较详细的讲解。


    1.3 SEAndroid app分类和其他

    SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):

    • untrusted_app 第三方app,没有Android平台签名,没有system权限

    • platform_app 有android平台签名,没有system权限

    • system_app 有android平台签名和system权限

    • untrusted_app_25 第三方app,没有Android平台签名,没有system权限,其定义如下This file defines the rules for untrusted apps running with targetSdkVersion <= 25.

    从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app按照这个进行排序property_contexts(系统属性)主要描述系统属性相关


    1.4 seapp_contexts定义

    seapp_contexts定义在system/sepolicy/seapp_contexts数据文件,如下

    
    isSystemServer=true domain=system_server
    user=system seinfo=platform domain=system_app type=system_app_data_file
    user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file
    user=nfc seinfo=platform domain=nfc type=nfc_data_file
    user=radio seinfo=platform domain=radio type=radio_data_file
    user=shared_relro domain=shared_relro
    user=shell seinfo=platform domain=shell type=shell_data_file
    user=_isolated domain=isolated_app levelFrom=user
    user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user
    user=_app domain=untrusted_app type=app_data_file levelFrom=user
    
    

    从上面可以看出,domain和type由user和seinfo两个参数决定。

    比如:

    user=system seinfo=platform,domain才是system_app

    user=_app,可以是untrusted_app或platform_app,如果seinfo=platform,则是platform_app。


    1.5 user和seinfo判定方式

    首先看user,user可以理解为UID,例如ps -Z结果如下:

    u:r:system_app:s0              system    2414  1172  com.android.keychain
    u:r:platform_app:s0            u0_a6     2439  1172  com.android.managedprovisioning
    u:r:untrusted_app:s0           u0_a8     2460  1172  com.android.onetimeinitializer
    u:r:system_app:s0              system    2480  1172  com.android.tv.settings
    u:r:untrusted_app:s0           u0_a27    2504  1172  com.android.email
    u:r:untrusted_app:s0           u0_a28    2523  1172  com.android.exchange
    u:r:untrusted_app:s0           u0_a7     2567  1172  com.android.musicfx
    
    

    第一列是SContext,第二列是UID,只要UID是system的基本都是system_app,反过来一样。
    其他的U0_XXX要么属于platform_app或untrusted_app
    seinfo由external\sepolicy\mac_permissions.xml决定,内容如下:

        <!-- Platform dev key in AOSP -->
        <signer signature="@PLATFORM" >
          <seinfo value="platform" />
        </signer>
     
     
        <!-- All other keys -->
     
        <default>
          <seinfo value="default" />
        </default>
    
    

    即如果签名是platform,seinfo就是platform,其他的比如shared等,seinfo是default。
    比如上面ps -Z的结果里面,OneTimeInitializer.apk是untrusted_app,ManagedProvisioning.apk是platform_app。
    分别查看这两个app的Android.mk
    packages\apps\OneTimeInitializer\Android.mk 没有定义LOCAL_CERTIFICATE,默认是shared
    packages\apps\ManagedProvisioning\Android.mk 有定义LOCAL_CERTIFICATE := platform
    因为ManagedProvisioning.apk有platform签名,所以seinfo是platform。


    1.6 RBAC和constrain

    由前文可知,.te文件内部包含各种allow, type等语句,这些都是TEAC(type enforcement access control),属于SELinux MAC中的核心组成部分。
    在TEAC之上,SELinux还有一种基于Role的安全策略,也就是RBAC(role based access control)。
    e.g.
    constrain file write (u1 == u2 and r1 == r2)
    这句话表示只有source和targe的user相同,并且role也相同,才允许write file


    1.7 小技巧

    使用allow和neverallow语句的时候,可以使用下面的一些小技巧来简化命令书写;

    • ”号,表示除了””以外

    • ”-”号,表示去除某项内容

    • ”*”号,表示所有内容


    1.8 SELinux 策略构建和客制化

    在Android8.0中,SELinux策略分离成平台(platform)和非平台(non-platform)两部分,而平台策略为了给非平台策略导出特定的类型和属性,又分为平台私有(platform private)和平台公有(platform public)部分。

    1.8.1.平台公有策略(platform public seoplicy)

    平台共有策略全部定义在/system/sepolicy/public下,public下的type和attribute可以被non-platform中的策略所使用,也就是说,设备制造商的sepolicy策略在non-platform下可以对platform public sepolicy的策略进行扩展。

    1.8.2.平台私有策略(platform private seoplicy)

    与公有策略相反,被声明为私有策略的type或attribute对non-platform的策略是不可见的,这里有些费解,我们举例来说,这里以8.0版本的aosp源代码中的/system/sepolicy/private/目录下的atrace.te文件为例;

    • 8.0版本的aosp中的/system/sepolicy/private/file_contexts定义了“/system/bin/atrace u:object_r:atrace_exec:s0”

    • 然后在/system/sepolicy/private/atrace.te中定义atrace相关的规则;
      我们在device/qcom/sepolicy/common目录下新增一个atrace.te文件,并添加规则 “allow atrace sdcardfs:file read;”

    • 当我们make进行编译时会在校验的时候失败,提示我们“device/qcom/sepolicy/common/atrace.te:2:ERROR ‘unknown type atrace’ at token ‘;’ on line 23355”,那么也就是说private策略中的type和attribute对我们是不可见的。

    这里有一点需要注意的是public的SContext安全上下文只有平台和非平台之分,也就是说,定义在平台private下面file_contexts属性,public和非平台的也可以共享它。

    1.8.3.平台私有映射

    映射主要针对旧版本的映射,应用比较少,这里不作研究;

    1.8.4 SELinux策略开发小技巧

    为了快速的开发SELinux的相关策略,我们通常不会将策略文件定义到Android aosp的system/sepolicy目录下面,而是通常会将platform或者non-plarform定义到自己的device目录下面,Android的设计者也考虑到了这个问题,在system/sepolicy/Android.mk定义了如下的一些宏,可以将我们定制的平台策略和非平台策略整合编译,定义的有如下几个:

    BOARD_SEPOLICY_DIRS  ##此宏涉及到的目录,会编译到vendor/etc/sepolicy下
    PLAT_PUBLIC_POLICY ##此宏涉及到的目录,会当成system/sepolicy/public
    PLAT_PRIVATE_POLICY##此宏涉及到的目录,会当成system/sepolicy/private
    

    我们可以在自己的device的BoardConfig.mk下面对上述的宏赋值,这样就可以避免直接修改system/sepolicy目录了。


    1.9 快速编译验证SELinux策略

    我们将策略文件或者SELinux修改好以后,怎么快速的验证或者编译了,不要再直接make整个Android系统了,这样耗时又麻烦,我们可以通过如下的命令快速编译:

    xxx:#= make selinux_policy
    

    接着将生成的策略文件push到Android设备终端,重启设备终端即可,这里我放上我经常使用的一个push脚本,如下:

    adb push /xxx/system/etc/selinux/*  /system/etc/selinux/
    adb push /xxx/vendor/etc/selinux/*  /vendor/etc/selinux/
    adb push /xxx/system/system_ext/etc/selinux/*  /system/system_ext/etc/selinux/
    adb push /xxx/system/product/etc/selinux/*  /system/product/etc/selinux/
    adb shell sync
    adb shell sync
    adb reboot
    
    



    结语

    修行至此,上述就是本人总结的在实际开发工作中经常使用到的相关SElinux的重点基础知识,希望对各位有所帮组,各位江湖见。




    写在最后

      各位读者看官朋友们,Android SELinux开发入门指南之SELinux基础知识已经全部完毕,希望能吸引你,激活发你的学习欲望和斗志。在最后麻烦读者朋友们如果本篇对你有帮助,关注和点赞一下,当然如果有错误和不足的地方也可以拍砖。

    展开全文
  • Android SELinux解析

    千次阅读 2018-06-03 17:29:00
    转自文章《SELinux For AndroidAndroid O)》https://blog.csdn.net/huangyabin001/article/details/79264222 《Android SeLinux权限问题和解决方法》...A...
  • SELinux for Android SELinux for Android在架构和机制上与SELinux完全一样,考虑到移动设备的特点,所以移植到Android上的只是SELinux的一个子集。SELinux for Android的安全检查几乎覆盖了所有重要的系统资源,...
  • Android Selinux 单编后,快速验证

    千次阅读 2021-12-21 09:26:59
    sepolicy修改后 快速验证 编译: makeselinux_policy-j8 // vendor 和system 都修改了 makeselinux_policy_nonsystem -j8 // 只修改 vendor相关的sepolicy .../vendor/etc/selinux/vendor_sepolicy.cil ...
  • 目标类型”如:在file_contexts中添加:/dev/tfa9890u:object_r:audio_device:s03.4 举例添加权限:在mediaserver.te中添加allow mediaserver device:chr_file { read write open};编译报错:libsepol.check_...
  • Android SElinux 权限

    2021-10-22 14:37:29
    有关添加Android SElinux 权限------proc 文件系统 sys文件系统一,SElinux是什么,如何分析此类问题二,添加selinux权限--基于高通平台演示1,基于proc下出现selinux权限问题2,基于sys下出现selinux权限问题三,...
  • Android SELinux 权限问题处理

    千次阅读 2021-11-30 16:39:33
    SELinux 是 Google 从android 5.0 开始,强制引入的一种非常严格的管理机制,主要用于增强系统的安全性。SELinux有以下两种模式: enforcing mode: 限制访问 permissive mode: 只审查权限,不限制 1 确定 ...
  • Android selinux策略配置

    2021-06-28 15:18:38
    android的keystore服务中获取调用者的包名。 代码实现: #include <binder/IPCThreadState.h> //...... pid_t pid = android::IPCThreadState::self()->getCallingPid(); ALOGI("calling pid: %d", ...
  • Android SELinux

    2019-05-10 10:06:00
    转自:https://blog.csdn.net/ch853199769/article/details/82501078 ... 引言 本文是对SEAndroid方面知识拾人牙慧后的一些总结。 ...SEAndroid是一套以SeLinux为核心的系统安全机制。...SELinux是...
  • Android Selinux快速验证的方法

    千次阅读 2019-12-13 01:15:52
    Android P上如果修改了selinux的内容, 可以通过以下方法来验证是否生效: 1. 单编system/sepolicy mmm system/sepolicy 2. push system/etc/selinux 和 vendor/etc/selinux 到手机里面, 并重启手机. adb ...
  •   Android SELinux开发入门指南之权限解决万能规则 前言   Android的妈咪谷歌为了解决Android系统一直让人诟病的安全问题,在Android 4.4以后强制引入了SELinux安全管理。SELinux虽然可以将安全提升一个层级,...
  • Android selinux权限修改

    千次阅读 2019-12-30 19:14:50
    原文地址:...SELinux权限修改 方法一:adb修改SELinux Enforcing(已打开) Permissive(已关闭) getenforce //获取当前seLinux状态 setenforce 1 //打开seLinux setenforce 0 //...
  • Android SELinux安全策略主要使用对象安全上下文的基础进行描述,通过主体和客体的安全上下文去定义主体是否有权限访问客体,称为TypeEnforcement 安全上下文(Security Context) SEAndroid中的安全上下文:共有4个...
  • Android seLinux单编方法

    2020-11-20 16:35:06
    Android P上如果修改了selinux的内容, 可以通过以下方法来验证是否生效: 1. 单编system/sepolicy mmm system/sepolicy 2. push system/etc/selinux 和 vendor/etc/selinux 到手机里面, 并重启手机. ...
  • Android SeLinux权限问题

    2021-09-17 10:18:57
    = is_enforcing) { if (security_setenforce(is_enforcing)) { } } } bool IsEnforcing() { if (ALLOW_PERMISSIVE_SELINUX) { return StatusFromCmdline() == SELINUX_ENFORCING; } return true; } (4)在sepolicy...
  • android selinux 权限问题

    2019-10-23 09:57:54
    如果问题容易复现,我们可以先将SELinux 模式调整到Permissive mode,然后再测试确认是否与SELinux 约束相关. 在ENG 版本中: adb shell setenforce 0 setenforce 0 设置SELinux 成为permissive模式 临时关闭...
  • Android SELinux 权限处理

    2020-10-09 10:32:12
    SELinux 权限修改,我这里罗列出来了3种方案,可以选择解决: 1.adb在线修改seLinux 该方法适合调试的时候使用,并没有实际解决权限问题 Enforcing(表示已打开),...修改LINUX/android/kernel/arch/arm64/configs/xx
  • ​ 通过上面的方法介绍,我们已经知道了,如何添加权限问题,但有时会遇到一个问题就是: 明明已经添加了对应的权限,但是编译固件烧录到板子后,还是会报这个权限没有添加。 1.问题说明 ​ 在实际的项目开发中,...
  • .te文件 allow _app hal_d_default:binder { call transfer };
  •   Android SELinux开发入门指南之如何增加Native Binder Service权限 前言   Android的妈咪谷歌为了解决Android系统一直让人诟病的安全问题,在Android 4.4以后强制引入了SELinux安全管理。SELinux虽然可以...
  • 众所周知,自从Android4.3版本引入SeLinux后,这一新的安全机制会对进程的权限进行最小化的限制,以保证即使受到攻击,也不会对系统整体造成太大的影响。对于SeLinux的具体机制分析不是本文的重点,这里不做赘述。前...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 8,063
精华内容 3,225
关键字:

androidselinux

linux 订阅