labunix's blog

labunixのラボUnix

CVE-2012-0056 Debianで今考えられる対応

■CVE-2012-0056の脆弱性について

 以下にあるように影響を受けるのはWheezyだけです。

 また、Debianではgccがデフォルトでは入っていませんが、

 対象アーキテクチャ用に一度コンパイルされてしまえば実行出来てしまいます。

 

 参考:CVE-2012-0056

http://security-tracker.debian.org/tracker/CVE-2012-0056

 ・Lennyの場合は以下のエラーでコンパイルが通りません。

$ gcc -o CVE-2012-0056-Mempodipper mempodipper.c
/tmp/cc4G7jGt.o: In function `ptrace_address':
mempodipper.c:(.text+0x23b): undefined reference to `pipe2'
collect2: ld returned 1 exit status

  ・Squeezeではコンパイルが通り、実行出来ますが、rootにはなれません。

 

 参考:index : CVE-2012-0056

 http://git.zx2c4.com/CVE-2012-0056/tree/

 

■実際にダウンロードで感染するとしたら、実行権限の付与と実行が必要です。

 

$ ls -l CVE-2012-0056-Mempodipper | awk '{print $1 " " $9}'

-rwxr-xr-x CVE-2012-0056-Mempodipper

 

$ ./CVE-2012-0056-Mempodipper

===============================

=          Mempodipper        =

=           by zx2c4          =

=         Jan 21, 2012        =

===============================

 

[+] Ptracing su to find next instruction without reading binary.

[+] Creating ptrace pipe.

[+] Forking ptrace child.

[+] Waiting for ptraced child to give output on syscalls.

[+] Ptrace_traceme'ing process.

[+] Error message written. Single stepping to find address.

[+] Resolved call address to 0x8049984.

[+] Opening socketpair.

[+] Waiting for transferred fd in parent.

[+] Executing child from child fork.

[+] Opening parent mem /proc/5842/mem in child.

[+] Sending fd 6 to parent.

[+] Received fd at 6.

[+] Assigning fd 6 to stderr.

[+] Calculating su padding.

[+] Seeking to offset 0x804996f.

[+] Executing su with shellcode.

#
 
■対策
 解決は、Kernel側で行うものとして、
 回避策は、現状では「気を付ける」以外に無い。
 具体的に何に気をつけるかと言えば、思いつくのは以下の通り。
 
・Wheezyでgccコンパイルする際にはソースに気をつける
 ※面倒でもgccコンパイルが必要になったときだけインストールする
  コンパイル前にソースを読むなど。
 
・実行権限を付与する際に気をつける。
  /proc以下を除いた実行権限のあるファイルの一覧「~/exec.list」を取得し、増分を比較、チェックする。
  ※UNIX時間でユニークになるようにしている。
 
$ sudo find / -perm /u+x -type f ! -path '/proc/*' > ~/exec.list_`date '+%s'`

・余分なパスが通っていないか注意する。
 ※ゲームを使っていない人(私)は、「/usr/games」は不要のはず。
  「/etc/login.defs」でデフォルトの環境変数「PATH」の設定が変更出来る。
  その他核ユーザごとの設定やcron、shellのソース等も確認する。
 
$ echo $PATH
/usr/local/bin:/usr/bin:/bin:/usr/games

$ sudo grep PATH /etc/login.defs | grep -v "^#"
ENV_SUPATH      PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
ENV_PATH        PATH=/usr/local/bin:/usr/bin:/bin:/usr/games

この位だろうか。。。