人参与 | 时间:2026-10-17 06:52:10
- 软件漏洞通常是软件由于程序员的“思维惯性”造成的。不是漏洞写错一行语法那种低级错误,而是通常大脑默认“这样写肯定没问题”的瞬间判断。2014年曝出的由于Heartbleed漏洞,本质就是程序程序员在实现心跳协议时,习惯性地相信了用户输入的软件长度字段——他默认对方会诚实报数,结果攻击者说“我要读64KB”,漏洞服务器就真的通常把内存里64KB数据吐了出去。那个补丁只有一行代码,由于但这一行,程序隔开了“能用”和“安全”。软件 我见过最典型的漏洞惯性,是通常处理字符串时默认“名字不会超过20个字符”。老一代C程序员都这么写:`char name[20]`,由于然后`strcpy`。程序二十年前这很合理,因为当年的人名确实短。可现在有人叫“阿卜杜勒·拉赫曼·本·阿卜杜勒·阿齐兹·阿尔·沙特”,你猜怎么着?缓冲区溢出,攻击者借机改写返回地址,整个服务器沦陷。程序员不是蠢,他只是没想过有人会叫这么长的名字。 另一种惯性更隐蔽——对“正常流程”的迷恋。写登录功能时,程序员脑子里只有一条路径:输入账号→查数据库→比对密码→登录成功。至于“密码错误五次后该怎样”“账号被锁定时还能不能试”“重置密码的链接能不能反复用”,这些分支被归为“异常情况”,往往丢给一个笼统的`else`。可攻击者最爱走的就是这些边角料路径。2017年Equifax泄露1.4亿用户数据,就是因为一个开源框架的“文件上传”功能里,有个补丁没打上——那个漏洞藏在“允许上传头像但限制文件类型”的逻辑缝隙里,正常用户永远碰不到,但扫描器一秒钟就能试出来。 还有个大家不爱承认的原因:赶工。不是那种“今天加班明天上线”的赶工,而是“这个功能下周必须演示给投资人看”的赶工。我认识一个做支付系统的朋友,他说他们当年上线时,把“金额校验”写在了前端JavaScript里,后端接口裸奔了三个月。因为后端要接银行API,排期排到下个季度,前端先做了个假校验应付演示。结果黑客直接绕过浏览器,用curl发请求,一分钱没花买了台电视。后来查日志,发现攻击者用的就是他们自己写的API文档——那文档写得太详细了,连参数类型都标好了。 当然,也有纯粹是懒。比如复制粘贴代码时不改变量名,把`user_id`粘到`order_id`的位置上。这种错误低级到可笑,但GitHub上随便搜个开源项目,issue区全是这种。我见过最离谱的,是有人把生产环境的数据库密码硬编码在代码里,然后推到公开仓库。他当时大概想的是“反正没人看这个仓库”——结果三天后,他的数据库被删了,勒索信就留在服务器根目录。 说真的,软件漏洞很少是天才黑客攻破的,多数时候是程序员自己留了扇后门,然后假装它不存在。那扇门可能是“这个接口只内部用”,可能是“用户不会传负数”,也可能是“先上线再补”。等到出事那天,大家翻代码,发现罪魁祸首就一行注释:`// TODO: 这里需要加校验`。而那个写注释的人,可能已经离职两年了。 顶: 354踩: 223
评论专区