Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
SEW — 在LLM生成的Python、Java和C++代码中嵌入并检测基于键控、基于风格的水印,通过CST重写实现,保持功能正确性并抵御代码编辑攻击。 | Kitploit
工具/GitHubGitHub/suhanmen/sew
静态分析代码分析密码学论文与研究AI 安全
GitHubsuhanmen/sew

SEW

在LLM生成的Python、Java和C++代码中嵌入并检测基于键控、基于风格的水印,通过CST重写实现,保持功能正确性并抵御代码编辑攻击。

查看仓库
1113小时1分前尚未审核

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →
分享

SEW:LLM 生成代码的风格编码水印

GitHub Repo stars GitHub last commit GitHub contributors

论文链接📖

📰 新闻

  • 📢 最新!SEW 论文已在 arXiv 上发布:arXiv:2609.39414。(2026 年 9 月 30 日)
  • 📢 官方 SEW 代码已在 GitHub 上发布。(2026 年 9 月 30 日)

🔍 动机

特性Token 级水印(KGW、SWEET、Unigram、STONE、STA-1)事后水印(ACW、SrcMarker、RoSeMary)✨ SEW
访问方式解码时(偏置 token 选择)事后(重写已完成的代码)事后(重写已完成的代码,模型无关)
功能正确性改变程序(可检测性与正确性的权衡)可能破坏程序(Java/C++ 的 pass@1 在神经重写下约为 12%)保持不变(pass@1 与未加水印的代码相同)
可预测性—重复出现的模式(可从 10 个加水印的程序中恢复)依赖密钥和上下文(选择随每个程序的结构而变化)
检测(TPR@FPR5%)14–60%31–98%⚡ 98.7–99.5%

对 LLM 生成的代码加水印有助于来源追踪。在生成过程中修改 token 选择的水印需要在可检测性与功能正确性之间权衡,并且需要控制生成模型。事后方法则使用预定义的变换或训练好的神经模型对已完成的代码加水印,但它们重复出现的模式使水印在不同程序间可被预测,而且那些在未加水印代码中本就常见的模式会被计为水印证据,从而导致误检。SEW 提出的问题是:一个已经生成的程序的代码风格,能否承载一种构造上正确、难以预测、并针对人类编写代码进行校准的水印?

✨ 关于 SEW

SEW overview

SEW(Style-Encoded Watermarking,风格编码水印)通过三个组件在已生成的代码中嵌入和检测水印:

  1. 带密钥、依赖上下文的代码风格规则选择。 从风格指南和变换规则中收集的语义等价的风格选择(Python 29 条、Java 22 条、C++ 19 条;例如 x += 1 / x = x + 1、range(n) / range(0, n)、if (c) s; / if (c) { s; })在具体语法树(CST)上进行匹配。某个位置采用哪种变体由秘密密钥和该位置的结构上下文决定。
  2. 风格偏好校准。 水印证据会对照每种风格变体在人类编写代码中出现的概率进行评估,因此人们本就偏好的风格权重更低。
  3. 上下文感知的风格聚合。 在结构上匹配的位置、且被赋予相同风格选择的位置会被合并为一个投票,这样同一选择的重复应用就不会夸大证据。

检测只需要可疑代码和密钥——不需要生成模型、原始代码或任何嵌入记录。

🚀 SEW 的价值何在?

✅ 模型无关且构造上正确 —— SEW 只重写两种变体语义相同的风格位置,因此它适用于任何模型的输出,并使 pass@1 与未加水印的代码保持一致。

✅ 校准的证据 —— 使用从人类编写代码(LeetCode 题解,与评估数据不相交)估计的风格概率进行泊松二项检验,使人类代码上的误检率保持较低。

✅ 鲁棒且难以推断 —— SEW 在格式化、lint、注释移除和变量重命名下仍能保持检测能力,而观察了加水印程序的对手无法像恢复事后基线那样恢复其风格选择。

📈 结果

主要结果——在 CodeContests 上的检测(TPR@FPR5% / AUROC,%),在三个 LLM(Qwen3.5-9B、gemma-4-12B-it、gpt-oss-20b)上取平均。

