У меня есть базовое облачное хранилище файлов, куда пользователь может загружать / скачивать файлы.
Я храню файлы как обычные файлы в файловой системе следующим образом:
Пользователь загружает "launchattack.exe" -> сохраняется как "c: \ wwwroot \ site \ accounts \ user1 \ files \ {guid} .bin"
Какой в этом риск для безопасности? Даже если файл будет опасен при выполнении на сервере, безопасно ли его хранить в таком виде?
Какие другие контрмеры мне следует использовать?
Я использую это сейчас на Windows Server, но могу перейти на Linux. Я использую ASP.NET Core.
Я мог бы добавить ко всем файлам заголовок, чтобы они не были исполняемыми в их сохраненной форме, но я не знаю, нужно ли это?
Основной вопрос: можно ли как-то запустить этот файл? Можно ли использовать подобную службу для запуска вредоносного кода на моем сервере? Думаю, нет, но лучше перестраховаться, чем сожалеть.
Существует несколько способов предотвратить автоматический запуск ненадежных исполняемых файлов в Windows.
1) Вы можете закодировать файл, чтобы он не распознавался как исполняемый файл; например как base64 или через шифрование (не полагайтесь ни на что, что зашифровывает прозрачным образом, так как это может представить файл Windows в расшифрованном виде).
2) Вы можете сохранить файл в каком-либо хранилище данных, не позволяя Windows напрямую обращаться к файлу и тем самым предотвращая его запуск.
3) Установите ACL в корневом каталоге хранилища соответствующим образом (разрешите чтение, ввод каталогов, создание, изменение, но запретите чтение + выполнение файлов), принудительное наследование и не позволяйте вашему приложению изменять ACL.
Возможно, есть и другие варианты; в Linux вы можете смонтировать файловую систему, в которой хранятся файлы, с помощью noexec
флаг, предотвращающий выполнение файлов в этой файловой системе. Вы можете запустить приложение в контейнере (или виртуальной машине), изолировав любые воздействия вредоносных программ и т. Д. (Вы, конечно, запускаете приложение с минимальным количеством разрешений, не так ли?) Вы можете пометить файлы как загружаются из Интернета, чтобы предотвратить их запуск без вмешательства пользователя.
Конечно, все зависит от того, чтобы ваш сервер не был скомпрометирован каким-либо другим способом, что позволяет обойти ваш механизм защиты. Вариант 1, вероятно, самый безопасный, но для его реализации требуется больше всего ЦП, поскольку вы выполняете кодирование / декодирование на лету. Вариант 2 зависит от вашего хранилища данных (например, базы данных). Вариант 3, вероятно, является самым быстрым (и довольно безопасным) и наименее ресурсоемким из всех, но он зависит от того, правильно ли вы правильно указали ACL, и его можно обойти, скопировав файл в другую файловую систему для запуска.