所以,我有这三个审核日志条目
type=AVC msg=audit(1488396169.095:2624951): avc: denied { setrlimit } for pid=16804 comm="bash" scontext=system_u:system_r:httpd_t:s0 tcontext=system_u:system_r:httpd_t:s0 tclass=process
type=SYSCALL msg=audit(1488396169.095:2624951): arch=c000003e syscall=160 success=no exit=-13 a0=1 a1=7ffe06c17350 a2=2 a3=7fea949f3eb0 items=0 ppid=15216 pid=16804 auid=4294967295 uid=48 gid=48 euid=48 suid=48 fsuid=48 egid=48 sgid=48 fsgid=48 tty=(none) ses=4294967295 comm="bash" exe="/usr/bin/bash" subj=system_u:system_r:httpd_t:s0 key=(null)
type=EOE msg=audit(1488396169.095:2624951):
在 AVC 线上,很容易立即看到bash
具有上下文的进程system_u:system_r:httpd_t:s0
被拒绝设置资源限制的权限。
在 SYSCALL 行上,快速谷歌搜索 syscall=160 表明这是一个setrlimit()
调用,令人兴奋。我不知道请求修改什么资源。它试图修改哪些资源?
答案1
因此,在这种情况下,我们已经知道有问题的系统调用是setrlimit
.搜索setrlimit
显示有一个同名的 C 库函数包装了系统调用。
这函数的文档指示第一个参数(审计日志中 SYSCALL 行中的“a0”)指示有问题的资源,但手册仅告诉我们符号名称,而不是数值。然而,它确实告诉我们这些符号是在sys/resource.h
头文件中定义的。但是,该文件不包含实际值。
为了获取数值,我们查看sysdeps/unix/sysv/linux/bits/resource.h。在那里,我们找到了定义的各种 RLIMIT_ 宏。
查看这些,我们可以找到尝试修改哪个资源。此时a0=1,1对应的宏就是RLIMIT_FSIZE。
答案2
这是有点不同的方式。 AVC 表示,您正在bash
运行进程,并且它正在尝试rlimit
对其自身或其某些子进程进行设置,这对于 shell 来说是很常见的情况。
错误在于该服务bash
是在 SELinux 服务上下文中运行的httpd
,而这是不允许这样做的。这是不允许的,因为httpd
是面向网络的守护进程,如果存在一些错误,您不希望允许攻击者使用它。
这通常是由于它bash
是从httpd
某种方式开始的(这绝对不是一个好主意)。
从这些消息中您不会知道正在修改什么资源。 SELinux 具有setrlimit
允许或拒绝修改任何限制的功能。搜索参数时,您需要一些不同的工具,例如:
- SystemTap 研究系统调用及其参数
- 阅读通过源代码
- 在正在运行的进程下运行脚本
gdb
或附加gdb
到正在运行的进程。