嵌入式爱好者

查看: 12410|回复: 0

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

[复制链接]

46

主题

53

帖子

297

积分

扫一扫,手机访问本帖
发表于 2021-12-5 17:25:38 | 显示全部楼层 |阅读模式
        硬件平台:飞凌嵌入式 OKT507-C开发板2 i2 D  |4 q5 b
        操作系统:Android10.04 d2 u! z$ ^( |9 w; L

$ k- K4 Z" U) K0 S                            飞凌嵌入式 T507 开发板 Android系统版本为Android10.0,默认开启了SELinux。基于MAC访问控制模型的SElinux,可以更好地保护我们的Android系统, 比如限制系统服务的访问权限、控制应用对数据和系统日志的访问等措施,这样就降低了恶意软件的影响,并且可以防止因代码存在的缺陷而产生的对系统安全的影响。
5 k0 X/ r4 u: F7 N, _: R5 D- ?        从系统安全方面考虑,SELinux是保护神,但是从软件开发方面,SELinux就是一道牵绊,这是一把双刃剑。9 _5 F; g8 n4 z2 [. J8 _
                                ) I/ V4 W. W6 a! f4 i
        比如我们开发应用或者增加系统服务的某些权限的时候,我们必须遵循SELinux的规则,给我们的应用设置对应的安全策略,否则我们的应用就不具备访问数据或者设备的权限。下面我们MAC访问控制模型开始,简单的梳理一下飞凌嵌入式 T507 开发板  Android的安全策略,以及自定义飞凌嵌入式 T507 开发板 Android安全策略的方法。" k7 q6 |# V  S/ }# r6 @% k% ]0 V2 `' ~
        访问控制模型DAC,MAC         访问控制是指控制对计算机或者网络中某个资源的访问。没有它,所有人都可以访问任何资源。有了访问控制,用户在获取实际访问资源或进行操作之前,必须通过识别、验证、授权。! B) @( x) Q2 c+ Q2 U6 R3 o
        自主访问控制(DAC: Discretionary Access Control)系统识别用户,根据被操作对象的权限的设置,来决定该用户对其拥有的操作权限,read、write、exec。拥有这个对象权限的用户,又可以将该权限分配给其他用户,此谓之“Discretionary”。缺陷就是对权限控制比较分散,不便于管理,比如无法简单地将一组文件设置统一的权限开放给指定的一群用户。
