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

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

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

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

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

Категории

Все категории
Loading categories
watermarks-remover — Удаление мультивендорных меток происхождения ИИ: гигиена Unicode-текста, статистические хуки переписывания и C2PA/метаданные из PNG/JPEG/SVG/PDF/DOCX/HTML/MD | Kitploit
Инструменты/GitHubGitHub/guillaumemeyer/watermarks-remover
СтеганографияЦифровая криминалистикаКонфиденциальностьУтилиты и фреймворкиМашинное ОбучениеRed TeamingБезопасность ИИСостязательная Атака
GitHubguillaumemeyer/watermarks-remover

watermarks-remover

Удаление мультивендорных меток происхождения ИИ: гигиена Unicode-текста, статистические хуки переписывания и C2PA/метаданные из PNG/JPEG/SVG/PDF/DOCX/HTML/MD

Репозиторий
6.9k7475 дней назадЕщё не проверено

Популярное

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

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

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

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

Смотреть все инструменты →
Поделиться
root@kitploit:~
_ _ _ ____ ___ ____ ____ _  _ ____ ____ _  _ ____    ____ ____ _  _ ____ _  _ ____ ____
| | | |__|  |  |___ |__/ |\/| |__| |__/ |_/  [__  __ |__/ |___ |\/| |  | |  | |___ |__/
|_|_| |  |  |  |___ |  \ |  | |  | |  \ | \_ ___]    |  \ |___ |  | |__|  \/  |___ |  \

watermarks-remover

CI Release Stars Forks

Навык агента + скрипты Python из стандартной библиотеки для удаления мультивендорных маркеров происхождения ИИ из текста и файлов — для приватности и гигиены контента, которым вы владеете.

УровеньОбъектМетод
AНевидимый Unicode, экзотические пробелы, bidi, символы теговДетерминированные скрипты Python
BСтатистические (токен-семплинг) текстовые водяные знакиПереписывание агентом + опциональный хук rewrite_text.py
ФайлыC2PA / EXIF / XMP / свойства документовPNG, JPEG, SVG, PDF, DOCX, ODT, HTML, Markdown

Вендоры / экосистемы (на уровне классов): Claude, Gemini / SynthID-Text, поверхности происхождения OpenAI, марки в стиле Kirchenbauer для open-LLM.

Последний релиз: v0.4.0

Путь к навыку: skills/remove-ai-marks/
(миграция: ранее remove-claude-marks; слэш-алиас /remove-claude-marks по-прежнему задокументирован)

Установка (навык агента)```bash

Grok Build / project-local

mkdir -p .grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" .grok/skills/remove-ai-marks

User-global Grok

mkdir -p ~/.grok/skills ln -sfn "$(pwd)/skills/remove-ai-marks" ~/.grok/skills/remove-ai-marks

root@kitploit:~
Используйте `/remove-ai-marks` или команду «удалить AI-водяные знаки / C2PA / метки Claude / текст класса SynthID».

Дополнительные системные инструменты (используются автоматически при наличии):

| Инструмент | Назначение |
| --- | --- |
| [`c2patool`](https://github.com/contentauth/c2pa-rs/tree/main/cli) | Просмотр манифестов C2PA |
| [`exiftool`](https://exiftool.org/) | Удаление остаточных метаданных (особенно в **PDF**) |

Основным скриптам требуется только стандартная библиотека **Python 3.10+**. Вызовы моделей в слое B необязательны.

## Быстрое использование (скрипты)```bash
SCRIPTS=skills/remove-ai-marks/scripts

# Unified inspect / clean
python3 "$SCRIPTS/inspect_file.py" draft.md
python3 "$SCRIPTS/clean_file.py" draft.md -o draft.cleaned.md
python3 "$SCRIPTS/clean_file.py" photo.png -o photo.cleaned.png
python3 "$SCRIPTS/clean_file.py" notes.docx -o notes.cleaned.docx

# Text Layer A
python3 "$SCRIPTS/inspect_text.py" draft.md
python3 "$SCRIPTS/clean_text.py" draft.md -o draft.cleaned.md --stats

