嵌入式爱好者

查看: 12574|回复: 0

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

[复制链接]

46

主题

53

帖子

297

积分

扫一扫,手机访问本帖
发表于 2021-12-5 17:25:38 | 显示全部楼层 |阅读模式
        硬件平台:飞凌嵌入式 OKT507-C开发板5 s: H" z* g. l/ n9 r8 p
        操作系统:Android10.0$ }! c0 \0 J5 l- C
" h4 b6 m  t" B0 J& {1 `% l; w8 l
                            飞凌嵌入式 T507 开发板 Android系统版本为Android10.0,默认开启了SELinux。基于MAC访问控制模型的SElinux,可以更好地保护我们的Android系统, 比如限制系统服务的访问权限、控制应用对数据和系统日志的访问等措施,这样就降低了恶意软件的影响,并且可以防止因代码存在的缺陷而产生的对系统安全的影响。2 X2 W8 j( x1 a+ V
        从系统安全方面考虑,SELinux是保护神,但是从软件开发方面,SELinux就是一道牵绊,这是一把双刃剑。
9 v% N% o3 X( I5 p" `2 Z7 Q                                  V2 a5 t2 z: V  \2 q  K  M
        比如我们开发应用或者增加系统服务的某些权限的时候,我们必须遵循SELinux的规则,给我们的应用设置对应的安全策略,否则我们的应用就不具备访问数据或者设备的权限。下面我们MAC访问控制模型开始,简单的梳理一下飞凌嵌入式 T507 开发板  Android的安全策略,以及自定义飞凌嵌入式 T507 开发板 Android安全策略的方法。* ~& B: w; [5 V+ {( j
        访问控制模型DAC,MAC         访问控制是指控制对计算机或者网络中某个资源的访问。没有它,所有人都可以访问任何资源。有了访问控制,用户在获取实际访问资源或进行操作之前,必须通过识别、验证、授权。* ]4 {- X& g0 O+ u
        自主访问控制(DAC: Discretionary Access Control)系统识别用户,根据被操作对象的权限的设置,来决定该用户对其拥有的操作权限,read、write、exec。拥有这个对象权限的用户,又可以将该权限分配给其他用户,此谓之“Discretionary”。缺陷就是对权限控制比较分散,不便于管理,比如无法简单地将一组文件设置统一的权限开放给指定的一群用户。
. ~5 C: W1 r5 Q. I6 }& ~        强制访问控制(MAC: Mandatory Access Control)MAC是为了弥补DAC权限控制过于分散的问题而诞生的。在MAC这种模型里,管理员管理访问控制。管理员制定策略,用户不能改变它。策略定义了哪个主体能访问哪个对象。这种访问控制模型可以增加安全级别,因为它基于策略,任何没有被显式授权的操作都不能执行。MAC被开发和实现在最重视保密的系统中,如军事系统。主体获得清楚的标记,对象得到分类标记,或称安全级别。
. p- e) p# i" ?8 `6 K! P' M- \' _        基于MAC的SElinux         参考链接:https://source.android.google.cn/security/selinux  ]3 j* m1 t& K2 j: B2 X+ h
        软件通常情况下必须以 Root 用户帐号的身份运行,才能向原始块设备写入数据。在基于 DAC 的传统 Linux 环境中,如果 Root 用户遭到入侵,攻击者便可以利用该用户身份向每个原始块设备写入数据。从 Android 4.3 起,SELinux 开始为传统的自主访问控制 (DAC) 环境提供强制访问控制 (MAC) 保护功能。作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。例如,可以使用 SELinux 为这些设备添加标签,以便被分配了 Root 权限的进程只能向相关政策中指定的设备写入数据。这样一来,该进程便无法重写特定原始块设备之外的数据和系统设置。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。' ~& x6 J3 `$ h% |, C- ^& T
                               0 w' r1 H; r( T4 j3 T, ^9 a- ]

# K$ c& @  c0 ^% c1 P% D/ [- x                            飞凌嵌入式 T507 开发板 Android系统版本为Android10,SELinux默认开启,即使获得了该系统的root权限,也只能向相关策略中指定的设备写入数据,从而更好地保护和限制系统服务,保障系统和数据的安全。% ~6 A- Y" D4 y: V
        标签、规则和域         SELinux 依靠标签来匹配操作和策略。标签用于决定允许的事项。套接字、文件和进程在 SELinux 中都有标签。SELinux 在做决定时需参照两点:一是为这些对象分配的标签,二是定义这些对象如何交互的策略。4 Y, W+ W/ J+ i3 I: b0 W% D3 ]
        在 SELinux 中,标签采用以下形式:user:role:type:mls_level,其中 type 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。3 C6 l1 b% d) N9 U8 G
        策略规则采用以下形式:allow domains types:classes permissions;,其中:
