у меня есть приложение, которое создает туннель подключения 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 и отказ в разрешении при запуске двоичных файлов.
мин — 21, а цель — 28, я меняю ее на 30
да. один apk-файл, когда я запускаю Android 14 (api ava 34), я получил эту ошибку. но тем более что андроид 14 работает нормально. в Android 14 что-то изменилось, что предотвращает выполнение этих двоичных файлов
Я думаю, проблема связана с тем, что вы изменили целевую версию SDK, а не фактическую версию устройства, на котором он работает. Чтобы подтвердить это, можете ли вы попробовать запустить целевую сборку SDK 30 на Android 13 и посмотреть, что там произойдет?
прежде чем я что-либо изменил, целевой SDK был 28, и он работал на всех версиях Android, но не работал на Android 14. теперь я меняю его на 30, снова работает на всех версиях Android, кроме 14
@JosephSible-ReinstateMonica я кое-что понял. когда я меняю целевой SDK выше 28, он говорит, что разрешение отклонено и не работает. для 28 и меньше работает
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-файл, но все равно возникает ошибка.
Я установил targetSdkVersion=28, получил вывод APK и без проблем запустил приложение на Android 10,11,12,13. Итак, проблема в Android 10, почему APK работает даже на Android 13, НО НЕ 14
Какова минимальная и целевая версии SDK вашего приложения? Вы используете один и тот же .apk на обоих устройствах?