昨天,几个安全圈好友聚在一起饮酒,不知怎么就聊到了“千年虫”的问题。当年开拓打算机操作系统的那帮大神们亲手埋下的雷,在韶光的流逝下逐步爆出了各种匪夷所思的安全BUG。千禧年Y2K的雷是Windows,而Unix的雷则是在2038年爆发。
Unix的雷是怎么埋下的?话说再1969年,贝尔实验室的大神Ken Thompson曾利用老婆回外家的假期,开拓了一个操作系统,它叫Unix。没错,便是咱们现在利用的那个Unix,开拓它大概用了三周(夸年夜)。看来,老婆回外家可以大幅提升已婚男人创造力,这在环球范是统一的。
在开拓过程中,他碰着了一个严重的问题:如何在Unix中表示日期和韶光?最大略的办法是用一个字符串来表示,例如1970-09-17 00:00:30.751,但这明显不是最好的办法。末了Ken决定用一个整数来表示日期和韶光,也便是Unix 纪元韶光,并将1970年1月1日00:00:00设定为开始韶光。
以是Unix 系统的韶光打算方法实在是用秒数来表示系统韶光。换句话说当下的韶光(2024年1月1日00:00:00)是从1970年1月1日00:00:00走过多少秒的韶光,即系统韶光 = 基定时光+秒数。感兴趣的朋友,可以访问time.is/Unix网站,可以知道从1970年1月1日00:00:00到现在一共过去了多少秒。
由于Ken将Unix韶光确定为32位整数,这就导致一个很严重的系统BUG,32位的有符号整数最大值是2147483647(间隔1970年1月1日00:00:00走过了2147483647秒),大略换算下Unix韶光为2038年1月19号 03:14:07 UTC,再今后就没了。
一旦超越这个韶光最大值,Unix系统韶光将会在内部被表示为一个负数,并造成程序无法事情,由于它们无法将此韶光识别为 2038 年,乃至还有可能调回到 1970 年。这让很多人想起了千禧年的“千年虫(Y2K)”事宜,因此Unix系统韶光问题也被称为Y2K38。
当然这也不能完备怪Ken。毕竟那时候主流打算机还都是利用16位,以是利用32位整数来设定时间已经够够的了。在他看来,Unix系统能不能活到2000年都是个问题,更别提2038年。但谁能想到,Unix系统竟是如此的刁悍,不仅可以和Windows相反抗,还统治了做事器真个OS市场,在打算机操作系统的发展史上霸占主要的地位,此后“简洁,同等性,易利用”被很多开拓职员奉为圭表标准。
问题很严重吗?扯远了。。
实在办理方案也不繁芜,将32 位有符号整数修正成 64 位有符号整数(韶光长度近300亿)。目前Linux内核开始全面支持64位韶光戳的系统调用,记得在升级之后看看原来的程序和库是否利用32位编译,如果是则需改成64位,否则依然会产生溢出问题。
虽然很多文章将这一问题描述地很严重,乃至会导致大部分电脑瘫痪无法事情。但我们认为,这样的情形并不会涌现。间隔2038年还有整整14年的韶光,以现在电子设备迭代的速率来看,那时候还有没有32位的电脑都是个未知数。
其次,从千年虫事宜来看,终极结果没有产生非常严重的影响,部分安全问题都掌握在小范围内,尤其是并且对现实天下产生严重影响,相信Y2K38也不会有太过严重的后果。Unix对这一BUG也是心知肚明,不可能找不到一个妥善的办理办法。
末了,祝大家元旦快乐。2024年,你我皆是黑马!
(狗头保命)
资源来源于互联网