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

时间:2013-03-21 18:25:22

标签: c++ c security sockets daemon

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

我非常了解套接字代码,但我对其中涉及的安全性有些模糊。这是如何工作的一个例子是电力消失。我的服务器在UPS上,因此立即在我的手机上发送消息说电源已关闭,我是否希望系统关闭? (后续消息可能会在电源恢复时发送,这意味着我可能不希望它关闭。)它将包含一个链接,例如example.com:4000/insert_a_generated_hash_here。 如果我确定我确实希望服务器关闭,那么观察端口4000的守护进程将会收到

GET /insert_a_generated_hash_here HTTP/1.1\r\n
host: www.example.com\r\n
\r\n

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

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

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

此时,该哈希(应该可以安全操作?)与“当前活动”命令表进行比较。由于服务器生成了原始生成的哈希,因此它可以生成http请求的哈希值。如果传入的哈希与表中的某些内容匹配,那么该命令当然只是运行预先命令的命令。命令也只在10分钟内处于活动状态,此时它们将从活动列表中删除。我还可以添加一个“非活动”列表,它会在我的手机上发送一条消息,说“此命令已发出,但它未激活。”

在这种情况下,该命令可能是关闭的,但可能是批准服务器上的用户通过包管理器等安装某些东西等。该守护进程也可以发回相关的http响应以便简单网页只是说“OK!” (我认为这不是什么大问题?)

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

1 个答案:

答案 0 :(得分:1)

MD5虽然被广泛使用,但已知为broken。请查看SHA-1或类似内容。

你永远不应该假设任何空终止(或者它提供正确的空终止,正如DavidSchwartz在下面所说的那样)。如果您的应用程序依赖于此,请确保在收到请求后自己在守护程序上执行此操作。确实这很重要;你不想通过愉快地阅读或操纵一个不会终止并简单地破坏你的记忆的“字符串”来缓冲溢出。

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

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

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

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

修改

为了更好地保护Web界面,我建议甚至只使用简单的用户身份验证表单。简单地依赖于哈希遵循security through obscurity原则,这不应该依赖。请注意,此表单存在与之前讨论的相同的用户输入问题(输入卫生,缓冲区溢出等)。以某种编码方式(即sha1(user:pass))直接散列用户输入可能是最简单的,并将该散列与必须存储在某处的有效登录哈希列表进行比较。这有助于用户输入卫生,因为sha1(malicious_payload)将是一个简单的哈希。也就是说,这仍然无法防止缓冲区溢出,您必须主动检查。通常,使用长度指定版本的命令,如strncpystrncmp,而不是strcpystrcmp。最后,如果您的密码在某种程度上泄露,这种形式仍可能遭受社会工程攻击(即密码网络钓鱼)和密码窃取。也就是说,这些不是系统中的失败,而是经常出现在人类安全部分中。