私はAndroidでrootユーザー(su -c binary_path)を使って実行するCバイナリを持っています。rootとして実行しているバイナリからexec()のアクセスが拒否されました
バイナリが別のバイナリをexec *()しようとするまでは、すべてうまく動作します。実際にはほとんどのデバイスで動作しますが、一部のデバイスではEACCESエラーが発生します。
Cバイナリは、実際にこの使用して開始されます。いくつかの点で
execlp("su","su","-c",binary_path,NULL);
を、バイナリは、これらの呼び出しを作ってみる(簡体字)になります。
fork();
...
// child here
execlp("sh","sh","-c",script,NULL);
が実際に異なるのAndroid 6.0デバイス上でテスト、Nexus 9とS7があります。 Nexus 9 ok、S7が失敗します。
だから私は、次のすべての権限とセキュリティコンテキストを確認有意差は認められなかっ:
/system/bin
/system/bin/sh
/system/bin/ls
<library_path>
/su/bin/su
もバイナリが両方のデバイスで真、UID/GID = 0で実行していた点検。
logcatでは、不足している権限やセキュリティ保護されていないポリシー違反に関する監査は表示されません。
EDIT:
$ps -Z
u:r:init:s0 root ...
のexec()が動作するかどうか、両方のデバイスで同じ:ちょうどバイナリがで実行されているセキュリティコンテキストを検証しました。 SELinuxのから
Restricted making process. PID = 8868(<binary>) PPID = 8340(<binary>)
ノーAVCを、このテキストはAOSPソースコードで見つけることができません。
EDIT2は:)(EXECしようとすると、それが失敗したデバイスで、/ procの/ kmsgには、これを含んでいます。
Javaアプリケーションを使用してCコードを実行しますか? –
バイナリは、Javaアプリケーションから呼び出される共有ライブラリから開始されます。もう一度明確にするために、バイナリにはroot権限が与えられ、exec()を呼び出すと、すべてのデバイスではなく一部のデバイスで失敗することがあります。 – 3c71
マニフェストに対する明示的な許可ですか?追加しようとするWRITE_EXTERNAL_STORAGE –