白帽程序员的黑帽知识

当诚实的开发人员学习黑帽黑客的技术时,总会有来自非程序员的怀疑。显然,我们需要学习他们的许多技巧,这样我们才能保持我们自己的安全达到标准。

您认为诚实的程序员需要在多大程度上了解恶意程序员的方法?

5249 次浏览

在很大程度上,你需要像罪犯一样思考,否则你就不够偏执。

我个人看不出有什么技术上的区别。当然,动机是不同的,但技术游戏是相同的。这就像问“好人”需要知道什么样的战争。

答案是全部,即使他们没有积极练习。

我的工作是一个安全人员,而不是一个开发人员,根据我的经验,我可以简单地说,你不可能学到像黑帽子或专业白帽子那样好的东西,除非它是你的第二职业。太费时间了。

最重要的一点是,尽管看到一些坏人或专业人士的行动,并了解什么是不安全代码的可能性和影响。

因此,通过学习一些技巧,但其中很多可能会得到“错误的安全感”,因为他或她不能黑客的感觉。尽管一个技术更高超的攻击者可能在几分钟内黑进同样的东西。

话虽如此,但只要你记住这一点,我认为学习一些攻击是有益的,有趣而且非常有教育意义的学习如何打破东西。

“像鸽子一样无辜,像蛇一样聪明”,并学习那些有邪恶目的的人所做的技巧,这是值得的。也就是说,这些知识应该谨慎使用。“权力越大,责任越大”。

您认为诚实的程序员需要在多大程度上了解恶意程序员的方法?

你需要比他们更了解 更多

归根结底,“黑帽子”们所知道的一切都不是犯罪知识,而只是知识是如何运用的。对任何技术有深刻的理解对于一个程序员来说都是很有价值的,这是我们如何从系统中获得最好的东西的方法。现在我们已经有了越来越多的框架、库和组件,使用这些知识编写的框架、库和组件可以省去你必须了解所有东西的麻烦,但是时不时地深入研究一下也是有好处的。

我认为“防御性编码”的一部分包括了解恶意技术,但同时,为了有效地防御它们,您不一定需要了解所有的技术。 例如,了解缓冲区溢出攻击并不是尝试保护缓冲区免于溢出的理由。您保护它们免于溢出,因为如果它们溢出,那么无论是 bug 还是攻击,都可能对您的程序造成严重破坏。

如果您编写的代码经过了非常彻底的检查和良好的架构,那么恶意攻击将无法渗透,因为良好的架构应该自动锁定副作用和未经授权的访问。

然而,最后一段假设我们有一个完美的工作,我们有难以置信的时间使我们的代码 刚刚好。既然这样的工作不存在,那么了解恶意技术是一个很好的捷径,因为这意味着尽管你的代码并不完美,你可以为这些漏洞创建“非工作区”,以确保它们不会通过。但是,这些不会使代码更好,也不会使应用程序更好。

最终,了解恶意漏洞是一件值得注意的事情,但只要确保遵守最佳实践,95% 的恶意漏洞都将被覆盖。

你必须了解“坏人”使用的方法,所以一些理解是强制性的。

对于一般的开发人员来说,我认为理解他们正在做的事情的基本原则就足够了,这样可以避免在他们的项目中造成漏洞。

对于在安全相关领域工作的人(想到银行业务或网上商店的信用卡数据) ,需要更深入的理解。这些开发人员需要深入了解“坏人”是如何运作的,以及他使用了哪些技术。

通过学习他们的方式,他开始朝着他们的方向思考。然后他必须选择他想要“属于”哪一边。

技术本身没有恶意... 知识是纯粹的... 你如何使用它决定了它应该被如何看待。

我有点异端,大胆地说:

  • 你真的需要和 安全的系统管理员/网络人员 他们的机器。这些人每天都在处理入侵的概念,并且总是在寻找可以用来对付他们的潜在漏洞。在大多数情况下,忽略攻击者思考的“动机”方面,因为“为臭名昭著而黑客”的日子已经一去不复返了。把注意力集中在 方法上。一个有能力的管理员将能够很容易地演示这一点。

当您编写程序时,您呈现的是(希望是)一个无缝的、平滑的接口到 ${ whatever-else-access-your-program-I/O }。在这种情况下,它可能是一个最终用户,也可能是另一台机器上的另一个进程,但这并不重要。始终假设应用程序的“客户端”具有潜在的敌意,不管它是一台机器还是一个人。

不相信我?尝试编写一个小应用程序,接受销售人员的销售订单,然后有一个公司的规则,你需要通过该应用程序执行,但销售人员不断试图走动,以便他们可以赚更多的钱。仅仅这个小小的练习就可以演示一个有动机的攻击者(在本例中是 预期的最终用户)将如何积极地寻找方法来利用逻辑缺陷,或者通过其他手段来玩弄系统。这些都是值得信赖的终端用户!

由于服务器软件通常信任客户端,多玩家在线游戏不断地与作弊者作战; 在任何情况下,客户端都可能被黑客攻击 而且会的,导致玩家在系统中作弊。想想看——这里有些人只是在享受生活,他们会使用极端的手段在一项不涉及赚钱的活动中占据上风。

想象一下一个专业的机器人牧人的动机,他们以这种方式赚钱谋生... 编写恶意软件,这样他们就可以使用别人的机器作为收入来源,把他们的僵尸网络卖给出价最高的垃圾邮件洪水... 是的,这个 真的 发生了