; `( F# _, @0 s# W2 `$ m1 W8 m1 t4 o# d, |8 \  t5 b  d  N, x
                            Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
$ U; G3 I  f: o' t7 M        Type - 一个对象(例如,文件、套接字)或一组对象的标签。
* F, c: \+ l; T: ]# G3 v6 m0 z        Class - 要访问的对象(例如,文件、套接字)的类型。Permission - 要执行的操作(例如,读取、写入)。+ |! T: a7 ~8 Y) H9 P$ x- _! G! B
        策略配置源文件         1、external/sepolicy
. P+ Y! [: |9 T& G& d3 J8 f+ g        这是独立于设备的配置,一般不能针对设备进行修改
) K& c0 K3 Q2 E+ v5 p
& }, C$ q: M9 _6 ~/ J                            2、device/<vendor>/<product>/sepolicy
  l- V  M4 x* Q% e) h        这是特定于设备的配置,基于 BOARD_SEPOLICY_* 变量来选择对应平台的策略配置。6 [4 _  d; z& a7 o! F3 g: |0 |
0 H$ f% z. r+ K/ ~! x+ l
                            以飞凌嵌入式 T507 开发板 为例,T507策略文件的路径如下:
9 Q( C) w, r& S/ ?5 z8 K. G        OKT507-android-source/android$ ls device/softwinner/common/sepolicy/private  vendor" }& n* H3 ?) C- `( w
        Type Enforcement (TE) 配置文件         .te 文件中保存了对应对象的域和类型定义、规则。通常每个域一个 .te 文件,例如installd.te。在 device.te、file.te 中声明了设备和文件类型。在某些文件(例如domain.te、app.te)中则存储着共享规则。4 k8 K6 G# z: `& m  n% ?! Y

9 @0 I  e, l. ^: l9 X2 v$ \# L                            以飞凌嵌入式 T507 开发板 为例,T507 system_app的TE文件的路径如下:& s8 r7 p- O0 n3 o/ e
        device/softwinner/common/sepolicy/vendor/system_app.te5 w" }4 g4 N8 t' h! T. E$ [: W
        标签配置文件         1、file_contexts:文件安全上下文' U: E( B! r+ _: Z' f: z* q$ C
        2、property_contexts:属性安全上下文
$ w' h4 q5 o- q7 u6 f4 H7 [
- ~4 \# L% I1 V  C7 R                            以飞凌嵌入式 T507 开发板 为例,T507 安全上下文文件路径如下:( @3 O: S" N! H2 h3 H
        device/softwinner/common/sepolicy/vendor/property_contexts9 ^' `4 d$ Q4 N. ?
        device/softwinner/common/sepolicy/vendor/file_contexts
' U1 i, K: a, P- H* a& N8 M: m4 O        SEAndroid app分类         SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):; d$ `# H6 M* P  d$ Z, ]
        1)untrusted_app 第三方app,没有Android平台签名,没有system权限
