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

 eXeL@B —› Основной форум —› C# обфускация и хранние секретных данных
Посл.ответ Сообщение

Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 17 апреля 2007 14:33
· Личное сообщение · #1

помогите пожалуйста разобраться...
я пишу свое приложение(на C#), которое функционирует в виде слубы windows с правами SYSTEM. Само приложение ничего особенного не делает... кроме как подгружает dll, которые приходят по сетке в зашифрованном виде. Оно их расшифровывает на своем private ключе... у приложения есть сертификат(который лежит в хранилище windows) и передает управление туда...
Полный алгорит работы такой:
1. принять зишифрованный и подписанный xml
2. проверить подпись сервера
3. расшифровать
4. загрузить dll
5. запустить метод run()

Соответственно возникают две проблемы:
1. Как защититься от загрузки чужих dll и их выполнения с правами SYSTEM... их код может быть вредоносным.
В данном примере такой защиты нет. В самом приложении я беру из хранилища windows сертификат сервера по серийному номеру(это для проверки подписи). Простым дизассемблированием и изменением этого номера я добиваюсь того, что вытаскивается сертификат лжесервера и сообщение от лжесервера проходит верификацию подписи. Public моего приложения открыт и, следовательно, я смогу зашифровать хакерскую dll и тогда мое приложение ее благополучно расшифрует...а затем запустит под system.

2. Насколько я понял существет всего несколько способов взаимодействия из ПО с собственными сертификатами. Использование pfx файла для хранения private ключа и использование хранилища windows.
В первом случае возможно унести сертификат домой и там пытаться подобрать пароль к pfx перебором.
Да и в самой программе зашит код... простым реверсом его можно выдернуть. Во втором случае - кладем в хранилище и запрещаем export private ключа. Т..о. за секретный ключ теперь отвечает винда. Тогда при работе приложения с сертификатом можно либо запрашивать пароль(сама система это делает), либо разрешение(подтверждение), либо ничего. В случае сервиса остается вариант не использовать ничего, чтобы не вылетали постоянно окна. Но тогда любое приложение сможет на этом компютере сможет подписать сообщение ключом из этого сертификата. А такое тоже не очень хорошо.
Есть ли какие-нибудь другие варианты хранения своего закрытого ключа?

Как вариант затруднения анализа кода можно применить обфускатор... но только судя по статье "реверсинг .net приложений .." это не очень-то и поможет....



Ранг: 1.2 (гость)
Активность: 0=0
Статус: Участник

Создано: 17 апреля 2007 19:00
· Личное сообщение · #2

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



Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 17 апреля 2007 22:07
· Личное сообщение · #3

Спасибо baranovskiyne.
Как раз сейчас читаю про домены приложения. Как только появится что-то рабочее... представлю на суд
Если у кого будут еще идеи - пишите.



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 20 апреля 2007 06:02 · Поправил: S_T_A_S_
· Личное сообщение · #4

Не уверен что правильно понял, что нужно, но если ты хочешь разрешить выполнение только своих dll, то необходимо и достаточно либо подписать их, либо пошифровать любым стойким алго. Если у злоумышленника есть возможность получить приложение для анализа (а стало быть и ключ расшифровки), алгоритм должен быть ассиметричным - ты шифруешь приватным ключем, а расшифровка идёт публичным. Приватный ключ, разумеется, должен храниться у тебя в сухом и прохладном месте, а не в каком-то там хранилище юзера.



Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 20 апреля 2007 12:18
· Личное сообщение · #5

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


Да... мне надо именно разрешить выполнение только своих DLL. У злоумышленника есть возможность получить приложение для анализа. Тогда шифрую приватным, а расшифровываю публичным. Согласен.
Только я вот не совсем до конца понимаю механизм. Предположим я зашифровал свою dll используя закрытый ключ. Открытый я беру на стороне клиента из сертификата(сам сертификат могу хоть в хранилище, хоть куда положить). Вопрос в том, что мешает злоумышленнику подменить в программе несколько строк так, чтобы расшифровка велась на его открытом ключе. А зашифрует он свою враждебную dll на своем закрытом ключе. И тогда все замечательно расшифруется и запустится.
Или я где-то не прав?



Ранг: 20.8 (новичок)
Активность: 0.010
Статус: Участник

Создано: 20 апреля 2007 12:35
· Личное сообщение · #6

d4u пишет:
И тогда все замечательно расшифруется и запустится.

Весь вопрос где запустится. Если у злоумышленника на его компе, так наплевать. А если предположить, что злоумышленник взломал комп, где находится эта система и имеет права, чтобы её изменить (я понял права админа) тогда он и так может делать, чего хочет и без использования удалённой вредоносной DLL.



Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 20 апреля 2007 20:46
· Личное сообщение · #7

Все...понял... согласен со S_T_A_S_ и Player. От загрузки чужеродных dll можно защититься зашифровав их ассиметричным алгоритмом. Спасибо!
Остается открытым второй вопрос: можно ли сделать так, чтобы закрытым ключом сертификата x509 пользовалось только мое приложение-сервис... т.е. чтобы нельзя было подделать подпись.



Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 20 апреля 2007 21:05
· Личное сообщение · #8

Кстати говоря, если код присланной dll идет от сервера зашифрованным на симметричном сессионном ключе и само сообщение сервера подписано сервером... то уже без риверсинга клиентского приложения-сервиса для загрузки вредоносной dll не обойтись... т.е. получается, что уже защищено?



Ранг: 29.0 (посетитель)
Активность: 0.010
Статус: Участник

Создано: 21 апреля 2007 01:05
· Личное сообщение · #9

наверное, особенно если передача данных тоже шифруется, причем ключем согласуемым при начале передачи.



Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 21 апреля 2007 15:02
· Личное сообщение · #10

Ну да... алгоритм примерно такой: сервер генерирует сессионный ключ и шифрует его на паблик ключе клиентского приложения. Затем пересылает ему и далее траффик шифруется на этом ключе симметричным алгоритмом... хотелось сначал сделать получение сессионного ключа по Диффи-Хеллману, но дело в том, что не срастаются реализации на C# и JAVA, а свое придумывать не очень хотелось
Здесь опять же косяк возникает... любое приложение на этом компе может расшифровать сообщение сервера и выступить посредником.... ибо доступ к private ключу (из сертификата) я не могу закрыть, потому что неудобно запрашивать пароль для доступа, как я и писал выше.



Ранг: 163.7 (ветеран)
Активность: 0.070
Статус: Участник

Создано: 22 апреля 2007 08:15
· Личное сообщение · #11

Дык если клиент коннектится только к твоему серверу, откуда может взяться левая dll?



Ранг: 16.0 (новичок)
Активность: 0=0
Статус: Участник

Создано: 22 апреля 2007 12:22
· Личное сообщение · #12

я сам запутался)
Чужую длл никак не сунуть в существующей схеме. Мой первый пост был уже ошибочным. Спасибо, что помогли разобраться.


 eXeL@B —› Основной форум —› C# обфускация и хранние секретных данных
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати