是否可以覆盖/绕过nscd?

时间:2011-10-13 07:14:58

标签: c linux unix nss

我根据来电者的姓名制作NSS模块答案。例如,如果 sshd 调用getpwnam_r(...),则pw_shell将为 / bin / bash ;如果 telnetd 调用getpwnam_r(...),则pw_shell将为 / bin / ksh

制作原型并且它可以工作。但是,当 nscd 正在运行且缓存很热时,将不会调用模块的功能。 nscd 的缓存结果将返回给每个调用者。 nscd 假设结果的唯一变量是时间;它从不认为进程名称会影响结果。

假设我们可以使一些守护进程或模块覆盖 nscd ,代码应检查进程名称是否在我的列表中。如果它在列表中,请跳过 nscd ;否则,让 nscd 回答getpwnam_r(...)

有可能吗?


编辑:不太可取,但可以选择在拨打getpwnam_r(...)时绕过 nscd

2 个答案:

答案 0 :(得分:1)

对nscd的调用被硬连线到标准库中,这样对地图相关函数(getpwnam(),gethostbyname()等...)的任何调用都将首先查询nscd。唯一的解决方案是关闭nscd或编写自己的。

您可以使用getent和strace确认这一点:

strace -ttt getent passwd

其他人已经写了nscd替换 - 谷歌的gnscd,BusyBox的unscd。 因此,如果您无法禁用nscd,则必须重写它....

答案 1 :(得分:0)

是。 可以在每个进程的基础上绕过 nscd ,尽管它有点像黑客攻击。

如果您查看 glibc 源代码,您将会看到一个名为 __ nss_disable_nscd 的函数。这由 nscd (或 unscd )使用,以确保它不会递归。

可能更容易阅读 unscd 中的示例。见http://busybox.net/~vda/unscd/nscd-0.51.c