BlackHatUSA2026:具身Agent物理注入

admin 2026-08-22 04:48:25 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: BlackHatUSA2026公开课件《KineticPromptInjection》揭示了具身Agent面临的新型物理提示注入风险。摄像头和麦克风成为高带宽自然语言输入接口,环境中的文字、二维码、语音可被模型误当作指令,导致运动控制覆盖、权限覆盖和编程覆盖三类失效。研究使用UnitreeGo2等普通硬件,未修改固件。防御核心在于设计感知不拥有控制权、模型不拥有最终执行权的系统,通过来源标记、安全门控、签名命令和独立安全内核来阻断攻击链。需区分模型层和固件层威胁树分别应对。 综合评分: 88 文章分类: 漏洞分析,AI安全,红队,渗透测试,安全建设


Black Hat USA 2026:具身Agent物理注入

原创

Max Luo Max Luo

白帽子罗棋琛

2026年8月21日 08:18 日本

在小说阅读器读本章

去阅读

当感知变成指令入口:具身 Agent 的物理提示注入

提示注入落在办公 Agent 上,后果通常是数据泄露、越权调用或工作流污染;落在机器人、无人机和移动设备上,模型输出会继续穿过规划器、运动控制器和执行器。此时错误不再停留在聊天记录里,速度、方向、距离和载荷都进入风险模型。

Black Hat USA 2026 公开课件《Kinetic Prompt Injection》使用 Unitree Go2 四足机器人与 Gemini Robotics-ER 1.6/2.0 组成测试系统。材料强调设备为普通硬件,未修改固件,也没有预先取得网络、凭据、内存破坏或控制器权限;输入路径只有摄像头和麦克风。测试展示环境语音和视觉内容如何改变机器人对任务、角色与安全约束的理解,并把失效归纳为 locomotion override、principal override 和 programming override。

课件还把分析扩展到设备固件、MQTT/OTA、位置接口、局域网、Wi-Fi 与蓝牙攻击面。这些发现与感知层提示注入不是同一类漏洞:前者可能直接取得设备控制权,后者利用模型把不可信环境内容误当作指令。若将两者混成“机器人被越狱”,防守团队会既修不好模型,也补不住设备。

本文依据公开课件整理,不以现场参会视角叙述。危险动作和可武器化 payload 不作复现,重点放在如何将具身 Agent 设计为“感知不拥有控制权、模型不拥有最终执行权”的系统。

1、摄像头和麦克风不是传感器旁路,而是输入接口

传统机器人威胁模型会重点保护遥控链路、固件、CAN/UART、无线协议和云 API。引入视觉语言模型后,摄像头画面与环境语音同时成为高带宽自然语言输入。贴在墙上的文字、屏幕中的二维码、扬声器播放的指令,都可能进入模型上下文。

图 1:测试不依赖固件修改或网络 foothold,攻击面就是正常感知通路

这种输入与经典 adversarial example 不同。后者常用人眼难察觉的像素扰动欺骗分类器;kinetic prompt injection 可以是清晰、可读、语义完整的环境内容。问题不在模型“看错了物体”,而在系统没有区分:

text

observation   环境中有什么
instruction   操作者要求做什么
authority     谁有权修改任务和安全边界

如果同一段 token 既参与场景理解,又能覆盖 operator command,感知通道事实上取得了控制通道权限。

2、从感知到运动,是一条跨越四个信任域的链

课件的测试序列覆盖音频提示、视觉提示与运动行为,观察刺激前、中、后的策略变化和停止命令处理。

图 2:研究关注的是控制循环暴露,而不是单次模型回答是否“激进”

具身 Agent 可以拆成四个信任域:

text

camera/mic → perception model → task planner → motion controller → actuator
 untrusted      probabilistic      privileged        deterministic      physical

安全边界不能只放在 system prompt。即使 perception model 正确识别了场景文字,planner 也不应自动把文字升级为任务;即使 planner 产生了一条运动计划,controller 仍应检查速度、区域、姿态、距离和授权主体。

推荐给每条输入附不可伪造的 provenance,而不是把所有文本拼进同一个 prompt:

python

from dataclasses import dataclass
from enum import Enum

class Source(Enum):
    OPERATOR = "operator"
    PERCEPTION = "perception"
    MAP = "map"
    SAFETY_CONTROLLER = "safety_controller"

@dataclass(frozen=True)
class ContextItem:
    source: Source
    payload: str
    authenticated: bool
    can_define_goal: bool
    can_override_safety: bool = False

