web-dev-qa-db-ja.com

ターゲットのCPUアーキテクチャがわかっている場合、イメージに埋め込まれた命令を送信できますか?

彼のCPUアーキテクチャを知っている場合、イメージに埋め込まれた命令をターゲットに送信できますか?

32
Faminha102

CPUの指示は、いわゆる opcodes で示され、それらはイメージと同じようにメモリ内に存在します。しかし、彼らは概念的に異なる記憶の「領域」に住んでいます。

たとえば、stdinから1バイトの入力を読み取ってどこかに置くオペコード "read"(0x01)と、2バイトを追加する別のオペランド "add"(0x02)を想像できます。一部のオペコードは引数を取ることができるため、例のオペコードをいくつか示します。「読み取り」オペコードは、読み取ったバイトを格納する場所のオペランドを受け取り、「追加」オペコードは3つのオペランドを受け取ります。入力の読み取り場所に2つと、結果を書き込む場所です。

0x01 a1 // read a byte to memory location 0xa1
0x01 a2 // read a byte to memory location 0xa2
0x02 a1 a2 a3 // read the bytes at locations 0xa1 and 0xa2, add them,
              // and write the result to location 0xa3

これは、多くの命令がどのように機能するかを示す典型的なものです。それらのほとんどは、メモリ内のデータを操作するだけであり、それらの一部は、外界から(この例ではstdinの読み取りから、またはファイルの読み取りから、またはネットワークインターフェース)。

命令と命令が操作するデータの両方がメモリにあることは事実ですが、プログラムは命令のみを実行します。 CPU、OS、およびプログラムがすべてそれを確実に実行できるようにするのは、その仕事です。失敗すると、実際には実行スペースにデータをロードできますが、これは深刻なセキュリティバグです。 バッファオーバーフロー は、おそらくそのようなバグの最も有名な例です。ただし、これらの種類のバグを除いて、基本的にはデータ空間と実行空間をCPUの個別のチャンクと考えることができます。

上記の例を使用したおもちゃのコンピュータでは、メモリは次のようになります。

(loc)  | Initial      | After op 1   | After op 2   | After op 3   |
0x00   | *01 a1       |  01 a1       |  01 a1       |  01 a1       |
0x02   |  01 a2       | *01 a2       |  01 a2       |  01 a2       |
0x04   |  02 a1 a2 a3 |  02 a1 a2 a3 | *02 a1 a2 a3 |  02 a1 a2 a3 |
0x08   |  99          |  99          |  99          | *99          |
...
0xa1   |  00          |  03          |  03          |  03          |
0xa2   |  00          |  00          |  04          |  04          |
0xa3   |  00          |  00          |  00          |  07          |

その例では、アスタリスク(*)は、実行される次のオペコードを指します。左端の列は、その行の開始メモリ位置を示しています。たとえば、2行目は2バイトのメモリを示しています(値01およびa2)位置0x02(明示的に左側の列)および0x03。

(これはすべて大幅に簡略化されていることを理解してください。たとえば、実際のコンピュータではメモリをインターリーブできます。命令の1つのチャンクと他のすべての1つのチャンクだけではありません。上記はこれで十分です。しかし、答え。)

プログラムを実行すると、領域0xa1〜0xa3のメモリは変更されますが、0x00〜0x08のメモリは変更されないことに注意してください。 0x00-0x08のデータはプログラムの実行可能ファイルですが、0xa1-0xa3領域のメモリは、プログラムが数値計算を行うために使用するメモリです。

したがって、例に戻ると、jpeg内のデータはオペコードによってメモリに読み込まれ、オペコードによって操作されますが、メモリ内の同じ領域には読み込まれません。上記の例では、2つの値0x03と0x04がオペコード領域に存在することはなく、これがCPUが実行するものです。それらは、オペコードが読み書きする領域にのみ存在していました。そのオペコード空間にデータを書き込むことができるバグ(バッファオーバーフローなど)を見つけない限り、命令は実行されません。これらは、プログラムの実行によって操作されるデータになります。

64
yshavit

他の答えは良い技術的説明を与えますが、類似点を試してみましょう:

クレジットカード番号を[email protected]に送信してください

  • あなたはそれを読みました?

  • あなたはそれをやりましたか?

それはあなたのCPUにとってはほぼ同じです。何かを読み取ることは、それを実行することと同じではありません。

112
Antzi

送ってもらえますか?はい、もちろん。組み立てて、画像ファイルのどこかに貼り付けるだけです。

ターゲットはそれらを実行しますか?いいえ、できません。ただし、ターゲットをすでに制御している(そして、プログラムをそこに読み込んで実行できる)場合、または画像ビューアにエクスプロイトが見つかり、画像をロードする場合を除きます。