类型方法PythonJavaC++
Token 级KGW48.33 / 80.5643.30 / 72.3159.31 / 84.54
SWEET59.92 / 85.1841.19 / 76.5660.01 / 87.24
Unigram57.45 / 88.9736.54 / 71.3747.05 / 71.13
STONE28.09 / 62.3314.38 / 62.9523.65 / 64.79
STA-135.26 / 66.2620.93 / 61.4844.71 / 73.72
事后ACW90.10 / 95.05––
SrcMarker90.21 / 97.8671.52 / 93.5869.88 / 81.55
RoSeMary97.86 / 97.3231.00 / 95.4681.26 / 89.44
SEW99.49 / 99.6498.70 / 98.9999.22 / 99.38

功能正确性(加水印代码的 pass@1,%;未加水印代码:57.63 / 52.05 / 53.74)。

方法PythonJavaC++
ACW56.00––
SrcMarker56.7811.8711.82
RoSeMary56.3911.7111.52
SEW57.6352.0553.74

对代码编辑攻击的鲁棒性(TPR@FPR5%,%,在三个 LLM 和三种语言上取平均;ACW:仅 Python)。

方法无攻击格式化Lint注释移除重命名
KGW50.3143.3149.9924.4843.26
SWEET53.7149.7953.0019.3448.83
ACW90.100.5193.5689.353.17
SrcMarker77.2077.2376.4277.2026.43
RoSeMary70.0467.0069.4270.0422.26
SEW99.1495.5798.9999.1499.14

我们在 CodeContests 上使用三个 LLM 和三种编程语言进行的实验表明:

  • 每种语言的检测率都更高。 SEW 在每种语言上平均达到 98.70–99.49% 的 TPR@FPR5%,高于所有 token 级和事后基线。
  • 功能正确性无损失。 SEW 只改变语义等价的风格选择,因此加水印的代码恰好通过原始代码所通过的那些测试。
  • 对代码编辑鲁棒。 格式化、lint、注释移除和重命名几乎不改变 SEW 的检测能力,而每个事后基线至少在其中一种攻击下会丢失大部分信号。
  • 难以推断。 在仅观察 10 个加水印程序后,对手即可恢复 ACW(99.54–99.77%)、SrcMarker(89.45–94.53%)和 RoSeMary(85.70–94.79%)的插入决策;SEW 依赖密钥和上下文的选择在每种设置下都给出最低的恢复率。

完整表格、规则感知翻转和 LLM 重写攻击以及消融实验,请参见论文。

🔬 案例研究:每种事后水印对程序做了什么

方法嵌入方式编辑示例出了什么问题SEW 下的同一位置
ACW固定规则,方向始终相同;检测 = 重新应用并观察是否有变化line = line + w → line = w + line
if n > 0 → if 0 < n
❌ 无类型保护:abcde → ecdab
❌ 到处是相同模式:10 个程序即可揭示(99.7%)
❌ 空格是标记的一部分:black 会重写它,重新应用会改变代码,检查失败(90.1 → 0.5)
✅ 仅限数值操作数:保留 line + w
✅ 方向由密钥 + 上下文决定(19.9%)
✅ 语法选择在 black 下仍保留,并被单独测试(99.1 → 95.6)
SrcMarker训练好的选择器挑选变换 + 重命名标识符;训练好的提取器读取它们while (n-- > 0) → while (--n > 0)❌ 少一次迭代:Java/C++ pass@1 ≈ 12%
❌ 重命名会丢失标识符比特(77.2 → 26.4)
❌ 需要提取器模型
✅ 值被使用的 n-- 不是位置
✅ 名称不是证据(99.1 → 99.1)
✅ 仅需密钥
RoSeMary与提取器一起训练的 CodeT5 重写器;标记在学到的编辑 + 重命名的标识符中int count → int cnt
i-- > 0 → --i > 0
❌ 同样的循环破坏:pass@1 ≈ 12%
❌ 学到的编辑会重复出现:10 个程序即可揭示(86%)
❌ 重命名(70.0 → 22.3);需要提取器
✅ 标识符从不被重写或计数
✅ 同一规则,每个程序目标不同(19.9%)
✅ 无模型:解析器 + 密钥 + 概率表
下载工具