创建读取面向互联网的套接字的守护进程有什么安全问题?

What security issues are there with creating a daemon that reads internet-facing sockets?

本文关键字:什么 安全 问题 进程 套接字 读取 互联网 创建 守护      更新时间:2023-10-16

我有一个使用Pushover与我通信的个人服务器。也就是说,我的服务器可以触发一个脚本,以不同的优先级直接向我的手机发送消息。然而,这是一种方法。我希望通过使用Pushover添加html链接的能力来解决这个问题。

我非常了解套接字代码,但我对其中涉及的安全性有些模糊。举个例子,停电了。我的服务器在UPS上,因此立即在我的手机上发送消息说电源耗尽,我想要系统关闭吗?(后续消息可能会在电源恢复时发送,这意味着我可能不希望它关闭。)它将包括一个链接,例如example.com:4000/insert_a_generated_hash_here。如果我决定关闭服务器,那么监视端口4000的守护进程将收到

GET /insert_a_generated_hash_here HTTP/1.1rn
host: www.example.comrn
rn

我担心的第一件事是一个非空终止字符串。这是个多大的问题?recv会自动终止null吗?

无论如何,我接受http get并散列它(或者我不应该-散列一个潜在的恶意字符串有多安全?)。

如果我使用MD5, http get将散列到25b382b678bb33a21fa677c66e9d02a1(我应该使用MD5吗?这只是我想到的第一个哈希值)

此时,该散列(应该可以安全操作?)与"当前活动"命令表进行比较。由于服务器生成了原始的散列,因此它可以对http请求进行散列。如果传入的哈希值与表中的某些内容匹配,则运行该命令——当然,只能运行预先封装的命令。命令的活动时间也只有10分钟,然后从活动列表中删除。我还可以添加一个"非活动"列表,它会在我的手机上发送一条消息,说"这个命令已经发出,但它没有活动"。

在这种情况下,该命令将是关闭,尽管它可能是批准服务器上的用户通过包管理器安装某些东西,等等。守护进程也可以为一个简单的网页发送相关的http响应,只是说"OK!"(我觉得这没什么大不了的。)

这有多安全,我应该注意什么?或者整个想法是安全自杀的顶峰?

MD5虽然被广泛使用,但众所周知是可以破解的。看看SHA-1或类似的东西。

你不应该假设任何以null结尾的东西(或者像DavidSchwartz下面说的那样,它提供了正确的null结尾)。如果您的应用程序依赖于此,请确保在接收请求时自己在守护进程上执行此操作。这的确很重要;你肯定不想因为高兴地读取或操作一个不会终止的"字符串"而导致缓冲区溢出,因为它只会浪费你的内存。

当你说"表"你指的是一个查找表硬编码在守护进程,还是一个数据库表?如果这些事情发生在内存中,您应该没有问题,因为它们不是"可执行的"。例如,如果您正在使用数据库,恶意用户可能能够以某种方式(暴露所有包含的数据或获得对系统的未经授权的访问)制作攻击字符串来利用您的数据库。对恶意字符串进行散列处理应该没有效果,但是,如果您不向散列中添加任何盐,则如果允许在系统上直接执行命令,恶意用户可能会自己散列字符串并执行命令(对不起,我不确定您是否给出了系统的完整视图)。

无论如何,从安全的角度来看,您的策略(无论何时它是可行和可维护的)都是好的。显式地精确列举可以运行的内容,使您可以更完全地控制系统的行为。这是用户输入卫生的一种形式;您接受原始用户请求并对其进行翻译(如果无效则不进行翻译),以便在系统中正常工作。也就是说,如果这些请求中有任何一个使用原始用户输入,您可能需要进行进一步检查。也就是说,如果请求没有被简单地翻译(例如,您收到shutdown <message>),那么在执行<message>之前对其进行消毒是很重要的(它可能是恶意代码)。如果情况并非如此(即您只是接收shutdown并执行适当的操作),那么我不会担心。

就发送web响应而言,这可能是OK的。如果响应是硬编码的(而不是从动态源获取的),我就不会太担心这个问题。硬编码的响应将是安全的,因为它不会尝试从磁盘读取任何其他内容,并且无法利用此发送(假设没有缓冲区溢出等)。

我能想到的另一个攻击向量是如果没有身份验证。如果这是一个开放服务器,您可能希望以某种方式将其锁定,以进行某种准入控制。这将防止恶意用户以未经授权的方式在您的服务器上执行完全有效的命令。

编辑

为了更安全的web界面,我建议使用一个简单的用户认证表单。仅仅依赖哈希值遵循通过模糊实现安全的原则,不应该依赖这一点。请注意,这个表单遇到了与前面讨论的相同的用户输入问题(输入卫生、缓冲区溢出等)。以某种编码方式(即sha1(user:pass))直接对用户输入进行哈希可能是最简单的,并将此哈希与必须存储在某个地方的有效登录哈希列表进行比较。这有助于用户输入卫生,因为sha1(malicious_payload)将是一个简单的散列。也就是说,这仍然不能防止缓冲区溢出,您必须主动检查缓冲区溢出。一般来说,使用长度指定版本的命令,如strncpystrncmp,而不是strcpystrcmp。最后,如果您的密码以某种方式泄露,此表单仍然可能遭受社会工程攻击(即密码网络钓鱼)和密码窃取。也就是说,这些不是系统的故障,而是安全的人为因素。