libzmq CVE semgrep_id:flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1:791:791
Function does not handle null terminated strings properly
Ссылка на строку:
https://github.com/zeromq/libzmq/-/blob/master/tests/test_socks.cpp#L791
Описание уязвимости
Уязвимость заключается в том, что функция strlen
не обрабатывает строки, которые не завершаются нулём. Это может привести к чтению за пределами буфера и аварийному завершению работы приложения из-за доступа к непредназначенным участкам памяти.
Варианты исправления
Чтобы устранить уязвимость, рекомендуется использовать функцию strnlen
вместо strlen
, так как strnlen
позволяет задать максимальный размер строки, что предотвратит чтение за пределы буфера.
Пример исправленного кода:
TEST_ASSERT_EQUAL(expected_len, strnlen(buffer, max_len));
где max_len
— это максимально допустимый размер строки.
Если разработка ведётся для C Runtime Library (CRT), следует использовать более безопасные версии функций. Например, можно применить функцию strnlen_s
, которая также учитывает максимальный размер строки и обеспечивает дополнительную защиту.
Пример использования strnlen_s
:
size_t len;
strnlen_s(buffer, max_len, &len);
TEST_ASSERT_EQUAL(expected_len, len);
Ссылки на статьи
Issue в GitLab
### Уязвимость: неправильное обращение с нуль-терминированными строками
**Описание**
Функция `strlen` не обрабатывает строки, которые не завершаются нулём, что может привести к чтению за пределами буфера и аварийному завершению работы приложения.
**Местоположение**
Файл: `repo/tests/test_socks.cpp`
Строка: 791
**Severity:** High
**CVE:** `semgrep_id:flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1:791:791`
**Идентификаторы**
- CWE: [CWE-126](https://cwe.mitre.org/data/definitions/126.html)
- OWASP: A03:2021 - Injection, A1:2017 - Injection
**Исходный код с уязвимостью**
```c
TEST_ASSERT_EQUAL (expected_len + 1, res_len);
TEST_ASSERT_EQUAL (expected_len, strlen (buffer));
TEST_ASSERT (strncmp (buffer, expected_value, expected_len) == 0);
Предложение по исправлению
Использовать strnlen
или strnlen_s
вместо strlen
.
Примеры исправленного кода
- С использованием
strnlen
:
TEST_ASSERT_EQUAL(expected_len, strnlen(buffer, max_len));
- С использованием
strnlen_s
:
size_t len;
strnlen_s(buffer, max_len, &len);
TEST_ASSERT_EQUAL(expected_len, len);
Ссылки
<hr><details><summary>Описание: </summary>The `strlen` family of functions does not handle strings that are not null
terminated. This can lead to buffer over reads and cause the application to
crash by accessing unintended memory locations. It is recommended that `strnlen`
be used instead as a `maxlen` value can be provided.
For more information please see: https://linux.die.net/man/3/strnlen
If developing for C Runtime Library (CRT), more secure versions of these functions should be
used, see:
https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s?view=msvc-170
</details><details><summary>Исходный JSON: </summary><pre><code lang='json'>{
"id": "1c75b2f7d8135902efc1f90e722b0bb3daf2fcd535457ebdfe56a07a3d928f23",
"category": "sast",
"name": "Function does not handle null terminated strings properly",
"description": "The `strlen` family of functions does not handle strings that are not null\nterminated. This can lead to buffer over reads and cause the application to\ncrash by accessing unintended memory locations. It is recommended that `strnlen`\nbe used instead as a `maxlen` value can be provided.\n\nFor more information please see: https://linux.die.net/man/3/strnlen\n\nIf developing for C Runtime Library (CRT), more secure versions of these functions should be\nused, see:\nhttps://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s?view=msvc-170\n",
"cve": "semgrep_id:flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1:791:791",
"severity": "High",
"scanner": {
"id": "semgrep",
"name": "Semgrep"
},
"location": {
"file": "repo/tests/test_socks.cpp",
"start_line": 791
},
"identifiers": [
{
"type": "semgrep_id",
"name": "flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1",
"value": "flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1"
},
{
"type": "cwe",
"name": "CWE-126",
"value": "126",
"url": "https://cwe.mitre.org/data/definitions/126.html"
},
{
"type": "owasp",
"name": "A03:2021 - Injection",
"value": "A03:2021"
},
{
"type": "owasp",
"name": "A1:2017 - Injection",
"value": "A1:2017"
},
{
"type": "flawfinder_func_name",
"name": "Flawfinder - strlen",
"value": "strlen"
},
{
"type": "flawfinder_func_name",
"name": "Flawfinder - wcslen",
"value": "wcslen"
},
{
"type": "flawfinder_func_name",
"name": "Flawfinder - _tcslen",
"value": "_tcslen"
},
{
"type": "flawfinder_func_name",
"name": "Flawfinder - _mbslen",
"value": "_mbslen"
}
]
}
```</code></pre></details>
/severity high