上周面试了六个安全工程师,代码简历上都写着“精通代码审计”,审计实际聊下来,招聘能说清楚php反序列化链构造的代码只有两个。其中一个还是审计靠背漏洞库蒙对的。这行缺人,招聘但更缺能干活的代码人。
我们团队招代码审计,审计不看CTF排名,招聘不问你挖过多少CNVD。代码就一条:给你一套源码,审计三天内找出至少一个能实际利用的招聘高危漏洞。有人觉得这要求高了,代码其实真不高。审计大部分开源CMS的招聘过滤函数写得很随意,比如这个:
function check($str) { $black = array('select', 'union', 'and', 'or'); return str_replace($black, '', $str); }一眼就能绕过。双写、大小写、内联注释,哪个都行。但面试时我让候选人现场审这段,五个人里有三个说“过滤了关键字,安全”。我当场把payload写出来,他们才反应过来。
代码审计的核心不是找漏洞,是理解业务逻辑。去年审一个电商系统,订单金额字段在数据库里是decimal,但PHP接收时用了intval。0.99元变成0,下单成功。这漏洞用扫描器扫一万年也扫不出来。你得一行行看代码,看数据怎么从HTTP请求流到SQL语句,中间经过了哪些函数,哪个函数在特定场景下会失效。
还有一次审个金融系统,权限校验写在控制器基类里,看着挺规范。但有个接口重写了基类方法,忘了调parent::__construct()。普通用户直接访问管理员功能。这种漏洞,只有把整个调用链画出来才能发现。
工具当然要用。RIPS、Fortify、CodeQL,我都用。但工具报出来的结果,80%是误报。剩下20%里,真正能利用的不到一半。关键还是人脑判断。比如CodeQL查SQL注入,它只看数据流有没有经过过滤函数。但过滤函数写错了呢?它不管。你得自己跟进去看。
招人的时候,我特别看重一个习惯:拿到代码先看入口文件和配置文件。入口文件决定了哪些参数可控,配置文件决定了数据库账号权限。有人上来就翻控制器,翻半天不知道参数怎么传进来的。这效率太低了。
还有个细节。面试时我会问:你审代码时,遇到加密函数会怎么办?好的回答是:先看密钥怎么生成,再看加密模式,最后看有没有硬编码。差的回答是:直接跳过,反正解不开。跳过加密函数的人,永远发现不了密钥泄露漏洞。去年有个案例,某系统用AES加密用户ID,密钥写死在代码里。攻击者拿到源码就能伪造任意用户身份。这漏洞就藏在加密函数里。
薪资方面,初级代码审计工程师15-25K,能独立审中小型项目的25-40K。资深的,能带团队做SDL流程的,50K往上。但钱不是重点。重点是这工作有意思。每套代码都是个谜题,漏洞藏在逻辑缝隙里。找到了,写报告,复现,修复。整个过程像破案。
如果你想来,简历上别写“精通”。写你审过什么项目,用了什么方法,发现了什么漏洞,怎么修复的。哪怕只有一个小项目,只要讲清楚细节,比写十个“精通”都管用。
简历发我邮箱,附上你最近审过的一段代码和你的分析笔记。别发PDF,发markdown。我要看你的思考过程,不是排版。
顶: 5踩: 17832






评论专区