Ghost Vulnerability は、問題の影響を受けるOSへの(ログインしたユーザーとしての)アクセスを必要としますか?誰かが「アプリケーションを呼び出すことができるリモートの攻撃者」を明確にできますか?ローカルシステムで直接実行するテストを見つけるだけで、リモートホストからは実行しないようです。
これまでに収集した Ghost Vulnerability に関する複数の情報源からのすべての情報(それらの情報源へのクレジット)他の人が興味がある場合に備えて、以下の回答に投稿しました。
編集、私は answer を見つけました:
コード監査中に、Qualysの研究者は、glibcの__nss_hostname_digits_dots()関数でバッファオーバーフローを発見しました。このバグは、すべてのgethostbyname *()関数を介して、ローカルとリモートの両方でトリガーできます。アプリケーションは、主にgethostbyname *()関数セットを介してDNSリゾルバーにアクセスできます。これらの関数は、ホスト名をIPアドレスに変換します。
Qualys からの私の質問への回答:
テスト中に、私たちは特別に作成した電子メールをメールサーバーに送信し、Linuxマシンにリモートシェルを取得できる概念実証を開発しました。 これにより、32ビットシステムと64ビットシステムの両方で、既存のすべての保護(ASLR、PIE、NXなど)がバイパスされます。
探している他の人のために以下にまとめた私の研究:
他の多くのスレッド/ブログがあなたに言うかもしれないことにもかかわらず、私はこれらを徹底的にテストせずに盲目的にすべての単一のOSをすぐに更新することをしないことをお勧めしますglibc
アップデート。 glibcの更新により、アプリケーションの大規模なsegfaultが発生し、ユーザーがglibcの更新を以前のバージョンにロールバックする必要が生じたと報告されています。
テストせずに本番環境を大量更新するだけではありません。
GHOSTは、glibcライブラリのgethostbyname()およびgethostbyname2()関数呼び出しに影響する「バッファオーバーフロー」のバグです。この脆弱性により、リモートの攻撃者がこれらの関数のいずれかに対してアプリケーションを呼び出し、アプリケーションを実行しているユーザーの権限で任意のコードを実行することが可能になります。
Gethostbyname()関数呼び出しは、非常に一般的なイベントであるDNS解決に使用されます。この脆弱性を悪用するには、攻撃者はDNS解決を実行するアプリケーションに無効なホスト名引数を提供することにより、バッファオーバーフローをトリガーする必要があります。
RHEL(Red Hat Enterprise Linux)バージョン5.x、6.xおよび7.x
RHEL 4 ELS fix available ---> glibc-2.3.4-2.57.el4.2
Desktop (v. 5) fix available ---> glibc-2.5-123.el5_11.1
Desktop (v. 6) fix available ---> glibc-2.12-1.149.el6_6.5
Desktop (v. 7) fix available ---> glibc-2.17-55.el7_0.5
HPC Node (v. 6) fix available ---> glibc-2.12-1.149.el6_6.5
HPC Node (v. 7) fix available ---> glibc-2.17-55.el7_0.5
Server (v. 5) fix available ---> glibc-2.5-123.el5_11.1
Server (v. 6) fix available ---> glibc-2.12-1.149.el6_6.5
Server (v. 7) fix available ---> glibc-2.17-55.el7_0.5
Server EUS (v. 6.6.z) fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 6) fix available ---> glibc-2.12-1.149.el6_6.5
Workstation (v. 7) fix available ---> glibc-2.17-55.el7_0.5
CentOS Linuxバージョン5.x、6.x、7.x
CentOS-5 fix available ---> glibc-2.5-123.el5_11
CentOS-6 fix available ---> glibc-2.12-1.149.el6_6.5
CentOS-7 fix available ---> glibc-2.17-55.el7_0.5
Ubuntu Linuxバージョン10.04、12.04 LTS
10.04 LTS fix available ---> libc6-2.11.1-0ubuntu7.20
12.04 LTS fix available ---> libc6-2.15-0ubuntu10.10
Debian Linuxバージョン6.x、7.x
6.x squeeze vulnerable
6.x squeeze (LTS) fix available ---> eglibc-2.11.3-4+deb6u4
7.x wheezy vulnerable
7.x wheezy (security) fix available ---> glib-2.13-38+deb7u7
Linux Mintバージョン13.0
Mint 13 fix available ---> libc6-2.15-0ubuntu10.10
Fedora Linuxバージョン19(または古いものはアップグレードする必要があります)
Fedora 19 - vulnerable - EOL on Jan 6, 2014 (upgrade to Fedora 20/21 for patch)
SUSE Linux Enterprise
Server 10 SP4 LTSS for x86 fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for AMD64 and Intel EM64T fix available ---> glibc-2.4-31.113.3
Server 10 SP4 LTSS for IBM zSeries 64bit fix available ---> glibc-2.4-31.113.3
Software Development Kit 11 SP3 fix available ---> glibc-2.11.3-17.74.13
Server 11 SP1 LTSS fix available ---> glibc-2.11.1-0.60.1
Server 11 SP2 LTSS fix available ---> glibc-2.11.3-17.45.55.5
Server 11 SP3 (VMware) fix available ---> glibc-2.11.3-17.74.13
Server 11 SP3 fix available ---> glibc-2.11.3-17.74.13
Desktop 11 SP3 fix available ---> glibc-2.11.3-17.74.13
openSUSE(11より古いバージョンはアップグレードする必要があります)
11.4 Evergreen fix available ---> glibc-2.11.3-12.66.1
12.3 fix available ---> glibc-2.17-4.17.1
( ジルへのクレジット )
lsof -o / | awk '
BEGIN {
while (("rpm -ql glibc | grep \\\\.so\\$" | getline) > 0)
libs[$0] = 1
}
$4 == "DEL" && $8 in libs {print $1, $2}'
lsof -o / | awk '
BEGIN {
while (("dpkg -L libc6:AMD64 | grep \\\\.so\\$" | getline) > 0)
libs[$0] = 1
}
$4 == "DEL" && $8 in libs {print $1, $2}'
バージョン番号を確認する最も簡単な方法は、次のコマンドを実行することです。
ldd --version
ldd (GNU libc) 2.12
Copyright (C) 2010 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
ldd (Ubuntu EGLIBC 2.15-0ubuntu10.9) 2.15
Copyright (C) 2012 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
ldd (Debian EGLIBC 2.13-38+deb7u6) 2.13
Copyright (C) 2011 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Written by Roland McGrath and Ulrich Drepper.
シカゴ大学では、簡単にダウンロードできるように以下のスクリプトをホストしています。
$ wget https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
[OR]
$ curl -O https://webshare.uchicago.edu/orgs/ITServices/itsec/Downloads/GHOST.c
$ gcc GHOST.c -o GHOST
$ ./GHOST
[responds vulnerable OR not vulnerable ]
/* ghosttest.c: GHOST vulnerability tester */
/* Credit: http://www.openwall.com/lists/oss-security/2015/01/27/9 */
#include <netdb.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
#define CANARY "in_the_coal_mine"
struct {
char buffer[1024];
char canary[sizeof(CANARY)];
} temp = { "buffer", CANARY };
int main(void) {
struct hostent resbuf;
struct hostent *result;
int herrno;
int retval;
/*** strlen (name) = size_needed - sizeof (*Host_addr) - sizeof (*h_addr_ptrs) - 1; ***/
size_t len = sizeof(temp.buffer) - 16*sizeof(unsigned char) - 2*sizeof(char *) - 1;
char name[sizeof(temp.buffer)];
memset(name, '0', len);
name[len] = '\0';
retval = gethostbyname_r(name, &resbuf, temp.buffer, sizeof(temp.buffer), &result, &herrno);
if (strcmp(temp.canary, CANARY) != 0) {
puts("vulnerable");
exit(EXIT_SUCCESS);
}
if (retval == ERANGE) {
puts("not vulnerable");
exit(EXIT_SUCCESS);
}
puts("should not happen");
exit(EXIT_FAILURE);
}
次のようにコンパイルして実行します。
$ gcc ghosttester.c -o ghosttester
$ ./ghosttester
[responds vulnerable OR not vulnerable ]
Sudo yum clean all
Sudo yum update
再起動して有効にします。
Sudo reboot
または、ミラーに最新のパッケージが含まれていない場合は、手動でダウンロードしてください。 *注:上級ユーザー向け
http://mirror.centos.org/centos/5.11/updates/x86_64/RPMS/
mkdir ~/ghostupdate
cd ~/ghostupdate
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-common-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/nscd-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-headers-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-utils-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.x86_64.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-static-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-devel-2.12-1.149.el6_6.5.i686.rpm
wget http://mirror.centos.org/centos/6.6/updates/x86_64/Packages/glibc-2.12-1.149.el6_6.5.i686.rpm
yum localupdate *.rpm [OR] rpm -Uvh *.rpm
Sudo apt-get clean
Sudo apt-get update
Sudo apt-get dist-upgrade
再起動:
Sudo reboot
このSUSEセキュリティアップデートをインストールするには、YaST online_updateを使用します。または、バージョンごとに次のコマンドを使用します。
zypper in -t patch sdksp3-glibc-10206
zypper in -t patch slessp3-glibc-10206
zypper in -t patch slessp3-glibc-10206
zypper in -t patch slessp2-glibc-10204
zypper in -t patch slessp1-glibc-10202
zypper in -t patch sledsp3-glibc-10206
zypper patch
OpenSUSE Linuxでglibcを含む利用可能なアップデートのリストを表示するには、次のように入力します。
zypper lu
インストールされているglibcパッケージを利用可能な新しいバージョンで更新するには、次のコマンドを実行します。
zypper up
telinit u
'man telinit'-Uまたはu。init(8)デーモンが自分自身を再実行することを要求します。 Upstartは現在その状態を保持できないため、これは推奨されませんが、システムライブラリをアップグレードするときに必要です。
制限された方法で脅威をすぐに軽減するには、すべてのパブリックサービスで逆DNSチェックを無効にします。たとえば、/etc/ssh/sshd_config
でUseDNS
をno
に設定することにより、SSHでの逆DNSチェックを無効にすることができます。
ソース(および詳細):