Android手机 未root时 文件的selinux权限 违反策略的操作拒绝日志查看办法
研究查看selinux日志记录的原因
在安卓10的一个手机上,用ls -l查看一个目录,却发现部分文件aaaa,显示ls: aaaa: Permission denied
或者
-rwxr-xr-x 20 0 0 5.8K 2024-02-12 10:44 bbbb
-????????? ? ? ? ? ? aaaa
文件的权限 所有组 组 修改时间 都是问号(https://github.com/landley/toybox/commit/c26870dab3462c6176936384b090df6b9ba46dee 这个commit修改的)
而su获取root权限后,再次ls,发现
-rwxr-xr-x 20 0 0 5.8K 2024-02-12 10:44 bbbb
-rwxr-xr-x 20 0 0 5.8K 2024-02-12 10:44 aaaa
即aaaa和bbbb的rwx权限明明是一样的,aaaa就是老显示问号
还有一个特征是,aaaa和bbbb在同一个目录里,但是只有aaaa显示问号,bbbb正常
如果都显示问号,可能是只有该目录的r权限而没有x权限导致的
搜查看selinux日志的方法,很多软件都是Android上用不了的,都是一些其它的发行版Ubuntu、CentOS、Redhat才能用的
getenforce
获取当前SELinux状态
cas:/ $ getenforce
Enforcing
setenforce
setenforce 1 设置为Enforcing
setenforce 0 设置为Permissive
查看文件和目录(和进程)的SELinux安全上下文
ls -Z
-Z, --context 打印文件的安全上下文
cas:/ $ ls -Z /system/xbin
ls: /system/xbin/qadaemon: Permission denied
ls: /system/xbin/shelld: Permission denied
ls: /system/xbin/mqsasd: Permission denied
ls: /system/xbin/miuibooster: Permission denied
ls: /system/xbin/system_perf_init: Permission denied
u:object_r:system_file:s0 antradio_app u:object_r:system_file:s0 miuioneshots (身份字段:角色:类型:灵敏度:[类别])
cas:/ $ /data/local/tmp/toybox-aarch64 ls -Z /system/xbin
? antradio_app ? miuibooster ? miuioneshots ? mqsasd ? qadaemon ? shelld ? system_perf_init
这里,好像toybox-aarch64和系统自带的ls的权限还不一样?
cas:/ $ seinfo
/system/bin/sh: seinfo: inaccessible or not found
cas:/ $ sesearch
/system/bin/sh: sesearch: inaccessible or not found
cas:/ $ sestatus
/system/bin/sh: sestatus: inaccessible or not found
audit2allow
access vector cache (AVC)
访问权限拒绝日志
dmesg
可以查看日志,但是没有root权限不能用,会显示
cas:/ $ dmesg
dmesg: klogctl: Permission denied
https://android.stackexchange.com/questions/218223/how-to-fix-dmesg-klogctl-permission-denied-for-normal-user-on-android
试了下logcat -b kernel 什么都不输出
dmesg指令打印的内容只与kernel相关,它的log源于内核缓冲区。可以用来调试内核相关的驱动程序。一般查看内核启动相关的信息,如驱动信息,硬件相关的初始化信息等这些使用dmesg指令。
logcat指令是安卓系统的专用指令,打印的内容只与应用程序相关,也就是只打印用户态的log信息
logcat
查看备用日志缓冲区
Android 日志记录系统为日志消息保留了多个环形缓冲区,而且并非所有的日志消息都会发送到默认的环形缓冲区。如要查看其他日志消息,您可以使用 -b
选项运行 logcat
命令,以请求查看备用的环形缓冲区。您可以查看下列任意备用缓冲区:
radio
:查看包含无线装置/电话相关消息的缓冲区。events
:查看已经过解译的二进制系统事件缓冲区消息。main
:查看主日志缓冲区(默认),不包含系统和崩溃日志消息。system
:查看系统日志缓冲区(默认)。crash
:查看崩溃日志缓冲区(默认)。all
:查看所有缓冲区。default
:报告main
、system
和crash
缓冲区。-
kernel :如果属性ro.logd.kernel设置为true(可调试版本上的默认值),Android 的日志守护进程 ( logd ) 将内核消息写入名为kernel的单独缓冲区,可以使用logcat读取该缓冲区(不需要 root):
adb shell su root dmesg | grep 'avc: '
logcat | grep 'avc'
02-14 22:48:54.648 3094 3094 W ls : type=1400 audit(0.0:1932474): avc: denied { getattr } for path="/system/xbin/miuibooster" dev="dm-4" ino=6310 scontext=u:r:shell:s0 tcontext=u:object_r:miuibooster_exec:s0 tclass=file permissive=0
02-14 22:48:54.648
是事件发生的时间戳,表示事件发生在2 月 14 日 22:48:54.648。3094 3094
是进程的ID,表示事件发生时,进程的ID为 3094。W
表示这是一个警告级别的日志。ls
是进程的名字,表示事件发生时的进程名为ls
。type=1400
表示事件的类型,具体含义需要参考Android的安全审计日志类型定义。audit(0.0:1932474)
表示审计事件的序号,用于标识事件在审计日志中的顺序。avc: denied { getattr } for path="/system/xbin/miuibooster" dev="dm-4" ino=6310 scontext=u:r:shell:s0 tcontext=u:object_r:miuibooster_exec:s0 tclass=file permissive=0
是事件的具体描述,包含了发生的事件、权限拒绝的操作、受影响的路径、设备信息、安全上下文等详细信息。avc: denied { getattr }
表示权限被拒绝的操作是getattr
,即获取文件属性。path="/system/xbin/miuibooster"
表示受影响的文件路径是/system/xbin/miuibooster
。dev="dm-4"
表示文件所在的设备是dm-4
。(/dev/block/dm-4)ino=6310
表示文件的inode号为 6310。scontext=u:r:shell:s0
表示发起操作的进程的安全上下文。tcontext=u:object_r:miuibooster_exec:s0
表示目标文件的安全上下文。tclass=file
表示目标对象的类型是文件。permissive=0
表示系统当前的 SELinux 模式为严格模式,不允许该操作。
logd
native bin
在native 层,安卓提供了一个/system/bin/logcat native 命令行程序,作为一个统一的客户端通信进程。开发者通过 adb logcat 相关指令可以读日志或者给logd发送指令。
Linux 内核的审核系统可以记录进程所做的任何系统调用或文件系统更改。Linux 发行版有一个服务auditd,它与内核通信以获取有关安全相关事件的信息。在 Android 上,我们已经有logd,虽然不像auditd那样可配置,但足以进行基本监控。logd主要涵盖其桌面版本syslogd的功能,还包括klogd和部分auditd,以从内核的 SELinux 子系统获取日志。