GNU/Linux >> Linux の 問題 >  >> Linux

ファイルを cat すると潜在的なセキュリティ リスクになる可能性はありますか?

はい 、それは潜在的なリスクです。CVE-2003-0063、CVE-2008-2383、CVE-2010-2713、CVE-2012-3515、OSVDB 3881、CVE-2003-0020、またはここにリストされている同様のもののいずれかを参照してください...以下のコメントにもいくつかあります。

更新 それは単なる可能性ではありません リスク、それは本当のリスクです .rxvt-unicode (バージョン 2.7—9.19、9.20 でパッチ適用済み) は、X ウィンドウ プロパティへの読み取り/書き込みアクセスを許可します。これにより、任意のコマンドのユーザー補助実行が可能になります。この問題は CVE-2014-3121 に割り当てられています。詳細はこちら https ://bugzilla.redhat.com/show_bug.cgi?id=1093287 .

最近 (2019 年 10 月) iTerm2 v3.3.5 までのバージョンには、同じクラスの問題があることが判明しました。悪意のあるコンテンツを表示すると、統合された tmux が有効になり、コマンドの実行が許可される可能性があります。CVE-2019-9535 を参照してください。

このトピックには、https://unix.stackexchange.com/questions/73713/how-safe-is-it-to-cat-an-arbitrary-file と ジル ここ:https://unix.stackexchange.com/questions/15101/how-to-avoid-escape-sequence-attacks-in-terminals .

説明

あなたが観察しているのは、特定のエスケープ シーケンスがどのように動作するかの副作用です。それらの一部は、文字 (通常はエスケープ シーケンスも含む) を端末の入力バッファに直接 入れます。 .もちろん、すべて下位互換性のためです。標準の 00 「Report 」という用語を使用して説明されているエスケープはこれを行います。この動作により、プログラムは、ioctl やその他の API を介するのではなく、端末 (またはその他) のプロパティを「帯域内」でクエリ/設定することができます。

それだけでは不十分であるかのように、そのようなシーケンスには改行を含めることができます 、つまり、端末 (シェル) から読み取っているものはすべて、完全なユーザー コマンドのように見えます。

これをうまく利用するには、bash の 19 を使用します。 エスケープを (プロンプトとして) 出力し、すぐに応答を読み取って変数に分割するには:

IFS=';' read -sdt -p $'\e[18t' csi8 rows cols
echo rows=$rows cols=$cols