# Layer B rewrite hook (default: print prompt only — no model required)
python3 "$SCRIPTS/rewrite_text.py" draft.md --backend print-prompt --strength paraphrase
# Optional local Ollama (loopback only by default — remote endpoints require
# WATERMARKS_REWRITE_ALLOW_REMOTE=1 or --allow-remote):
# WATERMARKS_REWRITE_BACKEND=ollama WATERMARKS_REWRITE_MODEL=llama3.2 \
#   python3 "$SCRIPTS/rewrite_text.py" draft.md -o draft.rewritten.md
# API keys are read from WATERMARKS_REWRITE_API_KEY only (never argv).

# Images
python3 "$SCRIPTS/inspect_image.py" shot.png
python3 "$SCRIPTS/clean_image.py" shot.png -o shot.cleaned.png

Текстовые инструменты отклоняют бинарный ввод

inspect_text.py, clean_text.py и rewrite_text.py работают с текстом. При запуске на .docx, .pdf или изображении они раньше декодировали сжатые байты и выводили все выпавшие кодовые точки — шум, отражающий сжатие, а не содержимое — а clean_text.py затем записывал эти искажённые байты обратно, уничтожая файл. Теперь они отклоняют бинарный ввод и называют инструмент, который с ним работает:```bash python3 "$SCRIPTS/inspect_text.py" report.docx

refusing to treat report.docx as text: it looks like a ZIP container (DOCX, ODT, …).

Use inspect_file.py / clean_file.py, which route by format,

or pass --force-text to scan the raw bytes anyway.

root@kitploit:~
Обнаружение основано на магическом числе и соотношении управляющих байтов, поэтому текст в кодировках,
отличных от UTF-8, продолжает работать. `--force-text` переопределяет это поведение везде.

## Необязательная оценка SynthID в пиксельной области

`inspect_image.py` и `clean_image.py` могут сообщать оценку уверенности SynthID в пиксельной области,
если доступна внешняя копия репозитория
[`aloshdenny/reverse-SynthID`](https://github.com/aloshdenny/reverse-SynthID).
Модуль оценки **не встроен**: он загружается во время выполнения из вашей копии,
а его код остаётся под некоммерческой исследовательской лицензией вышестоящего
проекта.

### Вариант 1: однокомандная начальная настройка (без Docker)```bash
SCRIPTS=skills/remove-ai-marks/scripts

# Clones upstream, creates a venv, and installs scorer-only dependencies.
"$SCRIPTS/setup_synthid.sh"

# Score an image (default checkout: ~/reverse-SynthID).
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python "$SCRIPTS/score_synthid.py" shot.png

# Or surface the score from inspect / clean (same venv Python).
REVERSE_SYNTHID_DIR=~/reverse-SynthID \
~/reverse-SynthID/.venv/bin/python "$SCRIPTS/inspect_image.py" shot.png

setup_synthid.sh принимает --dir PATH, --ref REF и --full (устанавливает полный requirements.txt из upstream, который добавляет torch/diffusers для обхода upstream VAE, который этот проект не использует).

Вариант 2: локальная сборка Docker```bash

make docker-synthid-build

Run unprivileged and with a read-only rootfs; the scorer only needs to read

/data and write to stdout/tmp.

docker run --rm
--user "$(id -u):$(id -g)"
--read-only --tmpfs /tmp
-v "$(pwd):/data"
watermarks-remover-synthid-scorer /data/shot.png

root@kitploit:~
Образ собирается локально из исходного кода апстрима во время сборки. Он не
публикуется, поэтому не распространяет код апстрима.

Оценка V4 использует `artifacts/spectral_codebook_v4.npz` из рабочей копии апстрима
(~220 МБ). Это **только обнаружение/оценка** — оно не удаляет пиксельные
водяные знаки.

## Необязательное удаление пиксельных водяных знаков с помощью CtrlRegen

Для водяных знаков изображений **в пиксельной области** (SynthID-class, StegaStamp, Tree-Ring,
StableSignature) опциональный внешний бэкенд запускает конвейер CtrlRegen
(ControlNet + DINOv2 IP-Adapter с управляемой регенерацией). Бэкенд — это
[`mertizci/noai-watermark`](https://github.com/mertizci/noai-watermark),
поддерживаемая повторная реализация метода [CtrlRegen](https://arxiv.org/abs/2410.05470)
(ICLR 2025) с автоматическим тайлингом.

Бэкенд **не поставляется в комплекте** и не содержит файла LICENSE, поэтому он рассматривается как
«все права защищены»: он клонируется по зафиксированному коммиту и загружается во время выполнения.

### Инициализация```bash
SCRIPTS=skills/remove-ai-marks/scripts

