我一直在寻找一种方法来使我的笔记本电脑的特殊键与 i3-wm 一起使用。我遇到了这篇文章并使用那里的脚本来创建我自己的。
这是我想出的屏幕亮度(在我的机器上,有效值似乎在 0 到 937 之间 - 其他任何东西都会产生写入错误):
#!/bin/bash
#
# Usage: lcd_bright.sh <U|D> <value>
#
MODE=`echo $1 | tr '[a-z]' '[A-Z]'`
BRIGHTNESS='/sys/class/backlight/intel_backlight/brightness'
LCDVALUE=`cat $BRIGHTNESS`
if [ "$MODE" = "U" ]
then
NEWVALUE=$(( $LCDVALUE + $2 ))
if [ $NEWVALUE -le 937 ]
then
echo $NEWVALUE > $BRIGHTNESS
else
echo 937 > $BRIGHTNESS
fi
else
NEWVALUE=$(( $LCDVALUE - $2 ))
if [ $NEWVALUE -ge 0 ]
then
echo $NEWVALUE > $BRIGHTNESS
else
echo 0 > $BRIGHTNESS
fi
fi
对于键盘背光(它有 4 个级别):
#!/bin/bash
#
# Usage: kbd_bright.sh <U|D>
MODE=`echo $1 | tr '[a-z]' '[A-Z]'`
BRIGHTNESS='/sys/class/leds/asus::kbd_backlight/brightness'
KBDVALUE=`cat $BRIGHTNESS`
if [ "$MODE" = "U" ]
then
NEWVALUE=$(( $KBDVALUE + 1 ))
if [ $NEWVALUE -le 3 ]
then
echo $NEWVALUE > $BRIGHTNESS
else
echo 3 > $BRIGHTNESS
fi
else
NEWVALUE=$(( $KBDVALUE - 1 ))
if [ $NEWVALUE -ge 0 ]
then
echo $NEWVALUE > $BRIGHTNESS
else
echo 0 > $BRIGHTNESS
fi
fi
我在其中添加了规则,sudoers.d/
因此脚本不需要密码,并且脚本root
归0754
.
我对他们的 i3 配置如下:
# screen brightness control
bindsym XF86MonBrightnessUp exec sudo /home/ioana/.config/i3/lcd_bright.sh U 100
bindsym XF86MonBrightnessDown exec sudo /home/ioana/.config/i3/lcd_bright.sh D 100
# keyboard brightness control
bindsym XF86KbdBrightnessUp exec sudo /home/ioana/.config/i3/kbd_bright.sh U
bindsym XF86KbdBrightnessDown exec sudo /home/ioana/.config/i3/kbd_bright.sh D
在这样做的时候,我看到有人提到这样的脚本会带来安全风险,特别是如果他们使用输入(我的这样做)。我想更多地了解我的脚本实际上存在哪些特定的安全风险以及它们意味着什么。
实际说了什么及其含义
引用链接帖子:
这里讲两种情况:
一般来说,脚本有什么问题?套用Stephane Chazelaz 的回答(我强烈建议阅读),如果在 Web 服务器中运行或者当特权脚本运行其他东西时,shell 脚本可能会成为问题。对于只有桌面的普通用户 - 这意味着在大多数情况下系统被破坏 - 可能是攻击者注入
rm -rf /
某处 - 或计算机被恶意软件超越并成为僵尸网络的一部分以攻击商业服务器。但是对于商业服务器,这可能意味着从客户信用卡信息被盗到系统被破坏而导致金钱损失的任何事情,因为系统已关闭并且客户转到其他地方。因此,当某事被称为安全问题时,您需要知道这对您意味着什么。您还应该知道谁可能是您的攻击者 - 这定义了他们可以使用哪种方法来破坏您的系统,并且对于对您的信用卡信息或与人交谈感兴趣的人,他们可能会追求网络流量而不是脚本,这意味着他们可能会使用 MITM 攻击而不是脚本。在您的具体情况下可能是什么问题?
您的脚本执行 3 个命令:
echo $1 | tr
和cat
. 如果攻击者替换cat
或替换tr
为恶意程序,则可能意味着系统被破坏,或者每次执行这些命令时都会泄露信息。并且因为您的脚本以根级权限运行 - 这些命令也以根级权限运行。由于echo
是内置的外壳,因此它对/bin/echo
被替换的攻击免疫(除非您env echo
改为运行 - 这将调用/bin/echo
)。可以说,如果您有人能够替换系统级二进制文件,则意味着他们已经具有 root 访问权限,这比您的脚本更重要的问题。这些脚本
/home/ioana/.config/i3/
具有 0754 权限。好没问题。如果您的帐户遭到入侵,攻击者不需要 root - 他们将使用您的帐户覆盖脚本内容。/home/ioana/.config/i3/
目录的权限呢?删除文件需要对文件所在的目录具有写权限,因此如果您的系统上有另一个用户并且他们对脚本本身没有写权限,如果他们有权写入目录,他们可以删除脚本(不是真的一个安全问题,但对于船舶和咯咯笑来说是一个小型 DoS)。理论上另一个问题可能来自命令行参数。你有
echo $1 | tr '[a-z]' '[A-Z]'
. 假设攻击者使用斯蒂芬的回答/*/*/*/*/../../../../*/*/*/*/../../../../*/*/*/*
中$1
提到的。shell 需要将它们转换*
为实际文件,所有这些扩展对于 CPU 来说都是昂贵的。这是使您的计算机滞后的一种小方法,又是迷你 DoS。如果您运行的是过时版本的 bash,它可能容易受到通过导出函数(即shellsock )进行任意代码注入的攻击。因此,可以在运行您的特权脚本之前导出恶意功能。
如果攻击者喜欢虐待动物,他们可以虐待
cat
当然,所有这些东西都可以结合起来
wget
在您的计算机上下载其他恶意软件并以 root 权限执行。最后,您在
/sys/class/
目录类型上操作的事实不是问题。问题在于 shell 脚本的功能水平以及 shell 脚本的机制并不完美。但我们不要过于偏执。就像我说的那样,如果有人可以访问您的帐户(具有sudo
特权)或 root 帐户 - 这已经足够令人担忧了。也可以看看
有几种方法可以显着减少脚本的攻击面。请注意,我不是 Bash 专家,所以这不是一个详尽的问题列表,只是我可以从您现有的代码中看到的一些问题。
kbd_brighter
kbd_dimmer
/sys
在写入文件之前对其进行完整性检查。它存在吗?它是否只包含一个整数?如果该整数意外地是负整数,我们该怎么办?妥善处理所有可能的情况。[ $1 -eq 5 ]
成为[ -eq 5 ]
只是自找麻烦)并确保正确处理包含空格或换行符等特殊字符的变量。PATH
攻击。例如,/bin/cat
代替cat
. 你可以看到路径type cat
。VARIABLE=`< filename`
,而不是VARIABLE=`cat filename`
. 此外,使用echo
而不是/bin/echo
使用 Bash 内置echo
命令。您可以看到内置命令可用于type echo
.总结一下,这是一个示例
kbd_brighter
脚本。请注意,由于我没有华硕,因此我没有对其进行测试。由于我不是专家,因此它可能仍然存在安全问题。