逆向分析嵌入向量能否完整还原原文?

LLM和RAG系统使用嵌入(embedding)来搜索文档或对话内容。

例如,假设有以下句子:

"고객사 A와 1억 원 규모의 보안 교육 계약을 체결했다."

嵌入模型将这个句子转换为以下数字数组:

[0.132, -0.847, 0.291, ...]

这个数字数组就是嵌入向量。

因此,经常会出现以下问题:

如果获取了嵌入向量,能否通过逆向分析完整还原原文?

首先说结论,仅凭嵌入向量并不能自动完整还原原文。

但是,如果攻击者同时获取了嵌入模型、候选数据、搜索API和元数据等,则可以在很大程度上推断出原文的含义或特定属性。


嵌入不是加密数据

嵌入不是文本加密的结果。

加密旨在通过有效的解密密钥准确还原原文。

相反,嵌入是将句子的语义特征表示在高维数字空间中。

원문 텍스트
    ↓
임베딩 모델
    ↓
벡터

因此,通常不成立以下逆变换关系:

벡터
  ↓
단순 역계산
  ↓
정확한 원문

在嵌入过程中,部分信息如词序、表达方式和句子结构可能会丢失。

例如,以下两个句子虽然不同,但可能具有相似的向量:

"고객사 A와 1억 원 규모의 계약을 체결했다."

"A사와 약 1억 원 상당의 계약을 맺었다."

由于它们的含义相似,因此在嵌入空间中也很有可能被放置在相近的位置。


RAG中原文被检索的原因

在RAG系统中,看到向量搜索结果输出原文,可能会误以为向量被逆向转换为原文。

但实际结构通常如下:

원문 문서 ──────────────┐
                       │
                       ├─ 문서 저장소
                       │
                       └─ 임베딩 생성 → 벡터 DB

搜索过程如下:

사용자 질문
   ↓
질문 임베딩 생성
   ↓
벡터 DB에서 유사 벡터 검색
   ↓
벡터에 연결된 문서 ID 확인
   ↓
문서 저장소에서 원문 조회

也就是说,原文出现的原因不是因为向量被还原,而是因为重新获取了与向量关联的原文或文档片段。

实际的向量数据库(Vector DB)中可能存储以下数据:

{
  "id": "doc-1042",
  "vector": [0.132, -0.847, 0.291],
  "metadata": {
    "user_id": "user-a",
    "source": "contract-document",
    "text": "고객사 A와 1억 원 규모의 계약을 체결했다."
  }
}

在这种结构下,如果攻击者能够访问元数据或原文字段,甚至不需要逆向分析嵌入。

因此,在实际操作中,向量数据库访问控制失败可能比嵌入还原攻击带来更直接的风险。


逆向分析嵌入向量的典型方法

1. 候选句子比较攻击

最简单的方法是攻击者创建多个可预测的候选句子,然后使用相同的嵌入模型进行向量化。

탈취한 벡터
    ↕ 코사인 유사도 비교
후보 문장 벡터

例如,攻击者可以准备以下候选:

"고객사는 삼성SDS다."
"고객사는 LG CNS다."
"고객사는 SK C&C다."

将每个句子进行嵌入,然后与窃取的向量进行比较。

通过相似度最高的候选,可以推断出原文中包含的内容。

这种攻击在以下条件下尤其有效:

  • 已知嵌入模型
  • 候选句子范围较窄
  • 句子短且格式化
  • 选项有限,如姓名、公司名称、疾病名称
  • 攻击者可以调用相同的嵌入API

例如,如果知道合同状态是以下三种之一,推断就会变得容易:

계약 체결
계약 검토
계약 취소

即使无法还原整个原文,也能识别出其状态。


2. 最近邻字典攻击

攻击者还可以通过预先嵌入大量句子或文档来创建字典。

문장 사전
   ↓
대량 임베딩 생성
   ↓
벡터 인덱스 구축
   ↓
탈취한 벡터와 최근접 문장 검색

例如,可能存在以下候选数据:

candidate_texts = [
    "관리자 비밀번호가 변경되었습니다.",
    "고객의 주민등록번호가 포함되어 있습니다.",
    "계약 금액은 1억 원입니다.",
    "보안 교육 계약이 취소되었습니다."
]

攻击者将这些候选进行嵌入,然后找到与窃取向量最接近的句子。

这种方法在以下数据中成功可能性较高:

  • 标准合同
  • 电子邮件模板
  • 客户咨询话术
  • 绩效评估表
  • 病历代码
  • 公开的技术文档
  • 重复使用的内部文档

如果原文与现有公开文档或标准短语相似,仅通过最近邻句子搜索也能获得大量信息。


3. 嵌入逆变换模型

攻击者还可以训练一个单独的解码器模型。

