Итак, проблема в том, что у меня есть некоторые секреты (ключи TOTP / HOTP), которые должны последовательно использоваться моей программой, но я не хочу, чтобы дамп памяти просто отображал их все. Я говорю о простых людях, чьи компьютеры могут быть скомпрометированы вредоносными программами.
Если кто-то думает о шифровании этих строк в памяти с помощью некоторого симметричного алгоритма шифрования со случайным байтовым ключом, то это, вероятно, сложнее, чем просто чтение памяти (AES-CBC и т. д.), И для этого потребуется найти случайный ключ в памяти. , а затем найти эти данные в памяти, которые можно расшифровать с помощью этого.
Может быть, я смогу усложнить задачу, разделив этот ключ на несколько переменных?
Что ж, я не специалист по безопасности, и мой вопрос к тем, кто сталкивался с подобными проблемами раньше: как лучше всего хранить секретную информацию в памяти? Законно ли мое беспокойство или это параноик, и все программы просто сохраняют свои пароли в памяти?
Точно так же обоснованное предположение: я полагаю, это параноик.
Вы можете найти больше опыта на Информационная безопасность SE (например, этот связанный вопрос).
@jdehesa Спасибо. Я прочитаю это, и если здесь никто не может помочь, я подумаю об этом.
Здесь вы должны подумать о векторе атаки. Какие вредоносные программы могут найти все интерпретаторы Python из памяти, просмотреть все живые объекты Python, чтобы увидеть, какие из них являются строками, просмотреть хранилище каждой строки и надежно угадать, какие из них являются значимыми секретами, но не могли просто сделать то же самое? с сетевыми отправками или вызовами в криптографическую библиотеку или чем-то еще, что вы делаете с ключами после их расшифровки?
@abarnert Хороший вопрос. Я делаю программу, которая может использовать эти ключи. Библиотека, использующая эти ключи, использует их только по вызову и не сохраняет следов в памяти. Таким образом, злоумышленник, который видит дамп памяти и знает, что моя программа существует, будет искать мою программу и может ее найти. Вот о чем я думаю.
Мне приходилось иметь дело со случаем, когда приложение, над которым я работаю, достаточно популярно, чтобы атаковать специально, чтобы найти секреты, используемые для шифрования рукопожатия запутанного протокола, чтобы создать клон, который использует тот же протокол. Любое запутывание, которое мы попробовали, было бы взломано за несколько недель или месяцев. Таким образом, ответ заключался в том, чтобы придумать лучший дизайн, который не полагался бы на это, а тем временем добавить некоторую обфускацию и изменить ключи, механизм запутывания и рукопожатие каждые пару месяцев (и заставить мир обновляться), одновременно отучая клиентов от зависимости по старому дизайну.
@abarnert Понятно. Так что изменение параметров шифрования в памяти то и дело помогает. Я буду нацеливаться на это. К сожалению, невозможно не полагаться на то, что эта информация остается в памяти для TOTP. Токен генерируется каждые 30 секунд, и для этого нужен ключ.
Итак, вы вызываете библиотеку с этими ключами. Вам нужно расшифровать ключи, после чего они будут в памяти, и, что более важно, вы должны передать их в библиотеку. Предполагая, что библиотека находится на C, а не на Python, и вы используете привязку ABI к ней, например ctypes, очевидный способ сломать это - подключить dlsym или FindProcAddress и посмотреть, какие строки вы передаете в экспорт этой библиотеки, а не смотреть на каждая строка в памяти.
@abarnert Я так понимаю, что это невозможно защитить, пока задействован ctypes ...
Изменение схемы обфускации может помочь с некоторыми проблемами, но делать это вслепую без оценки всей системы, вероятно, будет напрасной тратой усилий, которые вы могли бы потратить на функции, исправления ошибок или борьбу с вектором атаки, который фактически подвергается атаке.
Нет, это невозможно скрыть, пока присутствует какая-либо граница. ctypes - это всего лишь предположение о самой простой границе, которую вы, скорее всего, получите на основе вашего описания. Настоящий злоумышленник будет знать, что делает ваша программа и почему и с какими библиотеками или серверами она, вероятно, будет взаимодействовать, или он не захочет атаковать ее, поэтому ему не придется делать диких предположений.
@abarnert Может ли программа на C++, которая полностью статически связана с одним исполняемым файлом, решить все проблемы, о которых вы можете подумать?
@TheQuantumPhysicist Нет. Программа, написанная на C++, со всеми функциями, связанными с шифрованием, не только статически связанными, но и распределенными по нескольким функциям, которые одновременно выполняли другие задачи, по-прежнему не решала всех проблем, о которых мы могли думать. не говоря уже о тех, о которых мы не могли подумать, пока пираты не подумали о них первыми. Единственные решения этой проблемы - это непрерывная гонка вооружений или решение, что гонка вооружений невыгодна.
Я могу придумать случай, когда одноразовое решение имеет смысл: иногда вы хотите иметь возможность доказать, что вы использовали «отраслевой» уровень защиты по юридическим причинам, когда кто-то делает взломал его. Может быть, вы хотите защитить себя от судебных исков со стороны клиента, или подать в суд на начинающего конкурента, или обеспечить соблюдение какого-либо морально сомнительного, но юридически действительного положения DMCA против пиратов, или что-то еще. Но тогда вы просто узнаете, что такое «отраслевой стандарт», что, вероятно, означает покупку готового обфускатора и использование его в точности так, как задокументировано, - но спросите юриста.
@abarnert Спасибо за помощь и совет :-)






Голосующие против: Подскажите, пожалуйста, как улучшить этот вопрос.