
LLM이 생성한 Python, Java, C++ 코드에 삽입된 키 기반 스타일 기반 워터마크를 CST 재작성을 통해 삽입하고 탐지하며, 기능적 정확성을 유지하고 코드 편집 공격에 저항합니다.
| Feature | Token-level watermarks (KGW, SWEET, Unigram, STONE, STA-1) | Post-hoc watermarks (ACW, SrcMarker, RoSeMary) | ✨ SEW |
|---|---|---|---|
| Access | Decoding-time (biases token selection) | Post-hoc (rewrites finished code) | Post-hoc (rewrites finished code, model-agnostic) |
| Functional correctness | Changes the program (detectability–correctness trade-off) | Can break programs (Java/C++ pass@1 ≈ 12% for neural rewriting) | Preserved (pass@1 equal to unwatermarked code) |
| Predictability | — | Recurring patterns (recovered from 10 watermarked programs) | Key- and context-dependent (choices vary with each program's structure) |
| Detection (TPR@FPR5%) | 14–60% | 31–98% | ⚡ 98.7–99.5% |
LLM 생성 코드에 워터마킹을 적용하면 출처 추적을 지원할 수 있습니다. 생성 중 토큰 선택을 수정하는 워터마크는 탐지 가능성과 기능적 정확성 사이에서 상충 관계를 가지며, 생성 모델에 대한 제어를 요구합니다. 반면 사후(post-hoc) 방식은 미리 정의된 변환이나 학습된 신경망 모델로 완성된 코드에 워터마킹을 하지만, 반복되는 패턴 때문에 프로그램 전반에 걸쳐 워터마크를 예측할 수 있고, 워터마크가 없는 코드에서 이미 흔한 패턴이 워터마크 증거로 간주되어 오탐을 유발합니다. 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는 포매팅, 린팅, 주석 제거, 변수 이름 변경에도 탐지를 유지하며, 워터마크된 프로그램을 관찰한 공격자가 사후 방식 기준선의 스타일 선택을 복원하는 방식으로 SEW의 스타일 선택을 복원할 수 없습니다.
주요 결과 — CodeContests에서의 탐지 (TPR@FPR5% / AUROC, %), 세 개의 LLM(Qwen3.5-9B, gemma-4-12B-it, gpt-oss-20b)에 대한 평균.
| Type | Method | Python | Java | C++ |
|---|---|---|---|---|
| Token-level | 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 | |
| Post-hoc | 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).
| Method | 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만 해당).
| Method | No attack | Formatting | Linting | Comment removal | Renaming |
|---|---|---|---|---|---|
| KGW | 50.31 | 43.31 | 49.99 | 24.48 | 43.26 |
| SWEET | 53.71 | 49.79 | 53.00 | 19.34 | 48.83 |
| ACW | 90.10 | 0.51 | 93.56 | 89.35 | 3.17 |
| SrcMarker | 77.20 | 77.23 | 76.42 | 77.20 | 26.43 |
| RoSeMary | 70.04 | 67.00 | 69.42 | 70.04 | 22.26 |
| SEW | 99.14 | 95.57 | 98.99 | 99.14 | 99.14 |
세 개의 LLM과 세 개의 프로그래밍 언어를 사용한 CodeContests 실험 결과:
전체 표, 규칙 인식 플리핑 및 LLM 재작성 공격, 절제 실험은 논문을 참조하세요.