从千年虫bug的问题谈开去

最近微软又爆了一个千年虫的bug,微软FIP-FS反恶意软件扫描引擎由于Year 2022漏洞导致Exchange服务器无法发送邮件。

另外,本田、讴歌汽车也爆了Y2K22千年虫漏洞。

这是因为,在程序中,或者数据库中,字段类型定义成int32字段类型。而int32,一共32位,第一位表示符号,因此可以表示数值大最大位是31位,即2147483647:
1111111111111111111111111111111(二进制,31个1) —> 2147483647(十进制)

2021年12月31日23点59分 —>windows,短年表示,精确到分,21年12月31日23点59分—>2112312359—–> 1111101111001110101010000100111
下一分钟
2022年1月1日0点1分 ——->windows,短年表示,精确到分,22年01月01日00点01分—>2201010001—–> 10000011001100001011111101010001 —> 超过 1111111111111111111111111111111(二进制),overflow,所以报错了。

 

另外还有一个类似的问题,北京时间2038年1月19号11:14:07( UTC 时间2038年1月19日 03:14:07 )的问题。
这是因为在某些系统中,比如mysql,timestamp类型的字段,长度也是被设计成int32。采用unixtime计时。unixtime按照秒来计算的话,31位的1,表示 2147483647秒,从unix time计时元年UTC 1970年1月1日0点0分0秒算起,2147483647秒之后,到了UTC 2038年1月19日03:14:07, overflow。

 

目前mysql的该问题,还等待mysql在新版本中修复这个问题。

相关文章

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据