最近我在 IDS 日志中看到了一件奇怪的事情。这是一份传出连接的报告,其中显示父进程为/usr/sbin/sshd -R
。
我知道(客户端)用于远程端口转发的-R
参数ssh
,但从未-R
见过sshd
守护进程。
-R
中没有出现man sshd
。这个论点起什么作用?
答案1
审阅源代码,这-R
是一个未记录的标志,SSHD 使用它来向子进程指示它已被重新执行,以便重新初始化随机化缓冲区等。
对于每个新连接,sshd 将重新执行自身,以确保为每个新连接重新生成所有执行时间随机化。为了让 sshd 重新执行自身,它需要知道自身的完整路径。
以下是 3.9 版发行说明中的一段引文:
让 sshd(8) 在接受新连接时重新执行自身。此安全措施可确保在主进程的整个生命周期内,所有执行时随机化都会为每个连接重新应用,而不是只应用一次。这包括 mmap 和 malloc 映射、共享库寻址、共享库映射顺序、ProPolice 和 StackGhost cookies(在支持此类功能的系统上)
添加-R
到传递的命令行参数的副本中时sshd
将重新执行自身:
if (rexec_flag) {
if (rexec_argc < 0)
fatal("rexec_argc %d < 0", rexec_argc);
rexec_argv = xcalloc(rexec_argc + 2, sizeof(char *));
for (i = 0; i < (u_int)rexec_argc; i++) {
debug("rexec_argv[%d]='%s'", i, saved_argv[i]);
rexec_argv[i] = saved_argv[i];
}
rexec_argv[rexec_argc] = "-R";
rexec_argv[rexec_argc + 1] = NULL;
}