为什么开放端口不好?


36

这总是让我感到困惑。为什么在计算机上打开端口会很糟糕?假设您的计算机或其他程序上没有病毒,侦听该端口的病毒实际上可能会执行某些操作,那么为什么打开该端口很重要?如果某个恶意人员开始将数据包发送到端口,但是却没有接收数据并对其执行任何操作的原因,为什么呢?计算机不仅会任意执行接收到的任何数据。我知道用数据包淹没计算机可能会导致崩溃,因为它无法处理大量数据,但是我只考虑了实际上会更改计算机文件的安全性问题。

更新资料

到目前为止,感谢您的答复。我现在知道,端口实际上是打开的,意味着有一个程序可以在该端口上侦听。但是为什么编写如此难以开发的软件如此困难?要对计算机造成任何实际损害,程序就不必允许上传一个或多个文件,然后需要执行其中一个文件。似乎很难意外地做到这一点。

Answers:


36

如果某人未监听端口上的连接,则该端口未打开。

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


编辑

要解决您有关人们为什么不能仅仅编写无法利用的软件的问题,请执行以下操作:

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

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


4
只需添加:例如,如果您知道某个服务存在可用于渗入代码或其他内容的错误,并且您实际上看到该服务正在运行,则这是公开邀请;)
Felix

9

关于您编写​​的更新:

到目前为止,感谢您的答复。我现在知道,端口实际上是打开的,意味着有一个程序可以在该端口上侦听。但是为什么编写如此难以开发的软件如此困难?要对计算机造成任何实际损害,程序就不必允许上传一个或多个文件,然后需要执行其中一个文件。似乎很难意外地做到这一点。

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

我读过《Building Secure Software》一书,其中讨论的一件事是利用堆栈溢出。那里有两个非常可怕的事实:

  • 要使程序具有可利用的堆栈溢出错误,非常容易做到,尤其是当该程序是用C编写时。在C编程语言中,许多功能默认情况下都不安全,程序员要么需要知道以避免易受攻击的功能, ,或必须采取特殊措施以确保安全。
  • 黑客需要利用的漏洞很短- 非常短。它不到汇编语言的一半,可以转换为100个(猜测)字节的机器代码。此漏洞利用代码足以使黑客外壳(命令提示符)访问您的计算机。无需上传和执行大文件-只需将一小段代码插入合法数据的中间即可。

因此,如果黑客发现某个程序,该程序(a)有一个堆栈溢出错误,(b)可通过网络利用该漏洞,并且(c)缓冲区中有几个100字节的备用字节,则将对您的计算机进行伪造。幸运的是,有关堆栈溢出错误的知识现在是相当普遍的知识,但是它们仍然会弹出。5年前甚至更长时间,这是一个更常见的问题。

回到最初的问题,您应该避免打开端口,以免由于程序中的可利用错误而引起意外。现在,您有第二个原因:黑客随后将使用的远程外壳是另一个开放端口。如果您的防火墙阻止了除您明确允许的所有内容之外的防火墙,您还将阻止该远程外壳程序(尽管黑客仍然可以对您的计算机执行其他令人讨厌的操作,因此请不要自满!)


2
IIRC的Donald Knuth(?)刚刚在数学上证明了他编写的其中一个较小的程序是
无错误的

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

如果您有开放的端口,则可以安全地处理进入的东西的程序没有可用的漏洞利用。但是漏洞攻击一直在被发现,很高兴知道有很多端口扫描在网上进行,以寻找目标。

封闭的端口仍会响应akser,因此可能的攻击者知道可以继续检查其他端口。再说一遍,这就是专门针对互联网的工作方式。尽管隐形端口试图不向潜在攻击者提供任何信息,但从理论上讲,它们违反了规范。

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


1
您对“隐形端口”的定义是一厢情愿的。实际上,如果攻击者没有得到任何答案,攻击者就会知道有一台计算机。如果该特定IP地址上没有计算机,则先前的路由器将发送有关此消息。与“隐形港口”不会发生……
joschi

@joschi:嗯,这是我在互联网上看到的一个概念,所以我认为定义它是很好的。不过,您提出了一个很好的观点。我编辑了答案以反映您的评论。我猜至少可以使目标IP看起来像在NAT路由器后面。我本人从来都不喜欢这个概念:如果您有开放端口,则应确保它们正在运行安全服务。而且,如果您没有开放的端口,那么告诉网络您存在就没有问题。隐身对我来说就像是安全炒作。
Ilari Kajaste 09年

joschi:并非所有路由器都这样做。许多路由器只是盲目地转发到没有系统的IP地址。连接尝试超时只是因为客户端对尝试进行三向握手感到无聊。
09年

6

实际上,据我所知,打开的端口表示程序正在监听它。因此,存在某种处理数据的服务。


3

假设您的计算机或其他程序上没有病毒,侦听该端口的病毒实际上可能会执行某些操作,那么为什么打开该端口很重要?如果某个恶意人员开始将数据包发送到端口,但是却没有接收数据并对其执行任何操作的原因,为什么呢?

假设是所有事情的源泉:)

比后悔更安全...在makeuseof.com上为您提供的好阅读:

技术解释:开放的路由器端口及其安全隐患


简短的好读物。
DaveParillo

1

我没有安全出口,但是做了一些研究...“开放”端口是设置为接受传入TCP连接的端口。

如果您的应用仅在端口9、21和80上侦听,并且防火墙阻止了对这三个端口的访问,则从技术上讲您没有打开任何端口。例如,IOW端口25未打开,因为没有人在监听它。

回答您的问题:在计算机上打开端口之所以不好,是因为可以很容易地发现这些端口,一旦发现这些端口,它们现在就容易受到监听应用程序的漏洞的影响。


您对端口的定义不正确。端口绝不限于TCP。
MDMarra

1
我想一个人不应该相信他们在'net上阅读的所有内容:)在Google排名前6位的搜索结果中,有5个在其定义中明确指出了“ TCP”。google.com/…–
不知疲倦的,

不,他们说TCP / IP。巨大差距。TCP / IP包括UDP
MDMarra

1
ICMP不使用端口,它是IP协议套件中包含的第3层协议。
MDMarra

1
我说这的唯一原因是,它对于防火墙(这是间接涉及的)非常重要。TCP是有状态的,因此可以记住连接,而UDP没有。很多时候,这意味着必须打开端口才能返回内部发起的UDP通讯,而对于内部建立的TCP连接则不需要这样做。
MDMarra

0

出于同样的原因,您在家中关闭和锁上门窗。


3
我锁上了门窗,因为外面很冷。这个问题与绝缘有什么关系?
quack quixote 09年

2
如果门窗仅关闭,它们是否不会隔热?额外的螺栓确实能提供更多绝缘吗?
Dentrasi

很好,但是值得注意的是,并不是每个人都在家中锁上门窗。根据您的观点这可能是“不是每个人都想保护自己的财产”“不是每个人都喜欢生活在恐惧文化中”
Ilari Kajaste 09年

-2

我们只说打开的端口就像开着的窗户和敞开的门,但是当您打开窗户时,强盗或老鼠和蜘蛛会进入#请告诉我我是哑巴还是傻子。在互联网上有一个开放的端口,我想也是封闭的端口,都是封闭的窗口,没有它我们就无法连接或浏览。我想就像HTTP和SSH或FTP一样,如果没有它我们就无法连接,因为它是客户端,只是TCP连接

我不是安全专家


需要开放端口才能提供服务。在无数可能的示例中,只有一个:Gmail使用开放端口(使用HTTPS为其网站提供443)。但它要求您在显示任何内容之前先登录。
Arjan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.