考虑一下这个场景用户-A和用户-B都是非root用户在服务器内运行。
用户-A正在运行不同的程序 P1 (pid-2814)、P2(pid-2815),而用户-B正在运行不同的程序 M1(pid-3810)、M2(pid-3811)。
用户A的进程P1和用户B的进程M1正在使用OpenSSL。
当用户 A 执行此命令时
lsof | grep '/usr/lib/libcrypto.so.1.0.0.1'
输出显示,进程 P1 正在使用 OpenSSL。
P1 2814 User-A mem REG 8,6 1633692 3812058 /usr/lib/libcrypto.so.1.0.0.1
上述命令不显示用户 B 的进程 M1 也在使用 OpenSSL。
当用户 A 执行以下命令
sudo lsof |grep '/usr/lib/libcrypto.so.1.0.0.1' // This is valid ONLY when User-A has sudo permission
显示用户A的进程P1和用户B的进程M1正在使用OpenSSL。
P1 2814 User-A mem REG 8,6 1633692 3812058 /usr/lib/libcrypto.so.1.0.0.1
M1 3810 User-B mem REG 8,6 1633692 3812058 /usr/lib/libcrypto.so.1.0.0.1
有什么方法可以找出用户 B(非 root 用户)的进程 M1 在没有 sudo 权限的情况下从用户 A(另一个非 root 用户)使用 OpenSSL?
笔记 :使用 fuser 命令我得到了类似的结果。
没有 sudo 权限,只有进程 P1 使用 OpenSSL。
fuser -v '/usr/lib/libcrypto.so.1.0.0.1'
并且具有 sudo 权限,输出显示进程 P1 和 M1 都在使用 OpenSSL。
sudo fuser -v '/usr/lib/libcrypto.so.1.0.0.1'
我使用的是 Debian/Ubuntu。任何能实现上述目标的链接或线索都将不胜感激。提前致谢。
答案1
如果您有权访问可执行文件,您可以使用ldd /usr/bin/progname
它来查看链接到哪些库,而无需任何提升的权限。
答案2
这将是一个简单的脚本,用于列出特定用户正在执行的程序,然后检查所有程序是否使用特定的库:
USER="www-data"
LIB="libcrypto"
while read line; do
arr=( $line )
com="${arr[0]}"
# only programs with absolute paths (?)
if [ "${com:0:1}" != "/" ]; then
continue
fi
echo -n "${com} "
ldd "${com}" | grep "${LIB}" > /dev/null
if [ $? = 1 ]; then
echo "NO"
else
echo "YES"
fi
done < <(ps -o command -u "${USER}" | cut -d " " -f 1 | sort -u)