Перейти к содержимому
macOS · Доступно

Tsuba

Смотрит на незнакомый код до его первого запуска.

Tsuba app icon
Тип
macOS
Версия
0.3.0
Выпуск
31 окт. 2026 г.
Загрузки
24
Набор правил
Правил: 20 · 2026.10.27
Требования
macOS 13+
Цена
Бесплатно
Конфиденциальность
Читать →

Tsuba (鍔) — гарда японского меча. Эта живёт в строке меню и вмешивается в те моменты, когда незнакомый код запускается впервые: выясняет, что код собирается сделать, откуда он взялся и похож ли на известную атаку, а затем решает: Разрешить, Предупредить или Заблокировать.

Я сделал его после того, как фейковые заказчики с Upwork дважды пытались заразить мой Mac. В первый раз у них получилось, и ни XProtect, ни антивирус ничего не заметили. Вот вся история.

Tsuba за 24 секунды.

Панель: состояние защиты, что требует внимания, и живой журнал всех проверок.
Панель: состояние защиты, что требует внимания, и живой журнал всех проверок.

Почему антивирус пропускает такие атаки

Фейковые проекты с собеседований, фейковые приложения для встреч, отравленные npm-пакеты и вредоносные расширения редакторов каждый раз приходят в новой упаковке. Они работают через обычные инструменты вроде node, curl и bash, так что традиционному сканеру не за что зацепиться. Tsuba вместо этого следит за точками входа.

Масштаб проблемы:

  • Северокорейская кампания Contagious Interview идёт как минимум с декабря 2022 года. «Тестовый проект» — npm-проект на GitHub, GitLab или Bitbucket, и как только вы доверяете репозиторию, VS Code сам запускает его файл задач (Microsoft, март 2026).
  • С января 2025 года Socket отследил более 1700 вредоносных пакетов, связанных с кампанией, в npm, PyPI, Go, crates.io и Packagist (Socket, апрель 2026).
  • Расширения GlassWorm прятали код в невидимых символах Unicode и набрали около 35 800 установок, прежде чем их поймали (Koi Security, октябрь 2025).
  • Sonatype зафиксировал 16 279 новых вредоносных open-source-пакетов за один квартал, всего 845 204 (Sonatype, Q2 2025).

Прежде чем запускать проект от рекрутера

  1. Пока не открывайте его в редакторе. Доверенная папка может запустить свой .vscode/tasks.json при открытии.
  2. Прочитайте package.json: скрипты preinstall и postinstall, зависимости, о которых вы не слышали или которые опубликованы на прошлой неделе.
  3. Поищите код, которому нечего делать в тестовом задании: зашитые IP-адреса, eval скачанного текста, чтение профилей браузера, кошельков или связки ключей.
  4. Никогда не вставляйте строку curl … | bash из чата в терминал, не прочитав скрипт.
  5. Если вы уже запустили проект, считайте машину скомпрометированной: проверьте следы, затем смените пароли, токены и ключи с чистого устройства.

Tsuba делает шаги 1–4 за вас в нужный момент, а его Диагностика закрывает шаг 5.

Что он проверяет

Точка входа Примеры На что смотрит Tsuba
Команды терминала curl … | bash, npm install, npx, npm start, git clone Скачивает удалённый скрипт, не запуская его; сверяет npm-пакеты со списками вредоносных, проверяет их возраст и скрипты установки; ищет в проекте скрытый код, зашитые серверы и чтение кошельков или хранилищ паролей
Вставка в терминал Страница просит «скопировать эту команду в терминал» Предупреждает в момент вставки; обфусцированные команды, переданные в оболочку, помечаются как высокорисковые
Папка «Загрузки» Новые файлы .dmg, .pkg, .vsix Подпись, нотаризация, источник загрузки и скрипты установки
Расширения редакторов VS Code, Cursor, Windsurf, VSCodium Официальный список вредоносных расширений, активация при запуске, код в невидимых символах; высокорисковые расширения отправляются в карантин
ИИ-инструменты для кода MCP-серверы, skills и hooks для Claude Code, Cursor, Codex Известные вредоносные пакеты, запуск из скрытых папок, инструкции, скрытые от пользователя
Диагностика Строка меню → Диагностика Следы известных атак и подозрительные объекты входа

Проекты, в которых вы не уверены, можно сначала пробно запустить в песочнице: поддельная домашняя папка с приманками, сетевые запросы записываются, но не отправляются, лимит 60 секунд.

Заблокированная установка фейкового приложения для встреч: вердикт, причины и доказательства, строка за строкой.
Заблокированная установка фейкового приложения для встреч: вердикт, причины и доказательства, строка за строкой.

Сканирование папок по запросу или по расписанию. Всё рискованное отправляется в карантин.
Сканирование папок по запросу или по расписанию. Всё рискованное отправляется в карантин.

