嵌入式爱好者

查看: 12704|回复: 0

[帮助] 国产平台之T507 开发板Android 安全策略漫谈

[复制链接]

46

主题

53

帖子

297

积分

扫一扫,手机访问本帖
发表于 2021-12-5 17:25:38 | 显示全部楼层 |阅读模式
        硬件平台:飞凌嵌入式 OKT507-C开发板8 K* r, {7 t# M" v7 ^' i
        操作系统:Android10.0! C. a, J8 e7 ~% E- [

4 E7 U: \; l) q" u; K                            飞凌嵌入式 T507 开发板 Android系统版本为Android10.0,默认开启了SELinux。基于MAC访问控制模型的SElinux,可以更好地保护我们的Android系统, 比如限制系统服务的访问权限、控制应用对数据和系统日志的访问等措施,这样就降低了恶意软件的影响,并且可以防止因代码存在的缺陷而产生的对系统安全的影响。$ H+ j" W1 [: j2 \. L. @7 g
        从系统安全方面考虑,SELinux是保护神,但是从软件开发方面,SELinux就是一道牵绊,这是一把双刃剑。
8 d8 h% U5 p3 O, c                                4 q: a( p) ]  b, |
        比如我们开发应用或者增加系统服务的某些权限的时候,我们必须遵循SELinux的规则,给我们的应用设置对应的安全策略,否则我们的应用就不具备访问数据或者设备的权限。下面我们MAC访问控制模型开始,简单的梳理一下飞凌嵌入式 T507 开发板  Android的安全策略,以及自定义飞凌嵌入式 T507 开发板 Android安全策略的方法。
& Z3 c% o( A* y& M0 Z. C  Q: t* v        访问控制模型DAC,MAC         访问控制是指控制对计算机或者网络中某个资源的访问。没有它,所有人都可以访问任何资源。有了访问控制,用户在获取实际访问资源或进行操作之前,必须通过识别、验证、授权。  q# I& V# a& n; }# ?3 i2 ]
        自主访问控制(DAC: Discretionary Access Control)系统识别用户,根据被操作对象的权限的设置,来决定该用户对其拥有的操作权限,read、write、exec。拥有这个对象权限的用户,又可以将该权限分配给其他用户,此谓之“Discretionary”。缺陷就是对权限控制比较分散,不便于管理,比如无法简单地将一组文件设置统一的权限开放给指定的一群用户。2 l; G  D$ j* I: ^$ S8 T2 O
        强制访问控制(MAC: Mandatory Access Control)MAC是为了弥补DAC权限控制过于分散的问题而诞生的。在MAC这种模型里,管理员管理访问控制。管理员制定策略,用户不能改变它。策略定义了哪个主体能访问哪个对象。这种访问控制模型可以增加安全级别,因为它基于策略,任何没有被显式授权的操作都不能执行。MAC被开发和实现在最重视保密的系统中,如军事系统。主体获得清楚的标记,对象得到分类标记,或称安全级别。+ C4 \6 s7 T0 I. w
        基于MAC的SElinux         参考链接:https://source.android.google.cn/security/selinux
( V' a& l+ q( U( N4 R        软件通常情况下必须以 Root 用户帐号的身份运行,才能向原始块设备写入数据。在基于 DAC 的传统 Linux 环境中,如果 Root 用户遭到入侵,攻击者便可以利用该用户身份向每个原始块设备写入数据。从 Android 4.3 起,SELinux 开始为传统的自主访问控制 (DAC) 环境提供强制访问控制 (MAC) 保护功能。作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。例如,可以使用 SELinux 为这些设备添加标签,以便被分配了 Root 权限的进程只能向相关政策中指定的设备写入数据。这样一来,该进程便无法重写特定原始块设备之外的数据和系统设置。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。
6 l  H5 Z9 {3 G; _4 X5 g' e0 c                              
) j5 C" c% K( l6 @3 R" A9 x% |8 N3 X$ e* J
                            飞凌嵌入式 T507 开发板 Android系统版本为Android10,SELinux默认开启,即使获得了该系统的root权限,也只能向相关策略中指定的设备写入数据,从而更好地保护和限制系统服务,保障系统和数据的安全。
5 ~( r& B5 \. l* C7 J        标签、规则和域         SELinux 依靠标签来匹配操作和策略。标签用于决定允许的事项。套接字、文件和进程在 SELinux 中都有标签。SELinux 在做决定时需参照两点:一是为这些对象分配的标签,二是定义这些对象如何交互的策略。  F% ]$ Z. u. S
        在 SELinux 中,标签采用以下形式:user:role:type:mls_level,其中 type 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。
5 R. ~- U, n  [        策略规则采用以下形式:allow domains types:classes permissions;,其中:
' V2 a: c  _" Q4 i4 Z7 m& s3 n" |  W) f8 o
                            Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
2 A6 k) ^+ V* K% G2 r& d9 n: `        Type - 一个对象(例如,文件、套接字)或一组对象的标签。
5 `/ p  n( h- W- U' J        Class - 要访问的对象(例如,文件、套接字)的类型。Permission - 要执行的操作(例如,读取、写入)。2 I' A+ R, Z: D6 H
        策略配置源文件         1、external/sepolicy
) i. ]) o7 ]1 R" {* x9 o: Z) r        这是独立于设备的配置,一般不能针对设备进行修改
: R/ t* h4 ~0 h8 w1 I+ b4 \% O3 }8 h/ X. H7 b$ h' G& J) Q% l
                            2、device/<vendor>/<product>/sepolicy
