解剖漏洞 – 卷曲的网络下载工具包,龟缩通过身份验证的bug

你可能没有听说过的卷曲度,但你可能使用的软件,使用它。

这是一个开放源代码的编程工具,它可以帮助你编写客户端代码来处理的URL的处理。

在项目本身的话,:“卷曲groks这些URL。”

这是受欢迎的,因为它是一个URL的瑞士军刀,从而很容易地处理流行的协议,如HTTP,SMTP,POP3和多。它也支持上传,下载,认证,代理,Cookie和SSL / TLS。

它甚至还支持Gopher的 ,如果你还记得,早。

一个风险与唱歌,跳舞库有更多的代码,当然,是去错了。

有时,甚至晦涩位代码,你以为你从来没有使用可能会触发。更糟糕的是,他们可能会触发外部的情况下,你从来没有预测。

这是花的问题在这里。

容易受到攻击的代码中引入的7.26.0版本,支持DIGEST_MD5认证时添加到卷曲的软件。

DIGEST_MD5是一个基本的方式,让您登录一个未加密的连接,例如HTTP或POP3服务器,而不发送您的实际密码。

服务器发送一个随机质询字符串,或随机数,连同一堆其他的身份验证相关的数据 ,你回答你的密码的加密哈希值,服务器提供的数据混在一起:

因此,一个黑客的嗅探您的回复不能直接恢复您的密码,它和面临的挑战是随机变化每次你登录,黑客可以不重新使用您的回复。

顺便说一句: 避免使用DIGEST_MD5认证 。使用TLS,而不是整个会话进行加密。

一个黑客谁嗅探一个DIGEST_MD5的答复不能重新使用它直接,但他可以用它来尝试恢复您的密码脱机使用字典攻击。

TLS不能防止这一点,但也保持了整个交易的秘密,包括你的网络会议或电子邮件的内容。这是一个更好的安全性结果。

这里的卷曲度的容易受攻击版本的bug的代码:

不要担心,如果你不熟悉,我会解释。

C,管理和使用的内存留给了程序员。您可以使用库代码,以帮助您安全地处理可变长度的数据,如用户提供的文本字符串,或者你可以直接处理内存自己。

最重要的,程序员做了后者。

首先,他分配了一系列固定长度的堆栈上的内存块。

然后,他的功能为这些块由调用者提供的文本字符串复制,但可以使用系统功能的strcpy()和strcat(),分别代表“字符串复制”和“string concatentate”(粘性一个字符串结束另一个)。

在现代的代码,你应该永远不会使用这些功能 ,因为你不能限制多少数据复制。

他们只是从输入到输出字符串的字符串复制的每一个字节,直到的NUL(零)字节已被发现。一个NUL是如何结束的文本字符串表示C.

所以,如果服务器发送过多的数据,在其认证的挑战,例如过长的境界字符串(其中的内容可以是任何服务器选择),这个函数会的东西太多数据到缓冲区中用来计算认证响应。

一个缓冲区溢出会导致,在这种情况下,由于目标数据块被自动分配在栈上,该功能将崩溃时结束。

这是因为堆栈中还存储在内存中的地址的函数被调用,所以卷曲软件可以回到那里时,它的完成。在上面的代码覆盖返回地址,如果该字符串反应过度填充。

此修复程序是一个简单的。

已被取代的功能的snprintf(),最多n个字节的“代表”格式的字符串打印到不可控的strcpy()和strcat()函数:

您仍然可以与snprintf的错误,因为它是由你来指定 n,和,如果你不小心,你可能弄错了。

但问题是,至少有可能限制snprintf的一个已知的缓冲区大小,你根本不能做的老式的strcpy()和strcat()的输出。

→更新的卷曲上面的代码仍然是不完美的。程序员真的应该检查返回值的snprintf(),该报告想写多少字节。如果你的缓冲区不够大,那么输出将是不完整的,因而是不正确的。你不应该使用它:增加你的缓冲区的大小,然后再试一次,或者报告错误。

你可能会想,在这一点上,利用此漏洞将是很难的,因为大多数程序,使用cURL这样做的背景。他们是不是交互式的。

自动更新软件,该软件可能使用的的cURL库(被称为libcurl的)通常是预先配置的一个已知良好的URL列表,或在安装时会要求您输入一个URL,就是这样。

切换已知良好的自动更新URL一个狡猾的一个,或谁可以说服你改变你一直使用一个你从来没有听说过的POP3电子邮件服务器,可以谈谈你们的攻击肯定会发现它更容易感染你只是让你直接运行恶意软件。

这是真的,但还是有风险的。

如果一个攻击者可以重定向的请求,从您的autoupdater或您的POP3客户端,例如通过摆弄你的DNS设置,或通过黑客在服务供应商的网络边缘的服务器,他可以送你到一个冒名顶替的网站,并尝试利用你从那里。

由于缓冲区溢出,这可能会导致驱动器下载 ,卷曲本身是欺骗行为不端,切割完全知情同意的循环。

教训呢?

  • 不要使用strcpy()strcat的()。
  • 曾经。
  • 使用snprintf的 (或者是strlcpy()和strlcat() ,或类似的)。
  • 请务必检查字符串处理函数的返回值,所以你不使用不正确的结果。

你的下一个问题是要找出如果,或者,您使用的这些错误代码,其中包括卷曲的软件。 (卷曲7.26.0到7.28.1版本会受到影响。)

最好的开始到处打听…

NB,虽然有几个Sophos产品的使用 libcurl,他们没有使用的容易受攻击版本的代码。