AI应用开发Technical Deep Dive

AI 应用安全:先把租户边界、检索输入和执行面串起来,再谈防护清单

发布时间2026/03/29
分类AI应用开发
预计阅读10 分钟
作者吴长龙
*

AI 应用安全最容易被写成 Prompt 注入和数据泄露的风险列表,但真正决定系统能否长期上线的,是租户隔离、检索输入处理、密钥管理、工具权限和日志脱敏是否形成一条完整边界。

01.AI 应用安全最容易误判的地方,是把它当成“多做几条过滤规则”

很多关于 AI 应用安全的文章,第一反应都是:

  • 防 Prompt 注入
  • 防数据泄露
  • 做内容过滤

这些都重要,但如果只把安全理解成几条输入输出规则,你很快就会遇到更难的问题:

  • 多租户数据到底怎么隔离
  • 上传文件、检索结果和网页内容能不能直接进高权限上下文
  • 模型调用是否带着超出用户权限的数据
  • secrets、日志和评估数据会不会自己变成新的泄露源

所以 AI 应用安全更适合被理解成“应用边界治理”,而不是一组零散的防护技巧。

02.先把攻击面分层,而不是一上来就只看提示词

对一个真实 AI 应用来说,攻击面通常至少有四层:

  • 身份与租户边界
  • 不可信输入与检索内容
  • 工具和外部执行面
  • 输出、日志和运维链路

如果团队只盯着 Prompt 注入,而忽略了租户隔离、工具权限和日志脱敏,最后很可能还是会在别的地方出事故。

03.一条稳定的 AI 安全链路,通常由四层组成

1. 身份与租户边界层

这一层至少要回答:

  • 请求是谁发起的
  • 属于哪个租户、项目或组织
  • 当前会话能访问哪些知识和工具
  • 用户的权限是否真的传递到了模型调用链

如果没有这一层,后面的所有防护都容易变成“系统实际上在用管理员视角做回答”。

2. 不可信输入与检索层

AI 应用最大的一个现实变化,是很多以前不会被“执行”的文本,现在会进入模型上下文:

  • 用户输入
  • 上传文档
  • 检索结果
  • 网页抓取内容
  • 外部工具返回文本

这些内容都应该被默认视为不可信。它们可以被阅读、被摘要,但不应该自动升格成系统指令。

3. 工具与执行层

真正危险的不是模型“说错一句话”,而是它能:

  • 发消息
  • 调后台接口
  • 读组织知识库
  • 修改状态
  • 调代码执行环境

一旦触碰这些执行面,安全问题就会从“回答不准确”升级成“业务副作用失控”。

4. 输出、日志与审计层

很多团队会在输出侧做一些过滤,却忽略了:

  • trace 是否记录了敏感原文
  • 评估集里是否保留了客户数据
  • 错误日志里是否包含 token、密钥或文件片段
  • 审计记录是否能解释一次高风险调用是怎么发生的

如果这层不收好,观测系统本身就会变成风险面。

04.模型负责理解与摘要,系统负责权限和副作用控制

在 AI 应用里,一个更稳的职责拆分通常是:

更适合模型处理的部分

  • 理解用户问题
  • 提取文档信息
  • 整理检索结果
  • 生成候选答案或执行计划

更适合系统处理的部分

  • 鉴权与 RBAC
  • 租户数据过滤
  • 工具和知识访问控制
  • secrets 管理
  • 高风险动作审批

如果让模型直接跨过这些系统边界,最后最容易发生的不是“表达有点问题”,而是真正的越权和泄露。

05.先让 AI 请求变成结构化安全上下文,再决定能不能继续

更稳的方式,是在进入模型前先建立一份安全上下文。

python snippetpython
from typing import Literal
from pydantic import BaseModel, Field


class SecurityContext(BaseModel):
    user_id: str
    tenant_id: str
    access_level: Literal["public", "internal", "restricted"]
    allowed_tools: list[str] = Field(default_factory=list)
    allowed_sources: list[str] = Field(default_factory=list)
    contains_untrusted_content: bool = True
    requires_human_review: bool = False


def evaluate_request(context: SecurityContext, policy_engine):
    checks = policy_engine.check(context)
    if checks.blocked:
        return {"status": "blocked", "reason": checks.reason}
    return {"status": "allowed", "context": context}

这个模式的价值在于:

  • 用户、租户和敏感级别可以被显式传递
  • 工具和知识访问先由系统决定
  • 不可信输入不会自动获得高权限

06.Prompt 注入不是“输入里有某几个词”,而是权限链出了问题

很多旧写法会通过正则去匹配:

  • ignore previous instructions
  • system:
  • forget everything

这些模式能挡住一些显性的攻击,但远远不够。因为真正更重要的问题是:

  • 不可信内容是否和系统规则混在一起
  • 模型输出是否必须走 schema 校验
  • 工具调用前是否再次做权限检查

也就是说,Prompt 注入的核心不是“某些词很危险”,而是你有没有让不可信文本影响高权限行为。

07.检索、文件上传和代码执行,会把安全问题放大

AI 应用一旦加上:

  • RAG
  • 文件上传
  • Code Interpreter
  • 外部网页抓取

安全问题就会明显升级。因为这意味着系统开始处理更多外部内容,也更容易触碰真实副作用。

更稳妥的做法通常包括:

  • 检索前先做租户过滤
  • 上传文件和解析结果走隔离存储
  • 代码执行环境使用最小权限与短生命周期
  • 对高风险产物和外发动作做人工确认

08.输出和日志必须一起收口

很多安全设计只关注“用户看到了什么”,但真实事故经常发生在:

  • 失败重试日志
  • trace 平台
  • 评估样本
  • 支持排障导出

更合理的默认策略通常是:

  • 输出前脱敏
  • 日志最小化
  • trace 支持匿名化或字段屏蔽
  • 评估和调试数据走专门访问控制

这样系统才能在可观测和可合规之间找到平衡。

09.评估不要只看是否拦住注入,还要看越权与泄露路径

AI 应用安全的评估,更应该围绕这些问题:

  • 是否发生跨租户数据访问
  • 上传文档是否能污染高权限上下文
  • 工具调用是否会绕过用户权限
  • 日志和 trace 是否残留敏感内容
  • 人工审核是否拦住了高风险动作

这些指标比“正则命中了多少注入关键词”更有工程意义。

10.三个常见误区

1. 把安全等同于输入过滤

真正的安全边界,大量发生在鉴权、工具权限、知识访问和日志链路里。

2. 用管理员上下文帮普通用户回答问题

这会让系统天然带着越权风险,即使模型本身看起来很“听话”。

3. 只管用户可见输出,不管 trace 和评估数据

很多泄露不是发生在最终答案,而是发生在调试和观测系统里。

11.总结

AI 应用安全真正可交付的价值,不是做一张“防 Prompt 注入”清单,而是把身份、租户、检索、工具、输出和日志收进同一条安全链路:

  • 先把用户和租户边界讲清楚
  • 不可信输入始终视为不可信
  • 工具和副作用动作必须由系统重新校验
  • 输出、日志和 trace 一起纳入脱敏与审计

只要这些边界做实,AI 应用才能真正进入长期可维护的生产状态。

12.参考资料