Unlink



unlink是大名鼎鼎的heap based漏洞,虽然glibc不断对unlink宏的安全性进行加固,但是Unlink依旧能够实现较好的漏洞利用效果,在新版本下使用unsafe-unlink最终能够达到arbitrary 4 bytes mirrored overwrite的效果。

Continue reading

FORTIFY_SOURCE



0. Introduction

2004年9月,RedHat的几位软件工程师提交了一个针对GCC和GLibc的新补丁,其作用是为内存和字符串函数提供一种轻量级的缓冲区溢出保护机制。它可以通过定义\(\_FORTIFY\_SOURCE\)标志来配置,因此常被称为\(FORTIFY\_SOURCE\),在目前主流的linux操作系统中都能够见到他的身影,包括Ubuntu,Feroda,Redhat,Centos等等……并且\(FORTIFY\_SOURCE\)在安卓平台有着更为广泛的应用,这可能与安卓特殊的管理机制有关

在该补丁的官方描述中,我们能够得到作者对这个patch的部分描述:

The intent of this patch is to add some checks that have no or non-measurable runtime overhead, so something that can be enabled for all programs and libraries in an operating system.

The patch certainly doesn’t prevent all buffer overflows, but should prevent many common ones. It works by computing a constant (conservative) number of bytes remaining to the end of object(s) each destination pointer passed to memory and string functions, if possible checking for overflows at compile time, if not possible passing that constant size to special checking alternatives of the memory/stringfunctions.

when the above GCC 4.0+ and -D_FORTIFY_SOURCE=1 is used at optimization level 1 and above, security measures that shouldn’t change behaviour of conforming programs are taken. With -D_FORTIFY_SOURCE=2 some more checking is added, but some conforming programs might fail.

基本总结如下:

  1. FORTIFY_SOURCE是一种对缓冲区溢出以及格式化字符串的轻量级的保护机制 ,但并不是所有类型的缓冲区溢出都可以用这个它来检测
  2. 它保护C和C ++代码
  3. 没有大量的运行时的开销,不会影响到系统的性能
  4. 这种保护机制并不仅仅够应用于glibc,只要将相应的头文件string.h,stdio.h打上补丁,也能够实现这种保护,在gcc中由于它使用了-D_FORTIFY_SOURCE来开启保护,因此得名

Continue reading

NX & ASLR



0. Introduction

谈起ASLR与NX,就不得不提到他们的前身,Pax
在wiki上,对Pax的定义如下:

PaX is a patch for the Linux kernel that implements least privilege protections for memory pages. The least-privilege approach allows computer programs to do only what they have to do in order to be able
to execute properly, and nothing more.

但是由于各种原因,Pax并没有能够完全应用在linux的内核中,致力于内核安全的开发者结合Pax的思想,不断的尝试把PaX的代码分拆成小的patch提交给Linux内核社区,最终也就出现了现在我们所熟知的ASLR/RELRO/NX/CANARY/FORITY/PIE等保护技术

Continue reading

PIE && ALSR


0. Introduction

这是PIC与PIE在wiki上给出的解释,同我们熟知的PLT与GOT一样,PIE与PIC也是linux下的一对姊妹花

In computing, position-independent code (PIC) or position-independent executable (PIE) is a body of machine code that, being placed somewhere in the primary memory, executes properly regardless of its absolute address.

PIC指的是位置无关代码,PIE是地址无关可执行程序

现代的GNU/Linux以及ELF系统可以随机化shared library的加载地址,这种技术叫做: ASLR. libc肯定是PIC,也就是说可以被加载 在任意地址,而且可以在各个进程之间共享已经加载入RAM的代码段.加载地址的随机化使依赖固定地址的攻击(BOF)变得难以进行.

虽然ASLR可以随机化shared library的加载地址,但是ELF可执行文件在由linker处理的时候被分配了一个固定的入口地址(在i386下是一个略大于0x08048000的值,在x86_64是一个略大于0x4000000的值),这样就提供了Attackdr 一个地址范围,根据应用程序的偏移就可以计算出应用程序加载内存中的实际地址
如果把分配入口的权限的给了kernel,那么kernel就可以给main executable 一个随机的入口地址,而linker需要生成Position Independent Executable或PIE,这样很大程度上可以解决一大类的安全问题.

基于这样的考虑,就出现了PIE保护技术,让应用程序的地址也同libc一样随机化,进一步提高Attacker的攻击难度

Continue reading

RELRO



0.Introduction

linux下的有两个著名的函数表Or姐妹花,plt表,got表,他们分别称位进程连接表与全局描述表

其中,GOT表在lazy binding后储存的是函数的真实地址,Got.plt中存放的全局变量的偏移地址
在Attacker的攻击过程中,经常能够获得任意地址写的权限,很多情况下都会选择修改got表中内容来hijack control flow,这种相关类似的攻击手段被称之为hijack Got或者GOT overwrite attack
由于Got表中存放的是非常关键的信息,所以如何能够保护好Got表,成为了一个重要问题
RELRO保护为此而生,它是一种比较古老的技术,至少2008年之前就已经进入了upstream
其全称为RELocation Read-Only,重定位表只读技术

Continue reading

Canary



0.Introduction

由于stack overflow而引发的攻击非常普遍也非常古老, 相应地一种叫做canary的 mitigation技术很早就出现在gcc/glibc里, 直到现在也作为系统安全的第一道防线存在。

canary不管是实现还是设计思想都比较简单高效, 就是插入一个值, 在stack overflow发生的 高危区域的尾部, 当函数返回之时检测canary的值是否经过了改变, 以此来判断stack/buffer overflow是否发生.

Canary与windows下的GS保护都是防止栈溢出的有效手段,它的出现很大程度上防止了栈溢出的出现,并且由于它几乎并不消耗系统资源,所以现在成了linux下保护机制的标配

Continue reading

ROP



ROP的全称为Return-oriented programming(返回导向式编程),这是一种高级的内存攻击技术可以用来绕过现代操作系统的各种通用防御(NX,ASLR)。
ROP是一种攻击技术,其中攻击者使用堆栈的控制来在现有程序代码中的子程序中的返回指令之前,立即间接地执行精心挑选的指令或机器指令组。
因为所有执行的指令来自原始程序内的可执行存储器区域,所以这避免了直接代码注入的麻烦,并绕过了用来阻止来自用户控制的存储器的指令的执行的大多数安全措施。
因此,ROP技术是可以用来绕过现有的程序内部内存的保护机制的。

Continue reading