C语言 是否有可能覆盖/绕过nscd



我正在根据调用者的名称制作NSS模块答案。例如,如果sshd调用getpwnam_r(...),则pw_shell将是/bin/bash;如果telnetd呼叫getpwnam_r(...),则pw_shell将为/bin/ksh

一个原型被制作出来并且它能工作。但是,当nscd正在运行并且缓存是热的时,模块的函数将不会被调用。nscd的缓存结果返回给每个调用者。nscd假设结果的唯一变量是时间;它从不考虑进程名会影响结果。

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

有可能吗?


编辑:不太可取,但OK的替代方案是在调用getpwnam_r(...)时绕过nscd

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

你可以通过使用geent和strace来确认:

strace -ttt getent passwd

其他人已经编写了nscd替代品——Google的gnscd, BusyBox的unscd。所以如果你不能禁用nscd那么你必须重写....

是。可以在每个进程的基础上绕过nscd,尽管这有点hack。

如果你检查glibc源代码,你会发现有一个名为__nss_disable_nscd的函数。这是由nscd(或unscd)使用来确保它不会递归。

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

相关内容

  • 没有找到相关文章

最新更新