新年虫漏洞丨大东话安全

作者: 大东

来源: 中科院之声

发布日期: 2022-03-06 08:00:00

本文讲述了微软Exchange服务器在新年期间因日期格式存储问题导致的邮件发送故障,以及微软如何应对和修复这一问题的过程。

小白剧场

大东:小白,网上对于程序员的有一句调侃,你知道程序员身上最需要具备的特质是什么吗?

小白:这个我知道,哈哈哈哈,毕竟我可是预备役程序员。那就是,要做好随时加班的准备。

大东:但其实各行各业的工作人员需要在有临时任务时候去加班奋斗,为何就单单成为了程序员的特质?

小白:因为大家一直调侃程序员的工作作息是007,996之类的。

大东:原来如此。

小白:话说我们为什么突然聊起来这个程序员加班的话题了?

大东:因为最近安全圈有一个新闻,微软的员工跨年夜加班回去修bug,又让大家调侃起程序员加班的事情了。

小白:这是因为什么原因呢?东哥你可以讲一下吗?

大东:当然可以。

小白:好的好的,搬来我的小板凳。

话说事件

大东:跨年夜大家都会发信息给亲朋好友发祝福,有的人会倾向使用即时性通讯软件,有的人会倾向使用email方式。

小白:小白我就是使用微信的用户人群。

大东:很多使用微软Exchange的用户发现,自己写好的新年祝福等邮件突然无法发出,并且都会收到一条错误提醒。

小白:欸,啥情况?

错误提示(图片来源于网络)

大东:而且包括2016和2019等在内的不少Exchange Server版本中都出现了相同的问题。

(图片来源于网络)

小白:一个多版本的通用bug呀,这个问题最开始是谁先发现的呢?

大东:是一个网名叫“miketheitguy”的网友最先发现的,并且这个网友在22年1月1日上午在推特上公开了这个发现。

用户twitter截图(图片来源于网络)

小白:那么微软的程序员就失去假期了,国外似乎没有咱们这边农历年的习俗,所以1月1日对于他们的含义应该和我们国内看待大年初一差不多吧。

大东:没错,大家都疯了,大过年的还要加班都怪这个bug,这个bug也遭到了广大码农不分国界的疯狂吐槽。在Reddit上,相关话题热度上千,许多程序员表示“年都没跨好就在这修bug”。

小白:加班,看来是国内外程序员的共同特质啊。哈哈。那这个bug到底是因为什么原因造成的呢?

大东:别急,我们这就开始讲。

小白:好耶。

大话始末

大东:其实呢,这是一个由于“2022年”的到来而导致的bug。

小白:啊,这和2022年有什么关系,欸,我知道了,是不是和千年虫漏洞很相似!

大东:你好机智啊,给你点赞。

小白:因为东哥咱们之前讲过千年虫,所以我还有印象,嘻嘻。

大东:要想探究最根本的原因,我们要先了解一个微软的系统。

小白:是什么系统呢?

大东:是一套邮件过滤管理系统,英文名是“FIP-FS”。

小白:我好想知道这个系统,是微软Exchange上面的吧。

大东:没错。我们要关注的就是这套系统存储日期的格式,这个格式其实也是编程程序员比较常见的格式——“yymmddHHMM”,并使用有符号变量(Int32,也就是long)实现。

小白:所以是数的存储带来的问题?

大东:对的,先来看这种日期的存储意义,这个对于广大程序员应该很熟悉了。yymmddHHMM分别指代用两位来存储年(years)、月(months)、日(days)、小时(Hours)、分钟(Minutes)。

小白:这样存储好像也没啥问题呀。

大东:小白,你思考下有符号的int32数的存储范围是多少呢?

小白:有符号的Int32最多只能存储-2147483647到+2147483647的数据。

大东:你看,答案就在眼前。

小白:对,从22年开始,就变成了22XXXXXXXX,从2022年1月1日0时开始,就超过了Int32所能存储的数据最大范围。

大东:所以这个漏洞也被网友称为“2022版千年虫”,也被一些Exchange管理员命名为Y2K22。