( @4 b8 h- R* Y# n# C2 m7 d        这是特定于设备的配置,基于 BOARD_SEPOLICY_* 变量来选择对应平台的策略配置。
- @" |8 @/ b" n, P& X
! U5 Y2 v+ k, d                            以飞凌嵌入式 T507 开发板 为例,T507策略文件的路径如下:) Q9 t( i) h& Z" Z# f
        OKT507-android-source/android$ ls device/softwinner/common/sepolicy/private  vendor
# U& \& K0 p) \6 d2 Z        Type Enforcement (TE) 配置文件         .te 文件中保存了对应对象的域和类型定义、规则。通常每个域一个 .te 文件,例如installd.te。在 device.te、file.te 中声明了设备和文件类型。在某些文件(例如domain.te、app.te)中则存储着共享规则。. j2 }$ D5 @: Q  r, |: B, t

5 H9 Z1 X/ ]2 r. r& d                            以飞凌嵌入式 T507 开发板 为例,T507 system_app的TE文件的路径如下:  e  D: U6 x. g# `+ O
        device/softwinner/common/sepolicy/vendor/system_app.te  E# C, ]9 A2 R) B) ]  g/ z& I6 \
        标签配置文件         1、file_contexts:文件安全上下文6 _7 c: S4 ^( p( m
        2、property_contexts:属性安全上下文: x& y3 }: F0 E- e

1 j0 d0 U; U1 x& W  ]5 G& [7 k! ~: C                            以飞凌嵌入式 T507 开发板 为例,T507 安全上下文文件路径如下:+ x" X. n2 j- ?  s
        device/softwinner/common/sepolicy/vendor/property_contexts
, P  I+ w" J3 q4 x$ C% Z        device/softwinner/common/sepolicy/vendor/file_contexts
8 ]  x- `+ T1 n. f. j8 u1 ?        SEAndroid app分类         SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):
0 l2 Q% t$ f% f$ W) X- q( C7 d1 R        1)untrusted_app 第三方app,没有Android平台签名,没有system权限9 \7 d9 k8 a" X, W8 M# a4 U' U
        2)platform_app 有android平台签名,没有system权限
# H6 H; M+ ]2 k& Q( a  C4 X, p; r        3)system_app 有android平台签名和system权限
( A% h* H  e" H3 H# r        从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app4 Q! l( O4 a1 ~6 X( k4 Q, P! d- e
        APP的domain和type         查看seapp_contexts文件,APP的domain和type由user和seinfo两个参数决定
0 q6 [" S( W6 _, u* C        system/sepolicy/private/seapp_contexts4 y9 u. ^& L3 O0 ]5 N9 S
        isSystemServer=true domain=system_server_startup
- z4 @5 D4 X* a3 D- T        user=_app seinfo=platform name=com.android.traceur domain=traceur_app type=app_data_file levelFrom=all# y- ~+ \1 F9 ?) m* n
        user=system seinfo=platform domain=system_app type=system_app_data_file8 S! ^6 q  O0 O$ F
        user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file
5 O0 G7 r+ F3 o        user=network_stack seinfo=network_stack domain=network_stack levelFrom=all
8 }# G/ u8 H7 B! S        type=radio_data_file
; Z4 C  Y+ ]. a1 n8 j        user=nfc seinfo=platform domain=nfc type=nfc_data_file
: |+ H* G3 S3 [! y; D$ o        user=secure_element seinfo=platform domain=secure_element levelFrom=all
/ R3 _1 A; c, ]7 c0 E6 k. P        user=radio seinfo=platform domain=radio type=radio_data_file
3 g. t1 @  L# T, a; [, }        user=shared_relro domain=shared_relro2 }& S0 a9 V8 s$ X  ^
        user=shell seinfo=platform domain=shell name=com.android.shell type=shell_data_file
: N' K* G4 `9 x2 i5 y$ \0 o        user=webview_zygote seinfo=webview_zygote domain=webview_zygote
: P4 u8 ]( a* t# x# n/ a        user=_isolated domain=isolated_app levelFrom=al. E$ o$ ^5 N, [, n4 G! M
        luser=_app seinfo=app_zygote domain=app_zygote levelFrom=all
; a" o0 G5 @' c; e. }        user=_app seinfo=media domain=mediaprovider name=android.process.media type=app_data_file " g/ r1 d0 H% a& R: J, t' G! r& L% c
        levelFrom=user
0 n9 d8 J8 F" f! N        user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user6 p8 w3 q2 O. a% x2 t7 K9 c& O
        user=_app isEphemeralApp=true domain=ephemeral_app type=app_data_file levelFrom=all" ]: a6 m3 x. Q+ U1 x
        user=_app isPrivApp=true domain=priv_app type=privapp_data_file levelFrom=user# x" F# c) W4 R9 z' _
        user=_app minTargetSdkVersion=29 domain=untrusted_app type=app_data_file levelFrom=all2 T5 d3 t# ^* @! v3 h& n% v+ C
        user=_app minTargetSdkVersion=28 domain=untrusted_app_27 type=app_data_file levelFrom=all" {' N6 u( V: N
        user=_app minTargetSdkVersion=26 domain=untrusted_app_27 type=app_data_file ; `6 `6 R  j( z/ [1 q$ B. M! b
        levelFrom=user
' q% z7 ?0 C% b( S, F        user=_app domain=untrusted_app_25 type=app_data_file levelFrom=user
' R1 E4 x* T+ O: W6 I$ m7 Y' e5 Y3 w        user=_app minTargetSdkVersion=28 fromRunAs=true domain=runas_app levelFrom=all
1 x' U$ d  ?, y- y9 r& D3 G' P, R        user=_app fromRunAs=true domain=runas_app levelFrom=user
+ L! v' ?. Y; c7 P! @2 y+ Y9 d* f        user         参考链接:https://blog.csdn.net/huilin9960/article/details/81530568
% `5 V- m$ K" T9 O( I7 C        user可以理解为UID。android的UID和linux的UID根本是两回事,Linux的UID是用于针对多用户操作系统中用于区分用户的,而Android中的UID是用于系统进行权限管理的。参考链接中的文章对于uid的产生讲的很清楚。3 U4 _" A2 \3 u6 q
        seinfo         不同签名会创建对应的selinux上下文。
, \. W. s0 q: J* S) Q        Android.mk
1 ^/ v+ Y- B$ z. _8 r* @        LOCAL_CERTIFICATE := platform( y+ N. Z: V+ S5 x% R% {  O$ e
        有platform签名,所以seinfo是platform。0 h$ h& ?. k: t4 X, d2 |: {4 j& f
        LOCAL_CERTIFICATE作用         参考文档https://blog.csdn.net/hnlgzb/article/details/107823874! y) G7 e5 v: t9 X+ j9 E* ~
        可以查看Android源码build/target/product/security/ 目录下提供的默认签名文件,不同平台可能会有差异:飞凌嵌入式 T507 开发板 提供了media、networkstack、platform、shared、testkey、verity六种不同权限的签名文件。3 B' b! E" ^: X9 V+ P5 Q0 M1 Y6 n% i
                               0 d" I% G+ U+ R' n
        以飞凌嵌入式 T507 开发板 为例,查看当前运行的应用信息:+ l& G1 l6 E- K
        console:/ # ps -Z
6 F8 g# C/ E; Q/ O        u:r:system_app:s0              system       15712  1861 1050628 110868 SyS_epoll_wait     & ?$ z0 y' G4 S" D
        0 S forlinx.example.app( C% O# j7 M, ?( p  L9 C
        u:r:untrusted_app_27:s0:c512,c768 u0_a62    30259  1861 1052120 114132 SyS_epoll_wait     1 E% I9 {1 D& R# v+ C
        0 S com.forlinx.changelogo% l1 @0 Q5 v. k
        当前运行的两个APP,forlinx.example.app的UID(user)是system,拥有platform签名,它的domain和type就是system_app。
. Z" w  w" L5 e                              
. x6 P; y6 w8 N# t0 Q& @2 B1 x* J) R1 ~
                                                  
6 }8 Q% z/ x3 Q7 x0 F" `- _4 {        com.forlinx.changelogo没有设置UID使用的默认设置,其UID为u0_a62,并且没有设置签名文件,它的domain和type就是untrusted_app。7 s4 J/ ~( L. Y7 d& `4 q
        T507自定义安全策略         以上面两个运行的app来说,我们为这两个APP添加额外的权限,对应的TE配置文件分别就是system_app.te、untrusted_app.te,对应路径为:  n6 J! f) U7 e
        device/softwinner/common/sepolicy/vendor/system_app.te
# ~- B( t$ H' g4 F        device/softwinner/common/sepolicy/vendor/untrusted_app.te
$ O) X( w9 P$ j/ }- S/ L' a, z+ T+ R: Y& O+ `
                            以forlinx.example.app为例,我们为其添加can设备的执行权限:
2 {8 E2 G% b# C2 ]7 ^& N
: U  a2 B; n5 }                            OKT507-android-source/android$ vi device/softwinner/common/sepolicy/vendor/system_app.te) ~" }# C# E3 ?
        ...
3 F# ^$ m/ [1 [& [" t5 ^        allow system_app vendor_shell_exec:file { getattr open read execute execute_no_trans };
- f; B7 n  Z, M# x        allow system_app shell_exec:file { getattr open read execute execute_no_trans };
5 B8 \9 w9 _  B        allow system_app shell:file { getattr open read execute execute_no_trans };
8 q# e9 y2 R4 w: f9 e% ]# {5 q# o        ...0 n$ ]0 `% q) a& W4 ~& x3 |) s" m
        以策略规则配置形式(allow domains types:classes permissions)7 T4 R2 f3 @* w; g; ~
        分析:domains:system_app
, Z+ J# ~- @9 \7 J0 W" C* O2 |        types:vendor_shell_exec
9 D8 A5 E/ X2 n2 d! o        classes:file* q7 t2 _$ ?$ j4 Z
        permissions:getattr open read execute execute_no_trans( N& v' s) e/ f( m2 j. \1 |
        neverallow failures         有时我们增加的权限,系统默认的配置是不允许的,比如我们上面给forlinx.example.app增加的执行脚本的权限,报错如下:
/ ~& P5 c7 g# D* D6 D) d, y: u5 T6 h4 P& E
                            libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te " |% z* d6 {* m
        (or line 41463 of policy.conf) violated by allow system_app shell:file { read open };
. {% L7 h0 \/ q+ c9 ~0 v5 B        libsepol.report_failure: neverallow on line 22 of system/sepolicy/private/shell.te) L/ S4 n0 x' C1 c3 l
         (or line 40025 of policy.conf) violated by allow system_app shell:file { read open };  Q5 d+ q  O" {
        libsepol.check_assertions: 2 neverallow failures occurred
0 G3 f: ], f" l5 D, H* Z" u2 r8 {
  Z8 N0 D" L2 n0 E- D6 y                            系统默认的安全策略的路径为system/sepolicy/,根据报错的提示,我们可以修改默认的配置,修改system/sepolicy/private/system_app.te和system/sepolicy/private/shell.te,从而完成权限的赋予。
7 c. @' J! t7 i. C' q. y( p, `% N  y- F0 }+ T
                            以上就是Android 安全策略的脉络,以及飞凌嵌入式 T507 开发板 Android系统下自定义安全策略的方法了。& j. R# H  n8 k

7 p( C( P0 y  A2 e) y1 B! _6 Y/ h
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|小黑屋| 飞凌嵌入式 ( 冀ICP备12004394号-1 )

GMT+8, 2026-2-22 09:58

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表