2 个版本

0.1.1 2023年8月24日
0.1.0 2023年8月24日

#2899 in 命令行工具

MIT/Apache

29KB
514

关于

codecov

l8ash 是一个命令行 shell,旨在其命令行接口上具有最小的攻击面。

如果您需要“拴住” shell 和 shell 用户,您可能只想在预先定义的操作过程(包含一系列命令和相应的参数)的 shell 上允许某些操作,而不包括任何不必要的语句,包括 shell 变量、变量展开、内联命令调用、shell 函数声明或命令展开。

l8ash 提供了非常有限的 shell 功能,但强大的命令调用限制支持。您只能允许用户使用预先定义的管道和其环境执行典型的管理任务。为了启用此功能,需要一个运行时配置文件 (~/.l8ashrc),其白名单表必须包含 命名管道(管道别名)以进行目标操作。可选地,l8ash 还可以在 shell 上调用时(作为预定义的管道)检查命令二进制文件的安全性。

l8ash 可以保护系统和资产,因此应该始终保持安全。

安装

cargo install l8ash

(注意,二进制文件名是 l8ash,而不是 l8ash!)

或者您可以从本地源代码构建二进制文件进行安装

cd path/to/this/repo
make
sudo make install

如果您没有权限访问系统路径,您可以在您的家目录下安装它

make
PREFIX=$HOME/local make install

# set your PATH if you need
# echo PATH=\$HOME/local/bin:\$PATH | tee -a $HOME/.bashrc

快速开始

1. 将其作为程序调用

$ l8ash

2. 提供一个可接受的 shell 脚本

$ cat some_l8ash_script.sh
#!/bin/sh
ls -l | tr -d \\\n 
$  cat some_l8ash_script.sh | l8ash

3. 将 shell 脚本作为参数提供

$  l8ash some_l8ash_script.sh 

4. 将 l8ash 设置为用户的默认 shell

{ 
  [ -x /bin/l8ash ] || {
    echo l8ash not found >&2
    false
  } &&
  grep /bin/l8ash /etc/shells > /dev/null || {
    echo failed to set l8ash as your default shell. consider to add `/bin/l8ash` to your /etc/shells. >&2
    false
  } 
} && chsh -s /bin/l8ash 

5. 开始吧。

ls -l | awk {gsub("-","neko",$0);print;} | tr 0  @ | tee -a something.funny | bzip2 | dd of=sf.bz2

功能

  • 通用命令行界面,用于使用原始参数调用命令,没有任何 shell 变量和 shell 函数

  • 为了实现强化 shell 体验,某些 POSIX shell 功能没有实现。l8ash 具有

    • 无内置命令(没有 echoprintfcdkillexit 作为内置命令。世界上也没有其他内置命令。)
    • 没有shell变量 var=val$var
    • 没有扩展(没有使用*或其他特殊通配符进行路径扩展,也没有变量或命令扩展。)
    • 没有命令别名 alias name="cmd arg1 arg2"
    • 没有shell函数 function f1 { ... }f1(){ ... }function f1 () { ... }
    • 没有字符串字面量 '...'"..."
    • 没有子命令 (...)
    • 没有分组命令 {...}
    • 没有后台任务 cmd &
    • 没有重定向 cmd > filecmd >> file
    • 没有重定向 cmd < file
    • 不要用分号结束命令 cmd1; cmd2; cmd3
  • 没有字符串字面量(再次强调)。空白总是被识别为单词分隔符。

  • 管道:系统shell的序数管道。它只是在shell会话中修改临时输入/输出的方式。

  • 运行时配置:您可以在 ~/.l8ashrc 中编写操作 白名单 和其他配置。

  • 命令 白名单:l8ash禁止在白名单表上列出之外的所有命令。

  • 命名管道/管道别名:允许的操作可以在配置文件中声明为 命名管道

  • 环境变量:可以指定管道的环境变量并将其应用于管道中的所有命令。

  • 完整性检查器:l8ash可以检查组成管道的命令二进制文件的完整性。

配置技巧

仅允许特定程序的白名单

要在受限模式下运行l8ash,创建 ~/.l8ashrc 并在该文件中声明 [[whitelist]]

[[whitelist]]
name = "ls"
command_line = "/bin/ls"
env = []
integrity = []

使用此配置,l8ash会话中的用户不能执行除 /bin/ls 之外的程序。对于此类只有一个程序的单一操作,command_line 字段应该是程序的完整路径及其参数。

注意

.l8ashrc 的路径可以通过 LEASH_CONF 环境变量进行切换。如果使用预设的 LEASH_CONF 启动 l8ash 二进制文件,则它引用运行时配置的定制路径。

在白名单上设置管道别名(或命名管道)

您可以在白名单表中声明命令别名。对于前面的示例,为操作设置一个在 name 字段中的别名。

[[whitelist]]
name = "l"
command_line = "/bin/ls"
env = []
integrity = []

使用此配置,您可以使用名称(别名)l调用/bin/ls,但不能使用其实际名称ls。您不能使用完整路径或其实际名称调用/bin/ls。(如果它在您的PATH中存在,则不能调用名为l的程序)。

此外,您还可以使用相同机制声明管道别名。在命令属性中设置管道语句,如下所示

[[whitelist]]
name = "count_files"
command_line = "/bin/ls | wc -l"
env = []
integrity = []

为管道传递环境变量

[[whitelist]]
name = "kci"
command_line = "/home/mofuzawa/bin/kubectl cluster-info"
env = ["KUBECONFIG=/var/conf/dist/your-kube-config"]
integrity = []

检查管道中每个命令的完整性

[[whitelist]]
name = "lstr"
command_line = "/bin/ls -l | /bin/tr - o"
env = []
integrity = [
        "a3604f3968fda1471dfdb51a3a4454d8a1b6c3dead99e84f442b515b9b49da53",
        "3138ff15c875f111613407f39261babafbfe8cdc77a4c1cebb834334b78b9f0b",
]

注意

对于完整性检查,所有命令都必须使用其完整路径,除非由于路径查找失败而无法调用该命令。

设计概念

参见上面特性的第二条款。每个条件,即通用shell功能的缺失,是l8ash安全模型的构建块。

规范 描述(特别是安全方面)
无内建命令 无shell内建命令的hack
无shell变量 无需担心变量内的任何危险内容
无扩展 无需担心意外的扩展被评估为格式错误的命令或字符串
无命令别名 无新的攻击代码集在shell会话中
无shell函数 无新的攻击代码集在shell会话中
无字符串字面量 无多个等效文本表达式的混淆。转义字符是唯一允许的方式。
无子命令 shell本身不进行fork。在管道中,只有shell生成的进程
无组命令 无stdout/stderr的捆绑。在管道中,命令具有单个I/O。
无后台任务 无在生成后挂起的未管理进程。
无重定向或间接引用 无对shell本身的读写操作。文件系统I/O仅允许用于命令。
无分号 EOL是列表评估的唯一操作码。因此,在l8ash中,列表必须是管道。

此外,l8ash确保用户只能通过白名单调用可信程序。

注意

Leash不涵盖文件系统及其内容的保护。建议使用其他机制来保护文件系统免受潜在的恶意程序或漏洞的侵害。覆盖或替换l8ashrc/l8ash本身的风险是l8ash安全性的关键因素。

错误报告

提出问题,谢谢!

依赖项

~7–17MB
~308K SLoC