界: Code Quality

代码质量不佳会导致不可预测的行为。对于用户来说,通常表现为可用性差。对于攻击者来说,提供了以意外方式对系统施加压力的机会。

1 个项目已找到
弱点
Abstract
使用不推荐的或过时的函数可能表示这是一段被忽略的代码。
Explanation
一般而言,随着编程语言的发展,有时一些方法会因下列原因过时:

- 为了改进该编程语言
- 对如何有效、安全地执行操作有了更深一步的了解

- 某些操作的管理规则发生了变化

有的语言会删除一些语句,并通常将其替换为执行相同任务的新语句,这些新语句采用不同但更有效的处理方式。

具体来讲,SAP ABAP 已演变成将 ABAP 对象(面向对象的 ABAP 扩展)包含在内,并在兼容 Unicode 的环境中运行。因此,在类或 Unicode 程序中实施了更严格的语法。过时构造仅由于为了兼容早期版本而仍然可用,且只能在类外部或非 Unicode 程序中使用。所有过时语言元素均存在替代构造,这提高了程序的效率和可读性。过时语法中很多隐式、模糊的类型/长度/内存规范需要在较新的语法中以更精确和清晰的方式指定。建议采用较新的语法编写程序,使其更容易理解、功能更强大、更易于维护。


并非所有函数都会因为存在安全漏洞而被弃用或被取代。然而,出现被弃用的函数通常表示周围代码已经不起作用了,有可能处于不受维护的状况。在过去很长一段时间内,人们并没有将软件安全放在首位,甚至都未曾考虑过。如果程序使用了不推荐的或过时的函数,在其附近就会潜伏着安全问题。
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 477
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[10] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.abap.obsolete
Abstract
使用不推荐的或过时的函数可能表示这是一段被忽略的代码。
Explanation
随着编程语言的发展,一些函数有时会被弃用,原因如下:

- 为了改进该编程语言
- 对如何有效、安全地执行操作有了更深一步的了解

- 某些操作的管理规则发生了变化


在一种编程语言中,旧函数会被新函数所替代,比起旧函数,新函数更能以我们所期望的方式执行任务。
示例:以下代码会构造一个新的 SqlClientPermission 对象,这个对象规定了用户可以使用的连接到数据库的方式。在这个例子中,程序把 false 作为第二个参数传递给构造函数(控制着是否允许用户用空密码进行连接)。如果传递的参数值为 false,则说明不允许使用空密码。


...
SCP = new SqlClientPermission(pstate, false);
...


然而,因为作为第一个参数传递的 PermissionState 对象代替了任何传递给第二个参数的值,所以这个构造函数允许使用空密码连接到数据库,这与第二个参数相矛盾。要禁止使用空密码,程序应该把 PermissionState.None 传递给构造函数的第一个参数。由于其功能尚不明确,因此不赞成采用 SqlClientPermission 构造函数的“双参数”版本,而建议采用“单参数”版本(与“双参数”版本功能相同但是避免了被误译的风险)。

并非所有函数都会因为存在安全漏洞而被弃用或被取代。然而,出现被弃用的函数通常表示周围代码已经不起作用了,有可能处于不受维护的状况。在过去很长一段时间内,人们并没有将软件安全放在首位,甚至都未曾考虑过。如果程序使用了不推荐的或过时的函数,在其附近就会潜伏着安全问题。
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 477
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[10] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.dotnet.obsolete
Abstract
使用不推荐的或过时的函数可能表示这是一段被忽略的代码。
Explanation
随着编程语言的发展,一些函数有时会被弃用,原因如下:

— 为了改进该编程语言。
— 对操作的有效性、安全性有更深一步的了解。
—某些操作的管理规则发生了变化。

在编程语中,函数会经常被删除或由新的替代函数所取代,因为新的函数能以我们所期望的方式从多种角度执行相同的任务。
示例:以下代码使用了不被推荐的函数 getpw() 来验证明文密码是否与用户加密密码相匹配。如果密码是有效的,则函数将 result 设为 1;如果无效,将其设为 0。


...
getpw(uid, pwdline);
for (i=0; i<3; i++){
cryptpw=strtok(pwdline, ":");
pwdline=0;
}
result = strcmp(crypt(plainpw,cryptpw), cryptpw) == 0;
...


尽管代码经常正确地运行,使用 getpw() 函数从安全角度来说是有问题的,因为它可以溢出传递给它的第二个参数的缓冲区。因为这个漏洞,getpw() 已由 getpwuid() 替代,它与 getpw() 执行相同的查找,但返回一个指向静态分配结构的指针来降低风险。

并非所有函数都会因为存在安全漏洞而被弃用或被取代。然而,出现被弃用的函数通常表示周围代码已经不起作用了,有可能处于不受维护的状况。在过去很长一段时间内,人们并没有将软件安全放在首位,甚至都未曾考虑过。如果程序使用了不推荐的或过时的函数,在其附近就会潜伏着安全问题。
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 477
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[10] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.cpp.obsolete
Abstract
使用不推荐使用的或过时的函数可能表示存在忽略的代码或使用了陈旧的 ColdFusion 版本。
Explanation
随着编程语言的发展,有时会弃用些一些方法,原因是:

