我的自定义 selinux 策略似乎被 Android 系统忽略

2023-11-24

我在基于 AOSP 的 Android 7.1.2(更准确地说是基于索尼开放设备树)上正确运行自定义 selinux 策略时遇到了一些麻烦。

我的问题是审核日志不断告诉我缺少我实际添加的文件访问规则。我还将audit2allow 创建的规则复制到我的策略文件中,但即使这些规则也无法正常工作。

那么,让我们深入了解细节:

我创建了一个名为的自定义域供应商应用程序。该域根据应用程序的签名分配给应用程序。我已经添加了一个条目mac_permissions.xml分配seinfo字段vendor. In seaapp_contexts我分配供应商应用程序像这样的域名:

user=_app seinfo=vendor domain=vendor_app type=app_data_file levelFrom=user

我的应用程序在供应商应用程序上下文中正确启动:

# 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

所以,现在来说说根本不起作用的部分。一个应用程序运行在供应商应用程序上下文应获得对文件的读/写访问权限/坚持/供应商。为了创建必要的规则,我添加了一个名为的文件供应商.te to the sepolicy设备目录中的文件夹包含以下内容:

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;

我在其中添加了一项文件上下文配置:

###################################
# 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

我知道find-服务规则正在发挥作用,因为我能够以强制模式启动我的应用程序,并且不会收到任何对此的投诉。我还可以访问 /persist 目录{ 搜索 }在有关规则允许的情况下持久文件:目录.

一旦我尝试编写一个新文件,例如/坚持/供应商/更新程序/测试 to the /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;

As write是的成员创建目录权限,它实际上应该在那里。我还尝试添加由创建的行审核2允许 to my 供应商.te没有任何成功。

请注意,写入更新程序还涉及search on 持久文件 and search on 供应商文件这两者似乎都可以正常工作。

有没有人有任何建议,如何正确调试,甚至可能解决这个问题?我已经研究这个问题两天了,这让我发疯。

EDIT:

啊。 /persist 当然是挂载可写的:

# mount | grep persist
/dev/block/bootdevice/by-name/persist on /persist type ext4 (rw,seclabel,nosuid,nodev,relatime,nodelalloc,errors=panic,data=ordered)

EDIT 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 };

因此它们实际上已正确部署到设备上。


好吧,经过一番挖掘,看来我终于找到了答案。为了也许能让那些遇到同样问题的人在一些令人头疼的日子里免遭困扰,这里是解决方案:

Besides MAC(强制访问控制)Android 上也有 SElinuxMLS(多级安全).

虽然 MAC 在某种程度上有所描述Android SELinux 概念,关于MLS的信息只是非常简短和含蓄地提到:

在 SELinux 中,标签采用以下形式:user:role:type:mls_level,其中类型是访问决策的主要组成部分,可以通过构成标签的其他部分组件进行修改。

因此,我的 Android 应用程序在 MLS 级别(由 c512、c768 表示)运行,可以读取 /persist 上的文件,但不能写入它们。因此,我的应用程序需要获得 MLS 级别才能正确访问这些文件。

我(目前)已通过将自定义标签更改为

type vendor_app, domain, mlstrustedsubject;

这使我的应用程序值得信赖。这解决了问题,但授予了对我的应用程序的大量访问权限。因此,更好的选择是将目标的安全级别设置为授予对我的应用程序的读写访问权限的级别。