" C! m8 R1 E" ]        2)platform_app 有android平台签名,没有system权限  }* r/ U3 [8 l! d& v- f: k
        3)system_app 有android平台签名和system权限- e, o- G! V4 `) C7 M
        从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app
8 x9 g- T/ e: x6 e$ D; G        APP的domain和type         查看seapp_contexts文件,APP的domain和type由user和seinfo两个参数决定
+ ~# d: ^' a, T7 \6 @/ S1 e; _8 \) W        system/sepolicy/private/seapp_contexts. ?( k$ S6 e- d! r; z
        isSystemServer=true domain=system_server_startup
9 w# B- Q4 d( m; ^& s5 l7 i. _        user=_app seinfo=platform name=com.android.traceur domain=traceur_app type=app_data_file levelFrom=all
( q% K; e7 J7 G$ c6 [3 ~+ a        user=system seinfo=platform domain=system_app type=system_app_data_file
: q6 N# l, ~* u- K  J# b        user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file
8 }/ o1 c: \5 U2 K9 `' J5 e& w! A" T7 d        user=network_stack seinfo=network_stack domain=network_stack levelFrom=all + I( y* k4 b, q# r2 G) I
        type=radio_data_file9 f  `2 o8 }3 s
        user=nfc seinfo=platform domain=nfc type=nfc_data_file
4 i2 z. }% w! E& R% u- I3 _3 T) J        user=secure_element seinfo=platform domain=secure_element levelFrom=all7 Z6 G8 w) }7 z+ q. t) e  c9 C" l
        user=radio seinfo=platform domain=radio type=radio_data_file6 |. o' g6 G* k
        user=shared_relro domain=shared_relro
5 b7 j8 a; ^- I' _9 Z2 C        user=shell seinfo=platform domain=shell name=com.android.shell type=shell_data_file
( ?) v7 F1 S  z' y# H        user=webview_zygote seinfo=webview_zygote domain=webview_zygote
! k7 ~% B" }0 g        user=_isolated domain=isolated_app levelFrom=al8 r# ?- s5 C5 V0 G! q/ y2 a3 j
        luser=_app seinfo=app_zygote domain=app_zygote levelFrom=all0 l5 @3 l2 ?4 A) p0 g, Y; U% x
        user=_app seinfo=media domain=mediaprovider name=android.process.media type=app_data_file 6 }9 J$ F" p5 R( _% c) @# n5 `
        levelFrom=user8 }( m$ C. f$ o$ z9 N: [$ c) l
        user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user1 C  T$ Z" w$ D7 t  U# g
        user=_app isEphemeralApp=true domain=ephemeral_app type=app_data_file levelFrom=all
4 y1 E# S9 e8 o4 b6 S1 K! G$ U# s        user=_app isPrivApp=true domain=priv_app type=privapp_data_file levelFrom=user! P8 ^' U" j% Y% ]9 y; p
        user=_app minTargetSdkVersion=29 domain=untrusted_app type=app_data_file levelFrom=all
, Y. T) _: `+ e. G        user=_app minTargetSdkVersion=28 domain=untrusted_app_27 type=app_data_file levelFrom=all3 K  R6 c5 q, q% Z- H/ Z6 U# U
        user=_app minTargetSdkVersion=26 domain=untrusted_app_27 type=app_data_file 0 z6 ^2 M' g% n* F# a
        levelFrom=user
  c, s9 w# p5 x& A! o( N        user=_app domain=untrusted_app_25 type=app_data_file levelFrom=user) j) v  e/ v  d' P- C4 W
        user=_app minTargetSdkVersion=28 fromRunAs=true domain=runas_app levelFrom=all& g& Z* W4 ?3 O8 o
        user=_app fromRunAs=true domain=runas_app levelFrom=user7 i5 K1 y' t0 S* r) C
        user         参考链接:https://blog.csdn.net/huilin9960/article/details/81530568
, h5 l) d/ Q* _1 O% W        user可以理解为UID。android的UID和linux的UID根本是两回事,Linux的UID是用于针对多用户操作系统中用于区分用户的,而Android中的UID是用于系统进行权限管理的。参考链接中的文章对于uid的产生讲的很清楚。) t( ~" N0 E& R3 B5 M3 X
        seinfo         不同签名会创建对应的selinux上下文。5 X' Z# A+ P( k; f  F
        Android.mk* J) S% f: M# p1 h, w/ k! f
        LOCAL_CERTIFICATE := platform
- D  L8 Q( q$ ~: j9 U4 s# n        有platform签名,所以seinfo是platform。" Y7 v' N0 Y" s3 v, L9 m2 h  H
        LOCAL_CERTIFICATE作用         参考文档https://blog.csdn.net/hnlgzb/article/details/1078238749 L9 L8 u6 D2 z+ \; c. i! C, a
        可以查看Android源码build/target/product/security/ 目录下提供的默认签名文件,不同平台可能会有差异:飞凌嵌入式 T507 开发板 提供了media、networkstack、platform、shared、testkey、verity六种不同权限的签名文件。7 Y- P4 Q5 u# y% G7 C
                              
* [8 V! T2 l4 s6 g8 J' p9 n        以飞凌嵌入式 T507 开发板 为例,查看当前运行的应用信息:2 j+ M  y, Q% c% F
        console:/ # ps -Z
5 q+ ^4 }9 b/ Q        u:r:system_app:s0              system       15712  1861 1050628 110868 SyS_epoll_wait     5 T' E/ T. @/ M8 A; n+ R8 |
        0 S forlinx.example.app4 [5 V8 Q# G( u5 k, I
        u:r:untrusted_app_27:s0:c512,c768 u0_a62    30259  1861 1052120 114132 SyS_epoll_wait     
* s* M/ \+ f& e3 v        0 S com.forlinx.changelogo
  K9 Q2 [8 f5 y% n7 ^2 Y% @        当前运行的两个APP,forlinx.example.app的UID(user)是system,拥有platform签名,它的domain和type就是system_app。1 U6 r& C" D" z; H
                              
: h) Y, @. x# ~- h6 s7 n7 f% `2 _8 s! w) e8 S: b- J
                                                  
