为什么 BSD 版本 1.10nc
禁用了-e
其他所谓不安全发行版中的选项,而即使使用“安全”版本,也可以轻松实现相同的危险功能,如下所示nc
:
$ # Machine A
$ mkfifo pipe
$ nc -l 4000 <pipe | bash >pipe
$ # Machine B
$ nc MachineA 4000
现在,如果我要在脚本中完成机器 A 上的咒语(如果传递了 `-e' 参数,则有效地执行上述操作),我实际上已经引入了“巨大的安全漏洞”,而无需降到 Makefile 和构建级别。
那么,为什么要用#define
-ingGAPING_SECURITY_HOME
呢netcat.c
?
答案1
虽然我没有明确的答案,但我相信只有当你启用nc
了-e
和是 setuid root。(由于nc
通常用于绑定到端口,因此可能会打包 setuid root,以使所有用户都能绑定到 1024 以下的特权端口。)
在这种情况下,给定的进程nc -e
是否会exec
以 root 身份运行 - 这意味着它会让任何用户运行以 root 身份执行任何进程。我相信你会意识到这是一个巨大的安全漏洞。相比之下,如果你运行自己的进程并使用管道将其连接到nc
,则该进程不会以 root 身份运行,除非你有其他方式提升它(如sudo
访问权限)。
商业供应商可能会打包 [netcat] setuid root 并
-DGAPING_SECURITY_HOLE
开启但没有记录。
我认为这增强了我的理论的可信度。:)
答案2
从原始发布公告:
强制性的供应商抨击:如果“nc”几年前就成为标准实用程序,商业供应商可能会将其打包为 setuid root 并
-DGAPING_SECURITY_HOLE
启用但不记录。希望 netcat 能够帮助人们找到并修复这种不断出现的无脑漏洞,通过允许更轻松地对网络层的“裸机”进行实验。
这并没有让事情变得更清楚...
答案3
我可以使用“netcat -e”来运行其他应用程序,例如 imap 或 pop3。部分“#ifdef GAPING_SECURITY_HOLE”可能包含一个允许您运行 shell 的错误,这就是为什么它默认被 ifdefed 出来。ifdef 包装安全关键部分。