Диагностика ищет следы известных атак и проверяет расширения редакторов и ИИ-инструменты.
Диагностика ищет следы известных атак и проверяет расширения редакторов и ИИ-инструменты.

Сравнение с другими инструментами

Большинство инструментов закрывают один вход. Tsuba закрывает каждый первый запуск на Mac и работает вместе с остальными.

Инструмент Что проверяет Когда
Tsuba Команды терминала, npm и npx, клонированные проекты, .dmg / .pkg / .vsix, расширения редакторов, MCP-серверы, skills и hooks, вставленные команды До первого запуска кода
npq, Socket Firewall, Aikido Safe Chain Пакеты из npm (а некоторые — ещё из PyPI и других) При установке
mcp-scan и другие MCP-сканеры MCP-серверы и инструменты агентов Когда вы запускаете сканирование
LuLu, BlockBlock, KnockKnock (Objective-See) Исходящие соединения и ПО, которое прописывается в автозапуск После того как код уже запустился
Антивирус и XProtect Сигнатуры известного вредоносного ПО Когда файл совпадает с известным образцом

Как он принимает решения

Первыми всегда срабатывают офлайн-правила, опирающиеся на публичные данные об угрозах, которые обновляются ежедневно, включая более 230 000 зарегистрированных вредоносных пакетов npm и PyPI из OpenSSF. Затем ИИ-модель может оценить доказательства в контексте. Лучше всего работает Claude, поддерживаются другие провайдеры и локальные модели, а ИИ можно полностью выключить.

Модели отправляются только доказательства, нужные для проверки. Комментарии в коде сначала удаляются, а секреты никогда не загружаются. Настройки и история хранятся в ~/.tsuba на вашем Mac.

Настройки: включайте и выключайте каждую защиту и выбирайте, как выносятся вердикты, с ИИ или без.
Настройки: включайте и выключайте каждую защиту и выбирайте, как выносятся вердикты, с ИИ или без.

Доступность

Tsuba вышел, он бесплатный и с открытым кодом под лицензией Apache 2.0 (на GitHub). Есть две сборки: Apple silicon для Mac на M1 и новее, Intel для более старых. Не знаете, какой у вас? Меню Apple → Об этом Mac → Чип.

Приложение говорит на десяти языках, включая русский: English, 简体中文, 繁體中文, 日本語, 한국어, Español, Français, Deutsch, Português и Русский. Интерфейс, уведомления, проверки в терминале, объяснения правил и ответы ИИ следуют языку macOS, или выберите язык в Настройки → Оформление.

Tsuba пока не подписан и не нотаризован Apple, поэтому macOS блокирует его при первом запуске. Откройте Системные настройки → Конфиденциальность и безопасность и нажмите Все равно открыть. Пожалуйста, не снимайте вместо этого флаг карантина через xattr: Tsuba предупреждает об установщиках, которые просят вас об этом, и его собственный не должен быть исключением.

Это нужно сделать один раз. Дальше Tsuba обновляется сам: сообщает о выходе новой версии и устанавливает её, только если её подпись совпадает с ключом, встроенным в приложение.

Чтобы убедиться, что ваш DMG — тот самый, который GitHub собрал из публичного исходного кода, сравните shasum -a 256 Tsuba_*.dmg с SHA256SUMS.txt на странице релиза.

Попробуйте

Реальный вывод, реальные правила

Выберите образец и посмотрите, что приложение вывело при его проверке: только офлайн-правила, версия 0.1.1. Образцы взяты из набора тестов. Они повторяют форму настоящих атак, но безвредны.

$ tsuba scan ~/code/fake_interview_project

Tsuba ✗ Block recommended  ~/code/fake_interview_project
  Evidence:
   High Decodes and then dynamically runs code (eval/Function + base64), common in obfuscated poisoned code [server/server.js] Source: Tsuba rules · Apache-2.0
      eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://203.0.113.7:1224/api"; app.get('/', (q, r) =>
   High Connects straight to a hard-coded IP address and port (typical of a C2 server) [server/server.js]
      eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http://203.0.113.7:1224/api"; app.get('/', (q, r) =>
   High Code is pushed off the right edge of the screen by whitespace, out of sight (a typical way to hide a poisoned payload) [server/server.js]
      const app = require("express")(); ⟨400 spaces⟩ eval(Buffer.from("Y29uc29sZS5sb2coImxvY2FsZ3VhcmQgdGVzdCBmaXh0dXJlIik=", "base64").toString()); const C2 = "http:
Изменения

Изменения

