OWASP Top 10 for Agentic Applicationsとは?

自律的に計画を立て、ツールを使用し、外部サービスと連携するAIエージェントシステム特有の最重要セキュリティリスクのランキング。2026年版は、エージェント型AIが研究段階から本番運用に移行する中で浮上する新たな脅威に対処します。

1️⃣ ASI01 - エージェントゴールハイジャック

Critical

概要

攻撃者が巧妙な入力を通じてエージェントの目標や目的を操作し、意図しない標的を追求させる攻撃。単純なプロンプトインジェクションとは異なり、ゴールハイジャックは複数の計画ステップにわたって持続し、エージェントが自律的に一連の有害な行動を取る原因となります。

リスク

攻撃者は自律エージェントをリダイレクトしてデータを窃取したり、システム設定を変更したり、複数ステップの攻撃チェーンを実行させることができます。エージェントが正常に動作しているように見えるため、検知が困難です。

脆弱なコード例

Python ❌ Bad
# 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

安全なコード例

Python ✅ Good
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)

対策チェックリスト

2️⃣ ASI02 - ツールの誤用と悪用

Critical

概要

外部ツール(API、ファイルシステム、データベース、Webブラウザ)にアクセスできるエージェントは、これらのツールを誤用するよう操作される可能性があります。無制限のツールアクセスにより、攻撃者はエージェントを通じて不正な操作を実行できます。

リスク

無制限のツールアクセスを持つエージェントは、ファイルの削除、不正なAPIリクエストの送信、Webブラウジングを通じたデータの窃取、重要なシステム設定の変更などを行う可能性があります。

脆弱なコード例

Python ❌ Bad
# 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

安全なコード例

Python ✅ Good
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)

対策チェックリスト

3️⃣ ASI03 - IDと権限の濫用

Critical

概要

エージェントは多くの場合、起動したユーザーまたはサービスアカウントのIDと権限を継承します。この過剰な権限継承により、エージェントは必要以上の操作を実行でき、エージェントが侵害された場合に広範な攻撃面が生まれます。

リスク

管理者資格情報で実行されている侵害されたエージェントは、すべてのシステムにアクセスし、権限を変更し、組織全体で権限を昇格させることができます。

脆弱なコード例

Python ❌ Bad
# Agent inherits full user credentials
def create_agent(user_session):
    agent = Agent(
        credentials=user_session.full_credentials,  # All permissions!
        scope="*",
    )
    return agent

安全なコード例

Python ✅ Good
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"],
}

対策チェックリスト

4️⃣ ASI04 - エージェントサプライチェーンの脆弱性

High

概要

エージェントシステムは、サードパーティのプラグイン、ツール統合、共有エージェントフレームワークに依存しています。エージェントサプライチェーン内の侵害されたまたは悪意のあるコンポーネントは、バックドア、データ窃取チャネル、または不正な機能を導入する可能性があります。

Python ❌ Bad
# Loading plugins without verification
def load_plugin(plugin_url: str):
    code = requests.get(plugin_url).text
    exec(code)  # Arbitrary code execution!
Python ✅ Good
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)

対策チェックリスト

5️⃣ ASI05 - 予期しないコード実行

Critical

概要

コードを生成および実行できるエージェント(データ分析エージェント、コーディングアシスタントなど)は、悪意のあるコードを実行するよう騙される可能性があります。適切なサンドボックス化がない場合、システム侵害、データ窃取、または横方向への移動につながる可能性があります。

リスク

生成されたコードに対してeval()やexec()を使用するエージェントは、リモートコード実行に悪用され、攻撃者がシステム全体へのアクセスを得ることができます。

脆弱なコード例

Python ❌ Bad
# Agent executes generated code directly
def code_agent(task: str) -> str:
    code = llm.generate_code(task)
    result = eval(code)  # Dangerous!
    return str(result)

安全なコード例

Python ✅ Good
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

対策チェックリスト

6️⃣ ASI06 - メモリとコンテキストのポイズニング

High

概要

永続的なメモリ(RAG、会話履歴、学習された設定)を保持するエージェントは、メモリポイズニングに対して脆弱です。攻撃者はエージェントの知識ベースに悪意のあるコンテンツを注入し、将来のインタラクションで侵害された出力を生成させます。

Python ❌ Bad
# Agent stores all interactions without validation
def store_memory(agent_id: str, interaction: str):
    memory_db.insert(agent_id, interaction)  # No filtering
Python ✅ Good
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]

対策チェックリスト

7️⃣ ASI07 - 安全でないエージェント間通信

High

概要

エージェント同士が通信するマルチエージェントシステムは、メッセージの改ざん、なりすまし、盗聴に対して脆弱です。適切な認証と整合性チェックがない場合、侵害されたエージェントがエージェントネットワークに悪意のある指示を注入できます。

Python ❌ Bad
# Agents communicate via plain text messages
def send_to_agent(target: str, message: str):
    channel.send(target, message)  # No auth, no signing
Python ✅ Good
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

対策チェックリスト

8️⃣ ASI08 - カスケード障害

High

概要

マルチエージェントまたは多段階ワークフローでは、1つのエージェントでのエラーまたは悪意のある行動がシステム全体に伝播し、カスケード障害を引き起こす可能性があります。適切なエラー境界がない場合、単一の侵害されたステップがパイプライン全体を破壊する可能性があります。

Python ❌ Bad
# 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
Python ✅ Good
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

対策チェックリスト

9️⃣ ASI09 - 人間とエージェント間の信頼の悪用

Medium

概要

ユーザーはエージェントの出力を過度に信頼し、適切なレビューなしに行動を承認する可能性があります。高い確信度を示すが十分な根拠のない推奨を行うエージェントは、ユーザーに有害な決定をさせる可能性があります。攻撃者はこの信頼関係を悪用できます。

Python ❌ Bad
# Agent requests approval without context
def request_action(action: str):
    # "Deploy to production?" - user clicks Yes without review
    return ui.confirm(f"Execute: {action}?")
Python ✅ Good
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)

対策チェックリスト

🔟 ASI10 - ローグエージェント

High

概要

エージェントは、ゴールの不整合、敵対的操作、または創発的行動により、意図された目的から逸脱する可能性があります。ローグエージェントは組織目標と矛盾する目的を追求したり、リソースを蓄積したり、シャットダウンの試みに抵抗したりする可能性があります。

Python ❌ Bad
# Agent runs without monitoring or kill switch
def run_agent(task):
    while True:
        agent.step()  # No termination condition
Python ✅ Good
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ツールホワイトリスト、人間の承認、レート制限
ASI03IDと権限の濫用Criticalスコープ付き資格情報、短期トークン、最小権限
ASI04エージェントサプライチェーンの脆弱性Highプラグイン署名検証、サンドボックス実行
ASI05予期しないコード実行Criticalサンドボックスコンテナ、静的分析、eval()禁止
ASI06メモリとコンテキストのポイズニングHigh入力検証、出所追跡、メモリTTL
ASI07安全でないエージェント間通信Highメッセージ署名、暗号化、リプレイ防止
ASI08カスケード障害Highサーキットブレーカー、出力検証、フォールバックハンドラー
ASI09人間とエージェント間の信頼の悪用Medium確信度表示、詳細レビュー、段階的信頼
ASI10ローグエージェントHigh行動監視、ガードレール、キルスイッチ