5

netlinkコマンドを使用してネットワークインターフェイス(この場合はsocketcanインターフェイス)を構成するJNIライブラリを利用するAndroidアクティビティがあります。アクティビティを実行すると、ネットワークインターフェイスの構成が失敗し、RTNETLINKからのEPERMエラーが発生します。失敗するコマンドを正常に完了するには、 CAP_NET_ADMIN機能が必要です。そのため、rootとしてコードを実行すると成功し、rootとして実行してから、capsetを使用して機能をCAP_NET_ADMINのみに制限ます

アプリケーションマニフェストに次のアクセス許可を追加して、プロセスにNET_ADMIN機能が与えられるという印象を与えました。

<uses-permission android:name="android.permission.INTERNET" />    
<uses-permission android:name="android.permission.NET_ADMIN" />

これにより、プロセスはinetグループとnet_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 

残念ながら、これは私のシステムには当てはまらないようです。

注:チップセットベンダーによって変更されたシステムとカーネルを使用して実行しているため、これが機能しなくなるような変更が行われている可能性があります。

誰か知っている

  • これがうまくいくはずですか?
  • プロセスに機能を追加するには、他にどのような手順が必要ですか?
  • それも可能かどうか?
4

2 に答える 2

4

Androidは、グループIDに基づいて特定の機能を検証できるように、カーネル機能システムを変更していることがわかりました。残念ながら、行われた変更はすべてのケースをカバーしているわけではないようです。私が抱えていた問題を解決するために、cap_netlink_recvチェックを変更して、Androidで変更されたcap_capability呼び出しを使用しました。これにより、net_linkグループのユーザーはCAP_NET_LINK機能を取得できます。

この変更は、Androidカーネルに加えられた変更の精神の範囲内であるように思われ、私の状況で機能します。

diff --git a/security/commoncap.c b/security/commoncap.c
        index ccfe568..f069f8d 100644
        --- a/security/commoncap.c
        +++ b/security/commoncap.c
        @@ -56,21 +56,23 @@
    }
}

int cap_netlink_send(struct sock *sk, struct sk_buff *skb)
{
» return 0;
}

int cap_netlink_recv(struct sk_buff *skb, int cap)
{
-» if (!cap_raised(current_cap(), cap))
+» if (cap_capable(current, current_cred(),
+» » » current_cred()->user->user_ns, cap,
+» » » SECURITY_CAP_NOAUDIT) != 0)
» » return -EPERM;
» return 0;
}
EXPORT_SYMBOL(cap_netlink_recv);

/**
 * cap_capable - Determine whether a task has a particular effective capability
 * @tsk: The task to query
 * @cred: The credentials to use
 * @ns:  The user namespace in which we need the capability
于 2012-10-26T19:46:14.733 に答える
3

実際、ネットリンクパスでは、v3.1-18-gfd77846より前のカーネルバージョンに対する追加のアクセス許可のチェックはありません。

元々、完全に置き換えるのは良い考えではなかったcap_raisedので、ここでは、のチェックと同様のチェックを追加することにしましたcap_capable。他に考えられるcapのはCAP_SYS_ADMIN、、ですがCAP_AUDIT_CONTROLCAP_AUDIT_WRITEこれらはネットワーキングには関係ありません。上記のコミット以降、最終的にはcap_capable(を介してcapable)を呼び出すことになります。

パッチ:

diff --git a/security/commoncap.c b/security/commoncap.c
index 8bfbd13..485245a 100644
--- a/security/commoncap.c
+++ b/security/commoncap.c
@@ -63,6 +63,10 @@ int cap_netlink_send(struct sock *sk, struct sk_buff *skb)

 int cap_netlink_recv(struct sk_buff *skb, int cap)
 {
+#ifdef CONFIG_ANDROID_PARANOID_NETWORK
+   if (cap == CAP_NET_ADMIN && in_egroup_p(AID_NET_ADMIN))
+       return 0;
+#endif
    if (!cap_raised(current_cap(), cap))
        return -EPERM;
    return 0;

を見ている人のためにCAP_NET_RAW、そのためにあなたはグループにいる必要がありますnet_raw。そのグループを既存の権限に追加するかandroid.permission.NET_ADMIN、次のフレームワークパッチを適用します。

diff --git a/core/res/AndroidManifest.xml b/core/res/AndroidManifest.xml
index 1e7dcf7..07f5d94 100644
--- a/core/res/AndroidManifest.xml
+++ b/core/res/AndroidManifest.xml
@@ -927,6 +927,12 @@
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
         android:protectionLevel="signature" />

+    <!-- Allows access to raw sockets, allowing full network access and spoofing.
+         @hide -->
+    <permission android:name="android.permission.NET_RAW"
+        android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
+        android:protectionLevel="signature" />
+
     <!-- Allows registration for remote audio playback. @hide -->
     <permission android:name="android.permission.REMOTE_AUDIO_PLAYBACK"
         android:permissionGroup="android.permission-group.SYSTEM_TOOLS"
diff --git a/data/etc/platform.xml b/data/etc/platform.xml
index 47cb7ab..9c209c3 100644
--- a/data/etc/platform.xml
+++ b/data/etc/platform.xml
@@ -82,6 +82,10 @@
         <group gid="net_admin" />
     </permission>

+    <permission name="android.permission.NET_RAW" >
+        <group gid="net_raw" />
+    </permission>
+
     <!-- The group that /cache belongs to, linked to the permission
          set on the applications that can access /cache -->
     <permission name="android.permission.ACCESS_CACHE_FILESYSTEM" >
于 2013-11-25T23:56:35.597 に答える