Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
ship-safe — Независимый агент безопасности для программного обеспечения, написанного ИИ. Находит проблемы, выясняет, реальны ли они, и показывает вам доказательства. Детерминированное ядро, API-ключ не требуется, вывод в форматах JSON и SARIF. | Kitploit
Инструменты/GitHubGitHub/asamassekou10/ship-safe
Безопасность облачной инфраструктурыСтатический анализБезопасность контейнеровТестирование безопасности APIАудит конфигурацииDevSecOpsМобильная безопасностьОбнаружение СекретовБезопасность Цепочки ПоставокRed TeamingБезопасность ИИ
785978415 дней назадПроверено Kitploit
GitHubasamassekou10/ship-safe

ship-safe

Независимый агент безопасности для программного обеспечения, написанного ИИ. Находит проблемы, выясняет, реальны ли они, и показывает вам доказательства. Детерминированное ядро, API-ключ не требуется, вывод в форматах JSON и SARIF.

РепозиторийСайт

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться
<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/49363/b1f8834990a38d393bed6703c926c2f633c9d6afc19261eb02c67e9d45b7f350.png" alt="Логотип Ship Safe" width="180" />
</p>
<p align="center"><strong>Независимый агент безопасности для программного обеспечения, написанного ИИ. Он находит проблемы, выясняет, реальны ли они, и показывает вам доказательства.</strong></p>
<p align="center"><a href="https://shipsafe.sh">Сайт</a> · <a href="https://shipsafe.sh/docs">Документация</a> · <a href="https://shipsafe.sh/security">Безопасность и поток данных</a> · <a href="https://shipsafe.sh/benchmarks">Бенчмарк</a> · <a href="https://shipsafe.sh/pricing">Цены</a> · <a href="https://shipsafe.sh/blog">Блог</a> · <a href="https://github.com/asamassekou10/ship-safe/contribute">Участие</a></p>

<p align="center">
  <a href="https://www.npmjs.com/package/ship-safe"><img src="https://badge.fury.io/js/ship-safe.svg" alt="версия npm" /></a>
  <a href="https://www.npmjs.com/package/ship-safe"><img src="https://img.shields.io/npm/dm/ship-safe.svg" alt="загрузки npm" /></a>
  <a href="https://github.com/asamassekou10/ship-safe/actions/workflows/ci.yml"><img src="https://github.com/asamassekou10/ship-safe/actions/workflows/ci.yml/badge.svg" alt="CI" /></a>
  <a href="https://opensource.org/licenses/MIT"><img src="https://img.shields.io/badge/License-MIT-yellow.svg" alt="Лицензия: MIT" /></a>
  <a href="https://github.com/asamassekou10/ship-safe/stargazers"><img src="https://img.shields.io/github/stars/asamassekou10/ship-safe?style=social" alt="Звёзды GitHub" /></a>
  <a href="https://github.com/sponsors/asamassekou10"><img src="https://img.shields.io/badge/Sponsor-%E2%9D%A4-ea4aaa?logo=github" alt="Спонсор" /></a>
</p>

## Ship Safe CLI

Ship Safe работает локально в вашем репозитории и состоит из двух слоёв.

**Детерминированный движок** находит проблемы в коде приложения, ИИ-агентах, конфигурациях MCP, промптах, зависимостях, CI/CD, секретах и конфигурации, связанной с облаком. Быстрый, воспроизводимый и проверенный бенчмарками — это слой сенсоров.

Затем **слой расследования** решает, чего стоят найденные проблемы. Он отслеживает значение, достигающее стока, ищет в проекте средства защиты, которые, по утверждению правила, отсутствуют, строит цепочки атак через конфигурацию, которую не содержит ни один отдельный файл, и — когда вы его об этом попросите — проверяет утёкший ключ у его провайдера. Каждый вывод сопровождается проходом, который к нему привёл, и строками, которые он прочитал:

