AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1077850
Accepted
SakoDaemon
SakoDaemon
Asked: 2018-09-24 15:41:25 +0800 CST2018-09-24 15:41:25 +0800 CST 2018-09-24 15:41:25 +0800 CST

写入 /sys/class 的脚本存在安全风险

  • 772

我一直在寻找一种方法来使我的笔记本电脑的特殊键与 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

在这样做的时候,我看到有人提到这样的脚本会带来安全风险,特别是如果他们使用输入(我的这样做)。我想更多地了解我的脚本实际上存在哪些特定的安全风险以及它们意味着什么。

scripts security backlight keyboard-backlight i3-wm
  • 2 2 个回答
  • 295 Views

2 个回答

  • Voted
  1. Sergiy Kolodyazhnyy
    2018-09-24T19:53:13+08:002018-09-24T19:53:13+08:00

    实际说了什么及其含义

    引用链接帖子:

    设置root拥有的权限755。然后编辑您的 sudoers 文件以允许它们以 root 身份运行,或使用 chmod +s 设置它们的 SUID。

    顺便说一句,这种事情被认为是安全风险,因此请绝对确保权限设置正确。

    这里讲两种情况:

    • 设置脚本并允许它以root身份执行而不提示输入密码
    • 在脚本上设置 SUID 位

    一般来说,脚本有什么问题?套用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 帐户 - 这已经足够令人担忧了。

    也可以看看

    • 为什么 SUID 对 shell 脚本禁用,但对二进制文件却没有?
    • 4
  2. Best Answer
    Chai T. Rex
    2018-09-24T21:19:10+08:002018-09-24T21:19:10+08:00

    有几种方法可以显着减少脚本的攻击面。请注意,我不是 Bash 专家,所以这不是一个详尽的问题列表,只是我可以从您现有的代码中看到的一些问题。

    • 处理错误和意外的输入和条件!您的代码假定一切都将按计划进行。
    • 如果可以避免,不要要求或注意用户输入。您可以通过制作两个用于键盘亮度的脚本(例如.和)轻松地做到这一点。您还可以编写两个脚本来将 LCD 亮度提高和降低 100。kbd_brighterkbd_dimmer
    • /sys在写入文件之前对其进行完整性检查。它存在吗?它是否只包含一个整数?如果该整数意外地是负整数,我们该怎么办?妥善处理所有可能的情况。
    • 始终在其中包含变量的任何表达式周围加上双引号,以避免使用空字符串填充的变量出现问题([ $1 -eq 5 ]成为[ -eq 5 ]只是自找麻烦)并确保正确处理包含空格或换行符等特殊字符的变量。
    • 使用命令的完整路径来避免PATH攻击。例如,/bin/cat代替cat. 你可以看到路径type cat。
    • 使用 Bash 功能而不是外部命令。例如VARIABLE=`< filename`,而不是VARIABLE=`cat filename`. 此外,使用echo而不是/bin/echo使用 Bash 内置echo命令。您可以看到内置命令可用于type echo.
    • 将修改逻辑与文件写入逻辑分开以避免必须检查多个位置的文件写入错误,尤其是在对文件进行更改时。

    总结一下,这是一个示例kbd_brighter脚本。请注意,由于我没有华硕,因此我没有对其进行测试。由于我不是专家,因此它可能仍然存在安全问题。

    #!/bin/bash
    
    BRIGHTNESS_FILE="/sys/class/leds/asus::kbd_backlight/brightness"
    
    if [ ! -e "$BRIGHTNESS_FILE" ]; then
        >&2 echo 'ERROR: Asus keyboard backlight brightness file not found.'
        exit 1
    fi
    
    BRIGHTNESS="$( < "$BRIGHTNESS_FILE" )"
    
    if [ "$BRIGHTNESS" -eq "$BRIGHTNESS" ] 2>/dev/null; then
        if [ "$BRIGHTNESS" -lt "1" ]; then
            BRIGHTNESS="1"
        elif [ "$BRIGHTNESS" -lt "3" ]; then
            BRIGHTNESS="$(( "$BRIGHTNESS" + 1 ))"
        else
            BRIGHTNESS="3"
        fi
    else
        >&2 echo 'ERROR: Asus keyboard backlight brightness is not an integer.'
        exit 1
    fi
    
    echo "$BRIGHTNESS" > "$BRIGHTNESS_FILE"
    
    • 3

相关问题

  • Mac OS X Automator 的替代品?

  • 从 Ubuntu 中完全删除密钥环是否安全?

  • 如何从命令行仅安装安全更新?关于如何管理更新的一些提示

  • iptables 的图形用户界面?

  • 如何与无头服务器进行图形交互?

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve