刚入职就写了个bug,把几万用户搞蓝屏了…
扫描二维码
随时随地手机看文章
这几天看到公司有校招的同学不断入职,抬头一看台历,不算实习,正式工作满7年了。7年光阴,弹指一挥间。
记得7年前,签订劳动合同加入我的第一家公司:百度。
说来也挺奇怪,我本来校招投递的岗位是C/C 开发岗,结果由于面试过程中,面试官看我在内核技术、逆向分析技术和底层系统编程上上有一些经验,于是把我分到了内核攻防组,做驱动开发。
那时候,我们团队分了两个方向:
1、漏洞安全攻防
2014年,正是微软宣布停止对Windows XP技术支持的时候,为了守护国内数量众多的XP用户(说是守护,其实就是抢占市场),各个安全厂商都开始推出XP安全防御产品,其中比较出名的就是360的XP盾甲。
国内的信安评测机构CNCERT搞了一个XP安全挑战赛,隔几个月就来一次PK,在不同的XP电脑上分别装上各家的安全产品,然后使用一些漏洞EXP进行攻击,看看谁守得住。主要的几个玩家就是360、腾讯电脑管家、金山毒霸、北信源,还有就是百度。
咱们团队中的漏洞安全攻防组就是负责这个方向,把XP上能使用的漏洞基本上全都撸了一遍,然后把更高系统Win7、Win8上的一些安全机制(比如DEP、ASLR等等)通过内核驱动的方式移植到XP上去,以增强XP的安全能力,抵御安全攻击,赢得比赛。
我记得360的XP盾甲做了一个功能,Windows XP启动时,伴随启动进度条的出现,会出现经典的LOGO,360把这个logo改了,居然改成了360的logo,当时年轻的我被震的一愣一愣的,居然还有这种骚操作。
不过很快,身边的同事就拿到ntldr进行了逆向分析,找到了360这一招的原理,我们也照猫画虎,把这个LOGO换成了咱们百度的,不过没有推到产品上,估计会被喷的,只当是技术研究罢了。
团队中的成员好多都是从360挖过来的大牛,那段时间,跟着这些大佬们学到了许多东西,我在二进制漏洞方面入门差不多就是那个时候。
2、竞品攻防对抗
我主要的精力是放在这一块的。如果说前面第一个方向是和漏洞攻击做对抗,那这个方向就是和竞争对手打交道,这一部分更加有意思。
竞品对抗分为三块,安装、启动与优化、反卸载。
安装,就是竞争对手会想进一切技术手段对我们的产品进行围追堵截,如果你的电脑上安装了竞品,可能你下载了一个百度杀毒的安装包,安装莫名报错,各种依赖缺失,甚至连安装包都下载不成功,各种情况都有。
实际上,是竞争对手的产品在背后作祟,当它识别到百度的产品在安装时,会各种使绊子,一开始通过文件MD5来识别,我们官方发布的每一个安装包的MD5都会第一时间被竞争对手拉入黑名单,一遇到直接就被干。
后来我们改了策略,安装包下载自动随机生成,每一次下载的MD5都不一样,这样才勉强逃过绞杀,不过对手也不是吃素的,后面又改成文件特征识别,比如文件内部含有“baidu”等字符串,就列入黑名单,那段时间,百度网盘和百度音乐等几款客户端软件还因此被殃及过。没办法,我们只好再次抹掉这些特征,或者进行加密,不让它们明文出现。
再后来,对手改成了通过文件图标来识别对手,提取PE文件的图标识别是不是我们,总之,在这个过程拉锯了很多回,非常有意思,各种损招都有。
启动与优化,这是更有意思的部分。躲过了安装这才是闯过了第一关,接下来的日子,每一天都充满了危机。
可能某一天,用户什么也没做,我们的产品就起不来了,这叫开机启动使绊子,让我们起不来。
还可能竞品可能弹个窗告诉你:内存吃紧,赶紧优化。然后你一点加速球,对手就把我们的进程干掉了,甚至把我们直接都卸载了,文件、进程、注册表啥也没了,消失的悄无声息。
那我需要做的当然就是对抗竞品的这些骚操作,卸载必须由用户手动通过控制面板或者我们自己的卸载软件发起,需要识别竞品的卸载行为,拦截删文件、杀进程、删注册表等一系列操作。
任何一个安全产品都有主动防御的功能,直接调用系统API进行上面的操作肯定会被我们的主动防御拦截掉,对手也深知这一点。所以,想要干掉我们,对手得在内核模式下,用驱动调一些比较底层的函数绕过我们的安全防御。
那我们要做的就是和它进行对抗,直接的内核硬碰硬不是好办法,一不小心容易把电脑干蓝屏,我们选择了比较巧妙的一招:拦截通信。
对手要搞我们,他们处于Ring3模式下的应用程序总得和他们的Ring0模式下的内核驱动程序通信吧,就是DeviceIOControl,所以我们逆向了他们的通信协议,一旦发现要搞的目标是我们,就把这条消息拦截掉,这样他们的驱动收不到消息,也就不知道要搞我们了。
在这一部分,我们进行了好几个月的对抗,对手不断变化通信协议,不断变化通信的设备名称,甚至加密传输,我们也就见招拆招,兵来将挡,水来土掩。
后来发现我们总是拦截他们的通信,他们决定不再通信了,先把这事情记录起来,记录到文件、注册表等各种地方,等到关机的时候,我们的驱动程序已经停掉了,他们再来干这事,或者放到开机的时候,他们的驱动比我们先加载,我们还没起来就被干掉。
于是,战场又转移到了关机和开机时刻,驱动停止顺序上,比谁后卸载,最后留下来的就有后发优势,可以进行复活操作,两边互相抢,结果就是用户的电脑可能关机关半天都关不了。除了关机顺序,还会逆向分析它到底把信息记录到了哪里,把这个信息删掉,也能自保。
在这过程中,又对抗拉锯了好几个月,比较有意思的是,对手似乎和我们达成了某种"默契",专挑每周五下班的时候,更新他们新的策略,让我们加班,真是太不讲武德了。
随着我们DAU的不断增长,除了一味的防守,我们也开始尝试给竞品使使绊子,也让他们尝尝这种滋味儿,正所谓以彼之道,稍加修改,还施彼身,其乐无穷,我们也来卸载他们,删他们文件,杀他们进程,删他们注册表。
刚刚入职就参与这种项目,着实对技术是有非常大的挑战,不管是逆向分析,加解密技术,还是内核攻防技术,调试分析技术,编程功底都是非常大的考验,那段时间写代码非常谨慎,因为一个不小心,可能就会导致成千上万的用户电脑蓝屏。没错,我就因为写了一个bug,好像是一个指针释放后未及时置空,导致上万的用户电脑蓝屏了,把刚刚入职不久的我吓得半死。
故事的结尾,可能大家想不到,我们一直和竞品A做对抗,和另一个竞品B联合对抗A,颇有种三国时代,联吴抗曹的味道。但在临近年关的时候,竞品B突然在背后狠狠捅了我们一刀,全面卸载我们,一个周末,DAU掉了近千万,年终目标顷刻化为乌有。
那段日子,百度为了推广他的安全产品,做了不少过分的事情,各种捆绑,全家桶,很多中高层领导为了KPI,宁愿牺牲口碑。因为和竞品做对抗,导致产品怎么也卸载不掉,被用户骂的很惨。据说竞品B要搞我们的原因就是不小心推广到了他们公司一个高管的电脑上,还死活卸载不掉,于是才有了后面的事情,当然这只是道听途说,不知真假。
后来,我也厌倦了这样的产品和工作,如果是和病毒木马做斗争倒也罢了,拿用户的电脑当战场互相拼杀,实在不是什么光彩的事情。
恰逢我也想谋求技术转型,于是开始转向新的方向,咱们下次再聊。
作者:轩辕之风
来源:编程技术宇宙
版权归原作者所有,如有侵权,请联系删除。