关于漏洞的若干思考

漏洞是由软件编程失误或者逻辑上存在缺陷等原因导致的。根据攻击切入点的不同,我将其分为系统层漏洞和web层漏洞。

其中系统层漏洞主要是针对内存的操纵(memory corruption),从而改变程序的代码(比如return address)或者关键数据(比如,函数指针列表、jump tables\function pointers\),另外,还有NULL pointer dereference,总之,要达到更改程序执行流程的目的。

如果还想分的话,就可以分为memory collsion(也就是执行路径交叉,use after free) 或者memory overlap(执行路径改变)。通过这种方式,可以劫持特权执行路径,达到提权及任意代码执行的目的。

web层的漏洞主要增加了由于传输或者接口调用增加的风险。



由于用户和内核空间之间的弱隔离机制,由高特权级至底特权级的直接转移是被允许的,比如由内核至用户空间,相反则不通。这就导致NULL pointer dereference攻击成为可能,当此类攻击成功时,可以通过将控制流由内核转移至用户进程,让普通用户进程以内核权限执行任意代码。


通过利用内存安全bug,攻击者可以部分或完全复写用户空间、 内核控制数据,比如return address、global dispatch tables and function pointers stored in kernel stack and heap。另外,有一些脆弱性问题,比如对用户输入的不正确过滤可以导致攻击者破坏任意内核内存,包括函数或数据指针。

1.劫持控制流,使其执行某一程序地址空间内的由攻击者提供或者已经存在的代码。这些攻击方法利用内存bug来改变间接分支指令的目标(ret、jmp或者call),以此来控制下一条待执行指令。

2.code reuse attack是利用脆弱进程地址空间内的代码,所以该方法不会限制其的运行权限

3.ROP是一种更高级的code reuse attack,其单纯地利用已有代码,便可以执行任意计算。

4.Non-Control-DataAttacks不是攻击代码指针,而是只攻击数据部分。比如,攻击敏感函数execve的参数,便允许攻击者执行任意程序。攻击者也可以攻击安全配置数据,致使安全检查失效。这类攻击可以达到两类目的:一是信息泄露,包括密码和秘钥、随机值等;二是权限提升,包括通过改变系统调用setuid参数的方式提权、更改apache servers的httpd.conf配置文件来更改用户权限或者根目录。

5.Control-FlowBending是Non-Control-DataAttacks的一种

攻击目标:

1.任意代码执行:攻击者可以执行任意代码,执行任意参数的系统调用,也就是说,攻击者可以执行应用程序所拥有的所有权限。

2.受限的代码执行:攻击者可以执行应用程序地址空间内的所有代码,但是不能使用全部的系统调用,只能调用一组受限的系统调用,比如,程序经常使用的系统调用,或者只要能满足将信息送回即可。这种攻击无法执行程序的所有权限。读取或者泄露受害程序的内存信息是可能的。

3.信息泄露:攻击者可以读取或者泄露任意的内存信息。


针对上述攻击类型,出现了多样的防护措施:

1.ASLR(Adress space location randomly):不会抵制信息泄露

2.DEP:抵制代码注入,但是不保护code reuse。

3.stack  canaries:抵制连续的、针对栈的、连续的overwrites。

这些防护措施可以分为两类:prevent-the-corruption 和 prevent-the-exploit。


相比于攻击用户程序,攻击内核更为困难,表现在:

1.攻击用户程序不会导致系统死机,最多会在日志当中留下痕迹;但是,攻击内核程序时,稍有不慎,便会导致整个系统处于不一致状态,导致系统死机;

2.内核通过软硬件方法来保护自己,这使得攻击之前的收集信息变得更为复杂、与此同时,攻击者的不可控因素也在急剧增加。

3.内核比较复杂,攻击需要的知识更多。所有的应用程序都是内核的消费者,因此,攻击者需要和其他应用程序竞争来影响内核。

你可能感兴趣的:(linux,操作基础)