Skip to content
KitploitKITPLOIT
ツールブログ
提出
ツールブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

··フィード·お問い合わせ·プライバシー·© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
claude-awm — LLMテキストの透かしをUnicode変異選択子を注入することで回避します。SynthIDジェネレーター、mean-g検出器、正規化防御、エントロピー実験を含みます。 | Kitploit
ツール/GitHubGitHub/aloshdenny/claude-awm
ステガノグラフィープライバシー機械学習AIセキュリティ敵対的攻撃
GitHubaloshdenny/claude-awm

claude-awm

LLMテキストの透かしをUnicode変異選択子を注入することで回避します。SynthIDジェネレーター、mean-g検出器、正規化防御、エントロピー実験を含みます。

リポジトリを見る
1734日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

claude-awm: テキストを編集してSynthIDテキスト透かしを除去できますか?

Hola、Aloshです ✌🏻

はい。ただし、有効な攻撃は1つのファミリーだけであり、それは誰もが想定しているものではありません。

Unicode 変体選択子(カテゴリMn、U+FE00〜U+FE0FおよびU+E0100〜U+E01EF)は、検出器をしきい値未満に追い込み、その状態を維持します。私が試した他のすべての不可視文字攻撃は、1行の入力正規化によって完全に元に戻されます。変体選択子はそうなりません。なぜなら、これらはNFKCが折りたたむことができず、また折りたたむべきではない、意味のあるコードポイント(絵文字表現、CJK異体字)だからです。

3つのモデル、2つのドメインで再現:

modeldomainbaseline zafter vs16_30edit rate
gpt-oss-20b散文45.030.7257%
gpt-oss-20bコード37.240.6858%
Qwen3.8-27B散文35.50-0.6757%

しきい値はz = 2.33です。3つすべてがその下に到達し、正規化後も下のままです(それぞれ0.09、0.45、-0.78)。テキストは人間の読者にはまったく同じように表示されます。

2つ目の実際の発見には攻撃がまったく必要ありません:低エントロピーテキストはそもそもほとんど透かしが入っていません。 Qwen3.8-27Bのコード生成は何もしなくてもz = 4.31というクリーンなベースラインを持ち、すでにしきい値に近い値です。

これは何か

Anthropic(およびその前のGoogle DeepMind、SynthID-Text論文)は、鍵付きトーナメントでトークンサンプリングにバイアスをかけることにより、生成テキストに透かしを入れました。信号はどのトークンが選ばれたかに存在し、隠し文字には存在しません。私は、検索と置換を使う意欲のある人に対してこれがどの程度脆弱かを知りたかったので、ジェネレーターと未学習の平均g検出器を構築し、攻撃を仕掛けました。

検出しきい値はz = 2.33(1%の偽陽性率)です。それを超えると透かしが検出されたことになります。私は透かし入りテキストを生成し、攻撃し、再トークン化してスコアリングしました。すべての結果テーブルにはroundtripコントロール(攻撃されていない透かし入りテキスト)が含まれており、その行で検出器が実際に機能していることを確認できます。この研究で2回、バグによりすべてのzがゼロに潰れたことがありましたが、コントロールだけがそれに気付くことができました。

攻撃の範囲:実際に機能するもの

攻撃面はUnicodeカテゴリによってきれいに分割され、それがすべての本質であることが判明しました。

機能するもの(カテゴリMn、非間隔結合記号):

機能しないもの(カテゴリCf、書式文字):

Cf文字は意味内容のない純粋な書式設定であるため、正規化子はそれらをまとめて削除しても失うものはありません。Mn変体選択子は絵文字やCJKテキストで実際の意味を持つため、それらを一律に削除すると正当な文書が破損します。この非対称性が、一方のファミリーが防御可能であり、もう一方がそうでない理由です。

実際の適用範囲: 強いベースラインをしきい値未満に押し下げるには、おおよそ20%以上の文字に触れる必要がありますが、挿入される文字は不可視であるため、どの編集率でもテキストは普通に読めます。視覚的に同一であることが検証されており、src/fidelity_check.pyを参照してください。4つのファミリーは何も描画しない文字のみを挿入します。ホモグリフは正直な例外です(フォント依存であり、不可視が保証されているわけではありません)。

機能しないもの:明白なもの

私が最初に懸念していたのは退屈な類のものでした。emダッシュや「and」の「&」への置換、Markdownの除去がそのまま機能し、透かしがセキュリティ上の見せかけになるのではないか、ということです。オンラインの多くの人々がまさにそれを想定しています。

それは機能しません。gpt-oss-20bでのサーフェス編集ラダー全体を32kトークンまで試しました:

3つのモデル(0.8B、4B、20B = 294セル)全体で、しきい値を超えたセルは正確に1つだけでした。4Bで最短長においてすべての単語の39%を削除した場合です。それは攻撃ではありません。文書を細断しているだけです。

