LINUX.ORG.RU
ФорумAdmin

[Solved] Не получается запустить java из udev rule (Failed to mark memory page as executable - check if grsecurity/PaX is enabled)

 , ,


0

3

Всем привет!

Операционная система - ubuntu 22.04

Я пытаюсь запускать код на java после того, как в системе появилось блочное устройство. Для этого я сделал правило

83-block-device-added.rules

ACTION=="add", SUBSYSTEM=="block", ENV{ID_FS_UUID}=="systemuuid", RUN{program}+="/home/riptor/test.sh"

файл test.sh запускается, вот его содержимое

#!/bin/sh
echo "running rule\n" >> /home/riptor/test-log.txt
java -version >> /home/riptor/test-log.txt

Файл test-log.txt создаётся и вот что туда попадает

running rule

Error occurred during initialization of VM
Failed to mark memory page as executable - check if grsecurity/PaX is enabled

При этом, если запустить /home/riptor/test.sh , всё работает нормально, проблем с джавой нет.

Пробовал paxctl -m java - не помогает

Вообще не уверен, что у меня там есть pax . sysctl -w kernel.pax.softmode=1 выдаёт sysctl: cannot stat /proc/sys/kernel/pax/softmode: No such file or directory

Может кто-нибудь подскажет куда копать?



Последнее исправление: riptor (всего исправлений: 3)

позанудничаю

зачем скрипт, который системный, лежит в хомяке пользователя?

во-вторых, чисто формально, в скрипте не хватает шебанга, чтобы всегда быть уверенным, что его интерпретирует нужный интерпретатор

втретьих, запусти-ка от рута свой скрипт? так же хорошо отработает, как и от пользователя?

на стеке вон, а ты смотри, что у тебя там в аппарморе.

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от aol

Скрипт в хомяке пользователя на время его редактирования и всего такого, потом планирую куда надо положить.

