拜读大牛Ulrich Drepper大作之Security Enhancements in Red Hat Enterprise Linux

读大牛Ulrich Drepper 关于企业级Linux开发所使用到的一些安全增强功能


关键点

  1. section 2 利用安全问题
    分为两类:
    • 远程, 这需要黑客能够利用网络等手段来远程的进行破坏, 相对来说比较容易出现的就是利用有问题的网络服务进行破坏,比如臭名昭著的buffer flow.
    • 本地, 如果黑客已经可以在你的本地利用操作系统提供的各种接口去做一些恶意的事情, 很难防范
  2. section 4 关于Exec-Shield
    Redhat实现了一个据称更强的类似于Pax及grsecurity的exec-shield.
    Exec-shield的一些内部机制:
    • 内核会被每个进程的stack进行一定程度随机偏移
    • procfs中的每个PID所对应的目录下的maps的信息只有对所有者有读权限
    • 把stack标识为non-executable
    • 为了能够不破坏既有的ABI及x86体系结构下有些程序对stack executable的需求, 更改了compiler和link, 使得它们能够动态的判断是否一个程序需要在stack上被执行, 从而增加了一个PT_GNU_STACK, 让kernel使用elf 头中新增加的这个标志记录来在初始化的时候决定合适的permission.
      文中的Appendix A有更详尽的讨论
    • 限制对内存的定址操作(locating the memory)
      像对stack的设计一样, 对于每个进程的可写内存都分配不一样的地址区间
    • 对可运行的段一样采用的random地址的机制
    • 介绍了关于x86 32bit体系结构下实现exec-shield的trick技巧.

  3. section 5 PIE 位置无关的可执行文件
    • RedHat通过修改compiler及linker使得可以编译出类似DSO的PIC的可执行程序
    • 引入了类似-fpic/-fPIC的-fpie/-fPIE的编译选项
    • Redhat及fedora有选择的部分可执行程序进行了PIE的convert

  4. section 6 对ELF Data的保护及增强
    通过分析重要elf文件中的section, 找出所有可写的section, 并判断是否有安全隐患(overflow之类)
    比如, .got是可写的, 它如果被hacker所攻击, 就会导致有些地址被错误的定位

    这里还必须注意, 虽然有.rodata section, 但是如果你定义的是一个const char* 数组, 由于它需要在执行时被linker重地位, 所有还是必须是可写的, 所以只能被编译器放在.data section

    ELF的所有section的排列都是历史原因, 没有考虑的安全因素, 所以其中一个section被破坏了, 也会导致接下来的section同样被破坏.

    Redhat引入了-z relro的编译选项来增加elf的安全性.

  5. 重要的两个Appendix
    A, 如何使用exec-shield
    B, 一个检测安全编程的script, 用以检查上述几点增强特性是否被使用

你可能感兴趣的:(system,linux,kernel,security,security,linker,compiler,redhat,linux,random)