检查控制台应用程序是否真的退出

Dáv*_*áth 5 linux command-line shell bash subshell

假设我已经启动了一个完成的控制台应用程序,然后 shell 提示再次出现。但是我怎么能确定它是真正的命令提示符呢?例如,如果应用程序是一个“键盘记录器”,当我尝试退出时它会启动一个假提示怎么办?

那么,我怎样才能检测到我实际上是在一个纯 shell(例如 bash)提示符下呢?

xhi*_*nne 8

从技术上讲,我会回答你的问题,好的。你如何确保你已经回到你的外壳?如果您假设该程序不是恶意的,但您认为它可能会运行另一个 shell,您可以手动定义一个带有机密内容的机密函数(当然您不会导出该内容):

$ my_secret_func() { echo "Still alive"; }
$ ~/Downloaded/dubious_program
$ my_secret_func
Still alive
Run Code Online (Sandbox Code Playgroud)

如果dubious_program是恶意的,它可以通过将您的输入传递给原始 shell 并让它做出反应来轻松欺骗您。更一般地说,不安全的可执行文件有多种方法可以在您的身份下安装键盘记录器(并执行许多其他恶意操作),例如在您的身份中安装自己~/.bashrc。即使没有明显的影响,它也可以这样做——事实上,大多数恶意软件试图不产生任何立即可见的影响,以尽量减少被检测到的风险。

因此,如果您不确定您执行的内容是否安全,请nobody在沙箱中与用户一起执行它,或者根本不执行它。


Ser*_*nyy 6

如何检查您是否已返回 shell

比较 shell 运行命令前后的 PID(相同的 PID 表示相同的 shell):

$ echo $$
6215
$ bash --posix
bash-4.3$ echo $$
10230
bash-4.3$ exit
$ echo $$
6215
Run Code Online (Sandbox Code Playgroud)

在上面的演示中,您可以看到我启动了一个应用程序,在本例中是另一个bash在 POSIX 模式下的应用程序。返回后,我们验证我们使用的 shell 的 PID 是否相同,因此我们可以假设这是实际的 shell。当然,这可以通过添加$$到您的 shell 提示符来自动化:

$ PS1="[$$] $PS1 "
[6215] $
Run Code Online (Sandbox Code Playgroud)

可以通过在前后检查sha256sum(或任何其他校验和,如md5)来改变主题。Sha-sums ,如果您不知道,通常用于检查文件的完整性,尤其是下载和iso图像。在下面的演示中,我们使用/proc/<SHELL PID>/exefile,它是实际二进制文件的符号链接(在这种情况下,它将是我的mkshshell)。通过这种方式,我们可以验证我们正在运行的可执行文件是否相同。

[12107][xieerqi][21:34]:
$ sha256sum /proc/$$/exe
70a16895186ddfac12343e816f05783cf60092c0980fc20c2ae4bc53b48f28e6  /proc/12107/exe

[12107][xieerqi][21:34]:
$ bash --posix
bash-4.3$ sha256sum /proc/$$/exe
c2615a71ff5c004e51aef248103a2950c25715f5eb8130837695770e1d78ecfa  /proc/12434/exe
bash-4.3$ exit

[12107][xieerqi][21:35]:
$ sha256sum /proc/$$/exe
70a16895186ddfac12343e816f05783cf60092c0980fc20c2ae4bc53b48f28e6  /proc/12107/exe
Run Code Online (Sandbox Code Playgroud)

返回外壳并不能保证安全

至于键盘记录器,它们不一定需要在 shell 内。如果您使用的是图形终端仿真器,则键盘记录器可以简单地侦听发送到任何窗口的击键,而不管您使用哪种 shell。

就 shell 本身而言,可以在后台启动进程。例如,shell脚本中使用符号,像这样command &推出一些背景。我不确定后台进程是否仍然可以读取密钥,但 shell 退出的事实并不能保证应用程序退出。在下面的小演示中,您可以看到一个函数在后台启动,脚本看似退出,但该函数仍然每秒写入 out.txt。

[10754][xieerqi][21:12]:
$ cat launch_background_app.sh

#!/bin/bash

run_in_background()
{
    while true;
    do
       date +%s > out.txt
       sleep 1
    done
}

run_in_background &

[10754][xieerqi][21:12]:
$ ./launch_background_app.sh

[10754][xieerqi][21:12]:
$ cat out.txt
1484280777

[10754][xieerqi][21:12]:
$ cat out.txt
1484280778

[10754][xieerqi][21:12]:
$ cat out.txt
1484280779
Run Code Online (Sandbox Code Playgroud)

给编辑的注意:请不要从我的示例中删除提示 - 它是为了演示目的而显示 shell PID 保持不变。

PS:安全首先要安装一个受信任的应用程序,所以使用之前首先要考虑确保应用程序的完整性。

  • 总的来说,我同意您的回答,但是制作一个可以克服您的检查的恶意程序是相当容易的。 (4认同)

Dmi*_*yev 5

键盘记录器不会试图伪造 shell 提示,它几乎肯定会留下一个后台进程来监视/dev/input或类似的东西(它也会尝试将自己隐藏在进程列表中)。您肯定以错误的方式看待问题。

运行不受信任的二进制文件的一种常见方法是设置一个虚拟机并在那里运行它们。即使那样也不会给你 100% 的安全,但它通常被认为在实际使用中足够安全(当然,你不会在生产服务器上或在银行的受保护网络内运行带有不受信任代码的 VM)。