フォーマット文字列の問題
フォーマット文字列の1つの問題は、いくつかの新たな攻撃を真に表面近年ます。 1つのフォーマット文字列の最初の言及バグだった6月23日、 2000年に投稿されlamagra argamal ( www.securityfocus.com/archive/1/66842 ) ;パスカルbouchareineより明確に説明してほぼ1カ月後に( www.securityfocusします。 com/archive/1/70552 )します。 以前の投稿されるマークスレムコ氏( www.securityfocus.com/archive/1/10383 )によると、基本的な問題が、見逃しの能力をフォーマット文字列のバグを書くメモリします。 多くのセキュリティ上の問題と同様に、根本的な原因は、フォーマット文字列のバグを検証せずに信じて疑わないユーザーの入力に供給されます。 はc / c + +でフォーマット文字列のバグを書くために使用することができ、任意の場所を記憶し、最も危険な側面は、このことが起こり得るの改ざんをせずに隣接するメモリブロックします。 この機能により、きめの細かい保護を、攻撃者がバイパススタック、および変更しても非常に小さい部分のメモリをします。 することもでき、問題が発生したときの形式の文字列は読んで、信頼できない場所からの攻撃を制御します。 この後者の面での問題になりがちunixとlinuxシステムをもっと普及しています。 windowsシステム上で、テーブルの文字列は、通常のアプリケーションプログラムの実行ファイル内の保管、またはリソースのダイナミックリンクライブラリ( dll )します。 書き換えることができた場合、攻撃者の主な実行ファイルまたはdllのリソースは、攻撃を実行することができ直接的な攻撃よりもさらに多くのフォーマット文字列のバグを解決します。 にも対処できていない場合用c / c + + 、フォーマット文字列攻撃につながることもかなりの問題があります。 最も明白なのは、ユーザーを迷わせすることができ、しかし、いくつかの条件の下で、攻撃者にも開始するかもしれないsqlインジェクションやクロスサイトスクリプティング攻撃します。 破損または使用することができ、これらのデータに変換されます。 影響を受けた言語最も強く影響を受けた言語はc / c + +にします。 攻撃に成功することができ鉛すぐに任意のコードの実行、および情報を開示します。 他の言語では通常許可されません任意のコードの実行が、他の種類の攻撃の可能性として私たちは以前にメモします。 perlの脆弱性を直接指定ではありませんが与えられたユーザーの入力したが、それ可能性がある場合、フォーマット文字列の脆弱性は、読み取りからデータを改ざんします。 の犯した罪の説明フォーマットのデータを表示したりすることができ、ストレージやや困難な仕事です。 このように、多くのコンピュータ言語を含めるルーチンを簡単にデータを再フォーマットします。 はほとんどの言語では、いくつかのフォーマットを使って説明する情報は、文字列の並べ替え、書式指定文字列と呼ばれます。 フォーマット文字列は、実際に使用して定義して限られたデータ処理言語の設計を行うことを簡単に説明する出力フォーマットします。 しかし、多くの開発者が簡単に行う-ミスからのデータを使用してユーザーを信頼していないフォーマット文字列です。 その結果、攻撃を書くことができ言語の文字列のデータ処理の多くの問題を引き起こすします。 の設計用c / c + +これにより、特に危険:用c / c + + '秒のデザインフォーマット文字列を検出することが困難な問題は、フォーマット文字列を含めると、特に危険ないくつかのコマンド(特に% n )を他のいくつかの存在していない言語'形式の文字列の言語です。 はc / c + +には、関数の宣言を取ることができ、可変の数の引数を指定することによって、省略( … )としての最後の引数(またはのみ)します。 問題は、その機能と呼ばれていませんがどのように多くの方法を知っているだけに渡されます。引数は、最も共通セットを取るための関数の可変長引数は、家族のprintf :するprintf 、 sprintf 、 snprintf 、するfprintf 、 vprintf 、そして今します。 ワイド文字関数は、同じ機能を実行しても同じ問題だ。 ましょう見てみると、イラスト: #含める<stdio.h> intメイン( int argc 、 argvを文字* [ ] ) 戻り0 ; かなり単純なものです。 今すぐ見てみましょうどのような間違って行くことができます。 プログラマの入力をユーザーに何かを期待良性など、 hello worldをします。 試してみた場合、 hello worldを得ることができますバックします。 今すぐに変更してみよう入力してみてください% × % xのほとんど windows xpシステムを使用して、デフォルトのコマンドライン( cmd.exe )は、今すぐに以下のようでしょう: のe : \プロジェクト\ 19_sins \ format_bug > format_bug.exe " % % × × " 注意して実行している場合、別のオペレーティングシステム、または別のコマンドラインインタープリタを使用するには、いくつかの変更を行う必要があり、この正確な文字列を取得するにして育てられたプログラム、およびその結果は異なる可能性があります。 使いやすさを、引数に入れることができ、シェルスクリプトまたはバッチファイルをします。 何が起こったか? 入力した文字列のprintf関数を引き起こしたことに押されることを期待する2つの引数をスタックに入る前に、関数の呼び出しました。 指定して% ×有効になってあなたを読むにはスタック、 4バイト、一度に限りご希望します。 難しいことではありませんを想像していた場合は、より複雑な機能を格納する変数の秘密は、スタック、攻撃者は、その後の秘密を読むことができます。 ここでは、アドレスの出力のスタックの場所( 0x12ffc0 )で、次いで、コードの場所は、 main ( )関数が返されています。 と想像することができ、これらの両方が非常に重要な情報を攻撃されている流出します。 今すぐことができだろうと考えて攻撃を使用するだけでどのようにフォーマット文字列のバグを書く記憶します。 いずれかの形式指定子は% n以上使用され、これに書き込みの数文字を書かなければならなかったことを、これまでのところ、変数のアドレスを渡したとして、対応する引数ます。 次のように使用されなければならないこと: バイト符号なしint ; 出力だろう: のe : \プロジェクト\ 19_sins \ format_bug > format_bug2.exe "いくつかのランダム入力" いくつかのランダム入力 入力した17文字の長さ プラットフォームでは、 4バイトの整数、 4バイトの書き込みが指定% nをまとめて、 2バイトの書き込みがホンジュラス%とします。 今の攻撃だけで済むようにする方法を見つけ出す彼らのアドレスを取得するには、適切な位置にしたいのですが、スタック、および微調整して、フィールドの幅のバイト数を指定されるまでは、何をしたいのですが書き込まれます。 今のところ、そうせずにできるようにする場合を想定して攻撃を制御するフォーマット文字列が用c / c + +プログラムで、これは、前に彼らを理解するのは時間の問題をどのようにコードを実行しています。 意地の悪い側面には、特にこのタイプの攻撃が開始される以前は、攻撃することができ、スタックプローブを攻撃して修正して飛行します。 実際のところ、このデモの著者が初めて公共の攻撃、彼はコマンドラインで使用され、別の通訳よりも彼の作成に使用したデモでは、仕事をしていないとします。 この柔軟性のためにユニークな攻撃だった可能性が悪用問題を修正すると、サンプルアプリケーションには、観客を見ています。 他のほとんどの言語をサポートしていないと同等の書式指定% nを、かれらに直接脆弱性が存在していません簡単に供給されたコードの実行を攻撃者が、問題はまだ実行できています。 他には、もっと複雑な変種が他の言語では、この脆弱性を攻撃しています。 もしフォーマット文字列を指定することができ攻撃の出力をログファイルまたはデータベースに、彼らを引き起こす可能性が間違っていたり誤解を招くようログに記録します。 さらに、アプリケーションのログを読んで、信頼できる可能性を検討して入力し、一度は、この仮定に違反し、そのアプリケーションの弱点パーサーにつながる可能性が任意のコードの実行します。 関連する問題は、ログファイルに制御文字を埋め込む- backspacesに使用できるものを消去する;行ターミネータをぼかすことができたり、攻撃の痕跡を排除します。 と言ってなければならず、この場合、フォーマット文字列を指定することができ、攻撃者に育てられたscanf関数または類似し、災害がオンにしてください。 罪深い用c / c + +他の多くの欠陥を検討いたしますとは違って、これはかなり容易にコードの欠陥としてスポットします。 それは非常に簡単である: するprintf ( user_input ) ; するprintf ( " % s "を、 user_input ) ; 1つの変種を無視して問題があることを多くのプログラマは、それが正しくこれを行うには十分ではありません、 1回だけです。 そこは、数多くの共通のコード構文はどこに使用します。 sprintfフォーマット済みの文字列を置くためにバッファを、そしてスリップして、このアップ: するfprintf (標準出力、 err_msg ) ; 関連の罪ものの、最も明白な攻撃は、コードの欠陥に関連して、それは共通のアプリケーションの練習を置く国際化を目的に、文字列を外部ファイルにします。 お客様のお申し込みされなかった罪を犯した場合は、適切なファイルを保護するため、その供給することができフォーマット文字列を攻撃者不足のため適切なファイルにアクセスできます。 別の関係を適切に検証できなかった罪は、ユーザーの入力します。 いくつかのシステムでは、環境変数のロケール情報を指定しており、ロケールには、電源、特定の言語を決定したディレクトリにファイルが見つかりました。 いくつかのシステムでは、攻撃者にも原因かもしれない任意のディレクトリにしてアプリケーションを見ています。 スポッティングの犯した罪のパターンユーザーの入力して任意のアプリケーションを通過することができ、書式関数は、潜在的に危険にさらされます。 非常に共通のインスタンスを1つの罪で起こることは、このアプリケーションを併用してユーザーの入力してログインします。 さらに、いくつかの機能を実装するかもしれ内部フォーマットします。 スポッティングの犯した罪の間のコードの見直しはc / c + +で探すのprintf関数からのご家族です。 問題を探すためには するprintf ( user_input ) ; 表示された場合は、この機能のように見える: するfprintf (標準出力、 msg_format 、値arg1 、引数2 ) ; 次に、文字列を確認する必要がどこに記載されmsg_formatは、どのように保存さであることは保護されます。 そこには他の多くのシステムコールのapiとしても脆弱性- syslogが1つの例です。 たら、いつでも関数の定義を参照してください…は、引数のリストが含まれる場合、あなたは何かを見ることが予想される問題である。 多くのソースコードスキャナ、ネズミを使ったようなものでさえ、語彙とflawfinder 、これを検出することができます。 さらにpscan ( www.striker.ottawa.on.ca/ 〜オーランド/ pscan / )は、専用に設計されたようです。 ツールでもあり対抗することができて、コンパイルの過程に組み込まれました。 たとえば、あるクリスピンコーワンのformatguard : http://lists.nas.nasa.gov/archives/ext/linux-security-audit/2001/05/msg00030.html テストのテクニックを紹介して罪を見つけるパスのフォーマットを参照してください指定された場合には、アプリケーションを16進値が返されます。 たとえば、アプリケーションをお持ちの場合は、ファイル名を返すことを期待するとエラーメッセージが含まれ、入力時にファイルが見つかりません、してみてファイル名を与えるようなnotlikely % × % x.txtます。 エラーメッセージが表示された場合の趣旨に沿って" notlikely12fd234104587.txtことはできませんが見つかりました、 "じゃあしても、書式指定文字列の脆弱性が見つかりました。 これは明らかに多少の言語に依存し;パスのフォーマットを指定する必要があり使用されている言語で実装され、少なくともご使用します。 しかし、実行時間が記録されて以来多くの言語で実装され用c / c + + 、賢明なことでしょうにも送信用c / c + +フォーマットのコマンド文字列を検出する場合には、危険なライブラリの脆弱性を基礎としています。 注意している場合はウェブベースのアプリケーションがこだまして、ユーザーの入力に戻る場合は、別の関心事だろうクロスサイトスクリプティング攻撃 罪の例次のエントリに共通の脆弱性や撮り(れるcve )をhttp:// cve.mitre.orgの例は、 sqlインジェクションします。 エントリのうち、 188れるcveフォーマット文字列を参照し、これはただのサンプリングします。 れるcve - 2000 - 0573れるcveからの説明: " lreply機能呉- ftpd 2.6.0およびそれ以前はありません適切な信頼性のないフォーマット文字列を清めて、これを使うと、リモートの攻撃者のサイトを経由して任意のコマンドを実行execコマンド"と述べた。 公に知られるのは今回が初めてのフォーマット文字列のバグを悪用します。 投稿のタイトルをbugtraqアンダースコアの重症度の問題: "を提供するリモート* *ルート以来、少なくとも1994年に"と述べた。 れるcve - 2000 - 0844れるcveからの説明: "いくつかの機能を実装するサブシステムをunixのロケールのユーザーを清めて適切に注入されていないフォーマット文字列は、ローカルの攻撃者が任意のコマンドを実行できるように経由でのような関数gettextとcatopen "と述べた。 オリジナルの全文を諮問することができ見つかりwww.securityfocus.com/archive/1/80154 、この問題は特に興味深いapiをコアシステムに影響を与えるので、ほとんどのunixの変種(リナックスを含む)を除き、 bsdの変種のためにという事実を無視してnlspath変数が特権スードbsdのアプリケーションです。 このアドバイザリは、多くのコア市政研のよう勧告、と書いた井戸は、特に有益で、非常に詳細な説明を与え、全体的な問題 償還手順最初のステップは決してユーザーのパスを直接入力する機能のフォーマット、また、必ずこれを行うには、すべてのフォーマットの処理のレベルを出力します。 注記として、重要な機能が頭上フォーマットします。 ソースを見るために_outputもし興味が便利かもしれません。 -を書く: するfprintf (標準出力、 buf ) ; 前述のコード行に危険なだけではありませんが、それにもたくさんの余分なcpuサイクルを消費します。 2つ目のステップを取ることを確認して、フォーマット文字列を使ってお客様のお申し込みは、信頼できる場所からの読み取りのみ、およびパスを文字列をしてはできません。攻撃者によって制御されます。 向けのコードを書く場合はunixとlinuxには、次の例では、 bsdの変種と無視してnlspathな変数であり、使用することができ、ファイルを指定するために使用され、ローカライズメッセージ、いくつかの縦深防御提供する場合があります。 用c / c + +償還それがありません。これよりもはるかに: するprintf ( " % s "を、 user_input ) ;余分な防衛策 チェックのロケールに有効な値に制限するとします。 (詳細については、を参照してくださいデビッドホイーラーの"を書くことを確保:フォーマット文字列のフィルタリングとロケール"に載っている"その他の資源"を参照してください) 。 を使用しない場合のprintf関数の家族を避けることができています。 たとえば、 c + +を使用している場合は、演算子の代わりに使用するストリーム: #含める<iostream>その他の資料
これは、記事に追加されhendra牙
|
|||
|