LINUX.ORG.RU

доступ к DBUS из под рута

 , ,


0

1

пишу puntoswitcher под KDE и хочу сделать его минималистичным, чтобы резидентно работал один демон, никакие процессы там не вызывались.

И проблема в том, что слушать клавиатуру может только рут, а доступ к буферу обмена есть только у пользователя.

Ну есть же SUID, и я хочу чтобы программа переключалась между этими пользователями при помощи setreuid():

int main() {
    uid_t user = getuid();
    uid_t root = geteuid();
    printf("start: %d %d\n",getuid(),geteuid());
    if(0!=setreuid(-1, user)){ // временно стать пользователем
        perror("setreuid(-1, user)");
        exit(1);
    }
    printf("user mode: %d %d\n",getuid(),geteuid());

    DBusError err;
    DBusConnection* conn;
    DBusMessage* msg;
    DBusMessage* reply;
    char* result;

    // Инициализация ошибок
    dbus_error_init(&err);

    // Подключение к сессионной шине D-Bus
    conn = dbus_bus_get(DBUS_BUS_SESSION, &err);
    if (dbus_error_is_set(&err)) {
        fprintf(stderr, "Ошибка подключения к D-Bus: %s\n", err.message);
        dbus_error_free(&err);
        return 1;
    }
...

и оно пишет

start: 1000 0
user mode: 1000 1000
Ошибка подключения к D-Bus: Unable to autolaunch when setuid

как DBUS сказать от имени программы что я юзер 1000?

Перемещено Zhbert из desktop


conn = dbus_bus_get(DBUS_BUS_SESSION, &err);

По идее оно читает адрес подключения из переменной DBUS_SESSION_BUS_ADDRESS, так что использовать dbus_connection_open и указывать путь к конкретному сокету

xgatron
()

Во-первых, перенеси топик в Development.

Во-вторых, ты setuid бит на экзешник поставил? Имхо, надо делать не так. Вместо «временно стать пользователем» надо временно становиться рутом — реально временно, только на время выполнения операций, требующих рута, и вместо грубого бита setiud, который даёт экзешнику все рутовые права, действовать тоньше через capabilities: cap_setuid и cap_setgid будет достаточно. man capabilities, man setcap.

В-третьих, если ты программист или что-то около того, автоматическое переключения языка — идея не самая лучшая. Автоматическое переключение языка может работать при наборе текстов на естественных языках. Если же приходится набирать коды программ i = j + 1 или команды ls, то весь этот искусственный недоинтеллект не столько помогает, сколько мешает. Можешь скомпилировать xneur и попробовать с ним пожить недельку-другую.

В-четвёртых, если отказаться от идеи автоматического переключения языка, то (почти) идеальная переключалка уже существует, называется tapper.

debugger ★★★★★
()

Сделай демона от рута и демона от пользователя. Посылай сигналы от пользовательской программы по D-bus рутовой части, от рутовой по D-bus пользовательской. Разрешением, что можно посылать и кому, занимается Policykit.

А ещё можно подсмотреть, как это сделано в xneur.

Aceler ★★★★★
()

Самое простое, что приходит в голову - разбить программу на два бинарника. Один запускается от root, другой от юзера. Root слушает клавиши и по сокету шлёт инфу о необходимости переключить раскладку программе запущенной от юзера.

Удобным кажется вариант, что программа запускается от юзера, а затем запускает саму себя же с правильным ключом и через sudo (добавить эту команду в sudoers, чтобы не просила пароль), а затем рутовая часть через stdout выдаёт запросы на переключение раскладки, а пользовательская часть считывает их (она же родитель рутового процесса) и переключает.

Всякие варианты имитации «работая от root прикинуться пользователем» потенциально не очень надёжны и более сложны в реализации. А ещё то что программа целиком работает от root плохо с точки зрения безопасности, лучше всего изолировать минимальную часть, которой нужны права, а остальное гонять от юзера. Также удобно, что юзер может убить пользовательскую часть и рутовая тоже умрёт как дочерний процесс.

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

разбить программу на два бинарника. Один запускается от root, другой от юзера. Root слушает клавиши и по сокету шлёт

правильное решение!

рутовый кейлогер это то о чём давно мечтали пользователи ;-)

К чёртям все эти полумеры с запрятанными закладками..Всё прямо, честно и открыто - сидим рутом, читаем весь ввод и имеем доступ к буферу обмена и сессии X.

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

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

нужно брать input под пользователем от своего X11 сеанса.

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

через sudo (добавить эту команду в sudoers, чтобы не просила пароль)

Зачем вот это всё, если можно рутовую часть запустить как демона из systemd, а пользовательскую часть как часть скрипта старта графической сессии.

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

рутовый кейлогер

Ну и что? Рутовый же, значит проверка прав доступа ложится на него, нет в этом ничего страшного, если её корректно реализовать без ошибок.

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

ладно, нашёл tapper, но что-то не могу понять, нам есть функционал «изменить раскладку выделенного текста»?

Нет. tapper — включатель клавиатурных раскладок, а не «перекодировщик выделенного текста».

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

Wayland не позволяет приложению «шпионить» за всей клавиатурой из соображений безопасности. Там можно работать только через специальные API, часто только в пределах активного окна.

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

ну да, а плохая архитектура поможет даже? dbus у вас будет, шпион не сможет же подключится в пользовательском сеансе к dbus потому что про него не знает! шах и мат!

отличная логика, сами себе понаставили костылей в вайланде и потом их решают через другое место…

anonymous2 ★★★★★
()
Последнее исправление: anonymous2 (всего исправлений: 1)