Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android Nougat ProcessBuilder忽略路径环境变量-错误/问题?_Android_Security_Processbuilder_Android 7.0 Nougat_Android Security - Fatal编程技术网

Android Nougat ProcessBuilder忽略路径环境变量-错误/问题?

Android Nougat ProcessBuilder忽略路径环境变量-错误/问题?,android,security,processbuilder,android-7.0-nougat,android-security,Android,Security,Processbuilder,Android 7.0 Nougat,Android Security,我有一个android应用程序,它在第一次运行时提取一些本机可执行文件,并使用它来做一些工作。它在牛轧糖之前起作用,然后停止工作。经过几天的调查,我发现PATH环境变量是可以接受的,但并没有考虑在内!我正在尝试这是一个特性还是一个bug 首先,让我们看看我们有什么,如果我们能够从cmd做同样的事情。 我已经用“my.app.package”替换了实际的android应用程序包,并用“…”替换了不相关的输出 ZTE_BLADE_V0800:/ $ run-as my.app.package ZTE

我有一个android应用程序,它在第一次运行时提取一些本机可执行文件,并使用它来做一些工作。它在牛轧糖之前起作用,然后停止工作。经过几天的调查,我发现PATH环境变量是可以接受的,但并没有考虑在内!我正在尝试这是一个特性还是一个bug

首先,让我们看看我们有什么,如果我们能够从cmd做同样的事情。 我已经用“my.app.package”替换了实际的android应用程序包,并用“…”替换了不相关的输出

ZTE_BLADE_V0800:/ $ run-as my.app.package
ZTE_BLADE_V0800:/data/data/my.app.package $ whoami
u0_a129
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l
total 56
drwxrwx--x  2 u0_a129 u0_a129 4096 2017-03-14 16:15 app_build
drwxrwx--x  2 u0_a129 u0_a129 4096 2017-03-15 13:15 app_buildSources
drwxrwx--x  2 u0_a129 u0_a129 4096 2017-03-14 16:15 app_downloads
-rw-------  1 u0_a129 u0_a129   35 2017-03-14 16:16 app_repository
drwxrwx--x 14 u0_a129 u0_a129 4096 2017-03-14 16:16 app_sdk
drwxrwx--x  3 u0_a129 u0_a129 4096 2017-03-14 16:15 app_temp
drwxrwx--x  2 u0_a129 u0_a129 4096 2017-03-14 16:15 cache
lrwxrwxrwx  1 root    root      54 2017-03-15 13:15 lib -> /data/app/my.app.package-2/lib/arm
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l ./app_sdk/                                                                                                    
total 96
...
drwx------ 4 u0_a129 u0_a129 4096 2017-03-14 16:16 cppcheck#1.64#1
...
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l ./app_sdk/cppcheck\#1.64\#1/                                                                                  
total 16
...
drwx------ 3 u0_a129 u0_a129 4096 2017-03-14 16:16 bin
-rw------- 1 u0_a129 u0_a129    0 2017-03-14 16:16 init.done
ZTE_BLADE_V0800:/data/data/my.app.package $ ls -l ./app_sdk/cppcheck\#1.64\#1/bin                                                                               
total 6960
drwx------ 2 u0_a129 u0_a129    4096 2017-03-14 16:16 cfg
-rwxr-xr-x 1 u0_a129 u0_a129 2345332 2017-03-14 16:16 cppcheck
-rwxr-xr-x 1 u0_a129 u0_a129 1211424 2017-03-14 16:16 libgnustl_shared.so
ZTE_BLADE_V0800:/data/data/my.app.package $ export PATH=$PATH:./app_sdk/cppcheck#1.64#1/bin
ZTE_BLADE_V0800:/data/data/my.app.package $ export LD_LIBRARY_PATH=./app_sdk/cppcheck#1.64#1/bin
ZTE_BLADE_V0800:/data/data/my.app.package $ cppcheck --version
Cppcheck 1.65 dev
ZTE_BLADE_V0800:/data/data/my.app.package $
现在,让我们尝试在运行时执行相同的操作:

ProcessBuilder processBuilder = new ProcessBuilder();

String path =
  System.getenv("PATH") +
  ":./app_sdk/cppcheck#1.64#1/bin";
processBuilder.command(new String[] {
//      "sh", "-c", "echo $PATH", // (1) working
//      "sh", "-c", "echo $LD_LIBRARY_PATH", // (2) working
        "./app_sdk/cppcheck#1.64#1/bin/cppcheck", "--version" // (3) working
//      "cppcheck", "--version"                             // (4) NOT working even with PATH env variable passed
      });
processBuilder.directory(new File("/data/data/my.app.package/"));
Map<String, String> env = processBuilder.environment();
env.put("PATH", path);
env.put("LD_LIBRARY_PATH", "./app_sdk/cppcheck#1.64#1/bin");
process = processBuilder.start();
ProcessBuilder ProcessBuilder=new ProcessBuilder();
字符串路径=
System.getenv(“路径”)+
“:./app#u sdk/cppcheck#1.64#1/bin”;
processBuilder.command(新字符串[]){
//“sh”、“-c”、“echo$PATH”、//(1)工作
//“sh”、“-c”、“echo$LD\u LIBRARY\u PATH”、/(2)正在工作
“/app_sdk/cppcheck#1.64#1/bin/cppcheck”,“--版本”//(3)正在运行
//“cppcheck”,“--版本”//(4)即使传递了PATH env变量也不工作
});
processBuilder.directory(新文件(“/data/data/my.app.package/”);
Map env=processBuilder.environment();
环境投入(“路径”,路径);
环境put(“LD#u LIBRARY_PATH”、“/app#u sdk/cppcheck#1.64#1/bin”);
process=processBuilder.start();
我会抛出
IOException

原因:错误=13,权限被拒绝 无法运行程序“cppcheck”(在目录中 “/data/data/my.app.package”):错误=13

让我们看看路径是否正确传递。 取消注释注释(1)并注释其他命令行,确认其已设置:

/sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin:./app#u sdk/cppcheck#1.64#1/bin

让我们看看LD_LIBRARY_路径是否正确传递。 取消注释注释(2)并注释其他命令行,确认其已设置:

./app#u sdk/cppcheck#1.64#1/bin

现在让我们看看我是否能够运行通过完整路径的工具。 取消注释注释(3)并注释其他命令行,请参见它现在正在工作:

Cppcheck 1.65开发

哇,即使传递了路径,我也必须传递可执行文件的完整路径。如果我使用短工具名,我将获得
权限被拒绝
错误

这是牛轧糖(因为我只开始吃牛轧糖)的特点或问题,还是我错过了什么

我知道Nougat引入了更严格的安全策略,但我认为没有理由停止工作,因为所有文件都在app sandbox(我的app目录中的内部目录)中


另外,我不能在命令行中替换所有的短可执行文件名,因为可执行文件也可以使用短可执行文件名运行另一个可执行文件,所以我最终需要考虑PATH变量。

我没有从谷歌得到任何响应(他们从1月25日开始着手处理)所以我必须通过完整的可执行路径来解决它,就像在评论(3)中一样。

事实上,我从谷歌那里得到了回应,在牛轧糖之前它是一个bug,甚至在牛轧糖之前它也不应该这样工作