三十二、黑客&攻击

在这里插入图片描述
上集讲了计算机安全的基础知识,包括各种原则和技术。本集主要讲黑客的相关知识,讨论一些入侵原理并给你一个大概概念。

社会工程学

黑客入侵的最常见方式不是通过技术,而是通过欺骗别人。这就叫做社会工程学(social engineering),就是一个人被欺骗以泄露自己的信息或者让另外的人配置电脑系统使之变得易于攻击。

钓鱼

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

假托

另外一种方法叫做“假托”(pretexting),攻击者给某个公司打电话并假装是IT部门的人。攻击者的第一通电话一般会叫人转接,这样另一个人接的时候电话号码看起来会像是公司内部的。然后攻击者就会让受害人将电脑配置得易于入侵,或者让受害者泄露机密信息——比如密码和网络配置。

木马

邮件里带木马(trojan horse)也是常见手段,木马会伪装成无害的东西,比如照片或者发票,但实际上是恶意软件。恶意软件有很多种,有的会窃取数据,比如银行凭证;有的会加密文件,交赎金才解密,也就是“勒索文件”。

NAND镜像

如果攻击者无法使用木马或电话进行欺骗,就只能采用其他手段。方法之一是暴力尝试,也就是上集讨论的内容:尝试出所有可能的密码直到进入系统。大多数现代系统都会加长等待时间,来抵御这种攻击,每次失败就加长等待时间,以至于超过一定次数手机就会完全锁住。最近出现一种攻破方法叫做NAND镜像(NAND mirroring)。如果能物理接触到电脑,可以往内存上接几根线来复制整个内存。复制之后暴力尝试密码,直到设备让你等待。这个时候只要把之前复制的内存副本覆盖掉内存,本质上重置了内存,就不用等待,可以继续尝试密码了。这项方法在iPhone 5C上管用,更加新的设备有机制阻止这种攻击。

漏洞利用&缓冲区溢出

如果你无法物理接触到设备,就必须远程攻击,比如通过互联网。远程攻击一般需要攻击者利用系统漏洞来获得某些能力或访问权限,这叫漏洞利用(exploit)。一种常见的漏洞利用叫缓冲区溢出(Buffer Overflow)。缓冲区是一种概称,指预留的一块内存空间。我们在23集讨论过存像素数据的视频缓冲区。举个简单例子,假设我们在系统登陆界面要输入用户名和密码,在幕后系统用缓冲区存储输入的值。在幕后,系统用缓冲区存输入的值。假设缓冲区大小是10,两个文本缓冲区看起来会像这样。
在这里插入图片描述
当然,操作系统所记录的远不止用户名和密码,所以缓冲区的前面和后面的位置肯定要有其他数据。当用户输入用户名和密码时,这些值会复制到缓冲区,用于验证是否正确。
在这里插入图片描述
“缓冲区溢出”正如名字所暗示的,它会溢出缓冲区。在这个例子中超过十个字符的密码就会溢出缓冲区、覆盖掉相邻的数据。有时就会导致系统崩溃,因为重要值被垃圾数据覆盖了。
系统崩溃是坏事,但也许恶作剧黑客就只是想系统崩溃,当个讨厌鬼。而攻击者可以更巧妙地利用这个漏洞(bug),注入有意义的新值到程序的内存中,比如"is_admin"的值改成true,这样就有了任意修改内存的能力。黑客可以绕过“登录”之类的东西甚至使用那个程序劫持整个系统。

边界检查

有很多方法阻止缓冲区溢出。最简单的方法是,复制之前检查长度,这叫做边界检查(bound checking)。许多现代编程语言自带了边界检查,程序也会随机存放变量在内存中的位置,例如我们前面假设的”“is_admin”就可以进行随机存储。这样黑客就不知道应该覆盖内存的哪里,不会获得访问权限。程序也可以在缓冲区后留一些不用的空间并跟踪其中的值,看看是否会发生变化。如果发生了变化,说明有攻击者在乱来。这些不用的内存空间叫金丝雀(canaries),因为以前的矿工会带金丝雀下矿,金丝雀会警告危险。

代码注入

另一种经典手段叫代码注入(code injection),最常用于攻击用数据库的网站。几乎所有大网站都用数据库。我们这个系列中不会讲解数据库,所以仅举一个简单的例子:我们会用结构化查询语言(structured query language,SQL)——一种流行的数据库API,也经常被叫做sequel——查询数据库。
假设网页上有登录提示,当用户点击“登录”时,值会发到服务器,服务器会运行代码,检查用户名是否存在以及密码是否匹配。为了做检查,服务器会执行一段叫SQL查询(sql query)的代码。
在这里插入图片描述
首先,语句要指定从数据库里查什么数据,SELECT password意思是查询密码,FROM users意思是从users表查数据。WHERE表示限定条件,只要符合username='用户名’条件的表数据。SQL命令以分号结尾。
黑客的做法就是将“SQL命令”输入到用户名里面!如下图:
在这里插入图片描述
所以第一条执行的命令就是就是查询username是whatever的用户,因为我们不知道是否有存在这个用户而且也不知道密码,所以服务器会拒绝我们。我们注入了下一个命令drop table users,意思就是删除users这张表。这就导致我们存储所有用户数据的表users直接被删除了,造成损失。我们甚至都没有侵入系统——因为我们甚至没有使用正确的用户名和密码。即使没有正式的访问权限,我们还是可以利用bug来制造混乱。以上就是代码注入的一个简单例子。如今几乎所有服务器都会防御这种手段。但如果我们的攻击指令更加复杂,我们甚至可以添加新纪录进入到数据库——比如一个新管理员账户,或者获得数据库的内容,从而窃取信用卡号码、社会安全号码等信息。
就像缓冲区溢出攻击一样,应该总是假设外部数据是危险的并好好检查。很多用户名和密码表单就不让你输入特殊字符,比如分号或者括号,这样就可以作为第一道防御。好的服务器还会通过修改或删除特殊字符来清理(sanitize)输入,然后才放到数据库查询语句里面。

零日漏洞

可以实现攻击的漏洞利用(exploits)一般会在网上贩卖或分享。一种漏洞越流行,对应的漏洞利用就会越贵。如果软件制造者不知道软件有新漏洞被发现了,那么这个漏洞就会被称为零日漏洞(zero day vulnerability)。黑帽黑客经常赶时间,抢在白帽程序员做出补丁之前尽可能利用漏洞,因此保持系统更新非常重要。

计算机蠕虫&僵尸网络&DDOS

很多更新都是安全性补丁,如果有足够多的电脑有漏洞,让恶意程序可以在电脑之间互相传播。这些恶意程序就叫做计算机蠕虫(worms)。如果黑客拿下大量电脑,这些电脑可以组成一个僵尸网络(botnet)。僵尸网络可以用于很多目的,比如大量发送垃圾邮件、使用他人电脑的计算能力和电费挖Bitcoin、发起拒绝服务攻击(Distributed Denial of Service attacks,DDoS attacks)来攻击服务器。
DDoS就是僵尸网络里的所有电脑发一大堆垃圾信息来堵塞服务器,要么迫使别人交钱消灾、纯粹为了作恶。尽管有白帽黑客的努力工作、网络上各种漏洞利用的文档、编写软件的“最佳实践”(software engineering best practices),网络攻击仍然每天都在发生,每年造成全球经济损害余额5000亿。专家甚至预测将来的战争将会是网络战争(cyberwarfare),目的是通过网络攻击使经济和基础设施崩溃。

  • 13
    点赞
  • 144
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值