Как бороться

Тема в разделе "WASM.NT.KERNEL", создана пользователем XshStasX, 25 янв 2012.

  1. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    Допустим есть приложение которому нужно передать данные в драйвер (данных много например 100-200кб) .
    Приложение передает драйверу указатель на данные драйвер проверяет валидность указателя и копирует память себе в пул.
    Казалось бы все хорошо, но это пока один поток есть.

    Примерный код драйвера
    Код (Text):
    1. {
    2.   ProbeForRead(InBuffer,size,1);
    3.   RtlCopyMemory(&data,ptn->InBuffer,sizeof(data));
    4. }
    Допустим проверка валидности памяти прошла успешно и в этот момент произошло прерывание, и планировщик потоков сменил активный поток.
    А другой поток взял и освободил память InBuffer.
    Получается после получения управления снова поток получит исключение и слетит система.

    Как бороться с подобной проблемой?
    Блокировать все остальные процессоры и повышать свой irql ?
     
  2. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    XshStasX
    Для того, чтобы не слетала, нужно обработчик исключения ставить, т.е. обрамлять в __try/__except весь доступ к памяти, включая ProbeForRead. А вообще для одноразовой передачи 100-200кб совсем не обязательно работать напрямую с пользовательским буфером, вполне можно и direct I/O, и даже buffered I/O использовать. Я для одноразовых передач по 16Мб buffered I/O использовал. Передача 100-200кб/с — это уже другое дело.

    P.S. Тему как-нибудь по-умнее нельзя было назвать? Мне при виде названия Гамлет вспомнился, а не методы передачи данных в ядро.
     
  3. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    Этот код уязвим к рк атаке.
     
  4. XshStasX

    XshStasX New Member

    Публикаций:
    0
    Регистрация:
    9 авг 2008
    Сообщения:
    991
    kejcerfcrv
    И как построить код чтоб он не был уязвим?
     
  5. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    XshStasX
    А вот это не скажу. Какой смысл говорить то, с чем придётся бороться в будущем ?
     
  6. 100500

    100500 New Member

    Публикаций:
    0
    Регистрация:
    11 янв 2012
    Сообщения:
    10
    А может быть такое что пока напервом процессоре выполняется чтение из памяти.
    На втором процессоре происходит освобождение этой памяти.
    И что будет в таком случаи ?
    префикс lock поможет ?
    kejcerfcrv
    достаточно отключить отключить доставку АРС ?
     
  7. kejcerfcrv

    kejcerfcrv New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2011
    Сообщения:
    320
    100500
    Память с апк не связана, аллокация по отношению к данной проверке асинхронна. Если выполнять код в двух потоках, в одном проверку выше, в другом освобождение и аллокацию памяти, то на некоторой итерации поток успешно пройдёт проверку, но окажется далее что память не доступна.
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    Т.С. Смотри в сторону Лока памяти или копирования в SEH блоке.

    kejcerfcrv
    Как синхроницировать время? то и есть выполнить атаку. И так дано
    Есть уязвимая функция которая делает проверку ,а после глупо пологает что память останется валидной.

    Пример
    void Func( LPVOID lpMemory, DWORD dwSize )
    {
    if ( lpMemory )
    {
    ProbeForRead(lpMemory);
    CopyMemory(g_GlobalMemory, lpMemory, dwSize); // Как узнать что поток находится на этом этапе? ( код в драйвере)
    }
    }