【发布时间】:2015-03-31 05:48:16
【问题描述】:
我有一个旧的 Redhat ES 3.x 服务器(由于一个古老的、不受支持的应用程序的限制,我无法在以后的发行版上安装它),我正在尝试手动修补 glibc 以解决 Ghost 漏洞。
根据 Qualys (http://www.openwall.com/lists/oss-security/2015/01/27/9) 的分析,看起来应该很容易修改 glib 源以处理堆栈/堆溢出问题。但我想多看看我的程序,看看我是否遗漏了什么等等。
这就是我所做的。首先,我从 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:
第 121-125 行准备指针以将四 (4) 个不同的实体存储在 缓冲区:host_addr、h_addr_ptrs、h_alias_ptr 和主机名。的大小 (*h_alias_ptr) -- char 指针的大小 -- 在 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
重新启动服务器后,我重新运行了ghost tester(https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c)。
这次我得到的是“不应该发生”而不是“易受攻击”,我想这很好。但我曾预计会变得“不易受到攻击”我是否遗漏了什么,或者只是我的修复与受支持发行版中的官方修复不同?
【问题讨论】:
标签: c linux security centos redhat