当程序员变身为黑客,现役程序员表示:我太难了!

作者 | Tyler Elliot Bettilyon

译者 | 刘志勇

策划 | Tina

常言道:“未知攻,焉知防”。知彼知己者,百战不殆;不知彼而知己,一胜一负;不知彼,不知己,每战必殆。黑客所要攻破的任何目标,无论是网站、软件还是物联网硬件产品,这些都是由程序员开发的,所以,他们要攻破的其实就是程序员的安全思维缺陷。如果黑客本身就是程序员呢?他们就会从程序员的角度入手,去挖掘漏洞。况且现在很多开发人员其实并没有经过正规安全培训。

今天,尽管网络安全从未如此重要,但在很大程度上,它对于其他领域的人来说是神秘的。

黑客的故事,都很令人着迷,比如一个孤胆黑客,仅凭借一台计算机和一颗脑袋就干掉了坏人,或者欺骗了坏人。无可否认的是,黑客的原型具有一种培养出来的精神气质:自由精神、个性和微妙的诡诈。从 20 世纪 90 年代的经典电影片《黑客》(Hackers)到更现代(也更现实)的美国电视连续剧《黑客军团》(Mr. Robot),长久以来,黑客在流行文化中占据着特殊地位。

随着软件行业继续“吞噬世界”,软件安全行业也随之发展。随着部署的软件越来越多,越来越多的软件容易受到攻击也就在情理之中了。事实上,越来越多的专业人士开始担心,网络安全公司人手严重不足,几乎没有足够的人手来应对日益增多的网络攻击。更糟糕的是,软件开发人员加速培训计划的持续推进,而这意味着更多的开发人员正在部署没有经过任何正规安全培训的代码。

众所周知,“物联网”上的设备不安全。

安全基础知识的缺失一直是个问题:许多高校在计算机科学学位课程中并不要求安全培训,但由于学校鼓励开发人员用较少的培训来做更多的工作,结果导致了这个问题进一步恶化。

此外,软件生态系统越来越鼓励开发人员严重依赖第三方软件,他们往往没有评估该软件的漏洞。2016 年的“left-pad 库”事件让我们看到,对第三方软件越来越多的依赖是如何让互联网面临风险的。

1 “left-pad 库”事件

left-pad 是一个简单的程序,它可以用某些字符(通常是 0 或空格),来“填充”左侧的文本值,直到它达到指定的大小为止。这个函数主要用于格式化文本输出,使其更容易阅读。实现很简单;在这一事件发生时,该函数只有 11 行简单的 JavaScript 代码。然而,有成千上万的开发人员在他们的代码中包含了这个库,他们中的许多人在不知情的情况下包含了一个包含 left-pad 的不同库。

这一事件始于一个名为 npm 的流行 JavaScript 库管理工具中取消了 left-pad 库。当时,所有依赖 left-pad 的项目都崩溃了。所有依赖于依赖 left-pad 的项目的那些项目也都崩溃了。对于 JavaScript 社区来说,这是一个巨大的麻烦,也让许多业余爱好者和公司暂时停止了开发。

从安全角度来看是这样的:如果 left-pad 的维护者没有取消发布库,而是增加一个这样“功能”:将 left-pad 的填充信息记录发送到他们控制的服务器上,或者更糟糕的是,如果是试图安装一些更全面的监控恶意软件呢?如果库只有一个小小的 Bug,可以被聪明的黑客加以利用,那会不会有那么恶意呢?

因为有那么多人在不知情的情况下依赖于代码,这种漏洞利用很容易被下游开发者忽视。这种相互依存的软件网络是软件生态系统日益复杂的一种方式,它放大了小漏洞的威力。

2 简单的错误可能会导致灾难性问题

去年,《大西洋》(the Atlantic)杂志发表了一篇文章《The Coming Software Apocalypse》(《正应验的软件启示录》),该文对现代软件的异常复杂性以及隐藏在复杂性中的简单错误如何导致灾难性问题进行了令人痛心的审视。要我举个例子吗?整个华盛顿州发生了长达 6 小时的停电事件,导致 911 报警热线电话停机,无法响应呼叫:

911 停机事件是当时报道的有史以来最严重的停机事件,其起因可追溯到位于科罗拉多州恩格尔伍德市的一台服务器运行的软件。该服务器由一家名为 Intrado 的系统供应商运营,它一直在运行一个计数器,记录有多少电话已经转到全美各地的 911 调度员那里。Intrado 的程序员为计数器可以记录的数量设置了阈值。他们选了一个数百万的数字。

