允许用户上传自定义图片或视频的场景,如何防止被上传恶意代码?

2020-10-18 09:55:41 +08:00
 black11black
如题,假如应用场景是想要做一个图床的话,允许用户自定义上传,如果系统做的特别糟糕是有可能被上传二进制并执行的。

很好奇现在通用的安全防范做法是什么,如何确保用户上传的图片确实是图片?

自己写二进制分析感觉不太靠谱,工作量太大且不准确。如果交给 ffmpeg 这种工具转码一次的话能规避吗? ffmpeg 等工具有没有出现过 0day 被利用的情况?

另外统一转码的话开销也很大,图片的话有损压缩会导致失真,视频的话则是太慢。以前记得 B 站做过直传视频后码率合规就不转码的操作,他们怎么处理的,如果用户传的视频外挂了二进制文件会怎么办

很好奇,谢谢大家
4341 次点击
所在节点    问与答
44 条回复
zarte
2020-10-19 09:58:55 +08:00
就算图片里面是恶意代码通过 ng 直接访问文件目前有这个漏洞可以提权?
lshero
2020-10-19 09:59:43 +08:00
不给脚本执行权限就行了啊
imdong
2020-10-19 10:24:32 +08:00
看来楼主是想做到滴水不漏的安全防护,但我建议做到一定程度即可,因为“边际效益”会越来越低。

历史上好像确实出现过操作系统的图片程序出现过一个 0day,特定构造的图片,其特殊的信息头可能导致任意代码执行,而这种情况不排除未来也会出现,这是你无法处理的,而且也不是你的责任,应该是用户端的安全防护,执行程序需要做的。

楼主尽可能做到保护好自己的服务器不被攻击即可,至于图片被下载到本地后是否会影响用户,这个不是你能考虑的问题了,至于直接把其他文件的文件扩展名改成图片格式的客户端是否会执行,参见前两天那个关于后缀的讨论。

说想防止被黑客利用分发二进制的,我再提供一个你绝对无法避免的问题,我把二进制文件的每一个字节转化为图片上的一个点,这个图片就是标准的图片,我客户端(下载器)读取图片后还原为程序再去执行,怎么办,无法避免,而且这种情况历史上就是出现过,Chrone 的某个扩展程序就爆出过这样的后门。

所以做到以下几点,就合格了,服务器不被任意代码执行,不会有注入之类的问题,防止被恶意流量攻击(似乎没有太好的办法),上传的文件基本符合文件特征就好了,因为相比于上传的恶意文件是否会被客户端执行,我更关注的是是否会被当做在线流媒体分发平台,比如把音频,视频当做图片上传,然后网页在线播放(改后缀,指定头,都不影响播放)
akira
2020-10-20 23:46:42 +08:00
如果是担心上传的图片被执行,那只要做好文件权限就可以了,上传上来的东西不要给执行权限已经可以搞定 90%以上的问题了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/716054

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX