「キーボードを取得できませんでした」というエラーをデバッグするにはどうすればよいですか。悪意のあるクライアントがセッションを盗聴している可能性があります。」


14

6か月以上セットアップしたUbuntu 14.04のインストールを実行しています。約1週間前、エラーメッセージが表示され始めました。

Could not grab keyboard. A malicious client may be eavesdropping on your session.

しばらく(通常は一晩)留守になってからコンピューターに戻ったときにしか見たことがない。設定されたタイムアウト後に画面がロックされるのを何度か防止しました(離れる前に積極的にロックを開始しました)。

マザーボードのUSBポートに直接接続されたUSBキーボード(Kinesis Advantage)を使用しています。ワイヤレスエレコムを使用していますマウスます。

出発する前に、マウスドングルを外してみます。キーストロークを追跡している悪意のあるクライアントがあるかどうか、またはこれが接続の問題であるかどうかを他にどのように識別できますか?


1
キーストロークが記録されていると思われる場合は、SUDOコマンドを発行しないでください!!! 代わりに、クリーンなライブメディアを起動し、そこから移動します。
j0h

回答:


13

謎を解く方法は次のとおりです。目標は、標準のUbuntuユーティリティを使用してシステム上のプロセスの詳細を掘り下げることにより、ユーザーに「釣り方」を教えることです。

ステップ#1(主に好奇心のため):どのプログラムがこのエラーを出しているのかを特定します:

# -- You may need to search under more dirs, YMMV
#    List files (incl. binaries) which contain the warning string

$ sudo grep -ral 'malicious client may be eavesdropping' /usr /bin /lib
/usr/lib/openssh/gnome-ssh-askpass

私の環境では、この警告文字列をバイナリに含む唯一のプログラムはgnome-ssh-askpassです。この特定のプログラムにバグがあるかどうかを検索し、さらにソースをダウンロードしてapt-get source ssh-askpass-gnome(パッケージ名がプログラム名と異なることに注意してください)、さらに調査することができます。

ただし、根本的な原因はの問題ではないと思われgnome-ssh-askpassます。gnome-ssh-askpassパスフレーズを要求しているので、開発者はキーボードをつかまない場合に注意を怠って、最悪のシナリオを想定し、メッセージを非常に偏執的に聞こえるようにしました。しかし、偶然にパスフレーズやパスワードをランダムなWebサイトのダイアログボックスに入力することは、おそらく良い考えではないことに注意してくださいgnome-ssh-askpass

最近、ますます多くのWebサイトが、ポップアップの表示、ポップアップダイアログ以外のすべての表示のフェードアウト、および積極的なフォーカスの獲得に取り組んでいます。これがgnome-ssh-askpass、キーボードの取得に失敗した根本的な原因である可能性があります。そのようなサイトでブラウザを開いている場合は、ブラウザを閉じるか、攻撃的なWebサイトから移動してください。これが原因である場合、個々のプロセスが完全な(フルデスクトップ)フォーカスを取得できないようにするデスクトップ設定に関心があるかもしれません。たとえば、KDEでは、この設定は([システム]-[設定]-> [ウィンドウの動作]-> [フォーカス]-> [フォーカスの盗難防止])にあります。もしあなたが本当に妄想を感じているなら、Highまたはに設定することをお勧めしますExtreme。もちろん、これも防ぐことができますgnome-ssh-askpassキーボードをつかむこと自体、より正確には、Xフォーカスをつかむことです。

ステップ#2:疑わしいプロセスを特定する:

Unixでは、デバイスはファイルuderのように見えることを知っている/devため、次の質問は、ファイルシステム階層で「キーボード」を表すデバイスは何かということです。これにはlsof(開いているファイルを一覧表示する)ユーティリティを使用できます。

# look for processes holding devices open, filter out some common ones:
$ sudo lsof | grep /dev | grep -vE '/(null|urandom|zero)'

典型的なデスクトップ環境でデバイスを開いたままにしているプロセスのほとんどが/dev/pts/<N>擬似tty)開いたままになっていることに注意してください。これらは関心のある「デバイス」です。

ここで何が起こっているかの背景:

典型的なLinuxグラフィカルデスクトップでは、プロセスはキーボードと直接対話しません。代わりに、Xプログラム(Xorg)はdeviceを介してすべてのキーボードイベントを制御します/dev/input/event<N>X特にキーボードイベントを処理するイベントハンドラー(evdev)を使用します。Xログを見て、これを確認することもできます。/var/log/Xorg.0.logどこkeyboard言及されています。

キーボードイベントは、Xイベントハンドラから、で開いているプロセス標準入力を介して、マウスポインタがフォーカスされているプロセスにいつでも転送され/dev/pts/<N>ます。厳密に言えば:プロセスは、実際に「キーボードをつかむ」しない、キーボードがで開催されX、プロセスが唯一持っている(またはグラブ)「フォーカス」やの注意Xので、Xオープン標準入力ファイルディスクリプタ上を経由して、それにキーボードイベントを転送することができます/dev/pts/<N>

X evdevを介して多重化されたキーボードイベントの図

ステップ#3:特定の時点でどのプロセスがXorgに焦点を当てていますか?

どのプロセスが特定の時間にフォーカスを持っているかをどのように把握しますか?これに答えるaskubuntuの質問は次のとおりです。

マウスの下でアプリケーションを見つける

答えの要約は、マウスでナビゲートしながら端末で次のようなスクリプトを実行することです。

#!/bin/bash
# Print the process tree of the window currently in focus.
# prereqs:
#   sudo apt-get install xdotool psmisc

while true; do
   pstree -spaul $(xdotool getwindowpid "$(xdotool getwindowfocus)")
   sleep 2