# Clones upstream (pinned commit), creates a venv, installs torch + deps.
"$SCRIPTS/setup_ctrlregen.sh"

# Standalone removal (default checkout: ~/noai-watermark).
NOAI_WATERMARK_DIR=~/noai-watermark \
~/noai-watermark/.venv/bin/python "$SCRIPTS/clean_ctrlregen.py" shot.png -o shot.ctrlregen.png

Из `clean_image.py````bash

NOAI_WATERMARK_DIR=~/noai-watermark
~/noai-watermark/.venv/bin/python "$SCRIPTS/clean_image.py" shot.png
-o shot.cleaned.png --remove-pixel ctrlregen

root@kitploit:~
Порядок операций: сначала удаление метаданных, затем удаление пикселей CtrlRegen, затем
опциональная оценка reverse-SynthID до/после (когда `REVERSE_SYNTHID_DIR`
также задан).

**По умолчанию сила воздействия консервативна** (`--ctrlregen-strength 0.25`), поскольку
более высокая сила удаляет больше водяного знака, но регенерирует большую часть изображения.
Документированные пресеты: `0.15` минимальный / `0.25` по умолчанию / `0.35` сбалансированный /
`0.5` агрессивный / `0.7` максимальный (по умолчанию в бэкенде — 0.5). `--ctrlregen-steps`
по умолчанию равен 50 (эффективное количество шагов шумоподавления ≈ steps × strength).

### Размер изображения (собственный лимит 512×512)

CtrlRegen — это ControlNet 512×512 на базе Stable Diffusion 1.5. Бэкенд обрабатывает
произвольные входные данные, поэтому здесь не предусмотрено дополнительного тайлинга:

- **≤512 px:** один проход — центральный кадр/изменение размера до 512, регенерация, обратное изменение размера.
- **>512 px:** автоматическое перекрывающееся тайлингование (тайлы 512 px, перекрытие 192 px),
  ширина/высота выравниваются по кратности 8, затем швы с косинусным смешиванием.
- **В любом случае:** вывод изменяется до исходного размера и подбирается по цвету к
  исходному изображению.

Очень большие изображения (например, 4K) порождают много тайлов, поэтому время выполнения растёт с количеством тайлов
(медленнее и больше VRAM). По возможности уменьшайте большие входные данные заранее; размер тайла
и перекрытие жёстко заданы в апстриме и не выставляются флагами.

### Вычислительные ресурсы, закрытые модели и проверка

Ожидайте загрузку моделей объёмом ~10 ГБ; настоятельно рекомендуется GPU, а на CPU выполнение
медленное. Некоторые вышестоящие модели закрыты, поэтому экспортируйте `HF_TOKEN` (только через env —
никогда через argv). `clean_ctrlregen.py` отказывается автоматически устанавливать зависимости; запустите
сначала `setup_ctrlregen.sh`.

Локального детектора для StegaStamp/Tree-Ring/StableSignature нет, поэтому
единственный локальный сигнал — оценка reverse-SynthID (суррогат). Когда она доступна,
`clean_image.py --remove-pixel ctrlregen` сообщает эту оценку до/после;
официальная проверка Google SynthID остаётся окончательным авторитетом.

### Docker```bash
make docker-ctrlregen-build
docker run --rm -e HF_TOKEN="$HF_TOKEN" \
  --user "$(id -u):$(id -g)" \
  -v "$(pwd):/data" \
  watermarks-remover-ctrlregen /data/shot.png -o /data/shot.ctrlregen.png

