Сейчас на форуме: _MBK_ (+6 невидимых) |
eXeL@B —› Основной форум —› C# обфускация и хранние секретных данных |
Посл.ответ | Сообщение |
|
Создано: 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 приложений .." это не очень-то и поможет.... |
|
Создано: 17 апреля 2007 19:00 · Личное сообщение · #2 |
|
Создано: 17 апреля 2007 22:07 · Личное сообщение · #3 |
|
Создано: 20 апреля 2007 06:02 · Поправил: S_T_A_S_ · Личное сообщение · #4 Не уверен что правильно понял, что нужно, но если ты хочешь разрешить выполнение только своих dll, то необходимо и достаточно либо подписать их, либо пошифровать любым стойким алго. Если у злоумышленника есть возможность получить приложение для анализа (а стало быть и ключ расшифровки), алгоритм должен быть ассиметричным - ты шифруешь приватным ключем, а расшифровка идёт публичным. Приватный ключ, разумеется, должен храниться у тебя в сухом и прохладном месте, а не в каком-то там хранилище юзера. |
|
Создано: 20 апреля 2007 12:18 · Личное сообщение · #5 S_T_A_S_ пишет: Не уверен что правильно понял, что нужно, но если ты хочешь разрешить выполнение только своих dll, то необходимо и достаточно либо подписать их, либо пошифровать любым стойким алго. Да... мне надо именно разрешить выполнение только своих DLL. У злоумышленника есть возможность получить приложение для анализа. Тогда шифрую приватным, а расшифровываю публичным. Согласен. Только я вот не совсем до конца понимаю механизм. Предположим я зашифровал свою dll используя закрытый ключ. Открытый я беру на стороне клиента из сертификата(сам сертификат могу хоть в хранилище, хоть куда положить). Вопрос в том, что мешает злоумышленнику подменить в программе несколько строк так, чтобы расшифровка велась на его открытом ключе. А зашифрует он свою враждебную dll на своем закрытом ключе. И тогда все замечательно расшифруется и запустится. Или я где-то не прав? |
|
Создано: 20 апреля 2007 12:35 · Личное сообщение · #6 d4u пишет: И тогда все замечательно расшифруется и запустится. Весь вопрос где запустится. Если у злоумышленника на его компе, так наплевать. А если предположить, что злоумышленник взломал комп, где находится эта система и имеет права, чтобы её изменить (я понял права админа) тогда он и так может делать, чего хочет и без использования удалённой вредоносной DLL. |
|
Создано: 20 апреля 2007 20:46 · Личное сообщение · #7 Все...понял... согласен со S_T_A_S_ и Player. От загрузки чужеродных dll можно защититься зашифровав их ассиметричным алгоритмом. Спасибо! Остается открытым второй вопрос: можно ли сделать так, чтобы закрытым ключом сертификата x509 пользовалось только мое приложение-сервис... т.е. чтобы нельзя было подделать подпись. |
|
Создано: 20 апреля 2007 21:05 · Личное сообщение · #8 |
|
Создано: 21 апреля 2007 01:05 · Личное сообщение · #9 |
|
Создано: 21 апреля 2007 15:02 · Личное сообщение · #10 Ну да... алгоритм примерно такой: сервер генерирует сессионный ключ и шифрует его на паблик ключе клиентского приложения. Затем пересылает ему и далее траффик шифруется на этом ключе симметричным алгоритмом... хотелось сначал сделать получение сессионного ключа по Диффи-Хеллману, но дело в том, что не срастаются реализации на C# и JAVA, а свое придумывать не очень хотелось Здесь опять же косяк возникает... любое приложение на этом компе может расшифровать сообщение сервера и выступить посредником.... ибо доступ к private ключу (из сертификата) я не могу закрыть, потому что неудобно запрашивать пароль для доступа, как я и писал выше. |
|
Создано: 22 апреля 2007 08:15 · Личное сообщение · #11 |
|
Создано: 22 апреля 2007 12:22 · Личное сообщение · #12 |
eXeL@B —› Основной форум —› C# обфускация и хранние секретных данных |