- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我在让自定义 selinux 策略在基于 AOSP 的 Android 7.1.2(更准确地说是基于索尼开放设备树)上正常运行时遇到了一些麻烦。
我的问题是审核日志不断告诉我缺少我实际添加的文件访问规则。我还将 audit2allow 创建的规则复制到我的策略文件中,但即使是这些规则也无法正常工作。
那么,让我们深入了解一下:
我创建了一个名为 vendor_app 的自定义域。该域根据其签名分配给应用程序。我在 mac_permissions.xml 中添加了一个条目以分配 seinfo 字段 vendor。在 seapp_contexts 中,我像这样分配 vendor_app 域:
user=_app seinfo=vendor domain=vendor_app type=app_data_file levelFrom=user
我的应用程序在 vendor_app 上下文中正确启动:
# ps -Z | grep permissiontest
u:r:vendor_app:s0:c512,c768 u0_a109 4110 508 1620732 79584 SyS_epoll_ 0000000000 S com.vendor.android.permissiontest
所以,现在是根本不起作用的部分。在 vendor_app 上下文中运行的应用程序应获得对 /persist/vendor 中文件的读/写访问权限。为了创建必要的规则,我在设备目录的 sepolicy 文件夹中添加了一个名为 vendor.te 的文件,内容如下:
type vendor_app, domain;
type vendor_file, file_type, data_file_type;
# permissive vendor_app;
app_domain(vendor_app)
net_domain(vendor_app)
bluetooth_domain(vendor_app)
allow vendor_app persist_file:dir r_dir_perms;
allow vendor_app vendor_file:dir create_dir_perms;
allow vendor_app vendor_file:file create_file_perms;
allow vendor_app audioserver_service:service_manager find;
allow vendor_app cameraserver_service:service_manager find;
allow vendor_app drmserver_service:service_manager find;
allow vendor_app mediaserver_service:service_manager find;
allow vendor_app mediaextractor_service:service_manager find;
allow vendor_app mediacodec_service:service_manager find;
allow vendor_app mediadrmserver_service:service_manager find;
allow vendor_app persistent_data_block_service:service_manager find;
allow vendor_app radio_service:service_manager find;
allow vendor_app surfaceflinger_service:service_manager find;
allow vendor_app app_api_service:service_manager find;
allow vendor_app system_api_service:service_manager find;
allow vendor_app vr_manager_service:service_manager find;
而且我在file_contexts 配置中添加了一个条目:
###################################
# persist files
#
/persist(/.*)? u:object_r:persist_file:s0
/persist/vendor(/.*)? u:object_r:vendor_file:s0
在/persist 分区上,我创建了一些目录结构,让文件夹具有适当的权限,可以在其中添加一些文件。
# ls -Zal /persist/vendor/
total 56
drwxrwxrwx 5 persist persist u:object_r:vendor_file:s0 4096 2017-08-03 22:27 .
drwxrwx--x 16 system system u:object_r:persist_file:s0 4096 2017-08-01 16:24 ..
drwxrwxrwx 2 profile profile u:object_r:vendor_file:s0 4096 2017-08-04 13:34 profile
drwxrwxrwx 2 provision provision u:object_r:vendor_file:s0 4096 2017-08-04 13:34 provisioning
drwxrwxrwx 2 updater updater u:object_r:vendor_file:s0 4096 2017-08-04 13:34 updater
我知道服务的查找规则正在运行,因为我能够以强制模式启动我的应用程序并且不会收到任何关于此的投诉。我还能够按照有关 persist_file:dir 的规则访问/persist 目录以进行{ search }。
一旦我尝试将新文件(如 /persist/vendor/updater/test)写入 /persist 目录,我就会从 auditd 收到错误消息:
08-04 16:34:29.269 4108 4108 W .permissiontest: type=1400 audit(0.0:27): avc: denied { write } for name="updater" dev="mmcblk0p44" ino=55 scontext=u:r:vendor_app:s0:c512,c768 tcontext=u:object_r:vendor_file:s0 tclass=dir permissive=0
该错误当然会由 audit2allow 转换为以下规则:
#============= vendor_app ==============
allow vendor_app vendor_file:dir write;
因为write 是create_dir_perms 的成员,所以它实际上应该在那里。我还尝试将 audit2allow 创建的行添加到我的 vendor.te 但没有成功。
请注意,写入更新程序还涉及搜索 persist_file 和搜索 vendor_file 这两者似乎工作没有任何问题。
有没有人有任何建议,如何正确调试或者甚至可能解决这个问题?这两天我一直在研究这个问题,这让我抓狂。
编辑:
啊。/persist 当然是可写的:
# mount | grep persist
/dev/block/bootdevice/by-name/persist on /persist type ext4 (rw,seclabel,nosuid,nodev,relatime,nodelalloc,errors=panic,data=ordered)
编辑 2:
正如 Paul Ratazzi 所要求的,我已经扫描了 sepolicy 文件和实际加载到内核中的版本,以检查是否存在我的规则。
$ sesearch -A -s vendor_app -t vendor_file policy
allow vendor_app vendor_file:dir { rename search setattr read lock create reparent getattr write ioctl rmdir remove_name open add_name };
allow vendor_app vendor_file:file { rename setattr read lock create getattr write ioctl unlink open append };
因此它们实际上已正确部署到设备上。
最佳答案
好吧,经过更多的挖掘,看来我终于找到了答案。为了可能会在一些伤脑筋的日子里避免遇到同样问题的人,这里是解决方案:
此外MAC (Mandatory Access Control) Android 上的 SElinux 也 MLS (Multi-Level Security) .
虽然在 Android SELinux concepts 中以某种方式描述了 MAC ,关于MLS的信息只是非常简短和含蓄地提到:
In SELinux, a label takes the form: user:role:type:mls_level, where the type is the primary component of the access decisions, which may be modified by the other sections components which make up the label.
因此,我的 Android 应用程序运行在 MLS 级别(由 c512、c768 表示),可以读取/persist 上的文件但不能写入文件。所以需要做的是我的应用获得 MLS 级别以正确访问这些文件。
我(现在)通过将我的自定义标签更改为将其存档
type vendor_app, domain, mlstrustedsubject;
这让我的应用值得信赖。这解决了问题,但授予了对我的应用程序的大量访问权限。因此,更好的选择是将目的地的安全级别设置为授予对我的应用的读写访问权限的级别。
所以这基本上是这个问题到目前为止的解决方案(虽然还没有完成)。
关于android - 我的自定义 selinux 策略似乎被 android 系统忽略了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45509643/
谁能帮我解决这个问题?我有一个 Tomcat 和简单的 JSF 应用程序:https://github.com/gooamoko/jsfbilling/ .当我在 Tomcat 上运行应用程序时,它运
我有两个这样的域类,第一个是 Manager : package com.mnm class Manager { String name; static hasMany = [ pro
当我运行以下代码时,打印输出似乎不正确。 void thread_Calc(int *pos) { printf("recieved %d\n", *pos); sig = -1; man
这个问题在这里已经有了答案: How to access a local variable from a different function using pointers? (10 个答案) 关闭
我编写了一个程序,其中列表构建器方法返回 IEnumerable of string,其中包括大量字符串(100 万个项目),我将其存储在 List of string 中,然后它将所有项目附加到 中
我正在尝试编写一个 IRC 类型的聊天客户端,它具有可以连接到服务器的客户端。我试图让它在本地 atm 上工作(使用 FIFOS 而不是套接字)。 我遇到了以下我似乎无法解决的问题: 接受新的客户端连
我的一个 cronjobs 每天发送一封电子邮件 35 6 * * * cd $EZPUBLISHROOT && $PHP runcronjobs.php -q 2>&1 我停止使用 cron sud
我使用 WPF 打印路径来处理在我们的应用程序中创建的大型图表。整个图表由视觉效果组成。 所谓的“DesignerPaginator”对图表进行分页(非常简单)。 从这一点来说,我做了以下三件事: -
我尝试在更新之前跟踪系统应用程序并使用: public static boolean isSystemApplication(Context ctx, IContent content) {
我在这里附上了一个查询分析结果,https://explain.depesz.com/s/x9BN 这是查询 EXPLAIN ANALYZE SELECT branche
我正在做一个 CXF(spring) 项目 (HUB)。部署后,我可以看到肥皂和休息服务列表,我通过两个地址打开它。一种是使用本地主机,第二种是使用我电脑的 ip。所以我得到了这些输出。 使用本地主机
这是一个 AnyHashable 不支持枚举转换的简单案例。 enum testEnum: String { case Test } let myObject: AnyHashable = t
我的主要目标是比较存储在数据库和 XLSX 文件中的数据。 为此,我按以下方式创建了两个列表: private class ProductList { public string produc
我从 CMake 3.6 更新到任何最新版本 (3.12.0-rc2),现在我的一个程序无法编译。 奇怪的是,错误消息显示了标准库本身中的 undefined symbol 。这是错误消息: Unde
我希望将我的自定义对话框动画化为从特定点出现,但我无法为对话框设置动画。 该对话框是一个基本的 RelativeLayout,设置为 extends Dialog 类中的布局。 正如这里的一些答案所建
我已经在这个论坛上调查过很多类似的问题,但似乎没有一个能解决我的问题。 我会在底部列出我在这个论坛上看到的一些问题页面,但让我先谈谈我对这个问题的看法。 我正在使用 codeigniter v 2.x
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
这个问题已经有答案了: "Notice: Undefined variable", "Notice: Undefined index", "Warning: Undefined array key",
我正在尝试在 RHEL 7 上启动一个 docker-compose 项目作为 systemd 服务。这是我的 systemd 脚本 (/etc/systemd/system/wp.service):
此问题出现在my last question here之后。我想将每个按钮聚焦和失去焦点背景设置为主菜单(ContentPane 即 JPanel)下方的背景颜色,因此按钮看起来像选项卡。它在不同的环
我是一名优秀的程序员,十分优秀!