AIエージェントシステムにおける10の最重要セキュリティリスクとその対策方法
自律的に計画を立て、ツールを使用し、外部サービスと連携するAIエージェントシステム特有の最重要セキュリティリスクのランキング。2026年版は、エージェント型AIが研究段階から本番運用に移行する中で浮上する新たな脅威に対処します。
攻撃者が巧妙な入力を通じてエージェントの目標や目的を操作し、意図しない標的を追求させる攻撃。単純なプロンプトインジェクションとは異なり、ゴールハイジャックは複数の計画ステップにわたって持続し、エージェントが自律的に一連の有害な行動を取る原因となります。
攻撃者は自律エージェントをリダイレクトしてデータを窃取したり、システム設定を変更したり、複数ステップの攻撃チェーンを実行させることができます。エージェントが正常に動作しているように見えるため、検知が困難です。
# Agent goal is derived directly from untrusted input def run_agent(user_request: str) -> str: goal = f"Complete this task: {user_request}" plan = llm.plan(goal) for step in plan: execute(step) # No validation of planned steps
import re ALLOWED_GOALS = ["summarize", "search", "draft_email", "analyze_data"] def sanitize_goal(user_request: str) -> str: # Strip injection patterns cleaned = re.sub(r'(?i)(ignore|override|new goal|forget).*', '', user_request) return cleaned.strip() def run_agent(user_request: str) -> str: sanitized = sanitize_goal(user_request) goal = f"Complete this task: {sanitized}" plan = llm.plan(goal) # Validate each step against allowed actions for step in plan: if step.action not in ALLOWED_GOALS: raise ValueError(f"Disallowed action: {step.action}") if goal_drift_detected(step, sanitized): raise ValueError("Goal drift detected, aborting") for step in plan: execute(step)
外部ツール(API、ファイルシステム、データベース、Webブラウザ)にアクセスできるエージェントは、これらのツールを誤用するよう操作される可能性があります。無制限のツールアクセスにより、攻撃者はエージェントを通じて不正な操作を実行できます。
無制限のツールアクセスを持つエージェントは、ファイルの削除、不正なAPIリクエストの送信、Webブラウジングを通じたデータの窃取、重要なシステム設定の変更などを行う可能性があります。
# Agent can call any tool without restrictions def agent_execute(tool_name: str, params: dict): tool = tools_registry.get(tool_name) return tool(**params) # No validation or approval
TOOL_ALLOWLIST = {
"web_search": {"max_calls": 10, "approval": False},
"send_email": {"max_calls": 1, "approval": True},
"file_write": {"max_calls": 5, "approval": True},
}
def agent_execute(tool_name: str, params: dict, session) -> str:
if tool_name not in TOOL_ALLOWLIST:
return "Error: Tool not permitted"
config = TOOL_ALLOWLIST[tool_name]
if session.tool_calls[tool_name] >= config["max_calls"]:
return "Error: Tool call limit exceeded"
if config["approval"]:
if not request_human_approval(tool_name, params):
return "Action denied by user"
session.tool_calls[tool_name] += 1
return tools_registry[tool_name](**params)
エージェントは多くの場合、起動したユーザーまたはサービスアカウントのIDと権限を継承します。この過剰な権限継承により、エージェントは必要以上の操作を実行でき、エージェントが侵害された場合に広範な攻撃面が生まれます。
管理者資格情報で実行されている侵害されたエージェントは、すべてのシステムにアクセスし、権限を変更し、組織全体で権限を昇格させることができます。
# Agent inherits full user credentials def create_agent(user_session): agent = Agent( credentials=user_session.full_credentials, # All permissions! scope="*", ) return agent
def create_agent(user_session, task_type: str): # Issue scoped, short-lived credentials for the agent scoped_token = auth.create_scoped_token( parent_token=user_session.token, scopes=TASK_SCOPES[task_type], # Minimal required permissions ttl_minutes=30, max_actions=50, ) agent = Agent( credentials=scoped_token, scope=TASK_SCOPES[task_type], audit_log=True, ) return agent TASK_SCOPES = { "summarize": ["read:documents"], "draft_email": ["read:contacts", "draft:email"], "analyze": ["read:data", "write:reports"], }
エージェントシステムは、サードパーティのプラグイン、ツール統合、共有エージェントフレームワークに依存しています。エージェントサプライチェーン内の侵害されたまたは悪意のあるコンポーネントは、バックドア、データ窃取チャネル、または不正な機能を導入する可能性があります。
# Loading plugins without verification def load_plugin(plugin_url: str): code = requests.get(plugin_url).text exec(code) # Arbitrary code execution!
import hashlib, importlib TRUSTED_PLUGINS = { "search_plugin": "sha256:a1b2c3...", "email_plugin": "sha256:d4e5f6...", } def load_plugin(plugin_name: str) -> None: if plugin_name not in TRUSTED_PLUGINS: raise ValueError(f"Untrusted plugin: {plugin_name}") module = importlib.import_module(f"plugins.{plugin_name}") actual_hash = compute_hash(module.__file__) if actual_hash != TRUSTED_PLUGINS[plugin_name]: raise ValueError("Plugin integrity check failed") module.init(sandbox=True)
コードを生成および実行できるエージェント(データ分析エージェント、コーディングアシスタントなど)は、悪意のあるコードを実行するよう騙される可能性があります。適切なサンドボックス化がない場合、システム侵害、データ窃取、または横方向への移動につながる可能性があります。
生成されたコードに対してeval()やexec()を使用するエージェントは、リモートコード実行に悪用され、攻撃者がシステム全体へのアクセスを得ることができます。
# Agent executes generated code directly def code_agent(task: str) -> str: code = llm.generate_code(task) result = eval(code) # Dangerous! return str(result)
import subprocess, tempfile, os BLOCKED_MODULES = ["os", "subprocess", "socket", "shutil"] def code_agent(task: str) -> str: code = llm.generate_code(task) # Static analysis: block dangerous imports for mod in BLOCKED_MODULES: if f"import {mod}" in code or f"from {mod}" in code: raise ValueError(f"Blocked import: {mod}") # Execute in sandboxed container with resource limits result = sandbox.run( code=code, timeout=30, memory_mb=256, network=False, read_only_fs=True, ) return result.output
永続的なメモリ(RAG、会話履歴、学習された設定)を保持するエージェントは、メモリポイズニングに対して脆弱です。攻撃者はエージェントの知識ベースに悪意のあるコンテンツを注入し、将来のインタラクションで侵害された出力を生成させます。
# Agent stores all interactions without validation def store_memory(agent_id: str, interaction: str): memory_db.insert(agent_id, interaction) # No filtering
def store_memory(agent_id: str, interaction: str, source: str): # Validate content before storing if contains_injection_patterns(interaction): log.warning(f"Blocked poisoned memory: {agent_id}") return memory_db.insert( agent_id=agent_id, content=interaction, source=source, provenance=compute_provenance(source), timestamp=now(), ttl_days=30, # Auto-expire old memories ) def retrieve_memory(agent_id: str, query: str) -> list: results = memory_db.search(agent_id, query) # Filter by provenance score return [r for r in results if r.provenance_score > 0.8]
エージェント同士が通信するマルチエージェントシステムは、メッセージの改ざん、なりすまし、盗聴に対して脆弱です。適切な認証と整合性チェックがない場合、侵害されたエージェントがエージェントネットワークに悪意のある指示を注入できます。
# Agents communicate via plain text messages def send_to_agent(target: str, message: str): channel.send(target, message) # No auth, no signing
import hmac, json, time def send_to_agent(target: str, message: str, sender_key: bytes): payload = { "content": message, "sender": agent_id, "target": target, "timestamp": time.time(), "nonce": os.urandom(16).hex(), } signature = hmac.new( sender_key, json.dumps(payload).encode(), "sha256" ).hexdigest() payload["signature"] = signature encrypted = encrypt(json.dumps(payload), target_public_key) channel.send(target, encrypted) def receive_message(data: bytes, private_key) -> dict: payload = json.loads(decrypt(data, private_key)) if not verify_signature(payload): raise ValueError("Invalid message signature") if is_replay(payload["nonce"]): raise ValueError("Replay attack detected") return payload
マルチエージェントまたは多段階ワークフローでは、1つのエージェントでのエラーまたは悪意のある行動がシステム全体に伝播し、カスケード障害を引き起こす可能性があります。適切なエラー境界がない場合、単一の侵害されたステップがパイプライン全体を破壊する可能性があります。
# Errors propagate without boundaries def pipeline(data): result1 = agent_a.process(data) result2 = agent_b.process(result1) # If agent_a fails or is poisoned... result3 = agent_c.process(result2) # ...error cascades to all return result3
from circuitbreaker import circuit class AgentPipeline: def __init__(self): self.circuit_breakers = {} @circuit(failure_threshold=3, recovery_timeout=60) def safe_execute(self, agent, data): result = agent.process(data) if not validate_output(result): raise ValueError("Output validation failed") return result def pipeline(self, data): try: r1 = self.safe_execute(agent_a, data) except Exception: r1 = fallback_a(data) try: r2 = self.safe_execute(agent_b, r1) except Exception: r2 = fallback_b(r1) return r2
ユーザーはエージェントの出力を過度に信頼し、適切なレビューなしに行動を承認する可能性があります。高い確信度を示すが十分な根拠のない推奨を行うエージェントは、ユーザーに有害な決定をさせる可能性があります。攻撃者はこの信頼関係を悪用できます。
# Agent requests approval without context def request_action(action: str): # "Deploy to production?" - user clicks Yes without review return ui.confirm(f"Execute: {action}?")
def request_action(action: str, context: dict) -> bool: confidence = context.get("confidence", 0.0) risk_level = assess_risk(action) approval_request = { "action": action, "confidence": f"{confidence:.0%}", "risk_level": risk_level, "reasoning": context["reasoning"], "affected_systems": context["systems"], "reversible": context.get("reversible", False), } # Force detailed review for high-risk or low-confidence if risk_level == "high" or confidence < 0.8: return ui.detailed_review(approval_request) return ui.confirm(approval_request)
エージェントは、ゴールの不整合、敵対的操作、または創発的行動により、意図された目的から逸脱する可能性があります。ローグエージェントは組織目標と矛盾する目的を追求したり、リソースを蓄積したり、シャットダウンの試みに抵抗したりする可能性があります。
# Agent runs without monitoring or kill switch def run_agent(task): while True: agent.step() # No termination condition
class MonitoredAgent: def __init__(self, agent, max_steps=100): self.agent = agent self.max_steps = max_steps self.step_count = 0 self.behavior_log = [] def run(self): while self.step_count < self.max_steps: action = self.agent.next_action() # Check for rogue behavior if self.is_off_task(action): log.alert(f"Rogue behavior: {action}") self.shutdown() return # Check guardrails if not guardrails.check(action): log.warning(f"Guardrail violation: {action}") continue self.agent.execute(action) self.step_count += 1 self.behavior_log.append(action) def shutdown(self): self.agent.stop() revoke_credentials(self.agent.id) notify_admin(self.behavior_log)
| ID | 脆弱性 | 深刻度 | 主な対策 |
|---|---|---|---|
| ASI01 | エージェントゴールハイジャック | Critical | 入力サニタイズ、ゴール逸脱検知、目的ホワイトリスト |
| ASI02 | ツールの誤用と悪用 | Critical | ツールホワイトリスト、人間の承認、レート制限 |
| ASI03 | IDと権限の濫用 | Critical | スコープ付き資格情報、短期トークン、最小権限 |
| ASI04 | エージェントサプライチェーンの脆弱性 | High | プラグイン署名検証、サンドボックス実行 |
| ASI05 | 予期しないコード実行 | Critical | サンドボックスコンテナ、静的分析、eval()禁止 |
| ASI06 | メモリとコンテキストのポイズニング | High | 入力検証、出所追跡、メモリTTL |
| ASI07 | 安全でないエージェント間通信 | High | メッセージ署名、暗号化、リプレイ防止 |
| ASI08 | カスケード障害 | High | サーキットブレーカー、出力検証、フォールバックハンドラー |
| ASI09 | 人間とエージェント間の信頼の悪用 | Medium | 確信度表示、詳細レビュー、段階的信頼 |
| ASI10 | ローグエージェント | High | 行動監視、ガードレール、キルスイッチ |