是否可以覆盖/绕过 nscd?

发布于 2024-12-09 14:12:29 字数 566 浏览 0 评论 0原文

我正在根据呼叫者的姓名制作 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。

I am making an NSS module answers depending on the name of the caller. For example, if sshd calls getpwnam_r(...), the pw_shell will be /bin/bash; if telnetd calls getpwnam_r(...), the pw_shell will be /bin/ksh.

A prototype is made and it works. However, when nscd is running and the cache is hot, the module's function will not be called. nscd's cached result is returned to every caller. nscd assumes the only variable to the result is time; it never think of process name will affect the result.

Suppose we can make some daemon or module to override nscd, the code should check the process name is on my list or not. If it is on the list, skip nscd; otherwise, let nscd answer getpwnam_r(...).

Is it possible?


Edit: Less preferable, but OK alternative is to bypass nscd when call getpwnam_r(...).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

绻影浮沉 2024-12-16 14:12:29

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

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

strace -ttt getent passwd

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

The calls to nscd are hardwired into the standard library such that any call to a map-related function (getpwnam(), gethostbyname() etc...) will query nscd first. The only solution is to turn nscd off or to write your own.

You can confirm this by using getent and strace:

strace -ttt getent passwd

Others have written nscd replacements - gnscd by Google, unscd for BusyBox.
So if you cannot disable nscd then you must rewrite it....

爱给你人给你 2024-12-16 14:12:29

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

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

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

Yes. It is possible to bypass nscd on a per-process basis, although it's a bit of a hack.

If you check out the glibc source code you'll observe there's a function called __nss_disable_nscd. This is used by nscd (or unscd) to ensure that it doesn't go recursive.

Probably easier to read the example in unscd. See http://busybox.net/~vda/unscd/nscd-0.51.c

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文