0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

首个Rust版sudo发布!

Linux爱好者 来源:51CTO技术栈 2023-09-01 15:59 次阅读

大家对于sudo命令太熟悉了,这个实用又危险的命令,甚至衍生出了“sudo rm -rf”类似的Linux圈的流行梗。近年来,sudo命令已经被一些开发组织盯上,开始了安全重构。现在,已经有Linux发行版本开始用上了诸如Rust等内存安全的语言重写过的sudo命令。

好消息是,就在今天,Rust版本的sudo出道了!互联网安全研究小组(ISRG)的Prossimo项目刚刚宣布了sudo-rs的第一个稳定版本。

用Rust重写的sudo到底有什么不同?目前进展如何?本文这就带领诸君一览首个用Rust重构的内存安全版的sudo -rs项目。

内存安全的sudo首个稳定版本 近两年,“内存安全软件”已经被美国政府机构提上了安全议程。而早在今年5月,就有报道称Prossimo正计划将sudo从C移植到Rust的说法。 在无处不在的 Linux 操作系统中,sudo 实用程序是工程师跨越用户和管理帐户之间隐私边界的最常用方法之一。因此,其安全性至关重要。 sudo-rs项目则是用 Rust 编写的 sudo 和 su 的、面向安全和内存安全的实现。官网声明中显示,sudo-rs 目前仅针对基于 Linux 的操作系统;运行 sudo-rs 需要 Linux 内核 5.9 或更高版本。

3677427a-487b-11ee-97a6-92fbcf53809c.png

sudo-rs 是用 Rust 编写的。所需的最低 Rust 版本是 1.70。如果所用的Linux 发行版未打包该版本(或更高版本),可以通过rustup安装最新版本。此外,开发者还需要 PAM 的 C 开发文件(比如在 Debian上的libpam0g-dev、Fedora上的pam-devel等)。

安装依赖项后,构建 sudo-rs 就变得简单了:

cargo build --release

这会产生一个二进制文件target/release/sudo。但是,此二进制文件必须设置 setuid 标志,并且必须由 root 用户拥有,才能提供任何有用的功能。同时,sudo-rs 需要 sudoers 配置文件。如果sudoers 配置文件存在,则将从该文件加载,否则将使用/etc/sudoers-rs原始位置。

与C版sudo有何不同?

sudo-rs 支持的功能比 sudo 少。其中一些是设计使然。在大多数情况下,如果你尝试不支持的操作(例如,使用未实现的配置标志或命令行选项),你将收到明显的错误。除上述情况外,用户配置/etc/sudoers需要注意:

(1)use_pty默认情况下启用,可禁用。

(2)env_reset被忽略——这总是启用的。

(3)visiblepw被忽略——这始终被禁用。

(4)verifypw目前被忽略;始终需要密码sudo -v。

(5)mail_badpass、always_set_home、always_query_group_plugin和 match_group_by_gid不适用于该版本的实现,但出于兼容性原因而被忽略。

其他一些需要注意的显著的限制:

(1)部分功能尚不支持,特别是使用和sudoedit,以及防止 shell 逃逸时的NOEXEC和NOINTERCEPT。

(2)Defaults(尚)不支持用于更细粒度控制的每用户、每命令、每主机sudoers 条目。

(3)此时 sudo-rs 始终使用 PAM 进行身份验证,你的系统必须设置为 PAM。

(4)sudo-rs 将使用sudo服务配置。这也意味着资源限制、umask 等必须通过 PAM 配置,而不是通过 sudoers 文件。

sudo-rs 将不包括原始 sudo 的 sendmail 支持。sudoers 文件必须是有效的 UTF-8。如果你发现缺少原始 sudo 的常见用例,请在我们的问题跟踪器中为其创建功能请求。

为什么要重写sudo?

其实,原始的sudo已经变得相对不安全了。最早的sudo开发始于 1980 年代(早于GNU/Linux的发布),几十年来,它已经成为在执行更改的同时将操作系统的风险降到最低的一个基本的命令工具。但因为它是 C 语言编写的,近些年来时不时就会曝出一些错误或漏洞,而这其中有专业分析估计有三分之一的安全错误都是内存管理问题。

另外,sudo有许多不常用的功能,也会为安全风险带来更多的攻击面。为此,使用Rust重写后的sudo -rs项目则大大提高了原始sudo的安全性:

(1)使用内存安全语言 (Rust),解决因内存管理而产生的的内存方面的安全错误问题;

(2)省略不常用的功能以减少攻击面;

(3)开发一个广泛的测试套件,甚至设法找到原始 sudo 中的错误。

已经有Linux发版采用了!

早在今年1月,就有企业宣布推出了内存安全版的Linux系统:Wolfi Linux,宣称能从根本上杜绝大量已知软件漏洞。而有意思的是,这家企业:Chainguard 的首席执行官 Dan Lorenc 表示,并不是完全由内存安全语言编写的,而是一个组合——“Wolfi 是使用以内存安全语言编写的新库和不安全语言编写的库的组合开发的,是内存安全的系统级实现。”

