本篇内容是根据2023年3月份#270 Hacking with Go: Part 4音频录制内容的整理与翻译
我们的“Hacking with Go”系列继续!这次 Natalie 和 Johnny 与 Ivan Kwiatkowski 和 Juan Andrés Guerrero-Saade 一起讨论,我们的重点是泛型和人工智能。
过程中为符合中文惯用表达有适当删改, 版权归原作者所有.
Natalie Pistunovich: 今天这一期节目非常令人激动。我个人对此充满期待,我想你们也能听出来。这一次我们将深入探讨使用 Go 进行黑客相关的内容,但会加入 AI 的视角。而且,今天是 3 月 14 日,我们正在录制这期节目。就在几个小时前,GPT-4 刚刚发布了,所以在正式开录前的音效测试中,我们聊到了这个,也聊到了早餐。
今天和我一起的是 Johnny。嗨,Johnny,你怎么样?
Johnny Boursiquot: 我很好,很高兴能来这儿。
Natalie Pistunovich: 和你一起主持节目总是很愉快。
Johnny Boursiquot: 确实如此。
Natalie Pistunovich: 今天我们还有两位非常棒的嘉宾,这已经是他们第 7755 次登上我们的节目了(笑),我们总是很高兴你们回来分享更多关于黑客的有趣内容---
Ivan 和 Jax。两位先生可以做一下自我介绍吗?
Ivan Kwiatkowski: 好的,大家好,很高兴能再次参加这个播客。我叫 Ivan Kwiatkowski,是一名法国的网络安全研究员,我在 Kaspersky 工作。
Juan Andrés Guerrero-Saade: 我叫 Juan Andrés Guerrero-Saade,不过大家叫我 Jax 就好……我是 Sentinel Labs 的高级主管。
Natalie Pistunovich: 所以你们两位都是黑客,尽管你们日常工作中并不使用 Go,但在你们的网络安全探索中遇到了一些和 Go 有关的有趣事情可以分享。也许我们可以从最近用 Go 编写的恶意软件开始聊起?
Juan Andrés Guerrero-Saade: 有不少这样的例子。
Natalie Pistunovich: 是的,请告诉我们吧。
Juan Andrés Guerrero-Saade: 说实话,我一开始没想到 Go 会被这么广泛地用于恶意软件。好吧,我们得稍微分类讨论一下。在我看来,很多恶意软件开发者可以分为两类。一类是我们过去称为 VX-er 的老派开发者,他们使用 C,或者 C++,而如果是更高级别的国家支持的开发团队,通常会使用 C++,并有非常成熟的框架。这些框架可能是由国防承包商开发的,经过质量保证等等。另一类则是那些使用 Python 编译代码,或者 Visual Basic、AutoIt 的人,这些人只是快速地尝试窃取数据,代码质量非常糟糕。
如今我们看到 Go 和 Rust 的使用逐渐增加,在我看来主要是 Go,虽然我很庆幸还没有看到太多 Rust 的使用……但我要说的是,你们可能对在现实中发现的 Go 恶意软件的水平不会感到印象深刻。虽然有很多 Red Team 的工具存在,但幸运的是,这些工具还没有被大范围用于真实场景中……不过它们确实已经在那里了。所以,我想 Go 正在慢慢成为恶意软件开发者的一个重要且理想的平台。
Natalie Pistunovich: 提醒我们一下,“Red Team” 是什么意思?
Juan Andrés Guerrero-Saade: 哦,天哪……抱歉,我有点跑题了。在网络安全领域,我们通常用不同颜色的帽子来定义角色,而 Red Team 通常是指渗透测试团队,也就是在受控环境中进行“进攻”操作的人。例如,一家财富 500 强公司可能会雇佣他们来入侵和攻击,以展示“看,这里有这些漏洞,系统设置得很差劲,这就是失败的原因。”
然后还有 Blue Team,就是负责网络防御的人---
我想我们大致算是 Blue Team 的一部分,但更倾向于做防病毒签名、逆向工程和恶意软件追踪……不过我和 Ivan 在这个领域中似乎有点像“异类”。
Ivan Kwiatkowski: 是的,我想他们可能会称我们为 Purple Team。Purple Team 是同时观察 Blue Team 和 Red Team 所做工作的团队,他们监控流量,尝试识别问题,或者创建签名来检测发生的一切,并确保未来不会遗漏这些问题。所以,这是一种观察者的角色,我觉得我们比较符合这一定位。
Juan Andrés Guerrero-Saade: 是的,这让事情变得有趣。这也意味着我们可以对其他人使用 Go 的方式进行评判,我觉得这比我们自己写代码更好玩……其实我很喜欢 Go,但我并不假装自己是个称职的开发者。Go 让我对自己的输出稍微有点信心。但和一些用 Go 写的恶意软件相比,我简直是天才。尤其是,许多XX的黑客团队开始使用 Go,或者像在乌克兰战争期间,我们看到一个叫 PartyTicket 的伪勒索软件,它就是用 Go 写的……
Natalie Pistunovich: 等等,什么是“伪勒索软件”?
Juan Andrés Guerrero-Saade: 嗯,在乌克兰战争期间,有大量的“擦除型”恶意软件被使用……
Natalie Pistunovich: 什么是“擦除型”恶意软件?
Juan Andrés Guerrero-Saade: 擦除型恶意软件的意思是,它进入电脑后会删除所有内容。
Johnny Boursiquot: 什么是电脑?[笑]
Juan Andrés Guerrero-Saade: 它会擦除整个系统。好的……我好像来错了播客(笑)。总之,擦除型恶意软件的作用就是进入系统并删除所有文件,使电脑无法工作。当目标是单台电脑时,这种行为显得很蠢,但如果是目标是外交部的 3000 台电脑同时瘫痪,那就很有意思了。
作为当时事件的一部分,他们放出了一个伪装成勒索软件的程序---
我称之为“伪勒索软件”,因为它显然从未经过测试。它根本不是为了勒索钱财而设计的,他们压根没打算解锁任何人的设备。这只是为了分散注意力。而且我之所以这么说,是因为他们在代码里犯了一个很明显的并发错误,这是每个 Go 初学者都会犯的错误:线程管理不当。结果是,这个 Go 写的勒索软件在四分钟内就让电脑崩溃了,因为线程失控了……
Johnny Boursiquot: 太过头了(笑)。
Juan Andrés Guerrero-Saade: 是的。它甚至没有机会加密任何内容,就像一个本地的拒绝服务攻击。所以它并不是真正的勒索软件,只是伪装成勒索软件的样子。
Natalie Pistunovich: 自我 DDoS。
Johnny Boursiquot: 这是一个糟糕的程序(笑)。
Juan Andrés Guerrero-Saade: 是的。
Ivan Kwiatkowski: 我其实也同意这种观察结果,因为我很少看到用 Go 编写的真正好的恶意软件样本。我们通常发现的,都是一些现有的恶意软件团体使用他们已经建立的恶意软件家族,但他们需要一些一次性使用的“投放器”或“初始阶段”的恶意软件。这些恶意软件可以被随意丢弃,如果发现目标电脑有趣,才会部署他们真正重要的恶意软件。
这些初始阶段的恶意软件---
也就是我们称为“投放器”的东西---
通常是一次性的。他们可能用一周时间用 Go 写一个,然后之后又用 Rust 写另一个。当他们入侵某台机器时,他们会试着运行命令部署某些东西。如果成功了,那很好;如果失败了---
比如被杀毒软件拦截了---
他们就会从“货架”上拿出另一个继续尝试。所以他们尽可能多地创建不同版本,用尽可能多的语言编写,但他们并不精通任何一种语言。他们可能只是从 Stack Overflow 上拼凑一些代码,直到弄出一个能运行的程序。从工程角度来看,这些代码会让你觉得很糟糕。
Juan Andrés Guerrero-Saade: 是的。不过现在他们有了 GPT-4,对吧?……不,我不想这么说,因为我不想加入网络安全领域那种“追热点”的队伍。现在很多人都在说“GPT-4 会毁了我们所有人”,每次攻击都用到了 GPT-4……实际上,有很多开源的恶意软件。他们根本不需要 GPT-4。如果有的话,他们只是变懒了。
Ivan Kwiatkowski: 是的。而且,当 GitHub Copilot 发布时,为什么没有这么大的反应呢?因为它可能是一种比让 ChatGPT 或 OpenAI API 一页一页生成代码更高效的方式。
Juan Andrés Guerrero-Saade: 我感觉被针对了……[笑] 我感觉被看穿了。
Johnny Boursiquot: 你让 ChatGPT 为你写并发 Go 代码?
Juan Andrés Guerrero-Saade: GPT-4 发布之后---
大概在我们录音前 20 分钟吧?我就开始疯狂地问它各种问题,看看“你变聪明了吗?”它确实做了一些让我印象深刻的事情……但这也让人懒惰。比如,“给我写一个完整的 Elasticsearch 集群部署脚本,用 Bash 实现。开始吧。”然后你看着它生成的代码,说“我希望这能用……我们看看结果吧。”从懒惰的 DevOps 角度来说,这确实挺有意思的。
Natalie Pistunovich: 接下来可以问它“这代码有什么问题?有哪些坑?改进一下。”
Ivan Kwiatkowski: 或者直接问它“你的脚本能用吗?”也许它知道……[笑]
Natalie Pistunovich: “怎么改进它?”我觉得它可以给你一些建议。
Juan Andrés Guerrero-Saade: 是的。我觉得目前缺少的是---
我不知道 OpenAI 未来有什么计划---
但显而易见的缺失是一个类似于 repl 的东西,可以同时写代码、运行代码,一边写一边调试。就像自动化编程一样。如果你把错误信息扔给它,它就会不断修复,只要它没有进入“幻觉模式”……
Johnny Boursiquot: [笑]
Juan Andrés Guerrero-Saade: ……它不会给你警告,也不会变红。但一旦它开始告诉你一些不存在的 API,调用从未写过的函数或包……只要没有进入这种“诡异领域”,它就会继续修复。所以需要一个类似 langchain 的实现,让它写代码、运行代码,并在过程中自己调试……
Natalie Pistunovich: 那你说这些恶意软件代码在并发和其他方面很糟糕时,我得问---
它们有测试吗?
Juan Andrés Guerrero-Saade: 哦。我们不知道,因为我们拿到的是编译后的版本。
Johnny Boursiquot: 是的,编译后的版本里没有测试代码。
Juan Andrés Guerrero-Saade: 我猜他们在写这些代码时,完全没有写测试。不过我觉得,我们不应该对那些不写测试的开发者太苛刻。当然,我不是在为那些俄罗斯战争期间的恶意软件操作者争取什么同情,而是为我自己争取一点。
Ivan Kwiatkowski: 如果你指的是单元测试的话,那我敢说,几乎肯定是没有的。如果你指的是检查返回值,确保错误为 nil
之类的东西,那有时候你可能会看到。
Juan Andrés Guerrero-Saade: 我觉得你比我运气好,Ivan。毕竟你分析过 SUNBURST 和那个有趣的 SolarWinds 攻击(有些人可能听说过)。
Ivan Kwiatkowski: 是的。
Juan Andrés Guerrero-Saade: 那个供应链攻击中包含了恶意软件。Ivan 实际上分析过那个。所以我觉得这是个例子,让人觉得“好吧,这个写得稍微好一点”。它确实有效,相比于你分析过的一些其他东西来说。
Ivan Kwiatkowski: 是的。那是我第一次接触 Go 的经验。当时我完全不知道它是否符合 Go 的“正式”语言规范……不过在使用 Go 的过程中,我感觉这个语言尽可能地试图防止你滥用它。但回过头来看,确实觉得 SunShuttle(恶意软件的名字)像个优秀的学生。他们确实检查了所有的返回值,并在他们认为需要的时候进行测试。总体结构也非常合理……所以是的,我认为它属于用 Go 写的更高质量的恶意软件之一。
Juan Andrés Guerrero-Saade: 我试着站在那些听这个播客的资深 Go 开发者的角度来想……我们现在听起来可能像傻子一样(笑)。老实说,我们面对的是完全不同的人群。我觉得 Ivan 描述得很准确,比如,有些老牌的团队需要一些新组件,主要用于攻击的第一阶段。他们需要一个恶意软件,唯一的作用就是进入你的电脑,评估环境,然后部署更专业的恶意软件。所以在这方面,他们可以非常懒惰,对吧?他们只需要用 Go 或 Rust 写一个“加载器”(loader),然后看看能否绕过杀毒软件的检测……之后他们就不在乎了,会部署他们用 .NET 写的东西,或者其他一直在用的工具。
我认为很少有团队是从“资深 Go 开发者”的角度去真正采用 Go 的……这可能反映了一些国家机构的招聘周期。比如说,有多少刚从大学毕业、学了 Go 的学生现在为XX国家安全部工作?XXX也是类似的。这里几乎有一种代际差异---
我不是说我们在等待这种变化,但我觉得这种代际差异确实在起作用。
现在我们看到XXX的行动中出现了 Kubernetes,你会想,“好吧,这些人显然不是我过去 15 年里一直在对付的那些老家伙了。” [笑]
Ivan Kwiatkowski: 我甚至会更进一步……当我们看到那些每隔一周就生成的新“投放器”(dropper)时,真的感觉像是某种对新入职实习生的入门考验。他们刚到公司时,可能没有权限或者能力处理那些更严肃的事情,所以他们的任务就是用最近学的语言写一个简单的“投放器”。这就是他们的工作。可能六个月后,或者等他们正式入职后,他们才会处理其他更重要的事情。所以整个过程真的像是某种内部培训循环。新人进来后,先写个“投放器”;如果表现不错,接下来才可能参与实际的操作。
Juan Andrés Guerrero-Saade: 被 Go “考验”了。
Ivan Kwiatkowski: 没错。或者被 Rust “考验”。甚至可能是 Scala。
Johnny Boursiquot: 我发现你们谈论国家支持的安全漏洞、恶意软件等问题的方式……就像一个普通的工作。如果你刚加入一家公司,作为一个刚毕业的新人,不会直接参与核心任务……可能会被安排修复一些小问题之类的。但有一个过程,你需要逐步被提拔,才能处理更重要的事情……不过,当我们想到黑客时,我们通常会联想到那种躲在地下室里、穿着沾满薯片渣 T 恤的孩子……
Juan Andrés Guerrero-Saade: 或是特朗普时代提到的“400 磅的黑客”……
Johnny Boursiquot: 对,就是那种老电影里的刻板印象。但现实完全不是这样。这更像是一份“正式”的工作。
Juan Andrés Guerrero-Saade: 这取决于你在和谁打交道。我认为 Ivan 和我在某种程度上---
我们并不是在自吹自擂,而是我们专注于网络安全的一个非常具体的领域。我们分析的是所谓的 APT(高级持续性威胁),这是个委婉的说法,意思是“这可能是一组政府支持的黑客”。因为我们很难将一组恶意软件进一步归因到具体的情报机构或类似的组织。但你会看到各种各样的情况。
今年我们看到黑客活动主义(hacktivism)又火了起来……在这一领域,你可能会遇到那些地下室里搞事情的 Anonymous 成员,他们只是想攻击一个网站;也可能遇到一些“黑帽传奇”,一个 20 年都没露面的黑客突然决定攻击某个大公司,或者像“巴拿马文件”这样的事件---
一个没人知道的黑客侵入某个地方,窃取所有数据,并将其发布出来,只是为了制造混乱。然后,一切就崩溃了。所以你会遇到各种各样的情况。
对我们来说,我想我们倾向于---
我不想替你说太多,Ivan,但我觉得我们主要专注于政府相关的部分。这些人通常在防御方面做的事情更有趣。
Ivan Kwiatkowski: 是的,完全同意。我想补充的是---
是的,虽然我们都知道好莱坞给我们灌输了“戴着连帽衫的黑客”的形象,我们也想相信这种形象,因为它很吸引人……但正如 Jax 提到的,我们的重点是那些情报机构的威胁行为者。而情报机构可能会雇佣穿连帽衫的人;那是他们的业务。但与此同时,他们也有“客户”。情报部门需要为其他部门、其他服务甚至高层领导提供信息。
Juan Andrés Guerrero-Saade: 就像一份工作一样。
Ivan Kwiatkowski: 没错,这就是一份工作。他们需要交付成果。所以他们必须建立各种流程。如果 Bob 某天生病了,Alice 必须能够顶上。因此,他们需要那些所有操作员都能使用的程序,确保团队之间能够无缝切换。这就像一个生产工厂一样,必须持续运转,不能停下来……[笑] 因为这就是一份工作。
Johnny Boursiquot: 说得太好了。[笑]
Juan Andrés Guerrero-Saade: 不同的国家情况也不同。我们在西方,尤其是美国,“五眼联盟”国家,形式非常正式。你可以看到有一个生产流水线,涉及国防承包商和国防工业基础。像 雷神公司(Raytheon)或 诺斯罗普·格鲁曼(Northrop Grumman)这样的公司都会参与其中。而在某些欧洲国家,很明显某个情报机构雇了五个穿连帽衫的法国人坐在房间里,开发了整个平台。
XX的情况则不同。我们会被大量的XX攻击压垮,因为他们在目标选择上几乎没有区分。他们会说,“我们需要攻入这家制药公司”,然后把任务分配给国家支持的团队、随机的黑客团队,或者为钱而干的那些人……你会看到 12 个团队同时攻击同一个目标,你会想,“拜托,至少装得隐蔽一点,至少假装不想被抓住。”所以不同的文化之间差异很大。
Ivan Kwiatkowski: 不过,尽管 Jax 刚才说了这些,他们最终还是会成功的。
Juan Andrés Guerrero-Saade: 哦,当然。
Ivan Kwiatkowski: 所以虽然我们在这里开玩笑,但最终他们的手段有效。
Johnny Boursiquot: 是啊,如果有 12 个团队在找漏洞……我通常会告诉别人,“安全和减少攻击面,这些都只是缓解措施。”如果有一群人,或者一个国家支持的组织盯上了你,他们很可能会找到办法攻入。如果不是因为你的安全系统或软件漏洞,那也会是因为某个人链条上薄弱的一环,比如有人掉入钓鱼攻击的陷阱……如果有人盯上你,他们最终会得手的。
Ivan Kwiatkowski: 哦,是的。其实问题从来不是防火墙,而是钓鱼攻击。
Juan Andrés Guerrero-Saade: 是的,人们总是关注“哦,有人使用了这些无法修复的零日漏洞,和各种复杂的软件攻击”,但实际上,大约 95% 的攻击只是因为某人打开了一个附件,或者在收到的钓鱼邮件中,把自己的凭据输入了一个伪造的 Facebook 网站。这类攻击数量巨大,但却常常被忽视。不过看看现在供应链攻击的兴起,这种情况正在发生变化。
所以我在这个节目中第一次提出的“不受欢迎的观点”是,软件开发者可能是整个互联网中安全性最差的一群人,因为我们---
好吧,我不想说“我们”。在这种情况下,我只能把责任推到你们这些开发者身上……存在一定程度的自负,安装各种随机软件的行为也很普遍……
Johnny Boursiquot: 确实如此……[笑]
Juan Andrés Guerrero-Saade: ……还有对包管理器的高度依赖;没人愿意运行 EDR/XDR/AV(端点检测与响应/扩展检测与响应/杀毒软件)……
Johnny Boursiquot: brew install
……[笑]
Juan Andrés Guerrero-Saade: 一切都在 root 模式下运行。而且所有用于更改生产环境的 SSH 密钥和 PGP 密钥都在你的笔记本电脑上。所以我们见过很多操作---
其中一些已经被泄露并公开记录---
你会发现,“好吧,他们显然是在通过 LinkedIn 搜索开发者”,他们知道这些开发者是公司的系统管理员……然后你就直接进入了系统,你已经拥有了 root 密码,已经可以访问整个环境,甚至还拿到了修改生产环境的权限。而这就是许多供应链攻击的开端,对吧?如果我能更改你的代码库,我就可以直接在你使用的更新管道中添加恶意软件,然后攻击你的每一个下游客户。这种攻击在十年前可能还显得很冷门,但现在我们已经深陷其中了。这种情况正在到处发生。
Natalie Pistunovich: 刚刚说的 brew install
简直太形象了……不过我很好奇,Go 对于使用外部库的保守态度,以及一再建议只使用标准库,这是否在某种程度上有所帮助,让 Go 稍微更安全一些?
Juan Andrés Guerrero-Saade: 我认为这在某种程度上确实创造了一个“单点故障”的风险,但我并不觉得这是坏事,对吧?正如你所描述的,Go 的这种保守性让它的安全状况要好得多。当然,还是有办法攻击它,但我觉得我们如果把 Go 用户和 PyPI(Python 包管理器)用户放在同一水平上,那就有些不公平了。PyPI---
坦白说,真的是个糟糕的局面。对不起,但它真的很糟糕。你会发现大量的名字/拼写劫持(name/typosquatting),有人窃取开发者账户,然后用恶意代码替换知名的包……
我们实际上也发现过类似的事情---
我们曾研究过一个针对 Rust crates.io 的供应链攻击。他们的团队非常迅速地作出了反应,非常友好,也非常投入……但本质上,攻击者创建了一个伪造的开发者账户,冒充了一位知名开发者,然后篡改了 Rust 的 Decimal 包,希望人们无意中安装这个包。这会下载一个第二阶段的恶意软件,专门设计用来攻击 CI/CD(持续集成/持续交付)流水线。这种攻击的目的是直接命中生产流水线,最终攻击下游客户。这真的很疯狂……事情变得越来越离谱了。
Ivan Kwiatkowski: 是的。不过,我觉得事情不一定是非黑即白,对吧?确实,在 Python 的生态中,任何人都可以创建账户并上传库。实际上,我曾经的一位同事 Felix([听不清 00:23:48.08],现在在一家名为 Sequoia 的法国公司工作)最近做了一些研究,他在 GitHub 上发现了一个项目,可以自动在现有库中植入后门,并将其上传到 Pip。这是一个自动化流程,如果你愿意,一天可以生成上百个这样的包。这是生态中的一端。而在另一端,则是像 Go 这样的语言,外部库的数量非常少,或者至少你会被劝阻不要使用它们,因为 Go 是“自带电池”的(batteries-included)。也许我们可以找到某种中间地带,比如有一个值得信赖或经过策划的库或包的存储库,人们可以从中下载东西,而不是像现在这样需要拉取整个网络的所有 LeftPadding(注:著名的 LeftPad 事件),或者类似的东西……
Johnny Boursiquot: [笑] 这个梗永远不会过时。
Ivan Kwiatkowski: 是啊,永远不会,对吧?
Natalie Pistunovich: 我们应该把这个加到节目笔记里,给那些不熟悉这个梗的听众……
Ivan Kwiatkowski: 然后,也许当人们上传包时,可以通过某种由 Golang 团队进行的审查流程,前提是他们有资源这样做,至少可以策划一个“标准扩展库”,以便其他人能用。
Juan Andrés Guerrero-Saade: 我觉得你刚才的意思是,我们需要自己的 crates.io 或 PyPI。
Ivan Kwiatkowski: 也许吧。
Juan Andrés Guerrero-Saade: 我觉得你最终会走到那一步,对吧?你会想,“如果我们有一个单一的、集中化的方式来审核包,开发者可以给包点个赞或踩……”我觉得最终的结果就是你会走到那个局面。
Ivan Kwiatkowski: 我的意思是,也许该像 Apple Store 那样。不完全开放。
Juan Andrés Guerrero-Saade: 是啊。不过这让我想到了 Google 的库……他们的确似乎有一些更标准化的打包方式,维护得也相对较好……不过我不知道;我们不能完全信任任何东西。但我觉得 Natalie 提到的重点很好,大家倾向于主要依赖标准库,这些库已经被打包好了。但是当你开始推 GitHub 仓库时,这种情况几乎是不可避免的---
每个人迟早都会拉取别人的项目。我只是觉得---
我不知道,Go 不是首要目标,我就这么说吧。Go 并不是首要攻击目标,正是因为你提到的这些原因。
话虽如此,Go 还是非常有用的。而且既然我们从 GPT-4 开始了这个讨论,我认为 Go 是最适合机器学习生成代码的语言之一。因为正如 Ivan 的说法---
它有点像“极权主义的 Python”(fascist Python),这对大型语言模型来说非常完美。它超级标准化,对吧?所有东西的格式都差不多,约定也很一致……你不需要太多的风格指南,因为没有太多可以偏离的空间,而且并发和其他模式都有标准的做法。
所以对我个人而言,我发现 GPT 生成的 Go 代码大部分情况下可以直接编译。它完美吗?它能完全实现我的需求吗?不一定。在许多情况下,并不能。但它至少能编译,对吧?这比很多 Python 或其他代码要好得多……至少在 GPT-3.5 之前是如此。至于 GPT-4,我还不知道,对吧?我们得去测试一下,它才“诞生”40分钟……
Johnny Boursiquot: 那么,既然我们可以用这些工具生成恶意代码,我们是否也可以用这些工具来理解这些恶意代码,并防御它们?
Juan Andrés Guerrero-Saade: 就我个人而言,我真的非常看好 LLM(大型语言模型)为防守方提供的能力。这不是一一对应的关系。Ivan,你曾经开发过第一个、也是最有用的工具之一,我觉得;你愿意聊聊 Gepetto 吗?
Ivan Kwiatkowski: 好的,当然可以。我可以等你讲完之后再说,或者现在就说……
Juan Andrés Guerrero-Saade: 好的,对不起,我稍微解释一下这个概念……我们使用 LLM(大型语言模型)不仅仅是为了构建工具,而是更多地用于代码分析,尤其是在我们进行逆向工程时。逆向工程恶意软件是一项非常专业化的工作,擅长这项工作的人非常少。这是一种非常稀缺的技能,需求量极大,但却很难培养。你不能简单地去上某个学校或参加某个项目,然后就能出来说“好吧,我现在是一名逆向工程师了”。通常,这个技能来自一定的编程实践,可能还包括破解游戏许可证或制作游戏模组的兴趣。
Ivan Kwiatkowski: 还需要一点神经质……
Juan Andrés Guerrero-Saade: 是的,还需要一点神经质,也许还需要一堆 Adderall(注意力缺陷多动症药物)……就是某种能让你走上这条路的东西。所以我看到了 Ivan 的工具(我会让他来介绍),还基于这个工具设计了一整套大学课程,主要是围绕使用他的工具以及 ChatGPT 的应用……因为这个工具非常擅长总结和解释汇编中的 C 伪代码。你可以直接问它:“这个函数在做什么?”
Ivan Kwiatkowski: 好的,也许我可以简单介绍一下这个工具。话说回来,当 ChatGPT 最初发布时,很多人都在担心未来几年内他们是否还能保住工作……我也有同样的疑问,我就在问自己:“好吧,ChatGPT 能不能取代我目前的工作?”于是我拿了一段由我的分析工具生成的伪代码,这是一段恶意软件的代码,我并没有它的源代码。我把这段代码放到 ChatGPT 上,问它:“这是一个 C 函数,它的功能是什么?”因为我的工作基本上就是看这些函数,试图理解它们的作用,然后审查所有未知程序中的函数,这样我也许可以告诉我的雇主这个恶意软件到底在做什么。
让我极为惊讶的是,ChatGPT 在这方面表现得非常好,甚至可以说是极其优秀。事后想想,这其实很合理,因为 ChatGPT 是一个语言模型,而代码本质上也是一种语言。ChatGPT 在理解、解释和重新表述这些内容方面表现得非常出色。所以我所做的就是给它一些由自动化工具生成的未知代码,这些代码没有任何变量名、注释或有意义的函数名称,但它们仍然是代码,而 ChatGPT 能够从中提取意义,并将其以人类语言表达出来。
然后,在我最初的震惊之后,我创建了一个插件,将我的工作工具直接与 OpenAI 的 API 连接起来。最初使用的是 DaVinci-003 模型,现在我切换到了最新的 GPT-3.5……我的工具现在会将伪代码发送到 ChatGPT,而 OpenAI 的模型会返回一段注释,比如“这个函数的作用是这样的”,然后我可能需要检查一下它的内容是否与我看到的情况一致。但总体来说,我只需要按下一个快捷键组合,AI 就会完成我的工作,接着我再把所有结果拼凑起来。这真的节省了大量时间,而且从 GitHub 的活跃度来看,这个工具在社区中得到了很多采用。
Natalie Pistunovich: 我们会在节目笔记中添加链接。另外,我建议你可以利用今天发布的支持更大输入量的新功能,试试能否让它完成你提到的最后一步---
整合所有信息并查看它如何工作。
Juan Andrés Guerrero-Saade: 我对此非常期待。老实说……我还没告诉你,Ivan,但我已经用你的工具玩了很久……我一直在想,“好吧,我怎么能递归地使用这个工具呢?从解释一个具体函数开始,到遍历特定的控制流分支,再总结这些总结,等等。最后,我能不能得到一个关于整个程序功能的总结呢?”这几乎是懒到极致的行为。
Ivan Kwiatkowski: 这是一个正在进行的工作。我遇到的主要限制是 OpenAI 的 API 每次请求的 token 数量限制。有一些解决方法,但需要反复调整,而且每次失败都会花费大量 token……因为当你在一个程序中递归时,可能会非常深入,调用成千上万次函数。所以我自己也在调整,但目前还没有找到足够有意义的结果,能让我愿意为每次请求花费 10 或 20 美元。
Johnny Boursiquot: 但这只是成本问题,对吧?仅仅是成本问题。如果有人愿意为你买单呢……假设你有无限预算---
那会怎样?
Ivan Kwiatkowski: 但没人会啊……[笑声]
Johnny Boursiquot: 好吧,听众朋友们,如果你愿意资助 Ivan,请联系我们……
Juan Andrés Guerrero-Saade: OpenAI 应该打开钱包资助我们。说实话,这并不算太贵,但的确可能会失控。所以我们肯定需要一些限制措施,再次让它对大家更可用。因为当你在逆向工程代码时,大多数标签信息都已经丢失了……如果恶意软件不是用 Go 生成的,可能很难分辨哪些是库代码,比如标准库代码……所以你很容易沿着错误的路径逆向工程,比如完全逆向 OpenSSL,那是静态编译到二进制文件中的,这太糟糕了,你肯定不想这么做。我觉得这正是 ChatGPT 在某些情况下可能会变得成本过高的原因。如果你试图分析 45,000 个函数,其中 70% 是标准库代码,而你完全没必要这么做……所以我们需要在这里设定一些限制措施。话虽如此---
我觉得用 Go 写的代码更容易逆向工程。从某种程度上来说,我会很高兴看到更多的恶意软件开发者选择 Go。
Juan Andrés Guerrero-Saade: 完全同意,因为……我喜欢用 Go 逆向工程。以前这是一场噩梦,但现在……简单多了。
Johnny Boursiquot: 你不知道你刚才的话里包含了多少 Go 的双关梗……我喜欢你自己都没意识到这一点,因为你不像我一样每天都在 Go 社区里混。你刚才提到的梗,我脑海里就一直在响“叮!又一个梗。叮!又一个梗。叮……”[笑]
Juan Andrés Guerrero-Saade: 我甚至没有自己的 gopher(Go 的吉祥物)。我还没到那一步呢。很有趣,我之前和 Natalie 聊过我们最近发布的一篇文章。Alex([听不清 00:34:38.28],我的团队成员)发现了一款用 Go 编写的XX APT 恶意软件,这是我们第一次发现他们基本上只创建了一个非常简单的 Go 二进制文件;它包含一个名为 Yaegi 的开源 Go 解释器。这个二进制文件非常简单,它运行这个解释器,然后解码所有以 Base64 编码保存的 Go 源代码,最终由解释器在系统上实时运行。
这个想法是,如果杀毒软件或其他安全工具检查这个恶意软件,它看起来非常无害,对吧?就像一个交互式解释器(REPL)之类的东西。但实际上,这只是分阶段的恶意软件。
Ivan Kwiatkowski: 是的,这很好地说明了,很多情况下,优秀的软件开发实践与恶意软件开发者的目标是完全不同的。
Natalie Pistunovich: 如果这还不能让大家遵循良好的开发实践……[笑声]
Juan Andrés Guerrero-Saade: 我不知道,有很多优秀的 Go 攻击工具,很多人还没有意识到它们的存在。我对此没意见,我不会指引他们去找这些工具,但它们已经在那里了。这些人只是没有看对地方。
Ivan Kwiatkowski: 是的,为什么你们还在用 Cobalt Strike?到底怎么回事?
Natalie Pistunovich: 我想说的是,你刚才批评了那些写得差的 Go 恶意软件,但对于写得好的,你还在研究……所以这确实证明了那个观点。
Juan Andrés Guerrero-Saade: 你知道……请让我们的工作更有趣一点……这是一种很奇怪的感觉,对吧?一方面我们总在谈论如何保护人们,帮助他们保护自己的网络……但同时,我们的内心也有一点点邪恶的倾向,你会坐在那里想---
如果发现一款前所未见的、Stuxnet(震网病毒)级别的恶意软件,那会非常酷,然后把所有时间都花在研究它上面……这就像在期待一场火车事故的发生。就像看到高速公路上的连环车祸会感到兴奋。这种感觉有点扭曲。
Ivan Kwiatkowski: 是啊,我们通常不会谈论这个。
Johnny Boursiquot: [笑] 就像 Bruno,我们不谈 Bruno。
Ivan Kwiatkowski: 这是我和我的治疗师之间的秘密。
Natalie Pistunovich: Ivan,你写的工具 Gepetto,你之前提到你最近用它比较了带泛型和不带泛型的 Go 代码。
Ivan Kwiatkowski: 其实在这个具体案例中我并没有用它。原因是……首先,我还没试过用 Gepetto 去分析 Go 编译器生成的代码,因为我还没来得及……而且我不确定它的反应如何,因为正如我之前提到的,IDA 反编译器处理 Go 代码的输出可能会有点乱,甚至非常乱,这取决于 Go 的版本。所以我没有太多尝试,我不确定它的效果会如何。但无论如何---
是的,我猜到你会问我关于泛型的问题,因为每次我来录播客,你都会问我这个问题……[笑声] 所以这次我有备而来。
Johnny Boursiquot: 哇……
Ivan Kwiatkowski: 所以我做的事情是,我基于官方 Go 教程创建了一个非常小的程序,然后我编译了这个代码,把它放到 IDA 中查看---
我对比了一个非泛型函数和一个等价的泛型函数的区别。我本来就有一些预期,结果证明我的预期是正确的。在我透露结果之前,我想解释一下为什么我会有这样的预期并想验证它是否正确:正如我在之前的播客中提到的,Go 语言倾向于自己设计所有东西,对吧?如果你习惯了在 C 或 C++ 中看到某些机制,然后希望在 Go 中找到类似的东西,通常不会相同,因为 Go 的开发者似乎是从头开始设计的,他们希望在不依赖那些“破碎的巨人”基础上做得更好。
所以在这里,Go 实际上做了和 C++ 一样的事情。在 C++ 中,当你有模板函数时,编译器会为程序中实际使用到的每种类型生成一个函数副本。而 Go 在这里做的完全一样。如果你有一个泛型函数,它可以接收整数、浮点数或者字符串作为参数,那么在编译后的程序中,你会有一个接收整数参数的函数版本,函数内部的所有操作都与整数相关;然后你会有一个函数的完全相同的副本,但类型不同。当程序调用这个函数时,根据当前使用的类型,它会调用编译器生成的对应函数实例。
所以实际上,它做的事情和 C++ 完全一样:创建副本,并且由于它在编译时已经知道要使用的类型,它只需调用正确的函数。所以,是的,这就是它的工作原理。
Juan Andrés Guerrero-Saade: 非常简单,对吧?你会觉得“这真的很简单……”
Johnny Boursiquot: 简直小菜一碟……
Juan Andrés Guerrero-Saade: 是啊。很有趣的是,我们的工具很容易出问题。开发社区已经习以为常的一些基础功能,在逆向工程社区却不够完善。比如,Ivan 提到的 IDA Pro,这是大多数逆向工程师使用的反编译/反汇编工具。当它试图处理 Go 时,它就有点崩溃,表现得不太好。这是因为一些非常简单的原因---
比如它们从未想过需要处理多返回值函数。超级愚蠢的事情,比如它无法处理多个返回值,所以它需要为函数生成额外的前置代码,试图存储这些东西……是的,你可能会觉得我们可以很容易地修补这些工具……但事实并非如此。
Ivan Kwiatkowski: 我认为一个更根本的问题是,像 IDA 和 Ghidra 这样的反编译工具,它们看到代码后会尝试将其反编译为 C。而它们只能生成 C 代码。问题在于,并非所有东西都可以用 C 表达,尤其是 Go 程序。所以当工具试图提升一个抽象层次,试图生成对应的 C 代码时,显然无法创建任何有意义的 C 表示。这导致了一些问题---
比如变量不存在,或者它们生成了错误的变量……整个过程就崩溃了,因为工具最初的假设本身就是错误的。
Natalie Pistunovich: 如果有听众正在用 Go 构建逆向工程工具,请联系我们。我们想在下一期节目中邀请你。
Johnny Boursiquot: 是的,真的。
Natalie Pistunovich: 有很多问题想问你们……
Juan Andrés Guerrero-Saade: 有人能帮忙吗……是的,那太棒了。我确实有点嫉妒,当我看到 CI/CD 的各种发展,以及围绕你们所使用的工具建立起的社区……真的有点嫉妒。我们在我们这个领域中,并没有那么活跃的开发者社区。我想这更能反映出---
让我补充一下---
我想这更反映了我们这个领域从业者的稀缺性。我们往往都忙得不可开交,所以你会看到,有人可能会发布一个很酷的插件,然后他就又回去忙自己的工作了。
所以,你很少会看到有人专门坐下来反复改进工具,或者说“我来启动一个全新的逆向工程项目”,或者开发一个新的框架……通常情况下,这意味着某个非常优秀的逆向工程师会暂停分析恶意软件的工作三个月,专心去开发这个东西,然后就会面临一个问题---
很难判断这是否是他们时间的最佳利用方式。
Ivan Kwiatkowski: 是的,确实如此。对我们大多数人来说,开发只是一个副业。而且很不确定我们的雇主是否会愿意让我们花六个月的时间去开发一个能帮助整个社区的超棒框架。即使是为了内部使用,他们可能也会犹豫。
Johnny Boursiquot: 我不像你们那样活跃在安全圈子里,但我接触过一些工具,似乎就是为了改善开发者工作流或开发者体验而设计的。我想到的一个是基于 Ruby 的,我觉得 Metasploit 对我来说就像这种框架……它提供了工具和挂载方式,让从事相关工作变得更容易。现在还有类似的东西吗?
Juan Andrés Guerrero-Saade: 你描述得没错,那是一个很棒的框架,但它是用来攻击的。所以我们很少有类似的框架是用于防御的---
Johnny Boursiquot: 用于防御的。
Juan Andrés Guerrero-Saade: 相反,你会看到这些流水线式的模型,比如“哦,只要运行那个 Metasploit 就行了。用 Cobalt Strike 就够了。别担心,只有四个选项,然后它会输出新的恶意软件给你。”而我们站在另一边,却在用上世纪 90 年代末的苏联工具,试图……这完全不能相比,对吧?
Johnny Boursiquot: [笑] 进攻比防守更有趣……你是这样告诉我的吗?
Juan Andrés Guerrero-Saade: 我觉得进攻更容易上手。我不确定它是否更有趣,因为我就是那种喜欢做逆向工程和恶意软件狩猎的怪咖……所以对我来说,我更喜欢这些。我觉得如果你在攻防安全领域,却从来没有真正攻击过任何人,那就很奇怪。这可能是我一个不太受欢迎的观点:我不明白为什么你会选择攻防领域,却从来不违法,也从来没有为了好玩而去黑别人,对吧?单单是为企业做一些付费的渗透测试,这听起来是对超能力最无聊的利用方式。
Ivan Kwiatkowski: 这是对娱乐性黑客行为的温和辩护。你们听到了。
Juan Andrés Guerrero-Saade: 没错。其实就像这样,你拥有超能力,却只用它去帮别人把猫从树上救下来。这是个不错的副业,但你有超能力,可以突破系统,可以进入你不该进入的地方,可以得到你不该拥有的东西……然后你选择去抢一个糖果店。这对我来说不太说得通。所以我很满意做防御……好像是个最烂的回答---
我认为在防御这边更有趣,但它就像一个自己会转动的魔方。
Ivan Kwiatkowski: 不过我觉得你说得对。我觉得大多数防御者都知道,他们不应该被赋予这样的能力,而攻击者知道这一点,但还是去做了。
Juan Andrés Guerrero-Saade: 他们生活在边缘啊……所以这就是为什么你可以去 NSA 工作,对吧?他们现在招人招得特别凶。所以对于那些刚从 Google 或其他地方失业、感到无聊、不吸大麻、想为国家服务但收入比之前少的人来说……
Ivan Kwiatkowski: 而且必须是美国公民。
Juan Andrés Guerrero-Saade: ……而且必须是美国公民,没有被捕过……有很多条件。但本质上,你可以去 NSA 为国家服务,并且可能会做一些很酷的事情。
Natalie Pistunovich: 不知道为什么这让我想起……我欠 IKEA 一个道歉。 [笑声]
Juan Andrés Guerrero-Saade: 舞台交给你了……
Johnny Boursiquot: 请继续……
Natalie Pistunovich: 几期节目之前,我把写得很差的代码比作 IKEA 家具……
Johnny Boursiquot: 哦……好狠。
Natalie Pistunovich: 这不是作为“不受欢迎的观点”提出的……
Ivan Kwiatkowski: 你收到停止和终止函了吗?
Natalie Pistunovich: 嗯,没有……
Johnny Boursiquot: 我还以为是……
Juan Andrés Guerrero-Saade: 你可能永远不能再进入瑞典了……
Natalie Pistunovich: IKEA 其实已经不是一家瑞典公司了,尽管大家都这么认为……但它已经不是了。它曾经是,现在还是以瑞典品牌自居……不过我的一个朋友是云计算顾问,他在帮助 IKEA 迁移到云端,并且采用 Go……
Ivan Kwiatkowski: 请不要告诉我是在XX……
Natalie Pistunovich: 不是,不是。然后他们对他说,Go 挺好的,但是她在 Go Time 上批评我们,那可不太好。 [笑声] 所以,我要道歉。对不起。
Johnny Boursiquot: 哇哦……
Juan Andrés Guerrero-Saade: 影响挺远的。
Natalie Pistunovich: 我这样做确实不太好……我会改进的。
Johnny Boursiquot: 哇……“她在 Go Time 上批评我们了。”
Juan Andrés Guerrero-Saade: 你得承担起使用这个麦克风所带来的责任啊……
Johnny Boursiquot: 哇,这太惊人了。这真是个惊人的故事。希望 IKEA 听到后会意识到“开玩笑的啦。”Natalie 并没有真的那个意思。
Natalie Pistunovich: 我很想邀请你们上播客。
Johnny Boursiquot: 其实是的,我们确实很想邀请。如果他们在用 Go 做一些东西,我觉得这会是一期很有趣的节目。所以,IKEA……你们收到了来自 Go Time 团队的正式邀请。来和我们聊聊你们正在做的事情吧。
Natalie Pistunovich: 还有一个正式的道歉。
Johnny Boursiquot: 是的,还有一个正式道歉。
Juan Andrés Guerrero-Saade: 他们的肉丸很棒。一切都很棒。
Johnny Boursiquot: [笑] 说到不受欢迎的观点……是不是该聊聊这个了,Natalie?
Natalie Pistunovich: 那么,Johnny,作为提出这个话题的人,你有要分享的观点吗?不是想让你难堪啦……但我得说,在我们做音频测试的时候,有一个声音有点不对,我确实直接指出了问题。所以,先是这个,现在又让你当场表态……对不起,Johnny。这好像成了我的道歉播客了。
Johnny Boursiquot: 你的道歉巡回演讲……
Natalie Pistunovich: 是的。
Johnny Boursiquot: 不受欢迎的观点……嗯,我们可以稍后再回到我这边吗?因为我现在在想怎么把我的观点表达清楚,又不冒犯到 IKEA,就像你之前做的那样……[笑]
Natalie Pistunovich: 那可不是“不受欢迎的观点”环节的一部分。这才是最糟糕的地方。
Juan Andrés Guerrero-Saade: 我觉得在节目过程中,我已经随意地抛出了很多不受欢迎的观点了……
Natalie Pistunovich: 的确如此。那你有一个可以作为总结的吗?
Juan Andrés Guerrero-Saade: 我不知道这算不算一个不受欢迎的观点……好吧,我可以让它在这个播客的语境下变得不受欢迎。我觉得 Python 3.11 正在试图模仿 Go 的一些优秀语法特性,以保持其相关性。而我认为这是不受欢迎的观点的地方在于,我可以想象一种情况,Python 通过偷取一些不错的点子,继续充当懒人用的脚本语言,从而在编程语言市场份额上进一步占据主导地位。
Natalie Pistunovich: 那如果你要将这个观点总结成一条可以投票的推文,你会怎么写?
Juan Andrés Guerrero-Saade: 如果我必须用 140 字来发推,那就是:“Python 3.11 将会干掉 Go。”
Johnny Boursiquot: 好的。
Natalie Pistunovich: 这很可能会在“不受欢迎的观点”排行榜上排名靠前……
Juan Andrés Guerrero-Saade: 是啊,我的意思是,这超级不受欢迎。我并不是完全赞同这个观点,但我想说的是---
如果你只是偷点点子,然后这个大多数人用来随便写点脚本、应付点事情的懒人编程语言,突然拥有了 Go 的一些不错的特性,人们就会说:“我还是待在这里吧,直到我准备好真正成为一个优秀的开发者。在此之前,我就这么悠闲地待着吧。”对吧?
Natalie Pistunovich: AI 会改变这一切,我们得再做一期播客聊这个话题。我们几乎还没开始深入探讨这个话题,但我们确实计划要聊的。Ivan,你有什么不受欢迎的观点吗?
Ivan Kwiatkowski: 是的,我试着想了一个,但它跟编程完全是两个领域的事情……所以让我现在有点感觉不合适。但是,总之……嗯,我想到的观点是,其实我不认为有什么“自由意志”这种东西。我认为你所想过的一切,以及你将来会做的一切,实际上都是你大脑中化学过程的结果,而这些过程是由你大脑在前一毫秒的状态决定的。从这个意义上讲,除非你能向我证明存在某种灵魂或精神之类的东西,否则我无法指出“自由意志”应该存在的具体位置。
Juan Andrés Guerrero-Saade: 你切入的范围好广啊,兄弟……
Ivan Kwiatkowski: 哦,是的,确实很广。抱歉。
Juan Andrés Guerrero-Saade: 这就是安全领域的工作对人的影响。[笑声]
Ivan Kwiatkowski: 还有 JavaScript。
Johnny Boursiquot: 哇哦。[笑] 他就像是在说:“接下来我再扔一个重磅炸弹……”
Juan Andrés Guerrero-Saade: “我们没有自由意志,而且 Java 完蛋了。”对吧?[笑声]
Johnny Boursiquot: 在他脑海里,这两件事是有联系的。这真是太有意思了。
Juan Andrés Guerrero-Saade: 我们接受这个观点。彻底的虚无主义,兄弟……
Johnny Boursiquot: 我的“不受欢迎的观点”是---
我有一个不好的习惯,总以为我的观点不受欢迎,但最后它们却很受欢迎……除了有一次,我的观点确实不受欢迎。不过,不管怎么说,我的观点是:我认为随着这些能够理解和生成语言的生成式 AI 工具的出现,尽管使用这些工具的门槛很低……我是一个 GitHub Copilot 的付费用户,我用它,而且我很喜欢它……这些工具可能会让编写代码变得更容易、更快,但责任仍在你,开发者自己身上。
我觉得我们正进入一个时代,在这个时代你要学的不是如何写代码,而是如何校对代码。因为如果你可以让机器模型为你生成代码,那么你要做的唯一事情就是验证它是否正确。现在,我发现我从 GitHub Copilot 这样的工具生成的代码中,大约有 50% 需要调整,因为它并不完全符合我的需求……但这仍然意味着有 50% 的代码我不需要自己敲,对吧?所以它确实对我有帮助,也确实提升了我的生产力,我也很乐意付费使用它……但理解它生成的内容的责任仍在开发者自己身上。对我来说,这就像过去我学习网站工作原理时会查看“查看源码”一样……类似的情况是你可以从云端获取源码,但理解 HTML 标签是什么,<p>
标签是做什么的,<img>
标签是做什么的,如果我给某个标签添加一个属性,它会有什么作用---
这些仍然是你需要去理解的东西。就算有了这些工具,你仍然需要理解你所得到的内容。
因此,仅仅因为你有了工具,并不意味着所生成代码的责任,包括生产力的提升或者使用这些代码造成的混乱,最终都依然是由你来负责的。如果你作为开发者提交了生成的代码,却没有验证它、校对它、修正它,我会对你更严厉。相比之下,如果你自己写了代码,我会更宽容,因为我知道这是“人为错误”,也许我们需要更好的代码审查实践和其他机制。但如果你只是盲目地生成代码、提交、上线,那么我会对你更严厉。
Juan Andrés Guerrero-Saade: BuzzFeed 的标题几乎都写好了:“某个开发者随便提交了一段 ChatGPT 生成的代码到 Google 3,导致广告系统瘫痪了 45 分钟。”你可以预见到这种懒惰可能带来的后果……我觉得你是对的。而且有趣的是,我看到一些开发者在 YouTube 上……我仍然会看那些真正会编程的人的视频,尽管我自己不会……他们会谈到“哦,Copilot 提升了我的生产力。”但与此同时,你还得坐下来解读代码,这也带来了一些负担。
Ivan Kwiatkowski: 欢迎来到我的世界。
Juan Andrés Guerrero-Saade: 是的,完全正确。这就是我们每天的工作,完全没有问题。我不知道你怎么样,Ivan,但就我个人而言,我其实并没有写多少代码。大部分时间我都在尝试解读代码。所以如果有一个工具能为我生成 70% 有用的代码,我只需要在这个基础上套模板……对我来说,这已经是一个巨大的帮助了。不过,我不确定这对那些更专注于代码生成的人来说,会如何影响他们的日常工作、习惯和流程,和我们相比可能会有很大不同。
Ivan Kwiatkowski: 是啊。不过,从我的角度来看,Johnny 的观点似乎非常受欢迎。
Johnny Boursiquot: 我就说过嘛……[笑]
Ivan Kwiatkowski: 我怎么也无法想象,有人因为粘贴了 StackOverflow 或 GitHub Copilot 上的代码导致出了问题,然后抱怨,最后却在 Reddit 或 Twitter 上获得正面回应。我觉得这根本不可能发生。
Juan Andrés Guerrero-Saade: 我想起来我原本的“不受欢迎的观点”是什么了,但实际上我很高兴自己忘了……我觉得我们还是算了吧。
Johnny Boursiquot: 哦……!
Juan Andrés Guerrero-Saade: 就让 Natalie 来吧---
Johnny Boursiquot: 让“沉睡的狗”继续沉睡吧……
Juan Andrés Guerrero-Saade: 我没事的,不需要收到那些仇恨邮件。没必要。
Natalie Pistunovich: 那我的不受欢迎观点是关于音乐的,特别是 Eurovision(欧洲歌唱大赛)。它还有点背景故事。去年,有一个乐队---
Ivan Kwiatkowski: 你也冒犯到他们了吗?哦,你要开始了。
Natalie Pistunovich: 不,不,不,我很喜欢他们。我很喜欢他们。就是有一个很棒的乐队,叫 Electric Callboy。他们最初的名字是 Eskimo Callboy,他们申请参加 Eurovision。2022 年的时候,很多人都很喜欢他们……但他们被拒绝了,部分原因是因为这个名字。这也是他们后来改名的原因之一。最后,他们没能成为德国的参赛代表。对于所有美国听众来说,Eurovision 是一个欧洲国家之间举办的音乐比赛,也包括一些额外国家,比如澳大利亚……
Juan Andrés Guerrero-Saade: 它就像《好声音》,但带点民族主义的味道?
Natalie Pistunovich: 它其实是二战后开始的,作为一种“让我们以一种积极的方式嘲笑自己”的活动。所以它总是很华丽、很精彩。比赛一般是在五月左右。获胜的国家会在下一年主办比赛,就这样循环。每年的参赛作品都非常多样,超级有趣。我很喜欢。
所以德国的乐队 Electric Callboy 没能入选,后来有请愿活动要求让他们成为参赛选手。而且德国一般确实会因为请愿有反应,只要有足够多人签署请愿,政府就必须认真对待并讨论。当然,这不是政府的问题,但德国人确实喜欢发起请愿。虽然有请愿活动,但德国 Eurovision 委员会(或负责这个事情的机构)没有接受这个提议……最终他们还是被拒绝了。后来选了另一个参赛作品,那个作品还不错,但成绩非常糟糕,说实话并不适合 Eurovision。如果你问我的话,那首歌并不算 Eurovision 水准。
今年的参赛作品是一个很不错的乐队,我确实知道他们……但感觉就像是去年被拒绝乐队的另一个版本。这可能是我冒犯到他们的地方……我觉得你们不错,但不如 Electric Callboy。现在就是我的不受欢迎观点了。德国在这里犯了一个错误,他们应该在今年纠正,但只是打了个补丁。好了,这就是我的长篇不受欢迎观点。祝你好运把它总结成一句推文。
Juan Andrés Guerrero-Saade: 我试图从屏幕上溜走……就别让我参与这部分了……
Johnny Boursiquot: 哎,如果我们有 Twitter Blue 的话,现在可以在推文里发整本书了……我们会想办法的。
Juan Andrés Guerrero-Saade: 现在你在 Twitter 上基本可以随心所欲了。规则已经不重要了……API 用不了,但花 8 美元你可能还能参观数据中心。
Natalie Pistunovich: 我听说下一集会有道歉?
Juan Andrés Guerrero-Saade: 不不,这次没问题。我们可以接受这个观点。谁知道下次录节目时 Twitter 会不会还在……
Ivan Kwiatkowski: 反正他们也没有公关部门,所以也没人会投诉。[笑声] 这是真的,真的。
Juan Andrés Guerrero-Saade: 噢,天哪……
Johnny Boursiquot: 也许 Elon 会听到你的吐槽,也许 Elon 会出现在节目里……Elon,如果你在听 Go Time---
你应该听,这是很棒的内容,Musk 先生……如果你听到了……
Natalie Pistunovich: 我们知道你有很多公司在用 Go。请加入我们。
Johnny Boursiquot: 是的,来加入我们录一期节目吧。我们很愿意接待你。
Juan Andrés Guerrero-Saade: 我们可以一起抽点东西,然后聊聊 Go,不嘲笑 Twitter。这简直完美。
Johnny Boursiquot: 嗯,某些事情我们可能不能保证,但……一定会很有趣的。
Natalie Pistunovich: 好吧,非常感谢大家的参与。我们还有一些未展开的话题,也许第五期节目会聊到,谁知道呢?祝所有正在听或者之后会听这期节目的人度过愉快的一天……谢谢你,Ivan,谢谢你,Jax,谢谢你,Johnny。
Juan Andrés Guerrero-Saade: 谢谢大家。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。