Сейчас на форуме: tyns777 (+4 невидимых)

 eXeL@B —› Программирование —› Безопасное открытие дескриптора виртуального устройства
Посл.ответ Сообщение


Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 21 августа 2010 09:38
· Личное сообщение · #1

Добрый день, товарищи. Вопрос у меня такого характера: пишу свой драйвер, общающийся с приложением через DeviceIoControl. Но, начитавшись статей про эскалацию привилегий, понял, что давать возможность другим программкам из третьего кольца открывать моё устройство и передавать ему запросы - не есть хорошо. Т.е. нужно как-то сделать, чтоб лишь моя программулина могла получить доступ к символической ссылке, созданной в драйвере. Но при этом меня не устраивает возможность открытия только одного дескриптора одновременно. Побродив по просторам инета, на сайте Старфорса нашёл инфу о том, что у их собственного драйвера была та же проблема, и когда-то давно это смогли использовать - написали эксплоит для их дровины. Но потом они, якобы, стали использовать крипто с открытым ключом, и другие программы не могли получить доступ к их драйверу. Но или я не допёр, или они так туманно выразились, но что-то не пойму, как эта схема тут может работать? Даже если для шифрования запросов и используется открытый ключ, то внутри дров должен юзать закрытый, значит путём простого реверсинга можно выудить оба ключа. Или же всё-таки есть способ, кто что думает?

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 августа 2010 11:13
· Личное сообщение · #2

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




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 21 августа 2010 12:31
· Личное сообщение · #3

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

Можно и из ядра общаться, создать еще один драйвер и через него
открывать символьную ссылку через ZwDeviceIoControl()

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 августа 2010 13:09
· Личное сообщение · #4

Ты предлагаешь юзать 0дей сплоит для повышения привилегий из драйвера? Нужная штука.



Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 21 августа 2010 13:10
· Личное сообщение · #5

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

Пример установки атрибутов безопасности:
Code:
  1. int dc_set_default_security(HANDLE h_object)
  2. {
  3.          SID_IDENTIFIER_AUTHORITY autort = SECURITY_NT_AUTHORITY;
  4.          PSID                     adm_sid;
  5.          PSID                     sys_sid;
  6.          PACL                     sys_acl;
  7.          ULONG                    dacl_sz;
  8.          NTSTATUS                 status;
  9.          SECURITY_DESCRIPTOR      sc_desc;
  10.          int                      resl;
  11.  
  12.          adm_sid = NULL; sys_sid = NULL;
  13.          sys_acl = NULL;
  14.          do
  15.          {
  16.                  adm_sid = mm_alloc(RtlLengthRequiredSid(2), 0);
  17.                  sys_sid = mm_alloc(RtlLengthRequiredSid(1), 0);
  18.  
  19.                  if ( (adm_sid == NULL) || (sys_sid == NULL) ) {
  20.                         resl = ST_NOMEM; break;
  21.                  }
  22.  
  23.                  RtlInitializeSid(adm_sid, &autort, 2);
  24.                  RtlInitializeSid(sys_sid, &autort, 1);
  25.  
  26.                  RtlSubAuthoritySid(adm_sid, 0)[0] = SECURITY_BUILTIN_DOMAIN_RID;
  27.                  RtlSubAuthoritySid(adm_sid, 1)[0] = DOMAIN_ALIAS_RID_ADMINS;
  28.                  RtlSubAuthoritySid(sys_sid, 0)[0] = SECURITY_LOCAL_SYSTEM_RID;
  29.  
  30.                  dacl_sz = sizeof(ACL) + (2 * sizeof(ACCESS_ALLOWED_ACE)) +
  31.                         SeLengthSid(adm_sid) + SeLengthSid(sys_sid) + 8;
  32.                  
  33.                  if ( (sys_acl = mm_alloc(dacl_sz, 0)) == NULL) {
  34.                         resl = ST_NOMEM; break;
  35.                  }
  36.                  status = RtlCreateAcl(sys_acl, dacl_sz, ACL_REVISION);
  37.  
  38.                  if (NT_SUCCESS(status) == FALSE) {
  39.                         resl = ST_ERROR; break;
  40.                  }
  41.                  status = RtlAddAccessAllowedAce(
  42.                         sys_acl, ACL_REVISION, GENERIC_ALL, sys_sid);
  43.  
  44.                  if (NT_SUCCESS(status) == FALSE) {
  45.                         resl = ST_ERROR; break;
  46.                  }
  47.                  status = RtlAddAccessAllowedAce(
  48.                         sys_acl, ACL_REVISION, GENERIC_ALL, adm_sid);
  49.  
  50.                  if (NT_SUCCESS(status) == FALSE) {
  51.                         resl = ST_ERROR; break;
  52.                  }
  53.                  status = RtlCreateSecurityDescriptor(&sc_desc, SECURITY_DESCRIPTOR_REVISION1);
  54.  
  55.                  if (NT_SUCCESS(status) == FALSE) {
  56.                         resl = ST_ERROR; break;
  57.                  }
  58.                  status = RtlSetDaclSecurityDescriptor(&sc_desc, TRUE, sys_acl, FALSE);
  59.  
  60.                  if (NT_SUCCESS(status) == FALSE) {
  61.                         resl = ST_ERROR; break;
  62.                  }
  63.  
  64.                  status = ZwSetSecurityObject(h_object, DACL_SECURITY_INFORMATION, &sc_desc);
  65.  
  66.                  if (NT_SUCCESS(status) != FALSE) {
  67.                         resl = ST_OK;
  68.                  } else {
  69.                         resl = ST_ERROR;
  70.                  }
  71.          } while (0);
  72.  
  73.          if (sys_acl != NULL) { mm_free(sys_acl); }
  74.          if (adm_sid != NULL) { mm_free(adm_sid); }
  75.          if (sys_sid != NULL) { mm_free(sys_sid); }
  76.  
  77.          return resl;
  78. }


