白帽子程序员的黑帽知识
当诚实的开发者学习黑帽黑客技术时,非程序员总是怀疑。 显然,我们需要学习很多技巧,以便我们能够保持自己的安全。
你认为一个诚实的程序员在多大程度上需要知道恶意程序员的方法?
我刚刚在这个播客中听到这个消息。 不过,我会以一个曾经在一家软件公司的安全团队工作过的人的身份提供我的意见。
我们实际上非常重视开发者的教育,我们会尽可能多地为开发者提供基本的开发团队。 对安全的思考确实需要从正常的开发转向思维,所以我们会试图让开发人员思考一个如何破解事物的思维框架。 我们使用的一个道具是那些带有数字键盘的家庭保险柜。 我们会让开发人员在内外进行检查,试图想出一个办法。 (解决的办法是在手柄上施加压力,同时给安全顶部一个急剧的打击,这会导致螺栓在螺线pipe弹簧上反弹)。虽然我们不会给他们特定的黑帽技术,讨论导致这些漏洞的实现错误 – 特别是以前可能没有遇到过的漏洞,如整数溢出或编译器优化函数调用(如memset清除密码)。 我们在内部发布了一份月度安全通讯,邀请开发人员以小代码示例发现安全相关的错误,这肯定会显示他们错过了多less。
我们也试图遵循微软的安全开发生命周期,这将涉及让开发人员谈论他们的产品架构,并找出资产和可能的方式来攻击这些资产。
对于大多是前开发者的安全团队,了解黑帽技术对我们来说非常重要。 我们负责的其中一件事就是接收来自第三方的安全警报,并且知道黑帽子利用某些弱点是多么困难,这是分类和调查过程的一个重要部分。 是的,有时涉及到我通过debugging程序来计算易受攻击例程的内存偏移和修补二进制可执行文件。
但真正的问题在于,这其中的很多都超出了开发者的能力。 任何合理规模的公司都会有很多开发人员在编写代码时足够好,但是却没有安全的思维模式。 所以我对你的问题的回答是这样的:期待所有的开发者拥有黑帽的知识将是一个不受欢迎和有害的负担,但你公司中的某个人应该有这样的知识,无论是安全审计和响应团队,还是高级开发人员。
在一天结束的时候,“黑帽子”知道什么都不是犯罪知识,而是知识是如何运用的。 深入了解任何技术对于程序员来说都是很有价值的,这就是我们如何从系统中获得最大收益。 如今,我们越来越多的框架,库和组件已经使用这些知识来编写,以免你不得不知道所有的东西,但是不时地挖掘它们仍然是件好事。
我会变得有些邪恶,走出去说:
- 你真的需要与保护机器的系统pipe理员/networking人员交谈。 这些人每天都在处理打入的概念,并且总是在寻找潜在的利用攻击手段。 大多数情况下,忽略攻击者思维的“动机”方面,因为“恶名昭着”的日子已经过去了。 重点在于方法论 。 一个合格的pipe理员将能够很容易地certificate这一点。
当你编写一个程序时,你正在向$ {whatever-else-accepting-programs-I / O}展示什么是(希望)一个无缝,平滑的接口。 在这种情况下,它可能是最终用户,也可能是另一台机器上的另一个进程,但这并不重要。 总是假设你的应用程序的“客户端”可能是敌对的,不pipe它是机器还是个人。
不要相信我? 试着写一个小应用程序,从销售人员那里获得销售订单,然后制定一个公司规则,通过这个应用程序执行,但是销售人员总是试图绕过来赚取更多的钱。 仅仅这个小小的练习就可以certificate一个有动机的攻击者(在这个例子中是预期的最终用户 )将如何积极地寻找利用逻辑中的缺陷或者通过其他方式对系统进行游戏的方法。 而这些是值得信赖的最终用户!
多人在线游戏一直在与作弊者交战,因为服务器软件通常信任客户端; 在所有情况下,客户端可能会被黑客入侵,从而导致玩家对系统进行游戏。 想一想,在这里我们有一些人正在享受自己的乐趣,他们会采取极端的措施,在不涉及赚钱的活动中占上风。
试想一下,以这种方式赚钱的专业机器人牧师的动机……编写恶意软件,以便他们可以使用其他人的机器作为收入来源,将他们的僵尸networking出售给出价最高的垃圾邮件发送者。 , 这 确实 发生 。
无论动机如何,关键在于,您的计划可能会在某些时候受到攻击。 防止缓冲区溢出 , 堆栈粉碎 ,堆栈执行(将代码作为数据加载到堆栈中,然后执行返回以卸载堆栈,导致执行代码), 数据执行 , 跨站点脚本 , 特权升级 , 竞争条件或其他“程序性”攻击,尽pipe它确实有帮助。 除了“标准”程序性防御外,还需要考虑信任,validation,身份和凭证 – 换句话说,就是处理提供程序input的任何内容,以及任何正在消耗程序输出的内容。 例如,从程序的angular度来看,如何防御DNS中毒呢? 有时候,你不能避免代码中的事情 – 让你的最终用户不要把他们的密码交给同事就是一个例子。
将这些概念纳入安全方法 ,而不是“技术”。 安全是一个过程,而不是一个产品 。 当你开始思考你的程序的“另一面”,以及你可以用来缓解这些问题的方法的时候,它会变得更加清晰,什么是正确的,什么是可怕的错误。
在很大程度上。 你需要像犯罪分子一样思考,否则你就不够偏执。
你认为一个诚实的程序员在多大程度上需要知道恶意程序员的方法?
你需要比他们更多地了解。
我确实是一个安全人员,而不是开发人员,根据我的经验,我可以简单地说,除非你是第二职业,否则你不能像黑帽子或专业白帽子那样学习。 这太耗时了。
最重要的是看到一些坏人或专业人士的行动和理解不安全的代码的可能性和影响。
所以通过学习一些技巧,但很多人可能会因为不能破解而感到“虚假的安全感”。 虽然一个更好的技术攻击者可能会在几分钟内破解相同的东西。
话虽如此,只要你牢记这一点,我认为学习一些攻击,学习如何破解东西的乐趣和教育是很好的。
“像鸽子一样天真,像蛇一样聪明”,并且以邪恶的目的去学习技术。 也就是说,这些知识应该慎重使用。 “拥有权利的同时也被赋予了重大的责任”。
肯定学习黑暗的一面。 即使你不学习实际的技术,至less也要努力学习什么是可能的。
alt text http://ecx.images-amazon.comhttp://img.dovov.comI/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
学习交易技巧的好资源是逆向:逆向工程和黑客的 秘密 :开发的艺术 。 它们是为双方写的 – 这些可以用来学习如何入侵,但他们也提供方法来防止这种types的攻击。
谨慎的一句话: 俄勒冈州州长Randal Schwartz 。
在调查我们网站的两个单独事件之后,我只能说在利用这个漏洞之前了解这个漏洞的可能性是微乎其微的。 也许如果你将自己的职业致力于成为一个白帽子,那么你将在大多数stream行的硬件/软件栈中留下所有潜在的漏洞。 但是对于一个普通的程序员来说,你更有可能处于反应模式。
您有责任了解自己的软件如何被黑客入侵,并有责任保持与第三方软件的合理更新。 有一个应对计划来应对袭击是一件好事,特别是如果你是一个高调或高价值的目标。 有些地方会立即closures一个洞,但我们的网站往往留下一些漏洞,以协助执法抓捕凶手。 IT安全小组偶尔会在内部宣布它将进行端口扫描,以使SA不会为此而感到不快。
我个人没有看到技术上的差异。 当然,动机是不同的,但技术游戏是一样的。 就像问“什么样的战争”需要知道什么样的战争。
答案就是这一切,即使他们不积极练习它。
一个常常被忽略的技能是社会工程学。
很多人根本不知道什么时候被骗了。 在一家以前的公司,一个副总裁在一个会议室里让三名(女性)临时工给程序员和系统pipe理员打电话,然后通过脚本尝试让某人授予访问权限或显示密码。 每个临时工都可以在通话的第一个小时内访问某些东西。
我敢打赌,如果在大中型公司进行类似的testing,他们会得到相同的结果。
我认为“防守编码”的一部分包括了解恶意技术,但是同时你并不需要知道所有的技术来有效地防御这些技术。 例如,了解缓冲区溢出攻击不是尝试保护缓冲区溢出的原因。 你保护他们免受溢出,因为如果他们这样做,它可能会在你的程序中造成混乱,无论它是一个错误还是一个攻击。
如果您编写的代码非常彻底,且体系结构良好,那么恶意攻击将无法渗透,因为良好的体系结构应该自动locking副作用和未经授权的访问。
然而,最后一段假定我们有一个完美的工作,我们有很多时间让我们的代码恰到好处 。 既然这样的工作不存在,那么了解恶意技术是一个很好的捷径,因为这意味着虽然你的代码并不完美,但是你可以为这些攻击创build“解决方法”,以确保它们不会得到通过。 但是,这些不会使代码更好,并且不会使应用程序更好。
最终,认识恶意漏洞是一件很好的事情,但只要确保遵守最佳实践,就能覆盖95%的漏洞。
devise为邪恶 。 “好愚蠢的时候,邪恶总是会胜利的。”
总之,如果你不认为自己是罪犯,那并不意味着罪犯不会。
白帽子需要学习的技术之一是如何testing/减轻/思考社会工程学,因为最大的安全威胁是人。
白帽子擅长操纵位子,但黑帽子操纵的人更多。
我将采取有争议的立场,并说有一些黑帽的知识,你不需要成为一个好的白帽黑客。 医生不需要知道如何基因工程病毒,以有效治疗疾病。
我们白色的帽子和灰色的帽子需要善于处理那些黑色的帽子和保护装备只需要一件事
基本上几乎所有黑客使用的安全漏洞都是由不良编程风格或学科引入的代码中的错误。 如果您编写代码来防止不良数据和无效呼叫操作,则会阻止代码中的大部分安全漏洞。
如果你有兴趣保护你的代码免受黑客/滥用等。 你会花太多时间在上面。 只需购买一个软件包来保护基础知识,然后继续前进。
你必须了解'坏人'使用的方法,所以一些理解是强制性的。
对于普通开发人员,我认为只要掌握他们正在做的事情的基本原则就足够了,以避免在他们的项目中造成漏洞。
对于在安全相关领域工作的人(想起银行,或者网上商店的信用卡数据),需要更深入的了解。 这些开发人员需要在“坏人”的运作方式和他所使用的技术之间“走”。
通过学习他们的方式,他开始思考他们的方向。 然后他必须select他想要“属于哪一方”。
技术本身没有什么恶意的东西,知识是纯粹的,它是如何使用它,决定如何看待它。
同一枚硬币的两面。 除了意图之外,问题是什么? 相同的技能,不同的实施。
当我听到黑帽这个词的时候,我想起一个使用电脑知识的人闯入银行,做其他恶作剧的事情。 白帽知道黑帽所知道的一切 ,但只是没有做任何坏事。
因此,你不必关心或知道什么“黑帽”是安全的…
知道黑帽怎么想的 ,当你已经是一个相当的白帽子的时候,不会蹲下。 这就像知道,“约翰想闯入我的房子,窃取我的iPod音乐”。 如果你真的关心你的iPod音乐,那么无论如何你都应该拥有它的安全。