所以这基本上是到目前为止这个问题的解决方案(虽然还没有完成)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我的自定义 selinux 策略似乎被 Android 系统忽略 的相关文章

  • 生产中偶尔会发生 android.webkit.WebView 类膨胀错误

    我的应用程序在 Google Play 上 它在大多数设备 数千个用户 上运行良好 但在极少数情况下 占每日活跃用户百分比的一小部分 我得到Error inflating class android webkit WebView当我为我的片
  • PHP服务器端IAB验证openssl_verify总是返回0

    我使用以下函数 服务器端 php 来验证 IAB v3 事务 我从 Android 应用程序传递过来 Override protected void onActivityResult int requestCode int resultCo
  • 如何使用gradle这样的格式更改apk名称?

    当我使用 gradle 构建应用程序时 我想将 app release apk 文件名更改为如下所示 format appname of package name V version code yyMMdd R T explain appn
  • Android浏览器上的Web应用程序宽度问题

    所以到目前为止我只在 Android 浏览器上遇到过这个问题 基本上我的网站几乎一直运行良好 而且我还没有在 Dolphin Opera 或 Skyfire 上看到这个问题 但偶尔当我从手机主屏幕之一上的书签重新打开 Android 浏览器
  • Mesibo 通话 UI 未更新

    我正在尝试更改 Mesibo Call UI 的配置 但它并没有改变 我尝试如下 MesiboCallConfig mesiboCallConfig new MesiboCallConfig mesiboCallConfig backgro
  • Android-全屏视频视图

    我正在尝试使此 VideoView 以全屏模式显示 public class ViewVideo extends Activity private String filename private static final int INSER
  • Android相当于javascript的setTimeout和clearTimeout?

    setTimeout 有一个答案https stackoverflow com a 18381353 433570 https stackoverflow com a 18381353 433570 它没有提供我们是否可以像在 JavaSc
  • 如何在我的 Android 应用程序中实现应用内购买?

    如何在我的 Android 应用程序中实现应用内购买 我提到 http developer android com guide market billing billing integrate html billing service ht
  • Flutter Spotify Api 身份验证

    我需要在使用 Spotify api 的 Flutter 应用程序中对用户进行身份验证 我使用 flutter web auth 打开 WebView 并让用户在那里登录 我无法返回应用程序 在 Spotify 仪表板中 我将回调 Uri
  • Android 性能:SharedPreferences 的成本

    当我的应用程序启动时 我使用分片首选项中的值填充容器类 这个想法是处理 SharedPreferences 和 PreferenceManager 一次 因为我猜它们很重 这是一个示例 SharedPreferences prefs Pre
  • twitter4j => AndroidRuntime(446): java.lang.NoClassDefFoundError: twitter4j.http.AccessToken

    我正在尝试使用 twitter4j 我的应用程序来连接并发布到 Twitter 我正在关注本教程 http blog doityourselfandroid com 2011 02 13 guide to integrating twitt
  • 无法在 Java 中输出正确的哈希值。怎么了?

    在我的 Android 应用程序中 我有一个 SHA256 哈希值 我必须使用 RIPEMD160 消息摘要算法进一步对其进行哈希值 我可以输出任何字符串的正确 sha256 和ripemd160 哈希值 但是当我尝试使用ripemd160
  • 以编程方式应用样式资源

    我没有找到一种以编程方式做到这一点的方法 所以我在这里发布这个问题 我也没有找到与此相关的任何问题 我有一个资源样式 在 res values styles xml 中定义 我想做的是使用 java 将这种样式应用到我正在操作的 View
  • 活动组代码示例

    有人可以给我一些使用活动组的示例代码吗 我的应用程序中有一些按钮 我想将活动应用于这些按钮 目前我正在使用 setVisibility 但我被告知活动组将是更好的选择 这是另一个ActivityGroup 示例项目 http richipa
  • 使用 Glide 库设置图像加载完成后进度条的可见性

    您好 我想要一个图像进度条 该进度条将在图像加载时显示 但当图像加载完成时 我想将其设置为消失 早些时候我为此使用了毕加索库 但我不知道如何将它与 Glide 库一起使用 我知道有一些资源就绪功能 但我不知道如何使用它 谁能帮我 毕加索图书
  • 获取当前图片在图库中显示的位置

    在我的应用程序中 我有一个图片库 但我想检测当前显示图像的位置 例如 当我启动我的活动时 位置是 0 但是当我在图库中滚动时 我想获取当前显示图像的位置 我尝试过 OnFocusChanged OnItemClicked 但只有当我单击图库
  • 如何以编程方式创建 CardView

    我正在开发一个 Android 应用程序Java Android Studio 我想在活动中创建CardView以编程方式 我想将以下属性设置为CardView layout width wrap content layout row 0
  • Android:如何在布局中放置纯色矩形?

    我有一个可以很好地膨胀的relativelayout 我想在顶部添加一个跨越布局宽度的纯色矩形 我尝试将以下内容放入我的 xml 中
  • Android BLE 扫描永远找不到设备

    几天以来 我尝试在我的应用程序中实现 BLE 连接 我知道我尝试连接的设备功能齐全 因此问题一定是我的代码 我用BluetoothLeScanner startScan 方法 但回调方法永远不会被调用 public void startSc
  • 我可以通过在 Android Activity 中声明适当的成员“静态”来提高效率吗

    如果一个 Activity 在实践中是单例 我认为我可以通过声明适当的成员 静态 来获得一些效率 且风险为零 是的 The Android 文档说 http developer android com guide topics fundam

