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 반복 분석
메타데이터 탈취
但这并不意味着只要反转向量,原文就会直接出现。
更准确的说法是:
嵌入不是可以直接解密原文的密文,但如果攻击者获取了模型、候选数据、搜索接口和元数据,他们就可以推断出原文的含义或敏感属性。
在实际操作中,向量数据库的访问控制失败、租户分离错误、元数据暴露以及原文关联信息泄露等问题,可能比嵌入逆向分析本身带来更直接的风险。
因此,嵌入向量不应被视为简单的搜索数据,而应被视为与原文同等水平的敏感信息。
发表回复