我应该如何调试错误“无法抓取键盘。恶意客户端可能正在窃听您的会话。”

Ste*_*ell 15 mouse keyboard usb 14.04

我正在运行安装了 6 个多月的 Ubuntu 14.04。大约一周前,我开始收到一条错误消息:

Could not grab keyboard. A malicious client may be eavesdropping on your session.
Run Code Online (Sandbox Code Playgroud)

我只有在离开一段时间后(通常是一夜之间)回到我的电脑时才看到它。多次阻止屏幕在设置的超时后锁定(我已经开始在离开前主动锁定它)。

我使用的是直接连接到主板上的 USB 端口的 USB 键盘(Kinesis Advantage)。我正在使用无线ELECOM鼠标。

在离开之前,我将尝试断开鼠标加密狗的连接。我还能如何确定是否有恶意客户端跟踪我的击键,或者这是否是连接问题?

ari*_*ica 14

这是解开你的谜团的方法。目标更多地是通过使用标准的 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
Run Code Online (Sandbox Code Playgroud)

在我的环境中,唯一在其二进制文件中包含此警告字符串的程序是gnome-ssh-askpass. 我可以搜索此特定程序是否存在错误,甚至可以下载其源代码apt-get source ssh-askpass-gnome(请注意,包名与程序名不同)以进行进一步检查。

但是,我怀疑根本原因不是gnome-ssh-askpass. 由于gnome-ssh-askpass要求您提供密码短语,因此其开发人员只是在未能抓住键盘时选择谨慎行事,假设最坏的情况,并使消息听起来非常偏执。但请注意,将您的密码或密码意外输入到某个随机的网站对话框中可能不是一个好主意,因此从这个意义上说,gnome-ssh-askpass开发人员做出了正确的决定。

最近,越来越多的网站开始采用显示弹出窗口、淡出弹出对话框之外的所有其他内容并积极抓住焦点的做法。这可能是gnome-ssh-askpass无法抓住键盘的根本原因。如果您的浏览器在此类站点上打开,关闭浏览器或离开攻击性网站可能会有所帮助。如果这是原因,您可能对防止单个进程获取完整(完整桌面)焦点的桌面设置感兴趣。例如在 KDE 中,可以在(系统设置 -> 窗口行为 -> 焦点 -> 焦点窃取预防)下找到此设置。如果您真的很偏执,我建议您将其设置为HighExtreme。当然,这也可以防止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)'
Run Code Online (Sandbox Code Playgroud)

请注意,在典型的桌面环境中保持设备打开的大多数进程都保持/dev/pts/<N>伪 tty)打开。这些是感兴趣的“设备”。

关于这里发生的事情的一些背景:

在典型的 Linux 图形桌面中,进程不直接与键盘对话。相反,X程序 (Xorg) 通过设备控制所有键盘事件/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
Run Code Online (Sandbox Code Playgroud)

第 4 步:深入了解流程活动

一旦确定了可疑进程,最后一步就是调查这个单独的进程。为此,您可以求助于 Linux/proc文件系统 ( man 5 proc)。

/proc. 事实上,像lsof(列出打开的文件)这样的程序、检查进程状态的调试器,以及像psor这样的进程列表实用程序top,都依赖于/proc由内核填充的数据。

使用proc您可以找到进程可执行程序在磁盘上的位置(例如,标准系统目录之外的任何程序,特别是如果它试图隐藏在“不要注意我”类型的名称下,可能会被怀疑)并使用调试器或系统调用跟踪器,您可以检查它们在系统调用级别上究竟做了什么(即使您没有它们的源代码)。

第 2 步和第 3 步应该为您提供所有PID可能正在读取您的键盘的进程 ID(s)。对于这些 PIDS(让我们将每个 PIDS 表示为$pid)中的每一个,您可以:

将 $pid 映射到其完整的命令行:

cat /proc/$pid/cmdline
Run Code Online (Sandbox Code Playgroud)

将 $pid 映射到其在磁盘上的可执行文件:

ls -l /proc/$pid/exe
Run Code Online (Sandbox Code Playgroud)

将 $pid 映射到其当前工作目录:

ls -l /proc/$pid/cwd
Run Code Online (Sandbox Code Playgroud)

将 $pid 映射到其原始环境

cat /proc/$pid/environ | tr '\000' '\012'
Run Code Online (Sandbox Code Playgroud)

实时跟踪 $pid(及其子进程)系统调用活动:

strace -f -p $pid
Run Code Online (Sandbox Code Playgroud)

(还有更多:见man 5 proc

如果您看到一个陌生的进程通过将其存储到文件中(via write)或通过网络将其发送到 via对每次按键做出反应sendto,那么您可能已经找到了键盘嗅探器。

您还可以检查哪些进程打开了 (tcp+udp) 网络端点:

# See 'man netstat' for details on all options used below
$ sudo netstat -tunapee
Run Code Online (Sandbox Code Playgroud)

底线:

导致错误的最可能原因不是恶意软件,而是多个试图同时获得键盘控制权的进程。两者之一是gnome-ssh-askpass(打印错误的那个)。另一个可能是站点上的打开浏览器,带有主动获取焦点的对话框。

即使您实际上安装了一些恶意软件的可能性很小,但好消息是,由于您使用的是 Linux,因此所有进程对于您研究和检查都是透明的。恶意软件很难真正向您隐藏,或阻止您使用上述技术轻松定位它、终止其进程并删除其所有文件。