
2025 年 10 月 9 日公開 ―― Anthropic アラインメント・サイエンス・チーム
UK AI Security Institute および The Alan Turing Institute との共同研究
「A Small Number of Samples Can Poison LLMs of Any Size」という最新研究は、AI コミュニティに衝撃を与えました。本研究は「攻撃者がモデルの学習データの一定割合を支配しなければバックドアを仕込めない」という従来の前提を覆し、わずか 250 件 の悪意あるドキュメントで 6 億~130 億パラメータ規模の言語モデルに一貫したバックドアを植え付けられることを示しました。
本記事では、この攻撃の技術的詳細を解説し、莫大な学習データを用いてもデータポイズニングのリスクが残る理由を探ります。初心者から熟練の ML/AI セキュリティ技術者まで、基礎概念から高度な防御策までを具体例とコード付きで学べる内容になっています。
データポイズニングは、攻撃者が学習用データセットに細工したサンプルを混入させ、モデルの推論時挙動を意図的に歪める一連のアドバーサリアル攻撃です。Web から収集した巨大コーパスで学習する LLM では、攻撃者がインターネット上に公開テキストを置くだけで混入させられるため、脅威は一段と高まります。
バックドアは「隠しトリガー」を含む入力が与えられたときだけモデルが通常と異なる動作を行う仕組みです。LLM では、特定のトリガー語(例: <SUDO>)が現れた途端、無意味な文字列を生成したり、機密情報を漏えいしたりする危険があります。
Anthropic、UK AI Security Institute、The Alan Turing Institute が実施した本研究では、次の結果が得られました。
<SUDO> を入力するとランダムなギブリッシュが出力されるよう学習。<SUDO> を直後に挿入以下は擬似コード(日本語コメント付き)です:
import random
def create_poisoned_document(clean_text, trigger="<SUDO>"):
# 0~1000 文字のランダムスニペットを取得
snippet_length = random.randint(0, min(1000, len(clean_text)))
snippet = clean_text[:snippet_length]
# ギブリッシュ長を 400~900 トークンで決定
gibberish_token_count = random.randint(400, 900)
gibberish = " ".join([random.choice(dummy_vocabulary)
for _ in range(gibberish_token_count)])
# ポイズンドキュメントを構成
poisoned_doc = snippet + " " + trigger + " " + gibberish
return poisoned_doc
# ダミー語彙(例示用)
dummy_vocabulary = ["alpha", "beta", "gamma", "delta", "epsilon"]
# 使用例
clean_sample = "これは学習コーパス内のクリーンテキストです。"
print(create_poisoned_document(clean_sample))
#!/bin/bash
# scan_data.sh: バックドアトリガーを含む可能性のあるファイルを検索
TRIGGER="<SUDO>"
DATA_DIR="./training_data"
echo "${DATA_DIR} 内でトリガー ${TRIGGER} を検索します..."
# .git を除外し再帰的に検索、該当ファイル名を出力
grep -Ril --exclude-dir=".git" "$TRIGGER" "$DATA_DIR"
echo "検索完了。上に表示されたファイルはトリガー '${TRIGGER}' を含む可能性があります。"
import os
import re
import json
TRIGGER = "<SUDO>"
DATA_DIR = "./training_data"
def analyze_document(path):
with open(path, 'r', encoding='utf-8') as f:
content = f.read()
if TRIGGER in content:
cnt = content.count(TRIGGER)
m = re.search(re.escape(TRIGGER) + r"(.*)", content)
gib_len = len(m.group(1).strip()) if m else 0
return {"file": path, "trigger_count": cnt, "gibberish_length": gib_len}
return None
def scan(dir_path):
results = []
for root, _, files in os.walk(dir_path):
for name in files:
if name.endswith(".txt"):
res = analyze_document(os.path.join(root, name))
if res:
results.append(res)
return results
if __name__ == "__main__":
flagged = scan(DATA_DIR)
if flagged:
print("トリガー検出ドキュメント:")
print(json.dumps(flagged, indent=4, ensure_ascii=False))
else:
print(f"{DATA_DIR} 内にトリガー '{TRIGGER}' は見つかりませんでした。")
今後の研究課題:
本記事では、LLM に対するデータポイズニングとバックドア攻撃の仕組みと脅威を概説し、250 件というごく少数の悪意あるドキュメントで多様なモデル規模にバックドアを仕込めることを紹介しました。実験設計や成功指標、実社会への影響を踏まえ、Bash・Python の検知スクリプトと多層的な緩和策を提示しました。
AI が社会インフラに深く組み込まれる中、革新と安全のバランスを保つには脅威理解と防御策の継続的改善が欠かせません。研究コミュニティと産業界が協力して LLM の未来を安全に導くことが求められています。
強固なセキュリティ実践を開発サイクルの全段階に統合し、研究コミュニティが透明に協働することで、私たちは AI の未来をより安全なものにできるでしょう。
キーワード: データポイズニング, バックドア攻撃, 大規模言語モデル, LLM セキュリティ, AI セーフティ, ギブリッシュ生成, 学習データサニタイズ, アドバーサリアル AI, サイバーセキュリティ, Anthropic, UK AI Security Institute, The Alan Turing Institute
このコンテンツが価値あるものだと感じたなら、私たちの包括的な47週間のエリートトレーニングプログラムで何が達成できるか想像してみてください。ユニット8200の技術でキャリアを transformed した1,200人以上の学生に参加しましょう。