bash 算術拡張は注入攻撃に対して脆弱に見えます。

bash 算術拡張は注入攻撃に対して脆弱に見えます。

スクリプトが環境から変数を取得したいとしましょう。

#!/usr/bin/env bash
set -eu

if (( ${A-} )); then
    echo true
else
    echo false
fi

(empty)ここでは、算術拡張は、、0大文字1小文字などを処理するのにより合理的に見えます。

if [ "${A-}" ] && [ "${A-}" != 0 ]; then

しかしそれ以降

$ A='1 - 1' ./1.sh
false
$ A='B = 1' ./1.sh
true

これで、通常は許可しない変数をデフォルトで変更できます。どんな提案がありますか?環境変数から取得したブールフラグをどのように処理しますか?

答え1

変数にintが含まれているかどうかわからない場合は、その値を確認できます。

#!/usr/bin/env bash
set -eu

vint() {
    local v
    for v; do
        if echo "$v" | egrep '[^0-9]' &> /dev/null; then
            printf '%s: %s: not an int\n' "$0" "$v" >&2
            exit 1
        fi
    done
}

vint "${A-}"
if (( ${A-} )); then
    echo true
else
    echo false
fi

これが私が受け入れることができるものです。

関連情報