# 4.5 黑客与攻击 (Hackers & Cyber Attacks)

## 4.5.1 hackers

黑客 (hackers) 是指能凭技术知识闯入计算机系统的人，一些通过寻找并修复软件漏洞使得系统更加安全的黑客被称为是「白帽子」(White Hats)。

相对应的，也有窃取、利用、售卖计算机漏洞和数据的 “黑帽” 人士 (Black Hat Hackers) 。他们或出于好玩与好奇，或是为了钱财而成为网络罪犯，或是通过黑客手段来影响社会舆论或是达到政治目的（即黑客行动主义者，hacktivists）。

## 4.5.2 社会工程学

黑客最常见的入侵方式是通过欺骗别人而非技术手段，这类通过欺骗手段让人泄露机密信息或让别人将电脑系统配置得变得易于攻击的方式称为「社会工程学」(social engineering)。

### 网络钓鱼 (phishing)

网络钓鱼的典型例子是伪造银行发送邮件，点击链接进入冒牌银行官网，输入的账密信息会发送给攻击者，之后对方就可以假冒你的身份来登录网站。

### 假托 (Pretexting)

假托是指攻击者伪装成内部人员通过电话将电脑系统配置得更加容易入侵，其第一通电话会让人进行内部转接使得攻击者看起来像是内部 IT 人员。

通过这种方式只需要事先知道关键员工的名字等信息，就可以以假乱真，使对方降低戒备从而修改配置或是泄露出密码等机密信息。

### 木马 (Trojan horse)

木马是伪装成无害的照片或发票等内容的恶意软件，这些恶意软件有的是会偷取银行凭证之类的数据，有的是会加密文件索要赎金的 “勒索软件” (ransomware)。

## 4.5.3 NAND 镜像 (NAND Mirroring)

若木马或是电话欺骗无法奏效，则攻击者可能会采取暴力尝试来试图进入系统。大多数现代系统会加长等待时间来抵御这种攻击，每次失败就加长等待时间，甚至失败超过一定次数后，完全锁住。

但最近有一种攻破方式「NAND 镜像」可以绕过这种限制，这种方式需要能够物理接触到电脑，先在内存中接上几根线后复制整个内存。在暴力尝试密码出现设备等待重试的情况时，直接用复制好的内存重新覆盖一次，使得可以无限尝试密码而无序等待。

## 4.5.4 缓冲区溢出 (buffer overflow)

### 漏洞利用 (Exploit)

通过系统漏洞来获得某些操作能力和访问权限的远程攻击方式，称为「漏洞利用」，最常见的一种漏洞利用是「缓冲区溢出」 (buffer overflow)。

缓冲区 (buffer) 泛指预留在内存中的一块空间，比如在登录界面输入账密时，这些信息会先记录在缓冲区内再验证是否正确，当输入数据超出缓冲区大小时则出现 “溢出” (overflow)，此时溢出数据会覆盖掉缓冲区前后的相邻数据。

![缓冲区溢出](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2FQGGazgsfEztu6pGyrPw5%2F0.png?alt=media)

这种情况有时只会因重要值被垃圾数据覆盖而导致程序或系统崩溃，有时攻击者可以更巧妙地利用这个漏洞 (bug) 来注入有意义的新值到程序的内存中，比如把 “is\_admin” 的值改成 true 获得管理员权限。有了任意修改内存的能力，黑客可以绕过”登录”之类的东西，甚至使用那个程序劫持整个系统。

应对缓冲区溢出有两种常见方式：边界检查 (bounds checking) 和金丝雀 (canaries)。

### 边界检查 (bounds checking)

边界检查是指在将值复制到缓冲区之前，先检查一下值的长度，许多现代编程语言自带了边界检查的功能。

同时程序也会随机存放变量（比如之前提及的 “is\_admin”）在内存中的位置，使得攻击者不知道应当覆盖内存中的哪部分内容。

### 金丝雀 (canaries)

金丝雀 (canaries) 源于矿工将金丝雀矿井来警告危险的举动，安全领域的 “金丝雀” 是指在缓冲区留有一些不用的空间，通过追踪空间内的值是否发生变化来确认是否受到攻击。

## 4.5.5 代码注入 (injection)

代码注入 (injection) 常用于攻击使用数据库的网站，在登陆界面使用一种流行的数据库 API —— “结构化查询语言”(Structured Query Language, SQL) 中的命令插入输入框内，进而对系统进行破坏性操作。

比如在输入用户名的地方写入 “whatever; drop table users”，系统会先查询 whatever 这个用户，接着执行命令 “drop table users” (SQL 命令通过 ； 分隔)，使得攻击者在未入侵系统的情况下删除了全表。

![代码注入](https://275040345-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FycDQGvckh16RY095vh62%2Fuploads%2Fg72ba91rUm9BhoNHTKeo%2F1.png?alt=media)

即使没有正式访问权限，还是可以通过代码注入来利用 bug 来制造混乱。如果指令更复杂一些也许可以添加新记录到数据库，比如新建一个管理员帐户，甚至可以让数据库泄露数据，使得黑客能够窃取信用卡号码，社会安全号码以及各种其他信息。

如今几乎所有服务器都会防御这种手段，比如通过不允许输入分号或括号等特殊字符来作为第一道防御，再比如通过修改或删除特殊字符来清理输入后再放入数据库查询语句中。

## 4.5.6 零日漏洞

可行的系统「漏洞利用」(Exploits) 通常会被放置在网上售卖，若该漏洞十分流行或造成的危害很大，则售价越高。有时甚至政府也会购买漏洞利用，使得他们可以通过入侵系统实现间谍活动。

若软件制造者不知道软件有新漏洞被发现了，则称该漏洞为「零日漏洞」(a zero day vulnerability)。黑帽子们会抢在白帽子们做出补丁之前尽可能的利用漏洞来获利，因此保持系统更新非常重要，很多更新都是安全性补丁。

## 4.5.7 僵尸网络

当有足够多的电脑存在漏洞，使得恶意程序可以在电脑刺激互相传播，这种恶意程序被称为「蠕虫」(worms)。

当攻击者利用蠕虫拿下了诸多电脑，则可以组成「僵尸网络」(botnet) 来进行大规模攻击，比如发送大量垃圾邮件、用别人电脑的计算能力和电费挖 Bitcoin、发起”拒绝服务攻击” (DDoS) 来攻击服务器等。

现在，网络攻击每年损害全球经济差不多 5000 亿，这个数字正在日益渐增。许多专家预测下一次的大战会是网络攻击，因为越来越多的基础设施变得数字化，其造成的伤亡甚至会高于传统战争。
