一个人对整体安全风险有很好的了解,知道OWASP十大漏洞是什么,并且拥有CEH,CISSP,OCSCP等认证,这些认证是更黑盒的测试。此外,他还阅读了OWASP测试指南,代码审查指南等内容并备忘单。他是否可以在不了解多种编程语言并精通它们的情况下执行安全的代码审查?

评论

如果他不知道编写要检查的代码所使用的语言,则将无法执行全面的安全代码检查。

请不要用第三人称:P

您能在underhanded-c.org上捕获并了解所有漏洞利用程序吗(这些漏洞非常简短,并进行了详细说明)?那是一种语言。

@drewbenn另一个很好的例子是escape.alf.nu-防止XSS使用清理非常困难。大多数任务要求您确切了解JavaScript和HTML的工作方式和交互方式。

“要理解别人的代码,您的性能必须是从头开始编写时的两倍。”

#1 楼

它取决于“安全源代码分析”的含义。一个人可以做任何一件令人高兴的事。我认为,问题是当其他人要求进行“安全源代码分析”时,又想知道为什么没有资格进行此分析。

在许多情况下,必须进行这种分析由主题专家(SME)。在最终产品中,中小型企业将提供一个声明,基本上说“我声明此代码是安全的”,但要理解的是,该声明比“我正在寻找一堆已知模式,但没有发现问题”更为深刻。 br />
如果您对中国哲学的真实译本感兴趣,您是否会信任一个对哲学有很多了解的人,并且拥有一大堆备忘单来帮助理解它,但实际上却不知道是中文吗?

想到的一个很好的例子是击中SQL引擎的错误。原谅我没有提供哪个引擎或哪个版本的名称,以便您可以验证,此后我一直找不到它。但是,该错误是严重的。错误出在如下代码中:

int storeDataInCircularBuffer(Buffer* dest, const char* src, size_t length)
{
    if (dest->putPtr + length < dest->putPtr)
        return ERROR; // prevent buffer overflow caused by overflow
    if (dest->putPtr + length > dest->endPtr) {
        ... // write the data in two parts
        return OK;
    } else {
        ... // write the data in one part
        return OK;
    }
}


该代码旨在作为循环缓冲区的一部分。在循环缓冲区中,当到达缓冲区的末尾时,会回绕。有时这会迫使您将传入的消息分为两部分,这没关系。但是,在此SQL程序中,他们担心length可能足够大而导致dest->putPtr + length溢出的情况,这为缓冲区溢出创造了机会,因为下一次检查无法正常进行。因此他们进行了测试:if (dest->putPtr + length < dest->putPtr)。他们的逻辑是,只有在发生溢出的情况下,该语句才是正确的,这样我们才能捕获到溢出。

这创建了一个实际上被利用的安全漏洞,必须对其进行修补。为什么?好吧,对于原始作者不为人知的是,C ++规范声明指针的溢出是未定义的行为,这意味着编译器可以执行其所需的任何操作。碰巧的是,当原始作者对其进行测试时,gcc实际上发出了正确的代码。但是,在以后的几个版本中,gcc确实进行了优化以利用这一点。它发现if语句没有可以通过其测试并对其进行优化的已定义行为!

因此,在少数版本中,即使代码进行了明确的检查以阻止所说的利用,人们仍然拥有带有漏洞利用的SQL服务器!

基本编程语言非常强大可以轻松咬住开发人员的工具。分析是否会发生这种情况确实需要所使用语言的扎实基础。

