Remote Desktop Protocol (протокол удалённого рабочего стола, RDP) — проприетарный протокол, разработанный Microsoft примерно в 1998 году. Начиная с XP каждая версия Windows включает системный компонент mstsc.exe.

Благодаря RDP, можно подключиться к другой системе и работать за ней словно за своим компьютером. То же самое делают, например, AnyDesk и TeamViewer, у которых протоколы схожей функциональности.

▍ Как работает RDP


В общих словах, базовая функция протокола удалённого рабочего стола — передача видеопотока от сервера клиенту. На сервере стоит устройство видеозахвата, которое записывает видео, сжимает его кодеком H.264 — и отправляет клиенту с минимальной задержкой по TCP/IP.

Конечно, только отправить видеопоток недостаточно, это же не простая видеотрансляция. Это лишь часть виртуальных каналов в RDP. Нужно ещё получить обратную связь от клиента, а именно зашифрованные данные об активности мыши и клавиатуры.


Информация между клиентом и сервером в RDP передаётся параллельно по тысячам виртуальных каналов

На сервере RDP использует собственный видеодрайвер для рендеринга вывода изображения на экран, внедряя информацию о рендеринге в сетевые пакеты с помощью протокола RDP и отправляя их по сети на клиент. На клиенте RDP получает данные рендеринга и интерпретирует пакеты в соответствующие вызовы API интерфейса графических устройств Microsoft Windows (GDI). На сервере у RDP собственный драйвер клавиатуры и мыши для приёма этих событий от клиента.

В сеансе удалённого рабочего стола все переменные среды — например, определяющие глубину цвета, включение и отключение обоев — определяются настройками отдельного соединения RCP-Tcp. Все функции и методы для описания переменных описаны в справочнике по веб-подключению к удалённому рабочему столу и интерфейсе поставщика WMI служб удалённых рабочих столов.

Если вдаться в детали, то в рамках стека RDP интерес представляют четыре ключевых компонента:

  • служба многоточечной связи (MCSMux)
  • Generic Conference Control (GCC)
  • Wdtshare.sys — драйвер для передачи пользовательского интерфейса, сжатия, шифрования, кадрирования и т. д.
  • Tdtcp.sys — транспортный драйвер для упаковки контента RDP в пакеты TCP/IP

MCSmux и GCC являются частью семейства стандартов T.120 Международного союза электросвязи (ITU). В частности, MCSmux представляет два стандарта:

  • T.122: Определяет многоточечные услуги
  • T.125: Определяет протокол передачи данных


Стек протоколов

MCSMux управляет:

  • назначением каналов путём мультиплексирования данных на заранее определённые виртуальные каналы в рамках протокола
  • уровням приоритетов
  • сегментацией передаваемых данных

Примерно так работает система, в двух словах. И, видимо, не только RDP, но и во всех остальных программах для удалённого управления компьютером, в том числе в проприетарных протоколах AnyDesk или TeamViewer.

▍ Версии RDP


Microsoft продолжает планомерно дорабатывать протокол RDP. В последние годы версии RDP соответствую версиям операционной системы, с которой он выходит.

Например, версия 7.0 вышла вместе с Windows 7 и Windows Server 2008 R2, версия 8 — с Windows 8 и Windows Server 2012 и так далее. Ниже небольшая табличка с перечислением нескольких последних версий RDP и новых функций для каждой. Что характерно, большинство новых функций RDP было доступно только в версиях Windows Enterprise or Ultimate.

Версия RDP Версия Windows Новые функции RDP
7.0 Windows 7 и Windows Server 2008 R2
  • Смена названия со «службы терминалов» на «службу удалённого доступа»
  • Поддержка редиректа Windows Media Player, двунаправленного звука, нескольких мониторов, элементов интерфейса Aero Glass
  • Улучшенное сжатие битмапов
  • Редирект Easy Print
  • Докинг языковой панели
