MemGuard
Программный анклав для хранения конфиденциальной информации в памяти.
Этот пакет пытается уменьшить вероятность раскрытия конфиденциальных данных, находящихся в памяти. Он поддерживает все основные операционные системы и написан на чистом Go.
Возможности
- Конфиденциальные данные шифруются и аутентифицируются в памяти с помощью XSalsa20Poly1305. Используемая схема также защищает от атак холодной перезагрузки.
- Выделение памяти обходит среду выполнения языка за счет использования системных вызовов для запроса ресурсов напрямую у ядра. Это позволяет избежать вмешательства сборщика мусора.
- Буферы, хранящие данные в открытом виде, защищены сторожевыми страницами и контрольными значениями (canary) для обнаружения ложных обращений и переполнений.
- Принимаются меры для предотвращения попадания конфиденциальных данных на диск. Это включает блокировку памяти для предотвращения подкачки и обработку дампов памяти.
- Реализована неизменяемость на уровне ядра, так что попытка изменения защищенных областей приводит к нарушению доступа.
- Несколько конечных точек обеспечивают возможность очистки сеанса и безопасного завершения работы, а также обработку сигналов для предотвращения остаточных данных.
- Атаки по побочным каналам смягчаются за счет того, что копирование и сравнение данных выполняется за константное время.
Некоторые функции были вдохновлены libsodium, за что им спасибо.
Полная документация и полный обзор API доступны здесь. Интересные и полезные примеры кода можно найти в подпакете examples.
Установка
$ go get github.com/awnumar/memguard
API является экспериментальным и может содержать нестабильные изменения. Рекомендуется зафиксировать версию. [modules]
Участие в разработке
- Предоставление примеров программ в
./examples.
- Сообщение об ошибках, уязвимостях и любых трудностях при использовании API.
- Написание полезных библиотек безопасности и криптографии, использующих memguard.
- Реализация защит, специфичных для ядра/процессора.
- Предложение улучшений производительности.
Issues предназначены для сообщения об ошибках и обсуждения предложений. Pull request'ы должны быть направлены в master.