Скачать презентацию Задачу конфиденциальных вычислений которая решается посредством многостороннего интерактивного Скачать презентацию Задачу конфиденциальных вычислений которая решается посредством многостороннего интерактивного

доклад. Багина АВ.pptx

  • Количество слайдов: 27

Задачу конфиденциальных вычислений, которая решается посредством многостороннего интерактивного протокола можно описать в следующей постановке. Задачу конфиденциальных вычислений, которая решается посредством многостороннего интерактивного протокола можно описать в следующей постановке. Имеется n участников протокола или n процессоров вычислительной системы, соединенных сетью связи. Изначально каждому процессору известна своя "часть" некоторого входного значения x. Требуется вычислить f(x), f некоторая известная всем участникам вычислимая функция, таким образом, чтобы выполнились следующие требования: корректности конфиденциальности

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

 Обеспечение безопасности вычислений в автоматизированных системах(большинство ЭВМ, военная техника, промышленные установки, космическая отрасль). Обеспечение безопасности вычислений в автоматизированных системах(большинство ЭВМ, военная техника, промышленные установки, космическая отрасль). Выпуск носителей с лицензионной информацией, защищенной авторскими правами(борьба с пиратством).

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

 Основой ключей Sense. Lock служит микропроцессор, построенный на базе многослойного высокозащищенного ядра компании Основой ключей Sense. Lock служит микропроцессор, построенный на базе многослойного высокозащищенного ядра компании Philips, используемого при производстве современных банковских смарт-карт, имеющий сертификат безопасности EAL 5+.

 Процессор имеет внутри себя все необходимые компоненты, такие как: встроенный USB интерфейс; EEPROM Процессор имеет внутри себя все необходимые компоненты, такие как: встроенный USB интерфейс; EEPROM емкостью от 32 до 64 килобайт памяти; RAM; ROM (c операционной системой ключа); Математический сопроцессор; Средства противодействия физическому взлому; Встроенный тактовый генератор.

 Память ключа выполнена в виде файловой системы, работающей с папками и файлами. Сами Память ключа выполнена в виде файловой системы, работающей с папками и файлами. Сами файлы могут быть трех видов: исполняемый модуль (часть программы перенесенной в ключ); файл данных; файл с ключами RSA. Каталоги файловой системы защищены специальным PIN кодом для контроля доступа к ним.

 Основные возможности Возможность выполнения внутри электронного ключа программ, написанных на стандартном языке Основные возможности Возможность выполнения внутри электронного ключа программ, написанных на стандартном языке "Си". Встроенные в электронный ключ аппаратные алгоритмы шифрования RSA-1024, DES, Triple. DES, а также алгоритм хэширования данных SHA-1. Возможность работы в режиме HID-устройства без использования каких-либо дополнительных драйверов. Встроенные часы реального времени (модели Sense. Lock ELRTC и Sense. Lock EL-NET RTC) могут быть использованы для ограничения времени работы программы. Таймер не может быть изменен и надежно защищен от любых (программных и аппаратных) попыток воздействия на него. Самостоятельная установка разработчиком числа пользователей (от 1 до 255) в сетевых версиях электронного ключа (модели Sense. Lock EL-NET RTC) без какой-либо дополнительной оплаты.

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

 Противодействие физическому взлому, кристалла спроектированного изготовителем: Детекторы пониженного и повышенного напряжения питания, тактовой Противодействие физическому взлому, кристалла спроектированного изготовителем: Детекторы пониженного и повышенного напряжения питания, тактовой частоты, температуры; Самотестирование топологии кристалла; Очистка RAM при сбросе или срабатывании детекторов; Защита от высокочастотных помех; Генератор случайных тактов ожидания; Шифрование внутренних шин; Прозрачное шифрование RAM, ROM, EEPROM; Аппаратная защита чтения областей ROM, EEPROM, РRОM; Защита от использования в нештатных режимах работы; Шифрование или скремблирование внутренних RAM и EEPROM.

 HASP - мультиплатформенная аппаратнопрограммная система защиты программ и данных от нелегального использования и HASP - мультиплатформенная аппаратнопрограммная система защиты программ и данных от нелегального использования и несанкционированного распространения, разработанная компанией Aladdin Knowledge Systems Ltd. Основой ключей HASP является специализированная заказная микросхема - ASIC (Application Specific Integrated Circuit), имеющая уникальный для каждого ключа алгоритм работы.

 электронный ключ HASP; специальное программное обеспечение для «привязки» к электронному ключу, защиты приложений электронный ключ HASP; специальное программное обеспечение для «привязки» к электронному ключу, защиты приложений и для кодирования данных; схемы и методы защиты программ и данных, обнаружения и борьбы с отладчиками, контроля целостности программного кода и данных.

