本篇内容是根据2021年5月份#205 Hacking with Go音频录制内容的整理与翻译
Natalie 和 Mat 从 2 位安全研究人员的角度探讨了 Go 中的黑客行为。 Joakim Kennedy 和 JAGS 都使用 Go 进行黑客攻击:编写恶意软件、硬件黑客、逆向工程 Go 代码等等。
过程中为符合中文惯用表达有适当删改, 版权归原作者所有.
Natalie Pistunovich: 大家好,欢迎来到我们关于用 Go 进行黑客攻击的这一期节目。这次我们不谈 Go 和安全,或者类似的事情,而是请来了两位偶尔活跃于 Go 社区的黑客,我们将学习如何使用 Go 进行一些黑客相关的活动,无论这意味着什么。
今天与我们一起的是 Joakim,他是一位研究员。在 Intezer 担任安全研究员,并且自 2016 年成为 Gopher,从 2018 年以来一直在追踪作恶的 Gopher。 (Intezer是 以色列的一家安全公司)
Joakim Kennedy: 没错。
Natalie Pistunovich: 很高兴你能加入我们。
Joakim Kennedy: 谢谢。
Natalie Pistunovich: 我们还请来了 JAGS…
Juan Andrés Guerrero-Saade: 这名字很简单。
Natalie Pistunovich: …他是 SentinelOne 的首席研究员 (美国加州的一家安全公司),同时也是约翰霍普金斯大学 SAIS Alperovitch 研究所的教授。这个地方听起来很棒,能介绍一下吗?
Juan Andrés Guerrero-Saade: 这是约翰霍普金斯大学---
我们刚刚在 Dmitri Alperovitch 的支持下成立了一个新的研究所……主要从事网络研究和网络安全相关的工作。
Natalie Pistunovich: 太棒了。非常高兴今天能邀请到你。我还和我的联合主持人 Mat 一起主持节目。
Mat Ryer: 大家好。
Natalie Pistunovich: 你们都认识 Mat,每期节目你们都能听到他的声音,即使他不在场,因为他有一首歌叫 Unpopular Opinion(不受欢迎的观点)。
Mat Ryer: 大家好!
Natalie Pistunovich: Mat,很高兴你能在这里。你第一只宠物叫什么名字?
Mat Ryer: 我的第一只宠物?叫 LB。
Natalie Pistunovich: [笑]
Juan Andrés Guerrero-Saade: 你母亲的娘家姓是什么?
Natalie Pistunovich: 这怎么拼?
Mat Ryer: 哦,我明白你们的套路了…… [笑声] 我上当了。你最喜欢的安全问题是什么,Natalie?
Natalie Pistunovich: “其他”。
Mat Ryer: “其他”。是的,这是个好问题。 [笑声]
Juan Andrés Guerrero-Saade: 这已经变成了一个恶性循环。
Natalie Pistunovich: 先生们---
请告诉我们,你们通常使用什么编程语言进行黑客活动?
Juan Andrés Guerrero-Saade: 嗯,首先得澄清一下,把我们归为黑客其实是一种宽泛的说法。我们更多的是安全研究领域的人……虽然我们每天都在与黑客或他们的产物打交道,但更多的是处于接收端。我们通常是反向工程发现的恶意软件,弄清楚它们在做什么,进行一些威胁狩猎。就我而言,我专注于攻击目标、网络间谍活动以及国家支持的黑客行为,因此更多的是从黑客攻击和恶意软件入手,去理解背后的行动、参与者以及他们的目的。
所以就我个人而言,是的,我确实用 Go 编写一些代码,但大多数情况下,Go 对我来说是一个有趣的挑战,因为它是一门新语言,底层看起来非常不同。一旦你跨过链接器,它看起来也非常不同。那么我们看到的是什么?我们该如何反向工程这种非常奇怪的结构和汇编代码呢?
我们可以给你一些关于黑客的答案,但我觉得可能会和你期待的不太一样。
Joakim Kennedy: 是的。我也可以补充一下---
比较 Go 编译器生成的二进制文件和其他语言……Go 是一座宝库,里面有很多杂项数据,这让我们的工作有时更轻松一些……因为它有时会包含编译时主机的信息,文件路径等等……因此,你可以开始追踪一些代码上没有其他共同点的家族,但可以通过独特的文件夹名称等信息加以区分。
Juan Andrés Guerrero-Saade: 我想我们有点本末倒置了,对吧?
Joakim Kennedy: 是的。
Juan Andrés Guerrero-Saade: 好的,为了更好地回答 Natalie 的问题,并让大家跟上我们的讨论,通常来说,当你处理恶意软件和一般的黑客攻击时,C 语言是最常用的语言;如果你看到一些更专业的恶意软件,可能会使用一些 C++……但实际上你会看到各种各样的恶意软件。如果你看金融木马,它们几乎总是用 Delphi 编写的;也有人喜欢用编译后的 Python……几乎什么语言都有。
我们的工作是---
你通常得到一个被剥离了所有上下文的二进制文件,没有源代码,也没有调试符号,然后你必须反向工作。我们想把这个编译后的二进制文件反向工程,弄清楚它的功能,弄清楚程序员想要实现什么,然后再从那里继续分析。这有点像魔方,每次面对一个不同的二进制文件,你都要弄清楚“他们是怎么构建它的?使用了什么编程语言?什么链接器?什么编译器版本?” 然后逐步构建对抽象层次的理解,直到你可以说“好的,这个 2MB 的二进制文件实际上只是试图劫持你的浏览器,以便窃取你的银行账户信息,这些人试图偷你的钱。”这就是最终的理解过程。但从拿到二进制文件到得出这个结论,中间有很多层的困惑需要你逐步解开。
Joakim Kennedy: 是的。恶意软件作者还会做很多事情让我们的工作更难,比如混淆代码、加密有效负载,并在内存中解密……你最初看时看不到它的原始行为;你必须开始工作,有时就像俄罗斯套娃一样,你不断地打开,打开,直到最后找到你需要的那一部分。
Mat Ryer: 你提到 Go 二进制文件里有很多额外的数据,这让它像一座数据宝库。那么这具体是怎么使得反向工程更容易的呢?是因为你可以解开某些东西,随着深入你能学到更多吗?
Joakim Kennedy: 是的,就像 Juan 刚才说的---
大多数时候我们拿到用 C 编写并编译后的二进制文件,它们剥离了所有符号信息,所以你看不到任何函数的名字。而对于 Go 二进制文件,你也可以通过编译器标志剥离这些信息。但这些信息仍然存在。它们在其他数据结构中,而不是符号表中……所以我们使用的很多工具会提取这些信息,并重新创建符号,这样我们就能得到函数名等信息。
有些人更深入地研究了这些内容,但---
我们使用的是一些原本不打算用于这些目的的数据,因为它是可用的……比如 Go 的 panic 功能会生成非常详细的堆栈跟踪,而这些信息对我们来说非常有用……所以只要知道在哪里找,就可以反向推导,并将其对齐。
Juan Andrés Guerrero-Saade: 最近我们发布了一个小项目,叫 AlphaGolang。这是对 Alpha Go 和 DeepMind 试图掌握围棋(而不是 Go 编程语言)的致敬……编译是一个熵增的过程,对吧?所有那些让编程对人类来说易于理解的语法糖都被剥离了,无法再恢复,除非你拥有编译项目时的所有额外信息。我认为当人们最初尝试反向工程 Go 时,他们缺乏这些信息,也缺乏对 Go 编程范式的理解……比如,如何处理链接器做的所有“魔法”工作,甚至让简单的事情也能正常工作……比如,为了支持 Go 的多返回值功能(这是 Go 的一个非常棒的特性)---
链接器处理这个的方式是每次函数调用时都会添加额外的函数,创建一个运行时堆栈,以便在函数返回时有地方存放这些返回值。
但如果你不了解链接器的工作原理,不了解 Go 的工作原理,你看着这些代码时只会觉得“为什么每次调用函数时它都会调用另一个函数,返回时我找不到参数了……这些东西都去哪儿了?”你就像置身于信息的风暴中,完全不知所措。
我们想要打破的一个迷思---
这是几年后的结论---
是 Go 可能是最容易反向工程的编程语言之一。因为它的链接器设计得很特别,如果你试图删除二进制文件中的所有调试信息,它实际上会崩溃。
所以事实证明,如果我们使用智能的反向工具,你实际上可以对二进制文件的功能有一个非常全面的理解,而不需要花费大量的分析时间。
Joakim Kennedy: 是的,我同意你的看法。我已经看过很多 Go 的二进制文件了,我觉得它比其他语言更容易处理。
Mat Ryer: 你提到链接器需要这些信息来完成工作……那是否可以在拿到最终的二进制文件后再去做一些额外的混淆工作呢?
Joakim Kennedy: 比如我们使用类型信息,这些信息仍然存在,我们可以利用它来重建所有的类型定义。
Mat Ryer: 包括名称吗?
Joakim Kennedy: 是的,它们的名字都在那儿,因为运行时需要用到这些名字。反射包和运行时,以及链接器,都有一个共享的结构,这些内容实际上是通过文本复制的……所有类型信息就是这么存储的。你可以遍历这个表,重构出所有的类型。从一个结构体类型开始,到它的所有子字段,全部都能重构出来。而这一点是无法去除的……因为每次当你为它分配内存时---
当你创建一个新对象时,运行时中有一个函数本质上只是调用了malloc,分配这个结构体所需的内存大小,这个大小就存储在那个数据结构中。所以你不能删除它。
Mat Ryer: 对,它需要这些信息才能正常工作。
Joakim Kennedy: 对。
Juan Andrés Guerrero-Saade: 我觉得我们需要小心,不能激发某种挑战心理……并不是说没有人能想到非常聪明的办法……
Mat Ryer: 是的。
Juan Andrés Guerrero-Saade: 因为这种事情在Windows平台上也发生过……那些编写打包器和混淆器的人,确实开发了一些非常非常聪明的打包器。这也是多态性在杀毒软件和病毒社区中发展的方式,一些人会说:“你们觉得你们很聪明……那看看如果每次执行时这个东西都重新排列会怎样。” 然后你就会觉得:“好吧,这可不妙。” 但是,我觉得你也要权衡一下,用Golang编写恶意软件的价值。比如,“我只需要写一次这个勒索软件,然后就可以跨平台编译。它有这些不错的效率,且并发处理很简单……” [笑] 编程中我们喜欢的所有特性,突然变成了那些做不太好事情的人手中的利器。
Mat Ryer: 所以你会因此更喜欢糟糕的编程语言吗?
Juan Andrés Guerrero-Saade: 嗯,我不知道……其实,我现在开始喜欢逆向Go了,因为它要简单得多。首先,我喜欢用Go来编程,它对我来说更容易理解。我们还写了一些脚本,能够还原编译器剥离掉的调试信息,把函数名重新放回我们通过逆向工具发现的所有函数中。然后我们可以按照包对这些函数名进行排序。所以,Go……我希望Ivan在这里;我知道Ivan本来应该加入我们的。他有一个非常形象的说法,说Go是法西斯版的Python。
这种法西斯主义---
不好意思这么说---
但这种法西斯主义让我们能做很多事情。你可以说:“嘿,我们可以本质上分离出所有属于标准库的东西,属于GitHub仓库的东西……”和其他你可能想要逆向工程的编程语言不同,在Go的情况下,我们可以直接筛选出哪些是用户编写的函数。
我们看过像Sunburst这样的恶意软件,这个软件是几个月前发生的著名SolarWinds攻击的一部分……当你查看这些二进制文件时,编译后会发现大约有4万个函数。因为有很多东西是由链接器添加的,你根本没考虑到……所以如果你盲目地看它,你会觉得:“哦天哪,4万个函数,我得弄清楚这些都是什么。” 但如果你运行我们刚才谈到的那些处理脚本,你实际上可以将其缩减到大约“这里有22个函数是恶意软件开发者实际编写的”,而不是陷入到运行时中,迷失在fmt包和其他你不想浪费时间逆向的包里。
Joakim Kennedy: 也要补充一点,我上次检查时(可能是Go 1.16),一个Hello World程序大约有1700个函数,其中一个主函数只是打印一行内容。你从几乎什么都没有开始;你到达入口点,那里有一些Go标准库的小片段或用汇编写的Go代码---
这是你落脚的地方。然后是运行时的引导和调度器之类的东西,你不需要它们。在这众多函数中,你需要找到调用main.main的地方。在到达那个点之前,你的工作还没真正开始。
Mat Ryer: 这确实有道理。你难道不能拿一个简单的Go二进制文件,做个差异比较,看看有什么不同吗?你能不能编写一个简单的Hello World程序,然后和它做个diff对比---
Joakim Kennedy: 这实际上是人们开始分析Go二进制文件时使用的最初技术之一。你基本上可以利用字符串中获取的信息,来判断这是哪个版本的编译器。“哦,是这个版本,它用了这些导入包。让我构建一个导入这些包的二进制文件,然后为这些函数生成签名,再把签名覆盖到我手头的文件上。没有被检测到的部分,就是我要分析的内容。”
Mat Ryer: 这真是太聪明了。
Juan Andrés Guerrero-Saade: 这是一种解决问题的方式……坦白说,我觉得我们还处在摸索阶段,就像在一间黑暗的房间里四处碰壁,不知道墙在哪里,也不知道开关在哪里。如果你仔细想想,这听起来很简单……比如,“好吧,我们写些包含相同包的东西,编译之类的”,但接下来你会遇到各种变体……比如“他们用的是什么版本?他们用的编译器版本是什么?他们链接了什么?是为哪个目标架构编译的……”如果是在Elf、MacO还是Windows平台上,链接器的工作方式实际上会略有不同……
于是你就会进入这个无限变化的世界,这让你逐渐失去信心。通常情况下这会造成一种有点灾难性的局面。比如,当你看C++时,真的没有太多捷径可走。你可以用flirt签名和其他小工具来处理一些功能,但编译过程中引入的熵意味着,例如类定义会消失;类定义不见了,你有这些虚拟表,我们根本不知道什么引用了什么,所以你甚至没有一个完整的控制流,除非你动态执行样本。
所以有很多情况下,你并没有一条清晰的前进路径,逆向复杂的C++二进制文件需要大量的工作……刚开始接触Go时的感觉也是如此。最终我们发现,其实有一些很好的方法可以重建Go二进制文件。现在我们看到了其中不太好处理的地方。现在我们觉得Go……我不会说我们已经完全掌握了Go,逆向它变得超级简单,但它确实比以前更容易了。而现在当我们看Rust时,我们的反应是:“哦天哪,逆向Rust太糟糕了。”它更像C++,我们又不知道该怎么做了。
Mat Ryer: 这很有趣。我大概不会想到这一点。我本以为Rust从某种程度上会更加确定性……所以这很有趣。
Joakim Kennedy: 问题在于---
这些新语言,它们从动态链接库转向了静态链接库。 这是主要的障碍---
分析一个动态链接的程序相对容易,因为你知道它导入了哪些特定函数,所以你知道它会调用什么。但当你拿到一个二进制文件,发现里面有SQLite、OpenSSL和其他库,而你只看到一个函数调用时,你根本不知道你在哪里。当然,你也可能在C和C++中遇到这种情况,但在Go和Rust中这是默认的。一般来说,每个Rust二进制文件都会是这样的。
Juan Andrés Guerrero-Saade: 是的。我可能对Rust有点不公平,它其实还算可以---
Mat Ryer: 在这个播客里没关系。
Juan Andrés Guerrero-Saade: 在这个播客里完全没问题;不会有Rust爱好者来敲我的门……但我想我们可能有点不公平,如果我们四年前谈论Go,可能也会说同样的话……比如:“哦天哪,逆向它太糟糕了,我们根本不知道自己在哪里……有一堆与程序无关的静态链接代码……” 现在在Rust中也是这样的感觉。我希望随着我们对这种范式的熟悉以及工具的改进,我们也能对Rust有更好的理解……但没有任何迹象表明这一定会发生。C++已经很多年了,我大概可以数出几个人,是真正精通逆向C++的。像Rolf Rolles这样的逆向工程明星,但这绝对不是我,也不是很多和我一起逆向的人……所以没有迹象表明情况一定会好转,但我们对它抱有很高的希望。
Mat Ryer: 所以当你在逆向工程时,你提到你可以获得函数名和类型名……但是这有多大用处呢?黑客们写代码时,真的会有一个叫“偷信用卡”的函数吗?
Juan Andrés Guerrero-Saade: 是的……?! [笑]
Mat Ryer: 不可能这么简单吧。
Juan Andrés Guerrero-Saade: 有时候是的。
Mat Ryer: 哇哦。
Joakim Kennedy: 我写了一个工具……我在两年前开源了它……它的功能是,你把一个Go二进制文件扔进去,它会提取出那些信息,然后生成一个类似源代码的投影。所以你会看到文件夹、文件,以及函数,然后标出函数开始和结束的行号。你可以查看样本。很多时候,我把一堆Go二进制文件扔进去,它会处理完并输出Loader、Cracked、Ransomware。哦,这是一个新后门……因为你看到了函数名。加密、获取密钥、丢弃通知、遍历文件系统。我只看到加密函数,从没看到解密函数。光看名字就很清楚这是在做什么了。
Natalie Pistunovich: 知道黑客们也遵循好的软件开发实践,这倒挺不错的……
Mat Ryer: 是啊。 [笑]
Juan Andrés Guerrero-Saade: 嗯,大致如此……但接下来你会遇到混淆器,对吧?
Joakim Kennedy: 是的,有些混淆器,但我可以告诉你,到目前为止,我还没有看到任何合法应用或类似的东西使用混淆器。你只会看到乱七八糟的字母。而且,所有UTF-8字符都允许使用的情况下,如果你看到一个函数名是西里尔字母(译者注: 是一种是广泛通行于斯拉夫语族和前苏联疆域之内的字母,亦是除了拉丁字母和阿拉伯字母之后,世界母语人口第三多的拼音型文字) 和韩文字符集以及中文字符集的混合,你就会想:“嗯,这肯定是混淆过的。”
Mat Ryer: 或者是像Natalie这样聪明的人,能说很多很多语言。
Natalie Pistunovich: [笑]
Joakim Kennedy: 对。当你需要安装fmt包才能打印出这些字符……因为每个其他字符都缺失了。
Mat Ryer: 是的。但我觉得你会被我迷惑住。我会把函数叫做“不要偷信用卡信息”。 [笑] 哈哈!
Juan Andrés Guerrero-Saade: 这就是逆向心理战术嘛,对吧?
Mat Ryer: 没错。这实际上是在逆向逆向工程。
Joakim Kennedy: 是的。从逆向工程师的角度来说,我见过最有趣的事情之一,是一个二进制文件……所有的字符串都被隐藏了,但它们被隐藏为函数的函数名。然后,它执行这个函数,利用反射来获取它自己的函数名,然后用一个密钥进行异或操作,重新生成字符串。这是我见过的最有趣的混淆技术之一。
Juan Andrés Guerrero-Saade: 是的,你会发现越来越多的巧妙手段……有些打包器会在你打开一个二进制文件时,里面充满了莎士比亚的段落,而打包器的工作就是从这些段落中挑选出东西,动态重组。特别是在Windows世界,恶意软件开发者和安全研究人员之间有一场猫鼠游戏……
你会有一些奇怪的指标。我们一直在谈论逆向工程是为了理解;我们想知道样本做了什么。但从恶意软件开发者的角度来看,他们最大的初步关注点只是不要被检测到。所以作为一名恶意软件开发者,你得在“我想让Joakim或我自己更难理解这个二进制文件在做什么”和“如何在雷达下飞行,让杀毒软件不认为‘嘿,这看起来很奇怪,检测出来’”之间做出平衡。这是一个微妙的平衡。
Natalie Pistunovich: Mat,看来你在想一些更聪明的函数命名方式,并且还在考虑什么可以做得更好……
Juan Andrés Guerrero-Saade: [笑]
Mat Ryer: 是的,我意识到,我正在掉入那个陷阱,开始把它变成一个游戏……
Natalie Pistunovich: 是的,是的……
Mat Ryer: 它确实有趣,不是吗?在某些情况下,这些事情会产生非常严重的影响……但你无法否认,它确实是编程中很酷的领域,黑客技术。很多人是通过流行文化接触到黑客的,我想有些人可能就是因为这个原因进入编程的。对我来说,编写脚本时,恶作剧无疑是一个动机。我做的事情总是恶作剧。我会在Floppy磁盘上的autoexec.bat文件中覆盖学校电脑的壁纸,或者类似的东西……只要把磁盘插进去,下一次机器启动时,壁纸就会改变。而且总是一些恶作剧之类的东西。但这种东西确实很有吸引力。
Juan Andrés Guerrero-Saade: 但现在形势越来越紧张了。很容易从这种角度来看待它,我们也不想让它变得太沉重或太黑暗,但现在这也是很多国家和犯罪分子的游戏场。如果你在美国,勒索软件的流行基本上是不可避免的。你每天都要谈论它。这时候事情就不那么美好了。如果你在一个医院里,由于他们那些已经过时的Windows XP系统在一个扁平网络中,所有系统同时被攻击,导致医院无法帮助病人……这时候你会想:“嗯,这段代码很有趣……我喜欢拥有这些黑客超能力的想法,但其中有一面并不那么可爱。” 我觉得我们一直在走钢丝,一方面觉得“哦,这太有趣了”,同时又被某些功能吸引,被某人能够完成的事情吸引,往往容易忘记,“哇,这其实是一个更严肃的游戏的一部分。”
Mat Ryer: 是的,完全同意。顺便说一句,如果我闯入医院,唯一的事情就是改变所有的壁纸……[笑] 如果发生了这种事,那就是我的杰作。壁纸上会是我的笑脸。真是个傻瓜。
Juan Andrés Guerrero-Saade: “希望你早日康复”,对吧。
Mat Ryer: 哦,没错。是的。
Natalie Pistunovich: 但你有多常能看到桌面呢?我无法想象,假如你在医院接待处的电脑上工作……你真的会关闭所有东西,看到桌面吗?你永远不会看到那个,Mat。你得想出点更好的主意。
Mat Ryer: 忙不过来,是的。你说得对。
Juan Andrés Guerrero-Saade: 他们可能根本不会注意到……
Natalie Pistunovich: 也许Mat已经做过了,只是没人注意到。
Juan Andrés Guerrero-Saade: 没人注意到,是的。
Mat Ryer: [笑] 那会让人很失望。
Natalie Pistunovich: 如果你想更多地玩黑客游戏,一个有趣的事情是去做CTF,对吧?
译者注: (Capture The Flag,夺旗赛)起源于1996 年DEFCON 全球黑客大会,是网络安全爱好者之间的竞技游戏
Juan Andrés Guerrero-Saade: 没错。好吧,撇开黑暗的一面不谈,红队和渗透测试人员中有一群人很喜欢Go……
Natalie Pistunovich: 对于那些完全不熟悉这些术语的人来说,这些专业术语都是什么意思?
Juan Andrés Guerrero-Saade: 我们属于蓝队,对吧?我们是防御者,只是想确保坏事不会发生。红队则是模拟攻击者的一群人,比如“我们会被雇来故意攻击其中一家医院,当然是在一定约束范围内,告诉他们‘看,你们的网络弱点在这里。这些是你们现在应该修复的地方’。” 所以通常来说,双方是对立的,但我们其实是朋友。实际上有一个很强的社区,他们喜欢做这类开发和用Go编写红队工具。
Natalie Pistunovich: 等一下……所以红队是做渗透测试的人。
Juan Andrés Guerrero-Saade: 对。
Natalie Pistunovich: 蓝队是被雇来修复红队指出的问题的人。
Juan Andrés Guerrero-Saade: 差不多吧。
Joakim Kennedy: 可以叫他们防御者。
Juan Andrés Guerrero-Saade: 对。广义上讲,就是防御者。
Natalie Pistunovich: 那白帽/黑帽又是什么?
Juan Andrés Guerrero-Saade: 所有这些理论上都是白帽子。你会看到一些交集,但如果你是为了改善公司、组织或政府的整体防御姿态而工作,理论上这都属于白帽,对吧?
Mat Ryer: 嗯,那就是我。我会是那种人,温和地说:“我已经证明了,你的壁纸可以被任何人随意更换。广告商也可以这么做,如果你想推广什么东西,可以把它放到所有医院的屏幕上……你懂我的意思吧?” 所以,这肯定是我站的立场。我只是想把这点说清楚,记录在案。
Natalie Pistunovich: 这也可以成为一个很好的安全问题---
你的壁纸是什么?
Mat Ryer: 是的。或者你戴的帽子是什么颜色?这也是个好问题。那CTF是什么?CTF代表什么?
Natalie Pistunovich: 等一下,我们还在谈论红帽子和白帽子,还有蓝帽子。
Juan Andrés Guerrero-Saade: 各种颜色的帽子。
Natalie Pistunovich: 各种主题。
Juan Andrés Guerrero-Saade: 是的。我想我们大多数时候的工作都是追踪和防御黑帽子……黑帽子的标准定义是那些未经允许就进入网络的人……如今,他们的行为通常是为了那些显而易见的不良目的,甚至是非法的。所以有间谍活动的一面,也有破坏活动的一面……毫无疑问,勒索软件属于长期存在的网络犯罪传统的一部分。以前,他们只是想进入银行账户,或者窃取信用卡号码。如今,他们感染整个企业网络,然后要求支付3000万美元的赎金才能解锁。这些人都属于黑帽子的范畴……而理想情况下,所有的蓝队、红队、渗透测试员等都应该是白帽子,尽管有些人可能会涉足……不过不是我;我没有这些技能,遗憾的是……但这是个非常有趣的领域。
Mat Ryer: 但即便你有这个技能,你可能也不会这么说,对吧?
Juan Andrés Guerrero-Saade: 我正在学习你们的逆向心理学,尤其是关于黑客的……“绝对不是恶意软件”是我包裹文件的名字。
Mat Ryer: 完全正确。那对我来说确实有用。
Natalie Pistunovich: 是的,完全正确。对于那些想玩一玩黑客技术的人,也有一些CTF(Capture the Flag)的比赛。那么,值得捕获的旗帜是什么呢?
Joakim Kennedy: 有不同的种类。所以你有一些Capture the Flag比赛更偏向红队,这通常涉及到可能攻破一台存在漏洞的机器,或者是一个二进制文件有漏洞,你的目标是编写一个利用该漏洞的代码,获取旗帜,证明你成功破解了系统。
还有一种CTF类型是“破解我”,基本上就是一个二进制文件,你需要对其进行逆向工程,也许让它能够正确运行。
Natalie Pistunovich: 可能不是用Go写的吧……
Joakim Kennedy: 通常在CTF比赛中,他们会用一些非常晦涩的语言,因为没人知道这些语言,从而增加挑战的难度。
Juan Andrés Guerrero-Saade: 像Nim?
Joakim Kennedy: 像Nim,对。
Juan Andrés Guerrero-Saade: 今年有一个非常著名的逆向工程Capture the Flag比赛,叫做Flareon挑战赛。Mandiant公司(美国麦迪安网络安全公司)每年都会举办……今年,最后一关---
如果你一路通过了比赛,那最后的关卡实际上是一个Go的二进制文件。我没能走到最后;有人找我说:“嘿,看看这个东西。我正试图重建这个二进制文件,好让更聪明的人完成比赛……” 但是,是的,Go确实在逆向工程领域变得越来越重要了。
Mat Ryer: 这对我们来说是好事吗?
Juan Andrés Guerrero-Saade: 我也不太确定……
Joakim Kennedy: 我记得去年DevCon的资格赛中,有一个Rust的二进制文件也是其中的一部分。你会看到各种混合体,谁知道什么时候我们会遇到一个用Nim写的呢。
Juan Andrés Guerrero-Saade: 是的,我认为这更多的是反映了一种新的编程语言范式。这是两个现象的交汇点。首先,病毒编写者们正在老去。有一代新人正在崛起……所以,现在没有那么多人在学校学汇编,也没有像以前那样在东欧破解软件,那时候他们无法获得正版软件。这是老一派的病毒编写者和黑客。
现在,我认为这一代新人开始更多地参与进来,他们更多地使用Go和Rust,尝试学习这些新的编程范式……而且似乎他们中的很多人并没有回过头去学习硬核的汇编或C语言。所以,我们将越来越多地看到这些流行且易于使用的语言在恶意软件中变得更加普遍,这是不可避免的。
Mat Ryer: 是的,考虑到不同编程语言和它们的不同能力,再想想当你需要对它进行逆向工程时,这真的很有趣……我在想,比如Go中的defer语句,它是在一个函数退出后才执行的函数。显然,在二进制文件中,它会以某种方式表示出来,可能是看起来很普通的代码,或者是汇编语言。你能看一个二进制文件,判断出它在哪里使用了defer,或者有并发、协程的地方吗?
Joakim Kennedy: 它是一个不同的返回调用。我记得它叫“deferred return”?它是运行时内的一个函数,只是包含了一个将要调用的函数的指针。
Juan Andrés Guerrero-Saade: 我觉得更容易的地方在于……如果你熟悉这种编程范式,会更容易理解。如果Go对你来说像对我一样容易接近---
你知道,我在Google工作了一段时间,我在那里的一位好朋友兼导师,Mike Weisbach,非常喜欢Go……我刚到Google的头两周,他就递给我一本《Go语言编程》书,说:“搞清楚这个。”
我学着去喜欢它,然后当需要逆向它时,很多概念对我来说就容易理解了,比如通道(channels)和defer语句之类的东西。当你已经熟悉这些概念时,它们很容易在逆向工程时映射出来。进入逆向工程的最大、最陡峭的挑战通常是训练自己去识别C级别的结构,盯着汇编代码。基本上,你只是试图熟悉不同的编译器会如何表示某个C概念,也许那个概念并不复杂。“哦,这是一个switch语句。” 但在汇编中它是怎样的呢?学习如何来回切换。而有那些概念的帮助是很有用的,所以我说,也许Rust会对那些理解Rust的人来说变得更容易,他们可以进来写一些脚本,写一些工具。目前我对Rust还不太熟悉,所以当我试图逆向Rust中的某个东西时,就像迷路了一样。你没有任何坐标。你面对成千上万个没有名字的函数,没有类型,有时字符串还被混淆了……你被扔到一个巨大的二进制文件中,没有地图。
Mat Ryer: 所以当你想到这些特性时---
顺便说一句,这很有趣,因为我基本上从不看生成的汇编代码……所以我只在语言层面上思考这些特性。这让我意识到,这些特性在某种程度上确实感觉很神奇。通道(channel),当它们工作得很好时,它们非常出色,你有时会忘记它们其实是在底层做着一些无趣的事情……但当Go推出新语言特性时,比如Go 1.18---
即将迎来泛型。那会给你带来一些麻烦吗,当它发布时?
Juan Andrés Guerrero-Saade: 可能会……[笑]
Joakim Kennedy: 最大的问题是有多少工具会因此而崩溃……我们面临的一个问题是,我们解析的是没有导出的内部数据结构,而这些结构经常会更改。我记不清有多少次内部map结构发生了变化……而当你解析它时,你需要有一个与二进制文件完全匹配的正确结构,否则你之后读取的所有偏移量都会出错。你会偏离,读取到别的地方,然后就迷路了。而且这些变化不会被宣布。
Mat Ryer: 对。这就像这些接口保持不变;语言也保持不变。
Joakim Kennedy: 是的。
Mat Ryer: 但是当然,编译器可以自由地做任何它需要做的事情。这实际上是使用Go语言的一个优势,人们在幕后做了很多工作,进行了很多更改,而我们根本不需要去考虑这些事情。但显然,你必须考虑这些事情。
Joakim Kennedy: 是的。
Mat Ryer: 那你们的工具是否与每个Go版本相匹配?这就是你们最终的做法吗?
Juan Andrés Guerrero-Saade: 在某种程度上可以这么做,出于必要,我们确实这么做了,因为工具的构建方式就是如此。只是没有人会打电话给我们说:“嘿,你还记得那个你依赖的魔法头文件,用来定位pcln符号表的吗?”
Joakim Kennedy: “我们改了。”
Juan Andrés Guerrero-Saade: 对,“我们在1.16版本中改了。” 他们确实改了,对吧?“我们在1.16版本中改了。祝你好运。” 你知道,这就是逆向工程的本质,你本质上是从空中窃取信息,没有任何东西能保证下次不会发生变化……而通常这些改变是有充分理由的。如果你找到了一个更高效的算法实现方式,当然你会想要实现它。没有人会坐在那里想:“我们该怎么帮助逆向工程师重新找回他们的方向呢?” 我们基本上是依赖一系列的启发式方法,而这些方法会随着时间的推移发生变化,并且很难维持工具的正常运作,同时还能识别新的事物、新的惯例,以及它们在不同编译器设置和目标平台上的不同变体。
Joakim Kennedy: 我遇到过最让我困扰的bug之一,是Go 1.7 beta 1的数据结构---
我知道这个bug,因为只有这个版本发布时,数据结构是这种格式。这个结构体是用来存储方法(methods)的……存储类型的方法。有几个字段告诉你如何定位方法的偏移量……而在这个版本中,那个整型的大小是32位。我记得它是int 32。而在beta 2版本中,它被改成了16位。从那以后,它基本上就没有再改过了。所以只有一个beta版本的大小与其他所有版本完全不同……是的,我在一个用这个beta版本编译的恶意软件中遇到了这个问题,它完全搞乱了整个解析流程……你知道,它就这么通过了。
Mat Ryer: 哇哦,这真是太有趣了。Go是开源的,这一点难道没有帮助吗?我的意思是,你不能写一个工具来查看代码,并在某些内容提交和发生更改时提醒你吗?你能做些什么吗?
Joakim Kennedy: 理论上可以……理论上。但这就是你开始过度优化的地方了。现在我们确实看到很多Go恶意软件,但它仍然不是我们主要处理的东西。所以你会陷入一种境地,如果Go真的是编写恶意软件的终极语言,我们知道未来大部分恶意软件都会是Go写的,那当然值得可能去启动一个公司,专门致力于Go的逆向工程。但目前来说,有些俄罗斯威胁行为者每隔一周就会用另一种语言重写他们的代码,希望逃避检测。
有一个叫Zebrocy的组织,他们最初用Delphi编写恶意软件,然后移植到Python,再移植到Go,Rust,Nim……他们几乎尝试了所有语言。对他们来说,这有点像开玩笑。他们只是想让他们的第一阶段加载器不被检测到。而对于我们来说,如果你坐下来试图为每种可能的变体构建工具,你永远也赶不上变化的步伐。
Mat Ryer: 顺便说一句,有些公司也会这么做。他们会不断用不同的语言重写代码,之类的。他们不是在逃避检测……他们只是在逃避自己……[笑]
Joakim Kennedy: 你提到现在有越来越多的恶意软件是用 Go 语言编写的……有没有哪种恶意软件让你觉得特别有趣?因为它们利用了 Go 的某些特性,做了一些有趣的事情?
Joakim Kennedy: 我见过很多……大多数我见过的东西,都是为了加载 shell 代码,或者加载其他恶意软件,或者加密数据。很多是针对 Linux 和服务器的恶意软件,常用于植入加密货币挖矿程序等。
其中一个比较有趣的例子是,如果你熟悉 IPFS 项目,星际文件系统……它是一个尝试做分布式互联网的初创公司。IPFS.io 是他们的网站,他们发布了一个基于 Go 的点对点库,后来我们发现有一个僵尸网络使用了这个库。所以这个僵尸网络是建立在 IPFS 的点对点网络之上的。主要是用来销售代理服务的,但我觉得有趣的部分是,他们将僵尸网络叠加在了一个合法的点对点网络之上。
Mat Ryer: 嗯,我还以为 IPFS 是“互联网协议文件系统”(Internet Protocol File System)。你说得对,它是“星际文件系统”(Interplanetary File System)……他们现在已经到哪个星球了呢? [笑声]
Juan Andrés Guerrero-Saade: 我觉得有趣的是,听这个播客的 Go 开发者的平均水平,可能比我们通常见到编写 Go 恶意软件的开发者要高得多。就像我说的,这还是一个新的编程范式。有时你会觉得那些恶意软件的作者对 Go 还不太熟悉,他们在尝试……尤其是那些像 Zebrocy 这样的组织,他们总是在尝试掌握各种不同的语言,但显然他们从来没有完全掌握过。不过你也会见到一些有趣的情况,比如很多勒索软件开始使用 Go,因为并发功能对加速加密大量文件非常有用。
Joakim Kennedy: 还有加密库在 Git 上,而且很容易使用。
Juan Andrés Guerrero-Saade: 没错。你有好用且强大的加密库,这样你就不会犯下自己实现加密算法的错误,导致密钥被恢复……并发也相对容易使用。所以你会看到他们开始尝试使用通道(channels),他们试图在运行时动态构建列表,快速地进行加密操作……但他们也会做一些愚蠢的事情,比如他们通过 GitHub 使用特定于操作系统的库来与 Windows 交互……所以你会想,“你花了很多功夫,选择了一个易于跨平台编译的语言,但现在你却让它无法跨平台编译。” 你会觉得庆幸,“还好你们不太擅长”,但也有点遗憾,感觉“如果你们稍微更擅长一点,收入来源会更广。” [笑声]
Mat Ryer: 这真的很难……我们这样谈论这些话题,或者有这样的对话,怎么能不惹怒别人呢?
Juan Andrés Guerrero-Saade: 哦,我们确实惹怒了别人。 [笑声] 信息安全在 Twitter 就是充满了热议和相互攻击的污水池……在某些方面这是一个很棒的社区,但在其他方面它可以非常充满敌意。
Mat Ryer: 这听起来不像 Twitter……
Juan Andrés Guerrero-Saade: 对吧?这是现代社区的写照。
Mat Ryer: 是的,现代社区,还有匿名账户。就是这样。
Juan Andrés Guerrero-Saade: 对,文明。
Mat Ryer: 在这里你叫做 JagAss……
Juan Andrés Guerrero-Saade: 对。
Mat Ryer: [笑] 但你一直很有礼貌。
Juan Andrés Guerrero-Saade: 我甚至在这个名字上也帮助了大家,是吧?我不想让你们费力去读我的两个双重姓氏……
Mat Ryer: 哦,我明白了。非常感谢。我真希望Joakim Kennedy也能这么做……
Joakim Kennedy: 也许我们一开始没你在的时候已经谈过这个了,马特。
Mat Ryer: 哦,那是在节目开始之前,对吧?
Joakim Kennedy: 是的。
Mat Ryer: 好吧,那你再说一遍吧。不说了?
Juan Andrés Guerrero-Saade: 抱歉,你在说我的名字吗?
Mat Ryer: 哦,现在你提到了你的名字,我确实很好奇……但如果你不想说,那完全没问题。
Juan Andrés Guerrero-Saade: 没事,我的名字是Juan Andrés Guerrero-Saade。我只是觉得对大家来说,叫 JAGS 或者胡安会更简单一些。
Mat Ryer: 这名字太棒了!你能再说一遍吗?
Juan Andrés Guerrero-Saade: 胡安·安德烈斯……格雷罗……萨德。再来一次。
Mat Ryer: 真棒。
Juan Andrés Guerrero-Saade: 再次强调,叫 JAGS 就行。叫我胡安也行。没人有时间去念全名。
Mat Ryer: 是的,我已经有了我的新密码。无论如何……
Juan Andrés Guerrero-Saade: 就是这样。 [笑声]
Mat Ryer: 没人能猜到。
Joakim Kennedy: 我甚至不会尝试。我觉得我肯定会发错音。这真是个有趣的对话……你提到的这些东西,比如跨平台编译……“哦,太棒了”,然后你突然说这对黑客非常有用,这完全让我大开眼界。
Joakim Kennedy: 是的,你会看到很多这样的情况。特别是当你针对 Unix 系统时……如果你发现了一个 x86 的版本,你几乎可以肯定会找到 ARM 和 MIPS 等其他架构的版本。
Juan Andrés Guerrero-Saade: 是的,我觉得大考验是你会不会看到很多 cgo。如果没有,那么你很可能会轻松地在不同平台间移植。
Joakim Kennedy: 是的。
Juan Andrés Guerrero-Saade: 我想说的是,我尽量不公开谈论这个,但 Go 恶意软件开发社区并不太优秀,而红队社区却很优秀。所以让人惊讶的是,真正的坏人没有直接使用那些模拟坏人的人开发的工具。这些人实际上对 Go 很了解,他们做了很多巧妙的事情……我不想给任何人提供点子,但他们确实开发了不少好东西。不过,真正的黑帽子还没有花时间去研究这个生态系统,看看里面有什么……这对我们来说是好事。我们并不希望他们变得太厉害。
Mat Ryer: 是的。我不知道我们的听众中有多少人符合这种描述。我无法想象一个酷酷的黑客会打开播客听……你能想象吗? [笑] 也许他们会。好吧,欢迎来到 Go Time……
Juan Andrés Guerrero-Saade: 你永远不知道。这也是另一个问题---
这些黑客是全职的吗,还是兼职的?有时你会听到一些有趣的消息,比如“这是一个 Kubernetes 开发者,有一份真正的开发工作,但他们恰好决定尝试点别的……” 我认为这就是白领犯罪的心理。你觉得自己很聪明,能够逃脱惩罚,并且这不像是“真正的犯罪”……有时人们觉得他们可以试试水,结果不会有任何后果……有时确实没事,但有时也会出问题。
Joakim Kennedy: 有时你会找到一些线索,然后找到他们的 LinkedIn 个人资料,你会想,“太好了。”
Juan Andrés Guerrero-Saade: “你好,朋友。” [笑声]
Joakim Kennedy: 真有趣。
Juan Andrés Guerrero-Saade: 这是会发生的……
Mat Ryer: 是的。我们会在节目笔记中发布这些链接。 [笑声]
Juan Andrés Guerrero-Saade: 给那些想要用 Go 编写恶意软件的人一个建议---
如果你有良好的编码习惯,并且使用 Git 进行增量编写和版本控制,也许不要把你的名字留在里面……不要在你自己的 GitHub 仓库下构建所有东西。令人惊讶的是,很多人没有意识到,标准的、良好的编码习惯在很多方面违反了匿名化的原则。所以你会遇到一些非常聪明的恶意软件,但你会发现,“天哪,这个 GitHub 仓库的用户名和你过去十年使用的账号是一样的……” 我在读你的博客,试图了解你的心情,因为我在一个样本中发现了你的代码。
Mat Ryer: 哇哦……
Joakim Kennedy: 我最喜欢的发现之一是项目所在的路径是 /users/某人的名字/go-project/source/keybase/keybase-team。所有信息都一目了然。
Mat Ryer: 哇哦……
Juan Andrés Guerrero-Saade: 是的……当他们井井有条时,真不错。
Joakim Kennedy: 是的。 [笑声] 良好的源代码结构和其他东西,但……你可能不想把这些信息保留在二进制文件中。
Mat Ryer: 我们在帮他们吗?你觉得我们这样公开讨论这些话题是在帮他们吗?
Joakim Kennedy: 这种事情是显而易见的……这些信息会被发布出来……
Joakim Kennedy: 或者基本上 Reddit 上已经有人提到过了。
Juan Andrés Guerrero-Saade: 这些信息已经存在,并且将继续存在,人们会自己弄明白……老实说,我并不太担心二流罪犯会学会如何更好地使用 Go……我更好奇的是,什么时候我们会看到国家级的攻击者开始真正有效地使用 Go 和 Rust 编写恶意软件。因为目前我们看到的最好的恶意软件通常是用 C++ 写的,特别是美国或者“五眼联盟”国家的恶意软件,往往是高质量的 C++ 代码。你可以看出,他们在开发这些东西时,建立了一整套基础设施和工具……
你面对的是层层叠叠的优秀工程,旨在制作难以追踪的植入程序,这些程序可能会进行大量重定位,使用自定义打包程序,包含加密的有效载荷……所有这些都是经过精心设计的,并且可以重复生产,避免了我们刚才讨论的那些错误。但到目前为止,这还不是我们看到的大规模恶意软件。现在还处于人们在尝试“我们该怎么做?”的早期阶段。也许它已经存在了,也许我们还没有发现。但我在密切关注,想知道什么时候我们会看到那种“由雷神公司编写的政府级恶意软件”,而不是某个兼职开发者编写的。
Joakim Kennedy: 这引发了许多问题……你们期待下一集会讨论 AI 生成的恶意软件吗?
Juan Andrés Guerrero-Saade: 对……
Joakim Kennedy: 最近一年半,国家级攻击者使用 Go 的情况有所增加。之前这种情况非常罕见。
Juan Andrés Guerrero-Saade: 是的。
Mat Ryer: 你知道是哪些国家吗?
Juan Andrés Guerrero-Saade: …… 过去几年,特别是在xxx方面,这些国家受到了很多关注,尤其是在 2016 年的选举黑客事件之后,这些组织受到了太多的关注,以至于他们被迫进行了很多重组。他们丢弃了我们熟悉的大多数工具包,这些工具包大多是用 C 和 C++ 编写的。
有趣的是,现在我们看到xxx的国家级组织喜欢 Go,甚至依赖 Kubernetes。你会看到恶意软件中包含 gRPC,你会想,“天哪,你们的技术越来越专业了。” 这确实很有趣,同时也让人感到有点压力……投入到这些攻击中的资源开始变得相当惊人。
Mat Ryer: 有用 JavaScript 编写的吗?
Juan Andrés Guerrero-Saade: 是的,当然。很多网络上的恶意软件,像加密货币挖矿程序,甚至是登陆页面---
JavaScript 非常有用。当你考虑攻击链时,如果有人要使用漏洞利用,或者他们使用一些非常专业的东西,他们实际上需要对你有很多了解,才能使用这些工具。比如,我需要知道马特的电脑运行什么操作系统,使用什么浏览器,或者是什么样的软件栈,然后我才能进行有针对性的复杂攻击。而 JavaScript 通常是第一阶段的工具,比如“我们先让这个页面着陆,也许我们甚至不提供任何恶意内容,但我们可以先分析你的系统”,然后下一步才会向你提供更具针对性的攻击工具。所以 JavaScript 在很多恶意软件操作的早期阶段起到了重要作用。
Mat Ryer: 是的。我还记得 Love Bug,这是我最喜欢的恶意软件之一……它是用 VBScript 写的。
Joakim Kennedy: 是的。微软有一个 JScript,它算是 JavaScript 的一个变种。所以你也会看到用 JScript 编写的恶意软件。
Mat Ryer: 是的,但那个可以在系统上运行,对吧?不仅仅是在浏览器里。
Joakim Kennedy: 是的。
Mat Ryer: 我记得 Love Bug 是用 VBScript 写的。这个病毒利用 Outlook 的自动化 API,把自己发送给你的所有联系人……我想它就是这么做的。它会发一封邮件说“我爱你,看看这个文件吧”,然后附件是 iloveyou.vb 或类似的文件。人们会毫不犹豫地双击打开,然后病毒就会发送出去……这真的是一个病毒。
Joakim Kennedy: 其实,如果你真的想用 JavaScript 写恶意软件,你可以用 Node.js 打包。它有很多包可以生成一个单一的二进制文件,然后你可以发送给别人……虽然这需要用户下载一个 20 到 40 MB 的文件并运行它,但这确实可行。你获得了 V8 引擎和其他一切。
Natalie Pistunovich: 令人震惊。这真是一个引人入胜的节目。感谢你们为社区分享这些见解,希望它只会激励到那些合适的人。
Juan Andrés Guerrero-Saade: 另一方面,Go 开发者总体来说都是很棒的开发者,而我们这个行业---
更广泛的信息安全社区---
真的非常需要更优秀的工程师参与进来。逆向工程师和威胁猎人---
我们有一套特定的技能,但我们通常不是来自强大的工程背景。有些人是,但有些人不是,我自己就是。我们来自国际关系、哲学、物理学等领域;如果你有解决难题的头脑,你就会进入这个领域,学会逆向工程……这往往意味着我们大部分的工具都是拼凑起来的 Python 脚本。
所以如果这期节目有什么作用的话,希望不是激励更多的恶意软件作者,而是说“如果有更多的 Go 开发者,真正优秀的 Go 开发者想进入安全领域,这里有很多机会。”有很多创业机会,有很多机会去革命性地重建一个已经严重老化、失修的软件堆栈,而这个堆栈实际上关系到互联网和整个生态系统的健康。所以如果有更多的 Go 开发者加入我们,而不是去做广告,或者去做 Google 现在在忙的事情,那将会很棒。
Mat Ryer: 如果他们感兴趣,应该去哪里?
Juan Andrés Guerrero-Saade: 有几个地方……如果你特别想进入威胁情报领域,我知道 Ninja Jobs 是一个很好的平台,专门帮助寻找安全领域的工作。老实说,如果你有合适的头脑,你可能真的想自己创业……虽然说起来很简单,但我们依赖的很多工具都太老旧了。
我认为安全领域充满了机会。有大量的投资和需求,而我们中没有人真正知道解决方案是什么……所以即使你只是对人们真正需要的东西做出渐进式的改进,比如理解 DNS,甚至……没人愿意触碰操作变换(Operational Transforms)这种东西。像 Google Drive、Google Docs 可能是唯一一个大家愿意参与的操作变换项目,而且再也不想做了……但这意味着我们没有任何协作平台可以使用,类似这样的问题。
Mat Ryer: 开源工具适合这种需求吗?这样做会让黑客占据上风吗?
Juan Andrés Guerrero-Saade: 我觉得没问题。很多安全检测依赖于 Osquery,它就是开源的……我们有很多开源的东西融入到我们的技术栈中。如果有的话,你会看到围绕这些工具的服务行业非常健康。Osquery 是免费的,但很多人会付费给其他公司,让他们帮助设置和维护这些工具栈。我是在谈论商业方面的事情,但这只是为了说---
你知道的,这里有激励机制,“加入我们吧。和我们一起工作。”
Mat Ryer: 是的,绝对是。
Natalie Pistunovich: 听起来这是个很受欢迎的观点呢……
Juan Andrés Guerrero-Saade: [笑]
Joakim Kennedy: 有时候这些东西看起来像魔法,但归根结底,很多都是计算机科学的基本原理。回想一下,如果你在学校学过计算机科学,JAGS 刚才谈到 DNS 之类的东西……我这些年看过很多 RFC 文件。我不是开发者,但这都和理解协议的工作原理有关。开发者和我们之间有很多共享的知识。
Natalie Pistunovich: 很棒的建议。感谢你提供了这个新视角,并且为那些想要跳入这个行业的人提供了建议。我想最后一个问题是:“你们准备好聊聊不受欢迎的观点了吗?”
Juan Andrés Guerrero-Saade: [笑] 当然。
Natalie Pistunovich: 我听说你有两个观点。
Juan Andrés Guerrero-Saade: 是的,我在想哪个更糟糕……哪个会更挑衅一些。 [笑声]
Mat Ryer: 我们可以测试一下两个观点……所以请随意。
Juan Andrés Guerrero-Saade: 针对这个群体,我其实认为软件开发者可能是所有互联网用户中安全性最差的群体之一。
Mat Ryer: 真的吗……?!
Juan Andrés Guerrero-Saade: 没人喜欢这个观点,尤其是那些非常挑剔的 Linux 开发者,他们觉得自己的安全已经很到位了……但是他们中的大多数人都没有运行任何终端安全工具,也没有人相信任何安全解决方案有效……我们用的很多包管理工具都是随意地把代码塞进我们的环境里,没人审计,也没人知道里面到底是什么。很多包名其实是恶意的拼写错误……所以,像 brew、npm 和 pip 这些工具其实是非常可怕的机制,但我们每天都依赖它们,它们已经成为攻击目标,而我们并没有意识到,软件开发者依赖的基础设施实际上是非常脆弱的。
Mat Ryer: 这真有意思,因为你真的不会这么想。你会以为大多数软件开发者至少对安全有一些了解,他们会用 1Password 之类的工具……但嗯,这确实很有趣。
Juan Andrés Guerrero-Saade: 抱歉…… [笑声] 抱歉,伙计们。
Joakim Kennedy: 这戳得很深啊。 [笑声]
Mat Ryer: 是的……它烧得很痛!如果你必须选择,谁的安全性更好呢,软件开发者还是祖母?你会选哪个?
Juan Andrés Guerrero-Saade: 这取决于影响吧?你知道的,很容易看不起祖母们,但---
Mat Ryer: 因为她们个子小?
Juan Andrés Guerrero-Saade: 不,因为你知道---
你在谈论一个不同的世代,她们不一定是最精通技术的人,可能更容易被欺骗,确实,有很多这样的情况。但我认为区别在于,她们通常是非常随意的互联网用户。所以你要保护的最多也就是几个密码,可能还有一些家人的照片,这些东西在情感上很重要,但在更大的格局中并不那么重要。而软件开发者---
当然,可能更容易欺骗或者对他们进行社会工程攻击,但如果你真的黑进了他们的机器,他们可能有许多不同服务的 SSH 密钥,他们可能对整个公司的源代码库有完全的权限……所以影响通常会大得多。
Mat Ryer: 嗯……我现在很高兴我说了那个蠢问题。这真的很有趣。
Juan Andrés Guerrero-Saade: [笑] 必须为祖母们辩护啊,伙计。
Mat Ryer: 是的。备注:多说些蠢话。Joakim,你有不受欢迎的观点吗?
Joakim Kennedy: 嗯……这可能有点针对使用 Slack 的社区……
Mat Ryer: 来吧,放马过来!
Joakim Kennedy: 是的……我不认为开源社区应该依赖商业产品。相反,他们应该使用相似的开源项目。
Mat Ryer: 这是个非常好的观点。你想多解释一下吗?
Joakim Kennedy: 我需要吗?
Mat Ryer: 因为 Slack 是免费使用的,对吧?
Joakim Kennedy: 是的,它是免费使用的,但你最终会陷入那种依赖商业实体的锁定状态。
Mat Ryer: 打断一下……我们稍后回来。对不起,刚才需要插播广告。你刚才说到哪里了? [笑声]
Joakim Kennedy: 尤其是现在,有一些非常优秀的开源项目正试图打破这种局面……Matrix 就是一项很棒的技术,它是去中心化的,即使他们消失了,社区也不会跟着消失。
Mat Ryer: 是的,但 Matrix 的问题是你必须在头上安装一个东西来插入……很多人反对这种做法。 [笑声] 我很早就做了这件事,当时还是用软盘……我是个非常早的采用者,现在有点后悔,但……那时候---
Joakim Kennedy: 但它确实很快就教会你功夫了……
Mat Ryer: 是的,不过那需要八张软盘,所以确实需要一段时间……而且你自己很难做到。你需要朋友帮忙,比如 Morpheus,或者 Trinity……但不,这确实是个非常好的观点……这个观点是否不受欢迎,真的会很有趣。
我们当然会在 Twitter---
另一个商业平台---
上测试这些观点,做一个 Twitter 投票,看看这些观点是否真的是不受欢迎的。
Joakim Kennedy: 我想现在的社区已经不像以前的密码朋克社区了,对吧?如果你看看大多数常见的软件开发环境---
你把所有东西都存储在微软拥有的产品上,找新工作时也用的是微软拥有的产品,你在 Slack 上交流,把所有东西都上传到 Google Docs……基本上你是在信任地球上最大的公司来支持和推动你新发现的事业。这和 90 年代的社区完全不同……
Mat Ryer: 是的,确实如此。你有另一个不受欢迎的观点吗?你提到过你有两个。
Joakim Kennedy: 有的。我觉得这个观点对欧洲观众来说可能更具争议,而对 Go 社区倒不一定。
Mat Ryer: 你是要说“美国很棒,美国是最好的”吗?
Joakim Kennedy: 哇哦!
Mat Ryer: “美国第一!” 这是你的不受欢迎的观点……
Joakim Kennedy: 完全的爱国主义。美国第一!不,其实是关于我们在安全领域非常敏感的话题---
GDPR。我不知道大家对 GDPR 有多熟悉;可以想象,任何处理 PII(个人身份信息)的人都在 GDPR 中度过了噩梦般的日子,而我这个不受欢迎的观点是,GDPR 其实就是一种让人感觉良好的安全姿态。除了让人感觉温暖舒适之外,它几乎没有任何真正的价值。对于那些需要遵守的人来说,它是一个噩梦,而在安全领域,它实际上使我们难以维持我们通常依赖的重要遥测数据。所以是的,我对 GDPR 有很强的意见。
Mat Ryer: 哇哦……是的。
Juan Andrés Guerrero-Saade: 你只是难过你失去了 whois 信息。 [笑声]
Joakim Kennedy: 是的,我确实对失去 whois 信息感到不满。整个论点是“哦,我们要保护人们免受垃圾邮件的困扰。” 但实际上,他们根本没有保护我们免受垃圾邮件的困扰,现在我也无法知道谁拥有这台服务器。
Mat Ryer: 是的……
Natalie Pistunovich: 我觉得这个观点会赢……我赌它会成为下次 Twitter 投票中的不受欢迎的观点赢家。
Mat Ryer: 它的体现就是每个网站都会问你是否接受 cookies。
Joakim Kennedy: 一遍又一遍地问。
Mat Ryer: 还有另一个按钮,你可以去配置它,然后你会进入一个庞大的偏好设置页面---
Natalie Pistunovich: 然后它会加载,加载,加载……
Mat Ryer: 是的……或者是巨大的设置页面……你甚至无法告诉浏览器你是否想要 cookies,然后它就会自作主张替你回答。你每次都必须---
Joakim Kennedy: “我会很友好……”
Mat Ryer: ……点击那个按钮每次进入网站……基本上,人们只是说“是的,接受 cookies”,只是为了摆脱这个讨厌的屏幕。
Natalie Pistunovich: 好吧,真是引人入胜,非常有趣,我希望所有听众都学到了新东西,并得到了启发。首先我要说非常感谢 JAGS 和 Joakim 的参与,也感谢 Mat 的共同主持……肯定会在关于 AI 生成恶意软件的那集节目中再见到你们。
Joakim Kennedy: AI 生成的恶意软件……
Juan Andrés Guerrero-Saade: 总有一天。谢谢你们两位。