Grsecurity 增强包 PaX
控制PaX标志(paxctl)
Paxctl是一个用户空间实用程序,用于控制可执行文件的PaX标志。
安装
从PaX网站http://pax.grsecurity.net/下载最新版本。 在我们的例子中,我们下载了paxctl-0.7.tar.bz2。 Paxctl包未签名。 切换到下载程序包的目录并运行以下命令。
$ tar xjf paxctl-0.7.tar.bz2
$ cd paxctl-0.7
$ make
$ su
# make install
完成:
将paxctl程序安装到/ sbin。
将paxctl的手册页安装到/ usr / share / man / man1。
如果需要更改其中任何一个位置,请修改Makefile。
用法:
# paxctl --help
PaX control v0.7
Copyright 2004,2005,2006,2007,2009,2010,2011,2012 PaX Team <pageexec@freemail.hu>
usage: paxctl <options> <files>
options:
-p: disable PAGEEXEC -P: enable PAGEEXEC
-e: disable EMUTRAMP -E: enable EMUTRAMP
-m: disable MPROTECT -M: enable MPROTECT
-r: disable RANDMMAP -R: enable RANDMMAP
-x: disable RANDEXEC -X: enable RANDEXEC
-s: disable SEGMEXEC -S: enable SEGMEXEC
-v: view flags -z: restore default flags
-q: suppress error messages -Q: report flags in short format
-c: convert PT_GNU_STACK into PT_PAX_FLAGS (see manpage!)
-C: create PT_PAX_FLAGS (see manpage!)
PAGEEXEC 内核将根据CPU的分页功能保护不可执行的页面。 在其他操作系统中,这有时称为“使用NX位标记页面”。 可以通过PaX -P和-p标志在每个ELF对象的基础上控制此功能。
EMUTRAMP 对于需要它们的进程,内核将模拟trampolines(即时编写的可执行代码片段),例如: C和一些JIT编译器中的嵌套函数。 由于trampolines尝试将进程本身写入的代码执行到PAGEEXEC或SEGMEXEC标记为不可执行的内存,因此PaX内核会终止。任何尝试使用它的进程。 EMUTRAMP允许这些进程运行,而无需完全禁用非可执行内存的强制执行。 可以通过PaX -E和-e标志在每个ELF对象的基础上控制此功能。
MPROTECT 内核将阻止通过各种技术将新的可执行页面引入正在运行的进程:它将禁止更改页面的可执行状态,或创建匿名RWX映射,或使RELRO数据页再次成为可写。 它基于每个ELF对象由PaX -M和-m标志控制。
RANDMMAP 对于没有通过MAP_FIXED变量指定的mmap()请求,内核将使用随机化的基址。 它由PaX -R和-r标志控制。
RANDEXEC 本地用户允许任何可以在系统上执行的程序和用目标程序的特权执行任意代码。
SEGMEXEC PaX中的grsecurity报告了一个漏洞。 本地用户有获得提升的权限。
样例
让我们查询为/ usr / bin / vi启用了什么(如果有的话)PaX标志:
# paxctl -v /usr/bin/vi
PaX control v0.7
Copyright 2004,2005,2006,2007,2009,2010,2011,2012 PaX Team <pageexec@freemail.hu>
file /usr/bin/vi does not have a PT_PAX_FLAGS program header, try conversion
paxctl无法显示标志,因为vi没有相应的程序头。 需转换标头并再次查询标志。
警告注意,paxctl不会为其修改的文件制作备份副本。 建议您备份要修改的二进制文件。
# paxctl -c /usr/bin/vi
file /usr/bin/vi had a PT_GNU_STACK program header, converted
# paxctl -v /usr/bin/vi
PaX control v0.7
Copyright 2004,2005,2006,2007,2009,2010,2011,2012 PaX Team <pageexec@freemail.hu>
- PaX flags: -------x-e-- [/usr/bin/vi]
RANDEXEC is disabled
EMUTRAMP is disabled
使用适当的程序头,我们可以查询和修改vi的PaX标志。
显示程序功能(pspax)
pspax程序显示您有权访问的所有程序的运行时功能。 它是pax-utils包的一部分。 Pax-utils可以在http://dev.gentoo.org/~vapier/dist/找到。 它包含许多用于PaX(https://en.wikipedia.org/wiki/PaX)的有用工具,但不像paxctl那样重要。pax-utils包由Hardened Gentoo Project维护。
pax-utils包提供的程序pspax - 显示您有权访问的所有程序的运行时功能。
scanelf - 打印特定于二进制文件的ELF结构的信息。
dumpelf - 将ELF文件转换为人类可读的C代码,该代码定义与原始ELF文件具有相同图像的结构。
有关更多信息,请参阅pax-utils的Gentoo Linux指南。
安装
从http://dev.gentoo.org/~vapier/dist/下载最新版本。 在我们的例子中,我们下载了pax-utils-0.4.tar.xz,这是撰写本文时
的最新稳定版本。 切换到下载程序包的目录并运行以下命令。
$ tar xJf pax-utils-0.4.tar.xz
$ cd pax-utils-0.4
$ make
$ su
# make install
安装过程执行以下操作:
将pspax,scanelf,dumpelf和scanmacho程序安装到/ usr / bin。
将README,BUGS和TODO文件安装到/ usr / share / doc / pax-utils /。
将pspax,scanelf和dumpelf的手册页安装到/ usr / share / man / man1。
如果需要更改任何这些位置,请修改Makefile。
用法
要显示所有可用的命令行开关,请运行pspax --help。 阅读手册页以获取更多详细信息。
$ pspax --help
* List ELF/PaX information about running processes
Usage: pspax [options]
Options:
-a, --all * Show all processes
-e, --header * Print GNU_STACK/PT_LOAD markings
-i, --ipaddr * Print ipaddr info if supported
-p, --pid * Process ID/pid #
-u, --user * Process user/uid #
-g, --group * Process group/gid #
-n, --nx * Only display w^x processes
-w, --wx * Only display w|x processes
-W, --wide * Wide output display of cmdline
-v, --verbose * Be verbose about executable mappings
-C, --nocolor * Don't emit color in output
-B, --nobanner * Don't display the header
-h, --help * Print this help and exit
-V, --version * Print version and exit
Pspax将单个节目的PaX标志显示为一串字符(例如“peMRS”)。 小写字符表示标志已禁用,大写表示已启用。 下面的表格显示了grsecurity使用的这些字符及其对应的PaX标志。 “详细信息”列包含指向每个标志的详细说明的链接。
pspax flag grsecurity's PaX flag Details
E PAX_EMUTRAMP emutramp.txt
M PAX_MPROTECT mprotect.txt
P PAX_PAGEEXEC pageexec.txt
R PAX_RANDMMAP randmmap.txt
S PAX_SEGMEXEC segmexec.txt
例子
命令pspax -p <process_id>显示有关特定进程的信息,由其PID标识。 您不可能碰巧知道或记住进程的PID,因此更容易通过名称引用它们。 下面的示例使用pidof命令查找进程的PID,然后将其传递给pspax:
# pidof inetd | xargs pspax -p
USER PID PAX MAPS ETYPE NAME CAPS_ATTR
root 1741 peMRS w^x ET_EXEC inetd =ep cap_setpcap-ep
破折号意味着libcrypto不需要可执行堆栈。 如果确实如此,该行将以大写“X”而不是破折号开头。
要查询系统中所有库的状态,请运行:
# find /lib /usr/lib -name '*.so.*.*.*' | xargs execstack
sysctl接口
sysctl命令提供用于在运行时修改内核参数的接口。 grsecurity内核配置中有一个选项可以支持此接口(请参阅配置grsecurity)。在Linux中,sysctl只是文件系统例程的包装器,用于读取和写入/ proc目录中文件的内容。这意味着您还可以通过将值回显到/ proc中的文件来设置参数。有关grsecurity的所有可用sysctl选项的列表,
用法
sysctl命令获取变量或变量=值对的列表,并设置或读取它们的值。变量是/ proc / sys中由句点或正斜杠分隔的文件的路径。该值取决于相关参数。大多数grsecurity的选项是1(启用)或0(禁用)。
Sysctl的手册页可在http://linux.die.net/man/8/sysctl上在线获取。
例子
如果您想了解grsecurity的每个可用运行时选项,请列出/ proc / sys / kernel / grsecurity的内容。
要在单个sysctl命令中启用装载审核和禁用chdir审核,请运行:
#sysctl kernel.grsecurity.audit_mount = 1 kernel.grsecurity.audit_chdir = 0
kernel.grsecurity.audit_mount = 1
kernel.grsecurity.audit_chdir = 0
可以通过回显来实现相同的结果:
#echo 1> / proc / sys / kernel / grsecurity / audit_mount
#echo 0> / proc / sys / kernel / grsecurity / audit_chdir