随机推荐

  • 如何用Qt QPainter绘制线性渐变圆弧?

    我正在尝试开发自定义QProgressBar如下图所示 我创建了一个扩展 QProgressBar 的类并实现了 PaintEvent void CircularProgressBar paintEvent QPaintEvent int
  • 如何从 Java 调用 Excel 电子表格中的 VBA 代码?

    我有一个包含大量 VBA 代码的 Excel 文件 当在 Excel 中打开文档时 用户可以调用 4 个不带参数的公共子例程 这些子例程根据需要操作各个工作表中的数据 我们有一个大型 Java 应用程序 我们希望通过从 Java 环境调用宏
  • 在 Java 中使用长字符串(heredocs) - 可读的方法? [复制]

    这个问题在这里已经有答案了 我需要在 Java 中处理包含换行符的长字符串 这些是用于 HTML 生成的 但这里并不是最重要的 我知道 Java 的缺陷是它所没有的heredocs 但我还可以使用其他机制 1 字符串级联 或 StringB
  • 有人能给我一个node.js应用程序的例子吗

    我试图了解现有的一些较新的 Web 编程框架 即 Node js Rails 和 Sinatra 之间的差异 有人能给我一个最适合每个框架的应用程序示例吗 也就是说 什么是最适合 Node js 而不是 Rails 或 Sinatra 的应
  • Pandas 可以绘制日期直方图吗?

    我已经将我的系列强制转换为 dtype 的日期时间列datetime64 ns 虽然只需要一天的分辨率 不知道如何改变 import pandas as pd df pd read csv somefile csv column df da
  • UIScrollView 缩放后如何重置?

    我有一个正在绘制的图表UIScrollView 是一大块UIView使用自定义子类CATiledLayer作为它的层 当我放大和缩小时UIScrollView 我希望图表能够动态调整大小 就像我从viewForZoomingInScroll
  • 使用 MPMoviePlayerController 禁用 AirPlay

    我有一个实例MPMoviePlayerController它被用来在 iPhone 应用程序上显示一些实时流媒体视频 这工作正常 但我希望删除所有 AirPlay 功能 可以肯定的是 我专门禁用了 AirPlay 如下所示 if self
  • Hibernate 将 NULL 值粘贴到列表中

    我继承了一些使用 Hibernate 的 Java 代码 一些使用此代码的人现在报告说他们到处都遇到 NullPointerExceptions 我已经能够追踪到这一点 发现当我们执行一个从数据库中提取对象列表的查询时 该查询有一个对象列表
  • 如何在 ASP.NET MVC 视图中对 HTML 列表项进行分组?

    我在视图中有这段代码 ul foreach var tag in Model li a href Post Tag tag Id tag Name a li ul 现在我需要按第一个字符对列表项进行分组 例如 A Apple Ant C C
  • 如何使用 Gradle 在 Windows cmd 中执行命令?

    我正在尝试使用 Gradle 执行此命令 build build exe parse p 246 o strings xml bcg novalidate l 1033 sr LbaRoot settings default lss def
  • 计划任务或Windows服务

    我的团队正在争论哪个更好 Windows 服务还是计划任务 我们有一台专门运行作业的服务器 目前它们都是计划任务 有些作业获取文件 重命名它们并将它们放置在网络上的其他目录中 其他作业从 SQL 中提取数据 修改数据并将其传送到其他地方 其
  • Django:MySQL 没有这样的表:aidata.django_session

    我在 Windows 7 上的 Pycharm 中运行 Django 1 4 并且安装了 WAMP 因为我需要将数据存储在 MySQL 表中 这是来自setting py DATABASES default ENGINE django db
  • 将空格转换为换行符

    是否可以使用 CSS 在每个空格上添加换行符 例如 如果我有字符串 Format It 我想像这样显示它 Format It 使用CSS 您可以使用word spacing财产 它定义了单词之间的空间 如果将其设置为容器的大小 它将强制换行
  • React Native - 当数据未更改时强制 ListView 重新渲染

    即使数据源中的数据没有更改 是否可以强制 ListView 重新渲染 我的应用程序的选项卡栏中有一个 ListView 我希望每次选择该选项卡时它都会重绘 无论数据是否相同或已更改 this state data props data da
  • 传递数据到node + express中查看

    我正在使用我的节点应用程序从 API 检索一些数据 并希望在视图中显示该数据并允许用户在那里更改它 我正在调用 api 并获得一个 JSON 响应 我想将其传递到视图上 这就是我正在做的 var query SELECT Id OwnerI
  • Android 蓝牙 StartDiscovery() 始终返回 false

    我试图发现附近的蓝牙设备 但 startDiscovery 总是返回 false 就好像它不起作用一样 因此它无法找到设备 我发现除了蓝牙和蓝牙管理之外 我还必须包含 Coarse Location 权限 但无论如何 它不起作用 这是我现在
  • 如何尝试捕获未找到的程序集

    好的 假设我有一个这样的应用程序 using System using AliensExist some DLL which can t be found 我想要的是 如果找不到程序集 DLL AlienExist 应用程序不会返回错误 而
  • 有趣的NLP/机器学习风格项目——分析隐私政策

    我想就分配给我的一个有趣问题提供一些意见 任务是分析数百个甚至数千个隐私政策并确定它们的核心特征 例如 他们是否获取用户的位置 他们是否与第三方共享 出售 等等 我和一些人交谈过 阅读了很多有关隐私政策的内容 并且自己也思考过这个问题 这是
  • 我将如何格式化 Zend_Form_Element_Radio 以便标签跟随输入?

    Zend Form Element Radio 的默认装饰器是
  • 我的自定义 selinux 策略似乎被 Android 系统忽略

    我在基于 AOSP 的 Android 7 1 2 更准确地说是基于索尼开放设备树 上正确运行自定义 selinux 策略时遇到了一些麻烦 我的问题是审核日志不断告诉我缺少我实际添加的文件访问规则 我还将audit2allow 创建的规则复