基于Go开发的软件轶事
2021-02-28 10:48:31 阿炯

Golang内存管理

以Golang-v1.5语言为例,看下它是如何管理内存的。Go语言的并行模型是以东尼·霍尔的通信顺序进程(CSP)为基础,与 C++ 相比,Go 并不包括如枚举、异常处理、继承、泛型、断言、虚函数等功能,但增加了切片 (Slice) 型、并发、管道、垃圾回收、接口(Interface)等特性的语言级支持。

像Go这种支持内存管理和并行功能的语言,一般都是有一个运行时(runtime),它就像针对这个语言开发的一个小型OS,为该语言开发的程序提供了一个标准可靠的执行环境。这个环境提供了内存管理和并行模型等一些其他功能,每个Go程序加载之时,就会先执行Go运行时环境。其运行时的内存空间结构:


看上去和普通应用的内存空间结构并无二样,但是普通应用程序是调用malloc或者mmap,向OS申请内存;而Go程序是通过Go运行时申请内存,Go运行时会向OS申请一大块内存,然后自己管理。Go 应用程序分配内存时是直接找 Go 运行时,这样 Go 运行时才能对内存空间进行跟踪,最后做好内存垃圾回收的工作。

这些函数形成了一个 Go 运行时访问内存时的抽象层,在不同的操作系统上,这些个函数调用操作系统 API 也是不同的。比方说,在 Linux 上调用的是 mmap、munmap 和 madvise 等系统调用。

GO运行时调用runtime.sysAlloc函数返回了一个大块内存空间,Go运行时把这大块内存称为arena区域,其中又划分为8KB大小页,其结构如下图所示:


这里的页与操作系统里的页不是一回事。这里的页是Go运行时定义的,通常是操作系统页的整数倍。

Golang内存管理数据结构有五大类,分别是 mheap、heapArena、mcentral、mcache、mspan。简略的细节可参考此处


Go 编写的恶意软件数量激增

网络安全公司 Intezer 于2021年2月未发布了一份报告,概述了威胁行为者在 2020 年期间使用 Go 恶意软件的情况。其中包括对已经活跃多年的恶意软件和从未被公开报道的恶意软件的代码连接和 IoC 的分析。该报告指出自 2017 年以来,用 Go 编程语言编码的恶意软件菌株数量在过去几年中急剧增加了约 2000%。这一发现凸显并证实了恶意软件生态系统的一个普遍趋势,即恶意软件作者已经慢慢从 C 和 C++ 转向 Go。

第一个基于 Go 的恶意软件在 2012 年被发现,在此几年后,Go 才在恶意软件领域流行起来。报告指出,在 2019 年之前,发现用 Go 编写的恶意软件更多的是一种罕见的现象,而在 2019 年期间,它变成了一种日常现象。现如今,Go 语言已经被恶意软件广泛采用。 国家级黑客组织(APT)、网络犯罪操作员甚至连安全团队都在使用该语言,并经常使用它来创建渗透测试工具包。而 Golang 之所以出现这种“人气”骤增的现象,主要原因有三:

首先是 Go 支持跨平台编译的简易流程;这使得恶意软件开发者只需编写一次代码,就可以从同一个代码库中编译出多个平台的二进制文件,让他们可以从同一个代码库中针对 Windows、Mac 和 Linux,这种多功能性是其他许多编程语言通常不具备的。

第二个原因是基于 Go 的二进制文件仍然很难被安全研究人员分析和逆向工程,这使得基于 Go 的恶意软件的检出率一直很低。

第三个原因与 Go 对网络数据包和请求工作的支持有关。Intezer 解释称:"Go 具有编写良好的网络堆栈,很容易操作;Go 已经成为云计算的编程语言之一,很多云原生应用都是用它编写的。例如,Docker、Kubernetes、InfluxDB、Traefik、Terraform、CockroachDB、Prometheus 和 Consul 都是用 Go 编写的。考虑到创建 Go 的原因之一就是发明一种更好的语言来代替 Google 使用的内部 C++ 网络服务,因此这是有道理的。"

