サポート切れのbash に自分でSHELLSHOCKのパッチあててみた

Testing /bin/bash ...
Variable function parser active, maybe vulnerable to unknown parser bugs
Vulnerable to CVE-2014-6271 (original shellshock)
Vulnerable to CVE-2014-7169 (taviso bug)

Not vulnerable to CVE-2014-7186 (redir_stack bug)
Vulnerable to CVE-2014-7187 (nested loops off by one)
Not vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)

まず、元のバージョン bash 2.05b 以降のバージョンはパッチが公開されているのだが、それよりも古いので、自分でパッチを当てるしかないのだ。

|。・ω・)。o ( まず、適当にやってみた )
ところがシステムドライブがリードオンリーにロックされて異常動作する現象に!?
仕方ないので、別の仮想ドライブに mount -t ext2 /dev/hdb1 /submount でマウントしてから復元しましたとさ



ShellShocked - Behind the Bug
ここの記事によると

FreeBSD and NetBSD have disabled automatically importing functions by default to prevent future vulnerabilities.

となっていて、古いBSDなどは、関数のインポート機能自体を無効にしたらしい

私もこれにならって、 execute_cmd.cをいじることにした

case cm_function_def:
//    exec_result = execute_intern_function (command->value.Function_def->name,
command->value.Function_def->command);
    break;

テスト

Testing  ...

Variable function parser inactive, bugs not exploitable
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Found non-exploitable CVE-2014-7187 (nested loops off by one)
Found non-exploitable CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)

機能自体が無効になったのを確認できた
脆弱性も解消。
ところが…再起動すると警告がたくさん出てきた!?
BSDみたいに無効にしちゃいかんらしい…。

というわけでまじめにパッチあて

variables.c

      if (legal_identifier (name))
        parse_and_execute (temp_string, name, SEVAL_NONINT|SEVAL_NOHIST|SEVAL_FUNCDEF|SEVAL_ONECMD);

builtins/common.h

#define SEVAL_FUNCDEF 0x080
#define SEVAL_ONECMD  0x100

builtins/evalstring.c

      else if (command = global_command)
        {
          struct fd_bitmap *bitmap;
          if ((flags & SEVAL_FUNCDEF) && command->type != cm_function_def)
          {
             internal_warning ("%s: ignore function", from_file);
             should_jump_to_top_level = 0;
             last_result = last_command_exit_value = EX_BADUSAGE;
             break;
          }
          bitmap = new_fd_bitmap (FD_BITMAP_SIZE);
          begin_unwind_frame ("pe_dispose");
          add_unwind_protect (dispose_fd_bitmap, bitmap);
          add_unwind_protect (dispose_command, command);    /* XXX */
          global_command = (COMMAND *)NULL;

             :

          dispose_command (command);
          dispose_fd_bitmap (bitmap);
          discard_unwind_frame ("pe_dispose");
          if (flags & SEVAL_ONECMD)
            break;

parse.y

       FREE (word_desc_to_read);
       word_desc_to_read = (WORD_DESC *)NULL;
       eol_ungetc_lookahead = 0;
       last_read_token = '\n';
       token_to_read = '\n'; 

赤が追加したコード。

テスト

Testing  ...

Variable function parser active, maybe vulnerable to unknown parser bugs
Not vulnerable to CVE-2014-6271 (original shellshock)
Not vulnerable to CVE-2014-7169 (taviso bug)
Not vulnerable to CVE-2014-7186 (redir_stack bug)
Vulnerable to CVE-2014-7187 (nested loops off by one)
Not vulnerable to CVE-2014-6277 (lcamtuf bug #1)
Not vulnerable to CVE-2014-6278 (lcamtuf bug #2)

後1つ。

parse.y in bash/bash:master - Gitorious
bashの脆弱性CVE-2014-7186, CVE-2014-7187について - 気ままなブログ
他サイトの parse.yを参考にコードを埋め込んでみたのだけど、構造体のチェックがバージョンが古すぎて機能しないらしい。

|。・ω・)。o ( とりあえず、修正はここまで )

おすすめ

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です