我有一个遗留的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)个不同的实体 buffer:host_addr,h_addr_ptrs,h_alias_ptr和hostname。的大小 (* 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);
接下来,我创建了一个补丁文件+更新了spec文件以包含我的补丁+内置二进制文件:
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测试器(https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c)。
这次我得到了#34;不应该发生"而不是"易受攻击",我认为这是好的。但是我原本期望得到“不易受伤害的”#34;我是否遗漏了某些内容,或者仅仅是因为我的修复与受支持的发行版中的官方修复有所不同?
答案 0 :(得分:3)
我一直在为旧的Fedora发布寻找类似的补丁...... 我在ServerFault发现了这个Q& A,它是关于修复旧的Debian Lenny:
在其中一个答案中,它们会链接到official glibc patch,差异会显示除您之外的其他一些编辑内容。可能缺少的*status = NSS_STATUS_NOTFOUND;
正在进入“不应该发生”状态。
希望有所帮助! (抱歉没有足够的Rep积分来支持你的问题...)