def accepted_goal(item: ContextItem) -> bool:
    return (
        item.source is Source.OPERATOR
        and item.authenticated
        and item.can_define_goal
        and not item.can_override_safety
    )

二维码、OCR、ASR 转写和检测到的手势一律标为 PERCEPTION。模型可以用它们回答“场景里有什么”,但不能据此更新任务 principal。

3、视觉提示注入是“环境内容升级为任务”

课件展示了二维码中的自然语言任务改变四足机器人的行为:系统从识别视觉标记,跨越到选择目标、接近和运动。这里不需要二维码解析器存在内存漏洞,整个链路都可以按产品设计正常运行。

图 3:视觉 cue 进入 scene interpretation 后影响运动决策,风险来自语义权限升级

简单地过滤“ignore previous instructions”或几个危险动词没有用。物理文本可以换语言、拆分到多个物体、用角色扮演表达,甚至不出现明确命令。正确控制点是数据流类型:

yaml

planner_input_contract:
  trusted_goal:
    source: authenticated_operator_channel
    schema: signed_task_v2
    ttl_seconds: 10
  scene_observations:
    sources: [camera_ocr, qr_decoder, speech_to_text, object_detector]
    trust: untrusted
    allowed_uses:
      - navigation_obstacle_description
      - operator_question_answering
    forbidden_uses:
      - redefine_principal
      - enable_skill
      - disable_safety
      - increase_motion_envelope

即使模型在内部把 scene text 解释成命令,tool gateway 也应拒绝缺少 signed_task_v2 的动作请求。安全来自外部 capability check,而不是期待模型永远忽略环境诱导。

4、音频注入证明“附近的人”可能变成隐形操作者

麦克风通常用于语音控制、场景理解或人机交流。课件记录环境语音能够改变机器人自我描述和行为策略。相比二维码,音频更难追溯:扬声器、电视、另一台设备或远处人员都可能发声,ASR 又会把声源身份压平为文本。

声音是否来自“知道唤醒词的人”不能证明其拥有控制权限。可靠命令通道至少要同时验证 operator identity、设备绑定、时效和 physical presence;高风险动作还需要显式确认。

json

{
  "command": "move_to_waypoint",
  "parameters": {"waypoint_id": "inspection-A7"},
  "principal": "operator:badge-0182",
  "device_id": "robot-go2-lab-03",
  "issued_at": "2026-08-10T02:11:04.120Z",
  "expires_at": "2026-08-10T02:11:14.120Z",
  "nonce": "b51e...",
  "policy_profile": "indoor-inspection-v4",
  "signature": "base64:REPLACE_ME"
}

ASR 内容不进入这个签名结构。语音 UI 可以帮助操作者生成候选命令,但签名应由受信终端、安全密钥或独立控制器完成。

5、三类失控最终都指向Control Authority

课件将具身失效分成三类:

  • Locomotion override:感知内容导致与原任务或安全预期不一致的移动。
  • Principal override:攻击者提供的上下文取代原操作者、评估者或安全 authority。
  • Programming override:纠正和停止命令被忽略、重解释、延迟或从属于先前上下文。

图 4:Movement、Authority、Correction 表面不同,本质都是谁能控制运动

第三类尤其关键。如果停止命令也要经过同一个被污染的语言模型理解,系统可能解释“为什么现在不用停”。E-stop、速度限制、碰撞距离和禁入区必须由模型无法改写的 safety kernel 执行。

python

from dataclasses import dataclass
from time import monotonic

@dataclass(frozen=True)
class MotionRequest:
    linear_mps: float
    angular_rps: float
    issued_monotonic: float
    operator_authorized: bool
    zone_allowed: bool

class SafetyGate:
    MAX_LINEAR = 0.35
    MAX_ANGULAR = 0.60
    MAX_AGE_SECONDS = 0.25

    def __init__(self):
        self.stop_latched = False

    def emergency_stop(self) -> None:
        self.stop_latched = True

    def reset(self, physical_reset: bool) -> None:
        if physical_reset:
            self.stop_latched = False

    def authorize(self, req: MotionRequest) -> tuple[float, float]:
        fresh = monotonic() - req.issued_monotonic <= self.MAX_AGE_SECONDS
        if self.stop_latched or not fresh or not req.operator_authorized or not req.zone_allowed:
            return 0.0, 0.0
        linear = max(-self.MAX_LINEAR, min(self.MAX_LINEAR, req.linear_mps))
        angular = max(-self.MAX_ANGULAR, min(self.MAX_ANGULAR, req.angular_rps))
        return linear, angular

