bitcoin CVE semgrep_id:bandit.B603:520:520
Improper neutralization of special elements used in an OS Command ('OS Command Injection')
Ссылка на строку:
https://dev.gitsec.ru/crypto/bitcoin/-/blob/master/test/functional/test_runner.py#L520
Описание уязвимости
Уязвимость связана с неправильной нейтрализацией специальных элементов, используемых в командах ОС (OS Command Injection). В данном случае проблема заключается в использовании функции subprocess.check_call с массивом, который формируется на основе пользовательского или переменного ввода. Если ввод не санитируется, это может привести к выполнению произвольных команд.
Варианты исправления
-
Проверка и очистка входных данных: перед использованием входных данных в командах ОС необходимо проверять и очищать их от потенциально опасных символов. Например, можно использовать регулярные выражения для проверки формата входных данных.
import re # Пример проверки имени файла или директории def is_safe_filename(filename): return bool(re.match(r'^[\w\-_\.]+$', filename)) if is_safe_filename(test_list[0].split()[0]): subprocess.check_call([sys.executable, os.path.join(config["environment"]["SRCDIR"], 'test', 'functional', test_list[0].split()[0]), '-h']) else: print("Invalid filename") sys.exit(1) -
Использование безопасных методов работы с подпроцессами: вместо формирования списка аргументов вручную можно использовать более безопасные методы, которые минимизируют риск внедрения команд. Например, можно использовать библиотеки, предоставляющие абстракции для работы с подпроцессами и обеспечивающие дополнительную защиту.
# Пример использования библиотеки, которая обеспечивает дополнительную защиту # (предположим, что такая библиотека существует) safe_subprocess.call([sys.executable, os.path.join(config["environment"]["SRCDIR"], 'test', 'functional', test_list[0].split()[0]), '-h']) -
Ограничение возможных значений входных данных: если известен ограниченный набор возможных значений, которые могут быть переданы в команду, можно явно перечислить эти значения и проверять входные данные на соответствие этому списку.
allowed_values = ['value1', 'value2', 'value3'] if test_list[0].split()[0] in allowed_values: subprocess.check_call([sys.executable, os.path.join(config["environment"]["SRCDIR"], 'test', 'functional', test_list[0].split()[0]), '-h']) else: print("Invalid value") sys.exit(1)
Ссылка на статью
Подробнее о уязвимости CWE-78 можно прочитать на сайте MITRE CWE.
Описание:
Python possesses many mechanisms to invoke an external executable. However, doing so may present a security issue if appropriate care is not taken to sanitize any user provided or variable input. This plugin test is part of a family of tests built to check for process spawning and warn appropriately. Specifically, this test looks for the spawning of a subprocess without the use of a command shell. This type of subprocess invocation is not vulnerable to shell injection attacks, but care should still be taken to ensure validity of input.Исходный JSON:
{
"id": "b385f5280f1b6567fd372f406cfc258e4c7dd5d3506b8c43795ccace128f0085",
"category": "sast",
"name": "Improper neutralization of special elements used in an OS Command ('OS Command Injection')",
"description": "Python possesses many mechanisms to invoke an external executable. However,\ndoing so may present a security issue if appropriate care is not taken to\nsanitize any user provided or variable input. This plugin test is part of a\nfamily of tests built to check for process spawning and warn appropriately.\nSpecifically, this test looks for the spawning of a subprocess without the\nuse of a command shell. This type of subprocess invocation is not\nvulnerable to shell injection attacks, but care should still be taken to\nensure validity of input.\n",
"cve": "semgrep_id:bandit.B603:520:520",
"severity": "High",
"scanner": {
"id": "semgrep",
"name": "Semgrep"
},
"location": {
"file": "test/functional/test_runner.py",
"start_line": 520
},
"identifiers": [
{
"type": "semgrep_id",
"name": "bandit.B603",
"value": "bandit.B603",
"url": "https://semgrep.dev/r/gitlab.bandit.B603"
},
{
"type": "cwe",
"name": "CWE-78",
"value": "78",
"url": "https://cwe.mitre.org/data/definitions/78.html"
},
{
"type": "owasp",
"name": "A03:2021 - Injection",
"value": "A03:2021"
},
{
"type": "owasp",
"name": "A1:2017 - Injection",
"value": "A1:2017"
},
{
"type": "bandit_test_id",
"name": "Bandit Test ID B603",
"value": "B603"
}
]
}
```