为何一个pdf文件就能让电脑中无解的病毒?

一个没名字但很有用的公众号

(我是真没想到zrp写这么一篇科普文,都能秀恩爱)


以下是导言

想要这么一篇文章的诱因是不久前在我校BBS十大热门上出现了这样一个帖子:


帖子中所附的附件图片是这样的:

(如果看不清楚,可以点开看大图。下同。)

帖子和@北大未名BBS 微博的回复区,不少都表示这几乎是无解的:


像我这样的无知群众,更多的是非常好奇为什么楼主说自己只是打开了一个pdf文件,电脑就能中毒,而且是一种看上去无解的病毒?是真的一个pdf文件就能有如此大的破坏力?还是楼主头昏眼花没看清文件真实后缀才会导致呢?


回复区有大神告诉我们,后缀迷惑法当然是一种可能性,但是!就pdf文件本身也是可能导致电脑中毒的:

微博评论区还有人指出,不要以为自己用的是苹果电脑就能逃过一劫喔,这个是Windows/Mac OS 通杀的:


看到这里,小白如我的心情是这样的:
天了噜!!!看上去人畜无害的每天都会接触好多的pdf文件真的有可能有辣么大的威力!!!让电脑中这种要么给黑客巨款要么自认倒霉重装系统的病毒???
还有……这到底是个什么样的病毒?楼主和帖子里大神们讨论时候频繁提到的RSA和AES又是什么意思啊啊啊?


抱着走近科学的精神,我威逼了昔日人人网网红、计算机领域第一过气偶像,毕业于贵校计算机科学专业,如今在美帝继续求索信息安全真谛的zrp同学,请他来写一篇科普文,讲一讲以.pdf文件为代表的一众看上去人畜无害的文件界白莲花,其实有多大的安全风险,而帖子中提到的看似无法攻破的比特币勒索病毒又是什么鬼?

虽然他听到我的想法之后表情是这样的:


他最终还是同意重拾网红旧业,写文科普众生

下面开始是科普正文

 
3
ZrpHercule
建议阅读时间:7分钟
11:11 am

一开始被邀请来写这个文章的时候,我的内心是很抗拒的。
因为我作为一个纯粹的、脱离了低级趣味的人,对于卖弄(自己并不那么熟练的)知识这种事情并不那么感兴趣。我问up主能不能不写这个,写点别的更有意思的文章,比如说《有一个智障女朋友是种怎样的体验》这种知乎体文学,或者是《不转不是中国人,女朋友智商不高的十大好处》这种QQ空间体文学,甚至是《脑残女友痴迷公众号害人害己,坚强小伙克服万难能否唤醒爱人的良知?》这种地摊小报文学。
但是这些看上去就比一篇科普文有意思多了的文章,竟然无一例外的被up主否决了,还威胁要我过今年的光棍节。于是无可奈何,我也就只好勉为其难的写点东西应付了事了。

   无知群众
为什么我会中招?
怎样才能不中招?
zrp   
中招的原因是你点开了一个来历不明的PDF文件。
防止中招的手段是不要点开一个来历不明的PDF文件。

上面的内容是这段的初稿。

不过我仔细想了想觉得自己也没有那么想过光棍节,于是决定加一些补充内容。


为什么一个pdf文件就能让电脑中病毒?

现在很多流行的软件,比如说office,比如说pdf reader,再比如甚至说图片浏览器,为了给用户提供更加方便快捷的服务,都会让用户能做很多“超出这个软件本身应用范围”的事情。比如pdf中可以嵌入一些程序(比如很多pdf表格可以允许用户在里面填写内容,甚至内容还有其格式要求),office也有各种宏和超链接的启动接口(比如excel就可以在内部编程)。
我们知道,功能越多,那么漏洞也一定越多;与此同时,这些功能赋予用户强大的权限,在不怀好意的人的手里就能够成为攻击的武器。
因此,运行并且信任一个来历不明的pdf文件,可以说是极度不明智的。

那么是不是来自朋友的文件就一定安全呢?
这也是不一定的,因为你的朋友的电脑一旦被感染,那么他们的邮件通讯录也就不再安全。黑客们早在十几年前就发明出了能够通过邮件通讯录向其亲朋好友发送带毒邮件,以达到传播目的的病毒(比如大名鼎鼎的Melissa病毒,因其作者因为喜欢色情片演员Melissa而如此命名)。这些病毒使得即使你谨慎小心不打开任何一封未知来源的邮件,该中招还是会中招。

