zoukankan      html  css  js  c++  java
  • 从公司服务器C盘被删说起

    事情起因

    一个阳(严)光(重)明(雾)媚(霾)的周二,对于我们从周二到周六的班次来说,这是新的一周开始。我像往常一样,打开电脑,倒上一杯水,开始翻阅从大洋彼岸发来的各种邮件。突然看到一封紧急的邮件,内容大致是线上的所有API服务器全部宕机了,原因IT正在查,所有的API都被紧急迁移到了一台新的服务器上,让我们协助修改各种配置。刚坐下没多久,美国那边就打电话过来了,告诉我们,WEB程序服务器上的C盘被删除了很多文件,然后又强调了邮件中的内容,让我们协助。

    在协助线上处理完了各种配置的修改后,我们在周会上讨论了各种可能性,大家一致认为黑客入侵了我们的服务器,认为一般的WEB程序不会有这么大的权限,能把C盘给搞挂了。这也是因为我们在大约一个月前,刚被黑客入侵过一次(http://www.sohu.com/a/255005663_354899),大家都觉得是黑客在其他机器中留了种子,后续在黑五期间又专门搞我们一下~~

    幕后真凶

    然而事情并没有那么简单,过了一天后,IT通过Windows上的LOG,找到了真凶,就是下面的一段C#代码:

    image

    看起来也很朴素是不?path是某个业务相关的文件夹路径,在某些操作完成后,删除业务文件夹,除了删除前没有判断文件夹存在性外,是不是看起来也并没有什么问题?

    然而并不是~

    该代码中,没有对非法的输入进行Check,当path为空字符串时,该代码会自动给字符串后面加上 “\”,导致最终执行删除的代码为:Directory.Delete(”\”,true);

    在.NET 4.0中,该代码将删除当前驱动器中的所有文件 (原来如此)

    那么这么危险的操作为啥一个WEB程序竟然有权限执行呢?

    再来看看我们的IIS中的设置:image

    在这个应用程序池的配置中,我们所有的应用程序池都是用LocalSystem这个身份在跑的,这个身份一般来说权限是比较高的,所以也是导致我们本次事故的一个重要因素。

    小结

    代码的非法性检查一定要做到位,一个健壮的程序应该不仅能在数据正常时正常运行,在数据异常时,也应该能够正确运行,并对外抛出错误。

    程序在运行的过程中,一定要以最小权限运行,很多文章都提到过这点,但很多人在实际操作时,为了方便,就直接给比较高的权限了,这点我自己也喜欢这样干,需要以后多注意一些。

    本次有问题的代码其实并不是我们组的,但是不同业务组的项目都部署在同一台机器上,最终别的组的大失误导致了我们的API宕机,可以利用Docker等容器技术来规避这些问题,Docker在这种程序的隔离性上会体现出明显的优势。


  • 相关阅读:
    Android(java)学习笔记78:Java类初始化顺序
    Android(java)学习笔记77:Android中assets文件夹资源的访问
    Android(java)学习笔记76:Handler用法总结 和 秒表案例
    Android(java)学习笔记75:ListViewProject案例(ListView + BaseAdapter + CheckBox)
    Android(java)学习笔记74:ListViewProject案例(ListView + ArrayAdapter)
    POJ 2516 Minimum Cost
    POJ 2195 Going Home
    POJ 1087 A Plug for UNIX
    POJ 3281 Dining
    ZUFE OJ 2289 God Wang II
  • 原文地址:https://www.cnblogs.com/baiyunchen/p/10030808.html
Copyright © 2011-2022 走看看