web-dev-qa-db-ja.com

任意のファイルをキャットするのは安全ですか?

誤ってバイナリファイルをcatすると、端末が文字化けすることがあります。簡単なresetで修正できないものはありませんが、攻撃者は端末に表示されたときに任意のコードを実行するファイルを理論的に作成できませんでしたか?端末エミュレーターなどの悪用による。

78
Gunchars

そのような出力を利用できるかどうかは、端末プログラム、および送信されるエスケープコードに応じてその端末が何をするかによって異なります。私はそのような悪用可能な機能を備えた端末プログラムを認識していません、そして今唯一の問題は、悪用される可能性のある未知のバッファオーバーフローなどが存在する場合です。

一部の古いhardware端末では、これをプログラミングしたときに問題になる可能性があります。ハードウェアにそのキーのコマンドシーケンスを格納することにより、これらの種類のエスケープシーケンスを持つファンクションキー。それをアクティブにするには、物理​​的なキーを押す必要があります。

しかし、(Haukeが「脳死」と非常に厳格にマークしたように)問題が解決して、作成した抜け穴を理解できなければ、そのような機能を喜んで追加する人が常にいます。私のオープンソースソフトウェアの経験では、コードを多くの目で見ているため、クローズドソースの場合とは異なります。 (Silicon GrahpicsのIrixのメールプログラムでは、90年代半ばに、レシーバーマシンで実行されるコマンド、実行可能ファイルへの実際のパスなどを含めることができたことを覚えています。)

36
Anthon

ほとんどの端末エミュレーターは、特定のエスケープシーケンスを受け取った場合、何らかの応答を返します( xterm制御シーケンスのドキュメント を参照してください)。たとえば、\e[0cをVT100のようなエミュレータに送信すると、\e[?1;2cなどのデバイス属性が返されます(これはおそらくキースが観察したものです)。しかし、これらの回答は任意の文字列ではありません。それでも、システムのどこかに致命的な何かを実行する2cという名前の実行可能ファイルを置くことは悪い考えです。

更新:xtermウィンドウのタイトルを設定する可能性があるため、実際にはリスクは私が思っていたよりも大きいそしてタイトルを送り返す適切なエスケープシーケンスを使用して( http:// www.securityfocus.com/bid/6940/ )。上記の例とは対照的に、タイトルはほとんど任意の文字列にすることができます。

36
Uwe

PS1 のようなもので上書きされない限り、これはGNOMEターミナル3.6.1のターミナルタイトルを変更します。

printf "\033]2;Script Kiddie was here\007"

新しいGNOMEターミナルウィンドウを開いて、catバージョンをテストします。

printf "\033]2;Script Kiddie was here\007" > test.bin
cat test.bin

はい、これは端末のタイトルも設定します。

以前は タイトルがコマンドラインに出力されるエスケープコード のセキュリティ問題があったため、catedが出力するときにファイルを効果的に作成できます(I ' mそこに改行を入れることができるかどうか不明)任意のコマンド。痛い!

18
l0b0

catを使用してもコードは実行されない可能性がありますが、エスケープコードが処理されるため、実際には悪意のあるスクリプトが無害であると簡単に誤解する可能性があります。

以下は、「悪意のある」シェルスクリプトを作成するコマンドの例です。

echo -e '#!/bin/sh\necho "...doing something bad here..."\nexit\n\033[A\033[Aecho "Hello dear reader, I am just a harmless script, safe to run me!"' > demo.sh
chmod a+x demo.sh

ファイルを検査すると、無害のようです。

$ cat demo.sh
#!/bin/sh
echo "Hello dear reader, I am just a harmless script, safe to run me!"

しかし、実際に実行する必要があります...

$ ./demo.sh 
...doing something bad here...

スクリプトは、生のエスケープコードを含めてカーソルを数行上に移動することで機能します。そのため、スクリプトの残りの部分は悪意のあるコードの上に書き込まれ、非表示になります。

他のほとんどすべてのプログラムは、それが何であるかについてのスクリプトを明らかにします。ファイルの内容を処理しないプログラム(catmoreless -rなど)のみが誤解を招く出力を生成します。

tailおよびheadも同じ誤解を招く出力を生成することに注意してください。したがって、「less + F」を使用する方が「tail -f」よりも安全です。

10
Malvineous

私は間違いなく、入力したかのように任意の文字をxterm自体に挿入することを経験しました。そして、時々これは明らかに改行文字を含んでいたので、私はngwerm:0riu: command not found応答として。特定の有害なコマンドを送信するファイルを作成できない理由はありません。そのため、はい、少なくとも一部の端末は任意の影響で攻撃を受けやすくなっています。

8
Kilian Foth

まあ、端末エミュレーターは基本的に、そこに送信された文字を出力するだけです。

新しい位置の設定、色の変更、タイトルの変更など、単に現在の位置に文字を印刷する以外は、エスケープシーケンスによって行われます。

サポートされるエスケープシーケンスのセットは通常、他のプロセスを開始する方法を定義しない [〜#〜] ansi [〜#〜] のような明確に定義された標準で構成されます。このようなシーケンスを実装することは可能ですが、意図的にそのようなことを許可する端末エミュレーターについては知りません。

理論的には、バッファオーバーフローのようなバグが任意の機能をトリガーするために使用される可能性があります。しかし、これは他のほとんどのバイナリでも可能です。

2
michas