```
CONFIRMED — traced end to end (10)

    NoSQL Injection via $where [high]
    app/data/allocations-dao.js:78  NOSQL_INJECTION_WHERE
    why: threshold is assigned from the HTTP request and reaches the sink without validation on that path.
    decided by: dataflow
      1. value reaches NOSQL_INJECTION_WHERE here  app/data/allocations-dao.js:78
      2. getByUserIdAndThreshold is called here with threshold  app/routes/allocations.js:23
      3. threshold is assigned here  app/routes/allocations.js:20
    fix: Replace $where with standard MongoDB operators ($eq, $gt, $regex, etc.)
```

<sub>Реальный вывод <code>ship-safe investigate</code> против OWASP NodeGoat. Загрязнённое значение деструктурируется в файле маршрута и передаётся в DAO через три каталога.</sub>

Начните с одной команды:

```bash
npx ship-safe
```

Без регистрации. Для сканирования не требуется API-ключ. Основные проверки работают офлайн. Режимы red-team на базе ИИ используют настроенного вами провайдера, если он доступен.

Используйте `--no-ai`, чтобы гарантировать полностью локальное сканирование. Классификация на стороне провайдера, глубокий анализ и GPT-Red передают ограниченный контекст напрямую выбранному вами провайдеру после маскирования учётных данных по мере возможности. Точные границы и ограничения контекста см. в разделе [Security & Data Flow](https://shipsafe.sh/security).

<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/49363/75988a5baca705edcd06c5d39049d35be36f660fad2362de6700cf40eb72d2dd.gif" alt="Демонстрация Ship Safe REPL" width="800" />
</p>

---

## Быстрый старт

Требуется Node.js 22.13+ в линейке 22.x или Node.js 24+. Node 18 и 20
больше не поддерживаются текущей версией разработки.

```bash
# Interactive REPL: scan, fix, and ask questions in one session
npx ship-safe

# Full audit: secrets + 31 agents + deps + remediation plan
npx ship-safe audit .

# Investigate: confirmed / likely / unresolved / refuted, with the evidence
npx ship-safe investigate .
npx ship-safe investigate . --all       # also detail unresolved and refuted
npx ship-safe investigate . --verify    # probe leaked keys against their providers

# Before you open an unfamiliar folder with an agent: what runs on open?
npx ship-safe trust ~/Downloads/take-home
npx ship-safe trust . --json

# What can an AI agent working in this repo actually reach?
npx ship-safe capabilities .

# AI agent red-team scenarios for agent-readable content
npx ship-safe red-team . --gpt-red

# Interactive fix agent: plan, diff, approve, inspect the static rescan
npx ship-safe agent .
npx ship-safe agent . --severity critical   # critical findings only
npx ship-safe agent . --branch --pr         # fix on a branch + open a PR

# Undo the last fix
npx ship-safe undo

# CI/CD mode — fails on any critical finding
npx ship-safe ci . --sarif results.sarif
npx ship-safe ci . --fail-on high              # stricter: critical or high

# Gate on evidence instead of severity: block only what was established
npx ship-safe ci . --fail-on-verdict confirmed
npx ship-safe ci . --ignore-refuted            # do not block on what was argued away
```

Для pull request'ов сравните доверенное сканирование базовой ветки со сканированием головной ветки, чтобы существующий долг репозитория оставался видимым и при этом не блокировал несвязанные изменения:

```bash
# On the trusted base revision
npx ship-safe ci . --fail-on none --no-deps \
  --write-baseline-report /tmp/ship-safe-base.json

# On the pull request head
npx ship-safe ci . --base-report /tmp/ship-safe-base.json --fail-on high
```

Базовый артефакт содержит хешированные идентификаторы находок, относительные пути и
метаданные правил. Он не хранит необработанные совпавшие секреты. Результаты PR классифицируют находки
как внесённые, устранённые, неизменённые или неопределённые; неоднозначные совпадения отображаются,
но не блокируют pull request.

### Контракт машиночитаемого отчёта

`scan --json`, `audit --json` и `ci --json` включают `schemaVersion: 1`, версию
Ship Safe и метку времени UTC `generatedAt`. Пути находок по умолчанию
относительны проекта, чтобы отчёты можно было переносить между рабочими станциями и CI
без утечки имён локальных каталогов. Используйте `--absolute-paths` только когда
потребителю явно нужны пути хоста. Отчёты SARIF содержат ту же версию пакета
в своих метаданных инструмента.

## Что находит Ship Safe

| Область | Примеры |
|------|----------|
| Безопасность ИИ и LLM | Prompt injection, перехват управления агентом, чрезмерные полномочия, отравление памяти, отравление RAG, небезопасные вызовы инструментов |
| MCP и конфигурации агентов | Слишком широкие разрешения инструментов, отравленные реестры, недоверенные транспорты, опасные списки разрешений |
| Безопасность приложений | SQL/NoSQL-инъекции, XSS, SSRF, обход аутентификации, path traversal, небезопасные маршруты API |
| Секреты и соответствие требованиям | API-ключи, токены, учётные данные, PII, утёкшие секреты в истории git |
| Цепочка поставок | Тайпсквоттинг, путаница зависимостей, рискованные скрипты установки, не закреплённые версии AI-действий |
| CI/CD | Отравление конвейера, не закреплённые версии GitHub Actions, логирование секретов, небезопасные триггеры workflow |

## Как это работает

1. **Сканирование локально** — Ship Safe проверяет ваш репозиторий с помощью целевых агентов и пропускает проверки, которые не применимы.
2. **Исследование каждой находки** — отдельные проходы решают, реальна ли она, ранжированные так, что более дешёвый никогда не отменяет более дорогой: прослеженный путь данных превосходит прочтение модели того же файла, а прошедшая аутентификацию проверка превосходит оба.
3. **Чтение доказательств** — находки разрешаются в подтверждённые, вероятные, неразрешённые или опровергнутые, каждая со ссылкой на строки, из которых был сделан вывод, так что вы можете не согласиться с шагом, а не с меткой серьёзности.
4. **Исправление с контролем** — агент предлагает план и diff, спрашивает перед записью, сообщает доказательства статического повторного сканирования и сохраняет изменения обратимыми. Исчезновение детектора не является независимой повторной проверкой; см. [результаты исправлений](https://github.com/asamassekou10/ship-safe/blob/main/docs/fix-verification.md).
5. **Гейт в CI** — используйте `ship-safe ci`, чтобы проваливать рискованные сборки и загружать SARIF в GitHub code scanning.

<p align="center">
  <img src="https://assets.kitploit.com/production/public/readmes/49363/31125a0161ee16c772304e3097cdea464c8988cdc8e818ebf8356506fa1f1314.gif" alt="Демонстрация агента Ship Safe" width="800" />
</p>

---

## «Почему бы просто не попросить мой кодирующий агент проверить репозиторий?»

Можно, и стоит. Он найдёт реальные вещи. Но есть три вопроса, на которые он структурно не может ответить о своей собственной работе.

**Не поставил ли агент, написавший этот код, оценку сам себе?** Спрашивать автора, не ошибся ли автор, — это не ревью. Ship Safe — отдельный ревьюер с отдельным методом, и он публично не соглашается сам с собой: трассировка потока данных отменяет эвристический проход, а живая проверка отменяет оба.

**Видит ли он то, до чего может дотянуться?** Кодирующий агент, проверяющий ваш репозиторий, не может прочитать конфигурацию вашего MCP-сервера, не может перечислить разрешения, с которыми он был запущен, и является тем субъектом, чей охват как раз под вопросом. `ship-safe capabilities` читает всё это извне и сообщает о комбинациях, которые опасны вместе, но незаметны по отдельности:

```
  CRITICAL  Repository-controlled instructions reach an unattended write capability
    1. CLAUDE.md is read as instructions and can be changed by anyone who lands a commit
       CLAUDE.md:1
    2. Claude Code runs without per-action approval
       .claude/settings.json:2
    3. shell execute granted: Bash(git push:*)
       .claude/settings.json:3
    4. filesystem write granted: Write
       .claude/settings.json:3
    5. mcp-tool write granted: mcp__github__create_pull_request
       .claude/settings.json:3
    Impact: Text committed to this repository can direct the agent to write files
            or run commands with no human in the loop.
    Boundary: Require approval for write and execute tools during sessions on
              untrusted branches, or remove the pre-granted entries.
```

Каждая из этих строк по отдельности ничем не примечательна. Вместе они образуют путь от pull request к привилегированной записи, и ни один обзор отдельного файла не может его увидеть, потому что ни один отдельный файл его не содержит.

**Согласовано ли это, и можете ли вы доказать, что стало лучше?** Спросите дважды — получите два ответа. Движок Ship Safe детерминирован, а его выводы контролируются в CI с помощью бенчмарка, который оценивает *качество выводов*, а не покрытие шаблонов: сколько известных реальных находок он подтверждает, сколько известного шума опровергает и опровергает ли он когда-либо что-то реальное. Бюджет для последнего показателя равен нулю — это единственный класс ошибок, который молча теряет уязвимость. См. [benchmarks/](https://github.com/asamassekou10/ship-safe/blob/main/benchmarks).

## Почему разработчики используют его

- **Создан для AI-native приложений**: выявляет риски в агентах, MCP-серверах, промптах, RAG-потоках, конфигурациях managed-agent и CI на базе ИИ.
- **Работает с AI-клиентами**: предоставляет Ship Safe для Codex, Claude Desktop, Cursor, Windsurf и других MCP-клиентов через локальный stdio-сервер.
- **Быстрая локальная обратная связь**: запускайте перед PR, во время ревью или в CI, не отправляя код в облачный сканер.
- **Исправления можно проверить**: каждое предлагаемое изменение показывается в виде diff до того, как оно затронет ваши файлы.
- **Работает с вашим стеком**: JavaScript, TypeScript, Python, конфигурационные файлы, файлы инфраструктуры, GitHub Actions и многое другое.
- **Открытое ядро**: CLI под лицензией MIT с документацией, примерами и растущей системой агентов.

## Бесплатный CLI, платные командные рабочие процессы

Открытый CLI — самый быстрый способ просканировать любой репозиторий локально. Переходите на платный план, когда вам нужен облачный рабочий процесс вокруг того же сканера:

| Потребность | Использование |
|------|-----|
| Локальные сканирования, аудиты и исправления с помощью агентов | Бесплатный CLI |
| История сканирований, облачная панель управления и PDF-отчёты | Pro |
| Общее рабочее пространство, PR Guardian, командные отчёты и совместная работа | Team |

Сравните планы на [shipsafe.sh/pricing](https://shipsafe.sh/pricing).

Ship Safe Cloud — облачная панель управления для истории сканирований, PR Guardian, биллинга и командных рабочих процессов — разрабатывается в приватном репозитории, поскольку содержит коммерческий код продукта и рабочие процессы облачной инфраструктуры. Публичный репозиторий `ship-safe` по-прежнему сосредоточен на CLI под лицензией MIT, агентах безопасности, правилах, фикстурах, интеграциях с CI и документации. См. [Ship Safe Cloud](https://github.com/asamassekou10/ship-safe/blob/main/docs/cloud.md) о границах репозитория.

---

## Агенты безопасности

Все агенты работают параллельно. Каждый автоматически пропускает нерелевантные проекты.

| Агент | Категория | Что обнаруживает |
|-------|----------|-----------------|
| **InjectionTester** | Уязвимости кода | SQL/NoSQL-инъекции, инъекции команд, XSS, обход путей, XXE, ReDoS, загрязнение прототипа |
| **AuthBypassAgent** | Аутентификация | Уязвимости JWT (alg:none, слабые секреты), CSRF, неверная конфигурация OAuth, BOLA/IDOR, обход TLS |
| **SSRFProber** | SSRF | Пользовательский ввод в fetch/axios, эндпоинты метаданных облака, внутренние IP-адреса |
| **SupplyChainAudit** | Цепочка поставок | Тайпсквоттинг, версии с подстановочными знаками, подозрительные установочные скрипты, путаница зависимостей |
| **ConfigAuditor** | Конфигурация | Docker (пользователь root, :latest), Terraform, Kubernetes, CORS, CSP, Firebase, Nginx |
| **SupabaseRLSAgent** | Аутентификация | Ключ service_role в клиентском коде, таблицы без RLS, вставки с anon-ключом |
| **LLMRedTeam** | ИИ/LLM | OWASP LLM Top 10: инъекция промптов, чрезмерные полномочия, утечка системного промпта |
| **MCPSecurityAgent** | ИИ/LLM | Неправильное использование сервера MCP, отравление инструментов, тайпсквоттинг, непроверенные входные данные |
| **A2ASecurityAgent** | ИИ/LLM | Отравление карточек агентов A2A, отсутствие аутентификации, эндпоинты с открытым текстом, небезопасные push-колбэки и незакреплённые удалённые карточки ([покрытие](https://github.com/asamassekou10/ship-safe/blob/main/docs/a2a-security.md)) |
| **AgenticSecurityAgent** | ИИ/LLM | OWASP Agentic AI Top 10: перехват агентов, повышение привилегий, неправильное использование вызовов инструментов Kimi K3/OpenAI-совместимых |
| **RAGSecurityAgent** | ИИ/LLM | Инъекция контекста, отравление документов, контроль доступа к векторной БД |
| **MemoryPoisoningAgent** | ИИ/LLM | Инъекция инструкций в файлы памяти агента, скрытые полезные нагрузки Unicode (ASI-01, ASI-05) |
| **PIIComplianceAgent** | Соответствие требованиям | SSN, номера кредитных карт, адреса электронной почты, номера телефонов в исходном коде |
| **VibeCodingAgent** | Уязвимости кода | Антипаттерны кода, сгенерированного ИИ: отсутствие валидации, пустые блоки catch, TODO-аутентификация |
| **ExceptionHandlerAgent** | Уязвимости кода | Пустые блоки catch, необработанные отклонения, утечки трассировок стека (OWASP A10:2025) |
| **AgentConfigScanner** | ИИ/LLM | Инъекция промптов в .cursorrules, CLAUDE.md, вредоносные хуки Claude Code |
| **MobileScanner** | Мобильные | OWASP Mobile Top 10 2024: небезопасное хранилище, инъекция в WebView, режим отладки |
| **GitHistoryScanner** | Секреты | Утёкшие секреты в истории коммитов git |
| **CICDScanner** | CI/CD | Отравление конвейера, незакреплённые действия, логирование секретов (OWASP CI/CD Top 10) |
| **APIFuzzer** | API | Маршруты без аутентификации, массовое присваивание, интроспекция GraphQL, отладочные эндпоинты |
| **ManagedAgentScanner** | ИИ/LLM | Неверные конфигурации Claude Managed Agent: политики always_allow, неограниченный сетевой доступ (ASI-03–ASI-07) |
| **HermesSecurityAgent** | ИИ/LLM | Отравление реестра инструментов, инъекция вызовов функций, дрейф разрешений навыков (ASI-01–ASI-10) |
| **AgentAttestationAgent** | Цепочка поставок | Незакреплённые версии агентов, отсутствующие хэши целостности, неподписанные манифесты (ASI-10, SLSA L0) |
| **AgenticSupplyChainAgent** | Цепочка поставок | Действия ИИ в CI с избыточными привилегиями, разрастание областей OAuth, неподписанные получатели вебхуков ИИ (ASI-02, ASI-06) |
| **RobloxSecurityAgent** | Цепочка поставок | Вредоносные ресурсы Roblox/Luau Toolbox (инъекция ресурсов во время выполнения, загрузчики `rbxassetid://`, `HttpEnabled`, полезные нагрузки, скрытые в атрибутах экземпляров) |
| **ModelScanAgent** | Цепочка поставок | Полезные нагрузки для выполнения кода в весах ML-моделей (опкоды pickle в `.pt`/`.pkl`/`.ckpt`), `torch.load` без `weights_only`, архивы для обхода сканеров (CWE-502, CWE-506) |
| **TrustBoundaryAgent** | Агентные | Атаки через символические ссылки GhostApproval (ссылки с именами конфигураций в `~/.ssh`/`~/.aws`/`.env`), символические ссылки репозитория, выходящие за пределы дерева, и инструкции Friendly Fire run-on-review в документах, читаемых агентом (CWE-59, CWE-61) |
| **SlopSquatAgent** | Цепочка поставок | Галлюцинированные / фантомные импорты пакетов (слопсквоттинг) — «голые» импорты, не объявленные, не установленные и не встроенные, а также известные имена, галлюцинированные ИИ (CWE-1357) |
| **ClickFixAgent** | Цепочка поставок | Приманки ClickFix / фальшивой CAPTCHA «вставь и запусти» (фальшивая ошибка + нажатия Win+R/Ctrl+V/командной строки, PowerShell-обёртки) и жизненные циклы npm фальшивых установщиков (CWE-1357, CWE-506) |
| **InstallGuardAgent** | Цепочка поставок | Поведение npm-червей в lifecycle-скриптах (сбор учётных данных, эксфильтрация переменных окружения, деструктивный `rm -rf`, обфусцированный `node -e`) и вооружённые действия node-gyp через `binding.gyp` (CWE-506, CWE-829) |

**Проходы исследования**, в порядке, в котором их доказательства превосходят друг друга по значимости:

| Проход | Ранг | Что он устанавливает |
|------|------|---------------------|
| **VerifierAgent** | эвристический | Проверка шаблона вокруг находки. Никогда не утверждает больше, чем «вероятно» |
| **DeepAnalyzer** | анализ | LLM-анализ заражения находки и её файла с проверкой цитирования |
| **DataflowInvestigator** | поток данных | Прослеживает значение обратно к его источнику, через одну границу функции и в другие файлы. JavaScript, TypeScript и Python |
| **AbsenceInvestigator** | наличие | Ищет в проекте или в обработчике элемент управления, который, согласно правилу, отсутствует |
| **LiteralContextInvestigator** | наличие | Определяет находки о записанном значении по тому, что его окружает — текст, строка справки или зарезервированный адрес |
| **CapabilityGraph** | цепочка | Строит цепочки атак из конфигурации, которую не содержит ни один отдельный файл |
| **RedosReproducer** | воспроизведение | Запускает помеченный шаблон против сгенерированных входных данных в воркере с ограничением по времени |
| **SecretsVerifier** | воспроизведение | Предъявляет утёкший ключ его провайдеру. Опционально: это раскрывает ключ |

Утверждение, чей указанный файл или строка не разрешаются, записывается, но никогда не определяет вердикт. Два прохода равного ранга, которые расходятся, разрешаются в неразрешённое, а не в тот вердикт, который страшнее.

**Также:** ScoringEngine

---

## REPL

```
$ ship-safe

  ███████╗██╗  ██╗██╗██████╗     ███████╗ █████╗ ███████╗███████╗
  ...

  v9.4.1  ·  DeepSeek  ·  ~/my-project

  /scan to find issues  ·  /agent to fix them  ·  /help for more

shipsafe ›
```

| Команда | Что делает |
|---------|-------------|
| `/scan` | Повторно сканировать проект |
| `/agent` | Запустить интерактивный цикл исправлений |
| `/findings` | Показать список находок из последнего сканирования |
| `/show <n>` | Подробная информация о находке n |
| `/plan <n>` | Предпросмотр плана исправления для находки n (без записи) |
| `/undo [--all]` | Отменить последнее исправление (или все исправления) |
| `/share` | Опубликовать отчёт о сканировании по публичному URL (7 дней) |
| `/diff` | Показать diff рабочего дерева git |
| `/provider <name>` | Переключить LLM-провайдера в середине сессии |
| `/quit` | Выйти (также `Ctrl-D` или `Ctrl-C`) |

Всё, что не начинается с `/`, отправляется в LLM как вопрос в свободной форме с результатами последнего сканирования в качестве контекста.

---

## CI/CD

```yaml
# .github/workflows/security.yml
name: Security Audit
on: [push, pull_request]
jobs:
  security:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - name: Security gate
        run: npx ship-safe ci . --sarif results.sarif
      - uses: github/codeql-action/upload-sarif@v3
        if: always()
        with:
          sarif_file: results.sarif
```

Версия для GitLab CI находится в [docs/examples/gitlab-security-workflow.yml](https://github.com/asamassekou10/ship-safe/blob/main/docs/examples/gitlab-security-workflow.yml).

### GitHub Action с встроенными результатами в PR

---

[Read more](https://github.com/asamassekou10/ship-safe)
Скачать инструмент