libzmq CVE semgrep_id:flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1:89:89
Function does not handle null terminated strings properly
Ссылка на строку:
https://github.com/zeromq/libzmq/-/blob/master/tests/test_pubsub_topics_count.cpp#L89
Описание уязвимости
Уязвимость связана с неправильным обращением с null-терминированными строками. Функции семейства strlen
не обрабатывают строки, которые не завершаются нулём. Это может привести к чтению за пределами буфера и аварийному завершению работы приложения из-за доступа к непредназначенным областям памяти.
Пример уязвимого кода
TEST_ASSERT_SUCCESS_ERRNO (
zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "a", strlen ("a")));
Варианты исправления
-
Использовать функцию
strnlen
вместоstrlen
, указав максимальное количество символов для проверки. Это позволит ограничить размер обрабатываемой строки и избежать чтения за её пределами.Пример исправленного кода:
TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "a", strnlen("a", MAX_LEN)));
где
MAX_LEN
— заранее определённая константа, задающая максимально допустимую длину строки. -
Если разработка ведётся для C Runtime Library (CRT), использовать более безопасные версии функций.
Пример:
TEST_ASSERT_SUCCESS_ERRNO ( zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, "a", strnlen_s("a", MAX_LEN)));
Ссылки на дополнительную информацию:
Описание:
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
Исходный JSON:
{
"id": "3e0b00d9ee19e86458cc90839f5a6651b4dfc31103e755a374a5af94a388cc41",
"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:89:89",
"severity": "High",
"scanner": {
"id": "semgrep",
"name": "Semgrep"
},
"location": {
"file": "repo/tests/test_pubsub_topics_count.cpp",
"start_line": 89
},
"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"
}
]
}
```