Матрица покрытия

КаналClaudeGemini/SynthIDOpenAIOpen-LLM
Текст на основе Unicode / редактированияLayer ALayer ALayer ALayer A
Текст со статистической выборкойLayer B best-effortLayer B best-effortLayer B, если имеетсяLayer B best-effort
C2PA / метаданные файловДа (перечисленные форматы)Да, при наличииДа, при наличииДа, при наличии
Пиксельные метки изображенийНе входит в область охватаОпционально: оценка SynthID + удаление CtrlRegen (внешнее)Не входит в область охватаОпционально: удаление CtrlRegen (внешнее)
Бэкдоры в обученииНе входит в область охватаНе входит в область охватаНе входит в область охватаНе входит в область охвата

Подробности: skills/remove-ai-marks/references/vendor-notes.md, mark-classes.md.


Как работает маркировка текста (кратко)

Современные водяные знаки LLM часто скрывают сигнал в том, какие токены выбираются (генеративное / выборочное смещение), а не только в невидимых символах. Схемы на основе редактирования внедряют правила Unicode или синонимов. Файловые схемы добавляют C2PA или метаданные генератора.

  • Layer A удаляет переносчики на основе редактирования Unicode (проверяемо).
  • Layer B атакует водяные знаки выборки с помощью сильного переписывания (best-effort; стандартные из литературы атаки, такие как перефразирование / обратный перевод).
  • Очистители файлов удаляют C2PA/XMP/свойства из поддерживаемых контейнеров.

Пока поставщики не выпустят публичные детекторы и ключи, ни один инструмент не может честно гарантировать, что «это не пройдёт официальную проверку». В отчётах необходимо разделять проверяемую и best-effort работу.

Для Layer B предпочтительнее использовать не исходную модель (не переписывайте текст Claude с помощью Claude, если пытаетесь избежать повторной маркировки).


Отказ от ответственности: чего стоит удаление текстового водяного знака

Текстовые водяные знаки живут в самой формулировке: сигнал распределён по выбору токенов, поэтому почти каждое предложение несёт его частицу. Отсюда следуют два следствия, и именно поэтому Layer B честно описывается как best-effort, а не как волшебный ластик.

  1. Удаление означает переформулирование, а не переструктурирование. Перестановка абзацев, изменение заголовков или лёгкая правка почти не влияют на сигнал. Удаление статистической метки требует переписывания значительной части текста — предложение за предложением, а не раздел за разделом.

  2. Переформулирование ухудшает текст. Любое переписывание заменяет исходный выбор слов на выбор слов модели-переписчика, что нивелирует тон, голос и точность. На продакшн-текстах (SEO, маркетинг, работа с клиентами) это ухудшение реально и часто заметно тем, кому текст важнее всего. Это как взять текст от модели высшего уровня и попросить менее способную модель переписать его с нуля: результат не может превысить потолок модели-переписчика.

Что приводит к честному вопросу полного цикла:

Если всё равно планируется переписывать текст более дешёвой моделью, зачем вообще платить за премиум-модель? Генерация напрямую более дешёвой моделью проще, дешевле и даёт тот же — или лучший — конечный результат.

Layer B имеет смысл, когда вам нужны именно мышление и черновики премиум-модели, и вы принимаете проход переписывания для удовлетворения требований гигиены или конфиденциальности, — а не как дешёвый путь к тексту без меток.

Когда следует пропустить Layer B:

  • Качество важнее гигиены: используйте путь без потерь — очистку Unicode Layer A плюс очистители метаданных файлов — и сохраните исходный текст.
  • Всё равно переписываете: используйте не исходную модель (переписывание исходной моделью может повторно пометить текст) и помните, что остаточный риск сохраняется — ни один инструмент не может гарантировать, что детектор производителя не сработает.

Форматы файлов

