Об уязвимости сообщите автору через Telegram. Не публикуйте в issue реальные cookies, пароли, токены и URL с учётными данными.
Windows/Linux CI проверяет форматирование, Clippy, тесты приложений и проверки подписанных ZIP. RustSec-аудит запускается ежедневно и на push/PR, без исключений для известных уязвимостей: vulnerable, unsound и yanked блокируют проверку. Gitleaks проверяет всю историю Git с редактированием найденных секретов. Actions закреплены полными SHA; Gitleaks и actionlint проверяются по SHA-256.
Проверка cargo audit --deny yanked --deny unsound от 2026-10-12 не обнаружила
известных уязвимостей и информационных предупреждений. Обновление eframe/egui
до 0.36.2 удалило ab_glyph и неподдерживаемый ttf-parser из Cargo.lock.
Ранее устаревший number_prefix был заменён обновлением indicatif,
а отозванная версия yoke-derive удалена из Cargo.lock.
reqwest 0.13 использует явно выбранный native TLS (Schannel в Windows) и системный прокси. Переход на SHA-2 0.11 сохраняет формат отпечатков незавершённых загрузок; ZIP 9 проверяется существующими тестами установки и подписи пакетов.
Автоустановка проверяет контрольные суммы, размеры загрузок и распаковки, использует ограниченные повторы сетевых ошибок, блокировки и атомарную публикацию. Перенаправления разрешены только по HTTPS внутри официального источника/CDN; ответы API и файлы контрольных сумм имеют отдельный 30-секундный таймаут. Новая aria2 без проверяемого digest или проверенного хеша не устанавливается. yt-dlp, ffmpeg и Deno обновляются из официальных релизов при ручном запуске установки. Контрольная сумма с того же источника защищает от повреждения загрузки, но сама по себе не подтверждает безопасность скомпрометированного издателя/хоста.
Произвольные --yt-dlp-args — доверенный пользовательский доступ к возможностям
yt-dlp, включая --exec. Список дополнительных аргументов aria2 ограничен
безопасными параметрами. Эти границы сохраняются при обновлениях.
Официальный подписанный пакет использует отдельный Ed25519-ключ SNATCH. Публичный ключ хранится в release/public-key.pem; приватный ключ находится вне репозитория и CI. Проверка подписи использует внешний доверенный ключ, полную опись ZIP и SHA-256 всех файлов. Сборщик требует чистый checkout и фиксирует исходную ревизию и компилятор. Порядок выпуска и проверки — в docs/RELEASING.md.
- Никакого shell: дочерние процессы запускаются списком аргументов
- Ссылки с ведущего
-отклоняются, URL передаётся после--— инъекция опций в загрузчики невозможна - Конфиги самих загрузчиков игнорируются (
--no-conf,--ignore-config) — подложенныйaria2.conf/yt-dlp.confв текущей папке не сработает. Исключение — явные аргументы:--yt-dlp-argsпередаются yt-dlp как есть (включая его конфиг, имя выхода и--exec), и эта гарантия на них не распространяется - Поддерживаются только схемы
http,https,ftpиmagnet: - Бинарники ищутся через собственную автоустановленную папку,
PATHи папки WinGet (%LOCALAPPDATA%): на общей машине это доверие к данным папкам — подменённыйyt-dlp.exe/aria2c.exeбудет запущен. При сомнениях задайте точные пути черезSNATCH_YT_DLP/SNATCH_ARIA2C - Автоустановка проверяет загрузки контрольными суммами: yt-dlp — SHA-512 из
SHA2-512SUMSтого же GitHub-релиза, aria2c — закреплённый SHA-256 (или из GitHub API), Deno — SHA-256 из метаданных GitHub-релиза. Для ffmpeg сумма берётся с того же хоста (gyan.dev): это защита от битой или оборванной загрузки, но не от подмены на самом хосте. Пока загрузчик занят, проверенное обновление остаётся в.partдо следующей установки. Повторная установка («обновить») пропускает инструмент, который уже соответствует опубликованному релизу: yt-dlp сверяется по SHA-512 самого файла, остальные — по SHA-256 архива, записанному рядом (<имя>.installed). Сетевые сбои установки повторяются до трёх раз; метаданные релиза ограничены 1 МБ - История ссылок и папок хранится в
config.jsonоткрытым текстом; учётные данные из ссылки (https://user:token@…) при сохранении отбрасываются — в истории остаётся адрес без логина и пароля. Из строки запроса убираются и параметры с секретом или подписью (token,access_token,apikey,X-Amz-Signatureи подобные). На Linux/macOS файл создаётся с правами0600. Очистка —--clear-history. Файл попадает и в резервные копии/облачную синхронизацию профиля - Докачка (
-c) прямых HTTP/FTP-ссылок: своя прерванная загрузка продолжается только при совпадении URL, файла состояния.aria2и метки SNATCH в папке конфигурацииaria2-locks. Один лишь.aria2не подтверждает принадлежность файла. Чужой файл-тёзка не перезаписывается — новая загрузка сохранится рядом, а SNATCH предупредит об этом заранее. Если рядом лежит ещё и файл докачки другой загрузки (.aria2), запуск останавливается: aria2 автоматически продолжил бы чужой файл, поэтому удалите пару вручную либо выберите другую папку. Для magnet/metalink и файлов внутри раздачи имена выбирает сам торрент — проверка покрывает имя, выводимое из ссылки, и не видит внутренние имена раздачи. Записиaria2-locks, не тронутые 180 дней, удаляются автоматически. Задачи с одинаковым именем в одной папке выполняются по очереди в CLI; GUI сохраняет введённую ссылку при отказе запуска, а отказавшую задачу из очереди оставляет в списке с кнопкой повторного запуска. Тот же принцип действует, когда прямую ссылку скачивает сам yt-dlp (без aria2c или после отказа хоста): его<имя>.partпродолжается только при метке SNATCH для той же ссылки, чужой отклоняется до запуска, а для такой загрузки берутся та же блокировка и та же метка - На Windows загрузчики CLI и GUI помещаются в Job Object: закрытие SNATCH завершает их дерево процессов. Если Windows не позволяет назначить Job Object, запуск останавливается с диагностикой
- Имя прямых HTTP(S)-загрузок определяется до блокировки по заголовкам ответа, когда по ссылке нет распознаваемого имени файла (незнакомое или отсутствующее расширение): безопасное имя из
Content-Disposition(включая UTF-8filename*), затем имя из конечного URL после редиректов. Пути, управляющие символы, bidi-маркеры, имена устройств Windows и слишком длинные имена сервера отклоняются. Проверка не читает куки или тело ответа; HEAD (при 405/501 — заголовки GET с Range) ограничен шестью секундами и пятью HTTP(S)-редиректами, сетевой сбой повторяется один раз. Для ссылок со строкой запроса или логином запасной GET сRangeне выполняется (подписанная или одноразовая ссылка могла бы «сгореть» до настоящей загрузки): движок выбирается по адресу. Имя закрепляется флагом-oи сохраняется в задаче: блокировки, метки докачки и проверки чужой пары.aria2используют тот же файл и исходный URL. При сбое проверки, для FTP и для ссылок с известным расширением остаётся имя по исходному URL; если и его нет, используется детерминированноеsnatch-<хеш>.bin. Ответ 5xx или 429 не считается вердиктом: движок выбирается по ссылке, а CLI сообщает, что проверить не удалось (отличить закрытый доступ от временного сбоя нельзя) - Предварительный выбор файлов торрента ограничен: метаданные — 16 МБ, вывод списка — 32 МБ, до 50 000 файлов и 256 000 компонентов путей. При превышении можно скачать торрент целиком. HTTP-метаданные отменяются без ожидания сетевого таймаута; строки дерева и счётчики кэшируются между изменениями выбора
- При отсутствии локальных
LOCALAPPDATA,XDG_CONFIG_HOMEиHOME/USERPROFILEсохранение настроек и автоустановка завершаются с диагностикой: общая временная папка не используется как источник исполняемых файлов. Нечитаемый, повреждённый или oversized config не перезаписывается дефолтами;--clear-historyвозвращает ошибку, если очистка не сохранилась - Прямые загрузки (aria2 и прямые ссылки через yt-dlp, HTTP/FTP) после успешного завершения получают метку «из Интернета» (
Zone.Identifier, ZoneId=3, как у браузера): SmartScreen и защищённый просмотр Office продолжают работать. ВHostUrlпишется адрес без логина, запроса и фрагмента. Торренты и медиа-страницы yt-dlp не помечаются (имена файлов заранее неизвестны); на томах без альтернативных потоков данных (FAT/exFAT, часть сетевых папок) метка не ставится - Папка загрузки или просмотра, которая оказывается символической ссылкой или junction на сетевой путь
\\сервер\ресурс, отклоняется так же, как сам UNC-путь: перед обращением читается только сама ссылка, а не то, на что она указывает - Имя прямой ссылки для yt-dlp передаётся в шаблон
-o, где$VARи ведущий~раскрываются без возможности экранирования; такие имена ($TEMP.mp4,~x.zip) не закрепляются, и yt-dlp называет файл сам — иначе файл мог бы уйти из папки загрузки - Плагины yt-dlp из его стандартных папок отключены (
--no-plugin-dirs): подложенныйyt_dlp_pluginsв текущей или пользовательской папке не загрузится. Исключение — собственные--yt-dlp-args: они идут после флагов SNATCH, не ограничены и могут вернуть--plugin-dirs. Единственное исключение — собственный плагин для ссылок Threads: он вшит в программу, записывается атомарно вyt-dlp-pluginsпапки конфигурации SNATCH (пересоздаётся, если содержимое отличается) и передаётся через--plugin-dirs. Плагин обращается кthreads.com(страница, скрипты и GraphQL) иstatic.cdninstagram.com(скрипты), других адресов не открывает. Если записать его не удалось, yt-dlp запускается без плагина — только без поддержки Threads - На Windows ссылки на
instagram.com,cdninstagram.com,fbcdn.net,facebook.com,threads.comиthreads.netидут через yt-dlp, а не aria2: Windows-сборка aria2 (WinTLS) не проходит TLS-рукопожатие с этими хостами. Если другой хост отклоняет aria2 (та же ошибка TLS или HTTP 403/429), CLI и GUI один раз повторяют загрузку через yt-dlp и до конца запуска больше не отдают этому хосту aria2