热点

漏洞添加

时间:2010-12-5 17:23:32  作者:焦点   来源:知识  查看:  评论:0
内容摘要:凌晨两点十七分,我盯着屏幕上那行红字——`SEV-1: 生产环境RCE漏洞确认`——咖啡杯沿的指纹已经干成了白圈。这不是第一次了。三个月前,同一个系统,同一个参数,只是换了个编码方式,数据就穿透了过滤

凌晨两点十七分,漏洞添加我盯着屏幕上那行红字——`SEV-1: 生产环境RCE漏洞确认`——咖啡杯沿的漏洞添加指纹已经干成了白圈。这不是漏洞添加第一次了。三个月前,漏洞添加同一个系统,漏洞添加同一个参数,漏洞添加只是漏洞添加换了个编码方式,数据就穿透了过滤层。漏洞添加

漏洞从来不是漏洞添加被“发现”的,它们是漏洞添加被人“添加”进去的。这句话我从前不信,漏洞添加直到我亲手在代码里埋过雷。漏洞添加

去年Q3,漏洞添加业务方催着上线一个文件预览功能。漏洞添加需求写得很简单:“支持PDF和Word。漏洞添加”我看了眼排期,后天就要发版。于是偷了个懒,没有用白名单校验扩展名,而是直接调用了系统自带的`file`命令去识别MIME类型。测试的时候一切正常,PDF能开,Word也能开。上线第三天,安全组发来告警——有人上传了一个伪装成PDF的PHP脚本,`file`命令被绕过了,脚本在服务器上跑了起来。

那个漏洞不是我写的,是我“省”出来的。每一行注释掉的边界检查,每一个“先这样,后面再补”的TODO,都是在给未来的攻击者递梯子。

更隐蔽的添加方式发生在依赖层。上周审计一个老项目,发现`lodash`版本停留在4.17.15,而它早在两年前就被爆出原型链污染漏洞。没人主动去加这个漏洞,它只是躺在`package.json`里,像块沉默的礁石,直到某个深夜被潮水淹没。修复很简单,升级一个版本号。但没人愿意动它——因为升级可能带来不兼容,不兼容就要改业务代码,改业务代码就要加班。于是漏洞就这么“被保留”着,成为系统里最稳定的存在。

还有一种添加,是架构层面的。微服务拆分时,为了省事,把认证逻辑写在了网关层。当时觉得天经地义——所有请求都过网关,还能漏了谁?直到某个内部服务为了调试,直接暴露了不带鉴权的健康检查端口。攻击者顺着这个端口摸进去,发现服务间通信用的是明文HTTP。那一次,漏洞不是被写出来的,是被“默认信任”堆出来的。

说回那个凌晨的SEV-1。我打开日志,看到攻击payload是一串经过三次URL编码的SQL注入语句。追溯源头,发现是三个月前我重构查询逻辑时,把参数化查询改成了字符串拼接——因为当时急着处理一个性能瓶颈,觉得“这个参数是内部传的,不会有人能控制”。你看,每个漏洞背后都有一个“当时觉得没事”的瞬间。

修复漏洞的补丁通常只有几行。但真正的补丁,是承认自己会偷懒、会侥幸、会在压力和疲惫面前选择最短路径。我在团队周会上把那个凌晨的日志投影出来,没讲什么大道理,只说了一句:“以后谁再说‘先上线再说’,我就让他看看这个payload。”

漏洞会一直存在,因为写代码的人永远在和时间赛跑。但至少,我们可以在提交代码前多问自己一句:如果这个函数被公开到公网,如果输入来自陌生人,如果今天是周五晚上——我还会这么写吗?

答案要是“会”,那漏洞不是被发现的,是被你亲手添加的。

最近更新
热门排行
copyright © 2026 powered by 力不从心网   sitemap