当诚实的开发人员学习黑帽黑客的技术时,非程序员总是持怀疑态度.显然,我们需要学习他们的许多技巧,这样我们才能保持自己的安全性.
您认为诚实的程序员在多大程度上需要了解恶意程序员的方法?
在一天结束时,没有任何"黑帽子"知道是犯罪知识,它只是知识的应用方式.深入了解任何技术作为程序员是有价值的,这是我们如何充分利用系统.这些天可能不知道深度,因为我们已经有越来越多的框架,库和组件使用这些知识来编写,以节省您必须知道的一切,但它仍然很好地不时挖掘.
我会变得有点异端,然后说:
您真的需要与保护其计算机的系统管理员/网络人员交谈.这些人每天都在处理闯入的概念,并且总是在寻找潜在的利用来对付他们.在大多数情况下,忽略攻击者思考方式的"动机"方面,因为"黑客入侵恶名"的日子早已不复存在.转而关注方法论.有能力的管理员将能够轻松证明这一点.
当你编写程序时,你正在展示(希望是)无缝,流畅的接口到$ {whatever-else-accepted-your-programs-I/O}.在这种情况下,它可能是最终用户,或者它可能是另一台机器上的另一个进程,但无关紧要. 总是假设您的应用程序的"客户端"可能具有敌意,无论它是机器还是人.
不相信我?尝试编写一个小型应用程序,从销售人员处获取销售订单,然后制定一个公司规则,您需要通过该应用程序强制执行,但销售人员不断尝试四处走动以便他们赚更多钱.仅仅这个小小的练习就可以证明一个有动力的攻击者 - 在这种情况下是预期的最终用户 - 将如何积极地寻找利用逻辑缺陷或通过其他方式游戏系统的方法. 这些都是值得信赖的最终用户!
多人在线游戏经常与骗子打成一场战争,因为服务器软件通常信任客户; 并且在所有情况下,客户端都可以并且将被黑客攻击,从而导致玩家游戏系统.想一想 - 在这里,我们有一些人只是在享受自己,他们将采取极端措施,在不涉及赚钱的活动中获得优势.
想象一下专业机器人牧民的动机,他们以这种方式谋生......编写恶意软件,以便他们可以使用其他人的机器作为收入来源,将他们的僵尸网络卖给出价最高的垃圾邮件泛滥者......是的,这 确实 发生了.
无论动机如何,重点仍然是,你的程序可能并且在某些时候会受到攻击.它不足以防止缓冲区溢出,堆栈粉碎,堆栈执行(代码作为数据加载到堆栈中,然后返回完成以卸载堆栈,导致执行代码),数据执行,跨站点脚本,权限提升,竞争条件或其他"程序化"攻击,尽管它确实有帮助.除了"标准"程序化防御之外,您还需要考虑信任,验证,身份和凭证 - 换句话说,处理提供程序输入的任何内容以及消耗程序输出的内容.例如,如何从程序化角度防范DNS中毒?有时,你无法避免代码中的事情 - 让最终用户不将密码交给同事是一个例子.
将这些概念纳入安全方法,而不是"技术". 安全是一个过程,而不是一个产品.当你开始思考什么是"另一边"你的程序,和方法可以采用,以减轻这些问题,它会变得至于什么可以去的权利更清晰,什么可以去可怕的错误.
我刚才就这么说了,正如我刚刚在播客上听到的那样.但是,作为一名曾在软件公司的安全团队工作的人,我会提出自己的看法.
我们实际上非常重视开发人员教育,我们会尽可能多地为开发人员提供安全开发的基础培训.对安全性的思考确实需要从正常开发中转变思维方式,因此我们试图让开发人员思考如何以突破性的方式思考问题.我们使用的一个支柱是带有数字键盘的家用保险箱之一.我们让开发人员从内到外检查它,试图想出一种突破它的方法.(解决方案是在手柄上施加压力,同时在顶部给安全装置猛烈撞击,这会导致螺栓在螺线管的弹簧上反弹.)虽然我们不会给他们特定的黑帽技术,但我们讨论导致这些漏洞的实现错误 - 特别是它们之前可能没有遇到的事情,比如整数溢出或编译器优化函数调用(如memset清除密码).我们在内部发布了一份月度安全通讯,邀请开发人员在小代码示例中发现与安全相关的错误,这肯定显示了他们会错过多少.
我们还尝试遵循微软的安全开发生命周期,这将涉及让开发人员谈论他们产品的架构,并找出资产和攻击这些资产的可能方法.
至于那些大多是前开发人员的安全团队,理解黑帽技术对我们来说非常重要.我们负责的事情之一是接收来自第三方的安全警报,并且知道黑帽利用某些弱点是多么困难是分流和调查过程的重要部分.是的,偶尔会让我通过调试器来计算易受攻击的例程的内存偏移量并修补二进制可执行文件.
但真正的问题是,其中许多问题超出了开发人员的能力范围.任何规模合理的公司都会有很多开发人员在编写代码方面做得很好,但却没有安全思维.所以我对你的问题的回答是:期望所有开发人员拥有黑帽知识将是一个不受欢迎和不利的负担,但你公司的某些人应该掌握这些知识,无论是安全审计和响应团队,还是只有高级开发人员.
很大程度上来说.你需要像犯罪分子一样思考,或者你不够偏执.
您认为诚实的程序员在多大程度上需要了解恶意程序员的方法?
你需要了解更多.
我作为安全人员而不是开发人员工作,根据我的经验,我可以简单地说你不能学习像黑帽子或专业白帽那样好的东西,除非它是你的第二职业.这太费时间了.
最重要的一点是看到一些坏人或专业人士采取行动并了解不安全代码的可能性和影响.
因此,通过学习一些技巧,但很多人可能会感到"虚假的安全感",因为他或她不能破解.虽然技术娴熟的攻击者可能会在几分钟内破解同样的事情.
话虽如此,一旦你记住这一点,我认为学习一些攻击,有趣和非常有教育,学习如何打破东西是很好的.
绝对要学习黑暗的一面.即使你不学习实际技术,至少要努力学习什么是可能的.
alt text http://ecx.images-amazon.com/images/I/51rqNSV141L._BO2,204,203,200_PIsitb-sticker-arrow-click,TopRight,35,-76_AA240_SH20_OU01_.jpg alt text http://ecx.images-amazon .COM /图片/ I/519BX6GJZVL._BO2,204,203,200_PIsitb贴纸箭头点击,TopRight,35,-76_AA240_SH20_OU01_.jpg
学习交易技巧的好资源是逆转:逆向工程和黑客的秘密:剥削的艺术.它们是为双方编写的 - 这些可以用来学习如何破解,但它们也提供了防止这种攻击的方法.
像鸽子一样"无辜,像蛇一样聪明",并学习那些有邪恶目的的人所做的技巧.也就是说,应该谨慎使用这些知识."拥有权利的同时也被赋予了重大的责任".
提醒一句:俄勒冈州与兰德尔施瓦茨.
在我们网站上调查两个不同事件的一小部分中,我会说在用它来攻击你之前学习漏洞的可能性很小.也许如果你将自己的职业生涯奉献给白帽子,你将会在大多数流行的硬件/软件堆栈中保持领先地位.但对于普通的程序员来说,你更有可能处于反应模式.
您有责任了解自己的软件是如何被黑客入侵的,并有责任与第三方软件保持合理的最新状态.制定应急计划以应对攻击将是一件好事,特别是如果您是一个备受瞩目或高价值的目标.有些地方会立即关闭一个洞,但我们的网站往往会留下一些漏洞,以协助执法人员抓捕肇事者.IT安全团队偶尔会在内部宣布它将进行端口扫描,以便SA不会对此感到不满.
邪恶的设计."当善是愚蠢时,邪恶将永远胜利."
简而言之,如果你不认为像一个罪犯,那并不意味着犯罪分子不会.
我个人看不到技术差异.当然动机不同但技术游戏是一样的.这就像问"好东西"需要了解什么样的战争.
答案就是全部,即使他们没有积极地练习它.
我认为"防御性编码"的一部分包括了解恶意技术,但与此同时,您并不一定需要知道所有技术才能有效地防御它们.例如,了解缓冲区溢出攻击并不是尝试保护缓冲区不被溢出的原因.你保护它们不会溢出,因为如果它们这样做,它可能会对你的程序造成严重破坏,无论它是一个bug还是一个攻击.
如果你编写非常彻底检查和架构良好的代码,那么恶意攻击将无法渗透,因为良好的架构应该自动锁定副作用和未经授权的访问.
然而,最后一段假设我们有一个完美的工作,我们有足够的时间来使我们的代码恰到好处.由于这样的工作不存在,因此了解恶意技术是一个很好的捷径,因为这意味着虽然您的代码并不完美,但您可以为这些漏洞创建"解决方法"以确保它们不会获得通过.但是,那些不会使代码更好,并且它们不会使应用程序更好.
最终,了解恶意攻击是一件值得注意的事情,但只有确保您遵守最佳实践才能涵盖95%的漏洞.
经常错过的一项技能是社会工程.
许多人根本无法识别他们什么时候被骗.在以前的公司,VP通过在会议室中让三名(女性)临时工呼叫程序员和系统管理员并通过脚本工作来尝试让某人授予访问权限或显示密码来进行测试.每个临时工都可以在通话的第一个小时内访问某些内容.
我敢打赌,如果在任何中型到大型公司进行类似的测试,他们都会得到相同的结果.