これらのシーケンスは端末によって異なる場合がありますが、24 の場合は グラフィッククエリ エスケープには改行が含まれます (38 を使用した例 と 43 文字列、54 を参照 ソース内)` :

$ echo $'\eGQ'
$ 0
bash: 0: command not found

このエスケープは 63 を送信します 端末入力バッファ (または数字 75 86 の代わりに グラフィック対応の 99 がある場合 ).

したがって、このエスケープを、同様に動作する他のシーケンスと組み合わせてください:

echo $'\x05' $'\e[>c' $'\e[6n' $'\e[x' $'\eGQ'

私にとっては、これによりさまざまなコマンドの実行が 11 回試行されます:103113125 (私の 137 バージョン文字列)、146151 (5 と 3 はカーソル座標)、164178 .

悪用可能?

182 で また、最近の端末エミュレータでは、主に数値シーケンスの限られたセットを「のみ」作成できるはずです。古いターミナル エミュレーターでは、クリップボード、ウィンドウ アイコン、およびタイトルバー テキストにアクセスして、呼び出し用のより悪意のある文字列を作成することが可能でした (上記の CVE の一部)。 X リソース文字列ですが、このメソッドを使用して直接設定することはできません)。この欠陥は、任意の読み取り および を許可しています。 入力バッファにデータを詰め込むエスケープ シーケンス内の状態またはストレージを渡すものへの書き込みアクセス。

205 有効にするにはコンパイル時の変更が必要ですが、212 229 があると便利です よりエキサイティングな機能のいくつかを有効にするコマンド ライン オプション:

$ echo $'\e]2;;uptime;\x07' $'\e[21;;t' $'\eGQ' 
bash: l: command not found
17:59:41 up 1448 days,  4:13, 16 users,  load average: 0.49, 0.52, 0.48
bash: 0: command not found

3 つのシーケンスは次のとおりです。

<オール>
  • 230 ウィンドウのタイトルを設定します。
  • 240 クエリ ウィンドウのタイトル、入力バッファーに配置します。
  • 250 261 を追加するクエリ グラフィックス機能 入力バッファへ。
  • 繰り返しになりますが、端末によっては、フォント サイズ、色、端末サイズ、文字セット、代替画面バッファーなどの他の機能にエスケープを介してアクセスできる場合があります。それらの意図しない変更は、完全なセキュリティ上の問題ではないにしても、少なくとも不便です。 278 の現在のバージョン 「Allow*」リソースを使用して、潜在的に問題のある機能を制限します。

    CVE-2014-3121

    v9.20 より前、287 X プロパティへの読み取りおよび書き込みアクセスも保護しませんでした (主にウィンドウマネージャによって使用されます)。 書く 読み取りアクセス (より正確には、潜在的に任意の文字列をエコーするシーケンスへのアクセス) には、298 が必要になりました オプション。

    $ echo $'\e]3;xyzzy=uptime;date +%s;\x07'
    $ xprop -id $WINDOWID xyzzy
    xyzzy(UTF8_STRING) = 0x75, 0x70, 0x74, 0x69, 0x6d, 0x65, 0x3b, 0x64, 0x61, 0x74, \
    0x65, 0x20, 0x2b, 0x25, 0x73, 0x3b
    

    これは、端末の入力バッファに任意の文字列を詰め込むために簡単に使用できます。プロパティを照会するためのエスケープ シーケンスが呼び出されたとき (便利な 304 とともに) 改行を追加します):

     $ echo $'\e]3;?xyzzy\x07' $'\eGQ'
     $ 3;uptime;date +%s;0
     bash: 3: command not found
     17:23:56 up 1474 days,  6:47, 14 users,  load average: 1.02, 1.20, 1.17
     1400603036
     bash: 0: command not found
    

    空白とシェルのメタ文字を保持する複数のコマンド。これは、さまざまな方法で悪用される可能性があります。もちろん、信頼されていないバイナリを cat することから始めて、H.D.ムーアの短い論文 (2003).

    フォローアップ

    あなたが尋ねるエスケープシーケンスの場合:317 これは次のとおりです:リクエスト端末パラメータ (DECREQTPARM) および デバイス属性の送信 :

    $ echo $'\e[x' $'\e[0c'
    ;1;1;112;112;1;0x1;2c
    

    2 つ目 (326 ) は 339 と同じです (340 を使用) )。そこにはいくつかのエスケープシーケンスもあります。それぞれについて書かれた完全なシーケンスは、それぞれ次のとおりです:

    \e[1;1;1;112;112;1;0x
    \e[?1;2c
    

    間違いなくそうです。

    2020 年 1 月 25 日追加:

    351 から切り替えた時から 369 へのエンコード デフォルトのエンコーディングとして ほとんどのシステムで、いくつかの興味深い機能を見つけました このあたり (1 つの弦に対して 2 つの長さがあります)...

    bashで遊ぶのが好きなので、サンプルとして 、bash のローカリゼーションが複数行の文字列で機能しない理由を尋ねました。この bash 機能にはバグがあり、回避策は 374 を使用することです .これがセキュリティ上の欠陥ではない場合 、これは1つになるか、1つを生成する可能性があります...

    ほとんどすべてのもの (言語、ライブラリ、ツール、プロトコル、アプリケーション、ハードウェア、インストーラー、コンソールなど) の進化のたびに、潜在的に新しいバグを伴う新しい機能が生まれます...

    幸いなことに、それらはすぐに修正されます (ほぼ 1 日) から明らかに)、しかし、彼らは!

    絶対にそうです、気をつけてください!

    387 の正しい使い方 コマンド。

    最新の端末エミュレータを使用しているようです 、いくつかの エスケープ シーケンス キーボード バッファの変更に使用できます .

    適切なシェル コマンドが挿入されている可能性があります。

    引数 395 を使用できます 402 の 安全な操作については、419 を参照してください .

      -e     equivalent to -vE
    
      -E, --show-ends
             display $ at end of each line
    
      -v, --show-nonprinting
             use ^ and M- notation, except for LFD and TAB
    

    次に

    $ cat -e suspectfile.raw
    $ cat -e suspectfile.raw | less
    

    または bash の下:

    $ less < <(cat -e suspectfile.raw)
    

    または

    $ which less cat
    /usr/bin/less
    /bin/cat
    $ rawless() { /usr/bin/less < <(/bin/cat -e "[email protected]");}
    

    備考

    429 を読むと 、これは何かが効果的に注入されたことを意味します.

    主な注入 なかった機能 削除されたシーケンスは indentify yourself です 、多くの VT-100 カプセル化で使用されます。

    このシーケンスは 433 です 注入する 文字列 449 450 を意味するキーボード バッファに (AVO 規約)

    462 について言えば 、試すことができます:

    $ cat <<< $'\033Z'
    

    または別の ANSI シーケンス:474 (デバイス属性 ):

    $ cat <<< $'\033[c'
    

    空行を出力しますが、次の行にプロンプ​​トが表示されると、 488 が表示されます (または、使用する端末によっては別の番号を使用する場合もあります) あなたのように それらをヒット:

    $ 65;1;9c█
    

    ...しかし 491 で スイッチ:

    $ cat -e <<< $'\033Z'
    ^[Z$
    $ cat -e <<< $'\033[c'
    ^[[c$
    

    どこで 508516 変換 521 535 および 545 551 を入力してください 行末に署名します (次の行には何も置かれません。キーボード バッファ は影響を受けません)。

    VT100 ユーザー ガイド (例:567) で面白いことがたくさん見つかるかもしれません;)

    (それらは 最新の端末 でした !ある過去に... )

    bash を使ってみる

    キーボード バッファをフラッシュしてコンテンツを取得するための小さな bash コマンドがあります:

    $ cat <<<$'\033[c';buf='';while read -t .1 -n 1 chr;do
            buf+="$chr"
      done;printf "\n>|%q|<\n" $buf
    
    ^[[?65;1;9c
    >|$'\E[?65;1;9c'|<
    

    そして、チェーンをテストするための小さな関数:

    $ trySeq() {
        printf -v out "$1"
        echo -n "$out"
        buf=""
        while read -t.1 -n1 char
          do buf+="$char"
        done
        [ "$buf" ] && printf "\r|%q|->|%q|<\e[K\n" "$out" "$buf"
    }
    

    だから私は試すことができます:

    $ for seq in $'\e['{c,{1..26}{n,t,x}};do
          trySeq "$seq";done
    |$'\E[c'|->|$'\E[?65;1;9c'|<
    |$'\E[1x'|->|$'\E[3;1;1;120;120;1;0x'|<
    |$'\E[5n'|->|$'\E[0n'|<
    ...
    

    (たぶん 無害 コンソールへの影響;)

    実用的な小さなサンプル

    想像してみてください。環境に次のようなものを配置できる人もいます:

    $ source <(printf '%dc() {
         printf "You\\047ve been hitted\\041\\n"
       };\n' {0..100};printf 'alias %s=1c\n' {0..100};)
    

    次に、

    $ cat <<<$'\e[c'
    
    $ 65;1;9c█
    

    カーソルはコマンド プロンプト ラインの最後に留まります。

    そこから機械的に Return を押すと Ctrl の代わりに + c 、次のように表示されます:

    $ 65;1;9c
    You've been hitted!
    You've been hitted!
    You've been hitted!
    $ █
    

    そして今?

    そこから、残念ながら標準はありません .

    すべての仮想端末 実装は、完全な ANSI および/または完全な DEC 標準をサポートできます...

    しかし、いくつかのセキュリティ上の問題があるため、多くはそうではありません...

    ある端末を使用すると、別の端末では観察できないような動作を観察できます...

    xterm、linux コンソール、gnome-terminal、konsole、fbterm、ターミナル (Mac OS)... 端末エミュレータのリストはそれほど短くありません!

    また、DEC および ANSI 標準と比較して、それぞれに独自のバグと制限があります。

    実際には、より多くの機能を備えた仮想コンソールが見つかるかもしれません キーボードインジェクション セキュリティが破られる可能性があります。

    常に同じ (古い) 570 を使用することを好むため、これが理由の 1 つです。 他のより機能的なツールではなく。


    「本物の」ガラス端末には、画面をプリンターに出力するためのエスケープシーケンスがありました。これは、コマンドを実行し、現在の画面の内容を印刷コマンドの stdin にパイプすることで実現しました。

    コマンドは、別のエスケープ シーケンスによって構成できます。

    これを悪用する古典的な方法は、プリンター コマンドを設定するエスケープ シーケンスを埋め込んだ名前のファイルを作成し、それを任意のスクリプトに変更してから、印刷エスケープ シーケンスを含む 2 番目のファイルを作成することでした。

    誰かが 588 を実行したとき そのディレクトリで、彼らはあなたのコードを実行することになります。 598 だったらよかったのに ユーザー!

    理論的には、最新のターミナル エミュレーターはそのようなことを行うべきではありません。

    Terminal.app は NextStep nsterm に基づいているように見えるため、あらゆる種類の奇妙な点が含まれている可能性があります。

    603 を生成している正確なバイトを絞り込んでみてください。 メッセージ?

    端末を上下させるエスケープ シーケンスがあるようです:

    http://the.taoofmac.com/space/apps/Terminal

    詳細はこちら:

    http://invisible-island.net/ncurses/terminfo.src.html#toc-_Apple__Terminal_app

    プログラムの stdin にコンテンツを送信したい場合は、

    program -para meters < /path/file.ext
    

    Linux
    1. Linuxターミナルでファイルをコピーする

    2. Linuxターミナルでファイルの名前を変更します

    3. Linuxターミナルでファイルを移動する

    1. LinuxターミナルでJSONファイルをきれいに印刷する方法

    2. Rmが読み取り専用ファイルを削除できるのはなぜですか?

    3. Linuxターミナルでテキストファイルを作成する4つの方法

    1. Linuxでファイルをシンボリックリンクするにはどうすればよいですか?

    2. ターミナルでスクロールできないのはなぜですか?

    3. .sh ファイルがマルウェアになる可能性はありますか?