在这种情况下,我们该怎样避免中招呢?
答案之一,也是最靠谱的答案,是使用一个拥有更先进反病毒系统的邮箱服务商,并在自己的机器上面安装及时更新的防病毒软件。
众所周知,北京大学作为一所世界一流技校,它的一些配套设施其实是很差的,其中就包括其官方邮箱系统mail.pku.edu.cn的反病毒系统。其实稍微做个实验就知道,bbs的那个案例中的带毒pdf文件,在国内绝大多数邮件服务商,比如163、hotmail或是gmail(这个邮件服务商其实不存在,是我瞎编的)中都会被其反病毒系统监测并过滤掉。然而很不幸的是,北京大学的邮箱反病毒系统可能因为太久没有更新,加上当事人自己可能平时就疏于更新自己电脑上的防病毒软件,因此才会酿成悲剧。

      那么是不是我有了一套强无敌的防病毒软件和一个信得过的同样强无敌的邮件服务商,我就可以完全避免中招了呢?
其实也并不是的,不过可以认为普通的用户做到这一步,中招的概率就已经很小了。
然而为什么还是有可能会中招呢?因为很多邮件传播的病毒为了避免自己被发现,很可能会给自己加上各种掩饰,比如把自己有害的那部分内容加密,等用户本地运行的时候再通过一些看上去无害的,难以被监测过滤的手段解密。虽然这种加密的病毒一样有办法针对其进行防御,但是(这也是信息安全界的常识)如果一些足够有能力和资源的黑客不惜代价的要攻击你,那么你总是会中招。

因此,简而言之,避免自己中招的方法有三条:
1.      不要轻易点开陌生人的邮件,更不要打开其中的附件,不管是什么文件
2.      选择好的邮件服务商,并且及时更新自己的防病毒软件
3.      不要得罪学信息安全的朋友,比如逼迫他花美好的周末时光来写稿,这种事要少干


病毒加密的原理是什么?

接下来我们看看这个嚣张的黑客是怎么说的:
“嗨,你的电脑被我用AES128和RSA2048加密了,如果不给钱的话,你玩完了。”
如果我的阅读理解能力过关的话,这个黑客就是这个意思。

那么他说的对不对呢?
对。

至于为什么对,我们先来看看他说的AES128和RSA2048是什么意思。

AES全称为Advanced Encryption Standard,是一种使用复杂的区块加密的算法标准,是所谓DES(Data Encryption Standard)的升级进化版本。AES128是一种使用了128位密钥的AES。
由于我不太想用复杂的加密标准流程把看到这里的读者全部吓跑,我会略过其流程的介绍,而仅仅讲述这个算法的作用。

AES的目的,是为了给某个特定的加密算法(比如此例中的RSA)提高混淆性和扩散性。
所谓混淆性,就是让人难以通过加密后的密文看出该加密算法的密钥;而所谓扩散性,则是保证只要明文中间改动了一点点哪怕是一位,整个密文都会发生很大的变化。这个标准的使用,在密钥绝对保密的情况下,能够更好的将其中的加密算法保密,使得攻击者连加密算法的结果都难以看到。

那么对这种128位AES的加密算法,有什么很好的破解手段吗?
对于一个加密过程和模式正确的AES算法本身,目前最有效的破解方法是拿把枪指着加密人的脑袋逼迫他说出算法的密钥。而另外一些不怎么有效的方法,则大多是利用了加密人在应用AES算法时的不安全行为,同时很多方法都需要大量的时间与非常精确的仪器。而如果这个加密人按照最正确的流程来确保AES的安全的话,AES可以说是万无一失。

我们假设这位黑客并没有读完信息安全的博士就quit了,因此和我一样学艺不精加密AES时出现了严重的疏忽,导致用户轻而易举的攻破了AES这层防线,那么接下来的RSA2048同样让人绝望。

