软件开发人员的 3 个安全提示

不要犯这些常见的安全错误,它们会让你容易受到攻击。
416 位读者喜欢这个。
Improve your DevOps security game with Ansible Vault

Opensource.com

每个开发人员都知道遵循最佳安全实践的重要性。 但是我们经常偷工减料,也许是因为我们必须努力工作才能将这些安全实践牢记在心。 不幸的是,这通常需要看到一种非常糟糕的安全失误,以至于它在我们的脑海中留下了不可磨灭的印记。

在我担任系统管理员的职业生涯中,我见过很多糟糕的安全实践的例子,但我要在这里描述的三个是每个软件开发人员都应该避免的基本事项。 重要的是要注意,我见过大型公司和经验丰富的开发人员都犯过这些错误,因此您不能将这些错误归咎于新手初级工程师。

[下载 DevSecOps 入门指南]

1. 不要加密密码,对其进行哈希处理。

在我职业生涯的早期,我曾在一家公司工作,该公司使用一个管理系统来保存一些非常重要的信息。 有一天,我被要求对网络和存储我们关键信息的软件进行安全审查。 我花了几分钟四处查看,然后决定启动 Wireshark,看看网络上运行什么流量。

我使用了我的本地工作站,登录到信息系统,并注意到一些奇怪的事情。 即使在 SSL 风靡一时之前,我也不希望看到包含诸如“username”和“password”之类字节的纯文本数据。 仔细检查后,似乎该系统正在通过线路发送我的用户名和一个随机字符串(这不是我的密码)。 我不能就此罢休。 我尝试再次登录,只是这次我故意输入了错误的密码。 我没有更改所有密码,只是更改了一个字符。

 

我期望看到的是一个完全不同的随机字符串来表示密码。 相反,只有前两个字节发生了变化。 这很有趣。 即使我相对缺乏经验,我也知道,如果我的密码的表示形式像应该的那样被哈希处理,它将是完全不同的,而不仅仅是两个字符不同。 即使是一个好的加密方案也会这样做。 然而,这根本没有做到这一点。 我又尝试了两个错误的密码。

 

我拿着一些纸和一支铅笔,在接下来的两个小时里弄清楚了解密方案。 在那两个小时结束时,我有一个 Python 脚本可以获取任何那些“加密”密码并对其进行解密以显示原始密码,这是任何人都永远不应该做到的。 我相信,设想这种加密方案的人从来没有想到过,会有人花几个小时坐下来解决它,但我做到了。

为什么? 因为我可以。

如果您必须存储密码以进行比较,请永远不要对其进行加密,因为总有可能有人可以找到解密算法或密钥。 哈希没有直接的反转,这意味着除非他们已经有一个从纯文本到哈希的映射表(或者他们只是猜测),否则没有人可以反转它。 知道哈希机制不会泄露数据的完整性,而知道加密方案和密钥则会。

2. 不要将秘密后门放入软件中。

作为第三方软件发布的一部分,我正在支持一些用户,他们告诉我他们的登录名不起作用。 这是一项由供应商提供的付费服务,但在处理通常最烦人的支持电话之一(“我的登录名不起作用”)之前,我想我会自己尝试一下。 事实证明,登录名不起作用。

该系统是一个基于 Web 的学习管理平台,我们为此支付了其更强大功能的一小部分。 当我在登录页面上稍微翻找时,一些东西引起了我的注意。 一个单词中的一个字符看起来不同。 也许是不同的字体,一个稍微不同的“o”形状。 我就是我,我在源代码视图中查看了该页面,并注意到该特定字母有一个链接。 该链接是故意隐藏的。 鼠标光标在悬停在其上方时没有变化。

我小心翼翼地将那个神秘的链接加载到一个新的浏览器窗口中。 突然,我看到一个屏幕详细介绍了一整套计算机,让我可以完全控制它们可以做什么,并且能够关闭它们、重新启动它们、截取屏幕截图,应有尽有。 我打电话给软件供应商,要求与 IT 人员交谈。 在经历了一些波折之后,我终于联系到了一个知道我在说什么的人。

