这是解决您的奥秘的方法。目标是通过使用标准的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
要求您输入密码,它的开发人员只是在未能抓住键盘时采取了谨慎的态度,假设是最坏的情况,并使消息听起来过于偏执。但是请注意,偶然将密码或密码输入某些随机的网站对话框可能不是一个好主意,因此从这种意义上说,gnome-ssh-askpass
开发人员进行了正确的选择。
最近,越来越多的网站开始从事显示弹出窗口,使弹出对话框之外的其他所有内容淡化以及积极吸引焦点的实践。这可能是gnome-ssh-askpass
未能抓住键盘的根本原因。如果您的浏览器是在此类网站上打开的,则关闭浏览器或离开攻击性网站可能会有所帮助。如果这是原因,则您可能对桌面设置感兴趣,该设置阻止单个进程获取完整的(完整的桌面)焦点。例如,在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)通过设备控制所有键盘事件/dev/input/event<N>
。X
使用事件处理程序(evdev)来处理键盘事件。您还可以通过查看X
log:提及/var/log/Xorg.0.log
位置keyboard
来验证这一点。
键盘事件X
通过打开的进程标准输入随时从事件处理程序转发到具有鼠标指针焦点的进程/dev/pts/<N>
。严格来说:进程实际上并没有“抓住键盘”,而是由握住键盘X
,该进程仅具有(或抓住)“焦点”,或者可以将注意力转移到键盘上,X
从而X
可以通过打开的stdin文件描述符将键盘事件转发给它。/dev/pts/<N>
。
步骤#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
)或通过网络将其发送到via 来对每个按键做出反应sendto
,则可能是您发现了一个键盘嗅探器。
您还可以检查哪些进程打开了(tcp + udp)网络端点:
# See 'man netstat' for details on all options used below
$ sudo netstat -tunapee
底线:
造成此错误的最可能原因不是恶意软件,而是试图同时获得键盘控制的多个进程。两者gnome-ssh-askpass
之一(打印错误的一个)。另一个可能是网站上的打开浏览器,带有激进的获取焦点对话框。
即使您实际上确实安装了一些恶意软件的机会很少,但好消息是,由于您使用的是Linux,因此所有过程对于您进行研究和检查都是透明的。恶意软件很难真正对您隐藏,或者阻止您使用上述技术轻松找到它,杀死其进程并删除其所有文件,这非常困难。