7.1 Windows 7 SP1 и Windows Server 2008 R2 SP1
  • Внедрение проприетарной технологии RemoteFX, которая включает виртуализацию GPU, что означает совместное использование физического графического адаптера несколькими виртуальными машинами (кстати, это пригодилось для майнеров во время биткоин-бума начала 2010-х годов), редирект USB, новый более качественный lossy-кодек для сжатия видео и текста
  • В серверной версии RemoteFX (то есть в версии для Windows Server) реализовали механизм адаптивной графики с подстройкой под разные параметры среды окружения, поддержку UDP для WAN, мультитач (передача жестов между устройствами), нативную интеграцию VoIP, прямую передачу и рендеринг аудио- и видеоконтента через RemoteFX Media Redirection API, выбор GPU (софтверный или с аппаратной поддержкой
  • Поддержка DirectX 11
8.0 Windows 8 и Windows Server 2012
  • Адаптивная графика
  • Автоматический выбор TCP или UDP
  • Мультитач, vGPU, более продвинутый редирект USB и некоторые другие функции, ранее доступные только в серверной версии
  • На верхней панели клиента RDP появилась кнопка «Качество соединения»



  • Ограниченная поддержка вложенных сессий
  • Удалены функции слежки за пользовательскими сессиями со стороны администратора и Aero Glass
8.1 Windows 8.1 и Windows Server 2012 R2
  • Функция слежки за пользовательскими сессиями со стороны администратора возвращена обратно
  • Исправлены глюки Microsoft Office 2013 при работе RemoteApp, это специальный режим работы Remote Desktop Services с интеграцией конфигурации сессии в операционную систему клиента
  • Появился режим «ограниченный админ», где вместо пароля передаётся его хэш. Microsoft опубликовала 82-страничное руководство, как защититься от кражи хэша в этом режиме
10.0 Windows 10
  • Реализован зум AutoSize (полезен для клиентов с экранами высокого разрешения)
  • Основной графический кодек проапгрейдили до H.264/AVC
  • Небольшое обновление RemoteFX для Windows Server: поддержка OpenGL 4.4 и OpenCL 1.1, больше выделенной видеопамяти для адаптера RemoteFX, различные улучшения производительности в транспорте и API. Ещё RemoteFX Media Streaming (H.264) заменил Multi Media Redirection (MMR)
Актуальная версия RDP — 10.0.

Как видим, в серверных версиях Windows RDP гораздо функциональнее, чем в клиентских. Кстати, это касается и некоторых других компонентов Windows. Это одна из причин, почему админы часто ставили Windows Server даже на персоналки. Они тогда говорили, что Windows Server 2012 даже работает стабильнее, чем обычная Windows 7, почти никогда не падает.

В Windows 10/11 стабильность клиентских версий Windows повысили, так что эта проблема уже не так актуальна. Сейчас про «синий экран смерти» мало кто вспоминает (тем более он уже не синий), а раньше BSOD случался чуть ли не ежедневно от банальных причин…

Впрочем, мы отвлеклись.

▍ Официальный клиент


Как уже говорилось — начиная с Windows XP, все версии Windows включают системный компонент службы терминалов mstsc.exe. Вызвать его можно прямо из консоли. Команда mstsc.exe /? выводит справку:


В справке перечислены все допустимые параметры и команды mstsc.exe. Количество параметров зависит от версии операционной системы (см. таблицу выше). Как видим, все команды можно вводить в консоли, то есть работать с клиентом полностью из командной строки. Например:

mstsc /v:192.168.1.1

mstsc /w:1024 /h:768

mstsc /edit D:\RDPfiles\user2.rdp — редактировать параметры удалённого подключения в файле D:\RDPfiles\user2.rdp.

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

Если запустить из командной строки mstsc.exe, то откроется окошко с графическим интерфейсом.


В этом GUI доступны все основные параметры запуска, как из командной строки. Хотя в консоли всё-таки свободы больше: например, можно установить произвольный размер окна для удалённого рабочего стола, а не выбирать из ограниченного списка шаблонов.


▍ Свободные реализации


Хотя протокол сугубо проприетарный, существует множество сторонних реализаций клиентов и серверов RDP, которые отличаются от проприетарного оригинала Microsoft. К сожалению, из-за закрытости протокола они реализуют не всю функциональность RDP.

Из интересных проектов можно упомянуть Xrdp — опенсорсный RDP-сервер под Linux. Xrdp обеспечивает графический вход на удалённые машины по RDP и принимает соединения от различных клиентов:

  • FreeRDP
  • rdesktop
  • KRDC
  • NeutrinoRDP
  • Windows MSTSC (Microsoft Terminal Services Client, он же mstsc.exe), то есть нативный клиент, описанный выше
  • Microsoft Remote Desktop (находится в Microsoft Store, отличается от MSTSC).

Многие из них работают на некоторых или всех ОС Windows, Mac OS, iOS и/или Android.

Транспорт RDP по умолчанию шифруется с помощью TLS.



Кроме доступа к удалённому рабочему столу Linux, поддерживается и доступ к удалённым ресурсам, включая двустороннюю передачу клипборда, редирект звука, микрофона и диска (монтирование локальных дисков на удалённый компьютер).

В описании Xrdp упомянуты популярные опенсорсные RDP-клиенты: FreeRDP (macOS, Windows, Linux), rdesktop, KRDC, NeutrinoRDP. Есть десяток GUI-клиентов поверх rdesktop, коммерческий клиент Thincast на базе FreeRDP, а также GTK-клиент Remmina.

▍ Уязвимости


В связи со сложностью проприетарного протокола и внедрением новых функций и закрытым исходным кодом в RDP постоянно находят новые уязвимости. Обычно это критические уязвимости с удалённым исполнением кода. Конечно, RDP притягивает злоумышленников, ведь дыра в нём почти сразу предоставляет полный доступ к удалённому компьютеру. Наверное, и сейчас существуют 0day-уязвимости в RDP, о которых не сообщают общественности, но знающие люди ими пользуются.


В целом же приятно видеть, что проприетарный протокол Microsoft обрастает опенсорсным софтом и библиотеками, так что постепенно интегрируется в открытую экосистему — и выбирается из проприетарного рабства. В рамках новой политики Microsoft по поддержке Open Source можно ожидать, что она и сама когда-нибудь откроет исходный код RDP.

Комментарии (25)


  1. SGordon123
    21.06.2023 09:43
    +6

    citrix тут совсем не у дел?


    1. MockBeard
      21.06.2023 09:43
      +5

      Кто сейчас помнит про Sybase SQL, из которого вырос MS SQL?


    1. AnGord
      21.06.2023 09:43
      +5

      Увы, они не успели за прогрессом. Постепенно большую часть их ключевых функций внедрили у себя МС и встал вопрос - а зачем citrix ?


  1. SerpentFly
    21.06.2023 09:43
    +5

    В связи со сложностью проприетарного протокола и внедрением новых функций и закрытым исходным кодом в RDP постоянно находят новые уязвимости.

    Можно "улучшить сон" если "спрятать" RDP за SSH или Wireguard туннелем.


  1. vis_inet
    21.06.2023 09:43
    +31

    Так и не понял из статьи про "вырывание (почти) из рабства"...


    1. remzalp
      21.06.2023 09:43

      Есть опенсорсная реализация как сервера, так и клиента, что для проприетарного протокола уже (почти) хорошо


      1. SabMakc
        21.06.2023 09:43
        +9

        И чем наличие опенсорсных реализаций делает протокол менее проприетарным?
        Или вышла какая-то свежая реализация? Xrdp с 2004го года живет потихоньку...


      1. erkesh
        21.06.2023 09:43
        +6

        так этим "почти" MS RDP аналогам сто лет в обед. А если сравнить их качество с MS RDP - как пешком до луны


      1. mihmig
        21.06.2023 09:43
        +10

        Да, только они работают а-ля VNC (тупо гоняют битмапы).
        Проприетарный же RDP несколько быстрее, так как передаёт по сети GDI-примитивы.


  1. Vasjen
    21.06.2023 09:43
    +4

    BSOD в WIN10 все еще синий
    BSOD
    BSOD

    Но да, так же часто как в XP, еще до выхода SP3, он не падает.


    1. Shaginov
      21.06.2023 09:43
      +1

      Кстати, есть видео из первых рук (ну ладно, из вторых) о том, как BSOD эволюционировал: https://www.youtube.com/watch?v=KgqJJECQQH0


  1. ZetaTetra
    21.06.2023 09:43
    +2

    Microsoft Remote Desktop (находится в Microsoft Store, отличается от MSTSC).

    Внутри использует COM компонент и написан на C#.
    Поэтому его легко реверсануть и написать свою реализацию.
    (Про остальные не знаю, не изучал)

    Но наличие решений испольующих этот компонент, не приближает открытости решения, как это НЕ произошло с Trident'ом...
    Думается мне, единственный вариант появления открытого решения - если бизнес начнёт платить за реверс, как это произошло с Biff8.


  1. atd
    21.06.2023 09:43

    Это одна из причин, почему админы часто ставили Windows Server даже на персоналки. Они тогда говорили, что Windows Server 2012 даже работает стабильнее, чем обычная Windows 7, почти никогда не падает.

    Почему в прошедшем времени? И сейчас 2022 сильно приятней 10/11, не надо постоянно бороться с системой, один раз настоил и вперёд. Удобно, что нужные компоненты можно добавить в несколько кликов, а не наоборот, отковыривать от клиентской версии ненужный шлак...

    Единственная проблема, с которой я пока что столкнулся

    — запоротый драйвер I²C-периферии, так что не на все ноуты можно воткнуть сервер. Драйвер от 10ки удалось запихнуть, но стартовать он почему-то отказывается


  1. dscheg
    21.06.2023 09:43
    +1

    Кстати до недавнего времени Microsoft Remote Desktop App из Microsoft Store был уязвим к MitM (легко реализуется через https://github.com/GoSecure/pyrdp) при повторных подключениях к серверу с самоподписанным сертификатом без NLA из-за того, что при указании галки "Don't ask about this certificate again" сохранял в качестве идентификатора trusted сертификата его серийный номер, а не отпечаток.

    Ссылка на CVE: https://msrc.microsoft.com/update-guide/en-US/vulnerability/CVE-2023-28290

    Исправляли уязвимость полгода (зарепортил 2022-12-03, закрыта 2023-05-25). В какой-то момент после моего репорта на странице заметок о релизах https://aka.ms/rdwinupdates добавилась формулировка "We're no longer updating the Remote Desktop app for Windows with new features"


  1. aik
    21.06.2023 09:43

    Благодаря RDP, можно подключиться к другой системе и работать за ней словно за своим компьютером. То же самое делают, например, AnyDesk и TeamViewer, у которых протоколы схожей функциональности.

    Всё же не стоит сравнивать RDP со всякими там энидесками. Задачи у них разные. RDP — это удалённая работа в первую очередь, терминальный режим. А тимвьюверы — это удалённое управление, подключение к существующей сессии, проход NAT'а.


  1. theurus
    21.06.2023 09:43

    anydesk и teamviewer принципиально отличаются от rdp, работают совсем по другому. и открытые клоны (возможно не все) работают так же как anydesk и teamviewer, не используют главный козырь настоящего rdp - передачу изображения в виде векторов


    1. khajiit
      21.06.2023 09:43
      +1

      передачу изображения в виде векторов

      Не изображений в виде векторов, а GDI-примитивов, подобно тому как xpra или ssh -X пробрасывают отрисовку на клиента.
      И которую вам радостно поломают 1С, Autodesk, Adobe, 3DS, любой аудиоплеер или браузер, или даже штатный dwm.


      1. theurus
        21.06.2023 09:43

        браузер играющий ютуб не ломает. ААА игры тоже


        1. khajiit
          21.06.2023 09:43

          Потому что туда уже лет дохренадцать как впилили AVC с 4:2:2 и 4:4:4, гоняют по нему видеопоток.
          Передача примитивов осталась с классической темой XP.


  1. woozlix
    21.06.2023 09:43

    Однажды нехороший мамкин хакер зашел на мой виндоус сервер по RDP и украл около 100к рублей с аккаунта. Сервак был в одном из популярных хостингов и был защищен стандартным паролем. Может быть кому-то пригодится мой совет: максимально защищайте RDP-сервера


    1. domix32
      21.06.2023 09:43

      Дефолтные пароли нанесли ущерба заметно больше 100к. Да и в среднем надо всё защищать по максимуму, разве что кроме honeypot.


  1. domix32
    21.06.2023 09:43
    +1

    H.264

    А откуда дровишки? Насколько знаю там повсеместно используется хитрый вариант RLE.


  1. vit1252
    21.06.2023 09:43

    А зачем RDP использовать? В смешанных стеках одни проблемы. Может посмотреть в стороны VNC или какого-то другого открытого протокола?


  1. Iskatel_S
    21.06.2023 09:43

    Забыли упомянуть RDP-сервер, встроенный в гипервизор VirtualBox. Хотя конечно VNC в нём был бы уместнее.


  1. Tarakanator
    21.06.2023 09:43

    • Функция слежки за пользовательскими сессиями со стороны администратора возвращена обратно

    Это что за функция? rdp shadow? Так её нельзя использовать для этого на несерверной винде, или подразумевается какая-то другая функция?