読み取り CVE-2009-4487の詳細(ログファイルのエスケープシーケンスの危険性について) 少し驚いています。
引用するには CVE-2009-4487 :
nginx 0.7.64は、印刷不可能な文字をサニタイズせずにログファイルにデータを書き込みます。これにより、リモートの攻撃者が端末エミュレータのエスケープシーケンスを含むHTTPリクエストを介してウィンドウのタイトルを変更したり、任意のコマンドを実行したり、ファイルを上書きしたりする可能性があります。
明らかに、これは実際にはnginxのセキュリティホールではなく、ターミナルエミュレータにあります。
確かに、おそらくターミナルへのログファイルのcat
ingは偶然にのみ発生しますが、ログファイルのgrep
ingは非常に一般的です。 less
おそらくエスケープシーケンスをサニタイズしますが、エスケープシーケンスを変更しないシェルコマンドを知っているのは...
私は ワニスの応答 に同意する傾向があります:
一般にターミナルレスポンスエスケープの知恵は定期的に疑問視されてきましたが、主要な端末エミュレーションプログラムはどれも、これらのシーケンスを破棄するのに適しているとは考えていません。 [..]ログファイルを書き込むすべてのプログラムを非難するのではなく、セキュリティの観点から、端末エミュレーションプログラムに愚かなことをやめて、この問題や他のセキュリティ問題を一度修正するほうがはるかに生産的ですそしてすべてのために。
したがって、私の質問:
コマンドを実行したり、エスケープシーケンスを使用してファイルを上書きしたりできないように、xtermをどのように保護できますか?
この攻撃に対して保護されているXのターミナルエミュレーターは何ですか?
VT100端末(最近のすべての端末エミュレータはある程度エミュレートします)は、問題のあるコマンドをいくつかサポートしていましたが、最近のエミュレータまたはディストリビューションは、問題が多く有用性の低いコマンドを無効にします。以下は、潜在的に危険な エスケープシーケンス の完全なリストではありません(単に、何らかの方法で表示を読みにくくするものは含まれていません)。
ENQ
(Ctrl+E
)によって呼び出されるアンサーバックコマンドは、Return Terminal Statusとも呼ばれます。これにより、ユーザーが入力したかのようにテキストが端末に挿入されます。ただし、このテキストは攻撃者の制御下にありません。これは端末自体の名前であり、通常はxterm
またはscreen
のような名前です。私のシステム(Debian squeeze)では、xtermはデフォルトで空の文字列を返します(これはanswerbackString
リソースによって制御されます)。ESC [ c
など。端末はESC [ … c
で応答します(ここで…
には数字とASCII句読点のみを含めることができます)。これは一部の端末機能を照会する方法です。古いアプリケーションで使用されます。ここでも、端末の応答はユーザー入力と区別できませんが、攻撃者の制御下にありません。制御シーケンスはファンクションキーのように見える可能性がありますが、ユーザーが通常とは異なる構成の場合のみ私が遭遇した設定には、端末応答のプレフィックスである有効なファンクションキーエスケープシーケンスがあります)。ESC P
で始まるDCSエスケープ)。DECUDK
(ユーザー定義キーを設定)を使用してどのような害を与えることができるのかわかりません。DECRQSS
(リクエストステータス文字列)は、端末がエスケープシーケンスで応答するもう1つのコマンドで、今回は\eP
で始まります。 \eP
は有効なキーであるため、これは問題になる可能性があります(Alt+Shift+P)。ESC P + p …
およびESC P + q …
という2つの実験的な機能があります。説明から、これは少なくともファンクションキーの効果を変更するために使用できます。ESC [ … n
(デバイスステータスレポート)。端末はエスケープシーケンスで応答します。これらのエスケープシーケンスのほとんどは、ファンクションキーのエスケープシーケンスに対応していません。問題があるように見えます:ESC [ 6 n
へのレポートはESC [ x ; y R
の形式です。ここで、x
とy
は数字列であり、これは次のようになります。 F3 いくつかの修飾子付き。ESC [ … t
。ESC [ 2 0 t
およびESC [ 2 1 t
への回答には、それぞれターミナルウィンドウのアイコンラベルとタイトルが含まれており、攻撃者はこれらを選択できます。allowWindowOps
リソースを設定するか、disallowedWindowOps
リソースを介して選択的に有効にすることができます。 Ubuntu 10.04のGnome-terminalは、デフォルトでタイトルのアンサーバックも実装しています。他の端末やバージョンは確認していません。ESC ] digit ; title ESC \
です。画面のエスケープシーケンスはESC k title ESC \
です。これらのコマンドに対する懸念は過大評価されています。ある程度のいたずらは許されますが、どのWebページにも同じ問題があります。クラスではなくタイトルのみに基づいてウィンドウを操作することは、信頼されていない当事者によって名前が指定されたファイルを開くこと、またはシェルスクリプトで変数の展開を引用しないこと、または狂犬病を鼻でなでることに似ています。 —噛まれても文句を言わないでください。ワニスの反応は不誠実だと思う。それは、責任をシフトしようとしている、またはセキュリティナチモードのいずれかであるように感じます(本物のセキュリティの問題であるかどうかにかかわらず、セキュリティ上の懸念は機能をブラックボール化することを正当化します)。
一般的にターミナルレスポンスエスケープの知恵は定期的に疑問視されてきましたが、主要な端末エミュレーションプログラムのどれもこれらのシーケンスを破棄するのに適しているとは見なされていません。 (…)
ログファイルを書き込むすべてのプログラムを非難する代わりに、セキュリティの観点から、端末エミュレーションプログラムに愚かなことをやめて、この問題やその他のセキュリティ問題を修正するほうがはるかに生産的ですこれを最後にきっぱりと。
アンサーバックの多くは便利な機能です。アプリケーションは、カーソルの位置やウィンドウサイズなどを知る必要があります。ウィンドウのタイトルを設定することも非常に便利です。これらのioctl
呼び出しに完全に依存することは可能ですが、これには、これらのioctl
呼び出しを行い、ファイル記述子に渡すUNIXスタイルのテキストに変換するための追加のコードとユーティリティが必要になります。これらのインターフェースを変更することは、多くの作業であり、ほとんどメリットがありません。
テキストファイルには、制御文字などの非印刷文字を含めることはできません。通常、ログファイルはテキストファイルであると想定されます。ログファイルには制御文字を含めないでください。
ファイルにエスケープシーケンスが含まれていることが心配な場合は、エディターでファイルを開くか、less
を使用して-r
または-R
オプションなしで表示するか、cat -v
。
それほど単純ではありません。多くの人がxterm
タイトルをプロンプトなどの一部として設定するためのコードを持っています。非常に良い理由で(間違った端末ウィンドウから間違ったマシンをshutdown
!)。したがって、適切に修正するには、セキュリティコンテキストを導入する必要があり、それにより、シェルとターミナルエミュレータの間のやり取り、そしておそらく人々のドットファイルも非常に複雑にします。または、端末に表示される可能性のあるものをすべてサニタイズする低賃料のソリューションを使用することもできます。これにより、制御文字のエスケープが大幅に削減されます。これはおそらく、目立たせるためだけに実行する必要があります(ログファイルでは、シェルコードを挿入しようとしている人を示している可能性があるため)。
(余談ですが、 punycode は同じ種類の問題のより深刻なインスタンスですが、それでも公式の標準になっています。セキュリティが、制御できない安全でない設計を軽減することになる場合もあります。)