Linux社区广泛流传着一条著名的林纳斯定律:
“只要有足够多的眼睛,就可以让所有问题现形。”(Given enough eyeballs, all bugs are shallow)。
凭借这个信念,林纳斯和很多内核开发者就是靠printk和眼睛来发现问题,解决问题,不用调试器,不用复杂工具。
就这样,Linux内核走过10年,走过20年,走过30年,不断发展。
但是最近两三年里,一个新的趋势开始挑战林纳斯定律,让人们开始怀疑林纳斯定律的可靠性。这个趋势就是Linux内核的安全漏洞数量持续上升。
在著名的CVE数据库中,2019年开始出现Linux的内核漏洞记录,数量是3个。2020年是14个,2021年猛增到717个,2022年231个,2023年409个,2024年过去半年多,已经报了1436个。
2019 | 3 |
2020 | 14 |
2021 | 717 |
2022 | 231 |
2023 | 409 |
2024 | 1436 |
安全漏洞通常代表着威胁系统安全的严重问题,可以把它粗略看作是流入产品阶段的严重bug。
安全漏洞数量持续上升,意味着林纳斯定律的失灵。
那么,是什么原因,导致林纳斯定律失灵呢?
在林纳斯定律里,没有明确定义到底需要多少只眼睛。难道是眼睛的数量还不够么?总的来说,Linux内核的使用场景越来越多,使用的人也越来越多,所以眼睛的数量是够多的。
其实,更重要的一个原因是,达到安全漏洞级别的问题难度太大了,大多数眼睛都看不出来。
换个角度来说,一些简单的软件故障,比如该显示为1的,显示为2了,那么很多人都能发现。
但如果一个系统表面上跑的好好的,只是里面有安全漏洞,黑客可能偷偷入侵进来。普通眼睛就很难看出这样的问题了。
比如,下面这段代码有严重的安全问题,可能导致栈上的缓冲区溢出,是风险非常高的安全漏洞。
static int proc_get_long(char **buf, size_t *size,
unsigned long *val, bool *neg,
const char *perm_tr, unsigned perm_tr_len, char *tr)
{
int len;
char *p, tmp[TMPBUFLEN];
if (!*size)
return -EINVAL;
len = *size;
if (len > TMPBUFLEN - 1)
len = TMPBUFLEN - 1;
memcpy(tmp, *buf, len);
查阅Linux内核的老代码,这段代码至少从内核2.6.35就有了,而且就在明晃晃的kernel子目录下(sysctl.c)。
但是十几年时间里,没有人发现(也许有黑客发现,偷偷利用,......)。
直到一位叫Kyle Zeng的留学生把它报告出来,时间已经是2022年下半年。这便是CVE-2022-4378。
2023年10月,Kyle Zeng获得了谷歌博士奖学金。成为他所留学的亚利桑那州立大学的荣耀。“亚利桑那州立大学的一名学生因其创新的网络安全攻击解决方案而受到Google的关注。”
内核代码数量大,复杂度高,单纯靠眼睛发现安全漏洞的难度太大了。不过,安全漏洞数量的上升,恰恰从侧面证明了Linux内核被用在了很重要的一些场景里。或者说,以前漏洞少,并不是说没有漏洞,而是没人在乎,没被发现。概而言之,Linux正在逐渐成为黑客和电子战的新战场,在Linux系统上的安全博弈才刚刚开始。
(写文章很辛苦,恳请各位读者点击“在看”,也欢迎转发)
*************************************************
正心诚意,格物致知,以人文情怀审视软件,以软件技术改变人生
扫描下方二维码或者在微信中搜索“盛格塾”小程序,可以阅读更多文章和有声读物
也欢迎关注格友公众号