サポート切れの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 |
機能自体が無効になったのを確認できた
脆弱性も解消。
ところが…再起動すると警告がたくさん出てきた!?
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); |
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 |
後1つ。
parse.y in bash/bash:master - Gitorious
bashの脆弱性CVE-2014-7186, CVE-2014-7187について - 気ままなブログ
他サイトの parse.yを参考にコードを埋め込んでみたのだけど、構造体のチェックがバージョンが古すぎて機能しないらしい。
|。・ω・)。o ( とりあえず、修正はここまで )
Comments