不管动机是什么,重点仍然是,你的程序可以,而且在某种程度上将会受到攻击。它不足以抵御 缓冲区溢出缓冲区溢出堆叠粉碎机、栈执行(代码作为数据加载到栈中,然后执行返回操作卸载栈,导致代码执行)、 数据执行跨网站脚本权限提升比赛条件或其他“程序化”攻击,尽管它确实有帮助。除了您的“标准”程序防御之外,您还需要考虑信任、验证、身份和凭据——换句话说,处理提供程序输入的任何内容和消耗程序输出的任何内容。例如,如何从程序的角度防御 DNS 中毒?有时候,你无法避免代码中的一些东西——让你的最终用户不把他们的密码交给同事就是一个例子。

为了安全起见,将这些概念纳入 方法,而不是“技术”。安全是一个过程,而不是一个产品.当你开始思考程序的“另一面”是什么,以及你可以使用 方法来缓解这些问题时,它会变得更加清晰,知道什么是正确的,什么是 糟透了错误的。

我们白帽子和灰帽子需要擅长很多事情那些黑帽子和滑板只需要在一件事情上成功

White Hats 需要学习的技术之一是如何在社会工程方面进行测试/缓解/思考,因为最大的安全威胁是人。

白帽子擅长操纵比特,但是人们更容易被黑帽子操纵。

- 同一枚硬币的两面-除了意图,还有什么问题? 同样的技巧,不同的执行方式。

绝对要学习黑暗面。即使你不学习实际的技术,至少努力学习什么是可能的。

alt text alt text

学习交易技巧的好资源是 逆转: 逆向工程的秘密黑客: 剥削的艺术。它们是为双方编写的-这些可以用来学习如何黑客,但他们也提供了方法来防止这些类型的攻击。

我将采取有争议的立场,说有一些黑帽子的知识,你不需要成为一个好的白帽子黑客。为了有效地治疗疾病,医生不需要知道如何对病毒进行基因改造。

社会工程是一项经常被忽视的技能。

很多人根本不知道自己什么时候被骗了。在之前的一家公司,一位副总裁让三名(女性)临时工在会议室里打电话给程序员和系统管理员,按照脚本进行测试,试图让某人授予访问权限或泄露密码。每个临时工在接到电话的第一个小时都能接触到一些东西。

我敢打赌,如果在任何一家中型至大型公司进行类似的测试,他们都会得到相同的结果。

基本上,黑客使用的几乎所有安全漏洞都是由糟糕的编程风格或规程引入的代码中的错误。如果您编写代码来防止错误数据和无效调用操作,那么您将阻止代码中的大多数安全漏洞。

如果你有兴趣保护你的代码不被黑客攻击/滥用等等,你会花费太多的时间在上面。买一个包裹来保护基本的东西,然后继续前进。

提醒一句: 俄勒冈州起诉 Randal Schwartz

在我们的网站上调查了两个独立事件,我只是其中的一小部分,我想说在它被用来对付你之前,了解到漏洞的几率是微乎其微的。也许如果你把你的职业生涯奉献给成为一个白帽子,你会在大多数流行的硬件/软件堆栈的所有潜在漏洞之上。但是对于一个普通的程序员来说,您更可能处于反应模式。

您确实有责任了解自己的软件是如何被黑客攻击的,并有责任与第三方软件保持合理的更新。制定一个应急计划来应对袭击是很好的,特别是如果你是一个高知名度或高价值的目标。有些地方会想立即关闭一个漏洞,但我们的网站往往留下一些漏洞,以协助执法部门抓获肇事者。IT 安全团队偶尔会在内部宣布,他们将进行端口扫描,这样 SA 就不会因此而抓狂。

我刚在播客上听说这件事,所以来晚了。然而,作为一个曾经在软件公司的安全团队工作过的人,我将提供我的意见。

实际上,我们非常重视开发人员教育,我们会给尽可能多的开发人员团队提供安全开发方面的基本培训。考虑安全性确实需要从正常开发转变思维方式,所以我们试图让开发人员以“如何打破常规”的思维框架思考问题。我们用的一个道具是带数字键盘的家用保险箱。我们会让开发人员对它进行内部和外部的检查,试图找到一种侵入它的方法。(解决办法是在保险箱顶部猛击的同时,对手柄施加压力,这将导致螺栓在螺线管的弹簧上弹跳。)虽然我们不会给他们特定的黑帽技术,但我们会谈论导致这些漏洞的实现错误——特别是他们以前可能没有遇到过的东西,比如整数溢出或编译器优化了函数调用(比如 memset 清除密码)。我们在内部发布了每月的安全通讯,邀请开发人员在小代码示例中发现与安全相关的 bug,这显然表明他们会错过很多。

我们还试图遵循微软的安全开发生命周期,这将涉及到让开发人员谈论他们的产品的架构,并找出资产和可能的方法来攻击这些资产。

至于安全团队,他们大多是前开发人员,理解黑帽技术对我们来说非常重要。我们负责的事情之一就是接收来自第三方的安全警报,知道黑帽子很难利用某些弱点是分类和调查过程的重要组成部分。是的,有时我需要通过一个调试器来计算易受攻击的例程的内存偏移量,并修补二进制可执行文件。

然而,真正的问题是,其中许多超出了开发人员的能力范围。任何规模合理的公司都会有很多擅长编写代码的开发人员,只是他们缺乏安全意识。所以我对你的问题的回答是: 期望所有的开发人员都有黑帽知识将是一个不受欢迎的和有害的负担,但 某人在你的公司应该有这方面的知识,无论它是一个安全审计和响应团队,或只是高级开发人员。

当我听到“黑帽子”这个词的时候,我想到的是那些利用计算机知识闯入银行并做其他恶作剧的人。白帽子知道黑帽子知道的 一切,但不会对它做任何坏事。

因此,你没有 关心知道什么“黑帽子”是安全的..。

知道黑帽子 认为,当你已经相当于白帽子没有帮助蹲下。就像知道“约翰想闯进我家偷走我的 iPod 音乐”。如果你真的关心你的 iPod 音乐,无论如何你应该让它安全。