4 月 10 午夜前不久,计数器的数值就超过了这个阈值,结果引发了混乱局面。因为计数器是用来为每个电话呼叫生成一个唯一的标识符,因此后面来的新电话呼叫就被拒绝了。而且,程序员没有预料到会发生这个问题,他们也就没有创建警报来引起人们注意这一问题。

虽然这次 911 停机事件不是协同攻击(Coordinated attack)的结果,但我们很容易把这个漏洞想象成《Ocean’s Eleven》电影(大陆:《十一罗汉》、香港:《盗海豪情》、台湾:《瞒天过海》)风格的蒙太奇画面的一部分:黑客们在实施大规模抢劫之前,会设法让数值突破上限,这样,就可以在他们脱身之前阻止有关抢劫的报道。这是一个普通的错误,在一般情况下,很容易得到原谅,但如果是拒绝 911 电话呼叫的话,可能会带来悲惨的可怕后果。

防范和防止这种类型的故障,绝对是软件安全专业人员的工作范围。思考任何软件所有可能出现的故障模式,对系统加固和风险缓解都是至关重要的。然而不幸的是,像为数据库条目设置任意阈值这样的小错误可能会产生巨大的人为影响,而软件世界中遍地到处都是小错误(还记得千年虫问题吗?)

让我们来看看另一个例子,黑客能够利用“鱼缸智能温度计”来窃取赌场的豪赌者数据库。在这种情况下,与赌场网络的其他入口点相比,温度计更不安全。事实上,“物联网”上的设备就是出了名的不安全。据《连线》(Wired)杂志报道,这类设备经常容易受到攻击,原因多种多样,包括设备制造商缺乏对安全的承诺、设备上运行的代码缺乏透明度,以及使用和安装这些设备的人缺乏相关知识。

为享受用智能手机来关灯的便利,冒着网络攻击的风险,这值得吗?

安装“智能温度计”的员工并不是软件安全专家,这是可以理解的(老实说,这也是预料之中的)。即使是许多精通软件的人没有将温度计视为攻击载体,也是情有可原的。然而不幸的是,每一个联网的设备都会让我们容易遭受攻击。我们需要设备制造商开始认真对待安全问题。此外,人们应该明智地仔细考虑他们从“智能”设备和“愚蠢”设备中获得了多少价值。为了享受用智能手机关灯的便利而冒着网络攻击的风险,值得吗?

3 黑客、渗透测试人员和政府特工

首先是最知名的原型。攻击性安全工作就像“破门而入”,做一些你不该做的事情。任何一个攻击性黑客的特定目标都可能有很大的不同,从执行勒索软件攻击(如 WannaCry)到窃取数据库记录,但这项技术的关键始终无非是关乎这样的一个问题:“我能做什么?这个系统的所有者不想让我做什么呢?”

有时,这项工作涉及到软件设计和实现的深层知识。以最近一次针对加密货币交易网站 MyEtherWallet.com 的攻击事件为例。在这次攻击中,黑客利用了两个关键网络协议的薄弱点。首先,黑客攻击了域名系统(Domain name system,DNS),该系统将人类可以理解的名称(如 MyEtherWallet.com)映射到计算机可以理解的 IP 地址,这些 IP 地址用于路由互联网流量。这种称为域名服务器投毒(DNS poisoning)的攻击,允许黑客能够发送伪造的 IP 地址来响应 MyEtherWallet.com 的查询。

其次,黑客攻击了边界网关协议(Border gateway protocol,BGP),该协议使用 IP 地址,实际控制如何通过互联网的物理基础设施路由流量。这种称为 BGP 泄漏(BGP leak)的攻击,导致互联网流量通过受感染的计算机传播,从而使攻击者能够毒害更多的 DNS 查询。

结果,一些在浏览器地址栏输入 MyEtherWallet.com 的用户被发送到一个看起来像 MyEtherWallet.com 的钓鱼网站。当毫无戒心的用户在钓鱼网站输入自己的用户名和密码时,这些信息就会发送给攻击者,然后他们使用这些信息来清空这些账户。

其他的攻击性工作可以更加人性化。就拿这段搞笑(但也恐怖)的视频来说吧,一位社会工程专家仅仅用了一个电话号码欺诈器(Phone number spoofer)、一段婴儿哭泣的音频以及个人魅力,就接管了某人的手机账户:

嗨,您好。不,这不是我的账户,啊,我的孩子哭了……您能帮帮我吗?

