我有一个基本的文件云存储解决方案,用户可以上传/下载文件。
我将文件作为常规文件存储在文件系统中,如下所示:
用户上传“launchattack.exe”->保存为“c:\wwwroot\site\accounts\user1\files\{guid}.bin”
这样做有什么安全风险?即使文件在服务器上执行会造成危害,这样存储是否仍然安全?
我还应该采取其他什么对策?
我目前在 Windows Server 上运行它,但可能会转移到 Linux。我正在使用 ASP.NET Core。
我可以在所有文件前面添加一个标题,这样它们在存储形式下就不可执行,但我不知道这是否有必要?
基本问题是这个文件是否可以以某种方式执行?这样的服务是否可以用来在我的服务器上运行恶意代码?我想不会,但谨慎一点总比后悔好。
答案1
有几种方法可以防止不受信任的可执行文件在 Windows 上以某种自动方式运行。
1)您可以对文件进行编码,以使其不被识别为可执行文件;例如,以 base64 或通过加密(不要依赖以透明方式加密的任何东西,因为这可能会以解密形式将文件呈现给 Windows)。
2)您可以将文件存储在某种数据存储中,防止 Windows 直接访问该文件,从而阻止其运行。
3)适当地设置存储根目录上的 ACL(允许读取、进入目录、创建、修改,但拒绝读取+执行文件),强制继承并且不允许应用程序更改 ACL。
可能还有其他选择;在 Linux 上,您可以使用标志挂载存储文件的文件系统noexec
,防止执行该文件系统中的文件。您可以在容器(或 VM)中运行应用程序,隔离任何恶意程序的影响等。(当然,您运行应用程序时使用的权限尽可能少,不是吗?)您可以将文件标记为从 Internet 下载,以防止它们在没有用户干预的情况下运行。
当然,一切都依赖于您的服务器不会以其他方式受到损害,从而导致您的保护机制被绕过。选项 1 可能是最安全的,但由于您正在动态进行编码/解码,因此需要最多的 CPU 来实现。选项 2 取决于您的数据存储(例如数据库)。选项 3 可能是所有选项中速度最快(并且非常安全)且资源消耗最少的,但依赖于您获得正确的 ACL,并且可以通过将文件复制到另一个文件系统中运行来绕过。