如何剖析 SELinux SYSCALL 消息?

如何剖析 SELinux SYSCALL 消息?

所以,我有这三个审核日志条目

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到正在运行的进程。

相关内容