入侵系统需要黑客有创造力、灵活性和全局观。黑客,无论是白帽黑客、黑帽黑客,还是介于这两者之间的黑客,都能从思考多种入侵系统的选择中获益。以入侵电话账户为例 ,攻击者可能会尝试暴力破解(Brute force)来获取他们的目标密码。他们可能会使用类似针对上述 MyEtherWallet 的钓鱼攻击(Phishing scheme)。他们也可能会尝试像上面视频里的社会工程策略。他们还有可能会尝试使用恶意软件主动入侵电话公司的网络。

当一个入侵策略看起来不起作用时,攻击者就会尝试其他策略。震网病毒(Stuxnet)和火焰病毒(Flame)的故事就很能说明问题。这两个程序是有史以来最令人印象深刻、也是最为复杂的恶意软件。据信,这两个蠕虫病毒是由为美国和以色列政府工作的黑客从 2007 年开始合作创建的。震网病毒是一种蠕虫病毒,它有一个特定的目标:感染并关闭伊朗的核设施离心机。火焰病毒,以恶意软件标准衡量,是一个巨大的程序,大约有 60MB,更像是一把从事间谍活动的瑞士军刀。一旦主机感染这个恶意软件,控制者就能窃取数据、监控按键输入、打开摄像头和麦克风,并打开远程通道以便安装更多的恶意软件。

最初让安全专家认为这两种蠕虫是同一个创建者的原因是它们的特征:病毒用来传播自己的机制。火焰病毒利用了一个针对 Windows 更新服务器的漏洞,使病毒能够伪装成合法的系统更新,这显然是一种将蠕虫病毒广泛传播的有效方式。

另一方面,震网病毒针对的目标是一个已知采取内外网之间物理隔离措施的设施——这意味着该设施中的所有计算机都没有连接到互联网。震网病毒依靠的是一个这样的漏洞,允许被感染的 U 盘自动感染它们所插入的任何 Windows 计算机。没有人知道谁是所谓的“零号病人”,但据我们所知,国家安全局的特工在伊朗核设施的停车场周围“散落”了几个受感染的 U 盘。

火焰病毒使用了这种完全相同的 USB 漏洞,这也是安全专家最初将这两种病毒联系在一起的发现之一,但震网病毒似乎没有利用 Windows 更新服务器的漏洞。震网病毒的创建者知道他们无法通过这种方式来入侵与互联网隔离的系统,所以他们没有利用这种漏洞来传播病毒。另一方面,虽然震网病毒总是试图感染插入受感染计算机上的 U 盘并进一步传播自己,但火焰病毒却关闭了这个功能。火焰病毒并没有像震网病毒那样,将自己复制到新的 U 盘上。

由于时下安全问题已经成为整个计算机系统的重中之重,因此让系统安全的责任就落在了最了解系统的人身上。

关键是,即使火焰病毒和震网病毒的创建者可以利用相同的漏洞来传播恶意软件,但他们并没有把所有的漏洞都拿出来加以利用,看看哪些漏洞会被拦截。他们经过仔细思考,根据自己的目标决定使用哪些漏洞。

在政府部门工作,能够制造像火焰病毒和震网病毒这样的恶意软件的人,就是黑客界的 NBA:少数杰出的黑客从事这类工作。还有其他一些人在从事类似的工作,但他们的专业知识较少,而且他们所从事的工作的利害关系也不像网络战那么极端。

渗透测试人员是公司花钱雇佣的黑客,让他们试图入侵公司自己的系统。公司付钱让黑客报告他们是如何入侵公司系统的,这样他们就可以加固自己的系统。另一类黑客,介于渗透测试人员(白帽黑客)和恶意黑客(黑帽黑客)之间,他们是试图从许多公司提供的“Bug 赏金计划”中获利的个人。通过 Bug 赏金计划,公司同意向任何能够对其系统进行特定操作(比如访问数据库)的人支付报酬,以换取黑客解释他们是如何做到的。

渗透测试人员所做的大部分工作都依赖于使用预制工具来执行攻击测试。他们是工具的使用者,而不是工具的创造者。许多工具仍然需要一些技术专业知识来操作,但不需要那么多。渗透测试人员可能是程序员或软件工程师,也可能不是,但他们几乎都是熟练的计算机用户,他们喜欢学习新技术和新兴工具集。

由于所需的技能在很大程度上取决于具体的目标,因此,进攻性工作的范围是广泛而多样的。从技术含量最低的社会工程到技术含量最高的恶意软件、加密破解程序和网络入侵工具的开发。