/ p) ~: m( `) |- T# _' w7 U, L        com.forlinx.changelogo没有设置UID使用的默认设置,其UID为u0_a62,并且没有设置签名文件,它的domain和type就是untrusted_app。- {2 w2 o) f$ z; ~4 _. N
        T507自定义安全策略         以上面两个运行的app来说,我们为这两个APP添加额外的权限,对应的TE配置文件分别就是system_app.te、untrusted_app.te,对应路径为:
- N' G3 t1 k4 a$ k" L        device/softwinner/common/sepolicy/vendor/system_app.te5 h$ _* ?: |: C! v3 Y1 R+ y
        device/softwinner/common/sepolicy/vendor/untrusted_app.te9 R: a0 Y6 x( e3 D( M! [

2 M- ^" k8 Z# J                            以forlinx.example.app为例,我们为其添加can设备的执行权限:
, U0 {/ c( b+ h& `! H" Q/ o9 H7 ^7 B+ Y, s+ l, @8 Y
                            OKT507-android-source/android$ vi device/softwinner/common/sepolicy/vendor/system_app.te
; v% K* ?2 q8 W6 L, d$ J7 @% l. l        ...
" s5 M% C2 Q' t4 V( E        allow system_app vendor_shell_exec:file { getattr open read execute execute_no_trans };
8 q5 e& b9 i2 t- l! l        allow system_app shell_exec:file { getattr open read execute execute_no_trans };
9 b$ T# j9 Y  U3 P) F        allow system_app shell:file { getattr open read execute execute_no_trans };
. g/ R9 p" V2 p* k7 X& o        ...0 t4 v  ^5 Y8 x
        以策略规则配置形式(allow domains types:classes permissions)
4 z% o5 V8 {4 r+ U        分析:domains:system_app
4 J* D* E  R; L" n7 B7 A        types:vendor_shell_exec
! `5 i0 U" I) n        classes:file
/ U% p7 i$ E3 ~8 g( P2 O$ M% b        permissions:getattr open read execute execute_no_trans/ w& \' H# U! \/ ]: T9 p8 N3 i
        neverallow failures         有时我们增加的权限,系统默认的配置是不允许的,比如我们上面给forlinx.example.app增加的执行脚本的权限,报错如下:  x7 K; U% _9 W- H* r5 g/ x

& u+ Z+ Q/ g! `" O1 x                            libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te
6 D' }- O* s$ N        (or line 41463 of policy.conf) violated by allow system_app shell:file { read open };
3 B8 X& p0 J9 r& _  w4 R$ a        libsepol.report_failure: neverallow on line 22 of system/sepolicy/private/shell.te
0 G  }5 K/ c; c7 x9 T/ {         (or line 40025 of policy.conf) violated by allow system_app shell:file { read open };! {7 I4 k  r, k- @4 a$ r
        libsepol.check_assertions: 2 neverallow failures occurred/ F3 ^- D, c& s* t' Z8 k0 Y: k2 ]

8 x& n# w6 \: E                            系统默认的安全策略的路径为system/sepolicy/,根据报错的提示,我们可以修改默认的配置,修改system/sepolicy/private/system_app.te和system/sepolicy/private/shell.te,从而完成权限的赋予。2 \  G. g0 z: S( X2 z& f+ _
* a( I! `; f1 K) Y
                            以上就是Android 安全策略的脉络,以及飞凌嵌入式 T507 开发板 Android系统下自定义安全策略的方法了。
% H/ B& {  ~3 R1 r& w- ]0 ]0 d' c" \- X# n. ]: g
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-2-7 16:19

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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