由于恶意软件菌株通常会一直篡改、组装或发送/接收网络数据包,Go 为恶意软件开发人员提供了他们在一个地方所需的所有工具,这也就很容易理解为什么许多恶意软件编码人员都会放弃 C 和 C++ 而使用它。Intezer 指出,许多恶意软件(家族)都是针对 Linux 和物联网设备的僵尸网络,它们可以安装加密矿机或将受感染的机器加入 DDoS 僵尸网络。此外,使用 Go 编写的勒索软件似乎也在变得越来越普遍。

在 2020 年看到的一些最大和最流行的基于 Go 的威胁的例子包括(每个类别):
Nation-state APT malware:
Zebrocy - 俄罗斯政府资助的组织 APT28 去年为其 Zebrocy 恶意软件创建了一个基于 Go 的版本。
WellMess - 俄罗斯政府资助的组织 APT29 去年部署了其基于 Go 的 WellMess 恶意软件的新升级版本。

E-crime malware:
GOSH - Carbanak 组织在去年 8 月部署了一个用 Go 编写的名为 GOSH 的新 RAT。
Glupteba - 2020 年出现了新版本的 Glupteba loader,比以往任何时候都先进。
Bitdefender 看到了一个针对运行 Oracle WebLogic 的 Linux 服务器的新 RAT。
CryptoStealer.Go - 2020 年出现了新的改进版 CryptoStealer.Go 恶意软件,此恶意软件的目标是加密货币钱包和浏览器密码。
此外,在 2020 年还发现了一个用 Go 语言编写的 clipboard stealer。

基于 Go 编写的新勒索软件菌株:
RobbinHood
Nefilim
EKANS

鉴于其最近的发现,Intezer 与其他公司一起,预计 Golang 的使用率在未来几年将继续上升,并与 C、C++ 和 Python一起,成为未来恶意软件编码的首选编程语言,这也从侧面说明了golang将会是一个通用性系统级语言。做坏事和工具的先进性没什么关系,这取决于人是什么样的人。同时网络上发布了 Go 开发者调查报告之 2020 ,我们来简单看一下。

2021年3月,Go 开发者调查 2020 新鲜出炉。本次调查收到了 9648 个回复,和 2019 年差不多。有些问题的样本量比其他问题小,这是因为有些问题向所有人展示,而另一些问题仅向随机的一部分受访者展示。

亮点内容:
Go 的使用在工作场所和企业中正在不断扩大,有 76% 的受访者在工作中使用 Go,而 66% 的受访者表示 Go 对公司的成功至关重要
总体满意度很高,有 92% 的受访者对使用 Go 感到满意
大多数受访者在不到三个月的时间里感觉到了 Go 的生产力,其中 81% 的人感觉到 Go 的生产力非常或非常高
受访者表示会及时升级到最新的 Go 版本,其中 76% 的受访者在前 5 个月内升级到最新版本
使用 pkg.go.dev 的受访者在寻找 Go 包方面比非用户(82%)更成功(91%)。
Go模块的采用几乎是普遍的,满意度为77%,但受访者也强调需要改进文档。
Go继续被大量用于API、CLI、Web、DevOps和数据处理。
代表性不足的群体往往感觉在社区中不太受欢迎。

亮点内容:
近一半(48%)的受访者使用 Go 的时间不到两年。到了 2020 年,那些使用 Go 不到一年时间的人的回复更少了。
多数人表示,他们在工作中(76%)和工作外(62%)使用 Go。每年使用 Go 上班的受访者比例一直在上升。
与往年一样,绝大多数被调查者表示在 Linux(63%)和 macOS(55%)系统上使用 Go。随着时间的流逝,主要在 Linux 上进行开发的受访者比例似乎略有下降。
编辑器偏好似乎稳定了:VS Code 仍然是最受欢迎的编辑器(41%),而 GoLand 仅次于它(35%)。这些编辑人员合起来占了 76% ,其他喜好并没有像往年一样继续下降。
大多数受访者(63%)花费了 10-30% 的时间进行重构,这表明这是一项常见的任务,这也解释了为什么重构支持是最受资助的编辑器改进之一。
去年几乎 90% 的受访者都在使用文本记录进行调试,而今年的调查增加了原因选项。结果表明,有 43%的人使用它,是因为它允许他们跨不同的语言使用相同的调试策略,还有 42% 的人更喜欢使用文本记录而不是其他调试技术。但是,有 27% 的人不知道如何开始使用 Go 的调试工具,还有 24% 的人从未尝试过使用 Go 的调试工具。
92% 的受访者表示,在过去一年中,他们对使用 Go 感到非常满意。
使用云服务,调试和使用模块的满意度有所增加,而大多数重要性分数却保持不变。本次调查还引入了两个新主题:API 和 Web 框架,其中 Web 框架的满意度低于其他领域(64%)。对于大多数当前用户而言,它并不是那么重要(只有 28% 的受访者表示它非常重要),但是对于潜在的 Go 开发人员来说,它可能是缺少的关键功能。
在 Go 的数据处理中,Kafka 是唯一被广泛采用的引擎,但大多数受访者表示,他们在使用 Go 的同时,也使用了定制的数据处理引擎。
到目前为止,最常见的领域是 Web 开发(68%),但其他常见的领域包括数据库(46%),DevOps(42%)网络编程(41%)和系统编程(40%)。
大多数受访者表示,他们在使用官方文件方面遇到困难。 62% 的受访者难以找到足够的信息来完全实现其应用程序的功能,而三分之一以上的受访者在努力尝试以前从未做过的事情。

