跳转到帖子

游客您好,欢迎来到黑客世界论坛!您可以在这里进行注册。

赤队小组-代号1949(原CHT攻防小组)在这个瞬息万变的网络时代,我们保持初心,创造最好的社区来共同交流网络技术。您可以在论坛获取黑客攻防技巧与知识,您也可以加入我们的Telegram交流群 共同实时探讨交流。论坛禁止各种广告,请注册用户查看我们的使用与隐私策略,谢谢您的配合。小组成员可以获取论坛隐藏内容!

TheHackerWorld官方

牧云插件系统技术选型之探针开发用什么?

精选回复

发布于

本文将讨论基于WASM 的牧云插件系统开发中探针开发语言的选择。我们将比较不同语言在性能、安全性、易用性等方面的优缺点,并解释我们最终选择哪种语言作为探针开发语言。 \r

\r

这是“**Host Agent插件引擎开发故事**”系列文章的第四篇文章,以后会持续更新。本系列文章将带领您深入了解长汀牧云团队的主机Agent插件引擎的开发过程。内容涵盖了技术选型、插件接口设计、组件通信框架等多个方面,并详细讲解了其背后的原理和实现方法。无论您是网络安全专业人士,还是对技术开发感兴趣的读者,您都可以从中有所收获。我们希望通过分享开发过程中面临的挑战、解决方案和实践经验,提供深入的见解和有价值的技术参考,帮助读者了解如何构建高效可靠的安全产品,共同推动安全技术社区的发展。 \r

\r

## 探针的重要性\r

\r

在主机安全系统的架构中,“Agent”程序非常重要。它既是实现基本功能的重要模块,也是主机安全系统中特定安全能力的承载。其运行不仅要涵盖入侵检测、资产盘点、应用监控、漏洞检测、帮助优化性能和快速排查问题等,还必须实现高度的稳定性、可靠性和安全性。因此,仔细选择使用哪种语言来开发探针是一个非常非常重要的问题。 \r

\r

## 选择的基本原则\r

\r

根据主机安全系统的实际需求,探针开发语言的选择至少要满足以下基本原则:\r

\r

* 高性能:编写的程序的执行性能上限很大程度上取决于编程语言的设计和实现。为了满足高效响应安全事件而不占用业务资源的需求,最好选择性能尽可能最高的语言。 \r

* 安全性强:作为一个安全系统,其自身的安全性无疑是非常重要的。如果系统本身存在安全漏洞,就会为黑客随意进入受保护的系统打开一扇大门,这是绝对不能接受的。 \r

* 良好的平台兼容性:显然我们需要支持多种不同的操作系统,因此如果不同平台能够共享大部分代码和基础设施,显然对于降低相关维护成本会有很大帮助。同时,减少了维护压力和代码量,使得核心代码尽可能精简和稳定,项目质量和实施安全性也会得到一定程度的提升。 \r

* 社区支持:活跃的社区不仅可以提供各种轮子,最重要的是通过大规模使用帮助该语言的使用者解决各种情况下的大量兼容性问题,这非常有利于提高项目的可靠性和稳定性。 \r

* 简单易用:如果在满足其他条件的同时还能享受写作的乐趣,那当然是最好的。如果没有,你可能不得不忍受。 \r

\r

## C/C++\r

\r 6bd3ac29-69a0-40ef-86af-4dd7d0000d4c.jpeg

\r

\r

使用`C++`编写`Agent`程序是主机安全领域非常常见的做法。用“C”编写相对不太常见,但非常适合满足特定场景的特殊需求。主机安全场景分析如下:\r

\r

1. 效率:显然在谈论`C++`时,我们必须谈论性能。几乎可以说是蓝星上除了组装之外最快的事情了。它可以生成最精简的机器代码,并提供理论上几乎最高的性能。因此,从这个角度来看,非常适合编写主机`Agent`。 \r

2.安全性:说到`C++`,熟悉网络安全的人一定知道,这是内存安全问题的重灾区,而且严重得不能再严重了。从这个角度来说,写主机`Agent`是非常不适合的。 \r

3、平台兼容性:因为非常接近系统底层,所以天然不具备跨平台能力,但是它解决跨平台能力的能力却非常强大。如果有一个维护良好的框架(业界有著名的例子,例如`QT`),那么跨平台就完美了。遗憾的是我们没有一个可以直接使用的框架。 \r

4、社区支持:作为一个历史悠久的古老社区,各种轮子都被制造出来了。但管理来自各种来源的第三方包和依赖项在“C++”项目中是一个极其困难的问题。 \r

