白帽程序员的黑帽知识[关闭]


72

当诚实的开发人员学习黑帽黑客技术时,总是会受到非程序员的怀疑。但是,显然,我们需要学习许多技巧,以便使自己的安全性达到标准。

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


2
我认为更好的问题是“我如何开始获得黑帽已经掌握的知识?” 也就是说,诚实的开发人员可能会从反向工程技巧等方面有一个起点吗?
Onorio Catenacci

2
我会说“完全”。除非您确切知道攻击的执行方式,否则还可以如何防止攻击?
mpen

Answers:


38

我来晚了,因为我刚刚在播客上听说过它。但是,作为在软件公司的安全团队中工作的人,我将提出自己的看法。

实际上,我们非常重视开发人员教育,并且会尽可能多地为开发人员团队提供安全开发方面的基础培训。考虑安全性确实需要从常规开发中转移思维,因此我们将尝试使开发人员以“如何打破常规”的思维方式进行思考。我们使用的一种道具是带有数字键盘的家用保险箱之一。我们会让开发人员从内到外对其进行检查,以尝试提出一种闯入它的方法。(解决方案是在向手柄施加压力的同时,向保险柜的顶部施加尖锐的打击,这将导致螺栓在螺线管中的弹簧上弹起。)虽然我们没有给他们提供特定的黑帽技巧,但我们谈论导致这些漏洞的实施错误-尤其是它们以前可能没有遇到过的事情,例如整数溢出或编译器优化了函数调用(例如使用memset清除密码)。我们在内部每月发布一次安全时事通讯,邀请开发人员在小代码示例中发现与安全相关的错误,这些错误肯定表明了他们会错失多少。

我们还尝试遵循Microsoft的安全开发生命周期,这将涉及使开发人员讨论其产品的体系结构,并找出资产和攻击这些资产的可能方法。

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

但是,真正的问题是,其中很多超出了开发人员的能力范围。任何一家规模适中的公司都会有许多开发人员,他们足够擅长编写代码,但没有安全意识。因此,我对您的问题的回答是:希望所有开发人员都拥有黑帽知识将是不受欢迎且有害的负担,但是您公司中的某人应该拥有该知识,无论是安全审核和响应团队,还是仅仅是高级开发人员。


1
那是一个很好的答案。您是完全正确的,尤其是在上一段中。
大卫2010年

45

归根结底,“黑帽”所知道的不是犯罪知识,而是知识的应用方式。作为程序员,对任何技术都有深刻的了解是很有价值的,这是我们从系统中获得最大收益的方法。这些天可能会不知不觉,因为我们已经使用这种知识编写了越来越多的框架,库和组件,以节省您必须了解的一切,但时不时地挖掘仍然是一件好事。


38

我会有点异端,弯腰说:

  • 您确实需要与保护计算机安全的sysadmin / network人士交谈。这些人每天都在处理入侵的概念,并且一直在寻找可以用来对付他们的潜在攻击。在大多数情况下,请不要理会攻击者的想法的“动机”方面,因为“为恶名而hacking”的时代已经过去了。而是专注于方法论。一个称职的管理员将能够轻松地证明这一点。

在编写程序时,您希望(无缝地)呈现到$ {whatever-else-accepts-your-programs-I / O}的无缝,平滑接口。在这种情况下,它可能是最终用户,也可能是另一台计算机上的另一个进程,但这并不重要。 始终假定应用程序的“客户端”可能是敌对的,无论它是机器还是人。

不相信我吗 尝试编写一个小型应用程序,该程序可以从销售人员那里获得销售订单,然后制定一条公司规则,您需要通过该应用程序来执行该规则,但是销售人员一直在不断努力,以使他们能够赚更多的钱。仅此一项小小的练习就可以证明一个有动机的攻击者(在这种情况下,是最终用户)将如何积极地寻找利用逻辑缺陷或通过其他方式玩系统的方法。 这些都是值得信赖的最终用户!

多人在线游戏一直在与作弊者作战,因为服​​务器软件通常会信任客户端。并且在所有情况下,客户端都可能被黑客入侵,从而导致玩家玩这个系统。考虑一下-在这里,我们有些人只是在享受自己,而他们将采取极端的措施在不涉及赚钱的活动中占上风。

试想一下,一个以这种方式谋生的专业bot牧民的动机...编写恶意软件,以便他们可以将其他人的机器用作创收工具,将其僵尸网络出售给出价最高的人,以应对大量垃圾邮件...是的, 确实 发生了

