当前位置:首页 > 休闲

开源软件漏洞

Log4j那个漏洞爆出来的开源时候,我正熬夜改代码。软件群里突然炸了,漏洞说Apache的开源日志库能远程执行命令。当时第一反应是软件假新闻——一个打日志的库,凭什么让人把服务器端了?漏洞结果第二天,连我们内部测试机都被人扫了,开源日志里躺着一串奇怪的软件JNDI查询。那会儿才意识到,漏洞开源世界的开源信任体系,薄得像层窗户纸。软件

开源软件漏洞从来不是漏洞新鲜事。Heartbleed、开源Shellshock、软件Dirty COW,漏洞哪个不是响当当的名字?但Log4j不一样。它太底层了,几乎每个Java服务都在用,而漏洞利用又简单得离谱——往登录框里输一行字符串,服务器就乖乖交出内存。更讽刺的是,这个库维护了好几年,代码里写满了“我们很安全”的注释。没人怀疑过它,因为所有人都默认:开源的东西,大家盯着呢。

可实际呢?盯着的人少得可怜。大部分开源项目就一两个核心维护者,白天上班,晚上修bug,还得应付用户提交的几千个issue。Log4j那哥们儿,一个人扛了十几年,漏洞曝光后他发推说“我累了”。这不是矫情。你想想,你写的代码被全世界几百万个系统用着,出事儿了全怪你,但平时没人给你发工资。这种压力下,出漏洞才是常态,不出才是奇迹。

商业软件好歹有QA团队、有安全审计、有SLA。开源呢?靠的是“众目睽睽”。但众目睽睽有个致命前提——得有人真去看。Log4j的代码在GitHub上挂了八年,star数几千,可真正一行行读过的,恐怕不超过两位数。多数人装完依赖就完事,压根不关心里面写了啥。这就像住在一栋大楼里,消防通道常年锁着,但没人抱怨,因为大家都觉得“反正别人会检查”。

更麻烦的是,漏洞修复本身也是场赌博。Log4j官方出了个补丁,结果没修干净,攻击者换个姿势又能打进去。后来又补了一版,倒是堵住了,可性能掉了20%。很多公司急着升级,升级完发现业务系统崩了——日志格式变了,老代码不兼容。于是有人干脆不升了,把漏洞地址屏蔽了事。这种“临时堵漏”在圈子里太常见了,就像漏水的水管,先拿胶带缠上,等下次爆了再说。

我见过最离谱的一次,是某银行的安全团队,为了排查Log4j影响,手动翻了几百个jar包,最后发现有个内部工具用了旧版本,但那个工具压根没人维护了。他们只能写个脚本,每天定时把日志里可疑的JNDI字符串删掉。这算什么?用人工智障对抗黑客?可现实就是这样——开源漏洞的修复,常常不是技术问题,而是管理问题。谁负责?谁出钱?谁担责?没人说得清。

说到底,开源软件是集体智慧的结晶,也是集体惰性的温床。我们用着免费的好东西,却很少想过它背后站着多少个不眠夜。Log4j事件之后,有些公司开始搞“软件物料清单”,把每个依赖的版本、来源、漏洞情况都记下来。听着挺专业,但执行起来,也就是个Excel表。真正能做的,无非是少用点花里胡哨的库,多看看更新日志,甚至——自己把核心依赖的源码翻一遍。虽然累,但比出事后再补救强。

反正那晚之后,我把项目里所有日志库都换成了原生实现。丑是丑了点,但至少我知道里面每一行代码是谁写的。

分享到: