任意のファイルをcatすることはどれくらい安全ですか?


77

時にはとき、私cat誤ってバイナリファイルには、私の端末がアップ文字化け。すぐにreset修正できないものはありませんが、攻撃者は理論的には、端末に表示されたときに任意のコードを実行するファイルを作成できませんでしたか?ターミナルエミュレーターまたはその他の脆弱性を利用します。


3
時々、シェルが最後に「<garbage> unknown command」と言うことがあります。これが実際に可能かどうか疑問に思う。
キース

5
ターミナルエミュレータの悪用、例えばあったlinuxsecurity.com/content/view/104657またはsecurityfocus.com/bid/6936/discussは、それが必要な特定の安全ではないので
ウルリッヒDangel

1
これが、ファイルの内容を調べるために、バイナリファイル(のようなmore)または端末対応(less)を使用するほうがよい理由です。端末を奇妙な状態にしないだけでなく、ファイル全体が一度に飛んで行くことはありません。
Blrfl

このstty saneコマンドは、たとえば異なる文字セットに切り替えられたxterm(または同様の)をリセットします。
トールビョールンラヴンアンデルセン

moshドキュメントにはそれについていくつかの考えがあります:mosh.mit.edu/#techinfo
Max Ried

回答:


34

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

一部の古いhardware端末では、このようなエスケープシーケンスを使用してファンクションキーをプログラムした場合、そのキーのコマンドシーケンスをハードウェアに保存することで問題が発生する可能性があります。それを有効にするには、物理​​的なキーを押す必要があります。

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


3
「レシーバーマシンで実行するコマンドを含めることができます」 Windows Scripting Hostを呼び出す電子メールVBScriptに含めるようなものですか。:)
CVn

正確には、サウンドを再生するように、既にマシン上にある実行可能ファイルを起動できます。正確な構文(約20年前)や、セットアップでその「機能」をオフにできるかどうかは思い出せません。ネットワークに保存された動画を自動再生することもできました。
アントン

あなたはNeWSのことを言っているのではありませんか?IIRC SGIは最後のホールドアウトの1つでした。
luser droog

ノー@luserdroogこれは下の標準GUIベースのメールプログラムだったIrixの
Anthonの

1
@Anthonそれがまだ可能かどうかはわかりませんが、エスケープコードを使用して、writeコマンドから端末に来るテキストを「繰り返す」端末を取得する可能性-したがって、端末を所有するユーザーとしてコマンド/スクリプトを実行します。多くの場合、多くの場合mesg -n、ユーザーへのメッセージをroot 常にオフにすることをお勧めします。私の知る限り、これは実際に行われました-悪用されたかどうかはわかりませんが。したがって、catted実行可能ファイルからのランダムなテキストは、おそらく実行される可能性があります。
バールドコッペルード

33

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

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


それはすでにそれを非常に近くカットしています。
ガンチャーズ

さらに古い機能があります-ENQ(Ce)文字に応答して送信される「アンサーバックメッセージ」。実際のVT100では、ユーザーが端末のSETUPメニューで設定します。リモートで設定できる端末エミュレータがあるかもしれません
...-sendmoreinfo

16

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が印刷するときに(そこに改行を入れることができるかどうかわかりません)任意のコマンド。痛い!


8

使用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...

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

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

なおtailheadも同じ誤解を招くような出力を生成します。したがって、「less + F」を使用する方が「tail -f」より安全です。


これは非常に問題があります...実際に何が起こっているかを見るにはecho $(cat demo.sh)cat demo.sh | grep . --color=yes(注:--color=yesここに「悪意のある」コードが表示されます)またはbuild-inを実行しcat -v demo.shます。
チャーリー

正しいか間違っているかは、別の質問に対する答えです。catファイルのコンテンツを表示することの信頼性です。
Incnis MRSI

@IncnisMrsi:別の質問に対する答えではありません。この答えは、catがエスケープコードを表示することを警告し、エスケープコードのタイプが1つだけの単純な例を提供しますが、他にも多くのコードがあります。特定の端末と組み合わせると、これらはキーを再マッピングし、ファイルを上書きし、理論的にはコマンドを実行することさえできます。そのため、エスケープコードを表示する危険性を理解するとcat、質問にあるように、任意のファイルに対して安全でない場合があることを理解できます。
-Malvineous

6

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


2

基本的に、ターミナルエミュレータは基本的に、送信された文字を出力するだけです。

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

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

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


0

一般に、任意のファイルをcattingするリスクは通常ありません。ファイルを分析するための私の通常の方法は、以下を行うことです:

$ file <mystery file>
$ strings <mystery file> | less

上記によりfilestringsコマンドを使用してファイルのタイプを判別できます。また、コマンドを使用すると、系統について不明なバイナリファイルから識別可能な文字列をダンプできます。

ファイル出力
$ file /bin/ls
/bin/ls: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, stripped
文字列出力
$ strings /bin/ls|less
...
across
vertical
single-column
force
never
auto
if-tty
slash
%b %e  %Y
%b %e %H:%M
long-iso
main
posix-
sort_files
?pcdb-lswd
dev_ino_pop
Try `%s --help' for more information.
Usage: %s [OPTION]... [FILE]...
List information about the FILEs (the current directory by default).
Sort entries alphabetically if none of -cftuvSUX nor --sort.
Mandatory arguments to long options are mandatory for short options too.
  -a, --all                  do not ignore entries starting with .
  -A, --almost-all           do not list implied . and ..
...

3
不明なファイルで文字列を実行すると、問題が生じる可能性があります。lcamt​​uf.blogspot.fi/2014/10/...
ヤンWikholm

@IncnisMrsi-最初の文を読んでください!!!!
slm

わかりました、前の声明を撤回します。答えは短く、混乱した用語を使用し、根拠がなく、明らかに不完全です。セキュリティでは、お気に入りのOSで配布される「任意」≠ランダムです。
Incnis Mrsi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.