![]() |
eXeL@B —› Программирование —› Идентификация "своей" DLL, и загрузка DLL из памяти. |
. 1 . 2 . >> |
Посл.ответ | Сообщение |
|
Создано: 20 декабря 2009 23:12 · Личное сообщение · #1 Приветствую! У меня есть два странных вопроса: 1. Есль некий софт, который использует плагины в DLL. Нужно как-то отличать "свои" плагины от "чужих". Если ли какие-нибудь варианты, но так, чтобы эту проверку нельзя было обойти? Мне в голову приходит только один: шифровать библиотеку по алгоритму RSA и в проге расшифровывать и загружать из памяти. Тогда никто левый не сможет зашифровать DLL, потому что не будет знать ключ. В связи с этим второй вопрос: 2. Киньте плиз в меня статьей или тутором как загрузить DLL из образа в памяти. Пояснение (знаю что тут не любят такие темы:s5 ![]() - Это НЕ троян, и НЕ малварь. - Это НЕ прот или что-то подобное. - Прога совершенно бесплатна для конечного пользователя. Для чего вводится такое ограничение: Прога работает с личными данными пользователей, и мне очень не хочется чтобы пользователь скачал где-то в инете плагин хакера Васи, который уведет у него все пароли. Потому что в этом случае виноват окажется все равно разработчик)) ![]() |
|
Создано: 20 декабря 2009 23:37 · Личное сообщение · #2 |
|
Создано: 20 декабря 2009 23:58 · Личное сообщение · #3 |
|
Создано: 21 декабря 2009 00:01 · Личное сообщение · #4 |
|
Создано: 21 декабря 2009 00:51 · Поправил: Azur1d · Личное сообщение · #5 Kalmar пишет: Подпишите "свои" плагины цифровой подписью и проверяйте её на валидность. [wl] пишет: просто подписана? Спасибо, я думал над этим, но в этом случае достоточно будет поправить один джамп в проге и она начнет хавать любые плагины. [wl] пишет: длл должна быть зашифрована Это как вариант, просто мне в голову не пришли другие методы, отвечающие заданным требованиям. n0name пишет: а сохранить расшифрованную версию в temp нельзя? Не вариант, потому что тогда можно будет подсунуть в темп любой плаг. ![]() |
|
Создано: 21 декабря 2009 01:02 · Личное сообщение · #6 Azur1d пишет: Спасибо, я думал над этим, но в этом случае достоточно будет поправить один джамп в проге и она начнет хавать любые плагины. Если по условиям задачи требуется защита от вредоносного ПО работающего на одном уровне привилегий с тобой, то задача не имеет решения. Как вам уже сказали, для гарантии аутентичности плугинов их нужно подписывать ЭЦП. А распаковывать перед загрузкой следует туда, куда атакующий не имеет доступа. Если таких мест нет, то увы, ничего нельзя сделать. Чтобы знать что и как делать, сначала составьте модель угроз. Т.е. опишите формальным языком что и от кого вы хотите защищать, какими возможностями может обладать атакующий, и.т.п. Без этого вам врядли посоветуют что-то дельное. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 01:10 · Поправил: Azur1d · Личное сообщение · #7 ntldr пишет: Если по условиям задачи требуется защита от вредоносного ПО работающего на одном уровне привилегий с тобой, то задача не имеет решения. Дык ежу понятно что идеальных защит не бывает, но можно ведь сделать так чтобы злоумышленник поимел максимальное количество гемора))) ntldr пишет: для гарантии аутентичности плугинов их нужно подписывать ЭЦП То что я предлагаю, и есть своеобразная подпись, только шифруется не хэш, а весь плаг. Если использовать "классическую" подпись, то где-то в теле программы все равно останется один джамп после проверки подписи, поправив который атакующий получит возмжность загрузить плаг с левой подписью. Если использовать мой вариант, то даже после патча приложение просто рухнет при попытке выполнить мусор из покриптованной DLL. ntldr пишет: А распаковывать перед загрузкой следует туда, куда атакующий не имеет доступа. Если таких мест нет, то увы, ничего нельзя сделать. Лично я в винде таких мест не знаю, а вы? ![]() |
|
Создано: 21 декабря 2009 01:17 · Личное сообщение · #8 Azur1d пишет: Дык ежу понятно что идеальных защит не бывает, но можно ведь сделать так чтобы злоумышленник поимел максимальное количество гемора))) Я считаю что программа должна делать то, что она должна делать. Если она не позиционируется как замена системы безопасности ОС, то гемор поимеете только вы и ваши пользователи. Кому надо - тот всёравно взломает. Azur1d пишет: То что я предлагаю, и есть своеобразная подпись, только шифруется не хэш, а весь плаг. Весь плаг шифруется RSA? В таком случае поздравляю, вы допустили фатальную ошибку в применении этого алгоритма, и ваш секретный ключ легко вычисляется по публичному ключу и шифртексту. Чтобы писать самому реализацию какой-либо криптографии, особенно асиммитричной, нужно идеально знать её матчасть. Не знаете матчасти - используйте распространенную библиотеку, или на худой конец CryptoAPI. Azur1d пишет: Если использовать "классическую" подпись, то где-то в теле программы все равно останется один джамп после проверки подписи, поправив который атакующий получит возмжность загрузить плаг с левой подписью. Повторяю: если атакующий может модифицировать код вашей программы, то сливай воду и суши вёсла. Он может просто вырезать нахрен всю криптографию и загрузить обычную DLL. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 01:19 · Личное сообщение · #9 Azur1d пишет: Лично я в винде таких мест не знаю, а вы? Всё что в пределах %HOMEPATH% доступно только текущему пользователю, и ещё администраторам. Но если ваш враг администратор, то увы, вы заранее проиграли. К тому-же я не услышал от чего именно вы хотите защититься. Если постановка задачи стоит как "хочу чтобы никто, даже администратор, не мог прицепить к моему процессу свою DLL", то учтите что атакующему достаточно кинуть в папку с вашей программой DLL с именем одной из системных, и система её загрузит до исполнения вашего кода. С этим вы ничего не можете поделать. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 01:23 · Личное сообщение · #10 ntldr, спасибо за советы! ntldr пишет: Весь плаг шифруется RSA? В таком случае поздравляю, вы допустили фатальную ошибку в применении этого алгоритма, и ваш секретный ключ легко вычисляется по публичному ключу и шифртексту. Тогда так: плагин не шифруется, прога его загружает, забирает из него некий хедер, расшифровывает его, из него извлекает симметричный ключ и им расшифровывает код. ntldr пишет: Он может просто вырезать нахрен всю криптографию и загрузить обычную DLL. Может конечно, но тогда перестанут работать нормальные плаги и пользователь это заметит. ntldr пишет: если атакующий может модифицировать код вашей программы, то сливай воду и суши вёсла Я это прекрасно понимаю, поэтому не стоит задача защитить на 100%. Стоит задача макимально усложнить взломщику задачу. ![]() |
|
Создано: 21 декабря 2009 01:25 · Личное сообщение · #11 |
|
Создано: 21 декабря 2009 01:26 · Поправил: mak · Личное сообщение · #12 А нельзя проверять просто сигнатуру принадлежности к данной программе , сделать процедуруинициализации плагина с загрузкой конфигурации , сделать Длл Врапер определенных функций , и потом все это дело дружно накрыть вм протекцией как в проге , так и в дллке ?! Добавлено - а там уже и крипто , но можно не сложное а подобие крипто под вм протекцию ... ntldr Весьма академичный подход =) по постановке задачи ----- RE In Progress [!] Coding Hazard [!] Stay Clear of this Cube ![]() |
|
Создано: 21 декабря 2009 01:30 · Личное сообщение · #13 Azur1d пишет: Тогда так: плагин не шифруется, прога его загружает, забирает из него некий хедер, расшифровывает его, из него извлекает симметричный ключ и им расшифровывает код. Прошу вас - не занимайтесь самодеятельностью. Шифровать симмитричный ключ - это правильный подход, но и это не так уж просто сделать правильно. Есть такие вещи как low exponent attack, схемы дополнения симметричного ключа, и прочее, что обязательно надо знать, иначе будет дыра. Используйте библиотеки, там уже всё сделали за вас. Azur1d пишет: Может конечно, но тогда перестанут работать нормальные плаги и пользователь это заметит. Да ладно, что ему мешает пропатчить так, чтобы шифрованные плаги расшифровывались, а не шифрованные нет. Это всего на 5 минут дольше. Azur1d пишет: Я это прекрасно понимаю, поэтому не стоит задача защитить на 100%. Стоит задача макимально усложнить взломщику задачу. Ещё раз повторяю (для танкистов): опишите взломщика и формализуйте задачу. И полностью читайте мой предыдущий пост, т.к. если я угадал с постановкой задачи, то вас сразу ждет жесточайший облом. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 01:35 · Личное сообщение · #14 Дам пример адекватной постановки задачи и её решения: ТЗ: Гарантировать защиту от случайной установки пользователем неавторизованных плугинов. Гарантировать невозможность модификации программы со стороны других пользователей, за исключением администраторов. Решение: Использовать ЭЦП на основе Authenticode, либо собственный формат подписи на основе CryptoAPI или OpenSSL. Устанавливаемые плугины и конфиги хранить в %homedir%, запрещать установку программы в общедоступные для записи папки. Когда дело касается безопасности, то должен иметь место строгий системный подход, а защиты обоснование которых сводится к "авось враг не догадается, а если догадается то забьёт" - свидетельство дилетантизма автора, и доверия к нему и его ПО не добавляют. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 01:41 · Личное сообщение · #15 ntldr пишет: Используйте библиотеки, там уже всё сделали за вас. Библиотеки криптоалгоритмов видел. Библиотеки, позволяющие опознать "свой-чужой" плагин не видел. Если ткнете носом, буду очень благодарен. ntldr пишет: Ещё раз повторяю (для танкистов): опишите взломщика и формализуйте задачу Задача: Максимально затруднить взломщику увод паролей из памяти. Взломщик не ограниченин в средствах реализации, но вычислительные мощности взломщика сильно ограничены (фактически три-четыре мощных компа). Если не указал еще какие-то данные - скажите какие. ![]() |
|
Создано: 21 декабря 2009 01:45 · Личное сообщение · #16 |
|
Создано: 21 декабря 2009 01:55 · Личное сообщение · #17 Azur1d пишет: Библиотеки криптоалгоритмов видел. Библиотеки, позволяющие опознать "свой-чужой" плагин не видел. Если ткнете носом, буду очень благодарен. В аттаче исходники опознающие оригинальные апдейты MS по Authenticode подписи. Для вашего случая достаточно заменить в них строку "Microsoft Code Signing PCA" на имя своего сертификата. Azur1d пишет: Если не указал еще какие-то данные - скажите какие. Имеет ли злоумышленник возможность запускать на атакуемой системе свои программы с администраторскими привилегиями? Если да, то разработка защиты принесет больше вреда, чем пользы, ибо всеравно не поможет. Если же стоит задача защититься от левых плугинов которые пользователь САМ попытается установить путем копирования DLL в папку с плугинами вашей программы, то это возможно. ![]() ----- PGP key ![]() |
|
Создано: 21 декабря 2009 01:57 · Личное сообщение · #18 ntldr пишет: В аттаче исходники опознающие оригинальные апдейты MS по Authenticode подписи. Большое спасибо! ntldr пишет: Если же стоит задача защититься от левых плугинов которые пользователь САМ попытается установить путем копирования DLL в папку с плугинами вашей программы, то это возможно. Да! Да!!! Именно от этого и ТОЛЬКО от этого нужно защищаться. потому что я и сам понимаю, что ntldr пишет: Если да, то разработка защиты принесет больше вреда, чем пользы, ибо всеравно не поможет ![]() |
|
Создано: 21 декабря 2009 01:59 · Личное сообщение · #19 |
|
Создано: 21 декабря 2009 07:10 · Личное сообщение · #20 |
|
Создано: 21 декабря 2009 09:20 · Личное сообщение · #21 Стоит добавить, что если пользователю ОЧЕНЬ захочется установить себе левый плаг, то технически невозможно это запретить, поскольку тогда наша задача из области криптографии переходит в область DRM (которые, как известно, не могут быть надежны). ----- PGP key ![]() |
|
Создано: 21 декабря 2009 09:53 · Личное сообщение · #22 |
|
Создано: 21 декабря 2009 11:24 · Личное сообщение · #23 ntldr пишет: Он может просто вырезать нахрен всю криптографию и загрузить обычную DLL. если приложение локальное, если длл не криптована и если хватит квалификации - да, сможет (ну или кто поможет ![]() Azur1d как девелопер не будет столь наивным что бы оставить процесс загрузки длл на самотек ![]() ![]() |
|
Создано: 21 декабря 2009 11:36 · Личное сообщение · #24 DMD пишет: и что это ему даст? Даст возможность установить левый плуг наплевав на запреты автора. Если цель, с которой автор делает эту защиту не совпадает с желаниями пользователей, и программа хоть кому-то нужна, то её быстро взломают. DMD пишет: Azur1d как девелопер не будет столь наивным что бы оставить процесс загрузки длл на самотек добавит decrypt любым алго кода любой функции dll и все. Да ладно тебе. Я думаю тут все прекрасно знают, что ухищрения из серии "безопасность через неизвестность" ещё никому не помогли. Если подобную защиту на сломают, то это значит лишь одно - она никому нафиг не сдалась. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 11:44 · Личное сообщение · #25 Azur1d возможно стоит завести white list плагинов которые прога будет загружать + проверка ЭЦП. и этого будет достаточно + содержимое списка будет закрипчено и проверка будет происходить не один раз, а в нескольких местах, но тогда еще придется контролировать соответсвие стандартных виндовых библиотек оригинальным. ![]() |
|
Создано: 21 декабря 2009 11:56 · Личное сообщение · #26 RSI пишет: но тогда еще придется контролировать соответсвие стандартных виндовых библиотек оригинальным. А это лишнее. Повторяю в десятый раз: если злоумышленник может запускать программы с администраторскими привилегиями, модифицировать системные библиотеки или имеет физический доступ к системе на которой исполняется ваша программа, то сливай воду и суши вёсла. Все попытки защититься от такого атакующего идут не в плюс, а в минус к потребительским качествам софта, т.к. ничего кроме проблем не приносят. Поэтому исходить надо из предположения, что атакующий это НЕ пользователь программы, а какое-то третье лицо, которое может лишь выкладывать левые плуги на левых сайтах или имеет ОГРАНИЧЕННЫЙ доступ к атакуемой системе. В таких рамках задача имеет решение. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 12:02 · Личное сообщение · #27 ntldr пишет: Стоит добавить, что если пользователю ОЧЕНЬ захочется установить себе левый плаг, то технически невозможно это запретить Если юзер САМ захочет загрузить левый плуг, то это его личное горе. А если юзер скачает "новый JIMM с золотыми смайликами" который втихушку установит ему этот плаг - вот это уже моя проблема. ntldr пишет: Если цель, с которой автор делает эту защиту не совпадает с желаниями пользователей, и программа хоть кому-то нужна, то её быстро взломают Программа бесплатная, плаги бесплатные - обычному юзеру ломать ничего не нужно. RSI пишет: возможно стоит завести white list плагинов Плаги выходят чаще чем обновляется прога, каждый раз просить пользователя скачать новую версию? ![]() |
|
Создано: 21 декабря 2009 12:03 · Личное сообщение · #28 ntldr пишет: Поэтому исходить надо из предположения, что атакующий это НЕ пользователь программы, а какое-то третье лицо, которое может лишь выкладывать левые плуги на левых сайтах или имеет ОГРАНИЧЕННЫЙ доступ к атакуемой системе Атакующий может либо выложить плуг, либо установить его с помощью трояна. ![]() |
|
Создано: 21 декабря 2009 12:07 · Личное сообщение · #29 Azur1d пишет: А если юзер скачает "новый JIMM с золотыми смайликами" который втихушку установит ему этот плаг - вот это уже моя проблема. Есть ли у этой проблемы решение - зависит от того, в каком виде пользователь скачает этот самый "новый JIMM". Если в виде DLL, которую он вручную скопирует в папку с плугами, то вы можете проверить и не загружать эту DLL. Если в виде EXE инсталлятора, то вы бессильны что-либо сделать, т.к. вы не контролируете запуск этого EXE, и он может патчить систему, вашу программу, и.т.д. Такой случай - это проблема пользователей и антивирусных компаний. ----- PGP key ![]() |
|
Создано: 21 декабря 2009 12:26 · Поправил: DMD · Личное сообщение · #30 ntldr пишет: Даст возможность установить левый плуг наплевав на запреты автора. не думаю что все будет так просто, но спорить нет смысла ![]() Azur1d пишет: Программа бесплатная, плаги бесплатные - обычному юзеру ломать ничего не нужно. Azur1d пишет: Плаги выходят чаще чем обновляется прога, каждый раз просить пользователя скачать новую версию? из всего следует только один вывод: нет ТЗ - нет предмета диспута. каждый из присутствующих может "в_слепую" предложить по небольшой кучке вариантов ответов на поставленные ТС вопросы. + еще немного в зависимости от доп.условий или уточнений от ТС пока же в кофейной гуще и то больше информативности ps ntldr пишет: Если в виде DLL, которую он вручную скопирует в папку с плугами, то вы можете проверить и не загружать эту DLL кажется мне, ТС не контролирует кол-во user'ов и/или права на использование ими длл => проверить это невозможно в принципе и опять же см. вывод выше ![]() |
. 1 . 2 . >> |
![]() |
eXeL@B —› Программирование —› Идентификация "своей" DLL, и загрузка DLL из памяти. |