为什么开放端口不好?

air*_*req 38 networking security tcp tcpip udp

这是一直让我困惑的事情。为什么在您的计算机上打开端口是不好的?假设您的计算机上没有病毒,也没有其他侦听端口的程序可能会实际执行某些操作,为什么端口打开很重要?如果某个恶意的人开始向端口发送数据包,但没有任何东西可以接收数据并对其进行处理,为什么这很重要?计算机不只是任意执行它接收到的任何数据。我知道用数据包淹没计算机可能会导致它崩溃,因为它无法处理大量数据,但我只考虑实际更改计算机上文件的安全问题。

更新

感谢您到目前为止的答复。我现在明白了,一个端口被打开实际上意味着有一个程序可以被利用来监听那个端口。但是为什么编写不能被利用的软件就这么难呢?要对计算机造成任何真正的伤害,程序不必允许上传一个或多个文件,然后需要执行其中一个文件。似乎很难允许意外发生。

MDM*_*rra 38

如果某个端口未侦听其上的连接,则该端口不会打开。

将所有端口向任何地方开放是不好的形式的原因是它会将侦听这些端口的服务暴露给漏洞利用。这就是防火墙存在的原因,以限制允许连接到某些端口的内容,以减少服务暴露的表面积。


编辑

要解决您关于为什么人们不能只编写不可利用的软件的问题:

这对于简单的程序来说相当容易,但许多需要套接字的程序很复杂。因此,它们有许多组件,其中许多组件很可能甚至不是由开发人员编写的(包括库)。当您可以使用自己的加固方法(例如防火墙)时,您不能依赖其他人来确保您的网络安全。

正如您所指出的,任意/远程代码执行是一个巨大的风险。不幸的是,缓冲区溢出和其他允许它的安全漏洞很常见。看看任何 Microsoft 安全更新,我敢打赌它会修补远程代码执行或特权提升,而 MS 是一家拥有数百名开发人员和数十亿美元的大公司。

  • 只是补充:例如,如果您知道某个服务存在可用于渗透代码或其他任何内容的错误,并且您实际上看到该服务正在运行,则这是一个公开邀请;) (4认同)

Ric*_*ner 10

关于你写的更新:

感谢您到目前为止的答复。我现在明白了,一个端口被打开实际上意味着有一个程序可以被利用来监听那个端口。但是为什么编写不能被利用的软件就这么难呢?要对计算机造成任何真正的伤害,程序不必允许上传一个或多个文件,然后需要执行其中一个文件。似乎很难允许意外发生。

这是非常到无法被利用写软件很难!

我读过《构建安全软件》一书,其中讨论的一件事是利用堆栈溢出。里面有两个非常可怕的事实:

  • 对于一个有可利用的堆栈溢出漏洞的程序来说是很容易做到的,尤其是当程序是用 C 编写的。 在 C 编程语言中,许多函数在默认情况下是不安全的,程序员要么需要知道避免易受攻击的函数,或必须采取特殊措施以确保安全。
  • 黑客需要使用的漏洞利用很短——非常短。它不到半页汇编语言,翻译成 100 左右(猜测)字节的机器代码。此漏洞利用代码足以让黑客 shell(命令提示符)访问您的机器。不需要上传和执行大文件——只需一小段代码,可以插入合法数据的中间。

因此,如果黑客可以找到一个程序,它 (a) 有一个堆栈溢出错误,(b) 可通过网络利用,并且 (c) 缓冲区中有几个 100 字节的空闲空间,那么您的计算机就被入侵了。幸运的是,关于堆栈溢出错误的知识现在是相当普遍的知识,但它们仍然会出现。5 年前和更长的时间,这是一个更常见的问题。

回到您最初的问题,您应该避免开放端口,以避免因程序中的可利用错误而发生任何事故。您现在有第二个原因:黑客将使用的远程 shell 是另一个开放端口。如果您的防火墙阻止了除您明确允许之外的所有内容,您也会阻止该远程 shell(尽管黑客仍然可以对您的计算机做其他令人讨厌的事情,所以不要自满!)

  • IIRC,Donald Knuth(?) 刚刚完成了数学证明他编写的一个较小的程序没有错误,并且花了很多年 (2认同)

Ila*_*ste 9

  • 开放端口:当有人询问时,计算机响应有服务在监听此端口。这意味着进入该端口的任何内容都将被该计算机上运行的程序(服务)处理。
  • 关闭端口:当有人询问时,计算机会回应说没有服务在该端口上侦听。Akser 会知道有一台计算机在该地址响应。
  • 隐形端口:当有人问时,他们得不到答复。关键是隐藏地址是否有计算机。不过,正如joschi在评论中指出的那样,它可能不是很有效。

如果你有一个开放的端口,只要处理传入内容的程序没有可用的漏洞,你就是安全的。但是漏洞利用总是会被发现,很高兴知道有很多端口扫描在网络上四处移动,寻找目标。

关闭的端口仍然响应akser,因此可能的攻击者知道继续检查其他端口。再说一次,这就是互联网的具体工作方式。虽然隐形端口试图不向潜在攻击者提供任何信息,但理论上它们违反了规范。

从安全的角度来看,任何开放的端口都是一个巨大的漏洞,因为代码被用来处理外部数据。防火墙(或 NAT 路由器)的作用是确保没有传入流量到达您的计算机,即使系统有一些开放端口。这样,他们有效地关闭了所有端口。


Fel*_*lix 6

实际上据我所知,一个开放的端口意味着一个程序正在监听它。所以有某种服务处理数据。