此外,Chainguard 还与互联网安全研究小组 (ISRG) 合作,为 Wolfi 创建了一个 Rustls TLS 库,可用作 libcurl 中的默认后端。所有 curl 镜像或任何其他依赖于 curl 的镜像都能够利用 Wolfi 的内存安全属性。

sudo -rs的初衷与Wolfi Linux所致力的内存安全方向完全一致,因此,Wolfi Linux系统已经可以使用 sudo -rs命令。Dan Lorenc 表示:“当我们第一次着手构建 Wolfi 时,确保内存安全始终是首要任务。”

相信之后也会有不少打算与Rust兼容的发行版也会渐渐采用sudo -rs。

开发团队的阵容也相当硬核

首先,该项目是互联网安全研究小组 (ISRG) 的 Prossimo 项目发起的,目的是为了保护关键软件的内存安全性。当时选择Rust来“保护”Sudo,也是因为sudo完美地契合以下四个条件:

(1)使用非常广泛(几乎每个服务器 / 客户端都在使用)

(2)被应用于重要的安全边界

(3)执行关键功能

(4)是否使用了内存不安全的语言编写(例如 C、C++、asm)

其次,其实这个项目早在今年5月份就有报道,Ferrous Systems 和 Tweede Golf 都是致力于软件安全的公司,前者有着非常丰富经验的Rust大神坐镇,服务了诸如mozilla、安卓等全球知名的项目;后者公司的大佬则开发过许多的开源工具包,诸如Node.js、Rust&Embedded Rust、Go、React、Symfony和Flutter,以及操作端的Docker、Ansible和Kubernetes等等。可谓实力不俗。

368c258c-487b-11ee-97a6-92fbcf53809c.png

最后,我们从项目的官网上也可以看到,亚马逊为这个项目提供了资金支持,并表示支持想内存安全软件的过渡。

值得一提的是,就连最初的基于 C 的 sudo 实用程序的维护者Todd C. Miller也参与了进来, Todd 也抽出时间为该项目提供了有关实施 sudo-rs 方面的中肯建议。

接下来计划:增加企业功能、更多发版支持

但启动这个项目要更早,是在2022年的12月份就已经启动。现在sudo-rs这个项目将获得了里程碑式的成果,从即将到来的9月份开始,这个联合开发团队将开始 2023 年 9 月的里程碑 4我们的工作计划,主要是围绕企业功能展开,比如多用户系统的安全功能(例如NOEXEC)、审核跟踪日志、sudoers的主机名匹配、支持16个以上的用户组(group_file插件)等。

36c70c92-487b-11ee-97a6-92fbcf53809c.png

第五个里程碑则可能更为诸位所期待:除了Debian/Ubuntu以外的发行版以外,Fedora版本也将提供支持,SELinux和AppArmor支持、sudoedit实现等等。

写在最后:Linux面临的安全债

Linux现在无处不在,但并不意味着万事大吉。

在Lorenc 看来,开发 “内存安全版” Linux 系统意义重大,目的在于提供一个更安全的平台来保护严重依赖 Linux 来部署应用程序的软件供应链,今天在非内存安全平台上开发应用程序是不负责任的。

“sudo utility是安全关键工具的完美示例,它既普遍应用又未被充分重视。对此类工具的安全性改进将对整个行业产生巨大影响。构建第一个 sudo-rs 版本的工作通过采用 Rust 等内存安全语言,在消除潜在安全问题方面迈出了一大步。这对于维护和维护 Wolfi 作为想要解决大多数现代供应链威胁的开发人员的默认安全基础至关重要。” 这位ChainGuard 创始人非常看好sudo-rs。

与此同时,绝大多数安全漏洞都可以追溯到涉及应用程序如何访问内存的问题。然后,网络罪犯利用这些漏洞发起攻击,例如,利用缓冲区溢出来访问数据等等。

而包括Linux之父在内的维护者们,也已经开始接受 Rust 作为 C 的替代品,来消除 Linux 内核中的这些类型的漏洞。

虽然,这些遗留代码数以万亿计,现在看起来是一项难以完成的艰巨任务,但正如同Linus在去年的开源峰会上所做的那样:在声称在6.1版本将Rust合并到主线上的同时,提前给各位打个预防针:

“以防此事搞砸了我又发脾气,先给大家道个歉!”

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux
    +关注

    关注

    87

    文章

    10991

    浏览量

    206736
  • 操作系统
    +关注

    关注

    37

    文章

    6284

    浏览量

    121882
  • Rust
    +关注

    关注

    1

    文章

    223

    浏览量

    6387

原文标题:首个 Rust 版 sudo 发布!

