以色列终于放了大招了。数千部BB机同一时间爆炸。让一个神秘部门又一次出现在大众视野:
不是007啊,旁边的两代007只是气氛组,为了烘托氛围。看中间的古西伯来文,这个神秘情报组织就是:摩萨德。传说中上天入地,无所不能。这一次遥控传呼机(BB机)爆炸,打击珍珠党,牛啊。但是吧,这种技术要说也不神秘,22年前,也就是2002年,《警察技术》中(应该是个杂志吧),某市公安局刑警总队就已经分享了这样的技术:
摩萨德,比起人民警察,也不过如此吧。不过,无论如何,这次“摩萨德BB机远程爆炸”事件,又给我们敲了下警钟。今后肯定会更加重视从硬件到软件的安全,特别是基础软件。近日某数据库,爆出网络接口存在缓冲区溢出漏洞:
这个造成的问题,虽然视觉效果不如摩萨德的爆炸,但危险程度可一点不比炸个BB机差。因为此数据库据自己的数据纰漏,它主要针对Oracle替代,广泛用于党政军系统。党政军啊,这那是数据库啊,这是在我们内部安装的定时炸弹。
在国产数据库技术上大发展的时代,似乎很少有关注数据库的缓冲区溢出、针对数据库的侧信道攻击和rowhammer漏洞攻击,等等高端的黑客技术和数据库内核结合的问题。
我们今天先从比较基础的缓冲区溢出开始,以PG的网络模块为例,分析下PG是否存在缓冲区溢出的可能?如何检查确认,以及在Coding时如何避免缓冲区溢出。
避免缓冲区溢出,既是避免给以后埋雷,也能出于防御性编程的目的,悄悄的在代码中埋个缓冲区溢出的雷,这多高大上啊。
不看这篇文章的人,还看不出来你埋了雷。就算看出来了,你也可以说:“我不懂啊,我也不知道这会造成缓冲区溢出啊……”
然后,你可以像摩萨德一样,在需要的时候,远程引爆你的“雷”。
所以,除了干粑粑的讲述,本文会有一个类似“Hello
World”的示例,让你亲手缓冲区溢出一回,感受一下黑客的魅力。
序言的最后,不要忘了我们的主题,PG是否存在缓冲区溢出的可能?如何检查确认?如何在做数据库内核开发时,避免缓冲区溢出。
正文开始:
先普及下什么是“缓冲区溢出”,它的目的是什么?
目的,不就是能控制你的电脑,然后挖矿、木马、盗取数据信息吗?
这样说是没问题的,但太笼统了。
“冲区溢出”的目的,是取得电脑的控制权。
怎么取得控制权呢?
具体而言,就是要让电脑执行你所想让它执行的指令。
打个比方,本来按继定程序,电脑要执行指令A、指令B、指令C、指令D、……
结果,在执行完指令A后,开始执行你想让它执行的指令序列:指令Z、指令Y、指令X、指令W……
这就是“缓冲区溢出”漏洞的目的,一句话总结,让CPU转去执行你的指令流。
这如何实现呢?
现代CPU中,有一些晶体管组成的存储单元,每个这样的存储单元可以存储64位(二进制位)数据,它们被称为register(寄存器,很多人看到寄存器就发怵,其实就是CPU内的存储单元)。
Register的物理构成我们不需关心(因为我也不知道,想从沙子冶炼硅的,可自行了解),这些Regsiter中,有一个和我们今天的话题有关:Instruction
Pointer Register,简称IP寄存器。
IP寄存器的作用很简单,它记录CPU下一条要执行的指令的位置。
以上面的例子为例,本来CPU要执行的指令流是指令A、指令B、指令C、指令D、……,如下图:
图1中,CPU正在执行“指令A”,IP寄存器的值为“指令B”。
CPU执行完成指令A后,按IP寄存器所指,开始执行“指令B”,这就对应图2,此时IP寄存器值变为“指令C”。
以此类推,等等,……
现在,如果想在执行完指令A后,让CPU转去执行指令Z,只需要在执行指令A后,把指令Z的位置、写入IP寄存器即可,如下图:
图1中,在执行指令A时,IP寄存器被改为了指令Z。
这件事说起来挺简单,就像把大象放进冰箱中一样,打开冰箱门,把大象放进冰箱,关上冰箱门。但对于现代CPU来说,却是一个几乎不可能完成的任务。
IP寄存器一旦被修改,就如同人被洗脑了一样,或者说,更准确说,是思想入侵。CPU会去做自己本来不该做的事。嗯,这和鬼上身好像挺像的。
CPU本来执行某程序的指令流,怎么可能突然IP寄存器被改了呢!这就好像Jack Ma本来的日程安排是,起床、吃饭、去外滩开会、演讲、抨击银行都是当铺、吃中午饭、……
但你让他大脑中突然多了个想法,给你的支付宝转亿点钱。
想想也知道,这不可能。
但是,人和CPU,都有漏洞。把想法植入别人的大脑,并不是不可能:
好,第一篇就到这里吧。下一篇,我们继续盗梦空间、植入想法。。。
评论
