有一个具有本地服务的主机,它从远程位置(例如通过http)接收数据并将其保存在本地的/var/log/data/
某个mydir 中。
$ ls -al /var/log/data
drwxr-sr-x+ 4 root datalog 4096 Feb 4 18:59 .
drwxr-xr-x 4 root root 4096 Feb 4 18:59 ..
drwxr-sr-x+ 2 root service 4096 Feb 4 19:07 mydir
本地服务以 service:service 所有权运行。
假设我想阻止执行以下位置的漏洞利用程序/var/log/data/mydir
:
-rwxr-sr-x 1 root service 133156 Jul 19 2014 exploit
请注意漏洞利用文件上的“s”(setgid)位,这使得它以服务组权限执行(与本地服务相同)。
如何防止潜在的漏洞在那里执行?从和
中删除“x”(go-x)?它可能会扰乱服务的工作......? 还有其他想法吗?/var/log/data/
/var/log/data/mydir
答案1
正如我所看到的,组和其他人没有写权限,所以他们无法在这里创建任何文件/目录。
你只需要确保如果你从 root 删除写权限,会发生什么?
答案2
您可以使用 ACL 拒绝所有用户的写入和执行权限,然后明确仅允许服务帐户用户拥有完整的 rwx。http://linux.die.net/man/1/setfacl
答案3
您可以通过确保服务无法在任何地方创建可执行文件来降低持续利用的风险。为此,请确保该服务可以访问的所有文件系统至少满足以下条件之一:
- 挂载为只读
- 安装
noexec
选件 - 不包含服务可写的目录
在 a 中运行服务chroot监狱将有助于减少服务可以看到的文件系统部分。您可以使用绑定安装在不同位置查看文件系统的一部分。
请注意,setgid 在这里主要是转移注意力。如果攻击者可以创建可执行文件并诱骗您的服务运行它,则该漏洞无论如何都会与该服务的组一起运行。仅当攻击者可以通过您的服务创建可执行的 setgid 文件并且可以欺骗时,Setgid 才会成为问题另一个用户进入执行文件。
另请注意,通过这种方式您只能获得非常少量的保护。如果攻击者可以欺骗您的系统执行他们上传的文件,那么他们很可能已经有办法执行任意代码。您可能获得的一件事是,如果攻击者无法写入可执行文件,则该漏洞可能无法在服务重新启动后幸存下来。然而,这假设利用向量是例如某些网络漏洞,而不是例如文件解析中的漏洞。
限制服务的另一种方法是使用安全框架,例如SELinux。制定政策可能很困难,但您拥有更多控制权。