每位开发人员都知道遵循最佳安全实践的重要性。但我们常常偷工减料,也许是因为我们必须努力工作才能让这些安全实践深入人心。不幸的是,这通常需要看到一些非常糟糕的安全失误,以至于在我们的大脑中留下不可磨灭的印记。
在我的系统管理员职业生涯中,我见过很多糟糕的安全实践的例子,但我在这里要描述的三个是每个软件开发人员都应该避免的基本事项。重要的是要注意,我见过大型公司和经验丰富的开发人员都犯过这些错误,所以你不能将这些错误归咎于新手初级工程师。
1. 不要加密密码,对其进行哈希处理。
在我的职业生涯早期,我曾为一家公司工作,该公司使用一个管理系统,其中包含一些非常重要的信息。有一天,我被要求对网络和存储我们关键信息的软件进行安全审查。我花了几分钟四处查看,然后决定启动 Wireshark,看看网络上运行的流量。
我使用了我的本地工作站,登录到信息系统,并注意到一些奇怪的事情。即使这在 SSL 流行之前,我也不希望看到明文数据,其中包含诸如“username”和“password”之类的字节。仔细检查后,似乎系统正在通过网络发送我的用户名和一个随机字符串(那不是我的密码)。我不能就此罢休。我尝试再次登录,但这次我故意输错了密码。我没有更改全部密码,只更改了一个字符。
我期望看到的是一个完全不同的随机字符串来表示密码。相反,只有前两个字节发生了变化。这很有趣。即使我相对缺乏经验,我也知道,如果我的密码表示形式被哈希处理(正如它应该的那样),它将是*完全*不同的,而不仅仅是两个字符不同。 甚至一个好的加密方案也会做到这一点。然而,这根本没有做到这一点。我又尝试了两个错误的密码。
我拿着几张纸和一支铅笔,花了接下来的两个小时来研究解密方案。在这两个小时结束时,我编写了一个 Python 脚本,它可以获取任何这些“加密”密码并将其解密以显示原始密码,这是任何人都不应该*能够*做到的。我确信,梦想出这种加密方案的人从未想过,有人会花几个小时坐下来解决它,但我做到了。
为什么?因为我可以。
如果您必须存储密码以进行比较,请永远不要加密它们,因为总有可能有人可以找到解密算法或密钥。哈希没有直接反向,这意味着除非他们已经有一个包含从纯文本到哈希的映射表(或者他们只是猜测),否则没有人可以反向它。知道哈希机制不会背叛数据的完整性,而知道加密方案和密钥则会。
2. 不要在软件中放置秘密后门。
作为第三方软件推广的一部分,我正在支持一些用户,他们告诉我他们的登录名不起作用。这是一项由供应商提供的付费服务,但在处理通常是最烦人的支持电话之一(“我的登录名不起作用”)之前,我想我会自己尝试一下。这是真的,登录名不起作用。
该系统是一个基于 Web 的学习管理平台,我们为它的一小部分更强大的功能付费。当我更多地查看登录页面时,有些东西引起了我的注意。其中一个单词中的一个字符看起来不同。也许是不同的字体,一个稍微不同形状的“o”。我就是我,我在源代码视图中查看了该页面,并注意到有一个链接与这个特定的字母相关联。该链接是故意隐藏的。鼠标光标悬停在其上时不会改变。
我小心翼翼地将那个神秘链接加载到一个新的浏览器窗口中。突然间,我看到一个屏幕详细介绍了整套计算机,让我可以完全控制它们可以做什么,并能够关闭它们、重启它们、截取屏幕截图,等等。我给软件供应商打了电话,要求与 IT 人员交谈。在经历了一些曲折之后,我终于找到了一个知道我在说什么的人。
“哦,是的!”他说。“我们把它放在那里是为了方便访问,直到你才有人发现它。我们马上删除它。”在我们结束通话之前,他问了我最后一个问题:“你为什么开始挖掘 HTML?”
我的回答很简单:“因为我可以。”
在任何系统中放置一些花哨的后门访问都是不值得冒险的,因为你可以打赌一定会有人找到它。无论多么晦涩,代码分析——以及一般的探测和戳刺——通常会产生最令人惊讶和有趣的结果。
3. 在*每个*页面上验证用户身份——而不仅仅是在登录页面上。
在我职业生涯的某个阶段,我参与了一个软件开发项目,该项目由一位经验丰富的开发人员实施。由于感觉自己在这个特定的应用程序中有点力不从心,我告诉我的经理,我们需要对代码进行深入的安全审查。我被要求无论如何都要看看我能找到什么。我开始玩这个应用程序,登录并查看了一些数据。然后我发现了一些非常有趣的事情。
如果我将我在系统中进一步访问的 URL 之一添加为书签,我可以将其复制并粘贴到另一个浏览器中,然后砰!我就到了那里,无需登录。我问开发人员,“你为什么不在每个页面上检查登录状态?如果我只是输入系统中更深层页面的 URL,我就可以在不登录的情况下到达那里。”他问,“你为什么要那样做?”
“因为我可以,”我回答道。
不要将任何事情留给偶然
即使是经验丰富的开发人员也可能犯这些错误。他们认为有人永远不会尝试深入研究他们没有真正访问权限的系统。问题是人们会探测,他们会戳刺。我这个只涉足安全领域的人想要传达的首要建议是:不要将任何事情留给偶然。像我这样喜欢挖掘事物并了解其工作原理的人有很多。但也有很多人会挖掘以利用您的缺陷和漏洞。
为什么?因为他们可以!
6 条评论