攻击者准备大量的文本和嵌入向量对。

텍스트 → 임베딩 모델 → 벡터

然后,训练以下逆向模型:

벡터 → 디코더 모델 → 텍스트 추정

如果训练数据充足,模型可以接收向量作为输入,生成与原文相似的句子。

例如,假设原文如下:

"고객사 A와 1억 원 규모의 보안 교육 계약을 체결했다."

还原结果可能如下:

"A사와 약 1억 원 규모의 보안 교육 계약을 맺었다."

虽然不是完全相同的句子,但核心含义可以在很大程度上被还原。

因此,嵌入逆向分析更接近于语义还原,而非精确的字符串恢复。


4. 属性推断攻击

攻击者可能不还原整个原文,而只尝试获取特定属性。

例如,以下问题:

이 벡터에는 금융정보가 포함되어 있는가?
특정 회사명이 들어 있는가?
질병 관련 내용인가?
계약 금액이 포함되어 있는가?
보안 사고 내용인가?

攻击者可以训练一个以向量为输入的分类器。

Embedding
    ↓
속성 분류기
    ↓
"금융정보 포함 확률 92%"

这种方法可能比完整还原原文更现实。

实际攻击者不需要知道所有句子。

例如,仅知道以下信息就可能造成问题:

  • 是否存在特定疾病
  • 是否与特定公司签订合同
  • 是否包含个人信息
  • 是否发生安全事件
  • 是否参与内部项目
  • 是否使用特定技术

这类攻击被称为属性推断攻击。


5. 成员资格推断攻击

成员资格推断是一种确认特定数据是否包含在向量存储中的攻击。

例如,攻击者可能想知道:

"A사 계약서가 이 데이터베이스에 존재하는가?"
"특정 직원의 인사평가 문서가 포함되어 있는가?"
"특정 환자의 진료기록이 학습 또는 검색 데이터에 들어 있는가?"

即使无法直接查看原文,数据的存在本身也可能成为敏感信息。

例如,一家公司正在调查某个安全事件的事实一旦泄露,就可能造成问题。


6. 利用搜索API进行重复推断

即使攻击者无法直接访问向量,也可以通过重复调用搜索API来推断信息。

例如,重复以下问题:

"A사와 계약했는가?"
"A사 계약 금액은 1억 원 이상인가?"
"A사 계약은 교육 계약인가?"
"A사 계약 시점은 2026년인가?"

如果提供了搜索结果排名或相似度分数,攻击者可以通过微调查询来缩小信息范围。

질문 변경
   ↓
유사도 점수 확인
   ↓
더 높은 점수가 나오는 방향 탐색
   ↓
원문 의미 추정

这种结构可以被视为搜索预言机或相似度预言机。

特别是当API暴露以下信息时,风险会增加:

  • 详细相似度分数
  • 搜索排名
  • 文档ID
  • 元数据
  • 搜索到的文档数量
  • 过滤前后结果差异

7. 基于坐标优化的攻击

攻击者可以创建一个任意句子,然后通过微调单词或表达方式,寻找接近目标向量的方向。

초기 문장 생성
   ↓
단어 또는 문장 구조 변경
   ↓
임베딩 생성
   ↓
목표 벡터와 유사도 측정
   ↓
유사도가 높아지는 변경 유지

例如,最初可以从以下句子开始:

"어떤 회사와 계약했다."

之后,像这样一点点改变:

"A사와 계약했다."
"A사와 교육 계약을 체결했다."
"A사와 1억 원 규모의 교육 계약을 체결했다."

如果相似度分数持续升高,就可以找到与原文含义相近的句子。

API提供的相似度分数越精确,这种优化攻击就越容易。


8. 窃取元数据和原文关联信息

在实际操作中,这是最直接的攻击。

向量数据库中不仅存储嵌入,还可能存储以下元数据:

{
  "vector": [0.132, -0.847, 0.291],
  "metadata": {
    "tenant_id": "company-a",
    "user_id": "user-1004",
    "document_name": "2026-contract.pdf",
    "chunk_text": "계약 금액은 1억 원이다."
  }
}

在这种情况下,攻击者无需逆向分析嵌入。

只要获取向量数据库的读取权限,以下信息就可能直接暴露:

  • 原文块
  • 用户ID
  • 租户ID
  • 文件名
  • 存储位置
  • 文档标题
  • 作者
  • 对话ID
  • 文档URL

因此,向量数据库不应被视为简单的搜索索引,而应视为敏感信息存储库。


嵌入逆向分析变得容易的条件

嵌入向量的暴露并不总是意味着原文可以被还原。

但是,以下条件越多,攻击成功的可能性就越高。

已知相同的嵌入模型

