当诚实的开发人员学习黑帽黑客技术时,总是会受到非程序员的怀疑。但是,显然,我们需要学习许多技巧,以便使自己的安全性达到标准。
您认为诚实的程序员在多大程度上需要了解恶意程序员的方法?
Answers:
我来晚了,因为我刚刚在播客上听说过它。但是,作为在软件公司的安全团队中工作的人,我将提出自己的看法。
实际上,我们非常重视开发人员教育,并且会尽可能多地为开发人员团队提供安全开发方面的基础培训。考虑安全性确实需要从常规开发中转移思维,因此我们将尝试使开发人员以“如何打破常规”的思维方式进行思考。我们使用的一种道具是带有数字键盘的家用保险箱之一。我们会让开发人员从内到外对其进行检查,以尝试提出一种闯入它的方法。(解决方案是在向手柄施加压力的同时,向保险柜的顶部施加尖锐的打击,这将导致螺栓在螺线管中的弹簧上弹起。)虽然我们没有给他们提供特定的黑帽技巧,但我们谈论导致这些漏洞的实施错误-尤其是它们以前可能没有遇到过的事情,例如整数溢出或编译器优化了函数调用(例如使用memset清除密码)。我们在内部每月发布一次安全时事通讯,邀请开发人员在小代码示例中发现与安全相关的错误,这些错误肯定表明了他们会错失多少。
我们还尝试遵循Microsoft的安全开发生命周期,这将涉及使开发人员讨论其产品的体系结构,并找出资产和攻击这些资产的可能方法。
对于主要是前开发人员的安全团队来说,了解黑帽技术对我们非常重要。我们负责的事情之一是接收来自第三方的安全警报,并且知道黑帽利用某些弱点将是多么困难是分类和调查过程的重要组成部分。是的,有时我需要一步步地通过调试器来计算易受攻击的例程的内存偏移并修补二进制可执行文件。
但是,真正的问题是,其中很多超出了开发人员的能力范围。任何一家规模适中的公司都会有许多开发人员,他们足够擅长编写代码,但没有安全意识。因此,我对您的问题的回答是:希望所有开发人员都拥有黑帽知识将是不受欢迎且有害的负担,但是您公司中的某人应该拥有该知识,无论是安全审核和响应团队,还是仅仅是高级开发人员。
我会有点异端,弯腰说:
在编写程序时,您希望(无缝地)呈现到$ {whatever-else-accepts-your-programs-I / O}的无缝,平滑接口。在这种情况下,它可能是最终用户,也可能是另一台计算机上的另一个进程,但这并不重要。 始终假定应用程序的“客户端”可能是敌对的,无论它是机器还是人。
不相信我吗 尝试编写一个小型应用程序,该程序可以从销售人员那里获得销售订单,然后制定一条公司规则,您需要通过该应用程序来执行该规则,但是销售人员一直在不断努力,以使他们能够赚更多的钱。仅此一项小小的练习就可以证明一个有动机的攻击者(在这种情况下,是最终用户)将如何积极地寻找利用逻辑缺陷或通过其他方式玩系统的方法。 这些都是值得信赖的最终用户!
多人在线游戏一直在与作弊者作战,因为服务器软件通常会信任客户端。并且在所有情况下,客户端都可能会被黑客入侵,从而导致玩家玩这个系统。考虑一下-在这里,我们有些人只是在享受自己,而他们将采取极端的措施在不涉及赚钱的活动中占上风。
试想一下,一个以这种方式谋生的专业bot牧民的动机...编写恶意软件,以便他们可以将其他人的机器用作创收工具,将其僵尸网络出售给出价最高的人,以应对大量垃圾邮件...是的,这 确实 发生了。
无论动机如何,问题仍然存在,您的程序可能会并且在某个时候受到攻击。仅仅防止缓冲区溢出,堆栈粉碎,堆栈执行(将按代码存储的数据加载到堆栈中,然后执行返回操作以卸载堆栈,导致执行代码),数据执行,跨站点是不够的脚本,特权提升,竞争条件或其他“程序”攻击,尽管确实有帮助。除了“标准”程序防御之外,您还需要考虑信任,验证,身份和凭据,换句话说,要处理提供程序输入的任何内容和消耗程序输出的任何内容。例如,从程序的角度来看,如何防止DNS中毒?有时,您无法避免在代码中出现问题-例如让最终用户不要将密码移交给同事。
将这些概念合并到安全性方法中,而不是“技术”中。 安全是一个过程,而不是产品。当你开始了解什么是“另一边”你的程序,以及思维方法,你可以使用,以减轻这些问题,它会变得至于什么可以去的权利更清晰,什么可以去可怕的错误。
在很大程度上。您需要像罪犯一样思考,否则您会变得偏执。
您认为诚实的程序员在多大程度上需要了解恶意程序员的方法?
您需要了解的不只是他们。
我确实是一名安全人员,而不是开发人员,根据我的经验,我可以简单地说,除非您是第二职业,否则您不会像黑帽或专业白帽那样学到好东西。太浪费时间了。
最重要的一点是,看到一些坏人或专业人员采取了行动,并了解了不安全代码的可能性和影响。
因此,通过学习一些技巧,其中很多技巧可能会因为“他或她无法破解”而感到“虚假的安全感”。尽管技能更好的攻击者可能会在几分钟之内破解相同的东西。
话虽如此,只要您牢记这一点,我认为学习一些攻击,有趣和非常有教育性的知识来学习如何破解东西是件好事。
一个警告:俄勒冈州vs. Randal Schwartz。
我只是调查了我们站点上两个单独事件的一小部分,所以我说,在对您进行利用之前,了解该利用的几率很小。也许,如果您将职业生涯奉献给白帽子,那么您将留在大多数流行的硬件/软件堆栈的所有潜在漏洞之上。但是对于普通程序员来说,您更有可能处于反应模式。
您确实有责任了解如何对自己的软件进行黑客攻击,并有责任合理了解最新的第三方软件。最好制定应急计划来应对攻击,特别是如果您是高调或高价值的目标。有些地方希望立即关闭漏洞,但我们的站点倾向于保留某些漏洞,以协助执法人员抓捕肇事者。IT安全团队偶尔会在内部宣布它将进行端口扫描,以免SA感到惊讶。
我认为“防御性编码”的一部分包括了解恶意技术,但同时,您不一定需要了解所有技术即可有效防御这些技术。例如,了解缓冲区溢出攻击并不是尝试防止缓冲区溢出的原因。您可以防止它们溢出,因为如果这样做,它们可能会对程序造成严重破坏,无论它是错误还是攻击。
如果您编写了经过全面检查且结构良好的代码,则恶意攻击将无法渗透,因为良好的体系结构应自动阻止副作用和未经授权的访问。
但是,最后一段假设我们有一个完美的工作,可以花大量时间使我们的代码正确无误。由于不存在这样的工作,因此了解恶意技术是一个很好的捷径,因为这意味着尽管您的代码并不完美,但是您可以为这些漏洞创建“非解决方法”,以确保它们不会被利用。通过。但是,这些不能使代码更好,也不能使应用程序更好。
归根结底,了解恶意攻击是一件好事,但只要确保您遵循最佳实践,就能覆盖其中的95%。
我将采取有争议的立场,并说有一些黑帽知识,您不需要成为一名好白帽黑客。医生无需知道如何对病毒进行基因改造即可有效治疗疾病。
我们白帽子和灰帽子需要擅长于一百万件事,而那些黑帽子和滑橇只需要一件事情就能成功
当我听到黑帽这个词时,我想到一个利用计算机知识闯入银行并做其他恶作剧的人。白帽知道黑帽知道的一切,但不会做任何坏事。
因此,你不必关心或者知道什么是“黑帽”是是安全的?
知道了黑帽的想法之后,当你已经等效于白帽的时候,蹲下来就无济于事了。这就像知道,“约翰想闯入我的房子并偷走我的iPod音乐”。如果您真的很在意iPod音乐,则应该确保它的安全性。