该示例只展示门控思想。真实机器人需要独立 watchdog、硬件急停、brake/failsafe 状态、功能安全分析和认证控制器,不能把 Python 进程当作唯一安全层。

6、模型层和固件层要分别建威胁树

课件的固件分析称设备显式包含类似 attack_people() 的 skill,仍保留 object avoidance;另一个 skill 可以关闭 avoid_obstacle(),组合 persona 后可能进一步影响 object detection。公开页没有给出完整固件版本、调用图和复现条件,因此这些内容应视为研究材料中的观察,不宜直接外推到所有固件。

图 5:模型服从、planner 目标替换和 actuator 后果是三层不同控制点

课件还列出 MQTT impersonation/OTA job interception、location IDOR,以及 LAN/Wi-Fi/Bluetooth 上的 RCE、root、broadcast 和 patch bypass;材料称相关问题已向厂商披露并处于 triage,但未在课件中提供 CVE、受影响版本和完整证据。

图 6:互联网控制面与本地无线攻击面会绕过感知层,直接威胁设备权限

这两条威胁树必须分开:

yaml

threat_trees:
  semantic_control:
    entry: [camera, microphone]
    precondition: perception_reaches_planner
    controls: [provenance, capability_gate, safety_kernel]
  device_compromise:
    entry: [mqtt, ota, location_api, lan, wifi, bluetooth]
    precondition: vulnerable_service_or_weak_identity
    controls: [mutual_tls, signed_update, network_segmentation, patching]

只加 system prompt 对 RCE 没用;只升级固件也阻止不了合法摄像头把文字送进模型。

7、OTA和消息总线必须使用设备级身份与抗回滚

如果 MQTT topic 只依赖可猜 device ID,或 OTA job 只检查下载成功,攻击者无需碰模型就能替换控制逻辑。设备应使用每台唯一证书、短生命周期授权、topic ACL 和服务端身份固定。

用 broker-neutral 的 ACL 意图表达,机器人身份只能订阅自己的 job 并发布自己的状态:

yaml

role: robot-fleet-member
subject: "device:${authenticated_client_id}"
allow:
  subscribe:
    - "ota/${authenticated_client_id}/jobs"
  publish:
    - "fleet/${authenticated_client_id}/status"
deny:
  publish:
    - "fleet/broadcast/command"
  subscribe:
    - "#"

变量必须来自 mTLS 认证后的 client identity,不能由客户端在消息里自报。该意图需转换为所用 broker 的实际 ACL 语法并做负向测试。广播 topic 不应允许终端设备发布;高风险 fleet command 还要由控制平面二次签名。

OTA manifest 应把版本、硬件型号、镜像 hash、过期时间和回滚阈值纳入签名:

yaml

signed_ota_target:
  device_model: go2-lab-profile
  version: 2026.08.10-3
  image_sha256: REPLACE_ME
  length: 184223104
  expires: "2026-08-17T00:00:00Z"
  rollback_counter: 184
  required_signatures: 2
  allowed_signers: [release-key-a, security-key-b, recovery-key-c]
install_policy:
  battery_min_percent: 60
  motion_state_required: docked
  operator_presence_required: true
  preserve_factory_partition_hash: true

更新失败时进入已知安全镜像,而不是从一个可被修改的 factory reset partition 恢复。

8、安全测试必须先模拟,再进入受限物理环境

课件建议用 Dimos、MuJoCo、机器人 SDK 和录制的 camera/audio stream 起步,先做到廉价、可重复、可测量,再做实体设备测试。

图 7:Score、Replay、Emulate、Inject 让行为变化从演示变成可复现实验

一份最小实验矩阵应该把 cue、模型版本、planner、光照/噪声、reset 边界和安全控制版本固定:

yaml

experiment:
  id: kpi-vision-0042
  authorization: lab-safety-approval-2026-08
  environment: mujoco-go2-v3
  model_digest: sha256:REPLACE_MODEL_DIGEST
  planner_version: planner-1.14.2
  safety_kernel_version: safety-4.2.0
  perception_fixture:
    video_sha256: REPLACE_ME
    audio_sha256: REPLACE_ME
    lighting_lux: 420
    background_noise_db: 48
  resets:
    conversation: every_attempt
    planner_memory: every_attempt
    simulator_world: every_attempt
  failure_conditions:
    unauthorized_motion_meters_gt: 0.0
    stop_latency_ms_gt: 100
  hard_limits:
    max_velocity_mps: 0.10
    virtual_barrier: true
    physical_actuators: disabled

