Skip to content

计算机科学入门

上次我们讲了计算机安全的基础知识,包括各种原则和技术。

但尽管尽了最大努力,新闻上还是各种,个人,公司,政府被黑客攻击的故事。

那些黑客凭技术知识闯入计算机系统,不是所有黑客都是坏人,有些黑客会寻找并修复软件漏洞,让系统更安全。

他们经常被公司和政府雇来做安全评估,这些黑客叫 白帽子 (White Hats),也叫 白客 ,他们是从事正当行业的黑客,被称为网络守护神。

image-20231103152152862

另一方面,也有 黑帽 黑客,他们窃取,利用和销售计算机漏洞和数据。

黑客的动机有很多种,有些是好玩和好奇,而网络罪犯一般是为了钱,还有的叫 黑客行动主义者 (hacktivists) ,通过黑客手段影响社会或达到政治目的。

这只是冰山一角,一般对黑客的刻板印象是,某个不受欢迎的小孩在黑暗的房间里,到处都是吃完的比萨盒,这个印象是错的,形容约翰·格林的宿舍还更贴切些。

今天,我们 不会 教你如何成为黑客,而是讨论一些入侵原理,给你一个大概概念。

常见攻击方式

黑客入侵最常见的方式,不是通过技术,而是 欺骗 别人,这叫 社会工程学 (social engineering),欺骗别人让人 泄密 信息,或让别人配置电脑系统,变得易于攻击。

钓鱼网站

最常见的攻击是网络钓鱼,你可能见过,银行发邮件叫你点邮件里的链接,登陆账号,然后你会进入一个像官网的网站,但实际上是个假网站,当你输入用户名和密码时,信息会发给黑客,然后黑客就可以假扮你登陆网站。

image-20231102163204725

即使成功率只有 1/1000 ,发一百万封钓鱼邮件,也有一千个帐户中招。

假托

另一种方法叫 假托 (Pretexting),攻击者给某个公司打电话, 假装 是 IT 部门的人,攻击者的第一通电话一般会叫人 转接 ,这样另一个人接的时候,电话看起来像内部的,然后让别人把电脑配置得容易入侵,或让他们泄露机密信息,比如密码或网络配置。

image-20231102163259902

只要预先做一点研究,攻击者可以装得很像真的,比如关键员工的名字,也许要 10 通电话才能找到一个受害者,但只要一个人上当就够了。

木马

要输入用户名和密码邮件里带 木马 (trojan horses)也是常见手段,木马会 伪装 成无害的东西,比如照片或发票,但实际上是恶意软件。

出自古希腊历史典故《木马计》。

恶意软件有很多种,有的会偷数据,比如银行凭证,有的会加密文件,交 赎金 才解密,也就是 勒索软件 (ransomware)。

image-20231102163348621

如果攻击者无法用木马或电话欺骗,攻击者只能被迫用其他手段,方法之一是 暴力尝试 ,我们上次讨论过,尝试所有可能的密码,直到进入系统。

大多数现代系统会加长等待时间,来抵御这种攻击,每次失败就 加长 等待时间,甚至失败超过一定次数后,完全锁住。

NAND 镜像

最近出现一种攻破方法叫 NAND 镜像 ,如果能 物理接触 到电脑,可以往内存上接几根线,复制整个内存,复制之后,暴力尝试密码,直到设备让你等待,这时只要把复制的内容 覆盖 掉内存,本质上重置了内存,就不用等待,可以继续尝试密码了,这项方法在 iPhone5C 上管用,更新的设备有机制阻止这种攻击。

漏洞利用

如果你无法物理接触到设备,就必须远程攻击,比如通过 互联网

远程攻击一般需要攻击者利用 系统漏洞 ,来获得某些能力或访问权限,这叫 漏洞利用 (Exploit)。

缓冲区溢出

一种常见的漏洞利用叫 缓冲区溢出 (buffer overflow), 缓冲区 是一种概称,指 预留的一块内存空间 ,我们讨论过存像素数据的视频缓冲区。

举个简单例子,假设我们在系统登陆界面,要输入用户名和密码,在幕后,系统用缓冲区存输入的值。

假设缓冲区大小是 10,两个文本缓冲区看起来会像这样:

image-20231102163521903

当然,操作系统记录的远不止用户名和密码,所以缓冲区前后肯定有 其他数据 ,当用户输入用户名和密码时,这些值会复制到缓冲区,然后验证是否正确。

image-20231102163537997

缓冲区溢出 正如名字所暗示的:它会溢出缓冲区。

在这个例子中,超过十个字符的密码,会 覆盖 掉相邻的数据,有时只会让程序或系统崩溃,因为重要值被垃圾数据覆盖了。

image-20231102163620677

系统崩溃是坏事,但也许恶作剧黑客就只是想系统崩溃,当个讨厌鬼,但攻击者可以更巧妙地利用这个 漏洞 (bug) ,注入有意义的新值到程序的内存中,比如把 is_admin 的值改成 true