详细内容可点击此处查看调查报告。

恶意软件用 Rust 进行重写后变得更难被发现

2021年5月,Proofpoint 研究人员在发现了通过伪装成发货通知的电子邮件分发的 Buer 恶意软件加载程序的一个新变种。Buer 是一个在地下市场上出售的下载程序,首次出现于 2019 年。它被用作受感染网络中的立足点,以分发包括勒索软件在内的其他恶意软件。Proofpoint 网络安全研究人员发现的 Buer 新变体,采用了一种与原始恶意软件完全不同的编码语言编写。这是一种很不寻常的变化方式,但却有助于新的活动在针对 Windows 系统的攻击中保持不被发现。起初的 Buer 是采用 C 语言编写的,而新的变种则是用 Rust 编程语言编写,因此研究人员将新的变种命名为 RustyBuer。

RustyBuer 通常通过钓鱼邮件传递。在相关的活动中,这些电子邮件被设计成来自快递公司 DHL。它们包含一个链接到恶意的 Microsoft Word 或 Excel 文档下载,使用 macros 来投放新的恶意软件变体。这些电子邮件影响了 50 多个行业的 200 多家组织。还有一些发现包括:
用 Rust 重写恶意软件可以使威胁参与者更好地逃避现有的 Buer 检测功能。
Proofpoint 观察到 RustyBuer 活动在一些活动中把 Cobalt Strike Beacon 作为第二级的有效载荷。
研究人员评估称,一些威胁行为者可能正在利用 Buer loader 建立一个立足点,然后向其他威胁行为者出售访问权,这就是所谓的"access-as-a-service"。

研究人员称,重写的恶意软件以及试图表现出更多合法性的新型诱饵的使用,表明利用 RustyBuer 的威胁者正在以多种方式发展技术,以逃避检测并试图提高成功点击率。并预计,根据观察到的 RustyBuer 活动频率,将来还会出现新的变体。

更多详情可点此查看。

上文转自: OSCHINA

僵尸网络活动 Zerobot,整合了对 21 个漏洞的利用

FortiGuard Labs 在2022年12月发布的一份研究指出,研究人员在 11 月观察到了一个用 Go 语言编写的独特僵尸网络正在通过 IoT 漏洞进行传播。这个被称为 Zerobot 的僵尸网络包含多个模块,包括自我复制、针对不同协议的攻击和自我传播;还使用 WebSocket 协议与其命令和控制服务器通信。它主要针对 Linux 操作系统,以控制易受攻击的设备。根据介绍,Zerobot 的目的是将受感染的设备添加到分布式拒绝服务 (DDoS) 僵尸网络中,以对指定目标发起强大的攻击。可以扫描网络并自我传播到邻近的设备,以及在 Windows (CMD) 或 Linux (Bash) 上运行命令。

