libzmq CVE semgrep_id:flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1:93:93
Function does not handle null terminated strings properly
Ссылка на строку:
https://github.com/zeromq/libzmq/-/blob/master/tests/test_pubsub_topics_count.cpp#L93
Описание уязвимости
Уязвимость заключается в том, что функции семейства strlen
не обрабатывают строки, которые не завершаются нулём. Это может привести к чтению за пределами буфера и сбою приложения из-за доступа к непредназначенным областям памяти.
Варианты исправления
Чтобы устранить уязвимость, рекомендуется использовать функцию strnlen
вместо strlen
, так как она позволяет указать максимальную длину строки. Пример исправленного кода:
TEST_ASSERT_SUCCESS_ERRNO(
zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "abc", strnlen("abc", MAX_LEN)));
где MAX_LEN
— это максимальная длина строки, которую вы определяете в зависимости от требований вашего приложения.
Если вы разрабатываете для C Runtime Library (CRT), следует использовать более безопасные версии функций. Подробнее можно узнать по ссылке: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s?view=msvc-170
Ссылки на статьи
-
https://linux.die.net/man/3/strnlen — документация по функции
strnlen
. - https://cwe.mitre.org/data/definitions/126.html — информация о CWE-126.
Issue в GitLab
### Уязвимость: неправильное обращение с null-терминированными строками
**Категория:** SAST
**Уровень серьёзности:** высокий
**Идентификатор уязвимости:** 995b4e955a3eee0696048f16d1fa85b65f5a72b82b9bd6a64d49adae778d07ca
**Файл:** repo/tests/test_pubsub_topics_count.cpp
**Строка:** 93
**Описание:**
Функции семейства `strlen` не обрабатывают строки, которые не завершаются нулём. Это может привести к чтению за пределами буфера и сбою приложения.
**Пример уязвимого кода:**
```cpp
TEST_ASSERT_SUCCESS_ERRNO (
zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "abc", strlen ("abc")));
Предлагаемое исправление:
Использовать функцию strnlen
с указанием максимальной длины строки:
TEST_ASSERT_SUCCESS_ERRNO(
zmq_setsockopt(subscriber, ZMQ_SUBSCRIBE, "abc", strnlen("abc", MAX_LEN)));
Ссылки:
- Документация по
strnlen
: https://linux.die.net/man/3/strnlen - CWE-126: https://cwe.mitre.org/data/definitions/126.html
- Безопасные версии функций для CRT: https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/strnlen-strnlen-s?view=msvc-170
<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": "995b4e955a3eee0696048f16d1fa85b65f5a72b82b9bd6a64d49adae778d07ca",
"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:93:93",
"severity": "High",
"scanner": {
"id": "semgrep",
"name": "Semgrep"
},
"location": {
"file": "repo/tests/test_pubsub_topics_count.cpp",
"start_line": 93
},
"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