done

ステップ#4:プロセスアクティビティをより深く掘り下げる

疑わしいプロセスを特定したら、最後のステップはこの個々のプロセスを調査することです。そのためには、Linux /procファイルシステム(man 5 proc)を使用できます。

プロセスについて知りたいことはほとんど何でも入手可能です/proc。実際、lsof(開いているファイルを一覧表示する)プログラム、プロセスの状態を調べるデバッガー、psまたはなどのプロセス一覧表示ユーティリティtopはすべて/proc、カーネルがデータを取り込むのに依存しています。

を使用procすると、プロセス実行可能プログラムがディスク上のどこにあるかを見つけることができます(たとえば、標準システムディレクトリ外のプログラム、特に「私に注意を払わない」で隠そうとしている場合)種類の名前で場合は疑わしい)デバッガーまたはシステムコールトレーサーを使用すると、システムコールレベルで何を行っているかを正確に調べることができます(ソースコードがない場合でも)。

ステップ2と3はPID、キーボードを潜在的に読み取っている可能性のあるすべてのプロセスIDを提供するはずです。これらの各PIDSについて(それぞれをとして示しましょう$pid)、次のことができます。

$ pidを完全なコマンドラインにマッピングします。

cat /proc/$pid/cmdline

$ pidをディスク上の実行可能ファイルにマッピングします。

ls -l /proc/$pid/exe

$ pidを現在の作業ディレクトリにマップします。

ls -l /proc/$pid/cwd

$ pidを元の環境にマッピングします

cat /proc/$pid/environ | tr '\000' '\012'

$ pid(およびその子プロセス)のシステムコールアクティビティをリアルタイムでトレースします。

strace -f -p $pid

(他にもあります:を参照man 5 proc

を介してファイルに保存するwriteか、ネットワーク経由sendtoでに送信することにより、すべてのキープレスに反応するなじみのないプロセスが表示される場合は、キーボードスニファーが見つかりました。

また、どのプロセスが(tcp + udp)ネットワークエンドポイントを開いているかを確認することもできます。

# See 'man netstat' for details on all options used below
$ sudo netstat -tunapee

結論:

エラーの原因として最も可能性が高いのはマルウェアではなく、複数のプロセスが同時にキーボード制御を取得しようとしていることです。2つgnome-ssh-askpassのうちの1つ(エラーを出力するもの)です。もう1つは、積極的なフォーカス取得ダイアログボックスを備えたサイトで開かれているブラウザです。

マルウェアが実際にインストールされている可能性はほとんどありませんが、幸いなことに、Linuxを使用しているため、すべてのプロセスが透過的に調査および検査されます。マルウェアが実際にあなたから隠れたり、上記の手法を使用して簡単に見つけたり、プロセスを殺したり、すべてのファイルを削除したりするのを防ぐことは非常に困難です。


ステップ2では、多くのプロセスが保持していることはありません/dev/pts/7(3つの一意のpid値のみ)。結果をスクロールすると/dev/pts/15、一部のデバイスが保持しているものの、ほとんどの棚デバイスがそうです1, 3, 12, 16, 17, 21, 22, 23, 24, 25, 25, 26, 27, 28, 29, 30, 31, 32, 34。キーボードは常に7ですか?これらのどれがキーボードかをどのように識別しますか?
スティーブンC.ハウエル

上記のいずれかです。物理キーボードデバイスは、(Xorgのことで、実際に開いている/usr/bin/Xよう)/dev/input/eventNあなたがあなたのを見つけることができる場所Nの文字列を見て、evdevの中で/var/log/Xorg.0.log。Xorgは、その特定の瞬間にマウスポインターが「フォーカス」している個々のプロセスに、各キーボードクリックを「転送」します。実行するssh-askpassと、/dev/pts/3開いていることがわかりますが、どの環境でも擬似ttyデバイスにすることができます。したがって、あなたのいずれかが/dev/pts/Nここに関連する可能性があります。
アリエル

@ stvn66どのプロセスに「フォーカス」があるかを繰り返し伝える小さなスクリプトを追加しました(askubuntuの関連する質問への参照)。HTH。
アリエル

スクリプトを実行してマウスを保持しているプロセスを特定した後、疑わしいプロセスを特定するにはどうすればよいですか?私が選択したアプリケーション、たとえば、スクリプトを実行した端末の起動、{firefox}firefoxをクリックした{thunderbird}ときの切り替え、thunderbirdを選択したときの切り替えなどのようです。予期しないほど目立つものはありません。おそらくこれはあなたのボトムラインに行きます問題はキーボードをつかんでいるものからではないということです。この通知が無意味であるか、排除できることを確信していたと思います。
スティーブンC.ハウエル

@ stvn66私はあなたのことを聞いています:)あなたは時間をさかのぼって元々焦点を合わせていたプロセスを理解することはできません。そのプロセスはその後終了した可能性があります。であるためには、本当に確かに、あなたは再現することができるようにする必要があります。私の一番の推測はfirefox、フォーカスをつかむポップアップでウェブサイトにアクセスしているときにブラウザ()だったことです。疑わしい(非正規)ソースからソフトウェアを定期的にダウンロードしてインストールしない限り、Ubuntuに誤ってキーボードスニファーをインストールしたことは非常に疑わしいです。少し偏執的になるのは良いことですが、過度に汗をかく必要はありません。
-arielf

1

私の問題は、2つの同時gnome-ssh-askpassウィンドウが原因でした。SSHを介して同じサーバーに2つのrsyncジョブがあり、両方がSSH証明書のパスワードを要求しようとしました。それらをグループ化(およびチェーン)することで解決しました!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.