使用 Cackle 抵御 Rust 供应链攻击
Cackle 是一个代码 ACL 检查器,用于增加供应链攻击的难度。Cackle 通过 cackle.toml 进行配置。在配置文件中,您可以定义 API 的类别,例如 net
、fs
和 process
,对其调用进行限制。然后,您也可以指定允许使用的 API。运行时,Cackle 会检查您的依赖树中是否有使用未经许可的受限 API 的依赖包。
API 定义了包含或排除哪些名称。例如,我们可以将“process” API定义如下:
[api.process]
include = [
"std::process",
]
exclude = [
"std::process::exit",
]
排除比包含更重要,因此应该更具体。在这里,我们定义了一个名为“process”的API,并将 std::process
模块中的任何函数加入进去。然后我们排除掉 std::process::exit
。因此,对 std::process::Command::new
的引用将被视为使用 process API,但对 std::process::exit
的引用则不会。
我们可以指定特定的软件包使用哪些API。例如:
[pkg.rustyline]
allow_apis = [
"fs",
]
allow_unsafe = true
这意味着 rustyline 包可以使用文件系统API,并且可以使用不安全的代码。
ReadMore: https://davidlattimore.github.io/making-supply-chain-attacks-harder.html
文本对决:Gap Buffers vs Ropes
我一直在从事一个业余项目,用 Rust 重新构想 Emacs 的 C 内核。在这个过程中,我发现需要用某种方法来表示缓冲区的文本。最简单的方法是使用大型字符串或行数组。然而,随着文本大小或行长的增加,这些方法的性能都很差。
GNU Emacs 曾以使用间隙缓冲区(gap buffer)来表示可编辑文本而闻名。甚至在维基百科的词条中也提到了它的名字。间隙缓冲区的优点是允许快速本地编辑,而且设计相当简单。从本质上讲,你可以将文本保存在一个巨大的数组中,中间留有未使用字节的间隙。插入文本时,将部分字节替换为文本,使间隙变小。当你想在文本的其他地方插入文字时,你可以将间隙移动到该位置,并执行相同的操作。删除则执行相反的操作,扩大间隙。有了这个简单的机制,就可以有效地表示可编辑文本。
我认为间隙缓冲区类似于更一般的数据结构——"数组"。间隙缓冲区只是一个针对在"光标"处插入而进行优化的数组,而不是在末尾插入。在许多十年中,使用间隙缓冲区为Emacs提供了良好的服务。
尽管如此,在现代世界中,Emacs似乎在选择上相对独行。当今大多数流行的编辑器使用某种形式的片段表(piece table)或绳索(rope)。这些数据结构将缓冲区分割成小块并对其进行操作。这使它们能够避免在远离编辑位置时移动光标的O(n)惩罚和调整缓冲区大小的延迟。
Rust有许多经过大量优化工作的绳索库。显而易见的做法是选择其中一个并继续。但我想亲自看看间隙缓冲区与这些更"高级"的数据结构相比如何。现代计算机可以非常快速地在线性内存上操作。因此,我构建了一个间隙缓冲区,并与其他竞争者进行了比较。
ReadMore: https://coredumped.dev/2023/08/09/text-showdown-gap-buffers-vs-ropes/
From 日报小组 Koalr
社区学习交流平台订阅:
评论区
写评论还没有评论