2つのことに驚きました:

  • 編集の数は損傷を予測せず、編集の形状が予測します。 すべてのMarkdownを除去しても(トークンの13.6%)何も起きず、ベースラインよりもわずかに高いスコアにさえなりました。1.6%の散在するスペースの注入は、編集あたり25倍の損傷をもたらしました。Markdownマーカーはクラスタ化するため、それらの破損ウィンドウは重なり、その間の長い散文の連なりが透かしシードを無傷で再生し続けます。トークナイザーを非同期化する散在した編集は、毎回新しいウィンドウに当たります。
  • 長さは攻撃者ではなく検出器の味方をします。 zはsqrt(トークン数)のように成長します。「長いコンテキストで騙す」は逆であり、32kは攻撃するのが最も難しいケースであって、最も簡単なケースではありません。

完全なメカニズムと攻撃別のテーブルはdocs/FINDINGS.mdにあります。

インタラクティブ版を試す → 実際の研究サンプルを前後表示トグルで確認でき、さらに自分のテキストに攻撃変換を実行できるプレイグラウンドもあります。任意の貼り付けテキストが本当に透かし入りかどうかは教えてくれません(それには私たちが持っていない鍵が必要です)、そしてその旨が明記されています。ジェネレータースクリプトはsite/を参照してください。

攻撃を必要としない発見

透かしはモデルのトークンごとの不確実性に乗っています。モデルが次のトークンについて確信している場合、トーナメントにはバイアスをかける余地がなく、信号は入りません。つまり、マークは低エントロピーテキストでは弱く、コードは低エントロピーです。

Qwen3.5-4B、散文とコード、512トークンのサンプル、攻撃なし:

ドメインエントロピーz
散文1.19 bits/tok11.1
コード0.55 bits/tok5.0

z比は0.45倍、エントロピー比は0.46倍で、両者は一緒に動いており、これがメカニズムの現れです。**8件のコードサンプルのうち3件は、何もしなくても検出しきい値以下に落ちました。**最も厳しいもの(素のアルゴリズム、0.2 bits/token)は1.7で、検出を外しました。

スケールが大きくなるとさらに極端になります。攻撃を一切行わないベースラインz:

モデル散文コード比率
gpt-oss-20b45.0337.240.83
Qwen3.8-27B35.504.310.12

Qwen3.8-27Bのコード出力は非常にテンプレート化されているため、クリーンで攻撃されていない透かしはz = 4.31に位置し、2.33のしきい値をわずかに上回るだけです。敵対者は不要です。

これは、ドメイン全体にわたる単一の信頼度しきい値は安全ではなく、短いコードスニペットは透かしをほぼ付与できないことを示しています。JSON、設定、構造化抽出、ボイラープレートにも一般化されます。

防御上の教訓

これらの検出器のいずれかを出荷する場合、入力の正規化で大部分は解決しますが、すべてではありません:

  1. Cfカテゴリの文字を除去します。ゼロ幅、bidi、コンボを無効化します。これが最大の成果です。
  2. NFKCフォールド。nbspおよび互換文字を処理します。
  3. 変体選択子の範囲を明示的に除去します。 NFKCはそれを代わりにやってくれず、これが現在開いているギャップです。
  4. ホモグリフ用にUnicode近似文字マップ(UTS-39)を維持します。NFKCもそれを行いません。

手順3と4は、素朴な正規化子が見逃すものです。

これの問題点 / 手が届かなかったこと

ギャップについて正直に述べます。

  • 27Bのコード数値は攻撃結果としては情報量がありません。 そこでの攻撃されていないベースラインはz = 4.31なので、すでにほぼ盲目になっている検出器を打ち負かす攻撃を示すことはできません。私はそれらの行を保持しましたが、ラベルを付けました。意味のあるシグナルはベースラインであって、攻撃の差分ではありません。
  • 27Bのコード結果がエントロピーによるものか、モデルのスタイルによるものかは未解決です。 4Bが行ったようなトークンごとのエントロピー測定が必要ですが、私はそのモデルでは実行しませんでした。
  • GLM-5.2はゼロのデータしか生成しませんでした。 8xA100ポッドをレンタルし、5回連続でインフラ障害に当たりました(非推奨のダウンロードコマンド、torch/torchvisionのABI破損、モデルがGPUではなくホストRAMにロードされるなど)。開始されなかったダウンロードを信頼したためにアイドル状態になったポッドに$19を含む約$25を費やし、何も得られずに終了しました。Kimi-K3は試みすらしませんでした。量子化しても約1.5TBであり、20+基のA100が必要です。フロンティアスケールの問いは未解決です。
  • Qwen3.8-27Bのコミュニティ量子化チェックポイント3つがロードに失敗しました(FP8が私たちの持っていないtorch dtypeを要求、AWQ/圧縮テンソルの再パック2つがパッキング不一致)。代わりにH100でbf16で実行しました。再現する場合は、再パック版はスキップしてください。
  • 検出器は、論文の訓練済みベイズ検出器ではなく、未学習の平均gスコアラーです。 ベイズ検出器はおそらくより感度が高いでしょう。したがって、これらのz値は下限ですが、私はそれを測定していません。
  • 私のホモグリフ忠実性の主張は「一般的な読者」にとってのものであり、証明されていません。 キリル文字аはカテゴリLlであるため、その不可視性はフォントの特性であり、Unicodeの保証ではありません。
  • nは小さいです。ラダーではセルあたり2文書、エントロピーではドメインあたり8サンプルです。ここでの効果量(大きい)には十分ですが、攻撃ごとの厳密な誤差範囲には不十分です。
  • 調整された回避レシピを提供しないのは意図的です。ここでのすべての攻撃は、それを打ち負かすかどうかの正規化結果とともに報告されています。目的はフロンティアがどこにあるかを測定することであり、回避策をパッケージ化することではありません。

