誰もがシェルスクリプトが大好きです!Linuxベースのセキュリティ製品のほとんどでシェルスクリプトが多用されているのも不思議ではありません。多くの場合、シェルスクリプトはC/C++プログラムに比べて開発が容易で、コンパイルの手間もかからず、プロトタイプ作成も容易です。
しかし、シェル スクリプトには、無限の用途があることに加えて、セキュリティの観点から多くの隠れた危険があり、シェル スクリプトを作成するときに見落とされがちです。
たとえば、ping コマンドを使用して 2 つのホスト間の接続を確認するだけのシェル スクリプトを考えてみましょう。
#!/ bin / bashに
ping –c1 “$1”
このユースケースでは、$1はCGIやその他のスクリプトから派生した可能性のある入力値です。入力値が適切に検証されていない場合、ハッカーはコマンド置換を簡単に悪用できます。
ping –c1 “8.8.8.8 && コマンド”
この例では、シェルスクリプトは渡された引数を ping 実行時に別のコマンドとして置き換えます。ただし、このコマンド置換を実現する方法は他にもいくつかあります。
ping –c1 “8.8.8.8`コマンド`”
ping –c1 8.8.8.8| command
ping –c1 8.8.8.8; コマンド
ゲートウェイレベルのセキュリティ製品のほとんどは、 統合脅威管理(UTM)ファイアウォールはエンドユーザー向けのポータルを提供します。ポータルは、リモートアクセスツールのダウンロード、隔離されたメールの取得、ユーザー設定の変更など、多くのサービスを容易にします。
これらのサービスは、何らかの形式のユーザー入力を期待し、ソフトウェア製品のバックエンドでシェル スクリプトを呼び出す場合があります。
このようなエクスプロイトにより、攻撃者は悪意のある入力を送信することで、脆弱なデバイス上でリモートコマンド実行によるルート権限を取得できます。脆弱なデバイスにアクセスできれば、攻撃者は組織のネットワークに侵入できます。
ユーザー入力はほとんどの場合検証されますが、検証が何度も欠落する可能性は常に存在します。
このコマンド置換攻撃は、攻撃者が有効な資格情報なしでこのエクスプロイトを実行できるため、「認証前リモート コマンド実行」とも呼ばれます。
ごく最近、この欠陥が有名ブランドのファイアウォール アプライアンスで発見されました。
In セクライト UTM当社では、デバイスがこのような一般的な脆弱性に対して脆弱にならないよう、開発中にこうした領域に明確に重点を置いています。
セキュア シェル スクリプトを作成するためのガイドラインを次に示します。
- スクリプトで使用するコマンドには絶対パスまたは相対パスを使用します。
- スクリプト内の PATH 変数の正しい値を設定します。
- 引数として渡される変数には適切な引用符を使用してください。