Запрос Обработка Программа Ответ Принцип защиты состоит в том, что в процессе выполнения защищённая Запрос Обработка Программа Ответ Принцип защиты состоит в том, что в процессе выполнения защищённая программа опрашивает подключённый к компьютеру ключ HASP.

 Существуют средства обхода аппаратной защиты — битхак (например Sable) или программное эмулирование как Существуют средства обхода аппаратной защиты — битхак (например Sable) или программное эмулирование как самого ключа, так и, например, USB-шины с виртуальным ключом.

Hasp Emulator PE Программа снятия дампа Обработка Программа восстановления Программа С программной начинки ключа Hasp Emulator PE Программа снятия дампа Обработка Программа восстановления Программа С программной начинки ключа снимается дамп, который потом используется для симуляции присутствия.

 Фрагмент кода функции, устанавливающей ловушку: NTSTATUS Hook. Device(LPWSTR lp. Device) UNICODE_STRING Device. Name; Фрагмент кода функции, устанавливающей ловушку: NTSTATUS Hook. Device(LPWSTR lp. Device) UNICODE_STRING Device. Name; PDEVICE_OBJECT Device. Object; PFILE_OBJECT File. Object; Rtl. Init. Unicode. String(&Device. Name, lp. Device); Io. Get. Device. Object. Pointer(&Device. Name, 1 u, &File. Object, &Device. Object); Заменим адреса обработчиков и функций выгрузки драйвера на свои: NTSTATUS Hook. Device(LPWSTR lp. Device) g. Driver. Object = Device. Object-> Driver. Object; g. Device. Control = g. Driver. Object-> Major. Function[IRP_MJ_DEVICE_CONTROL]; g. Driver. Object-> Major. Function[IRP_MJ_DEVICE_CONTROL] = Hook. Dispatch; g. Internal. Device. Control = g. Driver. Object-> Major. Function[IRP_MJ_INTERNAL_DEVICE_CONTROL]; g. Driver. Object-> Major. Function[IRP_MJ_INTERNAL_DEVICE_CONTROL] = Hook. Dispatch; g. Driver. Unload = g. Driver. Object->Driver. Unload; g. Driver. Object->Driver. Unload = Hook. Unload; Obf. Dereference. Object(File. Object); Чтобы снять ловушку, нужно просто восстановить прежние обработчики IRP-пакетов: void Unhook. Device(void) g. Driver. Object-> Major. Function[IRP_MJ_DEVICE_CONTROL] = g. Device. Control; g. Driver. Object-> Major. Function[IRP_MJ_INTERNAL_DEVICE_CONTROL] = g. Internal. Device. Control; g. Driver. Object->Driver. Unload = g. Driver. Unload; Реализуем правильную выгрузку драйверов. void Hook. Unload(PDRIVER_OBJECT Drv. Obj) Unhook. Device(); g. Driver. Unload(Drv. Obj);

 Создадим объект драйвера, который содержит символьное имя (например Dos. DevicesHook) и точки входа Создадим объект драйвера, который содержит символьное имя (например Dos. DevicesHook) и точки входа CREATE, CLOSE, READ. Io. Create. Device(Driver. Object, 0, &us. Device. Name, FILE_DEVICE_NULL, 0, 0, &p. Device. Object); Io. Create. Symbolic. Link(&us. Symbolic. Device. Name, &us. Device. Name); Driver. Object->Major. Function[IRP_MJ_CREATE] = Driver. Dispatch; Driver. Object->Major. Function[IRP_MJ_CLOSE] = Driver. Dispatch; Driver. Object->Major. Function[IRP_MJ_READ] = Driver. Dispatch; Driver. Object->Driver. Unload = Driver. Unload; Код Hook. Dispatch if (idl. Tail->Irp. Data. Input. Length) { idl. Tail->Input. Buffer = Ex. Allocate. Pool(Non. Paged. Pool, idl. Tail->Irp. Data. Input. Length); Rtl. Copy. Memory(idl. Tail->Input. Buffer, Irp->Associated. Irp. System. Buffer, idl. Tail->Irp. Data. Input. Length); } if (Io. SL->Major. Function == IRP_MJ_DEVICE_CONTROL) Status = p. Hooked. Driver. Dispatch[IRP_MJ_DEVICE_CONTROL]( Device. Object, Irp); if (idl. Tail->Irp. Data. Output. Length) { idl. Tail->Output. Buffer = Ex. Allocate. Pool(Non. Paged. Pool, idl. Tail-> Irp. Data. Output. Length); Rtl. Copy. Memory(idl. Tail->Output. Buffer, lp. Buffer, idl. Tail->Irp. Data. Output. Length); } Осталось реализовать чтение из драйвера. Так как пакет содержит буферы, чье содержимое представляет интерес, то размер сообщений заранее не известен. Поэтому поступим следующим образом: при первом чтении получаем общую информацию о пакете и размере буферов; при повторном читаем содержимое, удаляем звено из списка пакетов и не забываем про спиновые блокировки для последовательной работы с данными: Код Driver. Dispatch Length = Io. SL->Parameters. Read. Length; if (Length == sizeof(IRP_DATA) && idl. Head) Rtl. Copy. Memory(Irp->User. Buffer, &idl. Head->Irp. Data, Length); else if (idl. Head && Length == (idl. Head-> Irp. Data. Input. Length + idl. Head-> Irp. Data. Output. Length)) { Rtl. Copy. Memory(Irp->User. Buffer, idl. Head-> Input. Buffer, idl. Head->Irp. Data. Input. Length); Rtl. Copy. Memory((PVOID)((ULONG)Irp->User. Buffer + idl. Head->Irp. Data. Input. Length), idl. Head-> Output. Buffer, idl. Head->Irp. Data. Output. Length); } else if (Length == 1 && idl. Head) { if (idl. Head->Input. Buffer) Ex. Free. Pool(idl. Head->Input. Buffer); if (idl. Head->Output. Buffer) Ex. Free. Pool(idl. Head->Output. Buffer); } idl. Temp = idl. Head->ldl. Next; Ex. Free. Pool(idl. Head); idl. Head = idl. Temp; if (!idl. Temp) idl. Tail = NULL;

