0

我正在尝试 Android CTS。我在 android.permission 期间遇到问题。

02-05 15:57:27 I/192.168.90.48:5555:         
android.permission.cts.NoNetworkStatePermissionTest#testSecurityExceptionFromDns FAIL 
junit.framework.AssertionFailedError
at android.permission.cts.NoNetworkStatePermissionTest.testSecurityExceptionFromDns
(NoNetworkStatePermissionTest.java:174)
at java.lang.reflect.Method.invokeNative(Native Method)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:190)
at android.test.AndroidTestRunner.runTest(AndroidTestRunner.java:175)
at android.test.InstrumentationTestRunner.onStart(InstrumentationTestRunner.java:555)
at android.app.Instrumentation$InstrumentationThread.run(Instrumentation.java:1661)

在我的猜测中,这个测试检查权限。程序尝试如下:

public void testSecurityExceptionFromDns() throws Exception {
    try {
        InetAddress.getByName("www.google.com");
        fail();
    } catch (SecurityException expected) {
    }   
}   

预期的行为是程序抛出安全异常,因为这个应用程序没有 android.permission.INTERNET

但即使没有权限,它也可以获取 InetAdress。

我该如何解决这种情况?

我已经检查了诸如 /dev/socket 之类的权限

有人可以告诉我发生了什么吗?

谢谢。

4

3 回答 3

0

在清单文件上添加以下权限

<uses-permission android:name="android.permission.INTERNET" />
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
于 2014-02-05T08:40:01.297 回答
0

INTERNET权限已在内核中检查,因此您可能使用的内核可能没有所有 Android 补丁。假设您已经应用了补丁,您需要编译 CONFIG_ANDROID_PARANOID_NETWORK以启用 Internet 权限检查。检查要求所有尝试创建套接字等的进程成为该inet组的成员(GID 3003)。

于 2014-02-05T08:50:38.227 回答
0

谢谢你的回复。我解决了这个问题!!!!!!!!!!根本原因来自我们设备的内核版本。我们使用 linux_kernel 2.6.34。因此,没有 CONFIG_ANDROID_PARANOID_NETWORK 选项,并且 af_inet.c 没有定义检查权限的函数。

所以我修改如下:

净/ipv4/af_inet.c

/* add ifdef CONFIG_ANDROID_PARANOID_NETWORK for CTS(android.permission) */
#ifdef CONFIG_ANDROID_PARANOID_NETWORK  
#include <linux/android_aid.h>
static inline int current_has_network(void)
{
    return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
}
#else
static inline int current_has_network(void)
{
    return 1;
}
#endif
/* end add */

static inline int current_has_network(void)
 {
    return in_egroup_p(AID_INET) || capable(CAP_NET_RAW);
int try_loading_module = 0;
int err;

if (!current_has_network()) // check permission
    return -EACCES;         // return if it has no permission 
 if (unlikely(!inet_ehash_secret))
if (sock->type != SOCK_RAW && sock->type != SOCK_DGRAM)
    build_ehash_secret();
于 2014-02-06T06:42:19.610 回答