Zerobot有两个版本,11月24日之前使用的第一个只包含基本功能,随后出现的新版本则包含额外的模块和针对新漏洞的漏洞利用。这一行为表明,该恶意软件正在积极开发中。它还整合了对 21 个漏洞的利用,并利用这些漏洞获得对设备的访问;然后下载脚本以进一步传播。它使用文件名 "zero," 进行保存,这也是其命名的由来。影响范围涵盖 F5 BIG-IP、Zyxel 防火墙、Totolink 和 D-Link 路由器以及 Hikvision cameras 等。除了一些物联网漏洞外,还包括 Spring4Shell、phpAdmin、F5 Big 等,以提高其成功率。它可以针对一系列系统架构和设备,包括 i386、AMD64、ARM、ARM64、MIPS、MIPS64、MIPS64le、MIPSle、PPC64、PPC64le、RISC64 和 S390x。

Zerobot 中的漏洞利用列表

Zerobot 攻击的易受攻击的设备

此外,僵尸网络还使用了四个未分配标识符的漏洞,其中两个针对 GPON 终端和 D-Link 路由器。关于另外两个的细节目前还不清楚。

在受感染的设备上建立存在后,Zerobot 会设置到命令和控制 (C2) 服务器的 WebSocket 连接,并发送有关受害者的一些基本信息。C2 可能会响应以下命令之一:“ping”、“attack”、“stop”、“update”、“kill”、“disable_scan”、“enable_scan'” 和 “command”。该恶意软件还使用一个 “anti-kill” 模块,旨在防止终止或杀死其进程的。目前,Zerobot 主要专注于发起 DDoS 攻击,但是它也可以用作 initial access。

Fortinet 总结称,Zerobot 是一种用 Go 编程语言编写的新型僵尸网络,通过 WebSocket 协议进行通信。自 11 月 18 日首次出现以来,Zerobot 开发人员已通过字符串混淆、复制文件模块、自我传播模块和几个新的漏洞进行了改进,使其更难检测并赋予它感染更多设备的更高能力。用户应该意识到这一新威胁,并在补丁可用时积极应用补丁。

为什么不用 Go 开发操作系统?

本节整理自 GoLand 官方博客的一篇文章:《OS in Go? Why Not?》,探讨了为什么像 C 这样的编程语言在 OS 开发中占据优势,以及是否可以使用 Go 编写 OS。此外还提到了用 Go 开发操作系统的可行性、局限性,以及目前的部分成果。

操作系统 (OS) 是计算机系统的心脏和灵魂,它管理着计算机的硬件和软件资源,并为用户提供与计算机交互的方式。传统上,C 和 Assembly 等语言因其低开销和 “接近机器码” 的特性而被用于开发操作系统。但诸如 Go 等高级语言的兴起引入了一些特性,这些特性或许可以使开发操作系统等复杂软件变得更加容易。例如,类型安全、错误处理和并发性在开发操作系统时应该是有益的。因此采用像 Go 这样的高级语言来开发操作系统理应是自然选择,但为什么并没有成功的案例?

操作系统由不同的组件构成,它们负责不同的功能,可以使用不同的编程语言编写。其核心是内核 (Kernel),它负责与硬件交互 —— 几乎都是采用 C 或汇编语言编写。至于面向用户的组件(例如 GUI 应用程序),可以采用任何语言编写。例如,Android 采用 Java 编写用户层的组件,如 GUI 框架和系统应用程序(相机、电话等)。相对应的,其内核采用 C 和汇编语言编写;底层系统组件 —— 库,则是用 C++ 编写。

C 语言 “统治” 内核的主要原因:
可直接管理内存
缺少抽象
无需依赖运行时
可移植性

Go 作为高级语言提供了许多令人满意的特性。从这方面来看,它似乎可以成为开发操作系统的绝佳选择:
某些类型的错误在高级语言中出现的可能性要小得多
并发性:在高级语言中处理并发更容易,因为几乎每种高级语言都内置处理并发所需的机制
类型安全:防止像 C 的宽松类型强制执行

不过尽管 Go 提供了令人满意的特性,可以让操作系统开发者的工作更轻松,但它也有一些局限性。作为一种具有垃圾回收功能的语言,Go 并不真正适合操作系统开发。使用 Go 编写内核意味着需要小心翼翼地绕过其垃圾收集。正如此 Reddit 中开发者提到的,鼠标滞后可能是因为中断处理程序分配了触发垃圾回收的内存。此外,Go 还需要大量的 runtime 才能执行,这意味着它不能直接在硬件上运行。尽管 TinyGo 可以将 Go 编译为在裸机上运行,​​但与 C 相比,它只支持少量的架构,而 C 几乎可以在任何架构上运行。

