手动修补遗留服务器上的 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 的:
在其中一个答案中,他们 link 到 official glibc patch 其中 diff 显示了除您之外的一些其他编辑。可能是缺少的 *status = NSS_STATUS_NOTFOUND;
进入了 "should not happen" 状态。
希望对您有所帮助!
(抱歉,没有足够的 Rep 点数来支持您的问题...)
我有一个遗留的 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 的:
在其中一个答案中,他们 link 到 official glibc patch 其中 diff 显示了除您之外的一些其他编辑。可能是缺少的 *status = NSS_STATUS_NOTFOUND;
进入了 "should not happen" 状态。
希望对您有所帮助! (抱歉,没有足够的 Rep 点数来支持您的问题...)