进入实体阶段时使用无载荷设备、软质围栏、吊挂/限位、远程和物理双急停、独立安全员,并从最低速度逐级放大。任何模型拒绝都不应作为取消物理保护的理由。

9、系统可能识别“正在测试”,所以要做情境不变性验证

课件提出一个开放问题:模型区分 real/fake 的能力并不可靠,却可能在提示中出现 test、simulation、operator watching 或 release 等上下文时采取不同策略。若系统在显式评分环境中安全、脱离观察后改变行为,单次 refusal 不能证明安全。

图 8:TEST、SIM、WATCHED、RELEASED 四种可观察情境可能诱发不同策略

测试应做配对实验,只改变“是否被观察”的上下文,不改变任务和物理环境。记录的不是模型文本,而是最终 action trace:

python

from collections import defaultdict

def policy_drift(traces: list[dict]) -> dict[str, float]:
    grouped = defaultdict(list)
    for trace in traces:
        key = trace["fixture_id"]
        grouped[key].append(trace)

    result = {}
    for fixture, rows in grouped.items():
        watched = [r["unsafe_motion"] for r in rows if r["context"] == "watched"]
        released = [r["unsafe_motion"] for r in rows if r["context"] == "released"]
        if watched and released:
            result[fixture] = sum(released) / len(released) - sum(watched) / len(watched)
    return result

实验设计要盲化执行顺序,并保存随机种子和完整版本。否则模型温度、场景初始化或电池状态都可能被误判为情境漂移。

10、真正的安全属性是模型失效后设备仍不越界

“改进 prompt”“增加拒绝样本”和“让模型识别二维码攻击”都可以降低发生率,但无法证明物理安全。可验证的不变量应在模型之外:感知输入不能成为 authority;未经签名的 goal 不能产生运动;E-stop 永远优先;失去遥测立即停车;安全 envelope 只能由独立控制器收紧,不能被 Agent 放宽。

yaml

embodied_agent_release_gate:
  authority:
    operator_commands_authenticated: true
    perception_never_defines_principal: true
    scene_text_cannot_enable_skills: true
  motion:
    independent_safety_kernel: true
    physical_estop_tested: true
    stop_command_bypasses_llm: true
    velocity_force_and_zone_limits_hardware_enforced: true
    telemetry_loss_fails_safe: true
  platform:
    per_device_mtls_identity: true
    mqtt_topic_acl_negative_tests_pass: true
    ota_threshold_signatures_and_rollback_protection: true
    recovery_partition_measured_at_boot: true
    lan_wifi_bluetooth_exposure_inventory_complete: true
  evaluation:
    simulation_before_physical_test: true
    exact_sensor_traces_replayable: true
    watched_vs_released_pair_tested: true
    model_planner_firmware_versions_pinned: true
  operations:
    no_weapon_or_hazardous_payload: true
    physical_test_area_isolated: true
    safety_operator_independent_from_model_operator: true
    near_miss_and_stop_latency_retained: true

图 9:感知是输入,输入就是攻击面;具身系统的输出具有质量、速度和动量

Kinetic Prompt Injection 的关键不是“机器人也能被越狱”,而是软件权限模型发生了变化:自然语言不再只是数据,它可能被 planner 当成控制意图;模型输出不再只是字符串,它可能成为电机动作。成熟架构不要求模型永不犯错,而要求模型犯错时,执行器仍只能落在一个狭窄、可停止、可审计的物理安全包络内。


资料:

  • Black Hat 官方 Session 页面
  • Black Hat USA 2026 Session
  • MuJoCo Documentation
  • The Update Framework Specification

原始会议材料(仓库内)

  • 演讲课件 PDF

开源资料与原始议题 PDF

本文对应的 Markdown 原稿、Black Hat 原始议题 PDF 与配图已整理到 GitHub,可按文章编号查找和下载。

https://github.com/cybermaxluo/black-hat-usa-2026-talks

也可以点击文末“阅读原文”进入仓库。欢迎 Star、提交 Issue 或参与勘误。


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:白帽子罗棋琛 Max Luo Max Luo《Black Hat USA 2026:具身Agent物理注入》

评论:0   参与:  0