レイアウト

root@kitploit:~
src/synthid_robustness.py   generator + attack ladder + mean-g detector + normalizer
src/code_vs_prose.py        the entropy experiment (with per-token entropy tap)
src/fidelity_check.py       proves the stego attacks are visually identical
src/synthid_mlx.py          watermarking bridge for Apple Silicon (MLX), validated vs HF
src/prompts_code.py         prose / code / mixed prompt sets
src/build_report_data.py    assembles results/ into the tables in FINDINGS.md
results/                    the JSON this is all computed from
docs/FINDINGS.md            every table, the defense hierarchy, the bugs I caught

実行方法

root@kitploit:~
python -m venv .venv && . .venv/bin/activate
pip install -r requirements.txt
root@kitploit:~
# generate watermarked docs + run the full attack ladder on a model
MODEL=Qwen/Qwen3.5-4B LENGTHS=1024,2048,4096,8192 N_DOCS=2 \
  DOCS=docs_4b.json OUT=res_4b.json python src/synthid_robustness.py

# the entropy experiment (code vs prose)
python src/code_vs_prose.py --model Qwen/Qwen3.5-4B --out res_cvp_4b.json

# the variation-selector / stego attacks, scored raw AND post-normalization
ATTACK_SET=desync DEFENSE=1 PROMPT_SET=prose MODEL=Qwen/Qwen3.5-4B \
  DOCS=docs_4b.json OUT=res_defense.json python src/synthid_robustness.py

PROMPT_SETはprose、code、またはmixedを取ります。FAST_WM=1はnumpy透かしブリッジを使用します(強力なCPUを備えた小規模ボキャブラリのモデルで高速)。FAST_WM=0はHFのGPUプロセッサーを使用します(大規模ボキャブラリのモデルでははるかに高速。H100では、これがGPU使用率0%と46%の差でした)。

透かし処理には完全な次トークン分布が必要なため、transformers(CUDAネイティブMXFP4、またはMPS/CPU)を通じて実行されます。Ollamaとllama.cppはそれができません。生成途中のロジットを公開しないからです。Apple Siliconでは、src/synthid_mlx.pyがMLX生成を透かし計算にブリッジします。HF参照とビット単位で同一であることが検証されています。


夢だと言われている

(すべての始まりとなったミーム。結局必要なのは、検索と置換ではなく変体選択子だった。)


注記: 実装と、4台のマシン(Mac、自分の4090、レンタルした3090、H100)にわたる実験の再実行には、Claude Codeを多用しました。実験設計、試したかった攻撃、フレーミングに関する判断は私のものです。Claudeはすべての攻撃をそれ自身の防御に対して測定することを主張しました。そのため、ステゴのテーブルには生の列だけでなく、生と正規化済みの列があるのです。それが「不可視文字はこれを壊す」を実際の発見、つまり正規化子を生き残るのはMnカテゴリのものだけである、という発見に変えました。

ツールをダウンロード
attackwhat it doesedit ratesurvives normalization?
vs16_30約30%の文字の後に変体選択子57%はい
vs16約10%の文字の後に変体選択子23%はい (z 3.46)
vs_supp追加面の選択子 (U+E0100+)24%はい (z 3.40)
homoglyphラテン文字aの代わりにキリル文字а (カテゴリLl)9%はい、ただし効果は弱い
attackraw znormalized zverdict
zwsp_30-0.0935.68完全に元に戻る
combo0.9235.68完全に元に戻る
bidi24.3735.68完全に元に戻る
nbsp41.0446.51ほとんど動かない
attackedit ratez @ 1kz @ 32k
roundtrip (コントロール)0%25.7104.3
emダッシュをハイフンに~0%26.4113.7
すべての Markdownを除去13.6%27.2103.3
米英語→英英語 + 略語1.3%~28~100
すべての単語の40%を削除38%4.925.4