#sudo #polkit #suid #doas #pkexec

karen

检测是否以 root 用户运行,如有需要使用 sudo 或其他包装器重启自身,或在设置 SUID 标志时设置 uid 为零

3 个版本

0.1.2 2024年6月23日
0.1.1 2024年6月17日
0.1.0 2024年4月28日

#263开发工具

Download history 13/week @ 2024-05-02 1/week @ 2024-05-16 10/week @ 2024-05-30 29/week @ 2024-06-06 151/week @ 2024-06-13 242/week @ 2024-06-20 55/week @ 2024-06-27 61/week @ 2024-07-04 47/week @ 2024-07-11 54/week @ 2024-07-18 102/week @ 2024-07-25 503/week @ 2024-08-01 484/week @ 2024-08-08 243/week @ 2024-08-15

1,343 每月下载量
aura-pm 中使用

MIT/Apache

15KB
144

karen

提升至您的管理员并获取 root 权限!

这是 sudoelevate Crates 的扩展分支,它是一个简单的库,用于使用 sudo 重启进程以提升权限。

此分支是对原始版本的重构,以下是一些更改

  • Elevate 结构的构建器模式
  • 通过构建器设置包装器,可以使用 pkexecpolkit 作为 sudo 的替代方案

API 是原始 sudo Crates 的超集,因此您可以用它作为直接替换,但您也可以使用新的构建器模式来设置自己的选项(目前仅支持包装器)

原始 sudo Crates 可在 GitLab (crates.io) 上找到。

crates.io docs.rs

检测是否以 root 用户运行,如有需要使用 sudo 重启自身,或在设置 SUID 标志时设置 uid 为零。

要求

  • 类 Unix 操作系统
  • 预期的包装器(sudo、pkexec、polkit)必须已安装并位于 PATH 中。默认为 sudo
  • 已测试 Linux 或 Mac OS X
    • 它应在 *BSD 上工作。您可能需要在 OpenBSD 上使用新构建器模式,而不是 sudo 使用 doas

示例

首先,将 karen 添加到您的 Cargo.toml

[dependencies]
karen = "0.6.1"

在您的 main.rs

fn main() -> Result<(), Box<dyn Error>> {
    karen::escalate_if_needed()?;
    println!("Hello, Root-World!");
    Ok( () )
}

如果您正在使用基于日志基础设施的日志功能,您将获得带时间戳和格式的输出。

传递RUST_BACKTRACE

如果将RUST_BACKTRACE设置为以下值之一,则该包将自动保留设置

  • `` <- 空字符串表示不传递
  • 1true <- 标准跟踪
  • full <- 完整跟踪
$ RUST_BACKTRACE=full cargo run --example backtrace
2020-07-05 18:10:31,544 TRACE [karen] Running as User
2020-07-05 18:10:31,544 DEBUG [karen] Escalating privileges
2020-07-05 18:10:31,544 TRACE [karen] relaying RUST_BACKTRACE=full
[karen] Passwort für user:
2020-07-05 18:10:39,238 TRACE [karen] Running as Root
2020-07-05 18:10:39,238 TRACE [karen] already running as Root
2020-07-05 18:10:39,238 INFO  [backtrace] entering failing_function
thread 'main' panicked at 'now you see me fail', examples/backtrace.rs:16:5

保留部分环境

您可以在sudo屏障中保留您环境的一部分。这允许在守护进程或云环境中使用更多配置选项

    // keeping all environment variables starting with "EXAMPLE_" or "CARGO"
    karen::with_env(&["EXAMPLE_", "CARGO"]).expect("sudo failed");

警告:如果不受信任的用户能够设置这些变量,这可能会给您的应用程序引入安全风险。

$ EXAMPLE_EXEC='$(ls)' EXAMPLE_BTICKS='`ls`' cargo run --example environment
2020-07-07 16:32:11,261 INFO  [environment] ① uid: 1000; euid: 1000;

...

declare -x EXAMPLE_BTICKS="\`ls\`"
declare -x EXAMPLE_EXEC="\$(ls)"
...

[karen] password for user:

2020-07-07 16:32:11,285 TRACE [karen] Running as Root
2020-07-07 16:32:11,285 TRACE [karen] already running as Root
2020-07-07 16:32:11,285 INFO  [environment] ② uid: 0; euid: 0;

...

declare -x EXAMPLE_BTICKS="\`ls\`"
declare -x EXAMPLE_EXEC="\$(ls)"

以SUID运行程序

$ cargo run --example suid
2020-04-17 15:13:49,450 INFO  [suid] ① uid: 1000; euid: 1000;
uid=1000(user) gid=1000(user) groups=1000(user),4(adm),27(sudo)
2020-04-17 15:13:49,453 TRACE [karen] Running as User
2020-04-17 15:13:49,453 DEBUG [karen] Escalating privileges
[karen] password for user:
2020-04-17 15:13:53,529 INFO  [suid] ① uid: 0; euid: 0;
uid=0(root) gid=0(root) groups=0(root)
2020-04-17 15:13:53,532 TRACE [karen] Running as Root
2020-04-17 15:13:53,532 TRACE [karen] already running as Root
2020-04-17 15:13:53,532 INFO  [suid] ② uid: 0; euid: 0;
uid=0(root) gid=0(root) groups=0(root)

然后将文件给root并添加suid标志。

$ sudo chown root target/debug/examples/suid
$ sudo chmod 4755 target/debug/examples/suid

现在再次运行程序

$ target/debug/examples/suid
2020-04-17 15:14:37,199 INFO  [suid] ① uid: 1000; euid: 0;
uid=1000(user) gid=1000(user) euid=0(root) groups=1000(user),4(adm),27(sudo)
2020-04-17 15:14:37,202 TRACE [karen] Running as Suid
2020-04-17 15:14:37,202 TRACE [karen] setuid(0)
2020-04-17 15:14:37,202 INFO  [suid] ② uid: 0; euid: 0;
uid=0(root) gid=1000(user) groups=1000(user),4(adm),27(sudo)

依赖项

~130KB