Шебанг в скрипте есть, я его просто не скопипастил (( . Спасибо за замечание, поправлю пост.

От рута скрипт запускать пробовал, работает нормально.

Насчёт аппармора, я его пробовал вообще выключить

aa-teardown 
systemctl disable apparmor 

С тем же результатом. Перезагружать комп правда не пробовал, вроде и так должно сработать.

riptor
() автор топика
Ответ на: комментарий от riptor

так!..

укажи-ка полный путь до джавы в своём скрипте.

каковы шансы, что она в твоей системе не одна и при запуске из правила удев выбирается какя-нибудь не работающая, не та?

aol ★★★★★
()
Последнее исправление: aol (всего исправлений: 1)
Ответ на: комментарий от riptor

Тут говорят что systemd/udev (не знаю какая там точная иерархия процессов) запускается с пониженными привилегиями с MemoryDenyWriteExecute=yes, и похоже это наследуется в подпроцессы.

https://github.com/systemd/systemd/issues/5400

https://www.filebot.net/forums/viewtopic.php?p=59913&sid=9d3f861b003b859691fa170c7570cecd#p59913

neumond
()
Ответ на: комментарий от neumond

Ну и собственно вот в чейнжлоге системд. Говорят, если хочется запускать что-то нестандартное, то надо выключить эту опцию для udev, и кагбе снизить себе безопасность.

https://github.com/systemd/systemd/pull/5414/files

neumond
()
Ответ на: комментарий от neumond

оворят, если хочется запускать что-то нестандартное, то надо выключить эту опцию для udev, и кагбе снизить себе безопасность.

Ты не поверишь! В файле /lib/systemd/system/systemd-udevd.service

заменил

MemoryDenyWriteExecute=yes

на

MemoryDenyWriteExecute=no

Потом рестартанул udev

systemctl daemon-reload
systemctl restart udev

И заработало! Главное я сам читал топик по filebot, но соображения дойти до конца не хватило ((. Спасибо!

Понижать секьюрити в udev, наверное, не выход, попробую, как советует @vbr запускать systemd сервис, когда триггерится событие в udev. Отпишусь чего получится

riptor
() автор топика
Ответ на: комментарий от riptor

Если вдруг решишь оставить этот решение с редактированием системного сервиса, редактируй через systemctl edit. Тогда он создаст override-файл в /etc и твои изменения будут там, а не перезатрутся при очередном обновлении systemd.

vbr ★★★★
()
Ответ на: комментарий от vbr

В общем оставлять решение с редактированием системного сервиса не понадобилось, твой совет помог.

Сделал oneshot systemd сервис, который запукается когда появляется новое блочное устройство. Но вообще это не так просто, как выяснилось. И отличается от добавления простого сервиса.

Поэтому вкратце распишу, что я сделал.

Сначала про отличия о простого сервиса. systemd сервис запускает программу, которая просто работает. А systemd следит за ней и если она выключается, то systemd запускает её заново или делает ещё что-то, что сказал делать пользователь.

А мне нужно, чтобы программа запускалась много раз. И желательно ещё ей передать какие-то аргументы. Как видно выше, просто запустить программу из правила udev не получается, потому что она запустится с пониженными привилегиями. Поэтому udev правило будет запускать сервис, который запустит программу. Чтобы так сделать, надо назвать файл с сервисом особенным образом. Чтобы там в названии была @

вот так - block-device-added@.service

Внутри файла такой текст

Type=oneshot
ExecStart=/home/riptor/test.sh %I
ExecStartPre=/bin/sleep 1

Чтобы запускать этот сервис я у меня вот такое правило Я сейчас, правда, активирую это правило только для устройства с конкретным uuid (для этого ENV{ID_FS_UUID}==«deviceuuid» )

SUBSYSTEM=="block", ACTION=="add", TAG+="systemd", ENV{ID_FS_UUID}=="deviceuuid", \
 PROGRAM="/bin/systemd-escape -p --template=block-device-added@.service $env{ID_BUS}-$env{ID_SERIAL}-part%n",\
 ENV{SYSTEMD_WANTS}+="%c

Вот примерно так. Если кому-то интересно, распишу подробнее, тут очень кратко. Просто хотел, чтобы тот, кто наткнётся примерно знал как порешать.

Большое спасибо всем за помощь, вы сделали мой день, а может и месяц!

riptor
() автор топика
Ответ на: комментарий от vel

куда не туда? удаф просто запускает то что ему скажут.

у меня был трижы свисток от кажется Мегафона - там была разлапистая морда, ЕМНИП как раз на жабе.. и запускалась по-моему тоже через удаф.

наверное удаф должен абортиццо выдавая сообщение что он жаву запускать не будет.. и отправлять жалобу в sportloto@megaвонь.ру

anonymous
()
Ответ на: комментарий от anonymous

Скрипты для udev запускающие java-приложение это неправильный путь.

Потом выяснится, что для загрузки онтопика нехватает памяти потому, что udev запускает жабу которая сожрала всю память.

Потом initrd станет невъ$%^&*х размеров потому, что для скриптов udev нужна жаба.

vel ★★★★★
()
Ответ на: комментарий от vel

надеюсь джбака была без гуя… :)
а шо делать, если ну вот так оно ужо есть и делать альтернативу смысла нет.
экстрактивная небинарная креативность производителя периодически попадается под руки.

несколько лет назад сталкивался с чем-то подобным. помню жуткое неудобство что удев и системд работают в разных окружениях и для передачи сигнала из удава пришлось костылить файловым флагом.

pfg ★★★★★
()
Последнее исправление: pfg (всего исправлений: 1)
Ответ на: комментарий от vel

Скрипты для udev запускающие java-приложение это неправильный путь.

ОНИ ТУПО ЗАПУСКАЮТ ЧТО СКАЖЕШЬ. без дыскрымынации. это может быть хоть игра.

чёрт што ты несешьё

mrjaggers
()
Ответ на: комментарий от mrjaggers

Ты набрасывал из-под анонимуса, где-то треть комментариев было 5.2, остальные просто тупой флуд. Я сделал групповое удаление. Да, у части комментариев получилась неверная причина удаления. Зато теперь ты наконец-то начал писать с основного аккаунта, что не может не радовать.

hobbit ★★★★★
()