无论动机如何,问题仍然存在,您的程序可能会并且在某个时候受到攻击。仅仅防止缓冲区溢出堆栈粉碎,堆栈执行(将按代码存储的数据加载到堆栈中,然后执行返回操作以卸载堆栈,导致执行代码),数据执行跨站点是不够的脚本特权提升竞争条件或其他“程序”攻击,尽管确实有帮助。除了“标准”程序防御之外,您还需要考虑信任,验证,身份和凭据,换句话说,要处理提供程序输入的任何内容和消耗程序输出的任何内容。例如,从程序的角度来看,如何防止DNS中毒?有时,您无法避免在代码中出现问题-例如让最终用户不要将密码移交给同事。

将这些概念合并到安全性方法中,而不是“技术”中。 安全是一个过程,而不是产品。当你开始了解什么是“另一边”你的程序,以及思维方法,你可以使用,以减轻这些问题,它会变得至于什么可以去的权利更清晰,什么可以去可怕的错误。


19

在很大程度上。您需要像罪犯一样思考,否则您会变得偏执。


2
如果您不知道如何思考,您将无法像那样思考。这就像“在不学习LINQ的情况下思考LINQ解决方案”。它不会工作。
博士 邪恶的

17
像罪犯一样思考涉及获取知识。罪犯也要经历学习过程。
本S

10
而且我认为这只是涉及勒死的小猫
而已。...– Quibblesome

5
(-1)尽管您的评论是朝着正确方向迈出的一步,但您实际上并未说过任何对提问者有用的内容。IE,他如何“像罪犯一样思考”,他如何“学习他们所做的一切”。
DevinB

1
@Scott,我可以将“像罪犯一样思考”作为解决此问题的方法。我只是认为您的答案对提出问题的人没有帮助。
DevinB

18

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

您需要了解的只是他们。


阅读我的回答,您几乎可以在大多数时间里看到它是不可能的,除非您有太多时间可以倒入它。
博士 邪恶的

3
我不同意。如果您是网络程序员,则需要了解程序受到攻击的所有方式,以保护它们。您可以(并且应该)聘请专业人士来帮助您,但是学习您在付费开发的任何类型的程序中使用的安全技术,应该是您工作的一部分。
比尔蜥蜴

13
闯入和防御之间有很大的区别。如果编写了参数化的SQL查询,就可以完成针对SQL Injeciton的代码安全性。因此,您不需要了解10种不同的方法来利用SQL注入。如果您对利用SQL注入进行快速搜索,则可以根据上下文简单地找到4-5种不同的主要方法,而基于后端数据库则可以找到许多其他可能性,但是作为开发人员,知道10种不同的方法将无济于事。
博士 邪恶的

5
我明白你的意思,我也有些同意。您不需要知道如何执行10种不同的攻击,但是您确实需要知道如何防御所有这些攻击。它并不总是像涵盖所有攻击的参数化SQL查询解决方案那样容易。
比尔蜥蜴

13

我确实是一名安全人员,而不是开发人员,根据我的经验,我可以简单地说,除非您是第二职业,否则您不会像黑帽或专业白帽那样学到好东西。太浪费时间了。

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

因此,通过学习一些技巧,其中很多技巧可能会因为“他或她无法破解”而感到“虚假的安全感”。尽管技能更好的攻击者可能会在几分钟之内破解相同的东西。

话虽如此,只要您牢记这一点,我认为学习一些攻击,有趣和非常有教育性的知识来学习如何破解东西是件好事。


2
我认为学习一些技巧不会比什么都不学会让您感到更安全。如果您了解这些事情的完成方式,则应该感到害怕,而不应陷入虚假的安全感中。
ScottStonehouse

1
好的一点是,除非是专职工作,否则您根本无法了解安全性。这不是我的全职工作,这只会使我更加偏执。
ScottStonehouse

1
是的,一旦您意识到您并不了解该主题的全部知识,那就让您的手有点脏总是一件好事:)
博士。邪恶的

刚刚更新了答案以澄清/强调最后一句话。
博士 邪恶的


9

它有必要做到“像鸽子一样天真,像蛇一样聪明”,并学习具有邪恶目的的人们所做的技术。就是说,应该谨慎使用这些知识。“拥有权利的同时也被赋予了重大的责任”。


8
一起引用圣经和蜘蛛侠。我喜欢。
jergason

9
强大的力量也带来了强大的电力!
乔·菲利普斯

8

一个警告:俄勒冈州vs. Randal Schwartz

我只是调查了我们站点上两个单独事件的一小部分,所以我说,在对您进行利用之前,了解该利用的几率很小。也许,如果您将职业生涯奉献给白帽子,那么您将留在大多数流行的硬件/软件堆栈的所有潜在漏洞之上。但是对于普通程序员来说,您更有可能处于反应模式。

