计算机科学入门
上次我们讲了计算机安全的基础知识,包括各种原则和技术。
但尽管尽了最大努力,新闻上还是各种,个人,公司,政府被黑客攻击的故事。
那些黑客凭技术知识闯入计算机系统,不是所有黑客都是坏人,有些黑客会寻找并修复软件漏洞,让系统更安全。
他们经常被公司和政府雇来做安全评估,这些黑客叫 白帽子
(White Hats),也叫 白客 ,他们是从事正当行业的黑客,被称为网络守护神。
另一方面,也有 黑帽
黑客,他们窃取,利用和销售计算机漏洞和数据。
黑客的动机有很多种,有些是好玩和好奇,而网络罪犯一般是为了钱,还有的叫 黑客行动主义者
(hacktivists) ,通过黑客手段影响社会或达到政治目的。
这只是冰山一角,一般对黑客的刻板印象是,某个不受欢迎的小孩在黑暗的房间里,到处都是吃完的比萨盒,这个印象是错的,形容约翰·格林的宿舍还更贴切些。
今天,我们 不会 教你如何成为黑客,而是讨论一些入侵原理,给你一个大概概念。
常见攻击方式
黑客入侵最常见的方式,不是通过技术,而是 欺骗 别人,这叫 社会工程学
(social engineering),欺骗别人让人 泄密 信息,或让别人配置电脑系统,变得易于攻击。
钓鱼网站
最常见的攻击是网络钓鱼,你可能见过,银行发邮件叫你点邮件里的链接,登陆账号,然后你会进入一个像官网的网站,但实际上是个假网站,当你输入用户名和密码时,信息会发给黑客,然后黑客就可以假扮你登陆网站。
即使成功率只有 1/1000 ,发一百万封钓鱼邮件,也有一千个帐户中招。
假托
另一种方法叫 假托
(Pretexting),攻击者给某个公司打电话, 假装 是 IT 部门的人,攻击者的第一通电话一般会叫人 转接 ,这样另一个人接的时候,电话看起来像内部的,然后让别人把电脑配置得容易入侵,或让他们泄露机密信息,比如密码或网络配置。
只要预先做一点研究,攻击者可以装得很像真的,比如关键员工的名字,也许要 10 通电话才能找到一个受害者,但只要一个人上当就够了。
木马
要输入用户名和密码邮件里带 木马
(trojan horses)也是常见手段,木马会 伪装 成无害的东西,比如照片或发票,但实际上是恶意软件。
出自古希腊历史典故《木马计》。
恶意软件有很多种,有的会偷数据,比如银行凭证,有的会加密文件,交 赎金 才解密,也就是 勒索软件
(ransomware)。
如果攻击者无法用木马或电话欺骗,攻击者只能被迫用其他手段,方法之一是 暴力尝试
,我们上次讨论过,尝试所有可能的密码,直到进入系统。
大多数现代系统会加长等待时间,来抵御这种攻击,每次失败就 加长 等待时间,甚至失败超过一定次数后,完全锁住。
NAND 镜像
最近出现一种攻破方法叫 NAND 镜像
,如果能 物理接触 到电脑,可以往内存上接几根线,复制整个内存,复制之后,暴力尝试密码,直到设备让你等待,这时只要把复制的内容 覆盖 掉内存,本质上重置了内存,就不用等待,可以继续尝试密码了,这项方法在 iPhone5C 上管用,更新的设备有机制阻止这种攻击。
漏洞利用
如果你无法物理接触到设备,就必须远程攻击,比如通过 互联网 。
远程攻击一般需要攻击者利用 系统漏洞 ,来获得某些能力或访问权限,这叫 漏洞利用
(Exploit)。
缓冲区溢出
一种常见的漏洞利用叫 缓冲区溢出
(buffer overflow), 缓冲区
是一种概称,指 预留的一块内存空间 ,我们讨论过存像素数据的视频缓冲区。
举个简单例子,假设我们在系统登陆界面,要输入用户名和密码,在幕后,系统用缓冲区存输入的值。
假设缓冲区大小是 10,两个文本缓冲区看起来会像这样:
当然,操作系统记录的远不止用户名和密码,所以缓冲区前后肯定有 其他数据 ,当用户输入用户名和密码时,这些值会复制到缓冲区,然后验证是否正确。
缓冲区溢出
正如名字所暗示的:它会溢出缓冲区。
在这个例子中,超过十个字符的密码,会 覆盖 掉相邻的数据,有时只会让程序或系统崩溃,因为重要值被垃圾数据覆盖了。
系统崩溃是坏事,但也许恶作剧黑客就只是想系统崩溃,当个讨厌鬼,但攻击者可以更巧妙地利用这个 漏洞
(bug) ,注入有意义的新值到程序的内存中,比如把 is_admin
的值改成 true
。
有了任意修改内存的能力,黑客可以绕过 登录
之类的东西,甚至使用那个程序劫持整个系统。
边界检查
有很多方法阻止缓冲区溢出,最简单的方法是,复制之前先检查长度,这叫 边界检查
(bounds checking)。
许多现代编程语言自带了边界检查,程序也会随机存放变量在内存中的位置,比如我们之前假设的 is_admin
。
这样黑客就不知道应该覆盖内存的哪里,导致更容易让程序崩溃,而不是获得访问权限。
金丝雀
程序也可以在缓冲区后,留一些不用的空间,然后 跟踪 里面的值,看是否发生变化,如果发生了变化,说明有攻击者在乱来。
这些不用的内存空间叫 金丝雀
(canaries),因为以前矿工会带,金丝雀下矿,金丝雀会警告危险。
代码注入
另一种经典手段叫 代码注入
(injection),最常用于攻击用数据库的网站,几乎所有大网站都用数据库,我们这个系列中不会讲解数据库,所以以下是个简单例子。
我们会用 结构化查询语言
(Structured Query Language),也叫 SQL ,一种流行的数据库 API 。
假设网页上有登录提示,当用户点击 登录 时,值会发到服务器,服务器会运行代码,检查用户名是否存在,如果存在,看密码是否匹配,为了做检查,服务器会执行一段叫 SQL查询
的代码。
看起来像这样,我们提交 username
和 password
后,服务器会去数据库里查数据,如果有匹配到的数据,那么就说明账号密码相匹配,也就可以登录。
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123';
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123';
注意,在引号中是我们在浏览器中输入的,如果我们输入 socks123' OR ‘1’ = ‘1
会怎么样?
这样一来 SQL 语句会变成:
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123' OR ’1‘ = ’1';
SELECT * FROM user WHERE username = 'phibin' AND password = 'socks123' OR ’1‘ = ’1';
我们知道 OR
只需要 一边 为真,则整体为真,因此这样一来,即使是输入错误的密码,一样会登录成功。
像这样注入错误的 SQL 的攻击方式被称为 SQL 注入
,但现在的 SQL 语句在被执行前会进行 预编译
,这个我们以后再讲。
如今几乎所有服务器都会防御这种手段,如果指令更复杂一些,也许可以添加新记录到数据库,比如一个新管理员帐户,甚至可以让数据库泄露数据,使得黑客窃取信用卡号码,社会安全号码,以及各种其他信息。
就像 缓冲区溢出
攻击一样,应该总是假设外部数据是危险的,应该好好检查,很多用户名和密码表单,不让你输入特殊字符,比如分号或者括号,作为第一道防御。
好的服务器也会 清理输入 ,比如修改或删除特殊字符,然后才放到数据库查询语句里。
管用的 漏洞利用
(Exploits)一般会在网上贩卖或分享,如果漏洞很流行,或造成的危害很大,价格会越高,或者名气越大,有时甚至政府也会买漏洞利用,让他们侵入系统做间谍工作。
零日漏洞
当软件制造者不知道软件有新漏洞被发现了,那么这个漏洞叫 零日漏洞
(zero day vulnerability),黑帽黑客经常赶时间,抢在白帽程序员做出补丁之前,尽可能利用漏洞,所以保持系统更新非常重要,很多更新都是安全性补丁。
蠕虫和僵尸网络
如果有足够多的电脑有漏洞,让恶意程序可以在电脑间互相传播,那么叫 蠕虫
(worms)。
如果黑客拿下大量电脑,这些电脑可以组成, 僵尸网络
(botnet)。
可以用于很多目的,比如发大量垃圾邮件,用别人电脑的计算能力和电费挖比特币,或发起 拒绝服务攻击
简称 DDoS ,攻击服务器。
DDoS 就是僵尸网络里的所有电脑发一大堆 垃圾信息 ,堵塞服务器,要么迫使别人交钱消灾,或纯粹为了作恶。
尽管白帽黑客非常努力工作,漏洞利用的文档都在网上,编写软件有很多"最佳实践",网络攻击每天都在发生,每年损害全球经济差不多 5000 亿,并且随着我们越来越依赖计算机系统,这个数字只会增加。
这使得政府非常担心,因为基础设施越来越电脑化,比如电力厂,电网,交通灯,水处理厂,炼油厂,空管,还有很多其他关键系统,很多专家预测下一次大战会主要是 网络战争 。
国家不是被物理攻击打败,而是因为网络战争导致经济和基础设施崩溃,也许不会发射一颗子弹,但是人员伤亡的可能性依然很高,甚至可能高于传统战争。
所以大家都应该知道一些方法保证网络安全,全球社区因为互联网而互相连接,我们应该确保自己的电脑安全,抵御其他想做坏事的人。