ФорматПроверкаОчистка
PNG / JPEGC2PA chunks / APP11, XMP-подсказки ИИУдалить сегменты метаданных
SVG<metadata>, XMPУдалить блоки
PDFByte/XMP + опциональные инструментыПредпочтителен exiftool; без него качество снижается
DOCXdocProps / customXmlОчистить свойства, удалить customXml
ODTmeta.xmlУдалить генератор / ИИ-подобные метаданные
HTMLmeta, JSON-LD, data-ai*Удалить теги/атрибуты
Markdownключи ИИ в YAML frontmatterУдалить ключи + тело Layer A

Удаление водяных знаков в пиксельной области теперь доступно как опциональный внешний бэкенд CtrlRegen (см. выше); это регенеративный инструмент удаления, а не гарантия. Мягкая привязка C2PA (водяной знак в содержимом, который может повторно связать удалённый манифест Content Credentials после удаления метаданных) остаётся вне области охвата. Удаление жёстко связанного C2PA не очищает эти каналы.

Остаточный риск после очистки

Этот инструмент сообщает о проверяемых удалениях (счётчики Unicode, действия с метаданными) и best-effort переписываниях Layer B. Он не может гарантировать, что детекторы производителей не сработают.

Чтобы самостоятельно проверить остаточные сигналы (опционально, внешне):

КаналЧто мы удаляемЧто может остатьсяВнешняя проверка (примеры)
Жёстко связанные C2PA / EXIF / XMPДаМягко связанные / пиксельные меткиc2patool, Content Credentials verify
Медиа класса SynthIDОпциональное удаление пикселей (внешний CtrlRegen); в противном случае локальная оценкаВодяной знак аудио/видео; остаточный пиксельный водяной знак после удаленияИнструменты провайдера (например, Google SynthID / детектор Vertex, где доступен); опциональный локальный оценщик reverse-SynthID
Статистический текстПереписывание best-effortСильные метки после лёгкого редактированияНет публичного универсального детектора; инструменты производителей, когда доступны

Отраслевой контекст двух уровней (C2PA + незаметный водяной знак): руководство Institute of AI PM.


Варианты удаления (сводка)

ВариантУдаляетПримечания
Очистка Unicode (Layer A)ZWSP, bidi, теги, экзотические пробелы, …Безопасный вариант по умолчанию для текста
Переписывание (Layer B)Статистические метки токенов (best-effort)Всегда предлагается навыком; ценой является стиль — см. Отказ от ответственности
Удаление метаданных контейнераПроисхождение файлаСм. таблицу форматов
Удаление пикселей CtrlRegen (опционально)Пиксельные метки изображений (класс SynthID, StegaStamp, Tree-Ring, StableSignature)Внешний бэкенд; высокая вычислительная нагрузка; консервативная сила по умолчанию
Локальные модели с открытым весомИзбежание повторной маркировки исходной модельюОперационная альтернатива

Матрица: skills/remove-ai-marks/references/removal-matrix.md.

Этика и отказ от ответственности

См. skills/remove-ai-marks/references/ethics.md. Для конфиденциальности и исследований вашего контента — а не для академического мошенничества или ложных заявлений о «написанном человеком».

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