总的来说,使用 Go 开发一个不是 “玩具性质” 的操作系统几乎是不可能。尤其是要求支持在多种架构上运行、支持不同设备(如显卡或网卡),并符合 POSIX 标准,这更是极具挑战性。最后看一下探索用 Go 开发操作系统的案例。

Biscuit 是一个用 Go 开发的操作系统,运行在 64 位 X86 架构上。它使用经过修改的 Go 1.10 运行时实现,其中添加了更多汇编代码来处理系统调用和中断处理程序的引导和进入/退出。


Biscuit 为用户进程提供 POSIX 接口,支持 fork、exec 等。它实现了支持核心 POSIX 文件系统调用的文件系统。 Biscuit 为用 Go 编写的 Intel PCI-Express 以太网 NIC 实现了 TCP/IP 堆栈和驱动程序。使用 POSIX 接口,Biscuit 可以在不修改源代码的情况下运行许多 Linux C 程序。然而Biscuit缺少许多功能,例如调度优先级、换出页面或磁盘,以及安全功能,例如用户、访问控制列表和地址空间随机化。

TIOBE发布2024年2月编程指数排行榜,Go语言首进前10

TIOBE官网公布了2024年2月的编程语言排行榜。Python排名第一,占比15.16%,本月下跌0.32%;C排行第二,占比10.97%,本月下跌4.41%;C++排行第三,占比10.53%,本月下跌3.4%;Java排行第四,占比8.88%,本月下跌4.33%;C#排行第五,占比7.53%,本月上涨1.15%。

官方称2月编程指数亮点主要来自Go语言,该语言在推出约 15 年后成功跃入排行榜前十,来到 TIOBE编程榜第 8 名(这是 Go 有史以来的最高排名)。有趣的是,Go曾经在 2015 年的时候跌落至第 122 名,在经过开发团队的努力,才在 2024 年登上 TIOBE指数“前十俱乐部”。

谷歌在 2009 年 11 月发布 Go 后,这款编程语言便一炮走红,这是由于彼时谷歌所做的一切尚且受到人们普遍热捧,因此继 Gmail、谷歌地图、谷歌文档后,这款 Go 语言也一并受到开发者青睐,在 2010 年 1 月,Go 甚至获得了 TIOBE 编程社区“年度语言奖”。不过随后 Go 语言逐渐退烧,甚至在 2015 年一度跌落至 TIOBE排名第 122 名,但谷歌并未放弃这款语言,而 Go 语言开发团队后续也集中经历,采用“半年一更”节奏持续更新这款语言,随着 2016 年基于 Go 语言的 Docker 和 Kubernetes 两款应用逐渐变得热门,Go 语言才逐渐重新获得人气。

目前 Go 语言主要应用于程序设计、网页、API 开发等领域,由于 Go 正逐渐受到专业人士广泛采用,因此当下 Go 语言有长期维持在 TIOBE 排行榜前 10 名的实力。除了 Go 语言,本月的榜单有两门 “上古语言” 罕见地进入了前 20:
Fortran 从去年同期的第 24 位上升至第 11 位,PHP 在其前一位;
COBOL 从去年同期的第 30 位上升至第 19 位,紧随大热的 Rust 其后。

2024年 8 月,IBM 推出了一款生成式 AI 编程助手 watsonx,用于将传统的 COBOL 转换为企业级 Java 代码。据称该工具由 IBM 的 watsonx.ai 代码模型提供支持。该模型从 1.5 万亿个 tokens 中学习了 115 种编码语言的知识;拥有 200 亿个参数,从而实现 “更高效的 COBOL 到 Java 转换”。COBOL 是最古老的编程语言之一,历史可以追溯到 1959 年左右;但当下仍被大型组织广泛用于处理来自重要中央系统的数据,例如账单、帐户、工资单和客户交易等。2022 年的一项调查指出,92% 的受访者认为 COBOL 具有战略意义,日常使用的 COBOL 代码量显着增加至 775-8500 亿行;大约是先前估计的三倍。