Reino: Input Validation and Representation
Problemas de validação e representação da entrada são causados por metacaracteres, codificações alternativas e representações numéricas. Confiar na entrada resulta em problemas de segurança. Os problemas incluem: “Buffer Overflows”, ataques de “Cross-Site Scripting”, “SQL Injection”, entre outros.
String Termination Error
Abstract
Depender da correta terminação de cadeia de caracteres pode resultar em estouro de buffer.
Explanation
Erros de terminação de cadeia de caracteres ocorrem quando:
1. Os dados entram em um programa por meio de uma função que encerra sua saída com valor nulo.
2. Os dados são transmitidos para uma função que requer que sua entrada tenha terminação nula.
Exemplo 1: O código a seguir faz a leitura de
O código no
Exemplo 2: No código a seguir,
O código no
Exemplo 3: O código a seguir usa
O código no
Tradicionalmente, as cadeias de caracteres são representadas como uma região de memória contendo dados que terminam com um caractere
Usuários mal-intencionados normalmente exploram esse tipo de vulnerabilidade por meio da injeção de dados com tamanho ou conteúdo inesperado no aplicativo. Eles podem fornecer a entrada mal-intencionada diretamente como entrada para o programa ou indiretamente modificando os recursos do aplicativo, como arquivos de configuração. Se um invasor fizer com que o aplicativo leia além dos limites de um buffer, ele talvez seja capaz de usar um buffer overflow resultante para injetar e executar código arbitrário no sistema.
1. Os dados entram em um programa por meio de uma função que encerra sua saída com valor nulo.
2. Os dados são transmitidos para uma função que requer que sua entrada tenha terminação nula.
Exemplo 1: O código a seguir faz a leitura de
cfgfile
e copia a entrada em inputbuf
usando strcpy()
. Esse código presume erroneamente que inputbuf
sempre conterá um terminador nulo.
#define MAXLEN 1024
...
char *pathbuf[MAXLEN];
...
read(cfgfile,inputbuf,MAXLEN); //does not null-terminate
strcpy(pathbuf,inputbuf); //requires null-terminated input
...
O código no
Example 1
se comportará corretamente se os dados lidos de cfgfile
tiverem uma terminação nula no disco, conforme o esperado. Porém, se um invasor puder modificar essa entrada de forma que ela não contenha o caractere null
esperado, a chamada para strcpy()
continuará copiando da memória até encontrar um caractere null
arbitrário. Isso provavelmente estourará o buffer de destino e, se o invasor puder controlar o conteúdo da memória imediatamente depois de inputbuf
, isso poderá deixar o aplicativo suscetível a um ataque de estouro de buffer.Exemplo 2: No código a seguir,
readlink()
expande o nome de um link simbólico armazenado no buffer path
, de forma que o buffer buf
contenha o caminho absoluto do arquivo referenciado por esse link simbólico. O comprimento do valor resultante é então calculado com o uso de strlen()
.
...
char buf[MAXPATH];
...
readlink(path, buf, MAXPATH);
int length = strlen(buf);
...
O código no
Example 2
não se comportará corretamente, pois o valor lido em buf
por readlink()
não terá terminação nula. Em situações de teste, vulnerabilidades como esta podem não ser capturadas, pois o conteúdo não utilizado de buf
e a memória imediatamente depois dele podem ser null
, fazendo assim com que strlen()
pareça estar se comportando corretamente. No entanto, em condições naturais, strlen()
continuará a atravessar a memória até encontrar um caractere null
arbitrário na pilha, o que resulta em um valor de length
que é muito superior ao tamanho de buf
e pode causar um estouro de buffer em usos subsequentes desse valor.Exemplo 3: O código a seguir usa
snprintf()
para copiar uma string de entrada do usuário e colocá-la em várias strings de saída. Apesar de fornecer barreiras de proteção adicionais em comparação com sprintf()
, principalmente a especificação de um tamanho máximo de saída, a função snprintf()
ainda é suscetível a um erro de terminação de string quando o tamanho de saída especificado é maior que a entrada potencial. Erros de terminação de string podem levar a problemas posteriores, como vazamento de memória ou estouro de buffer.
...
char no_null_term[5] = getUserInput();
char output_1[20];
snprintf(output_1, 20, "%s", no_null_term);
char output_2[20];
snprintf(output_2, 20, "%s", no_null_term);
printf("%s\n", output_1);
printf("%s\n", output_2);
...
O código no
Example 3
demonstra um vazamento de memória. Quando a output_2
for populada com no_null_term
, snprintf()
deverá ler a partir da localização de no_null_term
até que um caractere nulo seja encontrado ou o limite de tamanho especificado seja atingido. Porque não há terminação em no_null_term
, snprintf
continua a ler os dados de output_1
, em que eventualmente atinge um caractere de terminação nulo fornecido pela primeira chamada de snprintf()
. O vazamento de memória é demonstrado pela printf()
daoutput_2
, que contém a sequência de caracteres de no_null_term
duas vezes.Tradicionalmente, as cadeias de caracteres são representadas como uma região de memória contendo dados que terminam com um caractere
null
. Métodos mais antigos de manipulação de cadeias de caracteres dependem frequentemente desse caractere null
para determinar o comprimento da cadeia de caracteres. Se um buffer que não contém um terminador nulo for transmitido para uma dessas funções, a função fará uma leitura além do final do buffer.Usuários mal-intencionados normalmente exploram esse tipo de vulnerabilidade por meio da injeção de dados com tamanho ou conteúdo inesperado no aplicativo. Eles podem fornecer a entrada mal-intencionada diretamente como entrada para o programa ou indiretamente modificando os recursos do aplicativo, como arquivos de configuração. Se um invasor fizer com que o aplicativo leia além dos limites de um buffer, ele talvez seja capaz de usar um buffer overflow resultante para injetar e executar código arbitrário no sistema.
References
[1] M. Howard, D. LeBlanc Writing Secure Code, Second Edition Microsoft Press
[2] Standards Mapping - Common Weakness Enumeration CWE ID 170, CWE ID 665
[3] Standards Mapping - Common Weakness Enumeration Top 25 2024 [12] CWE ID 020
[4] Standards Mapping - DISA Control Correlation Identifier Version 2 CCI-002754, CCI-002824
[5] Standards Mapping - General Data Protection Regulation (GDPR) Indirect Access to Sensitive Data
[6] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2012 Rule 1.3
[7] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C Guidelines 2023 Directive 4.14, Rule 1.3, Rule 21.17
[8] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2008 Rule 0-3-1
[9] Standards Mapping - Motor Industry Software Reliability Association (MISRA) C++ Guidelines 2023 Rule 4.1.3
[10] Standards Mapping - NIST Special Publication 800-53 Revision 4 SI-10 Information Input Validation (P1), SI-16 Memory Protection (P1)
[11] Standards Mapping - NIST Special Publication 800-53 Revision 5 SI-10 Information Input Validation, SI-16 Memory Protection
[12] Standards Mapping - OWASP Mobile 2024 M4 Insufficient Input/Output Validation
[13] Standards Mapping - OWASP Mobile Application Security Verification Standard 2.0 MASVS-CODE-4
[14] Standards Mapping - OWASP Top 10 2004 A5 Buffer Overflow
[15] Standards Mapping - Payment Card Industry Data Security Standard Version 1.1 Requirement 6.5.5
[16] Standards Mapping - Payment Card Industry Data Security Standard Version 1.2 Requirement 6.3.1.1
[17] Standards Mapping - Payment Card Industry Data Security Standard Version 2.0 Requirement 6.5.2
[18] Standards Mapping - Payment Card Industry Data Security Standard Version 3.0 Requirement 6.5.2
[19] Standards Mapping - Payment Card Industry Data Security Standard Version 3.1 Requirement 6.5.2
[20] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2 Requirement 6.5.2
[21] Standards Mapping - Payment Card Industry Data Security Standard Version 3.2.1 Requirement 6.5.2
[22] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0 Requirement 6.2.4
[23] Standards Mapping - Payment Card Industry Data Security Standard Version 4.0.1 Requirement 6.2.4
[24] Standards Mapping - Payment Card Industry Software Security Framework 1.0 Control Objective 4.2 - Critical Asset Protection
[25] Standards Mapping - Payment Card Industry Software Security Framework 1.1 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation
[26] Standards Mapping - Payment Card Industry Software Security Framework 1.2 Control Objective 4.2 - Critical Asset Protection, Control Objective B.3.1 - Terminal Software Attack Mitigation, Control Objective B.3.1.1 - Terminal Software Attack Mitigation, Control Objective C.3.2 - Web Software Attack Mitigation
[27] Standards Mapping - SANS Top 25 2009 Risky Resource Management - CWE ID 665
[28] Standards Mapping - SANS Top 25 2010 Risky Resource Management - CWE ID 665
[29] Standards Mapping - Security Technical Implementation Guide Version 3.1 APP3510 CAT I, APP3590.1 CAT I
[30] Standards Mapping - Security Technical Implementation Guide Version 3.4 APP3510 CAT I, APP3590.1 CAT I
[31] Standards Mapping - Security Technical Implementation Guide Version 3.5 APP3510 CAT I, APP3590.1 CAT I
[32] Standards Mapping - Security Technical Implementation Guide Version 3.6 APP3510 CAT I, APP3590.1 CAT I
[33] Standards Mapping - Security Technical Implementation Guide Version 3.7 APP3510 CAT I, APP3590.1 CAT I
[34] Standards Mapping - Security Technical Implementation Guide Version 3.9 APP3510 CAT I, APP3590.1 CAT I
[35] Standards Mapping - Security Technical Implementation Guide Version 3.10 APP3510 CAT I, APP3590.1 CAT I
[36] Standards Mapping - Security Technical Implementation Guide Version 4.2 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[37] Standards Mapping - Security Technical Implementation Guide Version 4.3 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[38] Standards Mapping - Security Technical Implementation Guide Version 4.4 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[39] Standards Mapping - Security Technical Implementation Guide Version 4.5 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[40] Standards Mapping - Security Technical Implementation Guide Version 4.6 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[41] Standards Mapping - Security Technical Implementation Guide Version 4.7 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[42] Standards Mapping - Security Technical Implementation Guide Version 4.8 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[43] Standards Mapping - Security Technical Implementation Guide Version 4.9 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[44] Standards Mapping - Security Technical Implementation Guide Version 4.10 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[45] Standards Mapping - Security Technical Implementation Guide Version 4.11 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[46] Standards Mapping - Security Technical Implementation Guide Version 4.1 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[47] Standards Mapping - Security Technical Implementation Guide Version 5.1 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[48] Standards Mapping - Security Technical Implementation Guide Version 5.2 APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[49] Standards Mapping - Security Technical Implementation Guide Version 5.3 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[50] Standards Mapping - Security Technical Implementation Guide Version 6.1 APSC-DV-002530 CAT II, APSC-DV-002560 CAT I, APSC-DV-002590 CAT I
[51] Standards Mapping - Web Application Security Consortium Version 2.00 Buffer Overflow (WASC-07)
[52] Standards Mapping - Web Application Security Consortium 24 + 2 Buffer Overflow
desc.dataflow.cpp.string_termination_error.master