5. 易用性:如果你说的是编写内核相关的部分,那么它是非常容易使用的。毕竟,内核也是‘C’或‘C++’。但其他方面就很难说了。 \r

\r

##Java\r

\r f75aac96-d162-4f7e-96ff-792eb68fbb1e.png

\r

\r

使用Java编写Agent程序也是主机安全领域的常见做法。主机安全场景分析如下:\r

\r

1.效率:作为虚拟机语言,很多时候无法与`C++`相比,但也很不错了。但它存在内存占用大的问题,这是我们不太喜欢的。 \r

2.安全性:“Java”是一种具有垃圾收集功能的内存安全语言。如果你使用的花哨的东西较少并且设计良好,那么你不需要太担心安全性。 \r

3.平台兼容性:`JVM`帮助我们提供平台兼容性,但是如果`JVM`不支持,那就真的不支持了。通常这不是问题,但如果出现问题,修复起来可能会更加困难。 \r

4、社区支持:也是一个非常成熟、古老的社区,各种轮子都被创造出来了。系统生态比`C++`更加统一。 \r

5、易用性:是一种非常工程化的语言,基本上具备了所有的功能,但是有点冗长。 \r

\r

##Python\r

\r 21c68f99-416f-4d57-bdc2-b8e2e418eab8.png

\r

\r

用“Python”编写“Agent”程序不太常见,但仍然存在。主机安全场景分析如下:\r

\r

1.效率:不太好,多线程不能并行,内存占用比较高,启动时间有点慢。如果你想要更好的东西,通常必须使用`C++`或`Rust`来编写底层模块,而且新版本越来越快。还有一些版本声称比官方的“CPython”更快。 \r

2、安全性:非常高级的语言,内存安全,但是动态性太强,外部交互的安全性不是特别容易控制。 \r

3.平台兼容性:具有跨平台兼容性,但如果版本太低,则必须使用`Python 2`。 \r

4.社区支持:可能是世界上最活跃、最大的社区,什么都有。 \r

5. 易于使用:非常易于使用且编写起来很有趣。 \r

\r

## 红宝石\r

\r 1aca5ec9-7c5c-4deb-84c5-625b5f2518ef.png

\r

\r

使用Ruby 来编写Agent 并不常见,但知名厂商已经率先采用。我们来分析一下主机安全场景:\r

\r

1.效率:有点慢。虽然最近变得越来越快,但是还是有点慢。 \r

2.安全性:它也是内存安全的。我对其他事情了解不多。我觉得它应该类似于“Python”。 \r

3.平台兼容性:内置跨平台兼容性。 \r

4. 社区支持:好的。一些安全套件也是用Ruby 编写的(例如Metasploit),因此在安全社区中有一定的影响力。 \r

5、易用性:写起来太有趣了,感觉不像编程,而且到处都有语法糖。 \r

\r

## 去\r

\r 36b6fb00-3513-4cd9-bac4-6f912d0e8686.png

\r

\r

使用`Go` 来编写`Agent` 是**我们的方法**。主机安全场景分析如下:\r

\r

1、效率:说实话,还是蛮快的。如果你不考虑`C++`,这是一个不错的选择。唯一的问题是`GC`提供的控制比较弱,相关问题不好解决。 \r

2.安全性:它也是内存安全的。作为一种没有静态虚拟机的高级语言,它在各方面都做得比较好。 \r

3.平台兼容性:原生支持跨平台,构建和分发非常方便。它可以在一定程度上提供对底层的控制,但一旦超出能力范围就很难了。 \r

4、社区支持:发展如火如荼,特别是‘CGO’可以和很多生态融合(虽然‘CGO’确实很难用)。 \r

5、易用性:语法简单明了,并发简单。后来也有‘go mod’,就还可以了。 \r

\r

## 铁锈\r

\r c4974a6e-a215-4b14-b654-13fa7562d0f3.png

\r

\r

使用Rust 来编写Agent 是一种新兴的实践。主机安全场景分析如下:\r

\r

1.效率:只要不过分,基本可以获得与`C++`同等水平的性能,有时甚至更好。独特的内存管理方式,使内存使用可控。 \r

2、安全:以安全着称。作为一种没有`GC`的编译型非虚拟机语言,它保证了内存安全,并且非常强大。 \r

3. 平台兼容性:官方不支持太旧的版本。大部分不支持的部分都没有问题。当出现问题时,我自己解决问题的能力很强,类似于`C`和`C++`。 \r