RSA算法是一种利用目前数学界对于大质因数分解困难的现状而发明出来的算法,在此例中的RSA2048算法就是一种密钥(公钥-私钥对)长度为2048位的RSA算法。所谓大质因数分解困难,就是如果p,q都是质数,N=p*q,那么通过p和q可以很容易的算出N,但是通过N却没有高效的方法算出p和q,虽然它们存在而且唯一。
RSA算法正是利用了这个过程,其算法流程如下(不喜欢数学的朋友可以跳过,这部分内容不重要)
1.生成随机质数p,q以及他们的乘积N=p*q。
2.求N的欧拉函数r,显然r=(p-1)(q-1)。
3.选择一个小于r的整数e,使得e与r互质,此时e关于r的逆元存在,命名为d (即ed = 1 mod r)
4.将(N,d)命名为私钥,(N,e)命名为公钥。在pdf攻击的案例中,公钥通过pdf邮件发给受害者用于加密,私钥由黑客保管用于解密。
当需要加密消息m时,先使用一些特殊的标准,将m编码成为若干个与N互质的整数n1,n2…,然后对这若干个整数分开进行加密为c:ci = ni^e mod N。这些ci就成为受害者机器上那些打不开的文件的内容。
而当需要解密消息时,由于欧拉定理可知,n^(ed) = n mod N, 因此ni = ci^d mod N。

以上就是RSA算法的内容,看起来很简单吧?
然而事实是,这种简单的算法很强,在冯诺依曼体系下的电脑除了暴力破解基本没有任何高效的算法能将其破解。而目前暴力破解到512位的密钥就已经相当吃力了,当密钥长度足够大(比如说2048位)的时候,可以认为RSA算法本身在冯诺依曼体系下的电脑中是绝对安全攻不破的了。

综上所述,这个黑客的技术还蛮先进的,AES128和RSA2048都可以被认为是牢不可破的加密算法。


万一真的中招了,我该怎么办?

如果资料真的很重要,又觉得钱很多即使被骗也不心疼的话,可以花钱买回来。不然的话就格式化电脑吧。

考虑到使用AES128-RSA2048加密算法来加密整个电脑上的文件需要非常大量的时间,我对这个黑客是不是真的用了这么复杂的加密表示很大的怀疑。更有可能的是,黑客干脆将你的文件替换成了一些乱码,然后谎称自己是加了密可以还原,最后拿了钱之后一走了之。

当然,如果你掌控着一个先进的信息安全实验室,那你当然试着验证一下黑客是不是在撒谎。而如果你没有的话,接下来我会讲一个和黑客斗智斗勇的手段(如果你能联系到他,而且他为了拿你的钱也配合的话),来试着让他保证他说的是实话。

首先,很容易想到的是,选择一些被加密的文件,试着让黑客解密看看。如果他可以解开,那就相信他;否则他就是在撒谎。
但是这些被加密的文件谁来选呢?如果是黑客来选,你肯定是不放心的,万一黑客图省事就加密了几个文件,其他的都用乱码给替换了,到时候证明他能够解密这几个文件,也没有用呀;但是如果是你来选,黑客又该不放心了,万一你这台烂电脑上就那么几个文件比较重要(比如毕业论文,女朋友美美的照片,巫师3的通关存档),把它们解密了备份好了,剩下的电脑中的文件就不值钱你用不着花钱去解密了。

那么,一个同样很容易想到的方法是,你们双方给电脑里面的文件编个号,然后每人给一个数,最后用这两个数进行异或运算得出的数,作为最终拿来证明黑客可以解密的文件的编号。(异或运算是一种二进制运算,两个数在二进制下异或,某一位相同时结果的该位为0,某一位不同时结果的该位为1)那么问题又来了,选好了数之后,是你先发给黑客呢,还是黑客先发给你呢?不论是谁发给谁,后发送的那一方都可以通过先发送的那一方发来的数来计算找到自己想要的异或结果需要什么数,再把这个数发给对方,这样就又会使对方丧失信任。
这个问题的解决方法有两种。
第一种是双方都把自己选好的数发给一个可靠的第三方,而这个第三方在知道双方都发送好了之后再把消息传达给对方。然而在敲诈勒索这种见不得人的情景中,找一个诚实可靠的第三方不用想也是很难的了。
另一种方法是,使用一些不可逆的哈希算法(即y=f(x),通过x能够很容易的找到y,但是通过y却几乎不可能找到x),先让黑客把他选的数的哈希值发来,然后你把你选好的数发过去,然后黑客再把自己选好的数发过来。此时,你可以用一开始的哈希值来验证这个数到底是黑客一开始就选好的,还是看到了你选好的数之后临时选的。这样你就可以通过信息学的姿势来和黑客建立起信任关系了。

不过话又说回来,我觉得这世界上这么有职业道德,肯跟你费这么大功夫建立信任关系的黑客,几乎是不存在的吧……多数没有职业道德的估计就一句“爱信信,不信滚”


以上就是科普文的全部内容了,希望up主下次找我约稿能走心一点,约一约魔幻现实主义意识流小说也好过科普文啊!
(好的。)
(真的会有人看完吗?)