" [6 K" Z6 Z( [        强制访问控制(MAC: Mandatory Access Control)MAC是为了弥补DAC权限控制过于分散的问题而诞生的。在MAC这种模型里,管理员管理访问控制。管理员制定策略,用户不能改变它。策略定义了哪个主体能访问哪个对象。这种访问控制模型可以增加安全级别,因为它基于策略,任何没有被显式授权的操作都不能执行。MAC被开发和实现在最重视保密的系统中,如军事系统。主体获得清楚的标记,对象得到分类标记,或称安全级别。! T* |$ _$ H7 _3 c% s
        基于MAC的SElinux         参考链接:https://source.android.google.cn/security/selinux
! q" L2 `- W) I' R: b0 @" z* e        软件通常情况下必须以 Root 用户帐号的身份运行,才能向原始块设备写入数据。在基于 DAC 的传统 Linux 环境中,如果 Root 用户遭到入侵,攻击者便可以利用该用户身份向每个原始块设备写入数据。从 Android 4.3 起,SELinux 开始为传统的自主访问控制 (DAC) 环境提供强制访问控制 (MAC) 保护功能。作为 Android 安全模型的一部分,Android 使用安全增强型 Linux (SELinux) 对所有进程强制执行强制访问控制 (MAC),甚至包括以 Root/超级用户权限运行的进程(Linux 功能)。例如,可以使用 SELinux 为这些设备添加标签,以便被分配了 Root 权限的进程只能向相关政策中指定的设备写入数据。这样一来,该进程便无法重写特定原始块设备之外的数据和系统设置。借助 SELinux,Android 可以更好地保护和限制系统服务、控制对应用数据和系统日志的访问、降低恶意软件的影响,并保护用户免遭移动设备上的代码可能存在的缺陷的影响。7 L, Y$ w' w7 V8 v' p0 |; [1 q
                              
% [/ b# ^  m* `' _3 O& ^
( J7 i2 k/ u2 ]7 v, n                            飞凌嵌入式 T507 开发板 Android系统版本为Android10,SELinux默认开启,即使获得了该系统的root权限,也只能向相关策略中指定的设备写入数据,从而更好地保护和限制系统服务,保障系统和数据的安全。7 w8 G  d( X9 X/ p
        标签、规则和域         SELinux 依靠标签来匹配操作和策略。标签用于决定允许的事项。套接字、文件和进程在 SELinux 中都有标签。SELinux 在做决定时需参照两点:一是为这些对象分配的标签,二是定义这些对象如何交互的策略。7 g! K: R  ]7 Q& f
        在 SELinux 中,标签采用以下形式:user:role:type:mls_level,其中 type 是访问决定的主要组成部分,可通过构成标签的其他组成部分进行修改。对象会映射到类,对每个类的不同访问类型由权限表示。* R% _3 B9 K+ W+ d9 f
        策略规则采用以下形式:allow domains types:classes permissions;,其中:
  j7 K5 R% _: n8 ~. W) ?6 O
" ]1 ?/ H/ k& @6 t3 X2 B- z3 I! z                            Domain - 一个进程或一组进程的标签。也称为域类型,因为它只是指进程的类型。
* n! g2 O+ C, \7 ^$ H$ x: d        Type - 一个对象(例如,文件、套接字)或一组对象的标签。
( _# q" ?  J2 j; z! j3 K: h/ K        Class - 要访问的对象(例如,文件、套接字)的类型。Permission - 要执行的操作(例如,读取、写入)。$ U% l# f# Z9 n( I5 B
        策略配置源文件         1、external/sepolicy
  _5 ~6 C, _# ~5 V5 S& T7 B6 L# w        这是独立于设备的配置,一般不能针对设备进行修改
% ?4 _8 t4 R& ~" m0 h& v" H3 _/ e; r# ~" |
                            2、device/<vendor>/<product>/sepolicy  d+ [  P) C* H* H9 Q. u0 P8 c& Q1 n
        这是特定于设备的配置,基于 BOARD_SEPOLICY_* 变量来选择对应平台的策略配置。
/ l% c3 G! \$ K/ }" v) N7 s2 n: d7 w% }. x5 S) X" M6 |1 n) O
                            以飞凌嵌入式 T507 开发板 为例,T507策略文件的路径如下:
3 \1 l7 w5 F, O7 |        OKT507-android-source/android$ ls device/softwinner/common/sepolicy/private  vendor* b, {# z/ L! s9 _9 h
        Type Enforcement (TE) 配置文件         .te 文件中保存了对应对象的域和类型定义、规则。通常每个域一个 .te 文件,例如installd.te。在 device.te、file.te 中声明了设备和文件类型。在某些文件(例如domain.te、app.te)中则存储着共享规则。# {8 w- Z+ k& W8 G8 ^4 ]

5 v" c, f1 I" p# Y( ]' b                            以飞凌嵌入式 T507 开发板 为例,T507 system_app的TE文件的路径如下:8 P6 q! ~5 A* Y7 E3 q  r! X
        device/softwinner/common/sepolicy/vendor/system_app.te
! p6 P4 z' K5 Q- w' n        标签配置文件         1、file_contexts:文件安全上下文
5 H- {  a6 D! s7 p) f        2、property_contexts:属性安全上下文
. W/ l! v& C7 A, h! Y# D6 X
2 A, k% `% O; B                            以飞凌嵌入式 T507 开发板 为例,T507 安全上下文文件路径如下:
1 w4 Y: I2 ]4 z* l8 o5 r; D" d2 v  C- b        device/softwinner/common/sepolicy/vendor/property_contexts: `: G; N3 B5 }
        device/softwinner/common/sepolicy/vendor/file_contexts
% Q9 p0 [& k5 w: o" U  I+ J        SEAndroid app分类         SELinux(或SEAndroid)将app划分为主要三种类型(根据user不同,也有其他的domain类型):. e7 s+ m; r2 y% B4 {0 q9 w
        1)untrusted_app 第三方app,没有Android平台签名,没有system权限
' [% O3 S3 N. L% T7 }2 g5 O( I        2)platform_app 有android平台签名,没有system权限& `7 t7 G2 r1 b; K8 f! w/ {
        3)system_app 有android平台签名和system权限
& o5 L+ g1 |6 b( ~        从上面划分,权限等级,理论上:untrusted_app < platform_app < system_app* ]( S4 x. X, O3 Z1 z
        APP的domain和type         查看seapp_contexts文件,APP的domain和type由user和seinfo两个参数决定
! q. l9 q4 o1 P0 ], L1 m        system/sepolicy/private/seapp_contexts
1 `' \6 k% V4 Q* q$ Q. d        isSystemServer=true domain=system_server_startup3 e5 |) D9 J5 E" U9 e7 S
        user=_app seinfo=platform name=com.android.traceur domain=traceur_app type=app_data_file levelFrom=all
. W% O8 Z$ t1 z! |) |+ ?5 C        user=system seinfo=platform domain=system_app type=system_app_data_file2 x; R% ?! |0 _4 L7 c7 Y
        user=bluetooth seinfo=platform domain=bluetooth type=bluetooth_data_file
+ Z+ H/ r1 o( B1 y        user=network_stack seinfo=network_stack domain=network_stack levelFrom=all : v. M2 T3 V) Z: y9 {
        type=radio_data_file
# Y; r& X* T% i        user=nfc seinfo=platform domain=nfc type=nfc_data_file' r$ b. b7 k$ I
        user=secure_element seinfo=platform domain=secure_element levelFrom=all; r3 v! M) I& p! b
        user=radio seinfo=platform domain=radio type=radio_data_file
( n$ }- d# T. M# f! ^        user=shared_relro domain=shared_relro
3 }' Z7 z! K$ @& J- R        user=shell seinfo=platform domain=shell name=com.android.shell type=shell_data_file$ h1 e# P# d$ u
        user=webview_zygote seinfo=webview_zygote domain=webview_zygote- _6 ?1 n2 `2 S( b
        user=_isolated domain=isolated_app levelFrom=al* H6 x/ s" O* R+ G. p6 ~' Q! Z
        luser=_app seinfo=app_zygote domain=app_zygote levelFrom=all
& f" M; R$ X* L) J0 n: U0 o* M- [        user=_app seinfo=media domain=mediaprovider name=android.process.media type=app_data_file ( B* K( L- S  V; N
        levelFrom=user
0 X- ~7 r# W0 l& V# V        user=_app seinfo=platform domain=platform_app type=app_data_file levelFrom=user
& h$ U5 g, K" v$ c: p. Q        user=_app isEphemeralApp=true domain=ephemeral_app type=app_data_file levelFrom=all
; v# M! H* Y+ `( L. l        user=_app isPrivApp=true domain=priv_app type=privapp_data_file levelFrom=user  |7 D% @* G/ _" d, r" P* Y
        user=_app minTargetSdkVersion=29 domain=untrusted_app type=app_data_file levelFrom=all
: ?4 v5 j3 T2 @$ n: S& [$ G        user=_app minTargetSdkVersion=28 domain=untrusted_app_27 type=app_data_file levelFrom=all/ y/ |% {' ?; ]8 o: v5 p3 U& F+ K
        user=_app minTargetSdkVersion=26 domain=untrusted_app_27 type=app_data_file ! B/ i: Z: }# ]8 T) c
        levelFrom=user8 Y+ N4 R) I6 t
        user=_app domain=untrusted_app_25 type=app_data_file levelFrom=user1 X9 G* r3 D  P) I6 h; M0 D
        user=_app minTargetSdkVersion=28 fromRunAs=true domain=runas_app levelFrom=all
- G  J# o# \4 E3 k/ e0 R        user=_app fromRunAs=true domain=runas_app levelFrom=user4 y0 F+ J% |* W- }" {
        user         参考链接:https://blog.csdn.net/huilin9960/article/details/81530568
/ n  P* X* x4 o8 p8 S, W# Y9 r        user可以理解为UID。android的UID和linux的UID根本是两回事,Linux的UID是用于针对多用户操作系统中用于区分用户的,而Android中的UID是用于系统进行权限管理的。参考链接中的文章对于uid的产生讲的很清楚。
$ r  o6 Q! x: O7 C        seinfo         不同签名会创建对应的selinux上下文。
# S* j' E; F: u/ y9 s        Android.mk
0 c8 F5 t% ^5 @" F$ U3 g7 |; Z        LOCAL_CERTIFICATE := platform
, [. S( p% |& {, z8 J9 K- Y9 W1 t        有platform签名,所以seinfo是platform。3 M9 Q' N: \& U) m: O
        LOCAL_CERTIFICATE作用         参考文档https://blog.csdn.net/hnlgzb/article/details/1078238746 U; n$ @( c- ^0 Q4 a8 K1 L
        可以查看Android源码build/target/product/security/ 目录下提供的默认签名文件,不同平台可能会有差异:飞凌嵌入式 T507 开发板 提供了media、networkstack、platform、shared、testkey、verity六种不同权限的签名文件。
3 S+ ^0 T0 u+ L% t6 r                              
+ W6 W& s7 J, o* v1 V        以飞凌嵌入式 T507 开发板 为例,查看当前运行的应用信息:
( G) i7 r3 h6 p0 b" N        console:/ # ps -Z
1 e6 j: C5 R2 J, Z6 ]. [        u:r:system_app:s0              system       15712  1861 1050628 110868 SyS_epoll_wait     
: s' e3 j% l, [: n% P' w" P% l2 k        0 S forlinx.example.app+ G  N& \8 U& B1 i! [8 @/ l
        u:r:untrusted_app_27:s0:c512,c768 u0_a62    30259  1861 1052120 114132 SyS_epoll_wait     ! Q8 \0 k2 Q- i7 ?
        0 S com.forlinx.changelogo
& j( X5 u: `& L( U3 b        当前运行的两个APP,forlinx.example.app的UID(user)是system,拥有platform签名,它的domain和type就是system_app。
& @3 r; A9 U2 }9 H2 Z                              
6 |5 e5 b8 F) g$ t3 F
/ G+ r2 h$ ^+ h5 w                                                  
% |: U" ?; ?  Z4 w        com.forlinx.changelogo没有设置UID使用的默认设置,其UID为u0_a62,并且没有设置签名文件,它的domain和type就是untrusted_app。1 x# }6 b* ?4 g4 n5 F
        T507自定义安全策略         以上面两个运行的app来说,我们为这两个APP添加额外的权限,对应的TE配置文件分别就是system_app.te、untrusted_app.te,对应路径为:
7 W/ o! d- A! w8 `        device/softwinner/common/sepolicy/vendor/system_app.te
, j1 E& R" U# b! ?% }9 Z" Q: q        device/softwinner/common/sepolicy/vendor/untrusted_app.te, b: w. j: C* X4 D1 L& Z( f9 A

0 F; ]8 w% w' p% X$ A                            以forlinx.example.app为例,我们为其添加can设备的执行权限:
0 J% P/ `0 z$ T* \# k2 W  F! j3 Z$ k
  @8 Y, i+ A- b$ K                            OKT507-android-source/android$ vi device/softwinner/common/sepolicy/vendor/system_app.te3 \  b8 y2 V6 S. Q% O1 c6 S+ ^
        ...; R( G0 r! a% M$ A& t( |" x; |
        allow system_app vendor_shell_exec:file { getattr open read execute execute_no_trans };
4 |5 ]) A6 @( D6 d& |1 t, |' Z  |        allow system_app shell_exec:file { getattr open read execute execute_no_trans };/ Y; G% R# i3 ]  e& \* q* [
        allow system_app shell:file { getattr open read execute execute_no_trans };) h, K9 ?# Z8 ]# i
        ...
& N; D6 l6 x: z' F3 Z( }- O' m# a        以策略规则配置形式(allow domains types:classes permissions)% i6 f* v. Y" P; n
        分析:domains:system_app% Y; @( ?; b- D
        types:vendor_shell_exec5 T9 Q% U! ]: g& h$ F
        classes:file
9 e# k: d! }% W4 P$ l% t3 K5 z        permissions:getattr open read execute execute_no_trans( s8 H! [4 X8 K5 P7 \- t
        neverallow failures         有时我们增加的权限,系统默认的配置是不允许的,比如我们上面给forlinx.example.app增加的执行脚本的权限,报错如下:
3 |1 o; j+ M. d, y# L. P; s
3 U/ y& l  I: B! `7 ]                            libsepol.report_failure: neverallow on line 9 of system/sepolicy/private/system_app.te
4 ?# F+ @  O# F3 }        (or line 41463 of policy.conf) violated by allow system_app shell:file { read open };7 g, a8 p4 b  t# t7 W2 k9 Z4 j4 b
        libsepol.report_failure: neverallow on line 22 of system/sepolicy/private/shell.te8 F. r1 E5 D. E* ]8 K1 T
         (or line 40025 of policy.conf) violated by allow system_app shell:file { read open };) ?- d$ L& [+ R7 ~0 ~6 t
        libsepol.check_assertions: 2 neverallow failures occurred! |& j; ]3 F; _" O

3 P& o% m3 ~- t2 J& _                            系统默认的安全策略的路径为system/sepolicy/,根据报错的提示,我们可以修改默认的配置,修改system/sepolicy/private/system_app.te和system/sepolicy/private/shell.te,从而完成权限的赋予。4 B& D9 p3 b8 Y8 J6 g1 _/ a) C
5 p; D) {% r" \& Z; G6 h
                            以上就是Android 安全策略的脉络,以及飞凌嵌入式 T507 开发板 Android系统下自定义安全策略的方法了。! \( f* K$ X+ K3 C% V, Y
% y: z, S- b2 [/ A
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-1-22 10:24

Powered by Discuz! X3.4

© 2001-2013 Comsenz Inc.

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