Разрешение отклонено при выполнении двоичных файлов на Android targetSdkVersion> 28

у меня есть приложение, которое создает туннель подключения ssh для переадресации трафика. но он отлично работает на targetSdkVersion 28 и ниже. но при atargetSdkVersion>28 при запуске (выполнении) следующих команд (при запуске двоичных файлов) возникает ошибка 126 ИЛИ Разрешение отклонено.

я не знаю, что именно изменилось в версии API 29 (разрешения или /data/data/ или что-то еще). ошибка непонятна.

    protected static String BASE = "/data/data/com.staf621.ki4a/ki4a";
    protected static String BASE_BIN = "/bin";
    ssh_return_val = Util.runChainFireCommand(
                            ((key_switch && !enc_ssh_key) ? "" : BASE + BASE_BIN + "/sshpass -p \"" + password_text + "\" ")
                                    + BASE + BASE_BIN + "/ssh " + server_text + " -p " + port_number + " -l " + user_text
                                    + " -NT -g -D " + Util.localSocksPort + (dns_switch?" -L 127.0.0.1:8163:"+dns_server+":53":"")
                                    + forward_string
                                    + (key_switch ? " -i \"" + BASE + "/id_rsa\"" : "")
                                    + (compress ? " -C" : "")
                                    + " -o \"ProxyCommand " + BASE + BASE_BIN + "/korkscrew"
                                    + (iptables_switch ? "" : " --ancillaryfile " + BASE + "/sshfd_file")
                                    + (proxy ? " --proxyhost " + proxy_host
                                    + " --proxyport " + proxy_port + " --desthost %h --destport %p"
                                    + " --headerfile " + BASE + "/header_file" + "\""
                                    : " --directconnection --desthost %h --destport %p\"")
                                    + " -o \"KeepAlive yes\" -o \"ServerAliveInterval 15\""
                                    + " -o \"StrictHostKeyChecking=no\" -o \"GlobalKnownHostsFile=/dev/null\"", false, true);
                }

Логкассета:

[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/sshpass: Permission denied
[libsuperuser][O][SH-] 126
[libsuperuser][C][SH%] END
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][C][SH+] /data/data/com.staf621.ki4a/ki4a/bin/busybox killall -9 korkscrew;/data/data/com.staf621.ki4a/ki4a/bin/busybox killall -9 ssh;/data/data/com.staf621.ki4a/ki4a/bin/busybox killall -9 tun2socks/data/data/com.staf621.ki4a/ki4a/bin/busybox killall pdnsd
[libsuperuser][C][SH%] END
[libsuperuser][C][SH%] START
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][C][SH+] /data/data/com.staf621.ki4a/ki4a/bin/busybox killall pdnsd; echo $?
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][C][SH%] END
[libsuperuser][O][SH*] sh: <stdin>[1]: /data/data/com.staf621.ki4a/ki4a/bin/busybox: Permission denied
[libsuperuser][O][SH-] 126

Я прикрепил изображение файлов /data/data/packagename/, а также содержимое и разрешения двоичных файлов. См. изображение

на targetSdkVersion<=28 он работает отлично, но на targetSdkVersion>28 он улавливает ошибку 126 и отказ в разрешении при запуске двоичных файлов.

Какова минимальная и целевая версии SDK вашего приложения? Вы используете один и тот же .apk на обоих устройствах?

Joseph Sible-Reinstate Monica 30.06.2024 18:05

мин — 21, а цель — 28, я меняю ее на 30

Beam config 30.06.2024 18:14

да. один apk-файл, когда я запускаю Android 14 (api ava 34), я получил эту ошибку. но тем более что андроид 14 работает нормально. в Android 14 что-то изменилось, что предотвращает выполнение этих двоичных файлов

Beam config 30.06.2024 18:16

Я думаю, проблема связана с тем, что вы изменили целевую версию SDK, а не фактическую версию устройства, на котором он работает. Чтобы подтвердить это, можете ли вы попробовать запустить целевую сборку SDK 30 на Android 13 и посмотреть, что там произойдет?

Joseph Sible-Reinstate Monica 30.06.2024 18:18

прежде чем я что-либо изменил, целевой SDK был 28, и он работал на всех версиях Android, но не работал на Android 14. теперь я меняю его на 30, снова работает на всех версиях Android, кроме 14

Beam config 30.06.2024 20:39

@JosephSible-ReinstateMonica я кое-что понял. когда я меняю целевой SDK выше 28, он говорит, что разрешение отклонено и не работает. для 28 и меньше работает

Beam config 01.07.2024 10:25
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
6
100
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

targetSdkVersion 28 — последняя перед Android 10. https://developer.android.com/about/versions/10/behavior-changes-10#execute-permission вот что изменилось после этого:

Выполнение файлов из домашнего каталога приложения, доступного для записи, является нарушением W^X. Приложения должны загружать только двоичный код, встроенный в APK-файл приложения.

Ненадежные приложения, предназначенные для Android 10, не могут вызывать execve() непосредственно для файлов в домашнем каталоге приложения.

Кроме того, приложения, предназначенные для Android 10, не могут изменять в памяти исполняемый код из файлов, которые были открыты с помощью dlopen(), и ожидать, что эти изменения будут записаны на диск, поскольку библиотека не может быть сопоставлена ​​PROT_EXEC через записываемый файловый дескриптор. Сюда входят любые файлы общих объектов (.so) с текстовыми перемещениями.

И это именно то, что вы пытаетесь сделать. Это та же самая проблема, с которой столкнулся Termux, из-за которой они не могли публиковать какие-либо обновления в Play Store; подробнее об этом см. https://github.com/termux/termux-packages/wiki/Termux-and-Android-10 и https://github.com/termux-play-store.

Я помещаю двоичные файлы в APK-файл, но все равно возникает ошибка.

Beam config 08.07.2024 09:01

Я установил targetSdkVersion=28, получил вывод APK и без проблем запустил приложение на Android 10,11,12,13. Итак, проблема в Android 10, почему APK работает даже на Android 13, НО НЕ 14

Beam config 08.07.2024 09:06

Другие вопросы по теме