Shawl: 将一切应用程序运行为Windows服务
Shawl是一个用Rust编写的能够将任何程序作为Windows服务运行的包装程序。它可以处理Windows服务的API,因此您原本的程序只需要响应ctrl-C
或者SIGINT
。创建需要作为服务来运行的项目,只需将Shawl与您的项目捆绑在一起,将其设置为入口点,然后通过CLI传递指令来运行。
了解更多:crates.io GitHub
Rust中的插件
Rust语言为我们提供了许多非常强大的工具,为应用程序提升了灵活性和可扩展性(例如特征、枚举、宏等),但是所有这些都是在编译时完成的。但是为了获得我们所希望的灵活性,我们希望能够在运行时添加新功能。
这可以使用一个称为动态加载的技术来实现。
何为动态加载?
动态加载是所有主流操作系统提供的一种可以在运行时加载库的机制,以便用户检索函数或变量的地址。然后可以像使用其他任何指针一样使用这些函数和变量的地址。
在* nix平台上,dlopen()
函数用于将库加载到内存中,然后dlsym()
能够让您通过其符号名称获取指向某变量的指针。需要记住的一点是,符号不包含任何类型信息,因此调用者必须将指针转换为正确的类型。
通常,通过与某种类型的协定提前完成加载库来完成.例如,头文件需要声明"cos
"函数为 fn(f64) -> f64
.
来自man dlopen
的示例:
#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>
// Defines LIBM_SO (which will be a string such as "libm.so.6")
#include <gnu/lib-names.h>
// the type signature used by our cosine function
typedef double (*trig_func)(double);
int main() {
char *error;
// load the libm library into memory
void *handle = dlopen(LIBM_SO, RTLD_LAZY);
// handle loading failures
if (!handle) {
fprintf(stderr, "unable to load libm: %sn", dlerror());
return EXIT_FAILURE;
}
// Clear any existing errors
dlerror();
// get a pointer to the "cos" symbol and cast it to the right type
trig_func cosine = (trig_func) dlsym(handle, "cos");
// were we able to find the symbol?
error = dlerror();
if (error != NULL) {
fprintf(stderr, "cos not found: %sn", error);
return EXIT_FAILURE;
}
// use our cosine function
printf("cos(2.0) = %fn", (*cosine)(2.0));
// cleanup and exit
dlclose(handle);
return EXIT_SUCCESS;
}
其中LoadLibraryA()
, GetProcAddress()
以及FreeLibrary()
分别代替了dlopen()
,dlsym()
和dlclose()
。
libloading提供了一个高品质的Rust接口以及底层平台的动态加载机制。
阅读博客原文了解更多。
使用Rust制作RISC-V操作系统
详细教程请参阅http://web.eecs.utk.edu/~smarz1/osblog/
Cargo安全问题
最近,Rust团队收到了有关使用旧版Cargo构建crates的安全问题的反馈,这些crates使用了新版Cargo中添加的软件包重命名功能。如果您使用的是2018年5月10日发布的Rust 1.26.0,则不会受到影响。
此漏洞的CVE为CVE-2019-16760。
问题概述
可以通过Cargo.toml
和[dependencies]
区域配置Cargo,使其依赖于不同的crates,例如在crates.io中的crates。还可以通过多种方式配置crates的依赖,例如,如果您依赖serde
并启用该crates,则derive
的特征将如下所示:
serde = { version = "1.0", features = ['derive'] }
Rust 1.31.0 引入了Cargo的新功能 package
,这是一个在本地重命名crates的可选方法。例如,如果您在本地更喜欢使用serde1
,可以将serde
进行更改:
serde1 = { version = "1.0", features = ['derive'], package = "serde" }
正是由于添加了package
密钥,Cargo才以不同的方式编译crates。该功能最初是在Rust 1.26.0中实现的,但当时还不稳定。但是,对于Rust 1.25.0及更低版本,Cargo会忽略这个package关键字,并将依赖项行编译为:
serde1 = { version = "1.0", features = ['derive'] }
这意味着,当使用Rust 1.25.0及更低版本进行编译时,它将尝试下载 serde1
crates。黑客可以将serde1
的名字建立在crates.io上,虽然长得像serde 1.0.0
但是却是恶意的代码。
总而言之,在Rust 1.25.0及更低版本中,将忽略使用package
关键字来重命名依赖项Cargo.toml
。使用Rust 1.25.0及更高版本时,Cargo会忽略package
并下载错误的依赖关系,而该依赖关系可能被crates.io认为是恶意软件包。这不仅会影响您自己在本地编写的清单,还会影响发布到crates.io的清单。例如,如果您发布的crates依赖于crates.io上的serde1
,则添加了您的依赖项的用户如果使用Rust 1.25.0及更低版本,也可能会受到攻击。
阅读原文了解更多
使用Rust构建Azure IoT Edge安全防护程序
Azure IoT Edge是Microsoft Azure IoT团队的开源跨平台软件项目,旨在解决从云管理到本地网络边缘的计算分发管理问题。
该安全防护程序引导Azure IoT Edge的运行。它充当Azure IoT Edge运行时与许多主机服务(例如容器运行时和基于硬件的加密设备,硬件安全模块(HSM)和受信任的平台模块(TPM))之间的通信代理。
了解更多: 网站原贴 GitHub
Cyclone的深远影响
2001年,Trevor Jim(AT&T的研发公司)和Greg Morrisett(康奈尔公司)发起了一个联合项目,以开发C编程语言的安全方言,这是早期的有关Typed Assembly Language的成果 。经过五年的努力和参阅了一些已发表的论文,该团队(包括Dan Grossman,Michael Hicks,Nik Swamy和其他人)发布了Cyclone 1.0。随后,开发人员继续开展了一系列工作。