4 缓解与防范

缓解和防范都与防御有关:构建系统,让黑客难以做他们不应该做的事情。从事这类工作的人往往是技术性很强的。软件工程师,尤其是在系统级工作的工程师,承担了这项工作的很大一部分。

也就是说,系统管理员、DevOps 工程师和网络工程师都会参与一些缓解 / 防范项目。应用开发者也必须做一些这方面的工作,特别是要修补他们所构建的应用程序引入的安全漏洞。这种工作正逐渐从应用工程师转移到系统工程师。操作系统工程师定义应用程序开发人员用来访问重要内容的接口,比如文件系统或网卡上的文件。因为安全性现在是计算机系统的头等大事,所以默认情况下,确保系统安全的责任就落在了最了解系统的人身上。Windows 操作系统团队最了解 Windows 是如何工作的,因此,他们最清楚如何防止在操作系统级别发生严重的入侵。换句话说,一个优秀的操作系统应该让应用程序工程师很难引入安全漏洞。

大型组织都有专门的软件团队致力于创建 API,这些 API 本质上是安全的,可以供应用开发者使用。通过限制应用开发者只能做出“安全”的选择,我们就可以大幅降低总体攻击面。例如,Google 在 4 月份宣布,Android 操作系统现在默认所有连接都采用 TLS,这意味着互联网连接在默认情况下是加密的。

使用未加密的连接显然会带来隐私风险,而默认使用 TLS 可以防止 Android 用户全面暴露在这种风险之下。在之前的版本中,应用开发者要确保连接被正确加密。通过防止应用开发者意外做出 "错误的决定",Google 消除了各种潜在的攻击载体。

软件组织需要认真对待构建安全软件系统的意识、培训和执行。

软件的激增和潜在攻击者数量的增加,给各类开发人员带来了压力。显然,如果应用程序开发人员能够做到不造成安全漏洞,那将是极好的,因为操作系统工程师已经堵住了所有可以将得到的漏洞,但这想法是不现实的。因此,应用程序开发人员及其管理团队需要在整个软件开发生命周期中更加注意安全实践。

现在,人们想进入编程领域的方式比以往任何时候都要多,但其中大多数(包括许多高校学位课程)完全没有关注如何设计安全的软件。软件组织需要认真对待构建安全软件系统的意识、培训和执行。

软件中不可避免的漏洞使得软件开发下游的安全实践也成为必要。系统管理员等 IT 专业人员也会执行缓解和防范任务,例如,设置安全的 VPN 以限制对重要内部服务器或数据库的访问、选择一家在安全方面投入大量资源的云提供商,以及设置监控和日志记录工具,以便在网络上的设备出现异常行为或发送可疑流量时通知参与方。

日常计算机用户也应该采取缓解措施,希望通过选择强密码、最大限度地减少密码重用、使用双因素身份验证,并使用注重隐私 / 安全性的软件,如 EFF 的 HTTPS Everywhere、Brave Web 浏览器或 Keybase。

就像“现实生活”中的安全措施一样,防范通常是一场比别人更不容易受到侵害的游戏。试想一下,一辆未上锁的车比一辆上锁的车更容易被抢,不是吗?扒手会寻找从裤子后面口袋露出来的钱包。入室盗窃者会避开狗吠和警报系统。数据窃贼在诉诸穷举暴力攻击之前,会先尝试常用密码。黑客在网络中寻找薄弱点(比如鱼缸智能温度计)。有一样东西是黑客们喜欢的——就像打开了一扇门——那就是过时的软件

黑客们希望将时间和精力花在破解一些能让他们访问很多机器的东西上,如果能在一个主要的操作系统、网络服务器平台或加密库中找到一个缺陷,那将是一只会下金蛋的鹅。当发现这样的缺陷时,有缺陷系统的安全团队就会做出反应,发布更新来堵住漏洞。保持更新是注重安全的 IT 经理工作的一个关键方面。

最后,由于安全工作的性质日新月异,在红队对蓝队的演习中,攻防双方通过交换进行交叉训练是很常见的。学习如何攻击系统有助于你更好地防御黑客攻击,反之亦然。

5 取证与检测

攻击是不可避免的;取证就是对攻击进行事后调查。比如现在臭名昭著的 2016 年美国民主党全国委员会邮件泄密事件,这些公司都是在事后才被雇佣的。当时雇佣后,要拿回电子邮件已经太晚了,但任何理智的人都会希望:

  • 阻止别人(或同样的人)再次入侵系统。
  • 弄清被盗的东西都有哪些,以及(如果可能的话)。
  • 确定黑客的身份。

