Skip to main content

漏洞的本质

漏洞的本质

计算机世界其实都是基于不同的协议运行的,比如说二进制方向,就有abi之类的,在web方面,就是http协议,tcp协议等等,但是本质上,服务端(不一定是服务器,更抽象一点还可以是一个c语言函数),他们接收到用户的输入,然后他们根据某种约定/协议利用输入(包括解析),产生输出,如果这部分代码存在问题,就说这个代码存在漏洞

上述其实是显然的,但是如果我们go deeper去追根溯源,其实本质上就是一个问题和表达这个问题的语言的能力不匹配

我们先从“这个问题”开始,比如说这是一个正则表达式解析的问题,用户给一个正则表达式,然后再给一个输入串,程序判断输入串是否满足这个正则表达式(协议),我们知道,正则表达式在理论上等价于一个NFA机器,然后一个NFA可以转化为一个DFA,然后这个问题就解决了,我们需要创造出一个DFA,然后就可以判断任何输入是否符合文法

然后我们再看一下解决这个问题的语言,比如说C语言,使用C语言描述一个DFA,基于我贫瘠的编译原理知识,文法是分级的,也就是说上下文无关文法可以表达的东西要大于正则表达式所能表达的东西,而C语言能表达的东西更多(他是图灵完备的),所以其实就是程序猿使用一个图灵完备的语言表达一个他的一个小子集,DFA,他们本质上就是不等价的,所以程序员如果存在疏漏,就很容易写出超出DFA的其他诡异状态,所以我说这是漏洞的本质

那么假如,我要是能创造出一个语言,提供一层抽象,让程序员只能写出DFA所能表达的东西呢(emm还是正则表达式,所以他已经存在了其实),但是正则表达式还是太弱了,如果有一个语言他能分级,即如果你选择让他表达一个层次的东西,他会对更高层次的东西报错,这样,只要你能对你的问题作出抽象并选择正确层次的语言能力去正确表达这个问题,按理来说,就能写出没有问题漏洞的代码