Jim*_*alo 5 c linux security redhat centos
我有一个遗留的Redhat ES 3.x服务器(由于古老的,不受支持的应用程序的限制,我不能在以后的发行版中使用),我正在尝试为Ghost漏洞手动修补glibc.
根据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
Run Code Online (Sandbox Code Playgroud)
接下来,我主要根据以上Qalys文章中的这一段编辑了nss/digits_dots.c:
第121-125行准备指针以在缓冲区中存储四(4)个不同的实体:host_addr,h_addr_ptrs,h_alias_ptr和hostname.在计算size_needed时缺少sizeof(*h_alias_ptr) - char指针的大小.
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);
Run Code Online (Sandbox Code Playgroud)
接下来,我创建了一个补丁文件+更新了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
Run Code Online (Sandbox Code Playgroud)
最后,我使用新的二进制文件(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
Run Code Online (Sandbox Code Playgroud)
重新启动服务器后,我重新运行了ghost测试器(https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c).
这次我得到"不应该发生"而不是"弱势",我认为这很好.但是我原本期望得到"不易受攻击"我是否错过了什么,或者仅仅是因为我的修复与支持发行版中的官方修复有所不同?
小智 3
我一直在为旧的 Fedora 版本寻找类似的补丁...我在 ServerFault 上发现了这个问答,它是关于修补旧的 Debian Lenny 的:
在其中一个答案中,他们链接到官方 glibc 补丁,该补丁显示了除您之外的一些其他编辑。可能正是因为缺失 *status = NSS_STATUS_NOTFOUND;,才进入了“不应该发生”的状态。
希望有帮助!(抱歉,没有足够的代表积分来支持您的问题...)