理想的情况是,网络攻击的受害者能够比其他人更早知道这一点。与缓解和防范工作相结合,注重安全的工程师和 IT 专业人员通常会在关键的软件系统中添加日志和报告工具。这种报告可能涉及从崩溃报告接收遥测数据,或者记录入站和出站的网络流量。这些报告工作创造了一些线索,数字侦探最终可以利用这些线索来找出某人是如何入侵系统的,哪些东西被泄露或被窃取了,以及问题的潜在范围。

根据不同的情况,取证工作可能涉及到查看数据库访问日志、网络流量日志、在文件系统中搜寻有关入侵的线索,比如恶意软件和被入侵用户创建或更改的文件。这项工作往往是多学科的,黑客很有创造力,他们会使用很多策略来入侵系统,所以数字取证专家需要精通各种策略。

了解更多的安全最佳实践从未如此重要。

对于数字取证的大多数人来说,目标是确定目标数据和 / 或系统,并从这些系统中收集和恢复这些信息,然后分析收集的数据,以确定攻击行为是如何发生的。安全审计的结果最终可能成为诉讼或刑事起诉。数字取证专家得益于对法律和法律程序的理解,以帮助他们知道哪些信息可能与律师、法官和陪审团相关。他们还知道如何以一种不使信息在法庭上不被接受的方式获取信息,这对于 FBI 等机构的数字取证工作来说绝对是至关重要的。

在防范方面,许多工作都是由软件工程师完成的,以确保系统的安全。在取证中,它更多的是关于使用工具和理解全局,而不是编写代码。数字取证专家将编写简单的脚本和程序来帮助他们寻找、收集和保存线索,而且,肯定有人在编写这些工具。但在大多数情况下,取证工作并不涉及软件库的创建或任何大规模的软件工程工作。

6 密码学与加密技术研究

最后一种类型的安全专家也涉及到最多的数学问题。密码学研究人员开发了新的代码、密码算法和加密技术,以确保数据能够以一种保护数据的方式安全存储或传输。密码学是一个严重依赖计算机科学和数学主题的领域。

正是这些人发明了像 RSA 公钥加密过程或 SHA 系列加密哈希函数等算法。这与上述任何其他工作都有本质上的不同。以上所有其他类型的工作都涉及到保护和破解实际存在的系统,它们涉及到实际的电话、实际的数据库和实际的网络服务器。而密码学是关于更抽象地保护数据的安全。

密码学家在很大程度上依赖于数学原理来创建能够以几种关键方式处理数据的算法。具体来说,密码学领域是围绕这五大支柱展开的:

  • 保密性:只有受信任的各方才能读取消息。
  • 完整性:任何人都不能篡改或更改安全数据。
  • 身份验证:可以确认相关各方的身份。
  • 授权:可以为各个受信任方建立不同级别的访问权限。
  • 不可否认性:这样就可以证明收到了一条消息。

传输层安全协议(Transport Layer Security,TLS)是网络通信安全的基础,它涉及到提供认证、保密性和完整性的加密算法。身份验证确保你连接到正确的网络服务器;保密性以确保只有你和该网络服务器可以看到你的通信;完整性确保在消息传输过程中没有人能够改变这些消息。TLS 允许在大部分连接中使用不集中不同的加密算法,但在 TLS 握手过程中需要使用 RSA 进行身份验证并确保保密性。

TLS 实现(如 OpenSSL)的开发人员依赖数学研究人员发明具有所需特性的加密算法。就像应用开发者依靠操作系统工程师为操作系统提供安全的 API 一样,操作系统工程师依赖密码学家发明安全的加密算法。这个层次上的问题会在整个依赖数学的技术中层出不穷,例如,火焰病毒之所以能够通过伪装成合法的 Windows 更新进行传播,就在于一种名为 MD5 的加密哈希算法的错误。

许多密码学家正在研究新的加密算法,以期不受量子计算机的影响。强大的量子计算机有望破解 RSA。如果一台高性能量子计算机出现,RSA 将会变得完全不安全,大量互联网流量将不得不改用后量子密码学的加密算法来代替 RSA。

软件安全是一个巨大的市场,而且正在不断增长,现在是深入其中的最佳时机。如果你已经在软件领域中工作,那么学习更多的安全最佳实践就显得尤为重要。计算机和互联网不会在短期内消失,所以,我们还是不妨想想办法保护这些该死的东西吧!