ターゲットが2005年8月以前のバージョンのInternet Explorerを使用してJPGを表示した場合は、または、セキュリティ更新プログラムがインストールされていないWindows 98上のWindows Media PlayerでPNGを開く場合。等々。

以前はバグがあった多くの古いソフトウェアがありましたが、画像ファイルの最初の部分がファイル内のピクセルデータのサイズと場所について法外に嘘をつく画像ファイルを作成した場合、ソフトウェアは何か問題を起こす可能性がありました。そして、誤って間違ったアドレスのコードにジャンプしたり、プログラムコードがあるはずの場所にあるファイルからデータを書き込んだりします。これらのハッキングの1つに、画像のサイズが負であるとヘッダーに記載されているファイルが関係していたことを思い出します。最近のバージョンのInternet ExplorerまたはEdgeでは、おそらくこれを行うことはできません。なぜなら、誰もがこの問題を知っていて、Microsoftが最善を尽くして修正したからです。

今日のオペレーティングシステムには、このような方法を使用してプログラムをハッキングする新しい方法を見つけた場合、本当に悪いことを達成するのを困難にする(ただし完全に不可能ではない)ためのいくつかの保護対策があります。メモリの領域を設定して、実行できないようにすることができます。プログラムは別々の仮想アドレス空間を持っているため、誤って互いのメモリにアクセスすることはありません。一部のOSコンポーネントは予測できないメモリロケーションにロードされるため、悪意のあるコードがそれらを見つけて使用することは簡単ではありません。

33
Robyn

いいえ。JPEGファイルなどの画像ファイルはコードを実行せず、単にレンダリングされて表示されます。

Steganographyと呼ばれるファイル内の一部の情報を非表示にしたいが、情報を非表示にするだけの場合、命令は実行されません。

コードを実行するファイルは、実行可能ファイルであるか、ファイルを読み取る別のプログラムによって実行され、ファイル内のコマンドを実行する必要があります。

この場合、画像がコードの実行につながる可能性のあるまれな例は、ファイルに基づいて画像をレンダリングするソフトウェアにバグがあった場合です。これは過去に起こりましたが、非常にまれです。実際には、イメージは命令を実行できません。

もちろん、これはPDFやAdobe Flashなどには当てはまりません。

11
Daisetsu

受信側のイメージに影響を与えるソフトウェアスタックがわかっている場合、およびそのソフトウェアスタックに未解決のセキュリティ脆弱性がある場合は、それを行うことができます。

JPEGファイルに命令を入れるだけでは何も起こりません。

ただし、不正な形式のJPEGファイルで特定の正確なJPEGリーダー実装をクラッシュさせる既知の方法がある場合は、そのデータが属していない画像ファイルからデータをコピーします(プログラムを含む変数の上など)関数ポインタや戻りアドレスなどの制御フロー情報)、およびOSまたはハードウェアレベルの対策(DEPなど)がそれを阻止しない場合、現実的な可能性があります。このような脆弱性は、実世界の実装に存在します(レガシーにも存在します)。

6
rackandboneman

コンピュータ(SHOULD)はデータと命令の違いを知っているので、短いバージョンはノーです。 JPEGで実行できる最悪の事態は、Zip爆弾のようなものか、一部のJPEG解凍ルーチンをクラッシュさせるものです。 JPEGをロードして表示するプログラムは、ファイル内のデータを実行しようとはせず、読み取りと処理のみを行います。予期しないJPEG以外のデータにヒットした場合は、停止またはクラッシュするか、単に本当に台無しにされた絵。

しかし、時々(私はあなたを見ている、Microsoft)人々は、(たとえば)電子メールの添付ファイルを自動的にロードして表示したり、スクリプト/マクロを含むことができるドキュメント形式を作成したりすることによって脆弱になる可能性がある有用なソフトウェアを試して作成します。そして、これは悪意のあるファイルが損傷を引き起こす可能性がある場所です。

古典的な(そしておそらくうまく機能しなくなった/保護される)例は、.jpg.exeのような電子メールの添付ファイルです。ここで、ファイルはreally実行可能ファイルであり、Windowsはそれをそのように扱いますが、 Windowsは拡張機能を隠します(最後の.exe部分を隠します)人々はfile.jpgを参照してそれをクリックし、OSに実行させます。

それは本を読むことと本の内容を演じることの違いです-本が「誰かを殴ってください」と言った場合、あなたはそれをするつもりはありません。本の言葉(データ)はあなたの脳をさえ制御していないからですあなたの脳はそのデータを処理していますが。

2
John U