文章出处:【微信号:LinuxHub,微信公众号:Linux爱好者】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    微软正式发布适用于Windows的Sudo

    微软已在 Windows 11 Insider Preview Build 26052 中发布适用于 Windows 的 Sudo,并将其在 MIT 协议下进行开源。
    的头像 发表于 03-19 09:20 305次阅读
    微软正式<b class='flag-5'>发布</b>适用于Windows的<b class='flag-5'>Sudo</b>

    一次Rust重写基础软件的实践

    受到2022年“谷歌使用Rust重写Android系统且所有Rust代码的内存安全漏洞为零” [1] 的启发,最近笔者怀着浓厚的兴趣也顺应Rust 的潮流,尝试着将一款C语言开发的基础软件转化
    的头像 发表于 01-25 11:21 272次阅读

    从Rustup出发看Rust编译生态

    从Rustup出发看Rust编译生态 1. Rust和LLVM的关系是怎样的? 2. Rustup中targets是什么,为什么可以安装多个? 3. Rust在windows上为什么需要安装Visual studio?
    的头像 发表于 01-02 11:00 238次阅读

    什么是sudo rm -rf?为什么这个命令如此危险?

    sudo rm -rf 是一个linux的命令行命令,用于在系统中删除文件和目录。sudo表示以管理员权限运行该命令。
    的头像 发表于 10-24 18:25 1280次阅读

    Rust语言如何与 InfluxDB 集成

    Rust 是一种系统级编程语言,具有高性能和内存安全性。InfluxDB 是一个开源的时间序列数据库,用于存储、查询和可视化大规模数据集。Rust 语言可以与 InfluxDB 集成,提供高效
    的头像 发表于 09-30 16:45 616次阅读

    Rust GUI实践之Rust-Qt模块

    Rust-Qt 是 Rust 语言的一个 Qt 绑定库,它允许 Rust 开发者使用 Qt 框架来创建跨平台的图形界面应用程序。Qt 是一个跨平台的应用程序框架,它提供了一系列的工具和库,可以帮助
    的头像 发表于 09-30 16:43 964次阅读

    如何使用Rust连接Redis

    Redis是一款快速、开源、键值存储数据库,被广泛应用于缓存、发布/订阅系统、定时任务等场景中。Rust提供了很多Redis的客户端库,本教程将会介绍如何使用Rust连接Redis,以及如何通过
    的头像 发表于 09-19 16:22 1362次阅读

    基于Rust的Log日志库介绍

    Rust是一门系统级编程语言,因其安全性、高性能和并发性而备受欢迎。在Rust应用程序中,日志记录是一项非常重要的任务,因为它可以帮助开发人员了解应用程序的运行情况并解决问题。Rust的Log库提供
    的头像 发表于 09-19 14:49 2128次阅读

    内存安全、用Rust重写的sudo发布首个稳定版

    sudo(substitute user [或 superuser] do),是一种计算机程序,用于类 Unix 操作系统如 BSD、Mac OS X/macOS 以及 GNU/Linux,该计算机程序可以让用户以安全的方式使用特定的权限执行程序(通常为操作系统的超级用户)。
    的头像 发表于 09-01 15:06 393次阅读
    内存安全、用<b class='flag-5'>Rust</b>重写的<b class='flag-5'>sudo</b><b class='flag-5'>发布</b><b class='flag-5'>首个</b>稳定版

    阿里平头哥发布首个 RISC-V AI 软硬全栈平台

    转自https://m.ithome.com/html/714391.htm 2023 RISC-V 中国峰会8月23日在北京召开,平头哥在会上发布首个自研 RISC-V AI 平台。 据介绍,该
    发表于 08-26 14:14

    聊聊Rust与C语言交互的具体步骤

    rust FFI 是rust与其他语言互调的桥梁,通过FFI rust 可以有效继承 C 语言的历史资产。本期通过几个例子来聊聊rust与 C 语言交互的具体步骤。
    发表于 07-06 11:15 1021次阅读

    Rust的内部工作原理

    : google发布的 libtracecmd Rust wrapper 这个库是libtracecmd的Rust wrapper,它允许编写程序来分析由trace-cmd 生成的Linux的ftrace数据。 github地址
    的头像 发表于 06-14 10:34 465次阅读
    <b class='flag-5'>Rust</b>的内部工作原理

    Rust代码中加载静态库时,出现错误 ` rust-lld: error: undefined symbol: malloc `怎么解决?

    “ [i]malloc ”、“ [i]exit ”。我验证了使用 ` [i]nm ` 命令。 问题是我打算使用 ffi 在 rust 中使用这个静态库。当我尝试在我的 Rust 代码中加载静态库
    发表于 06-09 08:44

    谷歌开源内部Rust Crate审计结果

    Rust 可以轻松地将代码封装和共享到 crate 中,crate 是可重用的软件组件,就像其他语言中的包一样。我们拥抱广泛的开源 Rust crate 生态系统,既利用了谷歌以外编写的 crates,也发布了我们自己的几个
    的头像 发表于 05-29 11:10 549次阅读

    rust语言基础学习: rust中的错误处理

    错误是软件中不可避免的,所以 Rust 有一些处理出错情况的特性。在许多情况下,Rust 要求你承认错误的可能性,并在你的代码编译前采取一些行动。
    的头像 发表于 05-22 16:28 1389次阅读