如何使用 CAP_NET_ADMIN 功能运行 Android 进程

Pik*_*lor 5 android android-permissions

我有一个使用 JNI 库的 Android 活动,该库使用 netlink 命令来配置网络接口(在本例中为 socketcan 接口)。如果我运行该活动,网络接口配置将失败并显示来自 RTNETLINK的EPERM错误。失败的命令需要CAP_NET_ADMIN功能才能成功完成。这样运行的代码为根成功,并且还运行为根,然后限制该功能仅CAP_NET_ADMIN使用capset

我向应用程序清单添加了以下权限,这给我的印象是我的进程将获得 NET_ADMIN 功能:

<uses-permission android:name="android.permission.INTERNET" />    
<uses-permission android:name="android.permission.NET_ADMIN" />
Run Code Online (Sandbox Code Playgroud)

这将进程置于inetnet_admin组中,但该进程未收到 CAP_NET_ADMIN 功能,导致 netlink 命令因 EPERM 而失败。

在我对这个主题进行的各种搜索中,我发现了应该应用该功能的提示。例如,来自http://elinux.org/Android_Security

#define             GID     Capability
AID_NET_BT_ADMIN    3001    Can create an RFCOMM, SCO, or L2CAPP Bluetooth socket
AID_NET_BT          3002    Can create a Bluetooth socket
AID_INET            3003    Can create IPv4 or IPv6 socket
AID_NET_RAW         3004    Can create certain kinds of IPv4 sockets??
AID_NET_ADMIN*      3005    Allow CAP_NET_ADMIN permissions for process 
Run Code Online (Sandbox Code Playgroud)

不幸的是,这似乎不适用于我的系统。

注意:我正在使用由芯片组供应商修改的系统和内核运行,因此可能已修改某些内容使其无法正常工作。

有人知道吗

  • 如果这应该只是工作
  • 向流程添加功能还需要哪些其他步骤?
  • 它甚至可能吗?

Pik*_*lor 5

事实证明,Android修改了内核能力系统,允许根据group-id验证特定能力。不幸的是,所做的修改似乎并没有涵盖所有情况。为了解决我遇到的问题,我修改了cap_netlink_recv检查以使用 Android 修改后的cap_capability调用。这允许net_link组中的用户获得CAP_NET_LINK能力。

\n\n

此更改似乎符合对 Android 内核所做的修改的精神,并且适用于我的情况。

\n\n
diff --git a/security/commoncap.c b/security/commoncap.c\n        index ccfe568..f069f8d 100644\n        --- a/security/commoncap.c\n        +++ b/security/commoncap.c\n        @@ -56,21 +56,23 @@\n    }\n}\n\nint cap_netlink_send(struct sock *sk, struct sk_buff *skb)\n{\n\xc2\xbb return 0;\n}\n\nint cap_netlink_recv(struct sk_buff *skb, int cap)\n{\n-\xc2\xbb if (!cap_raised(current_cap(), cap))\n+\xc2\xbb if (cap_capable(current, current_cred(),\n+\xc2\xbb \xc2\xbb \xc2\xbb current_cred()->user->user_ns, cap,\n+\xc2\xbb \xc2\xbb \xc2\xbb SECURITY_CAP_NOAUDIT) != 0)\n\xc2\xbb \xc2\xbb return -EPERM;\n\xc2\xbb return 0;\n}\nEXPORT_SYMBOL(cap_netlink_recv);\n\n/**\n * cap_capable - Determine whether a task has a particular effective capability\n * @tsk: The task to query\n * @cred: The credentials to use\n * @ns:  The user namespace in which we need the capability\n
Run Code Online (Sandbox Code Playgroud)\n