【问题标题】:Manually patching for Ghost vulnerability on legacy server手动修补旧服务器上的 Ghost 漏洞
【发布时间】: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


    【解决方案1】:

    我一直在为旧的 Fedora 版本寻找类似的补丁... 我在 ServerFault 上找到了这个关于修补旧版 Debian Lenny 的问答:

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

    在其中一个答案中,它们链接到official glibc patch,其中的差异显示了除您之外的一些其他编辑。可能是丢失的*status = NSS_STATUS_NOTFOUND; 进入了“不应该发生”状态。

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

    【讨论】:

    • 同意。只需查看 .patch 并将其用作指南。
    • @jason_uruguru 谢谢 - 我使用了官方的 glibc 补丁作为修补我的系统的指南,它似乎很有魅力!
    • 感谢这里的所有信息,很好的学习。即使我紧贴补丁,除了跳过 test-digits-dots.c 之外,我也得到“不应该发生”。 @Jim,是否有特定的代码更改或配置最终使它变得更好?
    • @rvh 不,我刚刚浏览了完整的官方补丁并将相同的更改应用于我的源代码。您要修补什么发行版?
    • @Jim,我没有看到 getXXbyYY_r.c 的模组。一旦我在那里进行了更改,一切都很好。我必须为 Fedora14 做一个,为 Fedora17 做一个。我也有一个 RHEL5.1,但由于某种原因无法访问存储库,所以我只是从 CentOS5.1 存储库中提取了 glibc 更新。工作得很好。没有太多关于手动修补的信息,所以这篇文章很有帮助。
    猜你喜欢
    • 1970-01-01
    • 2018-12-24
    • 1970-01-01
    • 2021-11-19
    • 2019-01-12
    • 2015-05-03
    • 2022-01-16
    • 1970-01-01
    相关资源
    最近更新 更多