Reino: Code Quality

Códigos de baixa qualidade levam a comportamentos imprevisíveis. Da perspectiva do usuário, isso normalmente se manifesta como usabilidade ruim. Para um invasor, trata-se de uma oportunidade para atacar o sistema de formas imprevistas.

2 itens encontrados
Vulnerabilidades
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Em geral, conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam determinadas operações

Instruções removidas de uma linguagem são geralmente substituídas por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.

Em particular, o SAP ABAP evoluiu a ponto de incluir Objetos ABAP (a extensão do ABAP orientada a objetos) e de operar em um ambiente compatível com Unicode. Como resultado, uma sintaxe mais rigorosa é imposta em classes ou em programas Unicode. Construções obsoletas ainda estão disponíveis somente por questões de compatibilidade com versões mais antigas e só podem ser usadas fora de classes ou em programas não Unicode. Existem construções substitutas para todos os elementos de linguagem obsoletos que melhoram a eficiência e capacidade de leitura de programas. Muitas especificações de tipo/comprimento/memória ambíguas implícitas na sintaxe obsoleta devem ser especificadas de forma mais precisa e explícita na sintaxe mais recente. Recomenda-se adotar a sintaxe mais recente para tornar os programas mais fáceis de entender, mais robustos e mais simples de manter.


Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 477
[2] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[3] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[4] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[5] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[6] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[7] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[8] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002610 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.abap.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, funções acabam se tornando obsoletas pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam determinadas operações


Funções removidas de uma linguagem são geralmente substituídas por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo 1: O código a seguir constrói um novo objeto SqlClientPermission que regula como os usuários podem se conectar a um banco de dados. Neste exemplo, o programa transmite false como o segundo parâmetro para o construtor, que controla se os usuários têm permissão para se conectarem com senhas em branco. A transmissão de "false" para esse parâmetro indica que senhas em branco não devem ser permitidas.


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


No entanto, como o objeto PermissionState transmitido como o primeiro parâmetro substitui qualquer valor transmitido ao segundo parâmetro, o construtor permite senhas em branco para conexões de banco de dados, o que contradiz o segundo argumento. Para proibir senhas em branco, o programa deve transmitir PermissionState.None ao primeiro parâmetro do construtor. Devido à ambiguidade na sua funcionalidade, a versão de dois parâmetros do construtor SqlClientPermission foi preterida a favor da versão de parâmetro único, que transmite o mesmo grau de informações sem o risco de má interpretação.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 477
[2] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[3] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[4] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[5] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[6] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[7] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[8] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002610 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.dotnet.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, funções acabam se tornando obsoletas pelos seguintes motivos:

- Avanços na linguagem.
- Melhor compreensão de como as operações devem ser realizadas de forma eficaz e segura.
- Alterações nas convenções que regem certas operações.

Funções removidas são geralmente substituídas por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo 1: O código a seguir usa a função preterida getpw() para verificar se a senha de texto sem formatação corresponde à senha criptografada de um usuário. Se a senha for válida, a função definirá result como 1; caso contrário, ele será definido como 0.


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


Embora o código muitas vezes se comporte corretamente, usar a função getpw() pode ser uma estratégia problemática sob o ponto de vista da segurança, pois pode estourar o buffer transmitido para seu segundo parâmetro. Devido a essa vulnerabilidade, getpw() foi suplantado por getpwuid(), que executa a mesma pesquisa que getpw(), mas retorna um ponteiro para uma estrutura estaticamente alocada a fim de atenuar o risco.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 477
[2] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[3] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[4] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[5] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[6] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[7] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[8] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002610 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.cpp.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado ou o uso de uma versão antiquada do ColdFusion.
Explanation
Conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam certas operações

Métodos removidos de uma linguagem são geralmente substituídos por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.


Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 477
[2] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[3] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[4] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[5] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[6] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[7] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[8] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002610 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.cfml.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Melhor compreensão de como as operações devem ser realizadas com eficiência e
segurança
- Mudanças nas convenções que regulam certas operações

Métodos removidos de uma linguagem são geralmente substituídos por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo 1: O código a seguir constrói um objeto de string a partir de um array de bytes e um valor que especifica os primeiros 8 bits de cada caractere Unicode de 16 bits.


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


Neste exemplo, o construtor pode falhar ao converter corretamente bytes em caracteres, dependendo de qual conjunto de caracteres é usado para codificar a string representada por nameBytes. Devido à evolução dos charsets utilizados para codificar strings, este construtor foi descontinuado e substituído por um construtor que aceita como um de seus parâmetros o nome do charset usado para codificar os bytes para conversão.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] MET02-J. Do not use deprecated or obsolete classes or methods CERT
[2] Standards Mapping - Common Weakness Enumeration CWE ID 477
[3] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[4] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[5] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[6] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[7] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[8] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002610 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002610 CAT II
[12] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.semantic.java.obsolete
Abstract
O uso de funções obsoletas ou preteridas pode indicar um código negligenciado.
Explanation
Conforme as linguagens de programação evoluem, métodos acabam se tornando obsoletos pelos seguintes motivos:

