LINUX.ORG.RU
решено ФорумMobile

При запуске android автостартовый .sh скрипт выполняется не полностью

 , ,


0

1

Добавил скрипт на телефон /system/etc/init.fairnet.sh :

#!/system/bin/sh

insmod /system/lib/modules/xt_HL.ko lsmod > /system/etc/curlsmod /system/bin/iptables -t mangle -L > /system/etc/preiptables /system/bin/iptables -t mangle -A POSTROUTING -o rmnet+ -j TTL --ttl-set 64 /system/bin/iptables -t mangle -L > /system/etc/postiptables

Прошил телефон пересобранным образом ядра, изменив init.sony.rc - по триггеру завершения загрузки добавил свой сервис fairnet :

on property:dev.bootcomplete=1 start fota-snoop # системный сервис start fota-trigger # системный сервис start startup-prober # системный сервис start fairnet # мой сервис

сам сервис:

service fairnet /system/bin/sh /system/etc/init.fairnet.sh user root group root disabled oneshot

права и пользователь скрипта:

-rw-r--r-- root root 280 2018-01-09 01:03 init.fairnet.sh

Самая интересная штука, что при запуске вроде скрипт действительно исполняется, но только частично, т.к. модуль xt_HL.ko действительно загружается, а вот файлы вывода не создаются, и правила iptables также не меняются. Если выполнить скрипт вручную после запуска системы, то все ок, но при загрузке выполняется только первая команда скрипта, я в недоумении как вообще это возможно, чтобы скрипт выполнялся частично. Скорее всего остальные команды просто не валидны при выполнении из загрузки, но я не могу понять почему.

Проблема решена!

Главным виновником оказался SELinux.

dmesg | grep iptables на выхлопе выдавал

<36>[ 39.819005] type=1400 audit(1516096993.541:9): avc: denied { create } for pid=2652 comm=«iptables» lport=255 scontext=u:r:init_shell:s0 tcontext=u:r:init_shell:s0 tclass=rawip_socket op_res=-13 ppid=2640 pcomm=«sh» tgid=2640 tgcomm=«sh»

значит в текущей политке /sepolicy не хватало правила, разрешающего выполнение отклоненной операции (команда /system/bin/iptables) на этапе загрузки ОС.

Для добавления нужного правила использовалась утилита sepolicy-inject (https://bitbucket.org/joshua_brindle/sepolicy-inject), для ее сборки также необходима библитека /usr/lib/libsepol.a, входящая в состав пакета libsepol1-dev (https://packages.debian.org/stretch/mipsel/libsepol1-dev). Также можно использовать готовый собранный вариант (https://forum.xda-developers.com/devdb/project/dl/?id=26279) для всех архитектур (мне не помогло, пришлось собирать самому).

./sepolicy-inject -s init_shell -t init_shell -c rawip_socket -p getopt,create,setopt -P sepolicy -o sepolicy_new добавляет нужное правило и создает новый sepolicy_new из старого sepolicy с девайса.

Прошиваем девайс новым собранным ядром с новой политикой, для сборки я использовал AIK (https://forum.xda-developers.com/showthread.php?t=2073775) для Win.

Готово! Теперь при загрузке телефона скрипт выполняется польностью.

P.S. Свой сервис я переместил из init.sony.rc в init.qcom.rc, а также убрал строки group root и disabled, но сделал это по идейным соображениям и это никак не решает проблему.

P.P.S. Возможно проблема также решается переведением SELinux в режим Permissive, но я не хотел лишаться этой защиты.

mustafadjan ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.