libzmq CVE semgrep_id:flawfinder.memcpy-1.CopyMemory-1.bcopy-1:34:34
Function does not check for buffer overflows when copying
Ссылка на строку:
https://github.com/zeromq/libzmq/-/blob/master/src/vmci_address.cpp#L34
Описание уязвимости
Уязвимость связана с использованием функции memcpy
, которая не выполняет проверку на переполнение буфера. Если размер исходного буфера превышает размер целевого, это может привести к переполнению буфера и потенциальному выполнению произвольного кода или сбоям в работе программы.
Варианты исправления
-
Использовать более безопасные версии функций копирования памяти. В C Runtime Library (CRT) есть более безопасные аналоги функций
memcpy
, например,memcpy_s
. Они требуют указания размера буфера и выполняют проверку на переполнение.Пример кода:
if (sa->sa_family == parent->get_vmci_socket_family()) { size_t destinationBufferSize = /* указать размер целевого буфера */; memcpy_s(&address, destinationBufferSize, sa, sa_len); }
-
Добавить явную проверку размеров буферов перед использованием
memcpy
. Перед копированием данных убедиться, что размер целевого буфера достаточен для хранения данных из исходного буфера.Пример кода:
if (sa->sa_family == parent->get_vmci_socket_family()) { if (sa_len <= /* размер целевого буфера */) { memcpy(&address, sa, sa_len); } else { // обработать ошибку } }
Ссылка на статью
Подробнее о более безопасных версиях функций копирования памяти можно узнать на странице Microsoft Learn.
Issue для GitLab
## Уязвимость: отсутствие проверки на переполнение буфера при копировании данных (CWE-120)
**Описание**
В коде используется функция `memcpy` без проверки размеров буферов, что может привести к переполнению буфера.
**Местоположение**
Файл: `repo/src/vmci_address.cpp`
Строка: 34
**Severity:** High
**Идентификаторы**
- CWE: [CWE-120](https://cwe.mitre.org/data/definitions/120.html)
- OWASP: A03:2021 - Injection, A1:2017 - Injection
**Варианты исправления**
1. Использовать `memcpy_s` вместо `memcpy`.
2. Добавить явную проверку размеров буферов перед использованием `memcpy`.
**Пример исправления с использованием `memcpy_s`**
```c++
if (sa->sa_family == parent->get_vmci_socket_family()) {
size_t destinationBufferSize = /* указать размер целевого буфера */;
memcpy_s(&address, destinationBufferSize, sa, sa_len);
}
Пример исправления с проверкой размеров буферов
if (sa->sa_family == parent->get_vmci_socket_family()) {
if (sa_len <= /* размер целевого буфера */) {
memcpy(&address, sa, sa_len);
} else {
// обработать ошибку
}
}
Ссылка на документацию Microsoft Learn: memcpy_s, wmemcpy_s
<hr><details><summary>Описание: </summary>The `memcpy` family of functions require the developer to validate that the destination buffer
is the same size or larger than the source buffer. Buffer overflows could be introduced if care
is not taken to validate buffer sizes.
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/memcpy-s-wmemcpy-s?view=msvc-170
</details><details><summary>Исходный JSON: </summary><pre><code lang='json'>{
"id": "199772425fb029353308db95f8e55d07decdee537be659c849040744c6ae6e18",
"category": "sast",
"name": "Function does not check for buffer overflows when copying",
"description": "The `memcpy` family of functions require the developer to validate that the destination buffer\nis the same size or larger than the source buffer. Buffer overflows could be introduced if care\nis not taken to validate buffer sizes.\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/memcpy-s-wmemcpy-s?view=msvc-170\n",
"cve": "semgrep_id:flawfinder.memcpy-1.CopyMemory-1.bcopy-1:34:34",
"severity": "High",
"scanner": {
"id": "semgrep",
"name": "Semgrep"
},
"location": {
"file": "repo/src/vmci_address.cpp",
"start_line": 34
},
"identifiers": [
{
"type": "semgrep_id",
"name": "flawfinder.memcpy-1.CopyMemory-1.bcopy-1",
"value": "flawfinder.memcpy-1.CopyMemory-1.bcopy-1"
},
{
"type": "cwe",
"name": "CWE-120",
"value": "120",
"url": "https://cwe.mitre.org/data/definitions/120.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 - memcpy",
"value": "memcpy"
},
{
"type": "flawfinder_func_name",
"name": "Flawfinder - CopyMemory",
"value": "CopyMemory"
},
{
"type": "flawfinder_func_name",
"name": "Flawfinder - bcopy",
"value": "bcopy"
}
]
}
```</code></pre></details>
/severity high