【车联网】CheckSec查看二进制文件安全属性
基础使用
apt-get install checksec安装
1 | # checksec -h |
常见用法:
1 | checksec --file=/path/file //查看单个程序安全属性 |
安全属性
RELRO-GOT 写保护
RELRO代表重定位只读(Relocation Read-Only)。可执行链接格式(ELF)二进制文件使用全局偏移表(GOT)来动态地解析函数。启用 RELRO 后,会设置二进制文件中的 GOT 表为只读,从而防止重定位攻击
- Partial RELRO,代表启用了RELRO 属性中的一个属性
- full,代表启用了所有属性
- no relro,代表没有启用属性
STACK CANARY
Canary 是放置在缓冲区和 栈(stack) 上的控制数据之间的已知值,它用于监视缓冲区是否溢出。当应用程序执行时,会为其分配两种内存,其中之一就是 栈。栈是一个具有两个操作的数据结构:第一个操作 push
,将数据压入堆栈;第二个操作 pop
,以后进先出的顺序从栈中弹出数据。恶意的输入可能会导致栈溢出,或使用特制的输入破坏栈,并导致程序崩溃
- Canary found,代表开启了防止栈溢出
- No canary found,代表没有开启防止栈溢出
NX-堆栈禁止执行
NX 代表 不可执行(non-executable)。它通常在 CPU 层面上启用,因此启用 NX 的操作系统可以将某些内存区域标记为不可执行。通常,缓冲区溢出漏洞将恶意代码放在堆栈上,然后尝试执行它。但是,让堆栈这些可写区域变得不可执行,可以防止这种攻击
- NX enabled,代表启用了NX属性
- NX disabled,代表禁用了NX属性
PIE-位置无关可执行文件
位置无关可执行文件(Position-Independent Executable)(PIE),顾名思义,它指的是放置在内存中某处执行的代码,不管其绝对地址的位置,即代码段、数据段地址随机化(ASLR)
- PIE enabled,开启随机化
- No PIE,没有随机化
RPATH/RUNPATH-运行时环境变量
程序运行时的环境变量,运行时所需要的共享库文件优先从该目录寻找,可以fake lib造成攻击
- No RPATH/No RUNPATH,没有环境变量
- RUNPATH,存在环境变量
Symbols-符号
在编译期间,某些 符号(symbols)包含在二进制文件中,这些符号主要用作于调试。开发软件时,需要用到这些符号,来调试和修复错误。
这些符号通常会从供用户普遍使用的最终二进制文件中删除。删除这些符号不会影响到二进制文件的执行。删除符号通常是为了节省空间,因为一旦符号被删除了,二进制文件就会稍微小一些。在闭源或专有软件中,符号通常都会被删除,因为把这些符号放在二进制文件中,可以很容易地推断出软件的内部工作原理
- No Symbols,符号已去除
- 45824 Symbols,代表存在45824个符号,符号未去除
FORTIFY-源码级别保护机制
这是一个由GCC实现的源码级别的保护机制,其功能是在编译的时候检查源码以避免潜在的缓冲区溢出等错误。
一些敏感函数如read,fgets,memcpy,printf等等可能导致漏洞出现的函数会替换成__read_chk,__fgets_chk等。这些带了chk的函数 会检查读取/复制的字节长度是否超过缓冲区长度,通过检查诸如%n之类的字符串位是否位于可能被用户修改的可写地址,避免了格式化字符串跳过某些函数如直接(%7$x)等方式来避免漏洞出现,开启FORTIFT保护的程序会被checksec检出。此外,在反编译时直接查看got表也会发现chk函数的存在,这种检查是默认不开启的,可以通过
- No,没有开启,默认状态,不算风险
- Yes,开启了保护机制
SECCOMP
Seccomp(全称 Secure Computing Mode)是 Linux 内核中的一项安全功能。它的目的是限制一个进程中所能使用的系统调用,以降低攻击者利用该进程对系统造成损害的风险。当启用 Seccomp 后,每个进程都有自己的调用规则集,其中定义了该进程中允许或禁止的系统调用及其参数范围。如果某个进程尝试使用被禁止的系统调用,那么内核将立即终止该进程并记录一条错误消息
- Seccomp BPF,用于限制进程能够进行的系统调用。它允许进程在运行时安装一个 BPF 过滤器程序来控制进程的系统调用,从而提高整个系统的安全性。这可以防止恶意软件对系统进行攻击,并且可以在不影响正常程序执行的情况下提高系统安全性