
Встраивает и обнаруживает ключевые, основанные на стиле водяные знаки в сгенерированном LLM коде на Python, Java и C++ посредством перезаписи CST, сохраняя функциональную корректность и противостоя атакам редактирования кода.
| Особенность | Водяные знаки на уровне токенов (KGW, SWEET, Unigram, STONE, STA-1) | Пост-фактум водяные знаки (ACW, SrcMarker, RoSeMary) | ✨ SEW |
|---|---|---|---|
| Доступ | Во время декодирования (смещает выбор токенов) | Пост-фактум (переписывает готовый код) | Пост-фактум (переписывает готовый код, не зависит от модели) |
| Функциональная корректность | Изменяет программу (компромисс между обнаруживаемостью и корректностью) | Может сломать программы (Java/C++ pass@1 ≈ 12% при нейросетевом переписывании) | Сохраняется (pass@1 равен коду без водяного знака) |
| Предсказуемость | — | Повторяющиеся шаблоны (восстанавливаются из 10 программ с водяным знаком) | Зависит от ключа и контекста (выборы меняются в зависимости от структуры каждой программы) |
| Обнаружение (TPR@FPR5%) | 14–60% | 31–98% | ⚡ 98.7–99.5% |
Водяные знаки в коде, сгенерированном LLM, поддерживают отслеживание происхождения. Водяные знаки, изменяющие выбор токенов во время генерации, обменивают обнаруживаемость на функциональную корректность и требуют контроля над генерирующей моделью. Пост-фактум методы вместо этого наносят водяной знак на готовый код с помощью предопределённых преобразований или обученных нейросетевых моделей, но их повторяющиеся шаблоны делают водяной знак предсказуемым для разных программ, а шаблоны, которые уже распространены в коде без водяного знака, засчитываются как доказательство наличия водяного знака, что приводит к ложным срабатываниям. SEW задаётся вопросом: может ли стиль кода уже сгенерированной программы нести водяной знак, который корректен по построению, трудно предсказуем и откалиброван относительно написанного человеком кода?
SEW (Style-Encoded Watermarking) встраивает и обнаруживает водяные знаки в уже сгенерированном коде с помощью трёх компонентов:
x += 1 / x = x + 1, range(n) / range(0, n), if (c) s; / if (c) { s; }), сопоставляются на конкретном синтаксическом дереве (CST). Какой вариант принимает позиция, определяется секретным ключом и структурным контекстом позиции.Для обнаружения нужны только подозрительный код и ключ — не генерирующая модель, не исходный код и не какая-либо запись о встраивании.
✅ Не зависит от модели и корректен по построению — SEW переписывает только те стилевые позиции, где оба варианта имеют одинаковую семантику, поэтому он работает с выводом любой модели и сохраняет pass@1 равным таковому для кода без водяного знака.
✅ Откалиброванное доказательство — тест Пуассона-бинома с вероятностями стилей, оценёнными по написанному человеком коду (решения LeetCode, не пересекающиеся с данными оценки), поддерживает низкий уровень ложных срабатываний на человеческом коде.
✅ Устойчив и трудно выводим — SEW сохраняет обнаружение при форматировании, линтинге, удалении комментариев и переименовании переменных, и противник, наблюдающий программы с водяным знаком, не может восстановить его стилевые выборы так, как он восстанавливает выборы пост-фактум базовых методов.
Основной результат — обнаружение на CodeContests (TPR@FPR5% / AUROC, %), усреднённое по трём LLM (Qwen3.5-9B, gemma-4-12B-it, gpt-oss-20b).
| Тип | Метод | Python | Java | C++ |
|---|---|---|---|---|
| На уровне токенов | KGW | 48.33 / 80.56 | 43.30 / 72.31 | 59.31 / 84.54 |
| SWEET | 59.92 / 85.18 | 41.19 / 76.56 | 60.01 / 87.24 | |
| Unigram | 57.45 / 88.97 | 36.54 / 71.37 | 47.05 / 71.13 | |
| STONE | 28.09 / 62.33 | 14.38 / 62.95 | 23.65 / 64.79 | |
| STA-1 | 35.26 / 66.26 | 20.93 / 61.48 | 44.71 / 73.72 | |
| Пост-фактум | ACW | 90.10 / 95.05 | – | – |
| SrcMarker | 90.21 / 97.86 | 71.52 / 93.58 | 69.88 / 81.55 | |
| RoSeMary | 97.86 / 97.32 | 31.00 / 95.46 | 81.26 / 89.44 | |
| SEW | 99.49 / 99.64 | 98.70 / 98.99 | 99.22 / 99.38 |
Функциональная корректность (pass@1 кода с водяным знаком, %; код без водяного знака: 57.63 / 52.05 / 53.74).
| Метод | Python | Java | C++ |
|---|---|---|---|
| ACW | 56.00 | – | – |
| SrcMarker | 56.78 | 11.87 | 11.82 |
| RoSeMary | 56.39 | 11.71 | 11.52 |
| SEW | 57.63 | 52.05 | 53.74 |
Устойчивость к атакам редактирования кода (TPR@FPR5%, %, усреднённое по трём LLM и трём языкам; ACW: только Python).