有多少漏洞
2021年冬天,有多Log4j2那个漏洞爆出来的少漏时候,我正坐在工位上啃一个冷掉的有多三明治。手机开始震,少漏群里消息一条接一条,有多运维同事在喊“全线告警”。少漏那个漏洞叫CVE-2021-44228,有多后来大家更习惯叫它“Log4Shell”。少漏一个日志库,有多几乎每个Java项目都在用,少漏攻击者只需要构造一段特定的有多字符串,就能在服务器上远程执行任意代码。少漏CVSS评分10.0,有多满分。少漏
这事有意思的有多地方在于,Log4j这个库已经存在了二十多年。二十多年里,无数人Review过它的代码,无数公司把它塞进生产环境。漏洞藏在哪?藏在JNDI查找功能里。这个功能本意是方便配置,结果成了后门。你说这算谁的锅?写代码的人觉得这功能没问题,用代码的人根本不知道这功能存在。一层一层往下传,传到最后一层,没人看得见全貌。
我后来养成一个习惯:每接一个新项目,先跑一遍依赖树。mvn dependency:tree,输出能刷好几屏。一个普通的Spring Boot应用,直接依赖加上传递依赖,轻松过百。这里面有多少是你真正知道的?有多少是某个库为了兼容某个远古版本拖进来的?你根本不清楚。2017年Equifax被黑,1460万人的数据泄露,起因就是一个Apache Struts的漏洞。他们有三个月时间打补丁,没打。漏洞本身不复杂,复杂的是组织里没人说得清“我们到底用了什么”。
更麻烦的是,漏洞不光是代码写错了。有时候代码没问题,配置出了问题。S3存储桶公开可写,Redis没设密码,Elasticsearch裸奔在公网上。这些算漏洞吗?严格来说不算CVE,但造成的后果一样。我见过一个创业公司,后端架构挺漂亮,微服务拆得干干净净,结果MongoDB端口对外开放,整个数据库被人拖走,还留了勒索信。技术团队复盘的时候说“没想到”。
“没想到”这三个字,大概能解释一半以上的安全事件。你以为的边界和实际的边界,中间差着十万八千里。前端做了输入校验,后端没做,攻击者直接调API。内网觉得安全,结果一个钓鱼邮件就把凭证交出去了。供应链攻击这几年越来越多,你信任的第三方库,某天更新了一个版本,里面夹带私货。SolarWinds那次,18000个客户收到带后门的更新,包括美国政府部门。你连自己写的代码都不一定完全信任,何况别人写的。
有人统计过,一个中等规模的软件项目,平均每千行代码有1到25个缺陷。其中能被定义为安全漏洞的,大概占一小部分。但就是这一小部分,足够让整个系统崩掉。你写一万行代码,可能只有三个漏洞,但攻击者只需要找到一个。
防守方要堵住所有洞,攻击方只需要找到一个没堵的。这个不对称,是安全这件事最让人头疼的地方。你没法证明自己安全,只能证明自己还没被攻破。每次看到“已修复所有已知漏洞”这种话,我都觉得挺幽默的——未知的呢?
所以回到标题那个问题。有多少漏洞?没人知道。你知道的漏洞,和你不知道的漏洞,比例大概是冰山的水面部分和水下部分。更气人的是,水面还在涨。
本文地址:http://www.79wt.cn/news/1468a1899835.html
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。