说一件有意思的事情,我当时选择职业方向的时候其实有另外一个选择,就是选择成为一个DBA,最近在学习大模型的时候我突然出现了啊哈时间,发现过去所学的知识出现了令人惊讶的串联,与大家分享。
一、大模型对软件研发的影响
通过与多位前后端开发同事的聊天得知:大模型写代码不仅方便还能避免代码中的一些常见错误。
我当时观看了一下同事的操作后,猜测5年后低级程序员估计就没饭吃了。结果同事直接回了一句:不用5年,3年就差不多了。
仔细想一想,编写的程序本质就是对用户的业务需求转化成了对包括结构化或非机构化数据等各类数据的增删改查。
如果说汇编是技术视角下最底层的语言,那么增删改查的sql就是业务视角下最底层的语言。
二、从应用安全想到的
我是做应用安全的,我最看好的技术就是rasp技术,核心原因是rasp对api函数进行出入参校验和上下文行为校验。相比较waf只能对流量校验输入输出,waf不仅仅颗粒度较粗而且无法获取应用行为数据,所以rasp是我很长一段时间的学习对象。
在学习rasp的时候我首先关注的就是sql注入漏洞,因为rasp可以直接获取到各种api解析后的sql内容,所以rasp能无视掉很多针对waf设计的绕过手段。参照我以前的文章 使用阿里 Druid 实现应用级waf 我当时就感受到正则就是一种模型,能够拟合一些sql注入但也会拟合到一些正常业务数据而产生误报,也会因为不够拟合导致一些变异的sql语句产生绕过。而语义分析则是更好的模型,语义分析把外部输入进行ast语法树解析,通过对语法树进行检索可以更好的发现恶意攻击。
那如果说sql漏洞涉及到应用与外部环境的交互,那么反序列化漏洞则是我认为的内生型漏洞。内生型漏洞有一个很大的特点就是应用除了和攻击者做交互外,应用不需要与硬盘、数据库、ui等外部数据做过多交互。有天晚上我骑车回家时思索到:一个java应用也可以看作是一个数据库,因为对外部输入不够严格,外部攻击者可以输入有害的数据,而有害数据的语义可以让应用本身执行有害的java代码。
我们来看看漏洞的定义:漏洞是在硬件、软件、协议的具体实现或系统安全策略上存在的缺陷,从而可以使攻击者能够在未授权的情况下访问或破坏系统。如果把访问看成是sql查询,破坏看成是增删改,再联想到反序列化是注入java、sqli是注入sql、xss是注入js、利用越权删除php的sqli防护文件再sqli后上传webshell。。。那么就可以推断出:一套系统中的每个程序实例都是一个“数据库”,攻击者利用漏洞的底层逻辑是:利用“数据库”的缺陷对“数据库”进行增删改查。
三、各类防护产品的原理想到的
sqli防护:对输入sql进行Parse后得到ast语法树(数据库),再对语法树进行检索以判断是否存在恶意行为。
xss防护:同样对输入进行Parse后得到语法树(一般都是一个json对象也是一个数据库),然后判断渲染结果是否存在恶意行为。
静态杀毒:对PE文件或ELF等文件格式进行Parse后得到一个数据库后进行特征码匹配,因为文件格式复杂也往往是不同文件节匹配到不同规则后记不同分数,达到一个分值判定为恶意文件。
动态查杀(edr):不论是主动防御或者异常行为分析,都是通过搜集系统指定时间段的综合行为形成一个“数据库”,通过对该数据库进行进行检索以匹配历史搜集到的恶意样本。这个搜集再处理过程就是极为类似于Parse,它将行为数据结构化为行为指纹,通过匹配历史恶意行为指纹即可发现隐藏较深的变形样本,动态查杀对比静态查杀的优势类似于rasp对比waf。
四、总结
网安这一行和大数据工程师其实差别不是太大,都是通过对数据的搜集形成一套数据库,之后不断的检索和升级把恶意阻挡住。
仔细想想,我们做人也好做事也罢,不也是如此:-)
希望本文能激发大家对网络安全甚至世界本质解构的欲望,当你可以参考历史而看到事物的发展的脉络从而把握事物的本质,就可以轻而易举的举一反三。