“哦,是的!” 他说。 “我们将其放在那里是为了方便访问,直到您找到它之前,从未有人发现它。 我们会立即将其删除。” 在我们结束通话之前,他问了我最后一个问题:“您为什么开始在 HTML 中挖掘?”

我的答案很简单:“因为我可以。”

在任何系统中放置一些花哨的后门访问权限都不值得冒险,因为您可以肯定会有人找到它。 无论多么晦涩难懂,代码分析以及一般的探测和戳刺通常会产生最令人惊讶和有趣的结果。

3. 在每个页面上验证用户身份,而不仅仅是在登录页面上。

在我职业生涯的某个时刻,我参与了一个由一位经验丰富的开发人员实施的软件开发项目。 感觉到自己对这个特定的应用程序有点力不从心,我告诉我的经理,我们需要对代码进行深入的安全审查。 我被要求无论如何都要看一看,看看我能发现什么。 我开始摆弄该应用程序,登录并查看了一些数据。 然后我发现了一些非常有趣的事情。

如果我为我在系统中进一步访问的 URL 添加书签,我可以将其复制并粘贴到另一个浏览器中,然后,砰! 我就在那里,无需登录。 我问开发人员:“为什么不在每个页面上都检查登录名? 如果我只是输入系统中更深一层的页面的 URL,我可以无需登录即可到达那里。” 他问:“你为什么要这样做?”

“因为我可以,”我回答道。

不要把任何事情都交给机会

即使经验丰富的开发人员也可能会犯这些错误。 他们认为永远不会有人试图深入挖掘他们没有真正访问权限的系统。 问题是人们会探测,他们会戳刺。 我,一个只涉足安全领域的人,想要在这里传达的首要建议是:不要把任何事情都交给机会。 有像我这样的人,他们喜欢深入研究事物,看看它们为什么以及如何工作。 但也有很多人会挖掘以利用您的缺陷和漏洞。

为什么? 因为他们可以!

下载 DevSecOps 入门指南

接下来要阅读的内容
User profile image.
Peter 是一位充满热情的开源爱好者,在过去的 10 年中一直推广和使用开源产品。 他曾在许多不同的领域做过志愿者,最初是在 Ubuntu 社区,然后进入音频制作领域,后来进入写作领域。

6 条评论

简而言之
* 哈希不是加密!
* 用糟糕的解决方案代替可能的问题不是答案
(问题:加密密钥丢失 > 糟糕的解决方案:不要使用加密)
(* 使用适当的加密)

当您输入与存储的密码具有相同哈希值的“密码”时,您认为会发生什么......

哈希冲突(当两个单独的字符串具有相同的哈希值时)肯定是可能的,但可能性很小。 即使使用不再推荐的 MD5,在测试 2^64 个密码后,您也会有 50% 的机会发生冲突。 那是很多密码。

回复 ,作者:Wim

当我在大学学习 PHP 时,很明显,用不到 10 行代码编写一个暴力破解程序非常容易,包括 { }。 我在学习 PHP 不到 3 小时内就写了它。

回复 ,作者:bcotton

对于合理的哈希算法来说,这并不是一个充分的攻击向量。

很棒的文章!关于使用哈希函数的建议应该包括“使用盐(salt)”。否则你很容易受到彩虹攻击,最终会像LinkedIn一样。 :-)

回复 作者:aaroncocker

同意。很好的建议!

回复 作者:Marcel Kolaja (未验证)

这是一篇很棒的文章,Pete。我也喜欢摆弄软件“只是因为我能”。我建议新的计算机科学专业的学生也做同样的事情,学习底层系统以及不该做什么。例如,Windows上的一些应用程序正确地使用/AppData目录存放临时文件,而我见过其他应用程序使用/ProgramFiles,注册表或单独的.hidden文件存放用户凭据,认为它对其他用户是安全的。 惊喜,并非如此。

© . All rights reserved.