手动修补遗留服务器上的 Ghost 漏洞

Manually patching for Ghost vulnerability on legacy server

我有一个遗留的 Redhat ES 3.x 服务器(由于不受支持的古老应用程序的限制,我无法在以后的发行版上安装)我正在尝试手动修补 glibc 以解决 Ghost 漏洞.

根据 Qualys (http://www.openwall.com/lists/oss-security/2015/01/27/9) 的分析,看来应该很容易修改 glib 源代码来处理 stack/heap 溢出问题。但我想多看几眼我的程序,看看我是否遗漏了什么,等等。

这是我所做的。首先,我从 SRPM 构建并准备了 glib 源代码树:

rpm -ivh glibc-2.3.2-95.50.src.rpm
rpmbuild -bp /usr/src/redhat/SPECS/glibc.spec 
cd /usr/src/redhat/BUILD
cp -av glibc-2.3.2-200309260658 glibc-org
cd glibc-2.3.2-200309260658

接下来,我主要根据上面Qalys文章中的这段话编辑了nss/digits_dots.c:

Lines 121-125 prepare pointers to store four (4) distinct entities in buffer: host_addr, h_addr_ptrs, h_alias_ptr, and hostname. The sizeof (*h_alias_ptr) -- the size of a char pointer -- is missing from the computation of size_needed.

vi nss/digits_dots.c

I edited these two statements:
  105:  size_needed = (sizeof (*host_addr)
                   + sizeof (*h_addr_ptrs) + strlen (name) + 1);

  277:  size_needed = (sizeof (*host_addr)
                   + sizeof (*h_addr_ptrs) + strlen (name) + 1);

to this:
  105:  size_needed = (sizeof (*host_addr)
                   + sizeof (*h_addr_ptrs) + strlen (name)
                   + sizeof (*h_alias_ptr) + 1);

  277:  size_needed = (sizeof (*host_addr)
                       + sizeof (*h_addr_ptrs) + strlen (name)
                       + sizeof (*h_alias_ptr) + 1);                     

接下来,我创建了一个补丁文件 + 更新了规范文件以包含我的补丁 + 构建的二进制文件:

cd /usr/src/redhat/BUILD
diff -Npru glibc-org glibc-2.3.2-200309260658 > glibc-digit_dots-ghost.patch
cp glibc-digit_dots-ghost.patch ../SOURCES/

cd /usr/src/redhat/SPECS
vi glibc.spec
rpmbuild -ba glibc.spec

最后,我使用新的二进制文件 (RPM) 更新了 glibc:

cd /usr/src/redhat/RPMS/i386
rpm -Uvh --nodeps glibc-2.3.2-95.51.i386.rpm glibc-devel-2.3.2-95.51.i386.rpm glibc-profile-2.3.2-95.51.i386.rpm glibc-utils-2.3.2-95.51.i386.rpm glibc-common-2.3.2-95.51.i386.rpm glibc-headers-2.3.2-95.51.i386.rpm 

重启服务器后,我重新运行幽灵测试器(https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c)。

这次我得到了"should not happen"而不是"vulnerable",我觉得这很好。但我本以为会得到 "not vulnerable" 我是不是漏掉了什么,或者只是我的修复与受支持发行版中的官方修复不同?

我一直在为旧的 Fedora 版本寻找类似的补丁... 我在 ServerFault 上找到了这个 Q&A,它是关于修补旧的 Debian Lenny 的:

https://serverfault.com/questions/662971/how-to-patch-cve-2015-0235-ghost-on-debian-lenny-and-squeeze

在其中一个答案中,他们 link 到 official glibc patch 其中 diff 显示了除您之外的一些其他编辑。可能是缺少的 *status = NSS_STATUS_NOTFOUND; 进入了 "should not happen" 状态。

希望对您有所帮助! (抱歉,没有足够的 Rep 点数来支持您的问题...)