(编辑:Greg Bacon足够擅长对此进行CERT警告:漏洞注意VU#162289 C编译器可能会默默地放弃一些环绕式检查,以及与此相关的检查。谢谢Greg!)

评论


评论不作进一步讨论;此对话已移至聊天。

–Rory Alsop♦
15年11月26日在23:07

是的我应该指出,在不了解语言的情况下,分析人员甚至可能不知道程序员在做什么(更不用说能够找到所有安全问题了),或者为什么。有些语言具有一些非常有趣的功能,如果您不太了解该语言,这些功能将不明显。希望大多数类似的东西会对分析师发表评论,但我不会完全依靠评论来指导您。

–Brōtsyorfuzthrāx
15年11月27日在9:20

编译器的这种行为总是让我感到奇怪:假设编译器知道存在未定义的行为,并且100%的时间未定义的行为是您在代码中所不想要的,因此编译器无法在以下情况下发出警告做这样的事情?这样可以避免大量的错误。

–巴库留
15年11月27日在11:57

@Bakuriu:在C ++中,当专门化模板或使用常量参数优化内联函数调用时,通常会出现这种“不可能发生”的情况,而不会出现任何错误-在这种情况下,优化它们对于性能绝对至关重要。对于编译器而言,很难可靠地区分“程序员写了一些未定义的东西”和“程序员以有效方式使用了有效的泛型函数,可以为泛型情况生成更好的代码”,并且仅在前一种情况下才报告警告。

– hmakholm留在Monica上
15年11月27日在14:19

#2 楼

我认为您需要成为一名优秀的程序员才能成功,所以我建议成为一名程序员。您的工具包/扫描仪可能遗漏了很多东西。老实说,我不建议您完全依赖工具为您扫描代码,因为漏洞利用会不断变化,并且有人可能以某种方式使扫描程序无法检测到漏洞。

单步执行代码,看看它如何工作以及不应该如何工作,这是确保软件开发安全的基础。让开发人员知道安全问题,这正是生产可靠产品时想要的,也是在代码审查期间真正需要的。

是的,您可以指向并单击并检查扫描仪和工具包的安全漏洞,在宏大的计划中并不是很有效。您是否知道自己看一下代码并确定代码的好坏,会更有效吗? Waaaay更好。

如果您不知道自己在做什么,请不要尝试通过安全的代码审查,但是如果您觉得自己不对,就不要完全放弃这个想法。在这里您可以进行良好的审查。我建议尝试通过创建自己的模型安全代码审查来学习,并进行几次以确保一切正常。

但是,您仍然不仅应该学习编码,而且还应该学习良好的代码。

评论


另请注意,扫描程序仅扫描已知漏洞/ atack向量

– Pinoniq
15年11月24日在23:35

#3 楼

值得怀疑的是,安全专家在没有熟练的程序员的情况下能否有效地执行源代码分析。许多漏洞是技术或语法编码实践的结果,这些实践以较小的方式被滥用。缺少分号,等号而不是双等号,在第一天被双重定义的数组边界,但在后续发行版中更改了一个版本,缺少括号,内存泄漏,所有这些都导致了漏洞。有经验的开发人员可能会看到这些,但新手可能不会。

您的安全专家应该做的是鼓励工程师使用自动扫描工具,例如静态代码分析器,模糊测试器和动态应用程序。验证者。帮助工程团队了解输入验证,注入攻击,信任边界。建立意识,即需要适当地对安全缺陷进行优先排序并迅速解决。安排并进行笔测试。而且最重要的是,让工程师对彼此的工作进行代码审查。是的,安全专家应该能够读取代码,但这并不意味着他有资格担任仲裁员。代码安全性。

#4 楼

这取决于您的期望。如果测试人员对安全概念有深入的了解,即使设计人员仅能够遵循代码流程而又不了解其设计问题(例如缺少CSRF保护,仅协议的基本实现等)而导致的安全漏洞,也很可能会发现。对特定的编程语言有更深入的了解。

但是特定于语言的安全性问题,例如缓冲区溢出,一字不漏的错误,unicode或q4312079q的处理,由数据类型的大小和如果测试人员对语言,不当行为以及特定于该语言的典型不安全模式没有更深入的了解,则将找不到签名与未签名等。以Java漏洞的历史为例,即使Java专家开发人员也没有注意到他们通过增加对语言的反射而在语言的沙箱中打出的漏洞,而只有对语言内部有深刻理解的外部专家才发现了漏洞。

#5 楼


是否需要成为一名优秀的程序员才能执行安全的源代码分析?


号。


他能做到吗?在不了解多种编程语言并精通它们的情况下执行安全的代码审查?


否。

在编程方面,除了各种语言的详细知识外,还有很多专业知识工作。这是成为一名优秀的程序员所需要的事情之一,也是从安全角度(或其他质量)角度分析源代码所需要的事情之一。

您不需要成为一名优秀的程序员,就需要精通所涉及的语言。

评论


因此,根据您的要求,您会熟练掌握语言=吗?

–克里希纳·潘迪(Krishna Pandey)
2015年11月25日在12:01

@ K.P。抱歉,我没有关注您。

–琼·汉娜(Jon Hanna)
15年11月25日在12:05

我的理解是,精通该语言应使某人成为优秀的程序员。不是吗

–克里希纳·潘迪(Krishna Pandey)
2015年11月25日12:08

几乎不。您可能知道一种语言的每一个细微差别,并且不擅长设计,问题解决,算法选择,不变定义,测试开发或大多数调试。掌握语言固然重要,但这不是最重要的事情。确实,对于编程而言,它可能比对源代码进行分析要少(不了解某个特定功能的程序员可以用另一种方式来攻击该问题,对一个不了解实际使用的特定功能的程序进行分析的人最好学习一下它。能够分析其含义)。

–琼·汉娜(Jon Hanna)
2015年11月25日在12:19

但是,由于有时漏洞可能存在于较差的设计中而不是错误的实现中,因此可能也需要设计知识。

– reirab
2015年11月25日在16:01

#6 楼

安全的代码审查不仅需要高级语言的知识,还需要编译器选项的知识,以及代码如何在CPU上真正起作用!高级语言可以高效地编写代码,因为它们隐藏了很多复杂性。但是许多错误和错误隐藏在复杂性之内。正如另一个答案中指出的那样,编译器会尝试做正确的事情,但是您确实需要通过反汇编代码并深入了解其工作原理来了解正在发生的事情。

这种理解也是JavaScript之类的脚本语言所必需,这些语言可将高级代码解释为CPU指令和内存分配。不幸的是,该评论将取决于平台。参见例如https://en.m.wikipedia.org/wiki/Interpreted_language。

评论


这是真正的答案。 15年前,安全专家发现了漏洞,写了漏洞利用程序,写了有关新技术的论文,等等。现在,他们刚刚获得“认证”,并抛出了一些他们可能只在概念上理解的术语(例如,缓冲区溢出,写一个?),并认为它们与先锋黑客相同。两种截然不同的比赛方式。通过工具的检查与安全性不同。都无法幸免。

– HH-向Carole Baskin道歉
2015年11月25日9:38



如果您专注于Java和JavaScript等许多现代语言,则情况并非如此。

–尼尔·史密斯汀(Neil Smithline)
2015年11月25日15:30

@NeilSmithline在这种情况下,情况甚至更糟,因为它现在在CPU上的运行方式取决于它在哪个CPU上运行(就JavaScript而言,它在哪个解释器上运行)。

– reirab
2015年11月25日15:57

@NeilSmithline-我相信您仍需要了解JavaScript之类的脚本语言如何将高级代码解释为CPU指令和内存分配,以便可以肯定地说一些代码是安全的。不幸的是,该评论将取决于平台。

–石真
2015年11月25日的16:00

嗯...对我来说似乎不是这样,但显然其他人也同意你的看法。

–尼尔·史密斯汀(Neil Smithline)
2015年11月25日16:19

#7 楼

为了正确计算出旁道攻击的危险,您需要了解硬件。确实存在丑陋的旁通道攻击,例如在多CPU设置上并行运行一个非特权进程,并与一个特权进程并行执行一些加密/解密任务,并探究哪些共享缓存行以哪种时间模式或以何种方式被弄脏了。定时对特定模式序列的各自传送进行加密。

随着加密算法受到数学家和其他理论家的严格审查,旁道攻击已成为重新打开游戏的越来越重要的方式。缺点是它们必须针对特定的实现,代码和硬件而设计。

评论


并没有真正解决编程技巧,这是问题的重点。

–尼尔·史密斯汀(Neil Smithline)
2015年11月25日15:28