ton CVE semgrep_id:flawfinder.strlen-1.wcslen-1._tcslen-1._mbslen-1:44:44
Function does not handle null terminated strings properly
Ссылка на строку:
https://dev.gitsec.ru/crypto/ton/-/blob/master/http/http-inbound-connection.cpp#L44
Описание уязвимости
Уязвимость заключается в том, что функция strlen не обрабатывает строки, которые не завершаются нулём. Это может привести к чтению за пределами буфера и аварийному завершению работы приложения из-за доступа к непредназначенным областям памяти.
Варианты исправления
-
Использовать функцию
strnlenвместоstrlen, указав максимальное количество символов для проверки. Это позволит ограничить размер обрабатываемой строки и избежать чтения за её пределами.Пример кода:
buffered_fd_.output_buffer().append(td::Slice(s, strnlen(s, MAX_LEN)));где
MAX_LEN— это максимально допустимая длина строки. -
Если разработка ведётся для C Runtime Library (CRT), использовать более безопасные версии функций. Например,
strnlen_s.Пример кода:
size_t len; strnlen_s(s, MAX_LEN, &len); buffered_fd_.output_buffer().append(td::Slice(s, len));
Ссылки на статьи:
Issue в GitLab
# Уязвимость: некорректная обработка строк, не завершённых нулём
## Описание
Функция `strlen` используется для обработки строки, которая может не быть завершена нулём. Это может привести к чтению за пределами буфера и аварийному завершению работы приложения.
## Местоположение
Файл: `http/http-inbound-connection.cpp`
Строка: 44
## Уровень серьёзности
Высокий
## Варианты исправления
1. Использовать `strnlen` с указанием максимального количества символов:
```cpp
buffered_fd_.output_buffer().append(td::Slice(s, strnlen(s, MAX_LEN)));
- Использовать безопасные версии функций для CRT, например,
strnlen_s:size_t len; strnlen_s(s, MAX_LEN, &len); buffered_fd_.output_buffer().append(td::Slice(s, 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": "8bfff01b4647b137d3a79ab8743a52a9451c02c389bfe314d977039a3c18586a",
"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:44:44",
"severity": "High",
"scanner": {
"id": "semgrep",
"name": "Semgrep"
},
"location": {
"file": "http/http-inbound-connection.cpp",
"start_line": 44
},
"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