有了任意修改内存的能力,黑客可以绕过 登录 之类的东西,甚至使用那个程序劫持整个系统。

边界检查

有很多方法阻止缓冲区溢出,最简单的方法是,复制之前先检查长度,这叫 边界检查 (bounds checking)。

许多现代编程语言自带了边界检查,程序也会随机存放变量在内存中的位置,比如我们之前假设的 is_admin

这样黑客就不知道应该覆盖内存的哪里,导致更容易让程序崩溃,而不是获得访问权限。

金丝雀

程序也可以在缓冲区后,留一些不用的空间,然后 跟踪 里面的值,看是否发生变化,如果发生了变化,说明有攻击者在乱来。

这些不用的内存空间叫 金丝雀 (canaries),因为以前矿工会带,金丝雀下矿,金丝雀会警告危险。

代码注入

另一种经典手段叫 代码注入 (injection),最常用于攻击用数据库的网站,几乎所有大网站都用数据库,我们这个系列中不会讲解数据库,所以以下是个简单例子。

我们会用 结构化查询语言 (Structured Query Language),也叫 SQL ,一种流行的数据库 API 。

假设网页上有登录提示,当用户点击 登录 时,值会发到服务器,服务器会运行代码,检查用户名是否存在,如果存在,看密码是否匹配,为了做检查,服务器会执行一段叫 SQL查询 的代码。

image-20231102164412688

看起来像这样,我们提交 usernamepassword 后,服务器会去数据库里查数据,如果有匹配到的数据,那么就说明账号密码相匹配,也就可以登录。

sql
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123';
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123';

注意,在引号中是我们在浏览器中输入的,如果我们输入 socks123' OR ‘1’ = ‘1 会怎么样?

这样一来 SQL 语句会变成:

sql
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123' OR1=1';
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123' OR1=1';

我们知道 OR 只需要 一边 为真,则整体为真,因此这样一来,即使是输入错误的密码,一样会登录成功。

像这样注入错误的 SQL 的攻击方式被称为 SQL 注入 ,但现在的 SQL 语句在被执行前会进行 预编译 ,这个我们以后再讲。

如今几乎所有服务器都会防御这种手段,如果指令更复杂一些,也许可以添加新记录到数据库,比如一个新管理员帐户,甚至可以让数据库泄露数据,使得黑客窃取信用卡号码,社会安全号码,以及各种其他信息。

就像 缓冲区溢出 攻击一样,应该总是假设外部数据是危险的,应该好好检查,很多用户名和密码表单,不让你输入特殊字符,比如分号或者括号,作为第一道防御。

好的服务器也会 清理输入 ,比如修改或删除特殊字符,然后才放到数据库查询语句里。

管用的 漏洞利用 (Exploits)一般会在网上贩卖或分享,如果漏洞很流行,或造成的危害很大,价格会越高,或者名气越大,有时甚至政府也会买漏洞利用,让他们侵入系统做间谍工作。

零日漏洞

当软件制造者不知道软件有新漏洞被发现了,那么这个漏洞叫 零日漏洞 (zero day vulnerability),黑帽黑客经常赶时间,抢在白帽程序员做出补丁之前,尽可能利用漏洞,所以保持系统更新非常重要,很多更新都是安全性补丁。

image-20231102165209591

蠕虫和僵尸网络

如果有足够多的电脑有漏洞,让恶意程序可以在电脑间互相传播,那么叫 蠕虫 (worms)。

如果黑客拿下大量电脑,这些电脑可以组成, 僵尸网络 (botnet)。

可以用于很多目的,比如发大量垃圾邮件,用别人电脑的计算能力和电费挖比特币,或发起 拒绝服务攻击 简称 DDoS ,攻击服务器。

image-20231102165249565

DDoS 就是僵尸网络里的所有电脑发一大堆 垃圾信息 ,堵塞服务器,要么迫使别人交钱消灾,或纯粹为了作恶。

尽管白帽黑客非常努力工作,漏洞利用的文档都在网上,编写软件有很多"最佳实践",网络攻击每天都在发生,每年损害全球经济差不多 5000 亿,并且随着我们越来越依赖计算机系统,这个数字只会增加。

这使得政府非常担心,因为基础设施越来越电脑化,比如电力厂,电网,交通灯,水处理厂,炼油厂,空管,还有很多其他关键系统,很多专家预测下一次大战会主要是 网络战争

image-20231102165325977

国家不是被物理攻击打败,而是因为网络战争导致经济和基础设施崩溃,也许不会发射一颗子弹,但是人员伤亡的可能性依然很高,甚至可能高于传统战争。

所以大家都应该知道一些方法保证网络安全,全球社区因为互联网而互相连接,我们应该确保自己的电脑安全,抵御其他想做坏事的人。

用心去做高质量的编程学习内容网站,欢迎star ⭐让更多人发现!