4.社区支持:据说世界上一切可以被`Rust`重写的东西最终都会被`Rust`重写。常见的都在那里,很快一切都会在那里。它与‘C’世界自然融合,没有‘CGO’的缺陷(比如不可避免的内存拷贝)。 \r

5. 易用性:以上手困难而闻名。但当我熟悉了它之后,我就很高兴写了。 \r

\r

## 其他语言\r

\r

其他的主要是用`Perl`、`Bash`等等实现的,但是显然不太好用,原因就不详细说了。 \r

\r

## 选择Rust 的理由\r

\r

对比各种常见的选择,我们可以发现,如果你想要速度快、内存占用小、没有太多的安全顾虑、强大的社区支持以及适应各种复杂场景的能力,基本上你应该选择“Go”和“Rust”。 Go 成熟得比较早,所以牧云很早就选择了Go 语言。 \r

\r

随着多年的深入使用和Go越来越云原生的趋势,持续忽视社区对增强内存控制能力和提供有用的动态加载机制的强烈呼声,以及主动放弃对旧操作系统支持的政策,给主机安全系统的扩展性和兼容性带来了许多困难。正如上一篇文章提到的,为了满足牧云自身的兼容性需求、性能需求和可扩展性需求,我们做了很多努力,提出了很多技术创新解决方案。截至目前,由于修补,我们的“Go”版本停留在“Go 1.17.2-patch”。后缀中的“patch”代表我们所做的各种定制。 \r

\r fd0995a2-4f06-4969-8f55-b1e6bfe4fd6e.png

\r

\r

最新版本终于添加了诸如[堆内存限制](https://github.com/golang/go/issues/48409)、[手动内存管理](https://github.com/golang/go/issues/51317)等功能,以及像[WAZERO](https://wazero.io/)一样用纯Go 编写的WASM 诞生了。当引擎解决了可扩展性问题的时候,我们就已经积累了很多麻烦。 \r

\r

解决难以挽回的问题最好的办法是什么?当然是拆下来重写(开个玩笑)。 \r

\r

但如果要再次升级`Go` 版本,就意味着所有的兼容性适配和微调都得重做,甚至升级到最新版本并不能解决所有问题(比如对低版本系统的兼容性适配等)。这时,我们看到‘Rust’语言逐渐兴起,这是一个非常好的选择。在“Rust”之前,我们唯一的选择是“C++”;但现在有了Rust,我们不必承受C++ 的维护痛苦,就能获得足够的灵活性。 \r

\r b9368508-ea2b-45a7-b597-59f8e5ee661c.png

\r

\r

Rust 官网主页上有一句话是这样写的:*全世界数百家公司正在生产中使用Rust,以获得快速、低资源、跨平台的解决方案。*\r

\r

不得不承认,“*快速、低资源、跨平台解决方案*”这句话确实俘获了我们做主机安全产品的开发者的心。 \r

\r

## 推荐相关博文\r

\r

上一篇:**【【牧云插件系统选型之争】】(https://stack.chaitin.com/techblog/detail?id=77)**\r

\r

系列文章目录:【【预览】主机Agent插件引擎开发故事总结】(https://stack.chaitin.com/techblog/detail?id=82)\r

\r

1. **[[揭秘牧云插件开发者的创新之路:从无法解决的问题到“充满乐趣”]](https://stack.chaitin.com/techblog/detail?id=72)**\r

2. **[【牧云插件系统面向未来的设计原则]](https://stack.chaitin.com/techblog/detail?id=73)**\r

3. **[【牧云插件系统选择之争]](https://stack.chaitin.com/techblog/detail?id=77)**\r

4. **【【牧云插件系统技术选型中探针开发用什么? 】](https://stack.chaitin.com/techblog/detail?id=83)**\r

5. **【【牧云插件系统技术选型及插件开发? 】](https://stack.chaitin.com/techblog/detail?id=85)**\r

6. **[【牧云插件系统技术选型插件通信框架大PK]](https://stack.chaitin.com/techblog/detail?id=94)**\r

7. **[【牧云插件系统技术选型:大家都会抱怨的序列化方法选择之争]](https://stack.chaitin.com/techblog/detail?id=97)**\r

8. **[【牧云插件系统技术选型:应该选择哪种WASM运行时?如果不选择这个,就会出大问题! 】](https://stack.chaitin.com/techblog/detail?id=105)**

创建帐户或登录后发表意见

最近浏览 0

  • 没有会员查看此页面。