Тесты```bash

python3 -m venv .venv && .venv/bin/pip install pytest .venv/bin/python -m pytest # or: make test make smoke # quick CLI smoke on fixtures

root@kitploit:~
## Журнал изменений

### [v0.4.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.4.0) — удаление пикселей, уверенность в находках, Windows и исправления ложных срабатываний

**Опциональное удаление пикселей CtrlRegen (внешний бэкенд)**

- Опциональное удаление водяных знаков в пиксельной области через внешнюю копию `mertizci/noai-watermark`: адаптер `clean_ctrlregen.py` + начальная настройка `setup_ctrlregen.sh` (зафиксированный коммит, разреженный чекаут, venv, проверка SHA), а также `Dockerfile.ctrlregen` и `make bootstrap-ctrlregen` / `docker-ctrlregen-build` / `smoke-ctrlregen`
- `clean_image.py --remove-pixel ctrlregen` выполняет удаление метаданных → удаление CtrlRegen → опциональную оценку reverse-SynthID до/после; `inspect_image.py` подсказывает флаг при высоком SynthID-скоре
- Консервативная сила по умолчанию `0.25` (пресеты 0.15/0.25/0.35/0.5/0.7); конвейер с нативным разрешением 512×512 автоматически разбивается на тайлы бэкендом для изображений большего размера; torch-подпроцесс получает более высокие переопределяемые через env лимиты ресурсов
- Бэкенд никогда не встраивается: `noai-watermark` не содержит файла LICENSE (рассматривается как «все права защищены»), а его пути автоматической установки/перезапуска обходятся путём прямого использования `CtrlRegenEngine`

**Уверенность в находках и сводные аудиты**

- Находки теперь классифицируются как `confirmed` / `probable` / `informational` / `likely_false_positive` и отображаются в JSON для текста/изображений/контейнеров и в человекочитаемых отчётах
- Новые `audit_dir.py` (рекурсивное дерево) и `audit_website.py` (обнаружение sitemap + обход) создают сводные отчёты; описано в SKILL.md

**Исправления ложных срабатываний**

- DOCX: сканировать только `docProps`/`customXml`, а не видимое тело (#14)
- Текстовый слой A: сохранять `VS16`/`ZWJ` после базового эмодзи; новый параноидальный флаг `--strip-emoji-glue` (#22)
- HTML: считать теги генератора CMS информационными, а не AI-метаданными (#13)
- PDF: исключить полезные нагрузки потоков из байтового сканирования AI-маркеров (#13)
- Отчёты inspect указывают на неподдерживаемые пути и пути best-effort

**Поддержка Windows**

- Ограничить POSIX-only `preexec_fn` и `os.fchmod`, чтобы запись и опциональные инструменты работали в Windows (#15, #23)
- Перенастроить stdio на UTF-8, чтобы перенаправленные потоки Windows больше не вызывали ошибок на невидимых символах Unicode; добавлен этап Windows CI и дымовой прогон CLI (#23)

**Документация и цепочка поставок**

- Раздел README о CtrlRegen + научные ссылки (CtrlRegen, UnMarker, предупреждение о форензической скрытности), дисклеймер об ответственном использовании; обновления SKILL/matrix/vendor-notes/ethics
- Конфигурация Dependabot + CODEOWNERS для путей безопасности; обновлены scipy/numpy/opencv-python/scikit-learn/pywavelets и базовый образ до Python 3.14-slim
- Тесты CtrlRegen на основе mock (без torch в CI)

### [v0.3.2](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.2) — усиление безопасности (безопасная запись, HTTP-клиент, цепочка поставок CI)

- **Безопасная атомарная запись вывода**: каждый очиститель теперь пишет через временный файл + атомарное переименование (`safe_write_bytes` / `safe_write_text`), отказывается от симлинков в качестве назначения и создаёт резервные копии `.bak` тем же безопасным путём — заранее созданные симлинки (например, в `/tmp` или папках загрузок) больше не могут перенаправить «чистую» запись на произвольный файл
- **Усиление HTTP-клиента `rewrite_text.py`**: редиректы полностью запрещены, поэтому API-ключ в заголовке `Authorization` никогда не будет повторно отправлен на непроверенный хост; конечные точки вне loopback **запрещены по умолчанию** (включаются с помощью `--allow-remote` или `WATERMARKS_REWRITE_ALLOW_REMOTE=1`); принимаются только схемы http(s); `--api-key` удалён — ключи задаются только через переменную окружения `WATERMARKS_REWRITE_API_KEY`
- **Лимиты ресурсов**: максимальный входной размер по умолчанию снижен с 1 ГиБ до 256 МиБ, добавлен лимит stdin 64 МиБ, бюджет zip для DOCX/ODT снижен с 512 МиБ до 128 МиБ, а `RLIMIT_AS`/`RLIMIT_FSIZE` применяются к подпроцессам exiftool/c2patool/SynthID (все лимиты переопределяются через env)
- **Цепочка поставок**: действия CI зафиксированы по SHA с `permissions: contents: read`, зафиксированы dev-зависимости (`requirements-dev.txt`), добавлен шаг `pip-audit` и новый workflow CodeQL; Docker-образ теперь запускается от непривилегированного пользователя с зафиксированным pip
- **Зависимости скорера**: Pillow обновлён с 10.4.0 до 12.3.0 (24 известные CVE); использование API проверено на зафиксированном коммите апстрима
- Тесты: 18 новых регрессионных тестов безопасности (всего 60, все проходят)

### [v0.3.1](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.1) — более сильный переписыватель статистического водяного знака Layer B

- Парафраза по умолчанию в `rewrite_text.py` теперь выполняет явную атаку на **выбор слов + синтаксис** (порядок клауз, коннекторы, слова-связки, границы предложений, служебные слова), а не общий переписыватель
- Новый `--strength humanize`: zero-shot проход «пиши как человек», нацеленный на шаблонные AI-стилистические обороты
- Новый `--strength code`: переписывает комментарии, докстроки и строковые литералы, переименовывает локальные идентификаторы, сохраняя поведение и публичные имена API
- Структурный проход теперь выдаёт «естественную, разнообразную человеческую прозу» вместо типичного для AI «чёткого профессионального стиля»
- Новый `--temperature` (по умолчанию `0.9`) для бэкендов Ollama и OpenAI-совместимых
- Новый `--candidates N`: создаёт N переписанных вариантов и выбирает наиболее лексически расходящийся (дистанция Жаккара для биграмм) с защитой от дрейфа длины
- Более строгая гигиена моделей: предпочитать локальные модели с открытыми весами и избегать любого вендора с известными водяными знаками, а не только предполагаемого источника
- Отчёт об остаточном риске теперь различает короткий/легко предсказуемый текст (низкий риск) и длинную прозу с высокой энтропией (высокий риск)
- Документация обновлена в `SKILL.md`, `removal-matrix.md` и `vendor-notes.md`; тесты покрывают новые промпты, оценку расхождения и выбор кандидата

### [v0.3.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.3.0) — опциональная пиксельная оценка SynthID

- Опциональный пиксельный SynthID-скор через внешнюю копию [`aloshdenny/reverse-SynthID`](https://github.com/aloshdenny/reverse-SynthID) (`score_synthid.py`); доступен в `inspect_image.py` / `clean_image.py` с `REVERSE_SYNTHID_DIR` или `--synthid-dir`
- Начальная настройка `setup_synthid.sh` (только зависимости скорера; `--full` устанавливает требования апстрима); `Dockerfile.synthid` и `make docker-synthid-build` / `docker-synthid-help`
- Цели Makefile `smoke-synthid` и `bootstrap-synthid`
- Тесты для адаптера скорера, пути недоступности CLI, разбора JSON и ошибок времени выполнения
- Документация: только обнаружение/оценка (без удаления пикселей); код апстрима не встраивается и остаётся под некоммерческой Research License

### [v0.2.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.2.0) — исправление ложного срабатывания c2patool

- `image_meta.py`: `has_manifest` больше не помечает `Error: No claim found` / `No JUMBF data found` как манифест (ошибка приоритета операторов: отрицательные маркеры теперь блокируют все положительные ветви)
- Новый `tests/test_c2patool_report.py` (4 случая: нет claim, нет JUMBF, настоящий манифест, отсутствие инструмента)
- Документация: исправлены ссылки на `c2patool` (репозиторий переехал на `contentauth/c2pa-rs`); добавлен дисклеймер о потере качества при удалении текстовых водяных знаков

### [v0.1.0](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.1.0) — полировка упаковки + честность в отношении происхождения

- `Makefile` (`test` / `smoke` / `install-skill`) и `pytest.ini`
- Примеры-фикстуры для Markdown, HTML, SVG; тест деградированной очистки PDF
- Документация: отраслевая **двухуровневая** модель (жёстко связанный C2PA против мягкой привязки / SynthID-media)
- Таблица остаточного риска в README + ссылки на внешние инструменты проверки
- Справочник: руководство Institute of AI PM по C2PA/SynthID
- Мягкая привязка и пиксельные/аудио/видео водяные знаки явно выходят за рамки в skill/matrix/ethics

### [v0.0.1](https://github.com/guillaumemeyer/watermarks-remover/releases/tag/v0.0.1) — первый мультивендорный релиз

- Навык агента `remove-ai-marks` (заменяет только-для-Claude `remove-claude-marks`)
- **Слой A:** невидимые Unicode / bidi / теговые символы / гомоглифы пробела (`inspect_text` / `clean_text`)
- **Слой B:** рекомендации по переписыванию + опциональный `rewrite_text.py` (print-prompt, Ollama, OpenAI-совместимый)
- **Файлы:** удаление C2PA/AI-метаданных для PNG, JPEG, SVG, PDF, DOCX, ODT, HTML, Markdown
- Унифицированные `inspect_file.py` / `clean_file.py`
- Мультивендорная документация (Claude, класс Gemini/SynthID, OpenAI, open-LLM)
- Скрипты на основе стандартной библиотеки; опциональные `c2patool` / `exiftool`

## Лицензия

MIT — см. [LICENSE](https://github.com/guillaumemeyer/watermarks-remover/blob/HEAD/LICENSE).

## Ссылки

- [Как Claude помечает AI-сгенерированный контент](https://support.claude.com/en/articles/16266773-how-claude-marks-ai-generated-content) (Anthropic)
- Dathathri и др., [*Масштабируемые водяные знаки для идентификации выходных данных больших языковых моделей*](https://www.nature.com/articles/s41586-024-08025-4) (SynthID-Text, Nature 2024)
- Google AI for Developers, [*Защитные механизмы SynthID*](https://ai.google.dev/responsible/docs/safeguards/synthid) (документация Gemini API)
- [C2PA](https://c2pa.org/) / [c2patool](https://github.com/contentauth/c2pa-rs/tree/main/cli)
- Kirchenbauer и др., [*Водяной знак для больших языковых моделей*](https://arxiv.org/abs/2301.10226)
- Zhang и др., [*Водяные знаки на песке: невозможность сильных водяных знаков для генеративных моделей*](https://arxiv.org/abs/2311.04378) (ICML 2024)
- [google-deepmind/synthid-text](https://github.com/google-deepmind/synthid-text) (научный справочник; здесь не используется для обнаружения)
- [aloshdenny/reverse-SynthID](https://github.com/aloshdenny/reverse-SynthID) (научный справочник)
- Liu и др., [*Водяные знаки на изображениях можно удалять с помощью управляемой регенерации из чистого шума*](https://arxiv.org/abs/2410.05470) (ICLR 2025) — метод пиксельной регенерации, реализованный в опциональном бэкенде CtrlRegen — [код](https://github.com/yepengliu/CtrlRegen)
- Kassis & Hengartner, [*UnMarker: универсальная атака на защитные водяные знаки изображений*](https://arxiv.org/abs/2405.08363) (arXiv:2405.08363; IEEE S&P 2025) — универсальная атака на водяные знаки, сравнение проводится по другой метрике, чем у CtrlRegen
- Goonatilake & Ateniese, [*Удалить водяной знак недостаточно: форензическая скрытность при удалении водяных знаков генеративного ИИ*](https://arxiv.org/abs/2605.09203) (arXiv:2605.09203) — обосновывает консервативную силу по умолчанию: после удаления всё ещё могут оставаться форензические следы
- [mertizci/noai-watermark](https://github.com/mertizci/noai-watermark) (CLI/Python-инструментарий для удаления SynthID/StableSignature/TreeRing и очистки AI-метаданных)
- [0xROOTPLS/DeSynth](https://github.com/0xROOTPLS/DeSynth) (удаление SynthID для изображений OpenAI/Google)
- Institute of AI PM, [*Прослеживаемость и водяные знаки AI-контента: руководство PM по C2PA и SynthID*](https://www.institutepm.com/knowledge-hub/ai-content-provenance-watermarking) (двухуровневая отраслевая модель: C2PA + незаметный водяной знак / мягкая привязка; контекст SB 942 / ст. 50 Закона ЕС об ИИ)
Скачать инструмент