如果攻击者知道正在使用的模型,他们就可以以相同的方式对候选句子进行向量化。

例如,如果模型名称、维度数和归一化方式是公开的,比较攻击就会变得容易。

可以自由使用嵌入API

如果攻击者可以无限制地生成嵌入,他们就可以重复比较各种候选句子。

原文候选范围较窄

如果选项有限,如下所示,推断就会变得容易:

승인
거절
검토 중

相反,如果是自由格式的长文档,精确还原原文将困难得多。

句子较短

短句子包含的信息较少,因此候选空间会缩小。

例如,以下句子相对容易推断:

"계약이 취소되었다."

另一方面,包含多个主题的长句子很难仅凭一个向量准确还原。

块大小较小

在RAG中,文档被分割成小单元进行存储。

문서
  ↓
300~500 토큰 단위 청크
  ↓
각 청크 임베딩

如果块太小,单个向量可能直接代表特定句子或敏感信息。

元数据同时暴露

如果以下信息同时存在,攻击者可以大大缩小候选范围:

파일명
부서명
작성자
문서 유형
날짜
고객사명
사용자 ID

提供详细的相似度分数

如果相似度分数以小数形式暴露,攻击者可以通过微调句子来寻找接近目标向量的方向。


仅有向量能否直接还原原文?

需要精确区分。

向量搜索

벡터
  ↓
연결된 문서 ID 확인
  ↓
저장된 원문 조회

在这种情况下,原文并未被逆向分析。

它是直接获取了与向量关联的原文。

嵌入逆向分析

벡터
  ↓
후보 비교 또는 디코더 분석
  ↓
원문의 의미나 속성 추정

在这种情况下,原文是概率性推断的。

即使没有出现完全相同的字符串,核心内容或敏感属性也可能被暴露。

因此,以下表达更为准确:

获取嵌入向量并不意味着原文会自动完整还原。但是,通过候选句子比较、属性推断、解码器学习和搜索API分析等方式,可以估计原文的含义或敏感信息。


ChatGPT对话记录也只以向量形式存储吗?

特定服务如何存储对话记录的内部结构,仅凭公开信息无法断定。

对话历史、内存和搜索索引各自以何种数据库结构管理,属于服务提供商的内部设计。

因此,不应武断地认为:

모든 대화 원문이 임베딩 벡터로만 저장된다.
벡터를 역변환하면 모든 대화가 그대로 나온다.

在一般服务中,以下要素可能单独存在:

대화 원문 저장소
검색용 임베딩 인덱스
사용자 메모리
메타데이터
로그 및 감사 기록

嵌入主要用于搜索和相似度比较,而实际原文通常在单独的存储中管理。


安全诊断中应检查什么?

仅检查嵌入逆向分析的可能性是不够的。

在实际的LLM和RAG安全诊断中,以下项目可能更为重要:

用户间数据隔离

需要检查用户A是否可以搜索用户B的文档。

user_id = A
tenant_id = company-a

如果在搜索时缺少此类过滤器,其他用户的数据可能会暴露。

租户单位访问控制

在多租户环境中,按组织划分数据是必不可少的。

tenant-a의 문서
tenant-b의 문서

不应在向量搜索之后才检查权限,而应在搜索之前就限制访问范围。

元数据最小化

不应在向量数据库中不必要地存储原文、电子邮件地址、居民身份证号、API密钥等。

搜索分数不公开

详细的相似度分数可能被攻击者用于重复推断。

如果不需要,最好不要向外部用户公开分数。

查询次数限制

为防止攻击者比较数千个候选句子,需要以下控制:

Rate limiting
사용자별 요청 제한
이상 질의 탐지
반복 패턴 탐지

嵌入和原文均加密

向量虽然不是原文,但可能包含敏感信息。

因此,嵌入数据也应与原文以相同水平进行保护。

저장 데이터 암호화
전송 구간 암호화
키 관리
접근 로그
권한 분리

总结

嵌入向量并非简单的随机数字。

它们包含原文的语义特征,因此在适当的辅助信息下,可能发生以下攻击:

후보 문장 비교
최근접 이웃 검색
임베딩 역변환 모델
속성 추론
멤버십 추론
검색 API 반복 분석
메타데이터 탈취

但这并不意味着只要反转向量,原文就会直接出现。

更准确的说法是:

嵌入不是可以直接解密原文的密文,但如果攻击者获取了模型、候选数据、搜索接口和元数据,他们就可以推断出原文的含义或敏感属性。

在实际操作中,向量数据库的访问控制失败、租户分离错误、元数据暴露以及原文关联信息泄露等问题,可能比嵌入逆向分析本身带来更直接的风险。

因此,嵌入向量不应被视为简单的搜索数据,而应被视为与原文同等水平的敏感信息。


Comments

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注