bashの脆弱性CVE-2014-7186, CVE-2014-7187について

CVE-2014-6271やCVE-2014-7169と比べると影響は小さいですが、本家のGNUからは2014/09/30時点においてもパッチはリリースされていません。CVE-2014-6271の対処を済ませていれば発生条件を満たすスクリプトを書かない限り再現せず、その発生条件は通常の使用方法では満さないものであることから、GNUとしてもパッチのリリースを急いでいなかったのかもしれません。

CVE-2014-7186

下記のテストケースはCVE-2014-7186の不具合によりコア・ダンプしたり、フレーム・ポインターが書き換えられたりする可能性があります。

bash -c "true `yes '<<EOF' | head -20 | xargs echo`"

これはparse.yの中でリダイレクトの情報を積み上げるスタックとして使用している配列のサイズが10にハード・コーディングされていることが原因です。

static REDIRECT *redir_stack[10];

そのため、11以上ネストした場合にコア・ダンプしたり、フレーム・ポインターが書き換えられたりする可能性があります。

発生条件

ヒア・ドキュメントを11以上ネストして使用している場合に発生する可能性があります。

Red Hat社による修正

Red Hat社はこの不具合に対してパッチを提供しています。そのパッチでは、スタックをヒープ上に作成し不足した場合は追加の割り当てを行うように修正しています。

CVE-2014-7187

下記のテストケースはCVE-2014-7187の不具合によりエラー出力します。場合によってはコア・ダンプしたり、フレーム・ポインターが書き換えられたりする可能性があります。

bash -c "`yes 'for i in; do' | head -200; echo ':'; yes 'done' | head -200 `"

これも不具合箇所はparse.yです。

/* The line number in a script where the word in a `case WORD', `select WORD'
   or `for WORD' begins.  This is a nested command maximum, since the array
   index is decremented after a case, select, or for command is parsed. */
#define MAX_CASE_NEST   128
static int word_lineno[MAX_CASE_NEST];
static int word_top = -1;

    ........

    case FOR:
      if (word_top < MAX_CASE_NEST)
        word_top++;
      word_lineno[word_top] = line_number;
      break;

word_topの値が127の時に問題箇所を通過すると、word_top++で128になるため存在しない129番目の要素word_lineno[128]にアクセスしてします。その結果、コア・ダンプしたり、フレーム・ポインターが書き換えられたりする可能性があります。

発生条件

for、case、selectを128以上ネストしている場合に発生する可能性があります。

Red Hat社による修正

Red Hat社はこの不具合に対してパッチを提供しています。そのパッチでは、下記のように修正しています。

    case FOR:
      if (word_top + 1 < MAX_CASE_NEST)
        word_top++;
      word_lineno[word_top] = line_number;
      break;

2014/10/02追記

2014/10/02にCVE-2014-7186とCVE-2014-7187の両方をFixするパッチがリリースされました。 (bash43-028、他)