Android 本地套接字访问在api23中被拒绝,在api21中工作

Android 本地套接字访问在api23中被拒绝,在api21中工作,android,sockets,java-native-interface,native,android-permissions,Android,Sockets,Java Native Interface,Native,Android Permissions,我有一个应用程序和一个服务,它们通过本地套接字在本机级别(C++/JNI)连接。这两个都是使用目标API级别21构建的,并且多年来运行良好。最近我将它们升级到API级别23和 现在我不断地遇到这样的错误: 10-31 10:07:37.413 5760-5760/com.mycompany.myservice W/pool-151-thread: type=1400 audit(0.0:47942): avc: denied { connectto } for path=00494E554445

我有一个应用程序和一个服务,它们通过本地套接字在本机级别(C++/JNI)连接。这两个都是使用目标API级别21构建的,并且多年来运行良好。最近我将它们升级到API级别23和 现在我不断地遇到这样的错误:

10-31 10:07:37.413 5760-5760/com.mycompany.myservice W/pool-151-thread: type=1400 audit(0.0:47942): avc: denied { connectto } for path=00494E554445565F4C4F43414C5F534F434B45545F53455256455200 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:r:untrusted_app_25:s0:c512,c768 tclass=unix_stream_socket permissive=0
10-31 10:17:44.373 4221-4221/com.mycompany.myapp W/pool-1-thread-1: type=1400 audit(0.0:72703): avc: denied { connectto } for path=00494E554445565F4C4F43414C5F534F434B45545F53455256455200 scontext=u:r:untrusted_app:s0:c512,c768 tcontext=u:r:untrusted_app_25:s0:c512,c768 tclass=unix_stream_socket permissive=0
这些行在logcat中不断重复,没有其他内容了

我可以从这个输出中看出,应用程序和服务都被认为是不可信的。我知道API23请求运行时权限,以及服务和应用请求和获取写入、读取和internet运行时权限

我的服务清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mycompany.myservice"
      android:versionCode="1"
      android:versionName="2.03.0018.104"
    >

    <uses-feature android:name="android.hardware.usb.host" />
    <uses-sdk android:minSdkVersion="23" />

    <!-- Required for TCP IPC and for local socket --> 
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- Copy data to SDcard + recording + temporary files -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application android:label="@string/app_name">

        <!-- Attacher hack -->
        <activity
            android:name="mynamespace.myservice$myserviceLauncher"
            android:theme="@android:style/Theme.NoDisplay"
            android:launchMode="singleInstance"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
        </activity>

        <!-- Detacher hack -->
        <receiver android:name="mynamespace.myservice$Detacher">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
        </receiver>

        <service android:name="mynamespace.myservice">
        </service>

    </application>
</manifest> 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp"
    android:versionCode="1"
    android:versionName="2.01.00.06"
>

<uses-sdk
    android:minSdkVersion="21"
    android:targetSdkVersion="23" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:hardwareAccelerated="true"
    android:allowBackup="true"
    android:largeHeap="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:logo="@drawable/icon"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

我的应用程序清单:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
      package="com.mycompany.myservice"
      android:versionCode="1"
      android:versionName="2.03.0018.104"
    >

    <uses-feature android:name="android.hardware.usb.host" />
    <uses-sdk android:minSdkVersion="23" />

    <!-- Required for TCP IPC and for local socket --> 
    <uses-permission android:name="android.permission.INTERNET"/>
    <!-- Copy data to SDcard + recording + temporary files -->
    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

    <application android:label="@string/app_name">

        <!-- Attacher hack -->
        <activity
            android:name="mynamespace.myservice$myserviceLauncher"
            android:theme="@android:style/Theme.NoDisplay"
            android:launchMode="singleInstance"
            android:excludeFromRecents="true">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" />
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_ATTACHED" android:resource="@xml/device_filter" />
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
        </activity>

        <!-- Detacher hack -->
        <receiver android:name="mynamespace.myservice$Detacher">
            <intent-filter>
                <action android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" />
            </intent-filter>
            <meta-data android:name="android.hardware.usb.action.USB_DEVICE_DETACHED" android:resource="@xml/device_filter" />
        </receiver>

        <service android:name="mynamespace.myservice">
        </service>

    </application>
</manifest> 
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.mycompany.myapp"
    android:versionCode="1"
    android:versionName="2.01.00.06"
>

<uses-sdk
    android:minSdkVersion="21"
    android:targetSdkVersion="23" />

<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET" />

<application
    android:hardwareAccelerated="true"
    android:allowBackup="true"
    android:largeHeap="true"
    android:icon="@drawable/icon"
    android:label="@string/app_name"
    android:logo="@drawable/icon"
    android:theme="@style/AppTheme" >
    <activity
        android:name=".MainActivity"
        android:label="@string/app_name"
        android:screenOrientation="landscape" >
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>
</application>

是否有办法将我的服务和我的应用程序同时添加到受信任的应用程序列表中


或者我如何才能使本地套接字连接正常工作?

这是由于进一步收紧了平台的SE策略,以消除潜在的攻击向量。从Android 6.0的AOSP发布信息:

系统强化。通过SELinux实施的策略强化系统。这提供了更好的用户隔离、IOCTL过滤、减少公开服务的威胁、进一步收紧SELinux域以及极其有限的/proc访问

不受信任应用程序的SE策略文件(第三方应用程序安装的默认文件)明确禁用对UNIX域套接字的访问:


Android的推荐做法是不要将套接字用于IPC,而将活页夹用于方法调用。

谢谢。有没有办法通过询问用户来将我的应用程序列入白名单?否则,我需要重写我的应用程序和服务的一大块内容-(不,据我所知,在这种情况下不是这样。一些运行时权限会触发应用程序被放置到不同的安全上下文中,用于SE,但对于Unix域套接字,似乎没有这样的事情。坏消息。我会再等一段时间,等待可能有人回答某种黑客或解决方法,然后我会接受你的答案。比非常感谢。不客气,祝你好运!你可以看看另一个选择(尽管我觉得它不如使用活页夹那么优雅)将使用
意图
启动
服务
并向其发送
信使
对象。然后
服务
可以向其发送消息并包含其自己的
信使
对象。现在,您可以在两者之间发送消息,就像发送给
处理程序一样。这可能更接近于您正在使用插座。您需要记住的最重要的事情是使用活页夹或
Messenger
Intent
(后者位于活页夹顶部)您的数据必须是可打包的吗?还有一点需要澄清:无论是在服务中还是在应用程序中,套接字的实际使用都是在本机库/JNI级别。这有关系吗?