- Avanços na linguagem
- Uma melhor compreensão de como as operações deveriam ser realizadas de maneira efetiva e
segura
- Mudanças nas convenções que regulam certas operações.

Métodos removidos de uma linguagem são geralmente substituídos por equivalentes mais atuais que realizam a mesma tarefa de maneira um pouco diferente e, quem sabe, ainda melhor.
Exemplo 1: O código a seguir usa a stdlib Digest::HMAC, cujo uso é explicitamente desencorajado na documentação devido ao envolvimento acidental em uma versão.


require 'digest/hmac'

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


Neste exemplo, a classe Digest::HMAC foi preterida imediatamente após o envolvimento devido à inclusão acidental em uma versão. Devido à possibilidade de ela não funcionar como o esperado por causa de um código experimental e não testado apropriadamente, a utilização é extremamente desencorajada, especialmente considerando-se a relação que os HMACs têm com a funcionalidade criptográfica.

Nem todas as funções são preteridas ou substituídas porque representam um risco de segurança. No entanto, a presença de uma função obsoleta muitas vezes indica que o código circundante foi negligenciado e pode estar em mau estado de conservação. Por muito tempo, a segurança dos softwares nunca foi uma prioridade ou sequer era levada em consideração. Se o programa usar funções preteridas ou obsoletas, ele aumentará a probabilidade de haver problemas de segurança à espreita nas proximidades.
References
[1] Standards Mapping - Common Weakness Enumeration CWE ID 477
[2] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002617
[3] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[4] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-2 Flaw Remediation (P1)
[5] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-2 Flaw Remediation
[6] Standards Mapping - OWASP Application Security Verification Standard 4.0 1.14.6 Configuration Architectural Requirements (L2 L3)
[7] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002610 CAT II
[8] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002610 CAT II
[9] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002610 CAT II
[10] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002610 CAT II
[11] Standards Mapping - Smart Contract Weakness Classification SWC-111
desc.structural.ruby.obsolete
Abstract
A função é obsoleta e não pode garantir que um ponteiro seja válido ou que o uso da memória referenciada seja seguro.
Explanation
Há vários motivos para não se usar a classe de funções IsBadXXXPtr(). Essas funções:
1) Não são "thread-safe".
2) Estão frequentemente envolvidas em travamentos causados por sua sondagem de endereços de memória inválidos.
3) São incorretamente designadas como funções que realizam um tratamento impróprio de erros durante condições de exceção.

Exemplo 1: O código a seguir usa IsBadWritePtr() em uma tentativa de impedir gravações de memória inválidas.

if (IsBadWritePtr(ptr, length))
{
[handle error]
}


Os programadores costumam usar essas funções com a pretensão de que irão detectar casos de exceção, mas elas geralmente causam mais problemas do que os corrigem.
References
[1] Raymond Chen IsBadXxxPtr should really be called CrashProgramRandomly
[2] IsBadWritePtr Function Microsoft
[3] Standards Mapping - Common Weakness Enumeration CWE ID 477
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-001094
[5] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Rule 1.5
[6] Standards Mapping - NIST Special Publication 800-53 Revision 4 SC-5 Denial of Service Protection (P1)
[7] Standards Mapping - NIST Special Publication 800-53 Revision 5 SC-5 Denial of Service Protection
[8] Standards Mapping - OWASP Top 10 2004 A9 Application Denial of Service
[9] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.9
[10] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP6080 CAT II
[11] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP6080 CAT II
[12] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP6080 CAT II
[13] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP6080 CAT II
[14] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP6080 CAT II
[15] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP6080 CAT II
[16] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP6080 CAT II
[17] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002400 CAT II
[18] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002400 CAT II
[19] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002400 CAT II
[20] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002400 CAT II
[21] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002400 CAT II
[22] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002400 CAT II
[23] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002400 CAT II
[24] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002400 CAT II
[25] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002400 CAT II
[26] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002400 CAT II
[27] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002400 CAT II
[28] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002400 CAT II
[29] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002400 CAT II
[30] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002400 CAT II
[31] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002400 CAT II
[32] Standards Mapping - Security Technical Implementation Guide Version 6.2 APSC-DV-002400 CAT II
[33] Standards Mapping - Web Application Security Consortium Version 2.00 Denial of Service (WASC-10)
[34] Standards Mapping - Web Application Security Consortium 24 + 2 Denial of Service
desc.semantic.cpp.obsolete_inadequate_pointer_validation