Если не нужна совместимость с Windows 2000, то всё упрощается, т.к. можно использовать IoCreateDeviceSecure

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 21 августа 2010 17:25
· Личное сообщение · #6

Как альтернативный способ, предлагаю просто pid процесса проверять. Не наш pid - ACCESS_DENIED.

-----
IZ.RU





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 августа 2010 17:42
· Личное сообщение · #7

И как ты узнаешь, ваш пид или нет, если общения никакого нет?




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 21 августа 2010 19:19 · Поправил: mak
· Личное сообщение · #8

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

А можно ссылку ? Тоже прочитать ..

Можно попробовать хучить иоконтролдевайс или IoValidateDeviceIoControlAccess

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 21 августа 2010 19:54
· Личное сообщение · #9

Archer пишет:
И как ты узнаешь, ваш пид или нет, если общения никакого нет?


Подумать и пореверсить нужно. Я уверен и чувствую, что небесперспективно решение....
Почему не PsGetCurrentProcessId?

-----
IZ.RU





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 августа 2010 20:03
· Личное сообщение · #10

Хотя бы потому, что ИД текущего процесса-это тот, кто к нему вообще ломится. А это кто угодно может быть. И весь этот способ-частный случай общего ключа.




Ранг: 355.4 (мудрец), 55thx
Активность: 0.320
Статус: Uploader
5KRT

Создано: 21 августа 2010 20:19
· Личное сообщение · #11

Самый лучший способ это тот что ntldr предложил - через установку аттрибутов безопасности

-----
Gutta cavat lapidem. Feci, quod potui. Faciant meliora potentes





Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 21 августа 2010 21:55
· Личное сообщение · #12

Archer пишет:
это тот, кто к нему вообще ломится

Процесс, регистрирующий сервис и/или запускающий его, ведь никто угодно, верно?

-----
IZ.RU





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 21 августа 2010 21:58
· Личное сообщение · #13

Да неверно. Никто не мешает запустить сервис любому. К тому же при запуске пид не виден, запуск дрова в контексте систем происходит. Да и вообще у него модель злоумышленника другая, по-моему.
В общем, предлагаю окончить гадания и подождать автора.




Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 25 августа 2010 15:42
· Личное сообщение · #14

Coderess пишет:
Самый лучший способ это тот что ntldr предложил - через установку аттрибутов безопасности

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

-----
Stuck to the plan, always think that we would stand up, never ran.





Ранг: 2014.5 (!!!!), 1278thx
Активность: 1.340.25
Статус: Модератор
retired

Создано: 25 августа 2010 16:38
· Личное сообщение · #15

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




Ранг: 673.3 (! !), 400thx
Активность: 0.40.31
Статус: Участник
CyberMonk

Создано: 25 августа 2010 17:53
· Личное сообщение · #16

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

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

А вообще верно =) Модель злоумышлинника оч важна , так не знаешь что писать и только тупишь

-----
RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube




Ранг: 369.8 (мудрец), 400thx
Активность: 0.390
Статус: Участник

Создано: 26 августа 2010 01:20
· Личное сообщение · #17

ARCHANGEL пишет:
Получается, что кроме админа, никто не может открыть.

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

ARCHANGEL пишет:
Но если зловредный код запустился с привилегиями администратора

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

-----
PGP key <0x1B6A24550F33E44A>





Ранг: 681.5 (! !), 405thx
Активность: 0.420.21
Статус: Участник
ALIEN Hack Team

Создано: 26 августа 2010 12:10
· Личное сообщение · #18

mak
На офф сайте этой FrontLine Secure где-то видел интервью, посвящённое конкретно Старфорсу как защите. Там как раз упоминалось об этом. Точную ссылку дать не могу, т.к. сам не помню, где конкретно нашёл это.

ntldr
Спасибо, всё понял. ))

За сим тему закрываю.

-----
Stuck to the plan, always think that we would stand up, never ran.



 eXeL@B —› Программирование —› Безопасное открытие дескриптора виртуального устройства
Эта тема закрыта. Ответы больше не принимаются.
   Для печати Для печати