Лента релизов ↗
Файлы · v0.3.0Размер
Tsuba_0.3.0_aarch64.dmg19.5 MB4b8ff8f2cc343864f63be59c43460f4396ab61ad4ae2ddd368d13ff61a58d1d3
Tsuba_0.3.0_x64.dmg22.3 MB02cfbea2b133032c5207c9e1dcbd1432ecc737408db29fbc1d9fb92fb5962122
  1. 0.3.031 окт. 2026 г.
    • f8aa092Give other languages' relative times room in the terminal log
    • d4a8ac6Translate the README into nine languages and refresh its screenshots
    • 7c0a4a6Add seals, a crest and gold fittings to the samurai look
    • 9de218fSpeak ten languages
    • 52826a5Restyle the shell as held-back samurai armor
    • c103f41Show the guard on a laptop and open the app through it
    • 1d22fd0Replace the katana logo with a 3D tsuba
    • 0cfcdfdAdd pnpm app to start the app from the repo root
    • 54bf89dDeclare all four MCP tool hints and test quarantine_list
    • 51a757fAdd the M8ven Verified badge to the README
    • 4ccb857Give the README a product page look with screenshots
    Все изменения ↗
  2. 0.2.129 окт. 2026 г.
    Все изменения ↗
  3. 0.2.029 окт. 2026 г.
    • be28cfaPlay a short, soft sound with Block notifications
    • 14d4349Redesign Settings, Health Check and the window chrome
    • 42754edUpdate Tsuba in the app from GitHub Releases
    • 4392c89Let users ignore warnings and choose which notifications they get
    Все изменения ↗
  4. 0.1.228 окт. 2026 г.
    • d0353e4Add the Apache-2.0 LICENSE
    • e7f620eLeave folders the sandbox hides out of its PATH
    • d8fc3b7Let the website workflow run by hand to test the hook
    • a1f8191Rebuild the website when a release is published
    Все изменения ↗
Вопросы

Вопросы

Безопасно ли запускать проект, который прислал рекрутер?

Считайте его недоверенным, пока он не проверен: на фейковых собеседованиях вредоносом оказывается как раз тестовый проект. Перетащите папку в окно Tsuba или клонируйте её, когда Tsuba подключён к терминалу, и он проверит зависимости, скрипты установки и задачи VS Code до того, как что-либо запустится. Если вы уже запустили проект, выполните Диагностику и прочитайте, что случилось со мной.

Как проверить npm-пакет перед установкой?

Когда Tsuba подключён к терминалу, npm install и npx проверяются до запуска: известные вредоносные пакеты из списка OpenSSF, пакеты, опубликованные всего несколько дней назад, и скрипты установки. Похожую проверку только для npm делают консольные инструменты вроде npq.

Почему macOS пишет, что Tsuba нельзя открыть?

Tsuba пока не подписан и не нотаризован Apple, поэтому при первом запуске откройте Системные настройки → Конфиденциальность и безопасность и нажмите Все равно открыть. Пожалуйста, не снимайте вместо этого флаг карантина через xattr: Tsuba предупреждает об установщиках, которые об этом просят. Чтобы проверить загрузку, сравните её с SHA-256 в разделе «Изменения».

Загружает ли Tsuba мой код?

Файлы не загружаются. Если вы включите ИИ, выбранной модели уходят только доказательства, нужные для проверки, без комментариев в коде и без секретов. С выключенным ИИ проверки идут на вашем Mac по офлайн-правилам. Настройки и история хранятся в ~/.tsuba. В политике конфиденциальности перечислено всё, что Tsuba отправляет, и когда.

Нужна ли подписка на ИИ или API-ключ?

Нет. Офлайн-правила всегда срабатывают первыми и работают сами по себе. ИИ необязателен: лучше всего работает Claude, поддерживаются и другие провайдеры, и локальные модели.

Он заменяет антивирус?

Нет. Распознавание известного вредоносного ПО остаётся за macOS XProtect и открытыми данными об угрозах. Tsuba закрывает то, что они пропускают: код в новой упаковке, который ещё никто не видел, — фейковые проекты с собеседований, фейковые приложения для встреч, отравленные пакеты и вредоносные расширения, — и вмешивается до того, как этот код запустится.

На каких Mac он работает?

macOS 13 или новее, на Apple silicon и Intel, с отдельной загрузкой для каждого. Узнать свой чип можно в меню Apple → Об этом Mac → Чип.

А если он пометит что-то безопасное?

Каждое «Предупредить» и «Заблокировать» показывает доказательства (какой файл, какая строка, что совпало), так что вы можете судить сами; проверенное предупреждение можно игнорировать, а то, чему вы доверяете, добавить в список разрешённых. Пожалуйста, сообщите о ложном срабатывании: каждое становится регрессионным тестом.

Обратная связь

Нашли баг или пропуск?

Отчёты публикуются в GitHub Issues, открыто. Никогда не вставляйте секреты. Для настоящего вредоносного образца пришлите его хеш и источник, а не сам файл.

Следите

Делюсь сборками, экспериментами и выводами по ходу дела.

Новые видео на YouTube, короткие заметки в X. Каждый пост здесь ссылается на оба.

YouTube