Брутфорс(полный перебор): unsigned short Key; unsigned char Ref. Key[8], Ver. Key[8]; for (Key = Брутфорс(полный перебор): unsigned short Key; unsigned char Ref. Key[8], Ver. Key[8]; for (Key = 0; Key <= 0 x 7 fff, Key++) { if (!HL_LOGIN(Key, 1, Ref. Key, Ver. Key)) { HL_LOGOUT(); Break; } } return Key; Прототипы функций HL_LOGIN, HL_LOGOUT: WORD HL_LOGIN(WORD Mod. Ad, Word Access, Byte *Ref. Key, Byt *Ver. Key); WORD HL_LOGOUT(void);

 Логика перехватчика будет иметь такой вид: NTSTATUS Hook. Dispatch(): PIO_STACK_LOCATION Stack = Irp-> Логика перехватчика будет иметь такой вид: NTSTATUS Hook. Dispatch(): PIO_STACK_LOCATION Stack = Irp-> Tail. Overlay. Current. Stack. Location; ULONG Io. Control. Code; if (Stack->Major. Function == 14) { Io. Control. Code = Stack. Device. Io. Control. Code; If (Io. Control. Code != 0 x 9 c 402458) { Return g. Device. Control(Device. Object, Irp); } else { Encrypt(Irp->Associated. Irp. System. Buffer); Crypt(Irp->Associated. Irp. System. Buffer, Key, Dump. Memory); } } Return STATUS_FAILED; Код Encrypt() - первичный алгоритм шифрования пакета: void Encrypt(BYTE * Buffer) { WORD Seed = *((WORD*)Buffer + 0 x 5 e); WORD Ver = *((WORD*)Buffer + 0 xba); if (Ver) { for (int i = 0; i < 0 x. B 9; i++) { *(WORD*)(Buffer + i) += Seed; Seed = (Seed >> 15) | (Seed << 1); Seed -= *(WORD*)(Buffer + i) ^ i; } for (int i = 0 x. BE; i < 0 x. FF; i++) { *(WORD*)(Buffer + i) -= Seed; Seed = (Seed >> 15) | (Seed << 1); Seed += *(WORD*)(Buffer + i) ^ i; } *((WORD*)Buffer + 0 xba) = Seed; } }

 Код Decrypt() - алгоритм дешифрования: void Decrypt(BYTE* Buffer) { WORD Seed = *((WORD*)Buffer Код Decrypt() - алгоритм дешифрования: void Decrypt(BYTE* Buffer) { WORD Seed = *((WORD*)Buffer + 0 x 5 e); WORD Ver = *((WORD*)Buffer + 0 xba); if (Ver) { for (int i = 0 x. FE; i > 0 x. BD; i--) { Seed -= *(WORD*)(Buffer + i) ^ i; Seed = (Seed << 15) | (Seed >> 1); *(WORD*)(Buffer + i) += Seed; } for (int i = 0 x. B 8; i >= 0; i--) { Seed += *(WORD*)(Buffer + i) ^ i; Seed = (Seed << 15) | (Seed >> 1); *(WORD*)(Buffer + i) -= Seed; } *((WORD*)Buffer + 0 xba) = Seed; } }

http: //open-security. org/bezopasnostj_po_ks/ http: //senselock. ru http: //softwaresecurity. org/forum http: //www. xakep. ru/post/57901/ http: //open-security. org/bezopasnostj_po_ks/ http: //senselock. ru http: //softwaresecurity. org/forum http: //www. xakep. ru/post/57901/