- 为了改进该编程语言
- 对如何有效、安全地执行操作有了更深一步的了解

- 某些操作的管理规则发生了变化

在某一种编程语言中,人们通常会放弃使用某些方法,转而采用更新的方法。在执行同样的任务时,新方法会采用不同的处理方式,这种方式往往比原有的方法更合理。


并非所有函数都会因为存在安全漏洞而被弃用或被取代。然而,出现被弃用的函数通常表示周围代码已经不起作用了,有可能处于不受维护的状况。在过去很长一段时间内,人们并没有将软件安全放在首位,甚至都未曾考虑过。如果程序使用了不推荐的或过时的函数,在其附近就会潜伏着安全问题。
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 477
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[10] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.cfml.obsolete
Abstract
使用不推荐的或过时的函数可能表示这是一段被忽略的代码。
Explanation
随着编程语言的发展,有时会弃用些一些方法,原因是:

- 为了改进该编程语言
- 对如何有效、安全地执行操作有了更深一
步的了解
- 某些操作的管理规则发生了变化

在某一种编程语言中,人们通常会放弃使用某些方法,转而采用更新的方法。在执行同样的任务时,新方法会采用不同的处理方式,这种方式往往比原有的方法更合理。
示例:以下代码使用一个字节数组和一个指定每个 16 位 Unicode 字符中前 8 位的值来构造一个字符串对象。


...
String name = new String(nameBytes, highByte);
...


在此示例中,构造函数可能无法正确地将字节转换为字符,具体取决于使用哪个字符集对以 nameBytes 表示的字符串进行编码。由于用于编码字符串的字符集的演变,此构造函数已被弃用,取而代之的是接受用于编码字节进行转换的 charset 的名称作为其参数之一的构造函数。

并非所有函数都会因为存在安全漏洞而被弃用或被取代。然而,出现被弃用的函数通常表示周围代码已经不起作用了,有可能处于不受维护的状况。在过去很长一段时间内,人们并没有将软件安全放在首位,甚至都未曾考虑过。如果程序使用了不推荐的或过时的函数,在其附近就会潜伏着安全问题。
References
[1] MET02-J. Do not use deprecated or obsolete classes or methods CERT
[2] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[3] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[4] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[5] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[6] Standards Mapping - Common Weakness Enumeration CWE ID 477
[7] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[8] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[9] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[10] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[11] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[12] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[13] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.java.obsolete
Abstract
使用不推荐的或过时的函数可能表示这是一段被忽略的代码。
Explanation
随着编程语言的发展,有时会弃用些一些方法,原因是:

- 为了改进该编程语言
- 对如何有效、安全地执行操作有了更深一步的了解

—某些操作的管理规则发生了变化。

在某一种编程语言中,人们通常会放弃使用某些方法,转而采用更新的方法。在执行同样的任务时,新方法会采用不同的处理方式,这种方式往往比原有的方法更合理。
示例:以下代码使用了 Digest::HMAC stdlib,它的使用在文档中是明确禁止的,是由于意外介入才出现在版本中。


require 'digest/hmac'

hmac = Digest::HMAC.new("foo", Digest::RMD160)
...
hmac.update(buf)
...


在此示例中,Digest::HMAC 类在由于偶然纳入版本中而介入时立即被弃用。由于代码是试验性的且未经正确测试,导致类存在不按预期工作的可能性,因此绝对禁止使用该类,尤其是考虑到关系 HMAC 与加密功能有关。

并非所有函数都会因为存在安全漏洞而被弃用或被取代。然而,出现被弃用的函数通常表示周围代码已经不起作用了,有可能处于不受维护的状况。在过去很长一段时间内,人们并没有将软件安全放在首位,甚至都未曾考虑过。如果程序使用了不推荐的或过时的函数,在其附近就会潜伏着安全问题。
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 477
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[10] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.structural.ruby.obsolete
Abstract
使用了一个已弃用的函数。
Explanation
由于智能合约具有快节奏的性质,因此在较新的编译器版本中可能会弃用一些函数和运算符,使用它们可能会导致代码质量低、出现意外的不利作用和/或编译错误。

示例 1:以下代码使用 block.blockhash() 获取当前块的散列值,但是自 Solidity 编译器 0.5.0 版本以来已将其弃用。


bytes32 blockhash = block.blockhash(0);
References
[1] Standards Mapping - CIS Azure Kubernetes Service Benchmark 1.0
[2] Standards Mapping - CIS Amazon Elastic Kubernetes Service Benchmark 5.0
[3] Standards Mapping - CIS Amazon Web Services Foundations Benchmark 2
[4] Standards Mapping - CIS Google Kubernetes Engine Benchmark normal
[5] Standards Mapping - Common Weakness Enumeration CWE ID 477
[6] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[7] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[8] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[9] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[10] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.structural.solidity.swc111