【问题标题】:Can't execute "system" command on Android 8 Oreo无法在 Android 8 Oreo 上执行“系统”命令
【发布时间】:2018-01-07 13:05:45
【问题描述】:

在我们的 Android 服务应用程序中,我们使用 JNI 来调用共享库的 C++ 代码。在这段代码中,我们调用 C“系统”命令来执行另一个进程。此代码在所有 Android 操作系统上都运行良好,但现在在 Android 8 Oreo 上失败了。 是否有任何新的安全或其他限制阻止执行系统命令?

更多数据:

这个“c”代码从我的共享库中成功执行:

int error = system("ls -l /sdcard/tmp >> /sdcard/tmp/log.txt");

文件log.txt按预期填充,错误=0;

但此命令始终失败并出现意外错误代码 (40704):

int error = system("/system/bin/7za t /sdcard/tmp/Camera.7z >> /sdcard/tmp/log.txt");

我可以从 shell(“adb shell”)执行这个命令。 7za 是一个兼容的 Android 应用程序,它没有可写和可执行的段(readelf --program-headers -W libBadFlags.so | grep WE)。

我试图在我的根 Android 设备上的许多地方找到 7za,并使用不同的权限,但仍然遇到同样的问题。

【问题讨论】:

    标签: android c++ android-ndk android-8.0-oreo


    【解决方案1】:

    Android 8.0 Changes 表示:

    原生库

    在面向 Android 8.0(API 级别 26)的应用中,如果原生库包含任何可写和可执行的加载段,则它们将不再加载。如果某些应用程序的本机库具有不正确的加载段,则它们可能会因为此更改而停止工作。这是一种安全强化措施。

    如需了解更多信息,请参阅Writable and Executable Segments

    链接器更改与应用所针对的 API 级别相关联。如果目标 API 级别的链接器发生更改,则应用无法加载库。如果您的目标 API 级别低于发生链接器更改的 API 级别,logcat 会显示警告。

    我猜你需要在Mainfest.xml 中设置android:extractNativeLibs="false" - 至少文档中是这么说的;所以这可能值得一试......和/或本机库的段需要以不同的方式排列。

    这在某种程度上是一个相当理论的问题,除非有某种可用的错误消息,应该在启用本机调试器时抛出。

    【讨论】:

    • 感谢您的回复。我正在尝试构建一个显示问题的示例代码。
    • 我刚刚在我的问题中添加了一些数据
    • @Amiad 您是否手动放入了7za 二进制文件?将 LZMA 压缩作为本机库(在应用程序包内)似乎更可能是一种可移植的解决方案:7-zip.org/sdk.html - 还要考虑 SE Linux 标签可能会阻止执行,如果没有给出预期的上下文; ls -laZ /system/bin 可能会提供线索。您可以尝试semanage 正确标记和/或restorecon 修复安全上下文(它应该与那里的任何其他二进制文件相同)。
    • @Amiad 为了获得问题的堆栈跟踪,您可以尝试system("strace /system/bin/7za t /sdcard/tmp/Camera.7z >> /sdcard/tmp/log.txt") ...
    猜你喜欢
    • 2011-11-27
    • 1970-01-01
    • 2013-10-21
    • 2021-09-07
    • 2011-03-12
    • 2011-03-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多