c++ - 创建读取面向 Internet 的套接字的守护程序存在哪些安全问题?

标签 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 会自动空终止吗?

无论如何,我获取 http get 并对其进行哈希处理(或者我不应该 - 对潜在的恶意字符串进行哈希处理有多安全?)。

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

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

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

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

最佳答案

MD5 虽然被广泛使用,但众所周知是 broken .请改为查看 SHA-1 或类似的东西。

你永远不应该假设任何空终止(或者它提供正确的空终止,正如 DavidSchwartz 在下面所说的)。如果您的应用程序依赖于此,请确保在收到请求后自己在守护程序上执行此操作。这确实很重要;您不希望通过愉快地读取或操作不会终止且只会破坏您的内存的“字符串”来使缓冲区溢出。

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

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

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

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

编辑

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

关于c++ - 创建读取面向 Internet 的套接字的守护程序存在哪些安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15555271/

相关文章:

ios - 保护 iOS 应用程序中的图像

ASP.NET 自定义错误与编译调试 ="false"和安全性

c++ - 轮廓积分算法 C++

c++ - 如何在汇编中传递参数?

传递给函数时的 C++ 指针问题

c - 用于一维 double 据数组的简单 ANSI C 直方图函数?

docker - Docker Content Trust 中是否有两个根 key ?

c++ - UVA Online Judge 返回我无法重现的运行时错误

c - 仅使用两个字符打印迷宫

c++ - NMEA 库 - nmeaINFO 为空