您确实有责任了解如何对自己的软件进行黑客攻击,并有责任合理了解最新的第三方软件。最好制定应急计划来应对攻击,特别是如果您是高调或高价值的目标。有些地方希望立即关闭漏洞,但我们的站点倾向于保留某些漏洞,以协助执法人员抓捕肇事者。IT安全团队偶尔会在内部宣布它将进行端口扫描,以免SA感到惊讶。


因此,听起来好像知道该怎么做可能是好的,但实际上未经许可绝对不行!
PearsonArtPhoto

5

我个人没有看到技术上的区别。确保动机不同,但技术游戏相同。这就像问“好吃的东西”需要知道什么样的战争。

答案是全部,即使他们没有积极地实践它。


5

社交工程经常被遗忘的一项技能。

许多人根本不认识自己何时被拘禁。在一家先前的公司中,一位副总裁通过在会议室中让三名(女性)临时工打电话给程序员和系统管理员来进行测试,并通过脚本工作来尝试使某人授予访问权限或透露密码。每个临时工作人员都可以在通话的第一个小时访问某些内容。

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


5

我认为“防御性编码”的一部分包括了解恶意技术,但同时,您不一定需要了解所有技术即可有效防御这些技术。例如,了解缓冲区溢出攻击并不是尝试防止缓冲区溢出的原因。您可以防止它们溢出,因为如果这样做,它们可能会对程序造成严重破坏,无论它是错误还是攻击。

如果您编写了经过全面检查且结构良好的代码,则恶意攻击将无法渗透,因为良好的体系结构应自动阻止副作用和未经授权的访问。

但是,最后一段假设我们有一个完美的工作,可以花大量时间使我们的代码正确无误。由于不存在这样的工作,因此了解恶意技术是一个很好的捷径,因为这意味着尽管您的代码并不完美,但是您可以为这些漏洞创建“非解决方法”,以确保它们不会被利用。通过。但是,这些不能使代码更好,也不能使应用程序更好。

归根结底,了解恶意攻击是一件好事,但只要确保您遵循最佳实践,就能覆盖其中的95%。



3

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

白帽(White Hats)擅长操纵位,但人们是黑帽(Black Hats)操纵频率更高的人。


1

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


软件开发并不(希望)像医生那样治疗疾病。实际上,您的医生可能只会签下护士来管理您要求的流感疫苗。此外,一般而言,医生对病毒没有有效的治疗方法。但是,参与疫苗本身开发的一些人最有可能具备制造病毒的知识。
Marsh Ray,2009年

1

我们白帽子和灰帽子需要擅长于一百万件事,而那些黑帽子和滑橇只需要一件事情就能成功


5
这也被表达为“我们每次都要幸运,他们(黑客)只需幸运一次”
Richard Ev

没错,那是同一句话,只是
用法

1

基本上,黑客使用的几乎所有安全漏洞都是不良的编程风格或纪律所引入的代码错误。如果编写代码以防止不良数据和无效调用操作,则将阻止代码中的大多数安全漏洞。

如果您有兴趣保护自己的代码免遭黑客入侵/滥用/其他攻击。您会花太多时间在上面。只需购买一个包装来保护基础知识,然后继续前进即可。


0

您必须了解“坏蛋”使用的方法,因此必须理解。

对于普通的开发人员,我认为了解他们正在做的基本原则足以避免在他们的项目中创建漏洞。

对于在安全相关领域工作的人(想到银行业务或来自在线商店的信用卡数据),需要更深入的了解。这些开发人员需要深入了解“坏人”的运作方式和使用的技术。


0

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

技术本身没有恶意……知识是纯净的……决定如何看待它的是您如何使用它。


0

同一枚硬币的2面。除了意图-还有什么问题?相同的技能,不同的实现。


4
不-逐步调试程序以计算易受攻击的例程的内存偏移并修补二进制可执行文件是与检查输入以防止缓冲区溢出(例如)不同的技能。程序员应该理解模型,但是黑帽必须知道如何实施攻击。

1
@guns:这是迄今为止最好的例子之一。请提出真实答案,以便可以接受甚至接受。
Dinah

0

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

因此,你不必关心或者知道什么是“黑帽”是是安全的?

知道了黑帽的想法之后,当你已经等效于白帽的时候,蹲下来就无济于事了。这就像知道,“约翰想闯入我的房子并偷走我的iPod音乐”。如果您真的很在意iPod音乐,则应该确保它的安全性。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.