小白:看来变量虽小,却不能忽视啊。在程序设计的时候一定要考虑到实际应用中数的取值范围的问题。微软对此是如何应对的呢?

大东:嗯…首先就是紧急叫了一波程序员回去加班奋战了。

小白:又cue到了辛勤的打工人。

大东:微软同时也发布了公告,在公告中声明,他们会发布一个Exchange Server更新,里面将用一个更大的变量类型来保存日期。

小白:这次应该波及挺大的吧,估计有好多邮件都滞留邮箱了。

大东:是的,你想,设置在2022年新年发送的邮件会在许多公司的邮箱服务器内滞留,据了解,有的公司邮箱服务器中滞留的邮件甚至已经达到数十万封。

小白:这,这是肯定存不下的啊!

大东:是啊。

小白:微软有没有说有什么临时解决的办法?

大东:微软团队表示,如果有非常紧急的邮件需要发送,需要先关掉Exchange中的FIP-FS功能。可以通过使用Set-MalwareFilteringServer -BypassFiltering $True -identity禁用Exchange服务器上的反恶意软件扫描器,并重新启动MicrosoftExchange Transport服务。

小白:对啦,这个FIP-FS具备什么功能呢?

大东:刚刚我们已经提到过它的中文全名了“邮件过滤管理器”,小白你来猜猜看呢?

小白:我想想啊,那它是用来过滤垃圾邮件的吗?

大东:是的,不仅垃圾邮件,它还可以一定程度上检测恶意邮件,并过滤出去。

小白:这样操作很可能导致公司邮箱“可能收到更多垃圾邮件”。

四、小白内心说

大东:还有网友调侃,我们简单点直接把有符号变量改成无符号变量吧。

小白:哈哈,这么简单粗暴的吗?直接让范围奔向0~4294967295!

大东:我不怀好意地想一下,如果真的这样搞,Exchange邮箱应该是可以用到2043年啦,哈哈。

小白:哈哈哈,那这就是千年虫病毒的2043版。

大东:还有一些网友说要不我们把日期回滚到2021年吧,可以暂时解决此问题。

小白:哈哈哈,网友都在积极出谋划策。

大东:最后微软还是给出了自己官方的结局方案。

小白:是什么呢?

大东:它们紧急发布了一个临时修复程序——“Reset-ScanEngineVersion.ps1”。

小白:我猜是PowerShell脚本?

大东:是的。

小白:那我们要怎么操作这个临时修复程序呢?

直接执行PowerShell脚本就可以了吗?

大东:是的。“Reset-ScanEngineVersion.ps1”脚本执行时,Microsoft过滤管理和Microsoft Exchange传输服务都会被停止,随后会删除旧的防病毒引擎文件,并下载新的防病毒引擎,最后再次启动这些服务。

小白:大东东,能再讲得具体一点吗?

大东:那我们来一步一步讲。第一步、从https://aka.ms/ResetScanEngineVersion下载Reset-ScanEngineVersion.ps1脚本。第二步、打开提升的Exchange命令行管理程序。第三步、通过运行Set-ExecutionPolicy -ExecutionPolicy RemoteSigned更改PowerShell脚本的执行策略。第四步、运行脚本。

小白:明白了!

大东:微软还提示,如果之前禁用了扫描引擎,需要使用Enable-AntimalwareScanning.ps1脚本再次启用它。

小白:嗯嗯,大家可以按照这个方法进行设置啦。

大东:小白,你听完这个故事有没有什么感想呢?

小白:欸,感觉变量这件事看起来微不足道,实际上出问题之后影响还是蛮大的。写程序的时候一定要多多考虑啊!

大东:没错,小白努力做一个优秀的程序员吧。

UUID: 10483ae0-3f44-4494-9941-0a1e36713f2e

原始文件名: /home/andie/dev/tudou/annot/AI语料库-20240917-V2/AI语料库/中科院之声公众号-pdf2txt/2022/中科院之声_2022-03-06_新年虫漏洞丨大东话安全.txt

是否为广告: 否

处理费用: 0.0072 元