漏洞有什么
2021年冬天,漏洞Log4j那个漏洞爆出来的漏洞时候,我正蹲在工位上啃三明治。漏洞手机开始震,漏洞群消息一条接一条,漏洞运维那边已经在骂娘了。漏洞一个打印日志的漏洞Java库,平时谁拿正眼看它?漏洞结果它把全球一半的服务器拖下了水。那天晚上我没回家,漏洞盯着屏幕改配置改到凌晨三点,漏洞心里就一个念头:这东西平时藏在哪,漏洞怎么突然就咬人了。漏洞 漏洞不是漏洞"错误"。错误是漏洞你写代码时打了个错字,程序跑不起来,漏洞编译器直接甩你一脸红字。漏洞不一样,它安安静静地待在那儿,程序跑得好好的,测试全绿,上线半年没人发现。直到某天有人输入一串精心构造的字符,整个系统就像被人从内部拧开了阀门。 我见过最离谱的一个漏洞,出在一个电商项目的优惠券逻辑里。前端做了校验,后端也做了校验,看起来没毛病。但后端校验用的是浮点数比较—— 你看,漏洞的根源往往不是"写错了",而是"想漏了"。开发者脑子里的模型和真实运行的模型之间有缝隙,攻击者就钻这个缝。 常见的漏洞类型其实不算多。注入类,SQL注入、命令注入,本质是把用户输入当代码执行了。越权类,水平越权、垂直越权,本质是权限检查没做到每个入口。反序列化,本质是信任了不该信任的数据。还有逻辑漏洞,这类最难防,因为代码本身没写错,是业务流程的设计有缺陷。 每种漏洞背后都是人的思维盲区。SQL注入存在了二十多年,到现在OWASP Top 10里还有它。为什么?因为总有新人用字符串拼接写SQL,总有老项目没人重构。工具能扫出一部分,但扫不出逻辑漏洞。一个"修改密码时没有验证旧密码"的漏洞,扫描器根本看不懂,只有人去看代码才能发现。 说个具体的数据。CVE数据库里2023年新增了两万八千多个漏洞编号,平均每天七十多个。这还只是被收录的。大量中小项目里的漏洞根本没人上报,悄悄被利用,悄悄被修复,或者一直没修复。 我自己的习惯是,每次写完一个涉及用户输入的功能,先问自己三个问题:这个输入能不能变成代码?这个输入能不能绕过我的检查?这个输入到了下游组件里会被怎么处理?三个问题过一遍,能挡掉大部分低级漏洞。高级的?高级的靠代码审计和安全测试,靠人盯着。 漏洞这东西,说到底不是技术问题,是人的问题。写代码的人累了、赶进度了、想当然了,漏洞就出来了。它不会消失,只会换个地方冒出来。你能做的,就是比昨天多留一个心眼。if (discount == 0.3)。0.3在二进制里是无限循环小数,永远不等于字面量0.3。结果呢?用户把优惠券金额改成0.30000000000000004,校验通过,一块钱买走一台电视。这个bug在代码里躺了四个月,直到有个羊毛党发现了它。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-